Minobot (Naloge za delo z datotekami)
Minobot
Naloga je variacija na temo naloge Minolovec. Ukvarja se le s premiki.
Testi
Testi: testi-minobot.zip
Python bo ob poganjanju testov morda sitnaril z nekimi "warningi". Naj vas ne vznemirjajo. Povezani so s tem, da vas nisem učil čisto pravilnega načina odpiranja datotek.
O robotih
Podana je funkcija premik(ukaz, x, y, smer), ki kot argument prejme ukaz, trenutne koordinate robota (x in y) in smer, v katero je obrnjen. Funkcija vrne trojko (terko), v kateri sta novi koordinati in nova smer.
Ukaz je lahko niz "R", niz "L", ki pomenita, da se robot obrne za 90 stopinj levo ali desno (glede na trenutno smer) ali pa število korakov.
Smer je eden izmed znakov N, E, S ali W, ki predstavljajo smeri neba v angleščini.
Za še točnejši opis je funkcija kar tule. Če gornji opis ne zadošča, bo branje te funkcije (ki jo morate znati prebrati), gotovo dovolj.
def premik(ukaz, x, y, smer):
smeri = "NESW"
premiki = [(0, -1), (1, 0), (0, 1), (-1, 0)]
ismer = smeri.index(smer)
if ukaz == "R":
smer = smeri[(ismer + 1) % 4]
elif ukaz == "L":
smer = smeri[(ismer - 1) % 4]
else:
dx, dy = premiki[ismer]
x += dx * ukaz
y += dy * ukaz
return x, y, smer
Če funkcijo pokličemo s premik(10, 5, 3, "E"), vrne (15, 3, "E") (robot gre za 10 korakov proti vzhodu, torej se ´x´ poveča za 10).
Če jo pokličemo s premik("L", 5, 3, "E"), vrne (5, 3, 'N') (robot se obrne na levo, torej iz vzhoda proti severu).
Če jo pokličemo s premik("R", 5, 3, "E"), vrne (5, 3, 'S') (robot se obrne na desno, torej iz vzhoda proti jugu).
Naloge
Napiši funkcijo
izvedi(ime_datoteke), ki kot argument dobi ime datoteke z ukazi, ki naj jih robot izvede. Datoteka je oblike:DESNO NAPREJ 12 DESNO NAPREJ 2 LEVO NAPREJ 3 LEVO LEVOFunkcija mora vrniti seznam zapodenih stanj, torej trojk z vrednostmi x, y in smeri, skozi katere gre robot, ko izvaja ta program. Robot je v začetku na koordinatah (0, 0) in obrnjen proti severu.
Gornji ukazi so shranjeni v datoteki primer.txt. Če pokličemo funkcijo z
izvedi("primer.txt"), vrne[(0, 0, 'N'), (0, 0, 'E'), (12, 0, 'E'),
(12, 0, 'S'), (12, 2, 'S'), (12, 2, 'E'),
(15, 2, 'E'), (15, 2, 'N'), (15, 2, 'W')]Funkcija lahko uporablja podano funkcijo
premik(oziroma je to celo priporočeno). Samo za prevajanje ukazov v angleščino in številke boste morali poskrbeti.Napiši funkcijo
opisi_stanje(x, y, smer), ki vrne niz z opisom stanja. Stanje je opisano s koordinatama, med katerima je dvopičje; koordinata x je poravnana desno, y pa levo. Obe sta izpisani na tri mesta. Sledi presledek in znak, ki pove smer. Znaki za smeri so ^, >, v in < (za N, E, S in W).Klic
opisi_stanje(0, 12, "N")vrne niz" 0:12 ^". (Pazi na presledke).Napiši funkcijo
prevedi(ime_vhoda, ime_izhoda). Funkcija mora prebrati vhodno datoteko (najbrž tako, da pokliče funkcijo izvedi?) in v izhodno datoteko izpisati zaporedje stanj v obliki, kot jo vrača funkcija opisi_stanje.Če pokličemo
prevedi("primer.txt", "stanja.txt"), mora ustvariti datoteko stanja.txt z naslednjo vsebino:0:0 ^
0:0 >
12:0 >
12:0 v
12:2 v
12:2 >
15:2 >
15:2 ^
15:2 <*Napiši funkcijo
opisi_stanje_2(x, y, smer), ki je podobna funkcijiopisi_stanje, le da je smer na začetku in da so okrog koordinat oklepaji, takole^ (0:12). Koordinataxnaj, skupaj z oklepajem, zasede štiri mesta.