Hide

Problem B
Skriva reguljära uttryck

Reguljära uttryck och deras varianter är mycket praktiska vid vardaglig programmering. I denna laboration ska du konstruera reguljära uttryck för lite olika strängsökningsproblem. För att kommunicera dina reguljära uttryck till Kattis ska du använda programspråket Python. Du kommer inte behöva skriva någon avancerad Python-kod, så du behöver inte ha använt Python tidigare. Dina funktioner måste ligga i en fil som heter regex.py annars kommer du få Run Time Error (“ImportError”) i Kattis.

I ditt git-repo för labben hittar du ett kodskelett, i vilket ett flertal funktioner definieras. I skelettet returnerar alla funktionerna en tom sträng, men de ska i din lösning returnera strängar som innehåller olika regex för att lösa de olika deluppgifterna nedan. T.ex. ska alltså den första funktionen, oktal(), returnera ett regex för att matcha oktala strängar. Kodskelettet innehåller även lite kod för att testa din lösning, se kommentarer i kodskelettet för hur du kan gå tillväga med detta.

De regex du konstruerar får vara högst $250$ tecken långa (detta är en generöst tilltagen gräns). Om du i någon av uppgifterna returnerar ett för långt regex kommer din inskickning att få ett Run Time Error i Kattis.

Matchningen som kommer att utföras med de regex du konstruerar är att den kommer söka efter någon del av strängen som matchar ditt uttryck. Det betyder att i uppgifter där kravet är att hela strängen ska uppfylla något villkor så måste du använda de speciella regex-symbolerna “^” och “$”. Du kan läsa mer om dessa, samt om vilken regex-funktionalitet som finns i Python i allmänhet, här.

Uppgifterna är ungefär sorterade efter kursledarens subjektiva åsikt om deras svårighetsgrad, och Kattis kommer att testa uppgifterna i samma ordning. När du är klar med första uppgiften kan du alltså skicka in din lösning och se om du klarar alla testfall som hör till första uppgiften, och så vidare.

Uppgifter

  1. Oktal sträng
    Skriv ett regex som matchar en sträng om och endast om den består av enbart oktala tal, dvs tal i talbasen 8.

  2. ISIN
    Vid publik fondhandel har alla värdeinstrument en ISIN-kod, som är en unik identifierare. Skriv ett regex som matchar en sträng om och endast om den uppfyller kraven för ett ISIN-nummer, som uppfyller följande regler (från ISIN-formatets definition):

    • Första två tecknen är bokstäver, versaler (motsvarar en landskod, men du behöver inte kolla att landskoden existerar)

    • Följande nio tecken är alfanumeriska (uppercase)

    • Det sista tecknet är en kontrollsiffra (du behöver inte implementera stöd för att verifiera kontrollsiffran).

  3. Glömt att skriva __str__-metod eller __repr__-metod för objekt
    När ett pythonprogram skriver ut en lista med objekt, och programmeraren glömt att ange hur objektens strängrepresentation ska se ut med __repr__, eller ett objekt skrivs ut men det saknas __str__-metod, kommer utskriften att meddela att det fanns något objekt av en viss klass på en viss minnesadress, t.ex.

        <__main__.Ball object at 0x106f81048>
        

    Om objektet definieras i ett importerat paket kan utskriften bli

          <importeratPaket.Klass object at 0x40ef72d55>
          

    Observera att tecknen < och > ingår!

    • __main__ är namnet på paketet med objektet (du kan anta att namnet börjar med en liten bokstav och att det i övrigt består av giltiga tecken),

    • Ball är namnet på klassen som saknar strängrepresentation (du kan anta att den är ett klassnamn som följer standarden för namngivning av klasser)

    • och 0x106f81048 är en hexadeximal minnesadress (0x följt av hexadecimala siffror) Antag i detta problem att siffrorna a-f skrivs gemena. Låtsas att det är mellan 8 och 16 hexadecimala siffror!

    Skriv ett regex som känner igen om en sträng innehåller sådana objektutskrifter!

  4. Komplexa tal i python
    Python har inbyggt stöd för komplexa tal som får en egen typ och som känns igen av imaginärdelen. Komplexa tal består av en realdel som skrivs som ett flyttal och en imaginärdel som skrivs som ett flyttal med j eller J direkt efter, t.ex. 2+5j, +3 - 0J eller -1-0.15J. Om imaginärdelen är 0 måste talet innehålla 0j eller 0J, annars tolkas plus och minus som operationer. Om imaginärdelen är 1j måste ettan skrivas ut av samma skäl. (Egentligen tillåts alla float-värden inklusive Infinity och NaN, och tal på exponentform, men dem behöver du inte matcha. I den här uppgiften tillåter vi inte heller .3j, utan kräver 0.3j för att uttrycka det talet. Du behöver inte heller kunna byta ordning på real- och imaginärdelen eller tillåta variabler som realdel, vilket Python skulle acceptera.) Godtyckligt många mellanslag tillåts mellan samtliga delar (och vi testar inte med annan whitespace). Skriv ett reguljärt uttryck som känner igen sådana här komplexa tal!

  5. Alfabetiskt sorterad?
    Du läser en sträng och ska avgöra om alla tecken på plats $x+i$ är större än tecknet på plats $x$, för varje $x$ och alla $i \geq 1$. Indata är strängar med små bokstäver. Skriv ett reguljärt uttryck som avgör om strängen uppfyller kravet!

  6. Sjörövarspråket
    Skriv ett reguljärt uttryck som matchar alla strängar på sjörövarspråket uttryckt i versaler. Sjörövarspråket (eller rövarspråket) är ett påhittat kodspråk av Astrid Lindgren där varje konsonant byts ut mot konsonanten, följt av ett ’O’, följt av konsonanten igen. T.ex. blir RÖVARSPRÅKET till RORÖVOVARORSOSPOPRORÅKOKETOT. Testtexterna innehåller inga andra tecken än versala svenska bokstäver och inga andra skiljetecken än

    .,!?

    eller några whitespace förutom space (mellanslag).

Please log in to submit a solution to this problem

Log in