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.

Jupiter-C
Jupiter-C op het lanceerplatform in Cape Canaveral.

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.

transformatiecodering
Transformatiecodering die gebruikt werd voor de serienummers van de Jupiter-C raket.

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).

Opgave

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:

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.

Voorbeeld

>>> 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'

Bronnen