Testi

Testi: testi-guugu-yimithirr.py

Naloga

Naloge je tokrat kratka, kot obljubljeno, in ena sama, brez ogrevanja in raztezanja.

Nekatera aboriginska plemena, na primer Guugu Yimithirr ne poznajo egocentričnih smeri, kot je na primer levo in desno (od mene), temveč uporabljajo absolutne smeri. V slovenščini bi se to slišalo tako, da ne bi rekli, da je Jože sedel desno od Benjamina temveč severno od njega. Čevlji se nahajajo v zahodni omari, južno od superg. To je zelo praktično, če veliko hodiš po gozdu, saj se tako celo življenje uriš v tem, da imaš v glavi kompas.

Če bi torej tudi zahodnjaki uporabljali tak jezik - ali pa če bi svet osvojili aborigini in ne zahodnjaki -, želva ne bi šla naprej in nazaj ter se vrtela levo in desno, temveč bi šla na sever, jug, vzhod in zahod. In ne bi bila želva temveč kenguru.

Napiši torej razred Kangaroo z naslednjimi metodami.

  • move(self, where) kot argument prejme niz, katerega prva črka je (angleška) smer neba, preostanek pa celoštevilska razdalja. Če pokličemo move("N42"), se kenguru premakne za 42 enot proti severu.

  • distance(self) vrne kengurujevo razdaljo od začetne točke. Spodnji program izpiše 5. (Matematično zakrneli naj se spomnijo Pitagorovega izreka.)

roo = Kangaroo()
roo.move("N3")
roo.move("W4")
print(roo.distance())
  • travel(self, path) prejme seznam smeri, na primer, ["W4", "N3", "N2", "E1"] in ga izvede tako, da kliče metodo move.

  • home(self) vrne seznam premikov, ki kenguruja pripeljejo domov. Če je kenguru, recimo, pet enot severno in tri vzhodno od izhodišča, mora metoda home vrniti ["S5", "W3"] ali ["W3", "S5"]. Rezultat ["N-5", "E-3"] ni pravilen. Če je kenguru šest enot južno od izhodišča (in nič vzhodno ali zahodno), metoda vrne ["N6"].

Kako boste sestavili razred in kakšni bodo njegovi atributi, je prepuščeno vam. Le gornje metode morajo delovati.

Rešitev

Kenguru mora vedeti, kje je. To bo zapisoval v self.x in self.y. V konstruktorju (__init__) ju bo postavil na 0, v ostalih metodah pa spreminjal, kot bo potrebno.

from math import sqrt


class Kangaroo:
    def __init__(self):
        self.x = self.y = 0

    def move(self, where):
        direction = where[0]
        length = int(where[1:])
        if direction == "N":
            self.y += length
        if direction == "S":
            self.y -= length
        if direction == "E":
            self.x += length
        if direction == "W":
            self.x -= length

    def distance(self):
        return sqrt(self.x ** 2 + self.y ** 2)

    def travel(self, path):
        for x in path:
            self.move(x)

    def home(self):
        path = []
        if self.y > 0:
            path.append("S{}".format(self.y))
        elif self.y < 0:
            path.append("N{}".format(-self.y))
        if self.x > 0:
            path.append("W{}".format(self.x))
        elif self.x < 0:
            path.append("E{}".format(-self.x))
        return path

Med različnimi krajšimi različicami mi je najbolj pri srcu takšna, ki uporablja kompleksna števila.

class Kangaroo:
    def __init__(self):
        self.pos = 0

    def move(self, where):
        self.pos += {"N": 1j, "S": -1j, "E": 1, "W": -1}[where[0]] * int(where[1:])

    def distance(self):
        return abs(self.pos)

    def travel(self, path):
        for x in path:
            self.move(x)

    def home(self):
        path = []
        x, y = int(self.pos.real), int(self.pos.imag)
        if y:
            path.append("{}{}".format("NS"[y > 0], abs(y)))
        if x:
            path.append("{}{}".format("EW"[x > 0], abs(x)))
        return path
마지막 수정됨: 목요일, 25 3월 2021, 9:29 PM