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.

Opgave

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:

Voorbeeld

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