Preskoči na glavno vsebino
Učilnica FRI 23/24
  • Domov
  • Več
Zapri
Preklopi iskalni vnos
Slovenščina ‎(sl)‎
English ‎(en)‎ Slovenščina ‎(sl)‎ Македонски ‎(mk)‎ Русский ‎(ru)‎ 한국어 ‎(ko)‎
Trenutno uporabljate gostujoči dostop
Prijavite se
Domov
Course Activities
Forumi Naloge Viri
Nedavno dostopani predmeti
You are not enrolled in any courses
  1. p1
  2. Ocene 6 - 8: Sledi v snegu

Ocene 6 - 8: Sledi v snegu

Zahteve zaključka
Odprto: sreda, 10. januar 2024, 00.00
Rok za oddajo: ponedeljek, 29. januar 2024, 23.59

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 ukaze premik ali pojdi.

  • 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. Metoda prevozi mora klicati metodo pojdi 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 argumente x, y, zemljevid. zemljevid ima enak pomen kot prej, x in y 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, metoda naj_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, funkcija trofeje() 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 nazaj v, na polje, ki ga je pravkar zapustila v smeri ^. Odnese jo torej gor in nato spet v. 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

  • testi.py testi.py
    10. januar 2024, 22:23
◄ English translation
Rešitev ►
Trenutno uporabljate gostujoči dostop (Prijavite se)
Pridobi mobilno aplikacijo Obvestilo o avtorskih pravicah
Stran poganja Moodle