Ocene 6 - 8: Sledi v snegu
Na predavanju sem že pokazal metodo __init__
, nisem pa (še) pokazal, da lahko dobi metoda __init__
tudi argumente. Če bi razred Turtle
sprogramirali takole
class Turtle:
def __init__(self, x, y):
self.x, self.y = x, y
...
bi želvo sestavili z, recimo
ana = Turtle(50, 100)
Argumente, ki jih podamo v klicu Turtle
, dobi konstruktor in jih, v tem primeru, uporabi za to, da nastavi začetne koordinate želve.
Ocena 6
Napiši razred Kolesar
.
Konstruktor
__init__
kot argument prejme zemljevid, s kakršnimi smo delali v prejšnji nalogi. Zemljevid je podan kot seznam nizov, ki predstavljajo vrstice zemljevida. Kolesar je v začetku na koordinatah 0, 0.pojdi(smer)
prejme smer"<"
,">"
,"^"
ali"v"
. Metoda premakne kolesarja za en kvadratek v podano smer, če ta kvadratek ni izven zemljevida. Če bi to pripeljalo kolesarja ven iz zemljevida, pa ne spremeni koordinat, temveč obleži mrtev in se poslej ne odziva več na nadaljnje ukazepremik
alipojdi
.prevozi(pot)
prejme niz s potjo, recimo,">vv4>105v>>>^^3^
in kolesarja pelje po tej poti -- v tem primeru desno, dol, dol, štirikrat desno, 105-krat dol, desno, desno, desno, gor, gor, trikrat gor. Metodaprevozi
mora klicati metodopojdi
za vsak kvadratek posebej. Tako poskrbi, da bi kolesar, ki bi ga nek korak pripeljal ven iz zemljevida, umrl na ustreznem mestu.lokacija()
vrne trenutne koordinate kolesarja v obliki terke(x, y)
.razdalja()
vrne razdaljo (v številu) kvadratkov, ki jih je doslej (oz. do smrti) prevozil kolesar.
Ocena 7
Iz razreda Kolesar
izpelji razred Zbiralec
. Razlika v primerjavi s Kolesar
bo v tem, da zemljevida ne bo uporabljal le zato, da preverja, ali je še živ, temveč bo nabiral "značke", to je, mestne kolesarske znamenitosti (kakor jih poznamo iz prejšnje naloge).
Če se značka nahaja na polju, na katerem kolesar začne svojo pot, je ne pobere (razen, seveda, če kasneje pride spet na to polje).
Metoda prevozi
pobira tudi vse značke na kvadratkih, ki so na poti. prevozi("5>")
, na primer, pobere vse morebitne značke na petih kvadratkih desno od trenutne pozicije kolesarja.
Konstruktor
__init__
prejme argumentex, y, zemljevid
.zemljevid
ima enak pomen kot prej,x
iny
pa sta začetni koordinati kolesarja.pojdi(smer)
dopolni tako, da bo pobirala značke in na primeren način klicala podedovano metodo.znacke()
vrne množico vseh črk, na kakršne je naletel kolesar. (Pike so nezanimive, zato jih v množici ni.)naj_znacke()
vrne množico s črkami, ki jih je največkrat obiskal. Če je kolesar na svoji poti naletel na dva a-ja, pet r-jev, tri b-je, tri d-je in pet c-jev, metodanaj_znacke()
vrne{"r", "c"}
.trofeje()
: predstavljajmo si, da značke uredimo v lestvico po pogostosti. Zanima nas, katere značke zasedajo prva tri mesta.trofeje()
torej vrne seznam parov (crka, pogostost) za tri najbolj pogoste značke. Seznam mora biti urejen po padajoči pogostosti, znotraj enako pogostih pa po abecedi. Če si več značk deli isto mesto, je seznam ustrezno daljši. Konkretno, v gornjem primeru, ko je kolesar na svoji poti naletel na dva a-ja, pet r-jev, tri b-je, tri d-je in pet c-jev, funkcijatrofeje()
vrne[("c", 5), ("r", 5), ("b", 3), ("d", 3)]
: seznam ima štiri elemente, ker si tretje mesto delita dve črki. Če bi kolesar, recimo, obiskal vsakega od gornjih znakov petkrat, poleg tega pa še enkrat "l", bi funkcija vrnila[("b", 5), ("c", 5), ("d", 5), ("r", 5)]
, saj si štirje delijo prvo mesto. (Razmišljajte o tem, kdo dobi medalje, če si več kot trije tekmovalci delijo prva tri mesta.)
Zbiralec
naj ne definira svoje metode prevozi
, ker za to nima prav nobenega razloga.
Ocena 8
Opis te naloge je strašljivo dolg, vendar je tako le zaradi primerov. V resnici zahtevata razred Drsalec
enajst vrstic kode (brez trikov; težko ga napišete daljše), "razred" Sledi
pa eno samo, če boste spretni.
Na snegu se dogaja tole: če je sneg na kvadratku svež, kolesar normalno pelje. Če je kakšen kolesar že prevozil določeno polje, pa naslednjega odnese v isto smer kot zadnjega. Isto se zgodi na naslednjem in še na naslednjem polju. Šele po treh poljih sledenja prejšnjemu kolesarju (oziroma kolesarjem) se kolesar ustavi in potem nadaljuje pot, kot si jo je zamislil sam. (Seveda se lahko zgodi, da sledenje traja manj kot tri polja, če že prej pride na polje, ki še ni zvoženo.)
Recimo, da je Ana začela na polju (1, 2)
, Berta na polju (3, 0)
in Cilka na (7, 3)
.
Ana se opogumi in prevozi pot 7>2v7<
. Za seboj pusti takšne sledi. (A označuje končno Anino polje. Sledi tam ni.)
...B........
............
.>>>>>>>v...
.......Cv...
.A<<<<<<<...
............
............
Zdaj se Berta odloči prevoziti 3v
. Odneslo jo bo takole.
...B........
...B........
.>>BBBB>v...
......BCv...
.A<<<<<<<...
............
............
Ko je naletela na Bertine sledi, jo je tri kvadratke nosilo po njeni sledi, potem pa je nadaljevala po svoji poti (dol). Po Bertini vožnji so sledi v snegu takšne:
...v........
...v........
.>>>>>v>v...
......BCv...
.A<<<<<<<...
............
............
Recimo, da gre Berta zdaj še <<. Sledi so
...v........
....v........
.>>>>>v>v...
....B<<Cv...
.A<<<<<<<...
............
............
Potem pride Cilka na (7, 1) in hoče iti 2^>
. Kruta usoda, ki se bo poigrala z njo, ji bo namenila takšno pot.
...v........
...v........
.>>>>>vCC...
....B<<CC...
.A<<<<<<CC..
............
............
- Po prvem
^
jo odnese po Anini sledi>vv
;;znajde se v spodnjem desnem kvadratu Anine poti. - Potem gre
^
, kot je načrtovala, in, ojoj, vpade ravno na polje, na katerem je ravnokar bila. Zato jo odnese nazajv
, na polje, ki ga je pravkar zapustila v smeri^
. Odnese jo torej gor in nato spetv
. S tem se to drsanje ustavi. - Potem gre, po načrtu,
>
. Za sabo pusti tako stanje.
...v........
...v........
.>>>>>v>>...
....B<<^v...
.A<<<<<<>C..
............
............
Potem se pojavi Dani in sicer na polju (9, 3)
(to je polje nad C) in hoče iti <v
.
- Naredi korak <
. Odnese jo v>
(torej le dvakrat, saj polja (9, 4)
Cilka še ni zapustila, torej tam ni sledov).
- Potem gre v
.
...v........
...v........
.>>>>>v>>...
....B<<^v<..
.A<<<<<<>v..
.........D..
............
Potem se Cilka, ki je na gornjem zemljevidu sicer nismo več narisali (da se vidi puščica, ki jo je naredila Dani; Cilka je torej takoj nad Dani), odloči iti ^
. Plan se izjalovi, saj se znajde na sledovih Dani, gre <^>
in konča natančno tam, kjer je začela.
Napiši razreda Sledi
in Drsalec
.
Razred Drsalec
je izpeljan iz razreda Zbiralec
in ima metodo pojdi
spremenjeno tako, da po vsakem normalnem premiku izvede še tri korake drsenja (ali manj, če ni sledi oz. če jih zmanjka prej kot v treh korakih). Poleg tega ima konstruktor dodaten argument, ki je pojasnjen spodaj.
Razred Sledi
beleži sledi. Kako to počne, je tvoja stvar. Testi se bodo začeli takole:
zemljevid = ["." * 12] * 7
sledi = Sledi()
ana = Drsalec(1, 2, zemljevid, sledi)
berta = Drsalec(3, 0, zemljevid, sledi)
cilka = Drsalec(7, 3, zemljevid, sledi)
Test najprej pripravi nek zemljevid
(v tem primeru brez znamenitosti) in objekt sledi
; kaj vsebuje, je tvoja stvar. Vsi drsalci dobijo isti zemljevid in, predvsem, iste sledi. Tvoja funkcija pojdi
mora v objekt sledi
shranjevati sledi in jih iz njega razbirati. To počni, kakor želiš. (Namig: razred Sledi
je lahko res trivialen. Pri meni je njegova definicija dolga 12 znakov.)
Oceni 9 in 10
Glej ločeno nalogo.
Testi
- 10. januar 2024, 22:23