Der 1974 entwickelte Code 39 ist eine der am häufigsten verwendeten Symbologien oder Typen von Barcodes, obwohl das UPC / EAN-System im Einzelhandel am häufigsten verwendet wird. Code 39-Barcodes können Großbuchstaben, Zahlen und einige Symbole codieren und lassen sich mit einer speziellen Schriftart problemlos von Computersoftware aus drucken. Dies führte zu ihrer weit verbreiteten kommerziellen und industriellen Verwendung (z. B. Firmenausweise, Asset Tracking, Fabrikautomation).
Erstellen Sie das kürzeste Programm oder die kürzeste Funktion zum Lesen eines Code 39-Barcodes in einer beliebigen Ausrichtung aus einem 512 x 512 Pixel großen Graustufenbild. Der Barcode ist möglicherweise nicht horizontal oder vertikal ausgerichtet.
- Ihr Programm muss ein Standardbilddateiformat akzeptieren und die im Barcode codierten Daten als Standardausgabe- oder -rückgabewert erzeugen (ohne Start- / Stoppzeichen).
- Kein Bild enthält mehr als einen gültigen Code 39-Barcode, und kein Barcode codiert ein Leerzeichen (ASCII 32).
- Wenn im Bild kein gültiger Code 39-Barcode angezeigt wird, muss das Programm ein einzelnes Fragezeichen (
?
) ausgeben .
Ich habe eine JavaScript-Referenzimplementierung und eine Testsuite von Bildern im PNG-Format vorbereitet , sowohl mit gültigen als auch ohne gültigen Barcodes. Die Referenzimplementierung, bei der in den neuesten Webbrowsern nur 3 von 46 Testfällen fehlschlagen, soll einen möglichen Decodierungsalgorithmus aufzeigen, der der obigen Spezifikation nicht strikt entspricht.
Eine gültige Einreichung besteht mindestens 80% dieser Tests (37/46) und dauert nicht länger als eine Minute für jedes Bild auf einer relativ schnellen CPU (z. B. 2,6-GHz-Quad-Core). Meine Referenzimplementierung besteht 93% der Tests und verarbeitet jedes Bild innerhalb von 10 Sekunden (auf meinem Desktop-PC mit Google Chrome).
(Diese Frage wurde am 28. Mai 2011 auf Meta vorgeschlagen .)
Antworten:
Python, 899 Zeichen
Dieser Code verwendet ein Bild im PNM-Format als Eingabe, daher führe ich es normalerweise folgendermaßen aus:
Der Code selbst wählt nur viele zufällige Scanlinien aus und versucht, die Schwarz-Weiß-Läufe auf dieser Scanlinie mit den Code39-Mustern abzugleichen. Es ist zufällig angeordnet, sodass gelegentlich keine Barcodes gefunden werden können. (Ich erhalte eine falsch negative Fehlerrate von etwa 20% für die Testbilder.) Wenn dies fehlschlägt, dauert die Ausführung etwa eine Minute. Wenn dies erfolgreich ist, geschieht dies häufig viel schneller. Ich habe noch nie ein falsches Positiv gesehen.
quelle
M=dict(zip('UK.-RQA+HGYXON*TEDJ1/87$%540WVML SCBIZPF3296',[385,259,...]))