Napisz funkcję lub program, który koduje ciąg znaków do kodu kreskowego w formacie Code 39 , w którym każdy znak jest kodowany jako pięć pasków oddzielonych czterema przerwami. Albo dwa słupki i jeden z odstępów są szerokie, a inne wąskie (kody 10 * 4), lub trzy z odstępów są szerokie i żaden z słupków nie jest (4 kody). Daje to 44 różne kody, z których jeden jest kodem zastrzeżonym używanym do oznaczenia początku i końca zakodowanego ciągu.
Wyzwanie
Dane wejściowe to ciąg zawierający tylko znaki z zestawu
1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ-. +/$%
Dane wyjściowe to ciąg kodowany jako ciąg kodu kreskowego. Wąska przerwa i przerwy między znakami są pojedynczą przestrzenią, a szeroka przerwa to trzy spacje. Wąski słupek jest sekwencją bajtów UTF-8 dla znaku Unicode „Pełny blok”, █, tj. 0xE2 0x96 0x88
A szeroki słupek to trzy takie sekwencje bajtów / znaki ( ███
). Pełna lista kodów to:
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
Słupki i spacje są przeplatane, zaczynając od słupka, więc na przykład Q to
bar 0 0 0 1 1
code █ █ █ ███ ███
space 0 0 0 1
Po zakodowaniu wszystkich znaków ciąg jest rozdzielany na obu końcach znakiem █ █ ███ ███ █
. Przerwa między znakami, pojedyncza spacja, jest wstawiana między każdą literę. Twoje rozwiązanie może generować końcowe spacje i końcowy znak nowej linii (w tej kolejności).
Przykłady
"" → "█ █ ███ ███ █ █ █ ███ ███ █"
"A" → "█ █ ███ ███ █ ███ █ █ █ ███ █ █ ███ ███ █"
"C++" → "█ █ ███ ███ █ ███ ███ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ███ ███ █"
"GOLF" → "█ █ ███ ███ █ █ █ █ ███ ███ ███ █ ███ █ █ █ ███ █ █ ███ █ ███ ███ █ █ █ █ ███ ███ █"
Standardowe formaty wejścia / wyjścia są dozwolone, a standardowe luki są niedozwolone. To jest golf golfowy , więc wygrywa najkrótszy kod mierzony w bajtach!
#
postaci jest niesprawiedliwe , ponieważ na przykład"#"
nie jest to jedyny powód, dla którego można ją zastosować w języku.Odpowiedzi:
JavaScript (ES6),
225212 bajtówZaoszczędzono 4 bajty dzięki @ l4m2
Wypróbuj online!
W jaki sposób?
Tabelę można zmienić w taki sposób, aby 9-bitowa maska binarna znaku została szybko wydedukowana z wiersza i kolumny przy użyciu następującego wzoru:
z:
źródło
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)Czerwony ,
452445 bajtówWypróbuj online!
Spróbuję dalej grać w golfa, ale nie oczekuję wiele od tego naiwnego rozwiązania.
źródło
Java 10, 455 bajtów
Wypróbuj online.
Wyjaśnienie:
źródło
C (gcc) ,
311, 303 bajtówWypróbuj online!
-8 dzięki pułapce cat
Wykorzystuje strategię kodowania z odpowiedzi Arnaulda. Łącze TIO zawiera
-w
przełącznik i płytę kotła do usuwania ostrzeżeń, są one niepotrzebne i dlatego nie są uwzględniane w zapisie.Oprócz schematu kodowania wyjaśnionego przez Arnaulda, drugą sztuczką jest utrzymanie
w
zmiennej jako przełączania między 2 a 0 (w=2*!w
). To pozwala mi wybierać pomiędzy pierwszym i drugim ciągiem wb
. Pierwsza to spacja, druga to wypełniony prostokąt.źródło
C (gcc) ,
241 239 227 213207 bajtówWypróbuj online!
Na podstawie implementacji @ LambdaBeta .
Nieco mniej golfa:
źródło
Węgiel drzewny , 90 bajtów
Wypróbuj online! Uwaga: końcowe miejsce. Link jest do pełnej wersji kodu. Wyjaśnienie:
Zawiń ciąg wejściowy ws,
*
a następnie zamapuj go dwukrotnie, ostatecznie łącząc wynik ze spacjami. W przypadku drugiej mapy istnieje dodatkowa mapa w niejawnym zakresie0..4
, w której dwa podciągi są łączone, a wyniki te są następnie łączone z uprzednio zdefiniowaną stałą pustego ciągu.W przypadku pierwszej mapy wewnętrznej utwórz ciąg utworzony przez dodanie cyfr przyrostowych, wielkich liter alfabetu i symboli
-. *+/$%
oraz wyszukaj pozycję zamapowanego znaku wejściowego. Na przykładC++
odwzorowałby na[12, 40, 40]
.Pierwszy podciąg reprezentuje spacje przed słupkami. Przed pierwszym słupkiem nie ma nic, ale pozostałe słupki zależą od położenia odwzorowanego znaku wejściowego: jeśli ma ponad 39, to tylko jedno miejsce ma jedno miejsce, a jeśli jest poniżej 40, to tylko jedno miejsce ma trzy spacje, a pozycja jest również konwertowana na kolumnę dzieląc ją przez 10. Jeśli indeks kolumny i pętli różnią się o 2 (moduł 4), to jest to miejsce nieparzyste.
Drugi podciąg reprezentuje słupki. Jeśli pozycja jest większa niż 39, zawsze jest jeden pasek, w przeciwnym razie pozycja jest sprawdzana w szeregu bitów odwzorowanych na znaki. Na przykład, jeśli pozycja wynosi 12, to jest ona indeksowana cyklicznie do znaku
'
, który jest100111
w postaci binarnej, co wskazuje na szerokie słupki w kolumnach 1 i 2. (Przewodzenie1
jest ignorowane, po prostu zapewnia spójną liczbę bitów).źródło
Perl 5 , 244 bajtów
Wypróbuj online!
Zawiera wiele niedrukowalnych i wysokobajtowych znaków, link TIO stanowi
xxd
reprezentację. Miałem nadzieję, że skończy się to mniej, i być może nadal będę w stanie spakować dane w bardziej wydajny sposób, więc zobaczę, jak pójdę. To tworzy wszystkie permutacje," "," ","█","███"
a następnie odwzorowuje oznaczenia z listy na odpowiednie znaki.źródło
Haskell ,
275270 bajtówWypróbuj online!
Operator,
x!n
który oblicza cyfry x podstawy bazy n, jest używany dwukrotnie do dekompresji kodów. Kody są najpierw kompresowane jako ciągi binarne o szerokości = 1 i wąskim = 0, bez względu na kolor, npR↔10000110↔262
. Liczby te są następnie sortowane i różnicowane, aby uzyskać liczby z zakresu [3,66], które są kompresowane odwrotnością algorytmu cyfr binarnych as0x117CDBC49F9EEEF11C3A659CACB31236
. Zawiera tylko połowę kodów, reszta to ich rewersy.Nie golfowany:
źródło