Schreiben Sie eine Funktion oder ein Programm, das eine Zeichenfolge in einen Barcode im Code 39- Format codiert, wobei jedes Zeichen als fünf durch vier Lücken getrennte Striche codiert wird. Entweder sind zwei der Balken und einer der Lücken breit und andere sind schmal (10 * 4 Codes), oder drei der Lücken sind breit und keiner der Balken ist (4 Codes). Dies ergibt 44 verschiedene Codes, von denen einer ein reservierter Code ist, der verwendet wird, um den Anfang und das Ende der codierten Zeichenfolge zu kennzeichnen.
Die Herausforderung
Die Eingabe ist eine Zeichenfolge, die nur Zeichen aus der Gruppe enthält
1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ-. +/$%
Die Ausgabe ist die als Barcode-Zeichenfolge codierte Zeichenfolge. Die engen Lücken und die Lücken zwischen den Zeichen sind ein einzelnes Leerzeichen und eine breite Lücke drei Leerzeichen. Der schmale Balken ist die UTF-8-Byte-Sequenz für das Unicode-Zeichen "Full Block", █, dh der 0xE2 0x96 0x88
breite Balken besteht aus drei solchen Byte-Sequenzen / Zeichen ( ███
). Die vollständige Liste der Codes lautet:
Spaces
0100 0010 0001 1000 1011 1101 1110 0111
Bars
00000 + / $ %
10001 1 A K U
01001 2 B L V
11000 3 C M W
00101 4 D N X
10100 5 E O Y
01100 6 F P Z
00011 7 G Q -
10010 8 H R .
01010 9 I S space 1=wide
00110 0 J T start/end 0=narrow
Die Striche und Zwischenräume werden beginnend mit einem Strich verschachtelt, also ist beispielsweise Q
bar 0 0 0 1 1
code █ █ █ ███ ███
space 0 0 0 1
Nach der Kodierung aller Zeichen wird die Zeichenkette an beiden Enden mit begrenzt █ █ ███ ███ █
. Die Zeichenlücke, ein einzelnes Leerzeichen, wird zwischen jedem Buchstaben eingefügt. Ihre Lösung gibt möglicherweise abschließende Leerzeichen und eine abschließende neue Zeile (in dieser Reihenfolge) aus.
Beispiele
"" → "█ █ ███ ███ █ █ █ ███ ███ █"
"A" → "█ █ ███ ███ █ ███ █ █ █ ███ █ █ ███ ███ █"
"C++" → "█ █ ███ ███ █ ███ ███ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ███ ███ █"
"GOLF" → "█ █ ███ ███ █ █ █ █ ███ ███ ███ █ ███ █ █ █ ███ █ █ ███ █ ███ ███ █ █ █ █ ███ ███ █"
Standard-Eingabe- / Ausgabeformate sind zulässig, und Standard-Lücken sind nicht zulässig. Das ist Code-Golf , also gewinnt der kürzeste in Bytes gemessene Code!
#
Zeichens zu bestrafen , da dies beispielsweise"#"
nicht der einzige Grund ist, warum es in einer Sprache verwendet werden kann.Antworten:
JavaScript (ES6),
225212 Bytes4 Bytes gespart dank @ l4m2
Probieren Sie es online!
Wie?
Die Tabelle kann so umgeordnet werden, dass die 9-Bit-Binärmaske des Zeichens anhand der folgenden Formel schnell aus Zeile und Spalte abgeleitet wird:
mit:
quelle
s=>`#${s}#`.replace(/./g,c=>'0202020202'.replace(/./g,(j,k)=>[C='#',C+C+C,' ',' '][(i="%+/$U1AKV2BLW3CMX4DNY5EOZ6FP-7GQ.8HR 9IS#0JT".indexOf(c),[,257,260,5,272,17,20,320,65,68,80][i>>2]|(2<<i%4*2^(i<4)*170))>>k&1|j]))
(221)Rot ,
452445 BytesProbieren Sie es online!
Ich werde versuchen, weiter Golf zu spielen, aber ich erwarte nicht viel von dieser naiven Lösung.
quelle
Java 10, 455 Bytes
Probieren Sie es online aus.
Erläuterung:
quelle
C (gcc) ,
311, 303 BytesProbieren Sie es online!
-8 dank ceilingcat
Verwendet die Codierungsstrategie von Arnauld. TIO Link beinhaltet
-w
Schalter und Boilerplate, um Warnungen zu entfernen. Diese sind unnötig und daher nicht in der Partitur enthalten.Abgesehen von dem von Arnauld erläuterten Codierungsschema besteht der andere Trick darin, die
w
Variable so zu belassen, dass sie zwischen 2 und 0 wechselt (w=2*!w
). Dadurch kann ich zwischen der ersten und der zweiten Saite wählenb
. Das erste ist ein Leerzeichen, das zweite ist das gefüllte Rechteck.quelle
C (gcc) ,
241 239 227 213207 BytesProbieren Sie es online!
Basiert auf der Implementierung von @ LambdaBeta .
Etwas weniger Golf gespielt:
quelle
Kohle , 90 Bytes
Probieren Sie es online! Hinweis: Leerzeichen am Ende. Link ist eine ausführliche Version des Codes. Erläuterung:
Wickeln Sie die Eingabezeichenfolge in
*
s ein und ordnen Sie sie dann zweimal zu, wobei Sie das Ergebnis schließlich mit Leerzeichen verbinden. Für die zweite Map gibt es dann eine zusätzliche Map über den impliziten Bereich0..4
, in der zwei Teilzeichenfolgen verkettet werden und diese Ergebnisse dann mit der vordefinierten Konstante für leere Zeichenfolgen verknüpft werden.Erstellen Sie für die erste innere Zuordnung eine Zeichenfolge, die aus den inkrementierten Ziffern, dem Großbuchstaben und den Symbolen besteht
-. *+/$%
, und suchen Sie die Position des zugeordneten Eingabezeichens. Zum BeispielC++
würde map to[12, 40, 40]
.Der erste Teilstring repräsentiert die Leerzeichen vor den Balken. Vor dem ersten Balken befindet sich nichts, die anderen Balken hängen jedoch von der Position des zugeordneten Eingabezeichens ab: Wenn es über 39 liegt, enthält nur eine Stelle ein einzelnes Leerzeichen. Wenn es unter 40 liegt, enthält nur eine Stelle drei Leerzeichen, und die Position wird auch in eine Spalte umgewandelt, indem sie durch 10 geteilt wird. Wenn sich die Spalte und der Schleifenindex um 2 (Modulo 4) unterscheiden, ist dies die ungerade Stelle.
Der zweite Teilstring repräsentiert die Balken. Wenn die Position über 39 liegt, gibt es immer einen Balken, andernfalls wird die Position in einem Array von Bits gesucht, die Zeichen zugeordnet sind. Zum Beispiel, wenn die Position 12 ist, dann ist das kreisförmig auf das Zeichen indiziert
'
, das ist100111
binär, was darauf hindeutet breite Balken in den Spalten 1 und 2. (Die führende1
ignoriert wird , sondern sorgt lediglich eine konsistente Bitzahl.)quelle
Perl 5 , 244 Bytes
Probieren Sie es online!
Enthält viele nicht druckbare und High-Byte-Zeichen, TIO-Link bietet eine
xxd
Darstellung. Ich hatte gehofft, dass dies kleiner geworden wäre, und ich könnte die Daten immer noch effizienter packen, damit ich sehen kann, wie es mir geht. Dies baut alle Permutationen von auf" "," ","█","███"
und ordnet dann die Angaben der Liste den entsprechenden Zeichen zu.quelle
Haskell ,
275.270BytesProbieren Sie es online!
Der Operator
x!n
, der die x-Basis-Ziffern von n berechnet, wird zweimal zum Dekomprimieren der Codes verwendet. Die Codes werden zuerst als binäre Zeichenketten mit wide = 1 und narrow = 0 komprimiert, ohne Rücksicht auf die Farbe, zR↔10000110↔262
. Diese Zahlen werden dann sortiert und differenziert, um Zahlen im Bereich [3,66] zu erhalten, die mit der Umkehrung des binären Ziffernalgorithmus wie folgt komprimiert werden0x117CDBC49F9EEEF11C3A659CACB31236
. Dies enthält nur die Hälfte der Codes, der Rest sind Umkehrungen davon.Ungolfed:
quelle