Prawie każdy sklep używa obecnie kodów kreskowych Universal Product Code (UPC), aby uprościć proces sprawdzania. Jeśli imię nic dla ciebie nie znaczy, na pewno rozpoznasz ich wygląd:
Format
Najpopularniejszym systemem jest UPC-A, który używa 12 cyfr do przedstawienia każdego konkretnego produktu. Każda cyfra jest zakodowana w szereg czarno-białych pasków, aby umożliwić maszynom odczytanie kodu o długości siedmiu bitów. Istnieje w sumie 11 bitów wzorów, które wskazują początek, środek i koniec kodu kreskowego. Dochodzi do całkowitej długości kodu kreskowego 12 × 7 + 11 = 95 bitów. (Od teraz, gdy binarny jest używany do odniesienia do koloru każdego bitu, 0
jest biały i 1
jest czarny).
Zarówno początek, jak i koniec mają wzór 101
. Cyfry są następnie dzielone na 2 grupy po 6 i kodowane, jak pokazano poniżej, wzorem 01010
między grupami lewą i prawą. W tej tabeli wymieniono wzór dla każdej liczby. Należy pamiętać, że wzór różni się w zależności od tego, czy cyfra znajduje się po prawej czy lewej stronie (umożliwia to skanowanie kodu kreskowego do góry nogami). Jednak wzór dla prawej jest odwrotny (zamień czarny na biały i odwrotnie) dla lewego.
Jeśli nie widzisz powyższego obrazu, jest to binarny odpowiednik każdej liczby.
# 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
Przykład
Powiedz, że masz UPC 022000 125033
. (To nie są liczby losowe. Zostaw komentarz, jeśli zrozumiesz ich znaczenie.) Zaczynasz od tej tablicy, która jest taka sama w każdym kodzie kreskowym:
101xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx01010xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx101
W przypadku cyfr każdy z nich zastępuje się odpowiednim kodowaniem dla strony (lewej lub prawej), na której jest włączony. Jeśli nadal jesteś zdezorientowany, zobacz poniższy obrazek.
Oto wynik w postaci binarnej z |
rurami oddzielającymi części.
101|0001101|0010011|0010011|0001101|0001101|0001101|01010|1100110|1101100|1001110|1110010|1000010|1000010|101
Wyzwanie
Napisz program, który wyprowadza kod kreskowy UPC-A do wprowadzenia przez użytkownika. Wymiary obrazu powinny wynosić 95 × 30 pikseli, przy czym każdy „bit” ma szerokość jednego piksela i wysokość 30 pikseli. Czarne paski są w, rgb(0, 0, 0)
a białe paski są konsekwentnie przezroczyste lub rgb(255, 255, 255)
.
Notatki
- Weź dane wejściowe ze standardowego wiersza poleceń lub wiersza poleceń albo napisz funkcję, która pobiera ciąg lub liczbę całkowitą (zwróć uwagę, że dane wejściowe mogą mieć zera na początku, a większość języków je usuwa lub zamienia liczbę na ósemkową).
- Wyjście obrazu w jeden z następujących sposobów:
- Zapisz go do wybranego pliku o nazwie i formacie (PNG, PBM itp.).
- Wyświetl go na ekranie.
- Wyjście danych pliku na standardowe wyjście.
- Nie możesz używać bibliotek lub wbudowanych kodów generujących kody kreskowe ( patrzę na ciebie, Mathematica ), chociaż możesz używać bibliotek graficznych lub graficznych.
- Ostatnia cyfra UPC jest zwykle cyfrą kontrolną , ale w tych celach nie musisz się o to martwić.
Przykłady
Oto kilka przykładów testowania kodu. Wyjście binarne podano również dla wygody.
Wejście: 012345678910
Wynik:
10100011010011001001001101111010100011011000101010101000010001001001000111010011001101110010101
Wejście: 777777222222
Wynik:
10101110110111011011101101110110111011011101101010110110011011001101100110110011011001101100101
Punktacja
To jest kod golfowy , więc wygrywa najkrótsza przesyłka (w bajtach). Tiebreaker przechodzi do najwcześniejszego postu.
źródło
["777777","222222"]
Odpowiedzi:
CJam,
5857 bajtówDrukuje Portable BitMap (ASCII) do STDOUT. Wypróbuj online.
Jak to działa
źródło
Rev 1 BBC BASIC, 155 znaków ascii, tokenizowane rozmiary plików 132 bajty
zaoszczędził kilka bajtów, wprowadzając przesunięcie 43 w
i
pętli. Aby uniknąć zerwania,MOD2
konieczne było dodanie dodatkowych 47 w sumie 90.To przesuwa kod kreskowy dalej od źródła, jak pokazano, jeśli jest to dopuszczalne:
Rev 0 BBC BASIC, 157 znaków ascii, tokenizowane rozmiary plików 137 bajtów
Pobierz tłumacza na http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
Domyślnym trybem ekranu jest czarny tekst na białym tle. Różni się od oryginalnego BBC BASC.
Wersja bez golfa z nadrukiem testowym
Obliczanie paska danych zależy
IF j<42
i musi być wykonane w jednym wierszu. W wersji bez golfa odbywa się to w trzech krokach. W wersji golfowej dwa ostatnie kroki są połączone w jedną wielką ekspresjęp=...
Musiałem odwrócić kolejność map bitowych, ponieważ używam
>>(j MOD 7)
do uzyskania dostępu do bitów, co oznacza, że najpierw uzyskuję dostęp do najmniej znaczącego bitu. Po zakończeniu wszystkie lewe mapy bitowe są dogodnie w zakresie ASCII.Typowe wyjście, wersja bez golfa, z wyjściem testowym
źródło
JavaScript ES6, 225 bajtów
Mogło być krótsze z funkcjami ES7, ale nie jestem pewien ich obsługi, więc trzymam się ES6. Przyjmuję również dane wejściowe jako tablicę. Dane wyjściowe to plik PBN . Jest też wiele do gry w golfa.
Jeśli zrobiłem coś złego, zostaw komentarz i na pewno to naprawię
źródło
Perl, 153 bajty
Skopiuj do pliku barcode.perl, a następnie uruchom w następujący sposób:
następnie wprowadź numer kodu kreskowego.
Wyjaśnienie:
Wzory bitów dla cyfr kodu kreskowego są przechowywane w ciągu i zastępowane cyframi wejściowymi za pomocą
y///
operatora transliteracji Perl . Każda wartość w ciągu podstawiania ma 48 (ASCII „0”), aby uniknąć znaków niedrukowalnych. Cyfry w drugiej połowie kodu kreskowego są odwrotnymi do tych z pierwszej połowy.Centralny wzorzec jest ustawiony na 0000000 (wzorzec, który inaczej nie mógłby się pojawić, zakodowany jako „A”, a następnie „0”), a następnie zastąpiony 01010 zamiast obsługiwać jego inną długość jako specjalny przypadek podczas
sprint
ing.źródło
Oktawa, 115 bajtów
Wersja wieloliniowa:
n
jest odpowiednikiem ASCII kodów cyfr po prawej stronie (były łatwiejsze do wprowadzenia niż lewa strona, ponieważ wszystkie były znakami wyświetlanymi). Następnie prosta konwersja dziesiętna na dwójkową z pewnymi irytującymi typami zmienia się z char na numeryczną.v
buduje końcowy ciąg binarny, a następnie powtarzamy go 30 razy i wysyłamy do konsoli.Przykładowe dane wyjściowe zawierające tylko 2 z 30 wierszy pokazanych w celu skrócenia:
Skompresowana moc wyjściowa:
Początkowo zamierzałem wyświetlić obraz, ale wysłanie danych wyjściowych do konsoli pozwoliło mi zaoszczędzić 9 bajtów. Możesz wyświetlić wyniki za pomocą
imshow
, ale wyświetla się1
jako biały i0
czarny, więc najpierw musisz odwrócić dane.źródło
Kobra - 218
źródło
JavaScript ES6, 199 bajtów
źródło
Python 2, 174 bajty
Wiem, że można grać w golfa.
Ciąg
s
jest tabelą binarną w pytaniu z lewą połową stołu jako lewą połową ciągu. Wartości są najpierw ANDowane przez 63, jeśli znajdują się w prawej połowie (usuń pierwszy 1), a następnie są przesuwane o 63, aby nadawać się do wydruku ASCII.BŁĄD: Aktualnie próbuję naprawić błąd. Wyjście pierwszego przykładu jest wyłączone przez jedną cyfrę kodu kreskowego. Jeśli to wymyślisz, daj mi znać.
źródło