Katoenen stof was in vroeger tijden een duur en schaars artikel. Men sprong er zuinig mee om: restanten of oude kledingstukken werden niet weggegooid, maar telkens opnieuw gebruikt. Oude lappen stikte men aan en op elkaar om te dienen als bescherming tegen de kou. Zo droegen soldaten in de Middeleeuwen doorgestikte tunieken over hun kleding om warm te blijven. De Romeinen kenden een soort gevoerd beddengoed, dat ze culcita noemden. Dit woord werd later verbasterd tot cowlte, waarvan het woord quilt is afgeleid.

Zoals met zoveel ambachtelijke en handwerktechnieken het geval is, maakte men ook bij het quilten van de nood een deugd. Het doorstikken van een paar lagen stof werd steeds decoratiever en gebeurde volgens patronen, de één nog kunstiger dan de andere. Bestond de bovenlaag van de quilt uit kleine, aan elkaar genaaide lapjes stof, dan spreekt men van een patchwork-quilt. De termen patchwork en quilt worden tegenwoordig vaak door elkaar gebruikt, omdat de meeste quilts samengesteld zijn uit patchwork.

Nu is er een overvloed aan goedkope katoenen stoffen en zijn er betaalbare warme dekens, en is men uiteraard niet meer afhankelijk van restjes of oude kleding. Het maken van patchwork is al lang geen noodzakelijke handenarbeid meer, maar wordt nog vaak uitgeoefend als hobby.

een patchwork-quilt
Een moderne patchwork-quilt.

Opgave

Definieer een klasse Quilt waarmee patronen van een quilt kunnen voorgesteld worden. Elke quilt correspondeert met een voorstelling van een aantal karakters in een roostervorm. Een $$2\times 4$$ quilt zou er bijvoorbeeld als volgt kunnen uitzien:

//-\
++||

De klasse moet volgende methoden implementeren:

Objecten van de klasse Quilt moeten onveranderlijk (immutable) zijn. Geen enkele methode mag de interne toestand van een object van de klasse Quilt wijzigen. Met andere woorden, de interne toestand van de objecten mag niet meer gewijzigd worden nadat de objecten geïnitialiseerd zijn, waardoor het enkel mogelijk is om nieuwe objecten aan te maken.

Voorbeeld

Opmerking: als je de onderstaande interactieve Python sessie wilt gebruiken als doctest, dan moeten alle backslashes van de uitvoer (die hieronder al een keer ge-escaped zijn) ge-escaped worden. Met andere woorden, alle backslashes in het eigenlijke resultaat moeten dus vervangen worden door een dubbele backslash.

>>> quilt = Quilt(2, 2, '//++')
>>> print(quilt)
//
++
>>> quilt += Quilt(2, 2, '-\\||')
>>> print(quilt)
//-\
++||
>>> quilt
Quilt(2, 4, '//-\\++||')
>>> quilt = quilt.draai()
>>> print(quilt)
+\
+\
-|
-/
>>> quilt
Quilt(4, 2, '+\\+\\-|-/')
>>> quilt += Quilt(2, 2, '-\\||')
Traceback (most recent call last):
AssertionError: quilts zijn niet even hoog
>>> quilt = quilt.draai()
>>> print(quilt)
||++
\-//
>>> Quilt(2, 3, '++++')
Traceback (most recent call last):
AssertionError: ongeldige configuratie
>>> Quilt(2, 3, 'oxooXo')
Traceback (most recent call last):
AssertionError: ongeldige configuratie