Wat is 3/5 leeuw, 1/2 stekelmuis en 1/5 nerts?
Oplossing: leeuw + stekelmuis + nerts = leesteken
We nemen met andere woorden drie van de vijf ($$\frac{3}{5}$$) letters van het woord leeuw, de helft ($$\frac{5}{10} = \frac{1}{2}$$) van de letters van het woord stekelmuis, en één van de vijf ($$\frac{1}{5}$$) letters van het woord nerts. Daarbij nemen we telkens letters aan de voorkant van het woord.
Een woord $$w$$ is een string die bestaat uit nul of meer letters (hoofdletters en kleine letters). We noteren de lengte van het woord $$w$$ als $$||w||$$. Een woord $$p$$ is een prefix van een woord $$w$$ als er een woord $$s$$ bestaat zodat $$w = ps$$, of met andere woorden als het woord $$w$$ begint met het woord $$p$$. Een woord $$s$$ is een suffix van een woord $$w$$ als er een woord $$p$$ bestaat zodat $$w = ps$$, of met andere woorden als het woord $$w$$ eindigt met het woord $$s$$.
Een breuk is de onuitgewerkte deling van een getal $$t \in \mathbb{N}$$ (de teller) door een ander getal $$n \in \mathbb{N}_0$$ (de noemer). De gebruikelijke voorstelling van een breuk is $$\frac{t}{n}$$ waarbij de teller boven een streep geplaatst wordt, en de noemer onder de streep (bijvoorbeeld $$\frac{1}{2}$$ of $$\frac{17}{3}$$). Elke breuk heeft een eenvoudigste vorm waarin de teller en de noemer zo klein mogelijk zijn. Zo is de eenvoudigste vorm van $$\frac{13}{39}$$ gelijk aan $$\frac{1}{3}$$. Die breuk is niet weer te geven met kleinere getallen dan 1 en 3. Het "zo klein mogelijk maken" noemt men vereenvoudigen. Dit kan door de teller en de noemer te delen door hun grootste gemene deler1: het grootste getal dat zowel een deler is van de teller als van de noemer. Daardoor hebben de teller en noemer na vereenvoudiging een grootste gemene deler die gelijk is aan 1.
De stringvoorstelling van een breuk met teller $$t$$ en noemer $$n$$ is t/n. Bij de stringvoorstelling van een negatieve breuk staat het minteken voor de teller (bijvoorbeeld -3/4).
We formuleren een vraag in een tekstbestand waarvan elke regel bestaat uit een woordbreuk: de stringvoorstelling van een breuk in zijn meest eenvoudige vorm, gevolgd door een spatie en een woord. Zo correspondeert de vraag uit de inleiding met het volgende bestand:
3/5 leeuw 1/2 stekelmuis 1/5 nerts
Elke woordbreuk van een woord $$w$$ en een breuk $$b$$ levert een deel van woord $$w$$ op. Als $$b \geq 0$$ dan nemen we de prefix $$p$$ van $$w$$ waarvoor geldt dat $$\frac{||p||}{||w||} = b$$. Anders nemen we de suffix $$s$$ van $$w$$ waarvoor geldt dat $$\frac{||s||}{||w||} = |b|$$. Hierbij staat $$|b|$$ voor de absolute waarde van de breuk $$b$$. Je mag ervan uitgaan dat het voor de gegeven woordbreuken altijd mogelijk is om een dergelijke prefix of suffix te vinden. Het antwoord op de vraag vind je dan door de resultaten van alle woordbreuken samen te voegen tot één enkel woord.
Schrijf een bash shell script platypus waaraan een tekstbestand met een vraag moet doorgegeven worden. Daarvoor zijn er twee opties:
ofwel wordt de padnaam van het bestand als argument aan het script doorgegeven
ofwel wordt het bestand gekoppeld aan de stdin van het script
Het script moet het antwoord op de vraag uitschrijven naar stdout. Daarbij moet het script de volgende foutafhandeling voorzien:
als er meer dan één argument wordt doorgegeven, dan moet het script een gepaste boodschap uitschrijven naar stderr en eindigen met exit status 1
als het enige argument dat wordt doorgegeven geen padnaam is van een gewoon leesbaar bestand, dan moet het script een gepaste boodschap uitschrijven naar stderr en eindigen met exit status 2
Zie onderstaande voorbeeldsessie voor wat we telkens bedoelen met een gepaste boodschap die moet uitgeschreven worden naar stderr.
In onderstaande voorbeeldsessie gaan we ervan uit dat de tekstbestanden question.01.txt2, question.02.txt3 en question.03.txt4 voorkomen in de huidige directory, en dat er geen bestand unknown.txt voorkomt in de huidige directory.
$ platypus question.01.txt5 question.02.txt6
Syntax: platypus [file]
$ echo $?
1
$ platypus unknown.txt
platypus: could not read file "unknown.txt"
$ echo $?
2
$ platypus question.01.txt7
wallpaper
$ echo $?
$ platypus < question.02.txt8
CARTRIDGE
$ cat question.03.txt9 | platypus
Manchester
Qua uitzicht lijkt het vogelbekdier alsof Moeder Natuur Frankenstein gespeeld heeft met stukjes vogel, reptiel en zoogdier. Maar ook uit zijn genoom — dat sinds januari 2021 volledig in kaart gebracht werd — blijkt dat het vogelbekdier een vreemde mix heeft van genen uit verschillende klassen van gewervelden.