Naloge
Ladja
Napiši razred Ladja
z naslednjimi metodami.
- Konstruktor prejme nosilnost ladje.
natovori(teza)
natovori paket s podano težo. Če skupna teža s tem preseže nosilnost ladje, z nje vržejo toliko paketov, da je teža spet v okviru dovoljene. Pakete odstranjujejo v enakem vrstnem redu, kot so jih nalagali, torej najprej najstarejšega. Metoda ne vrne ničesar.skupna_teza()
vrne skupno težo vseh paketov na ladji.odstranjenih()
vrne število paketov, ki so bili doslej odstranjeni z ladje zaradi preseganja nosilnosti.
Recimo, da imamo ladjo z nosilnostjo 42.
- Nanjo natovorimo paket s težo 30 in nato paket s težo 10. Skupna teža je 40.
- Dodajo paket s težo 21. Ker je nosilnost presežena (30 + 10 + 21 = 61 > 42), z ladje vržejo prvi paket, 30. Skupna teža je zdaj 10 + 21 = 31, na ladji sta dva paketa in število odstranjenih je 1.
- Nato natovorijo paket s težo 41. Nosilnost je presežena (10 + 21 + 41 = 72 > 42), zato bodo vrgli z ladje prvi paket (10). Ker je nosilnost še vedno presežena, vržejo z ladje še drugi paket. Ostane le en paket, skupna teža je 41, število doslej odstranjenih je 3.
- Nato natovorijo paket s težo 50. Z ladje vržejo paket s težo 41. Ker je nosilnost še vedno presežena, odstranijo še pravkar naloženi paket (50). Skupna teža je 0, število odstranjenih je 5.
Rešitev
```python class Ladja: def __init__(self, nosilnost): self.paketi = [] self.nosilnost = nosilnost self.odstr = 0 def natovori(self, teza): self.paketi.append(teza) while self.skupna_teza() > self.nosilnost: del self.paketi[0] self.odstr += 1 def skupna_teza(self): return sum(self.paketi) def odstranjenih(self): return self.odstr ```Mesto
Napiši razred Mesto
, ki predstavlja mesto, postavljeno na koordinatno mrežo.
- Konstruktor prejme njegovo širino in višino.
- Metoda
postavi(x, y)
postavi hišo na koordinatex
,y
. Koordinate številčimo od 0 naprej. Če postavimo na isto mesto več hiš, je postavljena le ena. - Metoda
porusi(x0, y0, x1, y1)
poruši vse hiše v pravokotniku med vključnox0
,y0
in vključnox1
,y1
(pri smeš predpostaviti, da veljax0 <= x1
iny0 <= y1
). - Metoda
prosto()
naj vrne število prostih polj.
Rešitev
```python class Mesto: def __init__(self, sirina, visina): self.sirina = sirina self.visina = visina self.polno = set() def postavi(self, x, y): if 0 <= x < self.sirina and 0 <= y < self.visina: self.polno.add((x, y)) def porusi(self, x0, y0, x1, y1): self.polno -= {(x, y) for x in range(x0, x1 + 1) for y in range(y0, y1 + 1)} def prosto(self): return self.sirina * self.visina - len(self.polno) ```Figure (dedovanje)
V testih je podan razred Figura
, ki predstavlja figuro na šahovnici. Tega ne spreminjaj, pač pa iz njega izpelji razreda Trdnjava
in Lovec
. Definiraj jima nov konstruktor in metodo premik
z enakimi argumenti kot podedovani metodi.
Trdnjava
(top) se premika vodoravno ali navpično. Metoda premik
prejme smer, ki je lahko "|"
ali "-"
in razdaljo. Metoda spremeni x ali y za podano razdaljo; pozitivna razdalja poveča x oz. y, negativna ga zmanjša.
Lovec
(tekač, laufar) se premika diagonalno. Metoda premik
prejme smer \
ali /
in razdaljo. Pozitivna razdalja vedno poveča y in negativna ga zmanjša. Sprememba x je odvisna od smeri: pri smeri /
pozitivna razdalja poveča x, negativna ga zmanjša. Pri smeri \
pozitivna razdalja zmanjša x, negativna ga poveča.
Poleg tega, ne da bi spremenil(a) ali sestavila novo metodo opis
, poskrbi, da bo metoda opis
za trdnjavo na, recimo, koordinatah 3, 5 vrnila "Trdnjava na c5"
(in ne "Figura na c5"
), za lovca na 3, 5 pa "Lovec na c5"
.