Ga naar hoofdinhoud

De buren

In de vorige stap las je met doolhof[rij][kolom] wat er op een vakje staat. Nu zoek je de buren van een vakje: de vier vakjes erboven, eronder, links en rechts ervan. Aan de rand van het doolhof zijn het er minder, want daar houdt het doolhof op.

Voorspel​

vakje = (2, 1)
rij, kolom = vakje
for r, k in [(rij - 1, kolom), (rij + 1, kolom), (rij, kolom - 1), (rij, kolom + 1)]:
print(r, k)

Wat print dit programma?

Antwoord
1 1
3 1
2 0
2 2

Eerst het vakje erboven (een rij minder), dan eronder (een rij meer), dan links (een kolom minder) en rechts (een kolom meer). Elk paar in de lijst is een tuple, en for r, k in pakt hem uit.

Zo werkt het​

De functie buren krijgt een vakje en geeft een lijst met zijn buren terug. Hij pakt het vakje uit, loopt langs de vier mogelijke buren, en zet ze met append in de lijst resultaat.

Een buur telt alleen mee als hij binnen het doolhof ligt. Boven rij 0 is er geen rij meer, en onder de laatste rij ook niet. Datzelfde geldt voor de kolommen links en rechts.

Onderzoek​

  1. Draai de code. Welke buren heeft (2, 1)? Zoek ze op in het doolhof.
  2. Vraag buren((0, 0)). Welke van die vakjes bestaan niet?
  3. Zet onderaan print(doolhof[-1]). Geeft Python een foutmelding?
  4. Vraag buren((4, 5)). Welke buren liggen buiten het doolhof?
Python
Code-omgeving wordt voorbereid…
Antwoorden
  1. [(1, 1), (3, 1), (2, 0), (2, 2)]. Op (2, 0) staat een muur; daar kijk je in de volgende stap naar.
  2. Je krijgt [(-1, 0), (1, 0), (0, -1), (0, 1)]. Rij -1 en kolom -1 bestaan niet: die liggen boven en links van het doolhof.
  3. Nee. Een negatieve index telt vanaf het eind, dus doolhof[-1] is de onderste rij, "#....E". Een robot die naar rij -1 gaat, springt dus zonder foutmelding van de bovenrand naar de onderrand.
  4. (5, 5) en (4, 6): rij 5 en kolom 6 bestaan niet.

Opdracht: binnen de randen​

Laat buren alleen de vakjes geven die binnen het doolhof liggen. Voor de start en de uitgang geeft hij dan:

[(1, 0), (0, 1)]
[(3, 5), (4, 4)]

Begin klein, en breid de code stap voor stap uit:

  1. Draai de code: buren((0, 0)) geeft vier vakjes, ook (-1, 0) en (0, -1).
  2. Zet de append in een if r >= 0:. Nu is (-1, 0) weg.
  3. Zet er met and de voorwaarde k >= 0 bij. Nu geeft hij [(1, 0), (0, 1)].
  4. Vraag ook buren((4, 5)), en zet er de twee voorwaarden voor de onderrand en de rechterrand bij: r < len(doolhof) en k < len(doolhof[0]).
Python
Code-omgeving wordt voorbereid…
Tip

Waarom r < len(doolhof) en niet r <= len(doolhof)? Het doolhof heeft 5 rijen, met de nummers 0 tot en met 4. Rij 5 bestaat niet meer.

Antwoord

Dit vervangt de functie buren en de print in de editor:

def buren(vakje):
rij, kolom = vakje
resultaat = []
for r, k in [(rij - 1, kolom), (rij + 1, kolom), (rij, kolom - 1), (rij, kolom + 1)]:
if r >= 0 and r < len(doolhof) and k >= 0 and k < len(doolhof[0]):
resultaat.append((r, k))
return resultaat

print(buren((0, 0)))
print(buren((4, 5)))
[(1, 0), (0, 1)]
[(3, 5), (4, 4)]

len(doolhof) is het aantal rijen, en len(doolhof[0]) het aantal tekens van de eerste rij: het aantal kolommen.

Door naar muren.