De Jupiter-C1 was een Amerikaanse onderzoeksraket die ontwikkeld werd als opvolger van de Jupiter-A2. Ze werd in 1956 en 1957 gebruikt voor drie suborbitale ruimtevluchten3 om te testen of de neuskegel die later gemonteerd zou worden op de meer geavanceerde en mobiele PGM-19 Jupiter4 raket het zou houden bij terugkeer in de atmosfeer. Als lid van de familie van Redstone-raketten5 werd ook de Jupiter-C ontworpen door de Army Ballistic Missile Agency6 (ABMA), onder leiding van Wernher von Braun7.
De Jupiter-C maakte deel uit van het IRBM8-project en het aantal gefabriceerde raketten werd beschouwd als een streng bewaard militair geheim. Daarom werden de serienummers niet zomaar op de zijkant van de raketten geschilderd, maar werden ze gecodeerd met een eenvoudige transformatiecodering die het personeel makkelijk kon onthouden. Het codewoord voor de transformatie werd ontleend aan de locatie van de militaire basis waar de raket werd ontworpen en getest: Huntsville, Alabama9.
Door in het woord Huntsville de dubbele letters te schrappen en achteraan een X toe te voegen, verkreeg men een codewoord van tien letters: HUNTSVILEX. Daarin stond de letter H voor het cijfer 1, de letter U voor het cijfer 2, …, de letter E voor het cijfer 9 en de letter X voor het cijfer 0. Op die manier had men bijvoorbeeld het gecodeerde serienummer UE geverfd op de zijkant van de aangepaste versie van de Jupiter-C die gebruikt werd om de Explorer 110 te lanceren, wat aangaf dat die raket serienummer 29 had (U → 2, E → 9). De volgende versie van de Jupiter-C raket werd dan beschilderd met NX, de gecodeerde versie van het serienummer 30 (N → 3, X → 0).
Een serienummer is een natuurlijk getal (int) en een codewoord is een string (str) die enkel bestaat uit letters (zowel hoofdletters als kleine letters zijn toegelaten).
Beschouw nu een transformatiecodering voor serienummers die werkt met een gegeven codewoord. In eerste instantie wordt het codewoord gereduceerd door enkel het eerste voorkomen van elke letter over te houden, waarbij geen onderscheid gemaakt wordt tussen hoofdletters en kleine letters. Op die manier wordt het codewoord TRICHINOPHOBIA bijvoorbeeld gereduceerd tot TRICHNOPBA. Dit gereduceerde codewoord moet uit tien letters bestaan, waarvan de eerste letter staat voor het cijfer 1, de tweede voor het cijfer 2, …, de voorlaatste voor het cijfer 9 en de laatste voor het cijfer 0. Gevraagd wordt:
Schrijf een functie reduceer waaraan een codewoord (str) moet doorgegeven worden. De functie moet in hoofdletters het gereduceerde codewoord (str) teruggeven.
Schrijf een functie codeer waaraan een serienummer (int) en een codewoord (str) moeten doorgegeven worden. De functie moet in hoofdletters de gecodeerde versie (str) van het gegeven serienummer teruggeven die bekomen wordt door toepassing van de transformatiecodering voor serienummers met het gegeven codewoord.
Schrijf een functie decodeer waaraan twee argumenten moeten doorgegeven worden: i) de gecodeerde versie van een serienummer (str) die bekomen werd door toepassing van de transformatiecodering voor serienummers met een codewoord en ii) het codewoord dat voor de transformatie gebruikt werd. De functie moet het originele serienummer (int) teruggeven.
Schrijf een functie volgende waaraan twee argumenten moeten doorgegeven worden: i) de gecodeerde versie van een serienummer (str) die bekomen werd door toepassing van de transformatiecodering voor serienummers met een codewoord en ii) het codewoord dat voor de transformatie gebruikt werd. De functie moet in hoofdletters de gecodeerde versie van het volgende serienummer teruggeven, waarbij het gegeven codewoord ook voor het volgende serienummer gebruikt wordt. Als bijvoorbeeld de gecodeerde versie van het serienummer $$29$$ wordt doorgegeven dan moet de functie de gecodeerde versie van het volgende serienummer $$29 + 1 = 30$$ teruggeven. Als de gecodeerde versie van het serienummer $$99$$ wordt doorgegeven dan moet de functie de gecodeerde versie van het volgende serienummer $$99 + 1 = 100$$ teruggeven.
Deze functies mogen geen onderscheid maken tussen hoofdletters en kleine letters in de codewoorden en de gecodeerde serienummers die eraan doorgegeven worden.
Als aan de functies codeer, decodeer of volgende een codewoord wordt doorgegeven waarvan de gereduceerde versie niet uit 10 letters bestaat, dan moet een AssertionError opgeworpen worden met de boodschap ongeldig codewoord.
>>> reduceer('HUNTSVILLEX')
'HUNTSVILEX'
>>> reduceer('TRICHINOPHOBIA')
'TRICHNOPBA'
>>> codeer(29, 'HUNTSVILLEX')
'UE'
>>> codeer(63, 'TRICHINOPHOBIA')
'NI'
>>> decodeer('UE', 'HUNTSVILLEX')
29
>>> decodeer('NI', 'TRICHINOPHOBIA')
63
>>> volgende('UE', 'HUNTSVILLEX')
'NX'
>>> volgende('NI', 'TRICHINOPHOBIA')
'NC'