Welk woord zit verborgen in deze blokkentoren?
Het verborgen woord is ALUMINIUM. De blokkentoren van deze puzzel wordt immers als volgt opgebouwd. We starten met de opeenvolgende hoofdletters van het alfabet, waarbij we de klinkers een rode kleur geven.
Daarna knippen we het alfabet doormidden na elke letter die voorkomt in het verborgen woord.
In dit geval knippen we dus na de letters A, I, L, M, N en U, waardoor we de volgende fragmenten overhouden.
Met deze fragmenten maken we nu een blokkentoren, waarbij de fragmenten van kort (boven) naar lang (onder) op elkaar gestapeld worden. Fragmenten die even lang zijn worden in alfabetische volgorde gestapeld (van boven naar onder).
Als laatste stap verwijderen we de letters uit de blokkentoren en is de puzzel klaar om opgelost te worden.
Een blokkentoren uit bovenstaande puzzel kan beschreven worden door de volgende twee datastructuren:
een tuple met de lengtes (int) van de rijen in de toren (opgelijst van boven naar onder)
een verzameling (set) met de posities van de klinkers in de toren; hierbij worden de rijen van de toren van boven naar onder genummerd, en de kolommen van links naar rechts, telkens vanaf nul; de positie van een blok in de blokkentoren kan daardoor voorgesteld worden door een tuple $$(r, k)$$, waarbij $$r$$ (int) het nummer van de rij en $$k$$ (int) het nummer van de kolom aanduidt waar het blok voorkomt in de blokkentoren
Gevraagd wordt om deze twee datastructuren te bepalen voor de blokkentoren die correspondeert met een gegeven verborgen woord. Hiervoor ga je als volgt te werk:
Schrijf een functie letters waaraan een woord (str) moet doorgegeven worden. De functie moet een lijst (list) teruggeven met alle letters (str) die in het woord voorkomen, in hoofdletters en opgelijst in alfabetische volgorde. Als dezelfde letter meermaals in het woord voorkomt, dan moet die maar één keer in de lijst opgenomen worden. Als het woord karakters bevat die geen letter zijn, dan moeten die niet in de lijst opgenomen worden.
Schrijf een functie fragmenten waaraan een woord (str) moet doorgegeven worden. De functie moet een lijst (list) met alle fragmenten (str) van het alfabet teruggeven, die we bekomen door het alfabet doormidden te knippen na elke letter in het gegeven woord. De fragmenten moeten in alfabetische volgorde opgelijst worden.
Schrijf een functie blokkentoren waaraan een woord (str) moet doorgegeven worden. De functie moet een tuple met alle fragmenten (str) van het alfabet teruggeven, die we bekomen door het alfabet doormidden te knippen na elke letter in het gegeven woord. De fragmenten moeten van kort naar lang opgelijst worden. Fragmenten die even lang zijn, moeten in alfabetische volgorde opgelijst worden.
Het tuple dat deze functie teruggeeft, noemen we de tuplevoorstelling van de blokkentoren waarin het gegeven woord verborgen zit.
Schrijf een functie rijlengtes waaraan de tuplevoorstelling moet doorgegeven worden van een blokkentoren waarin een woord verborgen zit. De functie moet een tuple teruggeven met de lengtes (int) van de rijen in de gegeven blokkentoren (opgelijst van boven naar onder).
Schrijf een functie klinkerposities waaraan de tuplevoorstelling moet doorgegeven worden van een blokkentoren waarin een woord verborgen zit. De functie moet een verzameling (set) teruggeven met de posities van de klinkers in de gegeven blokkentoren.
>>> letters('ALUMINIUM')
['A', 'I', 'L', 'M', 'N', 'U']
>>> fragmenten('ALUMINIUM')
['A', 'BCDEFGHI', 'JKL', 'M', 'N', 'OPQRSTU', 'VWXYZ']
>>> toren = blokkentoren('ALUMINIUM')
>>> toren
('A', 'M', 'N', 'JKL', 'VWXYZ', 'OPQRSTU', 'BCDEFGHI')
>>> rijlengtes(toren)
(1, 1, 1, 3, 5, 7, 8)
>>> klinkerposities(toren)
{(0, 0), (5, 0), (5, 6), (6, 3), (6, 7)}