Izziv: Rešitev z numpy-jem

Nalogo je čisto preprosto rešiti z numpy-jem. Ampak samo tistim, ki obvladajo numpy.

import numpy as np

zemljevid = [
    "......",
    "..##..",
    ".##.#.",
    "...###",
    "###.##",
]

zemljevid = np.array([[0] + [int(c == "#")
                      for c in vrstica] + [0] for vrstica in zemljevid])

zemljevid je po tem tabela v numpy-ju, ki vsebuje enke na mestih, kjer so ovire; levo in desno sta dodana še stolpca ničel.

array([[0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 1, 0, 0, 0],
       [0, 0, 1, 1, 0, 1, 0, 0],
       [0, 0, 0, 0, 1, 1, 1, 0],
       [0, 1, 1, 1, 0, 1, 1, 0]])

Ovire se začnejo tam, kjer enica sledi ničli in končajo tam, kjer enici sledi ničla.

S tremi vrsticami numpy-ja - brez kakršnekoli zanke v Pythonu - je možno pridelati tabelo, ki je v bistvu rešitev naloge:

array([[3, 4, 2],
       [2, 3, 3],
       [5, 5, 3],
       [4, 6, 4],
       [1, 3, 5],
       [5, 6, 5]])

Znaš?

Nasveti:

  • glavni trik je odštevanje po stolpcih. Tabelo, ki ji odbijemo prvi stolpec, je potrebno odšteti od tabele, ki ji odbijemo zadnjega. Ali nekaj podobnega. Potem pa preveriti, kje v rezultatu so enice. Ali nekaj podobnega.
  • Poglej funkcijo np.nonzero. Z njo hitro prideš do koordinat začetkov in koncev ovir. Rezultat razpakiraš v y in x0 oziroma y in x1. (Če boš prav naredil, boš dvakrat dobil isti y).
  • Če so vse številke v kaki tabeli prevelike ali premajhne za 1, ji odštej ali prištej 1.
  • Če imaš tri enodimenzionalne tabele, ki jih želiš zložiti v eno, lahko uporabiš np.column_stack.

Če rešiš nalogo na ta način (in si prepričan, da deluje pravilno), jo lahko oddaš kot rešitev obveznega dela domače naloge.

Zadnja sprememba: nedelja, 30. oktober 2022, 17.54