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

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

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

# 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

Zadnja sprememba: sreda, 11. januar 2023, 10.41