একটি খনির রোবট তৈরি করুন


12

আপনার প্রোগ্রামটি মূল্যবান খনিজগুলির জন্য মাটির নিচে একটি খনির রোবট নিয়ন্ত্রণ করবে। আপনার রোবট কন্ট্রোলারকে আপনাকে কোথায় সরানো এবং খনন করতে হবে তা বলবে এবং নিয়ামক আপনার রোবটের স্থিতিতে প্রতিক্রিয়া জানাবে।

প্রাথমিকভাবে আপনার রোবটটিকে খনিটির একটি চিত্র মানচিত্র দেওয়া হবে যা ইতিমধ্যে উপস্থিত কিছু খনিজ শ্যাফট রয়েছে এবং খনিতে খনিজগুলির মূল্য এবং কঠোরতা নির্দিষ্ট করে এমন একটি ডেটা ফাইল রয়েছে। আপনার রোবটটি খনিতে মূল্যবান খনিজগুলির সন্ধানে শ্যাফ্টগুলির মধ্য দিয়ে সরে যাবে। আপনার রোবট পৃথিবী জুড়ে খনন করতে পারে তবে শক্ত শিলা দ্বারা ধীর হয়ে যায়।

ছোট খনি চিত্র

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 সুস্পষ্ট।
  • সময়, কাটার পরিধান এবং ব্যাটারির জন্য গণনা যোগ করা হয়েছে।

2
@ টিপিসেলা ১. রোবটগুলি চিত্রের ফাইলের নামটি একটি আর্গুমেন্ট হিসাবে পেয়ে থাকে এবং এটি তাদের পছন্দ মতো পড়তে এবং প্রক্রিয়া করতে পারে। রোবটটি সরানোর সাথে সাথে কন্ট্রোলারগুলির চিত্র পরিবর্তন হবে এবং রোবট এটি দেখতে সক্ষম হবে না। রোবটগুলি পিআইএল বা অন্যান্য ওএসএস তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করতে পারে। ২. রোবটদের কমান্ড প্রতিক্রিয়া প্রতি শুরু করতে 2 সেকেন্ড এবং তারপরে 0.1 সেকেন্ড থাকে।
লজিক নাইট 18

1
প্রশ্নটিতে আপনার প্রতি কমান্ড প্রতিক্রিয়া 0.1 সেকেন্ড ডকুমেন্ট করা উচিত।
পিটার টেলর

1
@ কিথরান্ডাল নং। আপনার অবশ্যই ছবিতে পড়তে হবে এবং কমান্ড লাইনে প্রদত্ত ফাইলের নামগুলি থেকে 2 টি ফাইল ফাইল। সেগুলি পরিবর্তন করা যেতে পারে।
লজিক নাইট

1
@ টিপিসেলা আমি পাইথন ফ্রেমওয়ার্কের সাথে আরও একটি উত্তর যুক্ত করেছি যা সাহায্য করতে পারে।
লজিক নাইট

2
এটি একটি বৈশিষ্ট্য। আপনি যদি এটি করতে পারেন তবে এটি আপনার সুবিধার্থে ব্যবহার করুন :)
লজিক নাইট

উত্তর:


3

পাইথন 2, নমুনা খনিজক, 350

এটি একটি খনির রোবোটের সর্বনিম্ন কোডের একটি উদাহরণ। এটির ব্যাটারি বের না হওয়া অবধি সরাসরি খনন করে (সমস্ত রোবট নীচে দেখানো শুরু করে)। এটি কেবল ৩৫০ এর স্কোর অর্জন করে st

import sys
# Robots are started with 3 arguments:
mineimage, mineralfile, equipmentfile = sys.argv[1:4]
raw_input()           # ignore first status report
print 'move 1000'     # dig down until battery dies
sys.stdout.flush()    # remember to flush stdout
raw_input()           # wait for end message

নমুনা মাইনার পাথ


2

পাইথন 2, রোবট মাইনার পাইথন টেম্পলেট, 410

