Een woordvierkant bestaat uit een reeks woorden die in een vierkant rooster uitgeschreven worden, zodat hetzelfde woord zowel horizontaal als verticaal kan uitgelezen worden in de overeenkomstige rij en kolom van het rooster. Het aantal woorden — dat gelijk is aan het aantal letters van elk woord — wordt de orde van het vierkant genoemd. Dit is bijvoorbeeld een woordvierkant van orde 3:

woordvierkant orde 3

In vergelijking met kleine woordvierkanten, zijn grote woordvierkanten verschrikkelijk moeilijk te construeren. Het grootste woordvierkant dat men tot op vandaag heeft kunnen opstellen, bestaat uit 9-letterwoorden:

woordvierkant orde 9

Puzzelfanaten zijn al meer dan 100 jaar op zoek naar een perfect $$10 \times 10$$ woordvierkant. Deze taak leek schier onmogelijk, totdat Dmitri Borgmann in 1972 onverwacht botste op een artikel van David Livingstone in een Afrikaanse krant, waarvan de editie van 26 september 1872 het volgende tekstfragment bevatte:

Through forest, along the side of a sedgy valley. Cross its head-water, which has rust of iron in it, then west and by south. The forest has very many tsetse. Zebras calling loudly, and Senegal long claw in our camp at dawn, with its cry, 'O-o-o-o-o-o-o-o-o-o.'

Meer was er niet nodig. Voorzien van een pen kon de geelbuiklangkauw (Macronyx flavigaster) voor Livingstone een perfect $$10 \times 10$$ woordvierkant neergeschreven hebben:

woordvierkant orde 10

We moesten vaker te rade gaan bij andere soorten. Elke langkauw had ons deze oplossing op een dienblaadje kunnen aanbieden — inderdaad, het is het enige woordvierkant dat die vogel kan maken!

Macronyx flavigaster

Opgave

Omdat woordvierkanten symmetrisch zijn ten opzichte van de hoofddiagonaal, volstaat het om een woordvierkant te beschrijven door de letters op en onder de hoofddiagonaal uit te lezen van links naar rechts, en van boven naar onder. Het woordvierkant van orde 3 dat in de inleiding als voorbeeld gegeven werd, kan op die manier beschreven worden aan de hand van de zes letters BICTEN. Algemeen geldt dat een woordvierkant van orde $$n$$ kan beschreven worden aan de hand van $$\frac{n(n + 1)}{2}$$ letters op of onder de hoofddiagonaal. Je opdracht bestaat erin een klasse Woordvierkant te definiëren waarmee woordvierkanten kunnen voorgesteld worden in Python. Deze klasse moet minstens de volgende methoden ondersteunen:

Bovendien moet het mogelijk zijn om met de ingebouwde functie print een stringvoorstelling uit te schrijven van elk object van de klasse Woordvierkant. In deze stringvoorstelling worden de letters van het woordvierkant rij per rij uitgeschreven, zoals aangegeven in onderstaande voorbeelden.

Voorbeeld

Bij onderstaande voorbeeldsessie gaan we ervan uit dat het tekstbestand words.txt1 zich in de huidige directory bevindt.

>>> vierkant = Woordvierkant(3, 'bicten')
>>> vierkant.letter(1, 0)
'I'
>>> vierkant.letter(1, 1)
'C'
>>> vierkant.letter(1, 2)
'E'
>>> vierkant.woord(1)
'ICE'
>>> print(vierkant)
BIT
ICE
TEN
>>> vierkant.geldig('words.txt')
True

>>> vierkant.letter(1, 3)
Traceback (most recent call last):
AssertionError: ongeldige index
>>> vierkant.woord(3)
Traceback (most recent call last):
AssertionError: ongeldige index

>>> vierkant = Woordvierkant(3, 'ABCDE')
Traceback (most recent call last):
AssertionError: ongeldig vierkant

>>> vierkant = Woordvierkant(9, 'ACRHEXANABLINOLADDLEHSERINETINITIATOASCENDERS')
>>> vierkant.woord(1)
'CRENIDENS'
>>> vierkant.woord(7)    
'INITIATOR'
>>> print(vierkant)
ACHALASIA
CRENIDENS
HEXANDRIC
ANABOLITE
LINOLENIN
ADDLEHEAD
SERINETTE
INITIATOR
ASCENDERS
>>> vierkant.geldig('words.txt')
True

>>> vierkant = Woordvierkant(4, 'ABCDEFGHIJ')
>>> print(vierkant)
ABDG
BCEH
DEFI
GHIJ
>>> vierkant.geldig('words.txt')
False

Bronnen