Kod 39 , opracowany w 1974 r., Jest jedną z najczęściej używanych symboli kodów kreskowych, chociaż jest to system UPC / EAN najczęściej spotykany w sprzedaży detalicznej. Kody kreskowe Code 39 mogą kodować wielkie litery, cyfry i niektóre symbole i są łatwe do wydrukowania z oprogramowania komputerowego za pomocą specjalnej czcionki. Doprowadziło to do ich powszechnego zastosowania komercyjnego i przemysłowego (np. Identyfikatory firmowe, śledzenie zasobów, automatyzacja fabryki).
Utwórz najkrótszy program lub funkcję do odczytu kodu kreskowego Code 39 w dowolnej orientacji z obrazu w skali szarości 512 x 512 pikseli; kod kreskowy może nie być wyrównany poziomo lub pionowo.
- Twój program musi zaakceptować standardowy format pliku obrazu i wygenerować dane zakodowane w kodzie kreskowym jako jego standardową wartość wyjściową lub zwracaną (bez uwzględnienia żadnego znaku start / stop).
- Żaden obraz nie zawiera więcej niż jednego poprawnego kodu kreskowego Code 39 i żaden kod kreskowy nie koduje znaku spacji (ASCII 32).
- Jeśli na obrazie nie pokazano prawidłowego kodu kreskowego Code 39, program musi wygenerować pojedynczy znak zapytania (
?
).
Przygotowałem implementację referencji JavaScript i pakiet testowy obrazów w formacie PNG, zarówno z poprawnymi kodami kreskowymi, jak i bez nich. Implementacja referencyjna, która nie spełnia tylko 3 z 46 przypadków testowych w najnowszych przeglądarkach internetowych, ma na celu pokazanie jednego możliwego algorytmu dekodowania, a nie ścisłą zgodność z powyższą specyfikacją.
Prawidłowe przesłanie przechodzi co najmniej 80% tych testów (37/46) i zajmuje to nie więcej niż jedną minutę dla każdego obrazu na stosunkowo szybkim procesorze (np. Czterordzeniowy procesor 2,6 GHz). Moja referencyjna implementacja przechodzi 93% testów i przetwarza każdy obraz w ciągu 10 sekund (na moim komputerze stacjonarnym z Google Chrome).
(To pytanie zostało zaproponowane Meta w dniu 28 maja 2011 r.)
Odpowiedzi:
Python, 899 znaków
Ten kod pobiera obraz w formacie PNM jako dane wejściowe, więc zwykle uruchamiam go w następujący sposób:
Sam kod po prostu wybiera wiele losowych linii skanowania i próbuje dopasować czarno-białe przebiegi na tej linii do wzorców kodu39. Jest losowy, więc czasami może nie znaleźć kodów kreskowych. (Otrzymuję około 20% odsetek fałszywie ujemnych błędów na obrazach testowych.) Gdy się nie powiedzie, uruchomienie zajmuje około minuty, a gdy się powiedzie, często robi to o wiele szybciej. Nigdy nie widziałem fałszywie pozytywnego wyniku.
źródło
M=dict(zip('UK.-RQA+HGYXON*TEDJ1/87$%540WVML SCBIZPF3296',[385,259,...]))