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 koordinate x, 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čno x0, y0 in vključno x1, y1 (pri smeš predpostaviti, da velja x0 <= x1 in y0 <= 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".

Rešitev ```python # Ta razred je že definiran v testih class Figura: def __init__(self, x, y): self.x = x self.y = y self.ime = "figura" def opis(self): return f"{self.ime} na {' abcdefgh'[self.x]}{self.y}" def premik(self, smer, razdalja): pass class Trdnjava(Figura): def __init__(self, x, y): super().__init__(x, y) self.ime = "Trdnjava" def premik(self, smer, razdalja): if smer == "-": self.x += razdalja else: self.y += razdalja class Lovec(Figura): def __init__(self, x, y): super().__init__(x, y) self.ime = "Lovec" def premik(self, smer, razdalja): if smer == "/": self.x += razdalja self.y += razdalja else: self.x -= razdalja self.y += razdalja ```
Последнее изменение: понедельник, 6 ноября 2023, 09:40