Nahezu jedes Geschäft verwendet heutzutage UPC-Barcodes ( Universal Product Code ), um den Bestellvorgang zu vereinfachen. Wenn der Name Ihnen nichts bedeutet, werden Sie sicherlich erkennen, wie sie aussehen:
Format
Das gebräuchlichste System ist UPC-A, bei dem jedes Produkt aus 12 Ziffern besteht. Jede Ziffer ist in eine Reihe von schwarzen und weißen Streifen codiert, damit Maschinen den Code lesen können, eine Länge von sieben Bits. Es gibt insgesamt Muster im Wert von 11 Bits, die den Anfang, die Mitte und das Ende des Barcodes angeben. Dies ergibt eine Gesamtlänge des Barcodes von 12 × 7 + 11 = 95 Bit. (Von nun an ist, wenn Binär zur Bezeichnung der Farbe jedes Bits verwendet wird, 0
Weiß und 1
Schwarz.)
Der Anfang und das Ende haben beide ein Muster von 101
. Die Ziffern werden dann in 2 6er-Gruppen unterteilt und wie unten dargestellt mit einem Muster 01010
zwischen der linken und der rechten Gruppe codiert . In dieser Tabelle ist das Muster für jede Nummer aufgeführt. Beachten Sie, dass das Muster unterschiedlich ist, je nachdem, ob sich die Ziffer auf der rechten oder der linken Seite befindet. (Dadurch kann der Barcode verkehrt herum gescannt werden.) Das Muster für die rechte Seite ist jedoch das Gegenteil (Schwarz gegen Weiß tauschen und umgekehrt) des Musters für die linke Seite.
Wenn Sie das obige Bild nicht sehen können, ist dies das binäre Äquivalent jeder Zahl.
# Left Right
0 0001101 1110010
1 0011001 1100110
2 0010011 1101100
3 0111101 1000010
4 0100011 1011100
5 0110001 1001110
6 0101111 1010000
7 0111011 1000100
8 0110111 1001000
9 0001011 1110100
Beispiel
Angenommen, Sie haben den UPC 022000 125033
. (Das sind keine Zufallszahlen. Hinterlassen Sie einen Kommentar, wenn Sie deren Bedeutung herausfinden.) Sie beginnen mit diesem Kesselschild, das in jedem Barcode gleich ist:
101xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx01010xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx101
Für die Ziffern ersetzen Sie jede durch die entsprechende Kodierung für die Seite (links oder rechts), auf der sie sich befindet. Wenn Sie immer noch verwirrt sind, sehen Sie sich das Bild unten an.
Hier ist die Ausgabe in Binärform mit |
Rohren, die die Teile trennen.
101|0001101|0010011|0010011|0001101|0001101|0001101|01010|1100110|1101100|1001110|1110010|1000010|1000010|101
Herausforderung
Schreiben Sie ein Programm, das den UPC-A-Barcode für die Benutzereingabe ausgibt. Die Abmessungen des Bildes sollten 95 × 30 Pixel betragen, wobei jedes "Bit" ein Pixel breit und 30 Pixel hoch ist. Schwarze Streifen sind in rgb(0, 0, 0)
und weiße Streifen sind durchgehend transparent oder rgb(255, 255, 255)
.
Anmerkungen
- Nehmen Sie die Eingabe von stdin oder der Befehlszeile entgegen oder schreiben Sie eine Funktion, die einen String oder eine Ganzzahl annimmt (beachten Sie, dass die Eingabe führende Nullen haben kann und die meisten Sprachen diese entfernen oder die Zahl in Oktal konvertieren).
- Geben Sie das Bild auf eine der folgenden Arten aus:
- Speichern Sie es in einer Datei mit einem Namen und einem Format (PNG, PBM usw.) Ihrer Wahl.
- Zeigen Sie es auf dem Bildschirm an.
- Die Dateidaten werden an stdout ausgegeben.
- Sie dürfen keine Bibliotheken oder eingebauten Elemente verwenden, die Barcodes generieren ( ich sehe Sie, Mathematica ), obwohl Sie möglicherweise Bild- oder Grafikbibliotheken verwenden.
- Die letzte Ziffer eines UPC ist normalerweise eine Prüfziffer , aber für diese Zwecke müssen Sie sich keine Sorgen machen.
Beispiele
Hier sind einige weitere Beispiele, mit denen Sie Ihren Code testen können. Der Binärausgang ist auch der Einfachheit halber angegeben.
Eingang: 012345678910
Ausgabe:
10100011010011001001001101111010100011011000101010101000010001001001000111010011001101110010101
Eingang: 777777222222
Ausgabe:
10101110110111011011101101110110111011011101101010110110011011001101100110110011011001101100101
Wertung
Dies ist Codegolf , daher gewinnt die kürzeste Einreichung (in Bytes). Tiebreaker geht zum frühesten Beitrag.
quelle
["777777","222222"]
Antworten:
CJam,
5857 BytesDruckt eine Portable BitMap (ASCII) nach STDOUT. Probieren Sie es online aus.
Wie es funktioniert
quelle
Rev 1 BBC BASIC, 155 ASCII-Zeichen, tokenisierte Dateigröße 132 Byte
Ein paar Bytes gespart, indem der Versatz von 43 in die
i
Schleife aufgenommen wurde. Um einen Bruch zu vermeiden, musstenMOD2
zusätzlich 47 für insgesamt 90 hinzugefügt werden.Dadurch wird der Barcode wie gezeigt weiter vom Ursprung entfernt, sofern dies akzeptabel ist:
Rev 0 BBC BASIC, 157 ASCII-Zeichen, tokenisierte Dateigröße 137 Bytes
Laden Sie den Interpreter unter http://www.bbcbasic.co.uk/bbcwin/bbcwin.html herunter
Der Standardbildschirmmodus ist schwarzer Text auf weißem Hintergrund. Dies unterscheidet sich von Original BBC BASC.
Ungolfed-Version mit Probedruck
Die Berechnung eines Datenbalkens ist abhängig von
IF j<42
und muss in einer Zeile erfolgen. In der ungolfed Version erfolgt dies in drei Schritten. In der Golfversion werden die letzten beiden Schritte zu einem einzigen großen Ausdruck kombiniertp=...
Ich musste die Reihenfolge der Bitmaps umkehren, weil ich
>>(j MOD 7)
auf die Bits zugreife, was bedeutet, dass ich zuerst auf das niedrigstwertige Bit zugreife. Sobald dies erledigt ist, befinden sich alle linken Bitmaps bequemerweise im ASCII-Bereich.Typische Ausgabe, ungolfed Version, mit Testausgabe
quelle
JavaScript ES6, 225 Byte
Könnte mit ES7-Funktionen kürzer sein, aber ich bin mir nicht sicher, ob sie unterstützt werden, also bleibe ich bei ES6. Ich gehe auch von einer Eingabe als Array aus. Die Ausgabe ist eine PBN-Datei . Es gibt auch viel zu golfen.
Wenn ich etwas falsch gemacht habe, hinterlasse einen Kommentar und ich werde ihn mit Sicherheit reparieren
quelle
Perl, 153 Bytes
Kopieren Sie in eine Datei barcode.perl und führen Sie dann Folgendes aus:
Geben Sie dann die Barcode-Nummer ein.
Erläuterung:
Die Bitmuster für die Barcode-Ziffern werden in einer Zeichenfolge gespeichert und durch die eingegebenen Ziffern mit dem Perl-
y///
Transliterationsoperator ersetzt. Zu jedem Wert in der Ersetzungszeichenfolge werden 48 (ASCII '0') hinzugefügt, um nicht druckbare Zeichen zu vermeiden. Die Ziffern in der zweiten Hälfte des Barcodes sind Umkehrwerte zu denen in der ersten Hälfte.Das zentrale Muster wird auf 0000000 gesetzt (ein Muster, das sonst niemals erscheinen kann, codiert als 'A' und dann '0') und dann durch 01010 ersetzt, anstatt seine unterschiedliche Länge als Sonderfall zu behandeln
sprint
.quelle
Oktave, 115 Bytes
Mehrzeilige Version:
n
ist das ASCII-Äquivalent der Zifferncodes auf der rechten Seite (sie waren einfacher einzugeben als auf der linken Seite, da sie alle anzeigbare Zeichen waren). Danach ändert sich eine gerade Dezimal-Binär-Konvertierung mit einigen ärgerlichen Typen von char zu numeric.v
erstellt die endgültige Binärzeichenfolge, und dann wiederholen wir sie 30 Mal und geben sie an die Konsole aus.Beispielausgabe mit nur 2 der 30 Zeilen, die der Kürze halber angezeigt werden:
Komprimierte Ausgabe:
Ich hatte ursprünglich vor, das Bild anzuzeigen, aber das Senden der Ausgabe an die Konsole sparte mir 9 Bytes. Sie können die Ergebnisse mit anzeigen
imshow
, sie werden jedoch1
weiß und0
schwarz angezeigt , sodass Sie zuerst die Daten invertieren müssen.quelle
Cobra - 218
quelle
Javascript ES6, 199 Bytes
quelle
Python 2, 174 Bytes
Ich weiß, dass man Golf spielen kann.
Die Saite
s
ist die Binärtabelle in der Frage, wobei die linke Hälfte der Tabelle die linke Hälfte der Zeichenfolge ist. Die Werte werden zuerst um 63 UND-verknüpft, wenn sie sich in der rechten Hälfte befinden (entfernen Sie zuerst 1), und dann um 63 verschoben, um druckbares ASCII zu erhalten.BUG: Derzeit wird versucht, einen Fehler zu beheben. Die Ausgabe des ersten Beispiels ist um eine Stelle des Barcodes abgeschaltet. Wenn Sie es herausfinden, lassen Sie es mich bitte wissen.
quelle