Het computerprogramma cowsay genereert ASCII-afbeeldingen van een koe met een bijhorend bericht.
+----------------------------+
| Moo may represent an idea, |
| but only the cow knows. |
+----------------------------+
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Daarnaast kan het ook afbeeldingen genereren door gebruik te maken van voorgevormde tekeningen van andere dieren zoals Tux de Pinguïn1, de mascotte van het Linux besturingssysteem.
+----------------------------+
| Moo may represent an idea, |
| but only the cow knows. |
+----------------------------+
\
\
.--.
|^_^ |
|:_/ |
// \ \
(| | )
/'\_ _/`\
\___)=(___/
Het computerprogramma maakt gebruik van voorgevormde tekeningen die worden opgeslaan in tekstbestanden die gebruik maken van de extensie .cow, waardoor het programma afbeeldingen kan genereren van andere soorten "koeien". Elk tekstbestand bevat ook twee voorkomens van een paar accolades ({}) waardoor er ook verschillende soorten "ogen" kunnen gegenereerd worden. Het programma was oorspronkelijk een soort inside joke binnen de wereld van de hackers, maar het bestaat al zo lang dat het gebruik ervan ondertussen wijd verspreid is.
Schrijf een klasse Cowsay waarmee ASCII-afbeeldingen kunnen gegenereerd worden van een "koe" met een bijhorend bericht. De objecten van deze klasse moeten minstens de volgende methoden hebben:
Een initialisatiemethode __init__ waaraan een reeks (lijst of tuple) van strings moet doorgegeven worden. Deze strings vormen de opeenvolgende regels van het bericht dat door de "koe" moet uitgesproken worden. Na initialisatie van het object wordt dit bericht niet meer gewijzigd.
Een methode __repr__ die een stringvoorstelling van het object teruggeeft. Deze stringvoorstelling bestaat uit de reeks strings die gecentreerd worden uitgeschreven over de breedte van de langste string uit het bericht, met telkens nog een extra spatie links en rechts. Gebruik de stringmethode center om de strings te centreren. Rond de gecentreerde regels van het bericht moet een rechthoekig kader getekend worden. Leidt de opmaak van dit kader af uit onderstaande voorbeelden.
Een methode veranderOgen waarmee de ogen van de "koe" kunnen ingesteld worden. Aan deze methode moet één enkel argument doorgegeven worden. Indien het opgegeven argument geen string is die bestaat uit twee karakters, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige ogen. Bij het genereren van een ASCII-afbeelding moet het eerste karakter gebruikt worden ter vervanging van het eerste paar accolades in het .cow bestand met de voorgevormde tekening, en het tweede karakter ter vervanging van het tweede paar accolades. Indien er een ASCII-afbeelding gegenereerd wordt van het object voordat deze methode voor de eerste keer wordt aangeroepen, dan moet standaard twee keer de kleine letter o als oog gebruikt worden.
Een methode veranderTekening waarmee een voorgevormde tekening kan ingesteld worden die moet gebruikt worden om een ASCII-afbeelding van het object te genereren. Aan deze methode moet de locatie van een .cow bestand doorgegeven worden. Indien er een ASCII-afbeelding gegenereerd wordt van het object voordat deze methode voor de eerste keer wordt aangeroepen, dan moet standaard gebruikgemaakt worden van de voorgevormde tekening in het bestand cow.cow2. De broncode mag ervan uitgaan dat dit bestand zich in de huidige directory bevindt.
Een methode __str__ die een stringvoorstelling van het object teruggeeft die de gegenereerde ASCII-afbeelding voorstelt. Deze stringvoorstelling bestaat uit een aantal opeenvolgende regels. De eerste regels daarvan komen overeen met de stringvoorstelling zoals die gegenereerd wordt door de methode __repr__, gevolgd door regels van de laatst ingestelde tekening (of de tekening uit cow.cow3 indien er nog niet expliciet een tekening werd ingesteld voor het object). In de regels van de tekening moeten de ogen vervangen worden door de laatste ingestelde ogen (of tweemaal door de kleine letter o indien er nog geen expliciete ogen werden ingesteld voor het object).
Bij onderstaande interactieve sessie gaan we ervan uit dat de bestanden cow.cow4 en tux.cow5 zich in de huidige directory bevinden. Merk op dat een docstring een gewone string is, waardoor elke letterlijke backslash die voorkomt in de docstring moet verdubbeld worden. Klik hier om onderstaande interactieve sessie om te vormen tot een docstring.
>>> spreuk = Cowsay(['Moo may represent an idea,', 'but only the cow knows.'])
>>> spreuk
+----------------------------+
| Moo may represent an idea, |
| but only the cow knows. |
+----------------------------+
>>> print(spreuk)
+----------------------------+
| Moo may represent an idea, |
| but only the cow knows. |
+----------------------------+
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
>>> spreuk.veranderOgen(33)
Traceback (most recent call last):
AssertionError: ongeldige ogen
>>> spreuk.veranderOgen('***')
Traceback (most recent call last):
AssertionError: ongeldige ogen
>>> spreuk.veranderOgen('^^')
>>> print(spreuk)
+----------------------------+
| Moo may represent an idea, |
| but only the cow knows. |
+----------------------------+
\ ^__^
\ (^^)\_______
(__)\ )\/\
||----w |
|| ||
>>> spreuk.veranderTekening('tux.cow')
>>> print(spreuk)
+----------------------------+
| Moo may represent an idea, |
| but only the cow knows. |
+----------------------------+
\
\
.--.
|^_^ |
|:_/ |
// \ \
(| | )
/'\_ _/`\
\___)=(___/
>>> print(spreuk)
Traceback (most recent call last):
AssertionError: ongeldige ogen