আপনার প্রোগ্রামটি মূল্যবান খনিজগুলির জন্য মাটির নিচে একটি খনির রোবট নিয়ন্ত্রণ করবে। আপনার রোবট কন্ট্রোলারকে আপনাকে কোথায় সরানো এবং খনন করতে হবে তা বলবে এবং নিয়ামক আপনার রোবটের স্থিতিতে প্রতিক্রিয়া জানাবে।
প্রাথমিকভাবে আপনার রোবটটিকে খনিটির একটি চিত্র মানচিত্র দেওয়া হবে যা ইতিমধ্যে উপস্থিত কিছু খনিজ শ্যাফট রয়েছে এবং খনিতে খনিজগুলির মূল্য এবং কঠোরতা নির্দিষ্ট করে এমন একটি ডেটা ফাইল রয়েছে। আপনার রোবটটি খনিতে মূল্যবান খনিজগুলির সন্ধানে শ্যাফ্টগুলির মধ্য দিয়ে সরে যাবে। আপনার রোবট পৃথিবী জুড়ে খনন করতে পারে তবে শক্ত শিলা দ্বারা ধীর হয়ে যায়।
24 ঘন্টা স্থানান্তরিত হওয়ার পরে সবচেয়ে মূল্যবান কার্গো নিয়ে যে রোবটটি ফিরে আসবে তা বিজয়ী হবে। এটি একটি জটিল চ্যালেঞ্জ বলে মনে হতে পারে তবে একটি বেসিক মাইনিং রোবট তৈরি করা সহজ (নীচে নমুনা খনির রোবটের উত্তর দেখুন)।
অপারেশন
আপনার প্রোগ্রামটি খনি চিত্র, খনিজ ডেটা এবং সরঞ্জাম ফাইলের নাম দিয়ে নিয়ামক দ্বারা শুরু করা হবে। রোবটগুলি খনি ইমেজ এবং খনিজগুলির ডেটা ব্যবহার করতে পারে মূল্যবান আকরিক খুঁজে পেতে এবং শক্ত শিলা এড়াতে। রোবট সরঞ্জাম সরঞ্জাম থেকে সরঞ্জাম কিনতেও চাইতে পারে।
উদাহরণ: python driller.py mineimage.png minerals.txt equipmentlist.txt
2 দ্বিতীয় আরম্ভের সময়কালের পরে, কন্ট্রোলার স্টিডিন এবং স্টাডাউটের মাধ্যমে রোবট প্রোগ্রামের সাথে যোগাযোগ করে। স্থিতির বার্তা পাওয়ার পরে রোবটগুলি অবশ্যই 0.1 সেকেন্ডের মধ্যে একটি ক্রিয়া দিয়ে প্রতিক্রিয়া জানায়।
প্রতিটি পালা, নিয়ামক রোবটকে একটি স্ট্যাটাস লাইন প্রেরণ করে:
timeleft cargo battery cutter x y direction
উদাহরণ: 1087 4505 34.65 88.04 261 355 right
পূর্ণসংখ্যাটি timeleft
শিফট শেষ হওয়ার আগে গেমের সেকেন্ড বাকি।
cargo
খনিজ আপনি এ পর্যন্ত কম আপনি সরঞ্জাম জন্য কি দেওয়া mined করেছেন পূর্ণসংখ্যা মান। battery
স্তর আপনার অবশিষ্ট ব্যাটারি চার্জ একটি পূর্ণসংখ্যা শতাংশ হয়। cutter
পূর্ণসংখ্যা স্তর মান মূল্যের শতকরা ভাগ হিসাবে কর্তনকারী বর্তমান তীক্ষ্ণতা হয়। x
এবং y
মান (0, 0) এ উপরের বাম কোণ থেকে রেফারেন্সড রোবট অবস্থানের সঙ্গে ধনাত্মক পূর্ণসংখ্যা। দিকটি রোবটটির মুখোমুখি বর্তমান দিক (বাম, ডান, উপরে, নীচে)।
আপনার রোবট যখন 'এন্ডশিফ্ট' বা 'ব্যর্থ' ইনপুট পান, আপনার প্রোগ্রামটি শীঘ্রই বন্ধ হয়ে যাবে। আপনার রোবটটি প্রথমে কোনও ফাইলে ডিবাগিং / পারফরম্যান্স ডেটা লিখতে চান।
4 টি সম্ভাব্য কমান্ড রয়েছে যা নিয়ামক গ্রহণ করবেন। direction
left|right|up|down
আপনার রোবটটি সেই দিকে নির্দেশ করবে এবং 15 গেম-সেকেন্ডের প্রয়োজন হবে। move <integer>
আপনার রোবটটিকে সরানো বা খনন করার নির্দেশ দেবে যা অনেকগুলি ইউনিট এগিয়ে নিয়ে যায় যা খনিজগুলি কাটা এবং আপনার কাটারের তীক্ষ্ণতার উপর নির্ভর করে সময় নেয় (নীচে দেখুন)। buy <equipment>
নির্দিষ্ট সরঞ্জামগুলি ইনস্টল করবে এবং আপনার কার্গো মান থেকে ব্যয়টি কেটে নেবে, তবে কেবলমাত্র রোবটটি পৃষ্ঠতলে থাকলে (y মান <= শুরু y মান)। সরঞ্জাম ইনস্টলেশন 300 গেম-সেকেন্ড সময় নেয়। বিশেষ কমান্ডটি snapshot
বর্তমান খনি চিত্রটি ডিস্কে লিখে এবং কোনও গেম সময় নেয় না। আপনি আপনার রোবটটি ডিবাগ করতে বা অ্যানিমেশন তৈরি করতে স্ন্যাপশট ব্যবহার করতে পারেন।
আপনার রোবটটি 100 ব্যাটারি এবং 100 টি কর্তকের তীক্ষ্ণতায় শুরু হবে। চলমান এবং ঘুরিয়ে ব্যাটারি ক্ষুদ্র পরিমাণ ব্যবহার করুন। খনন করা আরও অনেক বেশি ব্যবহার করে এবং খনিজগুলির কঠোরতা এবং কাটারের বর্তমান তীক্ষ্ণতার কাজ। আপনার রোবট খনিজগুলির মধ্যে যেমন খনন করে, সময় এবং খনিজগুলির কঠোরতার উপর নির্ভর করে কাটারটি তার তীক্ষ্ণতা হারাবে। যদি আপনার রোবোটের যথেষ্ট পরিমাণে পণ্যসম্ভারের মান থাকে তবে এটি নতুন ব্যাটারি বা কাটার কিনতে আবার পৃষ্ঠে ফিরে আসতে পারে। নোট করুন যে উচ্চমানের সরঞ্জামগুলির প্রাথমিক কার্যকারিতা 100% এরও বেশি রয়েছে। ব্যাটারির নামে স্ট্রিং "ব্যাটারি" থাকে এবং (আশ্চর্য) কাটারগুলির নামে "কাটার" থাকে।
নিম্নলিখিত সম্পর্কগুলি চলমান এবং কাটা সংজ্ঞা দেয়:
timecutting = sum(hardness of pixels cut) * 100 / cutter
cutterwear = 0.01 for each second cutting
cutters will not wear below 0.1 sharpness
timemoving = 1 + timecutting
batterydrain = 0.0178 for each second moving
changing direction takes 15 seconds and drains 0.2 from the battery
installing new equipment takes 300 seconds
নোট করুন যে কোনও খনিজ কাটা ছাড়াই 1 ইউনিট স্থানান্তর করতে 1 গেম সেকেন্ড লাগে এবং ব্যাটারির 0.0178 ব্যবহার করে। সুতরাং রোবটটি 93 গেমের মিনিটে স্ট্যান্ডার্ড 100 চার্জে 5600 ইউনিট চালাতে পারে, যদি এটি খনিজগুলি কাটা বা বাঁক না করে।
নতুন: রোবটটি 11 পিক্সেল প্রশস্ত তাই প্রতিটি পিক্সেল চলাচল করে 11 পিক্সেল কেটে যাবে। যদি 11 টি পিক্সেলের কম কাটতে হয় তবে রোবটটি সরাতে কম সময় নিবে এবং কাটারের উপর কম পরিধান করবে। খনিজ ডেটা ফাইলে যদি কোনও পিক্সেল রঙ নির্দিষ্ট না করা থাকে তবে এটি শূন্য কঠোরতা এবং শূন্য মানের মুক্ত স্থান।
সময় ফুরিয়ে গেলে রানটি বন্ধ হয়ে যায়, রোবটের ব্যাটারি শেষ হয়ে যায়, রোবটের একটি অংশ চিত্রের সীমানা ছাড়িয়ে যায়, একটি অবৈধ কমান্ড প্রেরণ করা হয়, বা রোবট যোগাযোগের সময় শেষ হয়।
আপনার স্কোরটি রোবট কার্গোর চূড়ান্ত মান। নিয়ামক আপনার স্কোর এবং চূড়ান্ত মানচিত্রের চিত্র আউটপুট দেবে। আপনার প্রোগ্রামের স্টডার আউটপুটটি রোবোট.লগ ফাইলটিতে লগইন হয়েছে। যদি আপনার রোবটটি মারা যায় তবে মারাত্মক ত্রুটি লগতে হতে পারে।
খনি তথ্য
equipment.txt:
Equipment_Name Cost Initial_Value
std_cutter 200 100
carbide_cutter 600 160
diamond_cutter 2000 250
forcehammer_cutter 7200 460
std_battery 200 100
advanced_battery 500 180
megapower_battery 1600 320
nuclear_battery 5200 570
mineraldata.txt:
Mineral_Name Color Value Hardness
sandstone (157,91,46) 0 3
conglomerate (180,104,102) 0 12
igneous (108,1,17) 0 42
hard_rock (219,219,219) 0 15
tough_rock (146,146,146) 0 50
super_rock (73,73,73) 0 140
gem_ore1 (0,255,0) 10 8
gem_ore2 (0,0,255) 30 14
gem_ore3 (255,0,255) 100 6
gem_ore4 (255,0,0) 500 21
আমার চিত্র:
খনি চিত্রটিতে একটি আলফা চ্যানেল থাকতে পারে, তবে এটি ব্যবহৃত হয় না।
নিয়ামক
কন্ট্রোলারের পাইথন ২.7 নিয়ে কাজ করা উচিত এবং পিআইএল লাইব্রেরি প্রয়োজন requires আমাকে জানানো হয়েছে যে পিআইএল চিত্র মডিউলটি পাওয়ার জন্য পাইথন বালিশটি একটি উইন্ডোজ বান্ধব ডাউনলোড।
বর্তমান ডিরেক্টরিতে রোবট প্রোগ্রাম, সিএফজি.পি, চিত্র এবং ডেটা ফাইল দিয়ে নিয়ন্ত্রক শুরু করুন। প্রস্তাবিত কমান্ড লাইনটি হ'ল:
python controller.py [<interpreter>] {<switches>} <robotprogram>
উদাহরণ: python controller.py java underminer.class
কন্ট্রোলার রান শেষে একটি রোবট.লগ ফাইল এবং একটি ফাইনালমাইন.পিএনজি ফাইল লিখবে।
#!/usr/bin/env python
# controller.py
# Control Program for the Robot Miner on PPCG.
# Tested on Python 2.7 on Ubuntu Linux. May need edits for other platforms.
# V1.0 First release.
# V1.1 Better error catching
import sys, subprocess, time
# Suggest installing Pillow here if you don't have PIL already
from PIL import Image, ImageDraw
from cfg import *
program = sys.argv[1:]
calltext = program + [MINEIMAGE, MINERALFILE, EQUIPMENTFILE]
errorlog = open(ERRORFILE, 'wb')
process = subprocess.Popen(calltext,
stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=errorlog)
image = Image.open(MINEIMAGE)
draw = ImageDraw.Draw(image)
BLACK, ORANGE, WHITE = (0,0,0), (255,160,160), (255,255,255)
W,H = image.size
dirmap = dict(right=(1,0), left=(-1,0), up=(0,-1), down=(0,1))
# read in mineral file (Name, Color, Value, Hardness):
data = [v.split() for v in open(MINERALFILE)][1:]
mineralvalue = dict((eval(color), int(value)) for
name, color, value, hard in data)
hardness = dict((eval(color), int(hard)) for
name, color, value, hard in data)
# read in the equipment list:
data = [v.split() for v in open(EQUIPMENTFILE)][1:]
equipment = dict((name, (int(cost), float(init))) for
name, cost, init in data)
# Set up simulation variables:
status = 'OK'
rx, ry, direction = START_X, START_Y, START_DIR # center of robot
cargo, battery, cutter = 0, 100.0, 100.0
clock = ENDSHIFT
size = ROBOTSIZE / 2
msgfmt = '%u %u %u %u %u %u %s'
snapnum = 1
def mkcutlist(x, y, direc, size):
dx, dy = dirmap[direc]
cx, cy = x+dx*(size+1), y+dy*(size+1)
output = [(cx, cy)]
for s in range(1, size+1):
output += [ (cx+dy*s, cy+dx*s), (cx-dy*s, cy-dx*s)]
return output
def send(msg):
process.stdin.write((msg+'\n').encode('utf-8'))
process.stdin.flush()
def read():
return process.stdout.readline().decode('utf-8')
time.sleep(INITTIME)
while clock > 0:
try:
start = time.time()
send(msgfmt % (clock, cargo, battery, cutter, rx, ry, direction))
inline = read()
if time.time() - start > TIMELIMIT:
status = 'Move timeout'
break
except:
status = 'Robot comslink failed'
break
# Process command:
movecount = 0
try:
arg = inline.split()
cmd = arg.pop(0)
if cmd == 'buy':
if ry <= START_Y and arg and arg[0] in equipment:
cost, initperc = equipment[arg[0]]
if cost <= cargo:
cargo -= cost
if 'battery' in arg[0]:
battery = initperc
elif 'cutter' in arg[0]:
cutter = initperc
clock -= 300
elif cmd == 'direction':
if arg and arg[0] in dirmap:
direction = arg[0]
clock -= 15
battery -= 0.2
elif cmd == 'move':
if arg and arg[0].isdigit():
movecount = abs(int(arg[0]))
elif cmd == 'snapshot':
image.save('snap%04u.png' % snapnum)
snapnum += 1
except:
status = 'Robot command malfunction'
break
for move in range(movecount):
# check image boundaries
dx, dy = dirmap[direction]
rx2, ry2 = rx + dx, ry + dy
print rx2, ry2
if rx2-size < 0 or rx2+size >= W or ry2-size < 0 or ry2+size >= H:
status = 'Bounds exceeded'
break
# compute time to move/cut through 1 pixel
try:
cutlist = mkcutlist(rx2, ry2, direction, size)
colors = [image.getpixel(pos)[:3] for pos in cutlist]
except IndexError:
status = 'Mining outside of bounds'
break
work = sum(hardness.get(c, 0) for c in colors)
timetaken = work * 100 / cutter
cutter = max(0.1, cutter - timetaken / 100)
clock -= 1 + int(timetaken + 0.5)
battery -= (1 + timetaken) / 56
if battery <= 0:
status = 'Battery exhausted'
break
cargo += sum(mineralvalue.get(c, 0) for c in colors)
draw.rectangle([rx-size, ry-size, rx+size+1, ry+size+1], BLACK, BLACK)
rx, ry = rx2, ry2
draw.rectangle([rx-size, ry-size, rx+size+1, ry+size+1], ORANGE, WHITE)
if clock <= 0:
break
if status != 'OK':
break
del draw
image.save('finalmine.png')
if status in ('Battery exhausted', 'OK'):
print 'Score = %s' % cargo
send('endshift')
else:
print 'Error: %s at clock %s' % (status, clock)
send('failed')
time.sleep(0.3)
process.terminate()
লিঙ্কযুক্ত কনফিগারেশন ফাইল (পরিবর্তন করা যাবে না):
# This is cfg.py
# Scenario files:
MINEIMAGE = 'testmine.png'
MINERALFILE = 'mineraldata.txt'
EQUIPMENTFILE = 'equipment.txt'
# Mining Robot parameters:
START_X = 270
START_Y = 28
START_DIR = 'down'
ROBOTSIZE = 11 # should be an odd number
ENDSHIFT = 24 * 60 * 60 # seconds in an 24 hour shift
INITTIME = 2.0
TIMELIMIT = 0.1
ERRORFILE = 'robot.log'
উত্তর ফর্ম্যাট
উত্তরের প্রোগ্রামিং ভাষা, রোবটের নাম এবং চূড়ান্ত স্কোর (যেমন পাইথন 3 , টানেল টেরর , 1352 ) সহ একটি শিরোনাম থাকা উচিত । উত্তর বডিটিতে আপনার কোড এবং চূড়ান্ত খনি মানচিত্রের চিত্র থাকা উচিত। অন্যান্য চিত্র বা অ্যানিমেশনগুলিও স্বাগত। বিজয়ী হবে সেরা স্কোর সহ রোবট।
অন্যান্য বিধি
- সাধারণ লুফোলগুলি নিষিদ্ধ।
- আপনি যদি এলোমেলো সংখ্যার জেনারেটর ব্যবহার করেন তবে আপনার প্রোগ্রামে অবশ্যই একটি বীজ হার্ডকোড করতে হবে, যাতে আপনার প্রোগ্রামটি চালানো পুনরুত্পাদনযোগ্য। অন্য কারও অবশ্যই আপনার প্রোগ্রামটি চালাতে সক্ষম হবে এবং একই চূড়ান্ত খনি চিত্র এবং স্কোর পাবে।
- আপনার প্রোগ্রামটি কোনও খনি চিত্রের জন্য অবশ্যই প্রোগ্রাম করা উচিত । আপনাকে অবশ্যই এই প্রোগ্রাম ফাইল বা এই চিত্রের আকার, খনিজ লেআউট, টানেলের লেআউট ইত্যাদির জন্য কোডিং করবেন না যদি আমি সন্দেহ করি যে কোনও রোবট এই নিয়মটি ভঙ্গ করছে, আমি খনি চিত্র এবং / অথবা ডেটা ফাইলগুলি পরিবর্তন করার অধিকার সংরক্ষণ করি।
সম্পাদনাগুলি
- 0.1 সেকেন্ড রেসপন্স রুল ব্যাখ্যা করেছেন la
- কমান্ড লাইন বিকল্পগুলি এবং ফাইলগুলি শুরু করে রোবোটে প্রসারিত।
- আরও ভাল ত্রুটি ধরা সহ নতুন কন্ট্রোলার সংস্করণ যুক্ত হয়েছে।
- যোগ হয়েছে রোবট.লগ নোট।
- ডিফল্ট খনিজ কঠোরতা এবং মান ব্যাখ্যা করেছেন।
- ব্যাটারি বনাম কাটার সরঞ্জাম ব্যাখ্যা করা হয়েছে।
- তৈরি রোবট আকার 11 সুস্পষ্ট।
- সময়, কাটার পরিধান এবং ব্যাটারির জন্য গণনা যোগ করা হয়েছে।