এটি কীভাবে একটি রোবট পরিচালনা করে এবং আপনার নিজস্ব রোবট তৈরির জন্য একটি কাঠামো সরবরাহ করে তা খনির রোবট টেম্পলেট। খনিজ তথ্য বিশ্লেষণের জন্য একটি বিভাগ রয়েছে, এবং ক্রিয়া সহ প্রতিক্রিয়া জানানোর জন্য একটি বিভাগ রয়েছে। স্থানধারক অ্যালগরিদমগুলি ভাল করে না। রোবটটি কিছু মূল্যবান খনিজ সন্ধান করে তবে পর্যাপ্ত প্রতিস্থাপন ব্যাটারি এবং কাটার কিনতে যথেষ্ট নয়। এটি দ্বিতীয়বার পৃষ্ঠের দিকে যাওয়ার পথে একটি মৃত ব্যাটারি দিয়ে থামে।

একটি ভাল পরিকল্পনা হ'ল মূল্যবান খনিজগুলির নিকটবর্তী হওয়ার জন্য এবং খননটি হ্রাস করার জন্য বিদ্যমান টানেলগুলি ব্যবহার করা।

নোট করুন যে এই রোবটটি প্রতিটি স্থিতি বার্তায় প্রাপ্ত একটি লগ ফাইল লিখেছে যাতে আপনি রান করার পরে তার সিদ্ধান্তগুলি পরীক্ষা করতে পারেন।

import sys
from PIL import Image

MINEIMAGE, MINERALFILE, EQUIPMENTFILE = sys.argv[1:4]
image = Image.open(MINEIMAGE)
W,H = image.size
robotwidth = 11
halfwidth = robotwidth / 2

# 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 = [(name, int(cost), float(init)) for 
    name, cost, init in data]
# Find the cheapest battery and cutter for later purchase:
minbatcost, minbatname = min([(c,n) for 
    n,c,v in equipment if n.endswith('battery')])
mincutcost, mincutname = min([(c,n) for 
    n,c,v in equipment if n.endswith('cutter')])

# process the mine image to find good places to mine:
goodspots = [0] * W
for ix in range(W):
    for iy in range(H):
        color = image.getpixel((ix, iy))[:3]   # keep RGB, lose Alpha
        value = mineralvalue.get(color, 0)
        hard = hardness.get(color, 0)
        #
        # -------------------------------------------------------------
        # make a map or list of good areas to mine here
        if iy < H/4:
            goodspots[ix] += value - hard/10.0
        # (you will need a better idea than this)
goodshafts = [sum(goodspots[i-halfwidth : i+halfwidth+1]) for i in range(W)]
goodshafts[:halfwidth] = [-1000]*halfwidth   # stop robot going outside bounds
goodshafts[-halfwidth:] = [-1000]*halfwidth
bestspot = goodshafts.index(max(goodshafts))
# -----------------------------------------------------------------
#

dirmap = dict(right=(1,0), left=(-1,0), up=(0,-1), down=(0,1))
logging = open('mylog.txt', 'wt')
logfmt = '%7s %7s %7s %7s %7s %7s %7s\n'
logging.write(logfmt % tuple('Seconds Cargo Battery Cutter x y Direc'.split()))
surface = None
plan = []

while True:
    status = raw_input().split()
    if status[0] in ('endshift', 'failed'):
        # robot will be terminated soon
        logging.close()
        continue
    logging.write(logfmt % tuple(status))
    direction = status.pop(-1)
    clock, cargo, battery, cutter, rx, ry = map(int, status)
    if surface == None:
        surface = ry    # return to this level to buy equipment
    #
    # -----------------------------------------------------------------
    # Decide here to choose direction, move, buy, or snapshot
    if not plan and rx != bestspot:
        plan.append('direction right' if bestspot > rx else 'direction left')
        plan.append('move %u' % abs(bestspot - rx))
        plan.append('direction down')

    if plan:
        action = plan.pop(0)
    elif battery < 20 and cargo > minbatcost + mincutcost:
        action = 'direction up'
        move = 'move %u' % (ry - surface)
        buybat = 'buy %s' % minbatname
        buycut = 'buy %s' % mincutname
        plan = [move, buybat, buycut, 'direction down', move]
    else:
        action = 'move 1'
    # -----------------------------------------------------------------
    #
    print action
    sys.stdout.flush()

চূড়ান্ত খনি মানচিত্র


আপনাকে অনেক ধন্যবাদ, নিয়ন্ত্রণকারী এবং রোবট প্রোগ্রামের মধ্যে মিথস্ক্রিয়াকে চালিত করে এমন লুপটি উন্মোচন করা সত্যিই সহায়ক।
ট্যাপিসেলা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.