Grâce à votre aide dans le défi Mark My Mail , PPCG-Post a réussi à tamponner tous ses colis avec les codes-barres générés!
Maintenant, il est temps de les décoder.
Dans ce défi, votre programme, étant donné un code-barres généré à partir du défi Mark My Mail , le décodera et renverra l'entier codé.
Mais attention! Le code-barres est peut-être à l'envers ...
Codes à barres à 4 états
Dans le cas où vous avez manqué le défi d'encodage, vous devrez savoir de quel type de code-barres nous parlons. Un code à barres à 4 états est une rangée de barres avec quatre états possibles, chacun représentant un entier de base 4:
| |
Bar: | | | |
| |
Digit: 0 1 2 3
Rendu en ASCII, les codes-barres prendront trois lignes de texte, en utilisant le caractère pipe ( |
) pour représenter une partie d'une barre, et un espace ( ) pour représenter une section vide. Il y aura un seul espace entre chaque barre. Un exemple de code-barres peut ressembler à ceci:
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Pour reconvertir un code à barres en l'entier qu'il code, mappez chaque barre à son chiffre de base 4 correspondant, concaténez-les et convertissez-le en décimal.
Étant donné que chaque code à barres représentera également un code à barres différent lorsqu'il est à l'envers, nous implémentons une séquence de démarrage / arrêt afin de pouvoir calculer l'orienation. Aux fins de ce défi, nous utiliserons la séquence de démarrage / d'arrêt spécifiée par Australia Post: chaque code-barres commence et se termine par une 1 0
séquence.
Le défi
Votre tâche consiste à, étant donné un code-barres ASCII à 4 états, l'analyser et renvoyer l'entier qu'il code - essentiellement l'inverse de Mark My Mail .
Mais pour pimenter les choses, il y a un hic - le code-barres peut être donné à l'envers. Comme dans le monde réel, il appartiendra au lecteur de code-barres (votre programme) de déterminer l'orientation correcte à l'aide de la séquence de démarrage / arrêt.
Exemple:
Étant donné le code-barres suivant:
| | | | | | | | | | | | | | | | | | | |
Nous pouvons clairement voir que les première et dernière paires de chiffres le sont 0, 2
et non 1, 0
. Cela signifie que le code-barres est à l'envers - nous devons donc le faire pivoter de 180 degrés (et pas seulement retourner chaque barre) pour obtenir l'orientation correcte:
| | | | | | | | | | | | | | | | | | | |
Maintenant, nous pouvons commencer le décodage. Nous mappons chaque barre à son chiffre de base 4 correspondant, en ignorant les séquences de démarrage / d'arrêt car elles ne codent pas les données.
| | | | | | | | | | | | | | | | | | | | - - 2 1 0 3 0 2 3 - -
Nous concaténons cela à l'entier en base 4 2103023
, puis le convertissons en sa représentation décimale 9419
pour le résultat final.
Règles
- L'entrée sera toujours un code-barres à 4 états valide, rendu en ASCII comme indiqué ci-dessus, avec la séquence de démarrage / arrêt décrite.
- Vous pouvez demander des espaces de fin, ou des lignes dépouillées, ainsi qu'une nouvelle ligne de fin - quel que soit le format qui convient à votre golf.
- Il peut ou non être dans la bonne orientation - votre programme doit déterminer s'il faut le lire à l'envers, en utilisant la séquence de démarrage / arrêt.
- Il ne codera pas les premiers chiffres de zéro dans l'entier de base 4.
- Vous pouvez prendre l'entrée comme une liste de lignes ou une chaîne avec des retours à la ligne.
- La sortie doit être un entier dans la base d'entiers standard de votre langue, représentant les données qui ont été encodées par le code-barres.
- Comme les timbres-poste sont petits et peuvent contenir très peu de code, votre code devra être aussi court que possible: c'est un code-golf - donc le programme le plus court (en octets) gagne!
Cas de test
| | | | | | | | | | | | | |
= 4096 (retourné)
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
= 7313145 (retourné)
| | | | | | | | | | | | | | | | | | | |
= 9419 (retourné)
| | | | | | | | | | | | | | | | | | |
= 990 (non retourné)
| | | | | | | | | | | | | | | | | | |
= 12345 (non retourné)
[String]
, [{#Char}]
, [{Char}]
, [[Char]]
?, Étant donné que String
équivaut à{#Char}