Drop hier links of afbeeldingen om ze aan de editor toe te voegen.

Wat zit er onder de gele balkjes verborgen?

schuilplaats

Deze afbeelding bevat de kenmerkende gele tekst in het Franklin Gothic lettertype op een zwarte achtergrond met sterren uit de openingsscènes van de Star Wars films. Bovendien herkennen we aan de linkerkant de namen van enkele personages die aan het brein van George Lucas ontsproten zijn.

Deze tips verwijzen naar een getallenrij die vernoemd werd naar de Franse wiskundige Édouard Lucas (1842–1891). De eerste twee getallen in de rij van Lucas zijn $$L_0 = 2$$ en $$L_1 = 1$$. Elk volgende getal is de som van de twee vorige getallen. Dit levert de volgende rij op:

2, 1, 3, 4, 7, 11, 18, 29, 47, 76, …

Aan de rechterkant van de afbeelding staat de schuilplaats waar de personages van George Lucas zich verborgen houden in de rij van Lucas. Hiervoor zetten we de naam van een personage eerst om naar een cijferreeks door elke letter in de naam te vervangen door zijn positie in het alfabet (A=1, B=2, C=3, …, Z=26), elk cijfer in de naam te behouden en elk ander karakter weg te laten. Zo wordt C-3P0 omgezet naar 33160 (de aaneenschakeling van 3, 3, 16 en 0), LEIA naar 12591, YODA naar 251541, OBI-WAN naar 152923114 en LUKE naar 1221115.

Laat ons bijvoorbeeld de tweede regel uit de afbeelding nemen. Daarop staat de naam LEIA die correspondeert met de cijferreeks 12591. Lucasgetal $$L_{933}$$ (aangeduid door #933 in de schuilplaats) is blijkbaar het eerste getal in de rij van Lucas waarin de cijferreeks 12591 voorkomt. Dit Lucasgetal bestaat uit 195 cijfers (het laatste getal uit de schuilplaats) en daarin lezen we de cijferreeks 12591 voor het eerst vanaf positie 147 tot en met positie 151. Hierbij worden de posities van de cijfers in een getal van links naar rechts genummerd vanaf 1. Voor de volledigheid zijn dit alle 195 cijfers van Lucasgetal $$L_{933}$$, waarin we de relevante cijfers aangeduid hebben:

967093252596168128267955063716512751689792563513532460758118
114022409095515128982546665404137717788421676297839636268638
282452765724593338741821541259157620134576677978005827300767
530434048847196

De schuilplaats #933, 147-151 of 195 kan met andere woorden samengevat worden als: het getal voorafgegaan door het hekje (#, in dit geval #933) geeft een bepaald Lucasgetal aan (in dit geval $$L_{933}$$) en de rest van de schuilplaats (in dit geval 147-151 of 195) beschrijft welke cijfers uit het Lucasgetal moeten gehaald worden om de cijferreeks te verkrijgen die correspondeert met de naam (in dit geval 12591=LEIA).

De schuilplaats aan de rechterkant van het eerste blokje levert dus de cijferreeks 2214518 op. Hoewel er meerdere namen zijn die met deze cijferreeks kunnen corresponderen, is er daarvan maar één ook een personage van George Lucas — namelijk VADER (22-1-4-5-18).

Om de laatste regel te ontcijferen is er wat meer puzzelwerk nodig. Maar we verklappen alvast dat daar de naam INDIANA verborgen zit, waarvan de corresponderende cijferreeks 914491141 terug te vinden is in Lucasgetal $$L_{123404}$$. Dit Lucasgetal bestaat uit 25790 cijfers en daarin vinden we de gezochte cijferreeks voor het eerst terug vanaf positie 8267 tot en met positie 8275. Zo bekomen we de schuilplaats #123404, 8267-8275 of 25790.

Opgave

Schrijf een bash shell script whereabouts waaraan twee argumenten moeten doorgegeven worden: i) een naam en ii) de padnaam van een tekstbestand dat een rij van natuurlijke getallen bevat (één getal per regel).

Het script moet drie regels uitschrijven naar standaard uitvoer (stdout) die telkens bestaan uit een informatieveld, een dubbelpunt (:), een spatie, en de waarde van het informatieveld:

  1. name: de naam die als eerste argument werd doorgegeven aan het script

  2. code: de cijferreeks die correspondeert met die naam

  3. base: de schuilplaats waar iemand met die naam zich verborgen houdt in de getallenrij uit het gegeven tekstbestand; hierbij worden de regels van het tekstbestand (en dus ook de getallen uit het bestand) genummerd vanaf nul

Het script mag ervan uitgaan dat er enkel geldige argumenten aan doorgegeven worden, zonder dat dit expliciet moet gecontroleerd worden. Dit impliceert dat het tekstbestand dat als tweede argument wordt doorgegeven bestaat en leesbaar is, een rij van getallen bevat (één getal per regel), en dat de cijferreeks die correspondeert met het eerste argument in minstens één van die getallen voorkomt.

Voorbeeld

Onderstaande voorbeeldsessie toont hoe het bash shell script whereabouts moet kunnen gebruikt worden. Daarbij gaan we ervan uit dat de huidige directory het tekstbestand lucas.txt bevat.

$ whereabouts C-3P0 lucas.txt
name: C-3P0
code: 33160
base: #426, 39-43 of 90
$ whereabouts Leia lucas.txt
name: Leia
code: 12591
base: #933, 147-151 of 195
$ whereabouts Obi-Wan lucas.txt
name: Obi-Wan
code: 152923114
base: #10454, 2062-2070 of 2185

Epiloog

Carrie Fisher