Dank Ihrer Hilfe bei der Mark My Mail Challenge hat PPCG-Post alle Pakete erfolgreich mit den generierten Barcodes versehen!
Jetzt ist es Zeit, sie zu entschlüsseln.
Bei dieser Abfrage decodiert Ihr Programm anhand eines Barcodes, der aus der Abfrage " Mark My Mail" generiert wurde, diesen und gibt die codierte Ganzzahl zurück.
Aber achten Sie auf! Der Barcode ist möglicherweise verkehrt herum angebracht ...
4-Staaten-Barcodes
Falls Sie die Codierungsaufforderung verpasst haben, müssen Sie wissen, um welche Art von Barcodes es sich handelt. Ein 4-Zustands-Barcode ist eine Reihe von Balken mit vier möglichen Zuständen, die jeweils eine Ganzzahl zur Basis 4 darstellen:
| |
Bar: | | | |
| |
Digit: 0 1 2 3
In ASCII gerendert, belegen die Barcodes drei Textzeilen, wobei das Pipe ( |
) -Zeichen einen Teil eines Strichs und ein Leerzeichen ( ) einen leeren Abschnitt darstellt. Zwischen den einzelnen Balken befindet sich jeweils ein Leerzeichen. Ein Beispiel-Barcode könnte folgendermaßen aussehen:
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Um einen Barcode wieder in die von ihm codierte Ganzzahl umzuwandeln, ordnen Sie jeden Barcode der entsprechenden 4-stelligen Basis zu, verknüpfen Sie diese und konvertieren Sie ihn in eine Dezimalzahl.
Da jeder Barcode verkehrt herum auch einen anderen Barcode darstellt, implementieren wir eine Start- / Stopp-Sequenz, damit die Ausrichtung berechnet werden kann. Für diese Herausforderung verwenden wir die von Australia Post festgelegte Start- / Stopp-Sequenz: Jeder Barcode beginnt und endet mit einer 1 0
Sequenz.
Die Herausforderung
Ihre Aufgabe ist es, einen ASCII-4-Status-Barcode zu analysieren und die codierte Ganzzahl zurückzugeben - im Wesentlichen die Umkehrung von Mark My Mail .
Aber um die Dinge aufzupeppen, gibt es einen Haken: Der Barcode kann verkehrt herum ausgegeben werden. Wie in der Realität wird es dem Barcode-Leser (Ihrem Programm) überlassen, die richtige Ausrichtung mithilfe der Start- / Stopp-Sequenz zu bestimmen .
Beispiel:
Mit folgendem Barcode:
| | | | | | | | | | | | | | | | | | | |
Wir können deutlich sehen, dass das erste und das letzte Ziffernpaar gleich sind 0, 2
und nicht 1, 0
. Dies bedeutet, dass der Barcode auf dem Kopf steht. Wir müssen ihn also um 180 Grad drehen (nicht nur jeden Balken umdrehen), um die richtige Ausrichtung zu erzielen:
| | | | | | | | | | | | | | | | | | | |
Jetzt können wir mit der Dekodierung beginnen. Wir ordnen jeden Balken der entsprechenden Basis-4-Ziffer zu und ignorieren dabei die Start- / Stopp-Sequenzen, da sie die Daten nicht codieren.
| | | | | | | | | | | | | | | | | | | | - - 2 1 0 3 0 2 3 - -
Wir verketten dies mit der Ganzzahl zur Basis 4 2103023
und konvertieren es dann in seine Dezimaldarstellung 9419
für das Endergebnis.
Regeln
- Die Eingabe ist immer ein gültiger 4-Status-Barcode, der wie oben beschrieben in ASCII mit der beschriebenen Start- / Stopp-Sequenz gerendert wird.
- Sie können ein Leerzeichen oder eine gestrippte Linie sowie eine nachgestellte Linie anfordern - je nachdem, welches Format für Ihr Golfspiel geeignet ist.
- Es kann in der richtigen Ausrichtung sein oder nicht - Ihr Programm muss mithilfe der Start- / Stopp-Sequenz bestimmen, ob es verkehrt herum gelesen werden soll.
- Führende Nullstellen in der Ganzzahl zur Basis 4 werden nicht codiert.
- Sie können die Eingabe als Liste von Zeilen oder als Zeichenfolge mit Zeilenumbrüchen verwenden.
- Die Ausgabe sollte eine Ganzzahl in der Standard-Ganzzahlbasis Ihrer Sprache sein, die die vom Barcode codierten Daten darstellt.
- Da Briefmarken klein sind und nur sehr wenig Code enthalten, muss Ihr Code so kurz wie möglich sein: Dies ist ein Code-Golf - also gewinnt das kürzeste Programm (in Bytes)!
Testfälle
| | | | | | | | | | | | | |
= 4096 (gespiegelt)
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
= 7313145 ( gespiegelt )
| | | | | | | | | | | | | | | | | | | |
= 9419 ( gespiegelt )
| | | | | | | | | | | | | | | | | | |
= 990 (nicht gespiegelt)
| | | | | | | | | | | | | | | | | | |
= 12345 (nicht gespiegelt)
[String]
, [{#Char}]
, [{Char}]
, [[Char]]
?, Da String
entspricht{#Char}