Welk woord plaatsen we in het midden van de rechter driehoek?
Het gezochte woord is KERSTMIS.
In beide driehoeken zijn alle woorden op de hoekpunten even lang. Het gezochte woord in het midden van de driehoek is even lang als de woorden op de hoekpunten. Het wordt gevonden door te starten bij een hoekpunt (hier telkens het hoekpunt bovenaan met een bredere rand), de hoekpunten in een bepaalde richting af te lopen (hier telkens in wijzerzin) en van de opeenvolgende woorden telkens de letter op de volgende positie te nemen (de eerste letter van het eerste woord, de tweede letter van het tweede woord, enzoverder). We hebben de letters die het gezochte woord vormen in het rood aangeduid.
We moeten ons echter niet beperken tot driehoeken: veelhoeken met meer dan drie hoekpunten zijn ook mogelijk. Bovendien moeten we ook niet noodzakelijk bij het bovenste hoekpunt beginnen. Als we bijvoorbeeld in het vierkant hieronder beginnen bij het onderste hoekpunt en de woorden op de hoekpunten in wijzerzin aflopen, dan bekomen we het woord SNEEUWMAN. Het kan ook zijn dat we de hoekpunten in tegenwijzerzin moeten aflopen. Als we bijvoorbeeld in onderstaande vijfhoek beginnen bij het hoekpunt rechtsonder en de woorden op de hoekpunten in tegenwijzerzin aflopen, dan spellen we het woord ENGELENHAAR.
Schrijf een bash shell script omdehoek waarmee de oplossing kan gezocht worden van het soort puzzels dat in de inleiding werd beschreven. De argumenten van het shell script zijn de woorden die op de hoekpunten van de veelhoek geplaatst worden (opgelijst in wijzerzin). Bijgevolg moet gelden dat:
er minstens drie argumenten doorgegeven worden
alle argumenten enkel uit hoofdletters bestaan
alle argumenten even lang zijn ($$m$$ letters)
Een mogelijke oplossing van de puzzel is een woord van $$m$$ letters dat gevormd wordt door te starten bij een hoekpunt, de hoekpunten in een bepaalde richting af te lopen (wijzerzin of tegenwijzerzin) en van de opeenvolgende woorden telkens de letter op de volgende positie te nemen. Het shell script moet een alfabetisch gesorteerde lijst van alle mogelijke oplossingen van de puzzel uitschrijven naar stdout. Dit zijn de mogelijke oplossingen waarbij elk woord op een hoekpunt als startwoord kan optreden en waarbij de hoekpunten zowel in wijzerzin als in tegenwijzerzin kunnen doorlopen worden. Bij het uitschrijven moeten de woorden telkens van elkaar gescheiden worden door één enkele spatie.
Het shell script moet ook de volgende opties ondersteunen:
optie -f: schrijf enkel de mogelijke oplossingen uit die bekomen worden door de hoekpunten in wijzerzin te doorlopen, tenzij ook de optie -b wordt opgegeven
optie -b: schrijf enkel de mogelijke oplossingen uit die bekomen worden door de hoekpunten in tegenwijzerzin te doorlopen, tenzij ook de optie -f wordt opgegeven
optie -n <int>: schrijf enkel de mogelijke oplossingen uit die starten bij het $$n$$-de woord, waarbij de woorden (argumenten) van links naar rechts genummerd worden vanaf 0
Het shell script moet voor de verwerking van de opties de flexibiliteit aan de dag leggen die gebruikelijk is bij Unix commando's: volgorde van opties speelt geen rol, opties kunnen eventueel samengenomen worden, argument bij een optie moet niet noodzakelijk van de optieletter gescheiden worden door witruimte, …. Daarnaast moet het shell script de volgende foutafhandeling voorzien:
als het shell script niet de gepaste opties meekrijgt (enkel ondersteuning voor de opties -b, -f en -n, waarbij de optie -n verplicht een geheel getal als argument moet meekrijgen) dan moet het shell script een gepaste boodschap (zie onderstaande voorbeeldsessie) uitschrijven naar stderr en eindigen met exit status 1
als het shell script niet de gepaste argumenten meekrijgt (minstens drie woorden die enkel uit hoofdletters bestaan en die even lang zijn) dan moet het shell script een gepaste boodschap (zie onderstaande voorbeeldsessie) uitschrijven naar stderr en eindigen met exit status 2
$ omdehoek DRIEHOEK KEERMUUR NACHTBUS
DAEETUES DECEMBER KAIRTOUS KRCRHBUK NEIHMOUR NREHHUUK
$ echo $?
0
$ omdehoek -f DRIEHOEK KEERMUUR NACHTBUS
DECEMBER KAIRTOUS NREHHUUK
$ omdehoek -b DRIEHOEK KEERMUUR NACHTBUS
DAEETUES KRCRHBUK NEIHMOUR
$ omdehoek -fb DRIEHOEK KEERMUUR NACHTBUS
DAEETUES DECEMBER KAIRTOUS KRCRHBUK NEIHMOUR NREHHUUK
$ omdehoek -n0 DRIEHOEK KEERMUUR NACHTBUS
DAEETUES DECEMBER
$ omdehoek -n1 DRIEHOEK KEERMUUR NACHTBUS
KAIRTOUS KRCRHBUK
$ omdehoek -fn0 DRIEHOEK KEERMUUR NACHTBUS
DECEMBER
$ omdehoek -bn1 DRIEHOEK KEERMUUR NACHTBUS
KRCRHBUK
$ omdehoek KUISHEID RELATIES AFREMMEN
AEIETEES AULEHIED KERSTMIS KFLSMIIN RFIAMEEN RURAHMED
$ omdehoek OVERNEMER WATERSTAD SETPUNTEN INKTZWART
IETRZNTET IVTPZETET OATTNSTRR ONTENWTAR SAETUSMRN SNEEUWMAN WEKRRNAED WVKPREAED
$ omdehoek -f BEGINSCHERM ONTSPANNEND ERONDERDOOR FAMILIEGRAF DAMESROMANS
BNOISSNDRNM DETNLRCNOAS EAMIPEEMENR FAGSDIOHEOF ORMENARGARD
$ omdehoek -b BEGINSCHERM ONTSPANNEND ERONDERDOOR FAMILIEGRAF DAMESROMANS
BAMNPSOGONM DAOSNREDERS ENGELENHAAR FRTISIRNENF OEMIDACMROD
$ omdehoek -abc DRIEHOEK KEERMUUR NACHTBUS # niet-ondersteunde opties
Syntaxis: omdehoek [-b] [-f] [-n <int>] woord woord woord ...
$ echo $?
1
$ omdehoek -n DRIEHOEK KEERMUUR NACHTBUS # optie -n zonder verplicht argument
Syntaxis: omdehoek [-b] [-f] [-n <int>] woord woord woord ...
$ echo $?
1
$ omdehoek -n xyz DRIEHOEK KEERMUUR NACHTBUS # optie -n met argument dat geen integer is
Syntaxis: omdehoek [-b] [-f] [-n <int>] woord woord woord ...
$ echo $?
1
$ omdehoek DRIEHOEK KEERMUUR # te weinig argumenten
omdehoek: ongeldige woordenlijst
$ echo $?
2
$ omdehoek driehoek keermuur nachtbus # argumenten mogen enkel hoofdletters bevatten
omdehoek: ongeldige woordenlijst
$ echo $?
2
$ omdehoek DRIEHOEK KEERMUUR XYZ # alle argumenten moeten even lang zijn
omdehoek: ongeldige woordenlijst
$ echo $?
2