In tegenstelling tot het decimaal talstelsel gebruikt het hexadecimaal talstelsel geen tien maar zestien cijfers. De cijfers 0 tot en met 9 worden verder uitgebreid met de letters a (waarde tien) tot en met f (waarde vijftien), die in deze context dus ook cijfers voorstellen. Om verwarring tussen de termen cijfers en letters te verkomen, zullen we daarom in het vervolg van deze opgave gebruik maken van de terminologie zoals die hieronder expliciet in Backus-Naur vorm gedefinieerd wordt.

<hexletter> a | b | c | d | e | f
<niethexletter> g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z
<kleine letter> <hexletter> | <niethexletter>
<hoofdletter> A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z
<woord> (<hoofdletter> | <kleine letter>)+
<arabisch cijfer> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<hexadecimaal cijfer> <arabisch cijfer> | <hexletter>
<hexadecimaal getal> <hexadecimaal cijfer>+

Opgave

Elke regel van het tekstbestand hexdump.txt1 start met een lijst van zestien hexadecimale getallen die elk bestaan uit twee hexadecimale cijfers. Deze hexadecimale getallen worden telkens van elkaar gescheiden door één enkele spatie. Daarna eindigt elke regel met nog een spatie, gevolgd door een woord dat tussen verticale strepen staat (|). Merk op dat uit voorgaande definitie volgt dat alle woorden enkel bestaan uit hoofdletters en kleine letters. Gevraagd wordt:

  1. Bepaal reguliere expressies voor elk van onderstaande verzamelingen, waarbij $$\mathcal{H}$$ de verzameling van alle regels tekst voorstelt die voldoen aan het voorschrift van de regels uit het tekstbestand hexdump.txt2. Probeer de reguliere expressies bovendien zo kort mogelijk te houden.

    • $$\alpha = \{ h \in \mathcal{H}\,|\,$$ alle hexadecimale getallen bestaan uit één arabisch cijfer en één hexletter $$\}$$

      voorbeelden: 0b 5a 3f 5a 7d d0 5d e6 2b c4 7e 7d c2 c0 e6 9a |duivenkot| $$\in \alpha$$
        84 bd aa 74 f3 85 da 9d ac b6 e0 b6 62 0f b5 d5 |Zuidwestkaap| $$\not\in \alpha$$
    • $$\beta = \{ h \in \mathcal{H}\,|\,$$ tweede hexadecimaal cijfer van hexadecimaal getal is telkens gelijk aan eerste hexadecimaal cijfer van volgende hexadecimaal getal $$\}$$

      voorbeelden: 72 2c c0 00 06 66 6b bf fb bf fb ba ae e2 2d d8 |afgevreten| $$\in \beta$$
        55 6f ae f7 80 ef 0c 010 a2 f8 b7 7d 3f 61 f8 2e |leemlagen| $$\not\in \beta$$
    • $$\gamma = \{ h \in \mathcal{H}\,|\,$$ elk hexadecimaal cijfer komt twee keer voor in lijst van hexadecimale getallen $$\}$$

      voorbeelden: 33 e0 f1 76 9c 4f a8 6c 01 5d 45 9e 28 db 7b 2a |etalageraam| $$\in \gamma$$
        c0 b0 f5 60 02 8b 1c a4 41 7c 53 f2 85 20 a0 d1 |topklasse| $$\not\in \gamma$$
    • $$\delta = \{ h \in \mathcal{H}\,|\,$$ woord bevat geen enkele hexletter uit de lijst van hexadecimale getallen $$\}$$

      opmerking: ook hoofdletters die in het woord voorkomen mogen in hun kleine-lettervariant niet voorkomen als hexletter in de lijst van hexadecimale getallen'

      voorbeelden: 64 52 68 23 18 08 78 43 44 11 70 72 6c 76 1c 3b |drijfriemen| $$\in \delta$$
        70 06 61 17 7b b6 67 7d de e3 3d dc c4 45 57 77 |kromneus| $$\not\in \delta$$

    Gebruik een commando uit de grep familie om enkel die regels van het bestand hexdump.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 programmacode uit de verzameling $$\alpha \cap \beta$$

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

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

    • het vierde woord staat op de unieke regel met programmacode 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).