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.
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:
Een initialisatiemethode __init__ waaraan drie argumenten moeten meegegeven worden: i) het aantal rijen $$m$$, ii) het aantal kolommen $$n$$ en iii) een string. De quilt wordt van links naar rechts, en van boven naar onder opgevuld met de opeenvolgende karakters van de gegeven string. Deze string moet dus juist evenveel karakters tellen als het aantal rijen $$m$$ vermenigvuld met het aantal kolommen $$n$$ waaruit de quilt bestaat. De initialisatiemethode moet een AssertionError met de tekst ongeldige configuratie opwerpen indien niet aan deze voorwaarden voldaan is. Een quilt kan enkel uit geldige karakters bestaan, en de initialisatiemethode moet eveneens een AssertionError met de tekst ongeldige configuratie opwerpen als dat niet het geval is. Onder geldige karakters verstaan we deze symbolen die we na 90 graden draaien nog steeds door een karakter uit de ASCII tekenset kunnen voorstellen: \,/,+,*,-,|,o,x.
Een methode __str__ die een stringvoorstelling van de quilt teruggeeft. Deze stringvoorstelling bestaat uit $$m$$ regels, waarbij elke regel $$n$$ karakters telt. De stringvoorstelling eindigt zelf niet op een newline.
Een methode __repr__ die een stringvoorstelling van de quilt teruggeeft. Deze stringvoorstelling leest als een Python expressie die een nieuw object aanmaakt van de klasse Quilt dat dezelfde toestand heeft.
Een methode draai die een nieuw Quilt object teruggeeft, met een patroon dat 90 graden in wijzerzin gedraaid is ten opzichte van het patroon van het object waarop deze methode wordt aangeroepen.
Een methode __add__ die toelaat twee quilts aan elkaar te "naaien". Enkel quilts met dezelfde hoogte kunnen aan elkaar genaaid worden. De methode moet een AssertionError met de tekst quilts zijn niet even hoog opwerpen als de twee quilts ongelijke hoogtes hebben. Anders moet de methode een nieuw Quilt object teruggeven, waarvan het patroon bestaat uit de aan elkaar genaaide patronen van de twee objecten die bij elkaar opgeteld worden.
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.
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