Het alfabet bestaat uit 26 karakters, terwijl het toetsenbord van een mobiele telefoon of een GPS doorgaans veel minder toetsen bevat. Om op dergelijke toestellen toch makkelijk woorden te kunnen intoetsen, werd oorspronkelijk gebruik gemaakt van de zogenaamde MultiTap techniek. Het principe is eenvoudig: op elke toets worden drie of meer letters afgebeeld (2=ABC, 3=DEF, 4=GHI, 5=JKL, 6=MNO, 7=PQRS, 8=TUV, 9=WXYZ). Om de gewenste letter te krijgen, moet je de toets waarop de letter wordt afgebeeld één of meer keer indrukken, afhankelijk van de positie van de letter op de toets.

Multitap keyboard

Stel dat je bijvoorbeeld de letter A wilt typen. Dan moet je één keer op toets 2 drukken. Wil je echter een B typen, dan moet je twee keer kort na elkaar op toets 2 drukken. Om na elkaar twee letters te typen die op dezelfde toets worden afgebeeld, moet de gebruiker een korte pauze inlassen alvorens dezelfde toets opnieuw in te drukken. We zullen een spatie (␣) gebruiken om een dergelijke pauze voor te stellen. Op die manier staat 2␣2 voor AA, terwijl 22 staat voor B.

Opgave

Elke regel van het tekstbestand multitap.txt1 bevat de multitapcodering van een woord dat enkel bestaat uit letters van het alfabet, gevolgd door een spatie en het woord zelf. Aangezien de multitapcodering zelf ook spaties kan bevatten, kan het dus gebeuren dat er meerdere spaties voorkomen op één enkele regel. Gevraagd wordt:

  1. Bepaal reguliere expressies voor elk van onderstaande verzamelingen. Daarbij staat $$\mathcal{M}$$ voor de verzameling van alle multitapcoderingen van woorden die enkel bestaat uit letters van het alfabet. Als $$m$$ de multitapcodering van een woord voorstelt, dan stelt $$m'$$ de multitapcodering voor waaruit de spaties verwijderd zijn. Probeer de reguliere expressies bovendien zo kort mogelijk te houden

    • $$\alpha = \{ m \in \mathcal{M}\,|\,$$ oneven cijfers komen steeds in paren voor in $$m'$$ $$\}$$

      voorbeelden: 66622244899663 33 3444844455 $$\in \alpha$$
        44666 6664 44278444 433777 $$\not\in \alpha$$
    • $$\beta = \{ m \in \mathcal{M}\,|\,$$ opeenvolgende cijfers van $$m'$$ zijn ofwel gelijk, ofwel is het ene even en het andere oneven$$\}$$

      voorbeelden: 47776663344433663 33 $$\in \beta$$
        77774443377792 27773 33 $$\not\in \beta$$
    • $$\gamma = \{ m \in \mathcal{M}\,|\,$$ $$m'$$ bevat een geïsoleerd cijfer 3 $$\}$$

      uitleg: een cijfer is geïsoleerd als de cijfers die eventueel voor of na het cijfer staan verschillen van dat cijfer

      voorbeelden: 37772 2224483366, 8777335537776667, 87776668777744334443 $$\in \gamma$$
        33388664337773366 $$\not\in \gamma$$
    • $$\delta = \{ m \in \mathcal{M}\,|\,$$ $$m'$$ bevat maximaal twee paren opeenvolgende gelijke cijfers $$\}$$

      opmerking: bij de definitie van δ moeten overlappende paren in rekening gebracht worden: de reeks 222 telt dus twee paren opeenvolgende gelijke cijfers, en de reeks 7777 telt drie paren opeenvolgende gelijke cijfers.

      voorbeelden: 62 287255 $$\in \delta$$
        552 22 25558, 43396663, 2999924 $$\not\in \delta$$

    Gebruik een commando uit de grep familie om enkel die regels van het bestand multitap.txt2 te selecteren, waarvan de multitapcodering behoort 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 multitapcodering uit de verzameling $$\alpha \cap \beta$$

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

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

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