Žabji skoki

S prvo funkcijo opravimo z nekaj if-i: žabo v začetku postavimo na x = y = 0 in prehojena polja vsebujejo le to polje, polja = {(0, 0)}. Nato gremo čez vse pare smer, koliko ter spremenimo ustrezno koordinato za koliko. Podobne reči smo počeli že večkrat; naša žaba je kot malo manj sofisticirana želva, pa tudi z nekim pajkom je v sorodu.

def zaba(s): x = y = 0 polja = {(0, 0)} for smer, koliko in s: if smer == "S": y += koliko elif smer == "J": y -= koliko elif smer == "V": x -= koliko elif smer == "Z": x += koliko polja.add((x, y)) return polja

Gre tudi brez if-ov, recimo takole:

def zaba(s): x = y = 0 polja = {(0, 0)} dy = {"S": 1, "J": -1, "V": 0, "Z": 0} dx = {"S": 0, "J": 0, "V": -1, "Z": 1} for smer, koliko in s: x += koliko * dx[smer] y += koliko * dy[smer] polja.add((x, y)) return polja

Za drugo funkcijo le pokličemo prvo in za vsak par x, y preverimo ali je slučajno izven predpisanih meja. Če je vrnemo False; če ni, ne storimo ničesar in šele na koncu vrnemo True.

def zaba_znotraj(s, max_x, max_y): for x, y in zaba(s): if x > max_x or y > max_y or x < 0 or y < 0: return False return True

Za ugotavljanje največje razdalje bomo za vsak par x, y izračunali razdaljo in jo primerjali z največjo doslej.

from math import sqrt def naj_razdalja(s): naj = 0 for x, y in zaba(s): d = x ** 2 + y ** 2 if d > naj: naj = d return sqrt(naj)

Zadnja funkcija mora vrniti velikost preseka množice polj, prek katerih je šla žaba in množice polj, na katerih so muhe.

def muhe(pozicije, zabja_pot): return len(pozicije & zaba(zabja_pot))

Naprej-nazaj

Spet le prepišemo definicijo iz naloge v rekurzivno funkcijo. Če si pomagamo še s slovarjem, ki ga je priporočila naloga, je še lažje.

def naprej_nazaj(s): obratno = {"S": "J", "J": "S", "V": "Z", "Z": "V"} return len(s) == 0 or s[-1] == obratno[s[0]] and naprej_nazaj(s[1:-1])

Kaj pa se zgodi, ko če dobimo niz dolžine 1? Lahko tej primerjamo prvi in zadnji element? Tudi takrat funkcija naredi natančno, kar mora: prvi in zadnji element sta tedaj en in isti element. V tem primeru pogoj, da mora biti prvi obratni kot zadnji, ne more biti izpolnjen in funkcija bo, kot tudi mora, za vse nize dolžine 1 vrnila False.

Restavracija

Tokrat gremo prek vseh vrednosti v slovarju (narocila.values) in seštevamo, kar najdemo v njih. Spet dokaj običajna naloga, le malo drugače je obrnjena.

def zberi(narocila): from collections import defaultdict skupaj = defaultdict(int) for jedi in narocila.values(): for jed in jedi: skupaj[jed] += 1 return skupaj

Žaba v razredu

Konstruktor mora shraniti koordinate (tega smo že zelo vajeni) in spremenljivko, v katero bo sešteval skupno pot. Vse metode so potem precej dolgočasne.

class Zaba: def __init__(self): self.x = 0 self.y = 0 self.pot = 0 def sever(self, d): self.y += d self.pot += d def jug(self, d): self.y -= d self.pot += d def vzhod(self, d): self.x -= d self.pot += d def zahod(self, d): self.x += d self.pot += d def pozicija(self): return self.x, self.y def skupna_pot(self): return self.pot
Zadnja sprememba: nedelja, 22. junij 2014, 15.38