Pripovedke iz gozda

Imamo gozd. Se pravi drevesa. Na kvadratni mreži. Zaradi nekih novih norih evropskih predpisov.

Gozd na sliki opišemo s takšnimle seznamom nizov:

gozd = ["..##.......",
        "#...#...#..",
        ".#..#.#..#.",
        "..#.#...#.#",
        ".#...##..#.",
        "..#.##.....",
        ".#.#.#....#",
        ".#..#.....#",
        "#.###..#...",
        "#....#....#",
        ".#......#.#"]

V nizu se pojavljata samo znaka . in #. Vsi nizi so enako dolgi. Širina in višina nista nujno enaki. Razpored dreves sem ukradel na Advent of Code (slika pa je moja, samo zajec je iz OpenClipart). Saj mu vsako leto iz hvaležnosti nekaj nakažem. Resno.

Za ogrevanje

  • dimenzije(gozd) vrne širino in višino gozda. V gornjem primeru (11, 11).
  • je_drevo(x, y, gozd) vrne True, če je na koordinatah (x, y) drevo in False, če ni.

Ker tu nimaš kaj čarati, bodo testi preverili tudi, da je tvoja funkcija dolga eno samo vrstico, se pravi en sam return. Kar je več, je preveč.

Za oceno 6: Revirni gozdar

  • vsa_drevesa(gozd) vrne množico koordinat vseh dreves.
  • stevilo_dreves(x0, y0, x1, y1, gozd) vrne število dreves v pravokotniku med (x0, y0) in (x1, y1); prvo oglišče je vključeno, drugo ne - podobno kot range in rezine v Pythjonu. Predpostaviti smeš, da je x1 >= x0 in y1 >= y0. stevilo_dreves(2, 3, 4, 5, gozd) naj vrne 1, saj stolpec 4 in vrstica 5 nista vključeni.
  • ni_dreves(x0, y0, x1, y1, gozd) vrne True, če znotraj pravokotnika med (x0, y0) in (x1, y1) ni dreves. Tudi s to funkcijo moraš opraviti v enem zamahu - samo return.

Za oceno 7: Ljubitelj dreves

  • dreves_na_33(x, y, gozd) vrne število dreves na kvadratu dimenzij 3x3 z gornjim levim ogliščem na (x, y). To funkcijo napiši tako, da ima le return.
  • Nekdo kupuje parcelo velikosti 3x3 in bi rad čimveč dreves. naj_kvadrat(gozd) vrne največje število dreves, ki ga najdemo v kakem kvadratu dimenzij 3x3.

Za oceno 8: Grm, v katerem tiči zajec

  • lovec(x, y, pot, gozd) vrne število bušk, ki jih dobi pijani lovec, če se v začetku nahaja na koordinatah (x, y) in poskuša prehoditi podano pot. Kadar se zaleti v drevo, ne more narediti nameravanega koraka, temveč le dobi buško. Če poskuša zapustiti gozd, mu ne uspe, saj je okoli gozda ograja (v tem primeru ne dobi buške). Rdeča pot na sliki ustreza klicu lovec(1, 0, "v<v>>>v", self.gozd) (pozorno poglej!); funkcija v tem primeru vrne 3, saj se zaleti trikrat. Modra pot kaže drugo pot, ki jo testirajo testi.

  • Zajec se boji, da ga lovec, ker je pijan, slučajno ne bi celo zadel. Ve, da so lovci na vrhu gozda, zato poišče stolpec z največ drevesi in se skrije za najbolj spodnje drevo v tem stolpcu. V našem gozdu je to stolpec 4 in zajec tiči za drevesom (4, 8). Da je res tako, dokazuje prva slika.

    Funkcija zajec(drevesa) prejme množico koordinat dreves (kot jo vrne vsa_drevesa) in ne seznama nizov, vrne pa koordinate drevesa, za katerim bo trepetal zajec.

Za oceno 9: Kot hudičev boršt, vendar jasa

  • razdalja(x0, y0, x1, y1) vrne (evklidsko) razdaljo med (x0, y0) in (x1, y1). Pitagora pa to.
  • bliznja_drevesa(x, y, r, drevesa) vrne množico koordinat dreves, ki so od podanega drevesa oddaljena r ali manj. Argument je spet množica koordinat dreves in ne seznam nizov.
  • povezana_drevesa(r, drevesa) vrne slovar, katerega ključi so koordinate dreves, pripadajoče vrednosti pa množice dreves, ki so od posameznega drevesa oddaljene za največ r.
  • jasa(gozd) vrne površino največje jase, to je pravokotnika brez dreves. Štejejo seveda le pravokotniki, kateri stranice so poravnane s koordinatnima osema, ne pravokotniki zasukani pod poljubnim kotom. Argument je tokrat spet seznam nizov.

  • Da dokažeš svojo programersko spretnost, vse funkcije za ocene 6-9 napiši v eni sami vrstici, z uporabo izpeljanih seznamov, slovarjev, množic, generatorjev. Več vrstic si lahko privoščiš le pri lovec, zajec in jasa.

Za oceno 10: Tujerodna vrsta

  • V gozdu se je naselila opica. Opice rade skačejo z drevesa na drevo. Funkcija opica(x, y, r, drevesa) naj vrne množico koordinat vseh dreves, do katerih lahko priskače opica, če začne na koordinatah (x, y) in lahko skoči največ r daleč, vmes pa seveda nikoli ne gre na tla. Drevesa so podana z množico koordinat.

  • Poleg tega poskrbi, da bosta v eni vrstici napisana tudi zajec in jasa. Na daljši način bosta napisani le še lovec in opica.

Testi