4-Zustands-Barcodes
Viele Postdienste (Royal Mail UK, Canada Post, US Mail usw.) verwenden einen 4-Staaten-Barcode, um Informationen über ihre Post zu verschlüsseln. In ASCII gerendert könnte es ungefähr so aussehen:
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Ein 4-Staaten-Barcode ist eine Reihe von Balken. Jeder Balken kann nach oben, unten oder in beide Richtungen verlängert werden und bietet 4 Möglichkeiten. Dies bedeutet, dass jeder Balken im Wesentlichen eine vierstellige Basis darstellt:
| | Bar: | | | | | | Ziffer: 0 1 2 3
Das Problem bei dieser Symbologie ist, dass es sich bei jedem Barcode um einen gültigen, anderen Barcode handelt: Die Bedeutung wird drastisch geändert, wenn die Ausrichtung falsch ist. Daher ist ein Start und Stopp werden Sequenz normalerweise implementiert , um die Scanner berechnen kann , welche Art und Weise es soll gelesen werden.
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, ein Programm oder eine Funktion zu schreiben N
, die es bei einer positiven Ganzzahl in einen ASCII-4-Status-Barcode umwandelt, wobei jeder Balken (mit Ausnahme der Start- / Stopp-Sequenzen) eine Ziffer in der Base-4-Darstellung von darstellt N
.
Beispiel:
Wenn die ganze Zahl gegeben ist 19623
, konvertieren wir sie zuerst in ihre Basis-4-Darstellung 10302213
.
Wir würden dann jede Ziffer dem entsprechenden Balken zuordnen:
1 0 3 0 2 2 1 3 | | | | | | | | | | | | | | | |
Schließlich würden wir die Start / Stopp-Sequenzen hinzufügen:
Start Ende: 1 0 1 0 | | | | | | | | | | | | | | | | | | | | | |
Der resultierende Barcode sollte die Ausgabe des Programms sein.
Regeln:
- Die Eingabe ist eine positive Ganzzahl im Bereich der Standard-Ganzzahlgröße Ihrer Sprache.
- Die Ausgabe:
- Dies kann entweder eine Liste von Zeilen oder eine Zeichenfolge sein, die neue Zeilen enthält.
- Kann führende oder nachfolgende Zeilen / Leerzeichen enthalten, solange die Form intakt bleibt.
- Sollte den Barcode mit dem obigen Format anzeigen - es muss das Pipe-Zeichen (
|
) und das Leerzeichen () beim Zeichnen von Balken verwendet werden, und es sollte 1 Leerzeichen zwischen jedem senkrechten Balken sein.
- Das ist Code-Golf , also gewinnt das kürzeste Programm (in Bytes)!
Testfälle
4095:
| | | | | | | | | | | | | | | | | | | | | | | |
4096:
| | | | | | | | | | | | | |
7313145:
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
quelle
Antworten:
Python 3 ,
1039996 BytesProbieren Sie es online!
quelle
MATL ,
34302928 BytesProbieren Sie es online!
Erläuterung
quelle
Jelly ,
16-15BytesProbieren Sie es online!
Wie es funktioniert
quelle
.......
aber jeder Punkt steht für ein anderes Byte.Jelly , 19 Bytes
Probieren Sie es online!
-1 Danke an Herrn Xcoder .
quelle
Oktave ,
78 77 75 74 7069 BytesProbieren Sie es online!
Im Gegensatz zum ursprünglichen Ansatz verwendet dieser eine einfache Nachschlagetabelle, um die Basis-4-Werte auf ihr binäres Äquivalent abzubilden. Die Nachschlagetabelle fügt auch den Abstand zwischen den einzelnen Strichen hinzu, indem zwischen den einzelnen Zahlen eine Null eingefügt wird (die einem Strich aller Leerzeichen zugeordnet wird).
Die Nachschlagetabelle ordnet Bars direkt zu als:
Die Konvertierung von binär nach
|
underfolgt nun durch Indizieren in eine Zeichenfolge aus diesen beiden Zeichen - im Grunde das gleiche Prinzip wie in der Nachschlagetabelle für die binäre Konvertierung.
* 1 Byte gespeichert, danke @LuisMendo
Original:
Probieren Sie es online!
Anonyme Funktion, die den Barcode als Zeichenfolge zurückgibt.
Dies basiert auf der Tatsache, dass wir, wenn wir 4 zu den Stellen von base4 addieren, einen Strich / Leerzeichen durch die Zahl darstellen können, die mit den vertauschten Bits 1 und 2 in eine Binärzahl umgewandelt wurde:
Die knifflige Sache aus Sicht des Golfspiels ist das Hinzufügen der Abstände zwischen den Bars und das Umwandeln von
0/1
in'|'/' '
.quelle
JavaScript (ES6),
898783 BytesTestfälle
Code-Snippet anzeigen
Wie?
Hinweis : In der folgenden Version wurden Vorlagenliterale durch Standardzeichenfolgen ersetzt, damit der Code ordnungsgemäß eingerückt werden kann.
quelle
R ,
154109 BytesProbieren Sie es online!
Es wurde eine ganze Reihe von Bytes durch Indizieren und Verwenden von und nicht durch Erstellen
cat
einer Matrix und Verwendenwrite
von sowie 6 von einer geringfügig anderen Konvertierung zu Basis 4 gespeichert. Druckt mit einem führenden Leerzeichen in jeder Zeile und ohne nachfolgende Zeilenumbrüche.Die Indizierung erfolgt unter Verwendung einer modularen Arithmetik, ähnlich wie bei einigen anderen Antworten. Da R jedoch eine auf 1 basierende Indizierung verwendet, ist die Arithmetik etwas anders.
Erläuterung:
quelle
Holzkohle , 50 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Geben Sie eine Nummer ein.
Schieben Sie die Stoppsequenz auf die vordefinierte leere Liste.
Wenn die Zahl positiv ist,
Wende divmod wiederholt an, um es in die umgekehrte Basis 4 umzuwandeln.
ansonsten einfach drauf drücken.
Schieben Sie die Startsequenz in die Liste.
Map über drei Saiten. Jede Zeichenfolge repräsentiert die Barcode-Übersetzung für die Ziffern
0123
jeder Zeile.Ordnen Sie die Ziffern in umgekehrter Reihenfolge zu, konvertieren Sie sie mithilfe der Übersetzung in Striche oder Leerzeichen und fügen Sie die Ergebnisse zu drei Zeichenfolgen zusammen, die implizit in separaten Zeilen gedruckt werden.
quelle
Japt ,
3231 BytesOnline testen!
Noch nicht wirklich zufrieden damit, aber es ist ein Anfang ...
Erläuterung
quelle
Haskell ,
91-90BytesProbieren Sie es online! Gibt eine Liste von Zeilen zurück.
Gleiche Bytezahl-Alternative für die erste Zeile:
quelle
J ,
57 4947 Bytes10 Bytes dank FrownyFrog!
Wie es funktioniert:
1 0,4&#.inv,1,0:
- wandelt die Zahl in eine Liste mit 4-stelligen Basisziffern um und fügt 1 0 am Anfang und am Ende der Liste hinzu((#:2 6 3 7){' |')
- Nachschlagetabelle für die Verschlüsselung, binäre 0 entspricht Leerzeichen, 1 bis '|'{~
- verschlüsselt die 4-stellige Basis durch Auswahl eines Strings aus der obigen Nachschlagetabelle (Argument umgekehrt)|:
- transponiert das resultierende Array von 3 Spalten in 3 Zeilen[:
- verschließt die Gabel,.2{."0
- fügt Leerzeichen zwischen die Balken einProbieren Sie es online!
quelle
APL + WIN, 63 Bytes
Erläuterung:
quelle
Python 2 ,
116114 Bytes-2 Bytes dank Notjagan
Probieren Sie es online!
quelle
05AB1E , 19 Bytes
Probieren Sie es online!
Dies ist eine halbe Portierung von Dennis 'Ansatz, der nur ein Byte kürzer ist als die Methode, die ich zuvor verwendet habe (mit der ich ziemlich zufrieden bin):
05AB1E , 20 Bytes
Probieren Sie es online!
Wie es funktioniert?
Ich habe Adnan (den Schöpfer von 05AB1E) nach dem Grid-Ding im Chat gefragt und sie haben mir geholfen, 2 Bytes zu sparen, indem sie auf eine Funktion von 05AB1E hingewiesen haben: Wenn mehrdimensionale Listen durch Zeilenumbrüche verbunden werden, werden die inneren Listen auch durch Leerzeichen verbunden ist also
ðý
unnötig.quelle
APL (Dyalog Classic) , 33 Byte
Probieren Sie es online!
quelle
2⊥⍣¯1
Sie eine binäre Liste?2⊥⍣¯1
ist die Umkehrung ("obverse"?) Von "two-decode". Es wird mit so vielen Bits wie nötig in eine Binärdatei codiert.J ,
42 4039 Bytes2 Bytes rasiert dank Dennis. 1 Byte danke an ngn.
Probieren Sie es online!
Wie es funktioniert
quelle
JavaScript (ES6) 79 Byte
Verwendet .toString, um die Zahl in Basis 4 umzuwandeln, und arbeitet dann mit jeder Zeile und bitweisem ODER, um die Ausgabe zeilenweise zu erstellen. Gibt eine Liste von Zeilen aus.
quelle
`10${n.toString(4)}10`
:)Bash + Coreutils,
7167 BytesProbieren Sie es online!
Erläuterung
Das
dc
Bit wird in die Basis 4 konvertiert, wobei ein vorangestellt und angehängt wird4
(wird in10
die Ausgabe umgewandelt) und verwendet wirdn
, um alles in einer Zeile zu halten.Der Rest passiert in
sed
:quelle
x
um die Halte- / Musterbereiche zu ändern und danns
alles auf einmal zu erledigen , und nichts wurde kürzer.Retina , 83 Bytes
Probieren Sie es online! Link enthält die schnelleren Testfälle. Erläuterung:
In Unary konvertieren.
Konvertiere zu Basis 4 als durch
;
s getrennte unäre Zahlen .Stellen Sie die Startsequenz voran.
Fügen Sie ein an
;
und verwandeln Sie es in einen Ziffernabschluss und nicht in ein Trennzeichen. Geben Sie dann die Stoppsequenz an.In Dezimalzahl umwandeln, aber jeder Ziffer 1 hinzufügen.
Verdreifache es.
In der ersten Zeile werden
1
s und3
s (für0
s und2
s) zu Leerzeichen.In der letzten Zeile werden
1
s und2
s (für0
s und1
s) zu Leerzeichen.Alle anderen Ziffern werden zu Balken.
quelle
Pip ,
3331292726 Bytes25 Byte Code, +1 für
-S
Flag.Probieren Sie es online!
Erläuterung
Wir beobachten ein Muster in den vier Balkentypen:
Damit:
quelle
SOGL V0.12 , 28 Bytes
Probieren Sie es hier aus!
quelle
C (gcc) , 176 Bytes
Probieren Sie es online!
Etwas weniger schrecklich formatiert (weniger Golf):
Erläuterung
Betrachten Sie zunächst den folgenden Code, um eine Ganzzahl zu lesen und die Basis 4-Version auszugeben:
Dies verwendet die Schwanzrekursion, um die Reihenfolge der Ausgabe umzukehren. Jeder rekursive Schritt verschiebt sich um 2 Bits (springt von den letzten 2 Bits ab und dividiert durch 4). Es gibt das mit 3 (0b11) maskierte Ergebnis aus, das nur die letzten beiden Bits anzeigt, also die letzte Ziffernbasis 4.
Der Funktionsaufruf ist in dem
printf
Argument als nachstehendes Argument enthalten (es wird nicht gedruckt, aber ausgewertet), um zu vermeiden, dass {} (+2 Byte) zum Gruppierenprintf
des Funktionsaufrufs und des Funktionsaufrufs verwendet werden muss.Die Lösung hier erweitert diesen Base-4-Code. Zunächst wird m als n definiert, aber so, dass in Basis 4 10 vorangestellt und angehängt wird. Wir drucken dann m.
In der regulären Druckbasis 4 haben wir eine Bitmaske von 3 verwendet, um die Ziffer zu erhalten. Im Postcode ist die oberste Zeile das niederwertige Bit dieser Ziffer (eine Bitmaske von 1) und die unterste Zeile das höherwertige Bit (eine Bitmaske von 2). Dementsprechend ist die
r
inf(n,r)
dem Bitmask - unsere Funktionsaufrufef(m,1)
für die erste Zeile undf(m,2)
für die letzte Zeile.Damit die mittlere Zeile funktioniert (immer "|" drucken), addieren wir
||!r
die Bedingung - wenn r 0 ist, wird immer true ausgewertet und ein "|" ausgegeben. Dann rufen wirf(m,0)
nach der Mittellinie.Schließlich möchten wir, dass sich Zeilenumbrüche verhalten. Das Einfügen eines zusätzlichen
printf
Codes ist in Bezug auf den Quellcode sehr teuer. Stattdessen fügen wir dem vorhandenen einen weiteren% c-Bezeichner hinzuprintf
.n?32:10
Gibt eine neue Zeile aus, wenn n 0 (falsch) ist, andernfalls ein Leerzeichen. 32 und 10 werden anstelle von '\ n' und '' verwendet, um Bytes zu speichern.quelle
f(n,r){n&&f(n>>2);printf("%c%c",n?32:10,(n&r|!r)&&n?'|':32);}main(n){scanf("%d",&n);f(n=(n+(4<<(32-__builtin_clz(n)/2*2)))*16+4,1);f(n,0);f(n,2);}
Common Lisp, 191 Bytes
Probieren Sie es online!
quelle
PHP, 99 + 1 Bytes
erfordert PHP> = 5.5 für die Indexierung von Literalstrings und <7.1 für die Indexierung, um keine Warnung zu erhalten.
Laufen Sie als Pipe mit
-nR
oder versuchen Sie es online .Fügen Sie eine weitere neue Zeile ein, um eine nachfolgende zu erhalten.
quelle
Python 2,
142126 BytesEin großes Dankeschön an ovs!
Ich habe versucht, die Methoden der anderen Antworten nicht zu kopieren und ... igitt.
quelle
C # (.NET Core) , 160 Byte
Probieren Sie es online!
Ich bin sicher, ich habe einige Verbesserungen verpasst.
DeGolfed
t<51 & y != 1 & t-(y>>1) != 49
überprüft, ob das Zeichen nicht '3' ist, nicht die zweite Zeile, und dann etwas Binärzauber, um festzustellen, ob die erste oder dritte Zeile das Leerzeichen enthalten soll.quelle
Zsh ,
156154151133 BytesProbieren Sie es online!
Nimmt Basis-10-Eingabe von der var
$x
quelle
Japt , 42 Bytes
Probieren Sie es online!
quelle
Pyth , 32 Bytes
Probieren Sie es hier aus!
quelle
C, 120 Bytes
Funktioniert leider nur unter Windows, da dies
itoa
zu praktisch ist, um Standard zu sein.quelle