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]]
?, DaString
entspricht{#Char}
Antworten:
Jelly , 18 Bytes
Probieren Sie es online!
quelle
Schale , 16 Bytes
Probieren Sie es online!
Die Eingabe ist eine Liste von Zeilen (die TIO-Verknüpfung verwendet zur Verdeutlichung eine mehrzeilige Zeichenfolge). Die Zeilen müssen gleich lang sein und dürfen keine zusätzlichen Leerzeichen enthalten.
Erläuterung
quelle
SOGL V0.12 ,
4032 BytesProbieren Sie es hier aus!
quelle
Python 2 ,
113105 BytesProbieren Sie es online!
quelle
Python 2 , 96 Bytes
Probieren Sie es online!
quelle
Retina , 71 Bytes
Probieren Sie es online! Link enthält kleinere Testfälle. Erfordert, dass die erste und die letzte Zeile bis zur Länge der mittleren Zeile mit Leerzeichen aufgefüllt werden. Erläuterung:
Löschen Sie die unnötigen Leerzeichen.
Kehren Sie die Zeichen im Code um. Beginnt der Barcode jedoch mit einem
|
, wählen Sie den gesamten Code aus, andernfalls teilen Sie ihn in Zeichen auf. Dann kehren Sie sie um. Dadurch wird der Code umgedreht, wenn er mit einem beginnt0
.Löschen Sie die Start- / Stopp-Sequenz und die mittlere Zeile (was für uns nicht von Nutzen ist).
Konvertieren Sie die Leerzeichen und
|
s von Basis 4 nach unär.Verdopple die letzte Zeile.
In Dezimalzahl konvertieren.
quelle
Java (OpenJDK 8) ,
181160 BytesFür eine Java-Lösung nicht allzu schäbig, ich bin mir sicher, dass ich Optimierungen vornehmen kann, aber ich habe das schon zu lange angestarrt.
Reduzieren Sie einige Bytes, indem Sie die Schleife kürzen, anstatt Teilzeichenfolgen zu verwenden.
Golf gespielt
Probieren Sie es online!
Ungolfed
quelle
l+~i
stattdessen vorl-1-i
Java 8 ,
208166157151 BytesDer Versuch kann wahrscheinlich besser sein, reduziert 42 aufgrund unnötiger Überprüfungen, -9 Entfernen von Variablen, -6 dank Luke Stevens
Input ist a
char[][3]
ungolfed:
quelle
Sauber ,
191...161144 BytesProbieren Sie es online!
quelle
Pip ,
464342 BytesNimmt die Zeilen des Barcodes als drei Befehlszeilenargumente. Die erste und dritte Zeile müssen mit Leerzeichen auf die Länge der zweiten Zeile aufgefüllt werden. Probieren Sie es online!
Erläuterung
Zuerst ein paar Vorarbeiten:
Beachten Sie nun, dass, wenn wir die mittlere Zeile ignorieren und
als 0 behandeln, jeder Balken nur eine 2-Bit-Binärzahl ist:
|
als 1 undquelle
Schale ,
3938 BytesNimmt Eingaben als Liste von Zeichenfolgen: Probieren Sie es online aus oder probieren Sie die Testsuite aus!
Erläuterung
quelle
Perl 5 , 152 + 2 (
-F
) BytesProbieren Sie es online!
quelle
Oktave ,
807568 BytesProbieren Sie es online!
Merkwürdigerweise
bi2de
ist standardmäßig MSB auf der rechten anstatt der linken Seite, was zu einigen Kopfschmerzen , während ich dies gemacht ... Ich denke , ich sollte den optimalen Weg von Spiegeln das Array haben , bevor es die Indizierung, aber es gibt sehr viele Möglichkeiten , es zu tun ( entweder in den ersten Indexierungs oder mitflipud
,fliplr
,rot90
,'
(transponieren), die endgültigen Indexierungs ...). Nimmt ein rechteckiges Array mit Leerzeichen und|
s an (daher sind nachgestellte Leerzeichen erforderlich)quelle
JavaScript (ES6),
184181 BytesIch bin kein erfahrener Golfer - ich bin sicher, dass dies verbessert werden kann, aber ich habe diese Herausforderung geliebt! Ich habe mich immer über diese Zeichen gewundert.
Function erstellt
f
eine Liste von Zeichenfolgen mit erforderlichen Leerzeichen. Zeilenumbrüche wurden der Übersichtlichkeit halber in den Code unten eingefügt (nicht in der Byte-Anzahl enthalten).Verwendung
Ungolfed Version mit Erklärung
quelle