In 1885 publiceerde James B. Ward The Beale Papers, een korte tekst met drie gecodeerde boodschappen. Wie de codes kon kraken, zou de weg vinden naar een schat, begraven in Bedford County in Virginia. Volgens de tekst liet Beale zestig jaar eerder een doosje met de boodschappen achter bij een herbergier. Beale zelf verdween spoorloos. De herbergier gaf de gecodeerde boodschappen door aan een vriend. Die kon maar één van de puzzels oplossen, de puzzel die de belofte van de schat openbaarde. De gekraakte code bestond uit getallen die correspondeerden met de beginletters van woorden in de Amerikaanse Onafhankelijkheidsverklaring. De code vormde een reeks getallen. Zo refereerde 12 bijvoorbeeld naar de eerste letter van het twaalfde woord van de tekst van de Founding Fathers van de Verenigde Staten. In 1980 gebruikte de bekende Amerikaanse codekraker Jim Gillogly een computer om een van de resterende codes te ontcijferen. Hij vond een aantal anomalieën, zoals lange reeksen karakters in alfabetische volgorde, en besloot daaruit dat de code een hoax moest zijn. Er volgenden nog vele pogingen om de schat te vinden — zelfs Hollywood liet zich, met de film National Treasure, door het verhaal inspireren — maar Gillogly zag de voorbije dertig jaar niets dat hem overtuigde om zijn mening te herzien. ”Ik heb er vertrouwen in dat het om een grap gaat”, vertelt hij.

The Beale papers

Opgave

Elke regel van het tekstbestand beale.txt1 bevat een reeks van één of meer natuurlijke getallen, die telkens van elkaar gescheiden worden door een komma en een spatie. Het aantal getallen kan variëren van regel tot regel. Daarna volgt nog een komma, een spatie, en een woord dat enkel bestaat uit letters (hoofdletters en/of kleine letters). Gevraagd wordt:

  1. Bepaal reguliere expressies voor elk van onderstaande verzamelingen. Daarbij staat $$\mathcal{B}$$ voor de verzameling van alle mogelijke regels die opgebouwd zijn als de regels van het bestand beale.txt2.

    • $$\alpha = \{ b \in \mathcal{B}\,|\,$$ geen enkel getal bevat cijfers die kleiner zijn dan vorige cijfers van dat getal $$\}$$

      voorbeelden: 1249, 1999, 335, 59, 2255, 1112, noumenism $$\in \alpha$$
        775, 1342, 512, 2179, 824, 830, misgauge $$\not\in \alpha$$
    • $$\beta = \{ b \in \mathcal{B}\,|\,$$ eerste cijfer van getal is nooit gelijk aan laatste cijfer van vorige getal $$\}$$

      voorbeelden: 2055, 2475, 987, 1087, 1608, 796, Socratism $$\in \beta$$
        1833, 622, 2374, 754, 480, 2114, 1146, 1225, Heintz $$\not\in \beta$$
    • $$\gamma = \{ b \in \mathcal{B}\,|\,$$ alle getallen bevatten het cijfer 8 $$\}$$

      voorbeelden: 1088, 869, 1683, 589, 1468, 681, razee $$\in \gamma$$
        1638, 2209, 1128, 807, 1860, 1264, 1325, 2166, toastier $$\not\in \gamma$$
    • $$\delta = \{ b \in \mathcal{B}\,|\,$$ als het eerste cijfer van een getal even is, dan moet het laatste oneven zijn, en omgekeerd $$\}$$

      voorbeelden: 665, 1598, 1242, 1708, 38, 382, 2281, partake $$\in \delta$$
        797, 821, 1284, 1781, 1737, 617, exclaves $$\not\in \delta$$

    Gebruik een commando uit de grep familie om enkel die regels van het bestand beale.txt3 te selecteren die behoren tot de opgegeven verzameling.

  2. Beschouw de verzamelingen $$\alpha$$, $$\beta$$, $$\gamma$$ en $$\delta$$ zoals hierboven gedefinieerd. Gebruik nu deze verzamelingen om op de volgende manier een boodschap bestaande uit vier woorden te achterhalen:

    • het eerste woord staat op de unieke regel met het patroon uit de verzameling $$\alpha \cap \beta$$

    • het tweede woord staat op de unieke regel met het patroon uit de verzameling $$\beta \cap \gamma$$

    • het derde woord staat op de unieke regel met het patroon uit de verzameling $$\gamma \cap \delta$$

    • het vierde woord staat op de unieke regel met het patroon uit de verzameling $$\delta \cap \alpha$$

    Geef telkens een Unix commando dat elk van deze woorden opzoekt in het bestand en uitschrijft naar standaard uitvoer (zonder het patroon dat aan het woord voorafgaat). Hierbij is het dus niet toegelaten om het woord letterlijk uit te schrijven (bv. echo xxx).