Klasse - Stapels Bouwen

You might also like

Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 2

# https://dodona.ugent.

be/nl/courses/1660/series/27714/activities/413742074/
# https://dodona.ugent.be/nl/courses/1660/series/27714/activities/886891198/

# Dit bestand omvat zowel de oplossing voor de oefeningen


# Stapels Bouwen - deel A - E2023
# Stapels Bouwen - deel B - E2023

class BouwStapel:
def __init__(self, l: list, h: int):
self.hoogtes = l # Lijst met hoogtes van elke stapel
self._h = h

def __str__(self):
# De stringvoorstelling moet voor elke stapel afzonderlijk bepaald worden
# Omkeren is op het einde nodig: anders zou de onderste stapel bovenaan
afgedrukt worden
# We zetten '.' als er geen blokje ligt...
out = [''.join(['.' if height >= i else 'X' for i in self.hoogtes]) for
height in range(self._h)][::-1]
return '\n'.join(out)

def __imatmul__(self, other: tuple):


a, b = other # Assigneer de twee elementen uit de tuple in nieuwe
veranderlijken (schrijft makkelijker)
# If: test of er nog blokjes op stapel a liggen en b niet te hoog zou
worden
if self.hoogtes[a] > 0 and self.hoogtes[b] < self._h:
self.hoogtes[a] -= 1
self.hoogtes[b] += 1
return self # Courante fout, nimmer vergeten om return self te schrijven!

# Bijkomende code voor Deel B


def moves(self, new) -> list:
# Eerste stap: Zoek uit welke stapels in self verkleind en vergroot moeten
worden
temp: iter = [i - j for i, j in zip(self.hoogtes, new.hoogtes)]
small: dict = {i: abs(j) for i, j in enumerate(temp) if j < 0} # Overzicht
van stapels die te klein zijn
large: dict = {i: abs(j) for i, j in enumerate(temp) if j > 0} # Overzicht
van stapels die te groot zijn
del temp # Heeft zijn heilige plicht vervuld
# Minimaal aantal zetten: beschouw de eerste te grote stapel
# We maken dankbaar gebruik van het feit dat moderne Pythonwoordenboeken de
volgorde van toevoeging onthouden
# Draag één blokje over naar de eerste te kleine stapel
# Herhaal tot wanneer alle stapels de juiste grootte hebben bereikt
# Hier komt een while lus aan!
out: list = [] # Bereid de output voor
for i in large: # Loop alle te grote stapels 1 voor 1 af
# Zoek de eerste stapel waar er nog een blokje nodig is
for _ in range(large[i]):
# Bij constructie weten we dat waarden in het woordenboek "afleg"
altijd positief zijn
afleg = next((i for i, j in small.items()))
out.append((i, afleg))
# Merk op dat we alhier het object "self" niet aanpassen!
large[i] -= 1
small[afleg] -= 1
if small[afleg] == 0:
del small[afleg] # Verwijder deze entry uit het woordenboek
return out

You might also like