Lee Sallows construeerde deze zelfbeschrijvende rechthoekige betegeling: het rooster inventariseert zichzelf door de 70 letters en de 14 spaties horizontaal en verticaal te ordenen in 14 zinnen die een oplijsting van de inhoud geven.

inventaris
Zelfbeschrijvende rechthoekige betegeling (Lee Sallows).

Bonus: De twee zinnen die samenkomen in de rechterbovenhoek corresponderen met de afmetingen van de rechthoek ($$7 \times 12$$) en de voornaam van de auteur is ook opgenomen.

Opgave

Definieer een klasse Inventaris waarmee horizontaal en verticaal zinnen in een rechthoekig rooster kunnen geplaatst worden. Deze zinnen geven aan hoe vaak elke letter in het rooster voorkomt. Bij het aanmaken van objecten van de klasse Inventaris moeten twee getallen $$n$$ en $$m$$ (int) doorgegeven worden, waarbij $$n \in \mathbb{N}_0$$ het aantal rijen van het rooster aangeeft en $$m \in \mathbb{N}_0$$ het aantal kolommen. De rijen van het rooster worden van boven naar onder genummerd en de kolommen van links naar rechts, telkens vanaf één.

Zorg ervoor dat de ingebouwde functie print kan gebruikt worden om de stringvoorstelling van een object van de klasse Inventaris uit te schrijven. Deze stringvoorstelling geeft elke rij van het rooster weer op een afzonderlijke regel. Elke cel wordt voorgesteld door één van de volgende karakters:

De klasse Inventaris moet minstens de volgende methoden ondersteunen:

Voorbeeld

>>> inventaris = Inventaris(7, 12)
>>> print(inventaris)
############
############
############
############
############
############
############
>>> inventaris.opgelijste_voorkomens()
{}
>>> inventaris.waargenomen_voorkomens()
{}
>>> print(inventaris.plaats('N', 2, 'H3:5'))
############
############
####TWO-N###
############
############
############
############
>>> inventaris.opgelijste_voorkomens()
{'N': 2}
>>> inventaris.waargenomen_voorkomens()
{'N': 1, 'O': 1, 'T': 1, 'W': 1}
>>> print(inventaris.plaats('.', 2, 'H4:5'))
Traceback (most recent call last):
AssertionError: ongeldige letter
>>> print(inventaris)
############
############
####TWO-N###
############
############
############
############
>>> print(inventaris.plaats('N', 2, 'H4:5'))
Traceback (most recent call last):
AssertionError: letter reeds gebruikt
>>> print(inventaris)
############
############
####TWO-N###
############
############
############
############
>>> print(inventaris.plaats('S', 5, 'V2:4'))
############
###F########
###ITWO-N###
###V########
###E########
###-########
###S########
>>> inventaris.opgelijste_voorkomens()
{'N': 2, 'S': 5}
>>> inventaris.waargenomen_voorkomens()
{'E': 1, 'F': 1, 'I': 1, 'N': 1, 'O': 1, 'S': 1, 'T': 1, 'V': 1, 'W': 1}
>>> print(inventaris.plaats('E', 12, 'H1:2').plaats('R', 5, 'H6:5').plaats('W', 4, 'H7:5'))
#TWELVE-E###
###F########
###ITWO-N###
###V########
###E########
###-FIVE-R##
###SFOUR-W##
>>> inventaris.plaats('X', 6, 'H13:2')
Traceback (most recent call last):
AssertionError: ongeldige positie
>>> print(inventaris)
#TWELVE-E###
###F########
###ITWO-N###
###V########
###E########
###-FIVE-R##
###SFOUR-W##
>>> inventaris.plaats('X', 6, 'H3:2')
Traceback (most recent call last):
AssertionError: positie reeds gebruikt
>>> print(inventaris)
#TWELVE-E###
###F########
###ITWO-N###
###V########
###E########
###-FIVE-R##
###SFOUR-W##
>>> print(inventaris.plaats('L', 2, 'V1:10').plaats('U', 3, 'V1:11').plaats('H', 3, 'V1:12'))
#TWELVE-ETTT
###F#####WHH
###ITWO-NORR
###V#####-EE
###E#####LEE
###-FIVE-R--
###SFOUR-WUH
>>> print(inventaris.plaats('V', 6, 'H2:5').plaats('F', 6, 'H4:5').plaats('T', 6, 'H5:5'))
#TWELVE-ETTT
###FSIX-VWHH
###ITWO-NORR
###VSIX-F-EE
###ESIX-TLEE
###-FIVE-R--
###SFOUR-WUH
>>> inventaris.volledig()
False
>>> print(inventaris.plaats('I', 7, 'V1:1').plaats('O', 5, 'V2:2').plaats('X', 4, 'V2:3'))
STWELVE-ETTT
EFFFSIX-VWHH
VIOITWO-NORR
EVUVSIX-F-EE
NERESIX-TLEE
----FIVE-R--
IOXSFOUR-WUH
>>> inventaris.volledig()
True
>>> inventaris.opgelijste_voorkomens()
{'E': 12, 'F': 6, 'H': 3, 'I': 7, 'L': 2, 'N': 2, 'O': 5, 'R': 5, 'S': 5, 'T': 6, 'U': 3, 'V': 6, 'W': 4, 'X': 4}
>>> inventaris.waargenomen_voorkomens()
{'E': 12, 'F': 6, 'H': 3, 'I': 7, 'L': 2, 'N': 2, 'O': 5, 'R': 5, 'S': 5, 'T': 6, 'U': 3, 'V': 6, 'W': 4, 'X': 4}
>>> inventaris.zelfbeschrijvend()
True