4-stanowe kody kreskowe
Wiele usług pocztowych (Royal Mail UK, Canada Post, US Mail itp.) Używa 4-stanowego kodu kreskowego do kodowania informacji o swojej poczcie. Renderowane w ASCII może wyglądać mniej więcej tak:
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
4-stanowy kod kreskowy to rząd pasków. Każdy słupek może być przedłużony w górę, w dół lub oba, co daje 4 możliwości. Oznacza to, że każdy słupek zasadniczo reprezentuje podstawową 4 cyfrę:
| | Bar: | | | | | | Cyfra: 0 1 2 3
Problem z tą symboliką polega na tym, że każdy kod kreskowy jest prawidłowym, innym kodem kreskowym do góry nogami: drastycznie zmienia znaczenie, jeśli orientacja jest nieprawidłowa. Dlatego rozruch i zatrzymanie sekwencji są zwykle realizowane tak, że skaner można obliczyć, w jaki sposób jest on powinien być odczytany.
Do celów tego wyzwania wykorzystamy sekwencję start / stop określoną przez Australia Post: każdy kod kreskowy zaczyna się i kończy 1 0
sekwencją.
Wyzwanie
Twoim zadaniem jest napisanie programu lub funkcji, która przy dodatniej liczbie całkowitej N
przekształci go w 4-stanowy kod kreskowy ASCII, w którym każdy słupek (z wyjątkiem sekwencji start / stop) reprezentuje cyfrę w reprezentacji base-4 N
.
Przykład:
Biorąc pod uwagę całkowitą 19623
, chcielibyśmy najpierw przekonwertować go do swojej bazy-4 reprezentacji 10302213
.
Następnie zamapowalibyśmy każdą cyfrę na odpowiednim pasku:
1 0 3 0 2 2 1 3 | | | | | | | | | | | | | | | |
Na koniec dodamy sekwencje start / stop:
Początek Koniec: 1 0 1 0 | | | | | | | | | | | | | | | | | | | | | |
Wynikowy kod kreskowy powinien stanowić wynik programu.
Zasady:
- Dane wejściowe będą dodatnią liczbą całkowitą w zakresie standardowej wielkości całkowitej twojego języka.
- Wyjście:
- Może być albo listą linii, albo łańcuchem zawierającym nowe linie.
- Może zawierać wiodące lub końcowe znaki nowej linii / spacje, o ile kształt pozostaje nienaruszony.
- Powinien wyświetlać kod kreskowy o powyższym formacie - musi używać znaku kreski (
|
) i znaku spacji () podczas rysowania pasków, a między każdym pionowym paskiem powinna znajdować się 1 spacja.
- To jest golf golfowy , więc wygrywa najkrótszy program (w bajtach)!
Przypadki testowe
4095:
| | | | | | | | | | | | | | | | | | | | | | | |
4096:
| | | | | | | | | | | | | |
7313145:
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
źródło
Odpowiedzi:
Python 3 ,
1039996 bajtówWypróbuj online!
źródło
MATL ,
34302928 bajtówWypróbuj online!
Wyjaśnienie
źródło
Galaretka ,
1615 bajtówWypróbuj online!
Jak to działa
źródło
.......
ale każda kropka oznacza inny bajt.Galaretka , 19 bajtów
Wypróbuj online!
-1 dzięki Mr. Xcoder .
źródło
Oktawa ,
78 77 75 74 7069 bajtówWypróbuj online!
W przeciwieństwie do pierwotnego podejścia, ta wykorzystuje prostą tablicę przeglądową do mapowania wartości base-4 na ich binarny odpowiednik. Tabela odnośników dodaje również odstępy między poszczególnymi słupkami, dodając zero między każdą liczbą (która odwzorowuje na słup wszystkich pól).
Tabela odnośników bezpośrednio odwzorowuje na paski:
Konwersja z pliku binarnego na
|
ijest teraz wykonywana przez indeksowanie w ciąg tych dwóch znaków - w zasadzie ta sama zasada, co tabela odnośników do konwersji binarnej.
* Zapisano 1 bajt, dzięki @LuisMendo
Oryginał:
Wypróbuj online!
Anonimowa funkcja, która zwraca kod kreskowy jako ciąg znaków.
Jest to oparte na tym, że jeśli dodamy 4 do base4 cyfr, wówczas możemy przedstawić słupek / spację przez liczbę przekonwertowaną na binarną z zamienionymi bitami 1 i 2:
Trudne z golfa jest dodanie odstępów między taktami i konwersja z
0/1
na'|'/' '
.źródło
JavaScript (ES6),
898783 bajtówPrzypadki testowe
Pokaż fragment kodu
W jaki sposób?
Uwaga : W poniższej wersji literały szablonów zostały zastąpione standardowymi łańcuchami, aby kod mógł być odpowiednio wcięty.
źródło
R ,
154109 bajtówWypróbuj online!
Zaoszczędzono całą masę bajtów, indeksując i wykorzystując
cat
zamiast konstruować macierz i używającwrite
, a także 6 z nieco innej konwersji na bazę 4. Drukuje z wiodącą spacją w każdym rzędzie i bez końcowych znaków nowej linii.Indeksowanie odbywa się za pomocą pewnej modularnej arytmetyki, podobnie jak inne odpowiedzi, ale ponieważ R używa indeksowania opartego na 1, arytmetyka jest nieco inna.
Wyjaśnienie:
źródło
Węgiel drzewny , 50 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Wpisz liczbę.
Wciśnij sekwencję zatrzymania do wstępnie zdefiniowanej pustej listy.
Jeśli liczba jest dodatnia,
wielokrotnie stosuj divmod, aby przekonwertować go na odwróconą bazę 4,
w przeciwnym razie po prostu go popchnij.
Wciśnij sekwencję początkową do listy.
Mapa nad trzema ciągami. Każdy ciąg reprezentuje tłumaczenie kodu kreskowego dla cyfr
0123
dla każdego wiersza.Odwzoruj cyfry (odwrócone z powrotem do zwykłej kolejności), przekonwertuj je na słupki lub spacje za pomocą tłumaczenia, a następnie połącz wyniki w trzy ciągi, które zostaną domyślnie wydrukowane w osobnych wierszach.
źródło
Japt ,
3231 bajtówPrzetestuj online!
Nie jestem jeszcze z tego zadowolony, ale to dopiero początek ...
Wyjaśnienie
źródło
Haskell ,
9190 bajtówWypróbuj online! Zwraca listę wierszy.
Ta sama liczba bajtów alternatywa dla pierwszego wiersza:
źródło
J ,
57 4947 bajtów10 bajtów dzięki FrownyFrog!
Jak to działa:
1 0,4&#.inv,1,0:
- konwertuje liczbę na listę 4 podstawowych cyfr, dodaje 1 0 na początku i na końcu listy((#:2 6 3 7){' |')
- tablica przeglądowa szyfrowania, binarne 0 odpowiada spacji, 1 do „|”{~
- szyfruje podstawową 4 cyfrę, wybierając ciąg z powyższej tabeli odnośników (argument odwrócony)|:
- transponuje wynikową tablicę z 3 kolumn do 3 wierszy[:
- zakrywa widelec,.2{."0
- umieszcza spacje między słupkamiWypróbuj online!
źródło
APL + WIN, 63 bajty
Wyjaśnienie:
źródło
Python 2 ,
116114 bajtów-2 bajty dzięki notjagan
Wypróbuj online!
źródło
05AB1E , 19 bajtów
Wypróbuj online!
Jest to połowa podejścia Dennisa, który jest tylko o jeden bajt krótszy niż metoda, którą stosowałem wcześniej (z czego jestem całkiem zadowolony):
05AB1E , 20 bajtów
Wypróbuj online!
Jak to działa?
Zapytałem Adnana (twórcę 05AB1E) o siatkę na czacie , a oni pomogli mi zaoszczędzić 2 bajty, wskazując funkcję 05AB1E: podczas łączenia list wielowymiarowych nowymi liniami, wewnętrzne listy są również łączone za pomocą spacji , więc
ðý
jest niepotrzebne.źródło
APL (Dyalog Classic) , 33 bajty
Wypróbuj online!
źródło
2⊥⍣¯1
jak uzyskasz listę binarną?2⊥⍣¯1
jest odwrotność („awers”?) „Dwu-dekodowania”. Koduje na binarny z tyloma bitami, ile potrzeba.J ,
42 4039 bajtówOgolono 2 bajty dzięki Dennisowi. 1 bajt dzięki ngn.
Wypróbuj online!
Jak to działa
źródło
JavaScript (ES6) 79 bajtów
Używa .toString do konwersji liczby na podstawę 4, a następnie rozróżnia poszczególne linie i bitowe LUB do budowania linii wyjściowej linia po linii. Wyświetla listę linii.
źródło
`10${n.toString(4)}10`
:)Bash + coreutils,
7167 bajtówWypróbuj online!
Wyjaśnienie
W
dc
bitowe nawróceni do podstawy 4, poprzedzenie i dołączając z4
(odwraca się10
do wyjścia) i stosującn
się utrzymać wszystko w jednym wierszu.Reszta dzieje się w
sed
:źródło
x
przestrzenie Hold / Pattern, aby je zmodyfikować, a następnie zrobićs
wszystko naraz, i nic nie było krótsze.Siatkówka , 83 bajty
Wypróbuj online! Link zawiera szybsze przypadki testowe. Wyjaśnienie:
Konwertuj na unary.
Konwertuj na bazę 4 jako liczby jednostkowe oddzielone
;
s.Przygotuj sekwencję początkową.
Dodaj a
;
, zamieniając go w terminator cyfrowy zamiast separatora, i sekwencję zatrzymania.Konwertuj na dziesiętne, ale dodając 1 do każdej cyfry.
Potrój to.
W pierwszym rzędzie
1
s i3
s (reprezentujące0
s i2
s) stają się spacjami.W ostatnim wierszu,
1
S i2
s (reprezentujący0
S i1
S) się przestrzenie.Wszystkie pozostałe cyfry stają się słupkami.
źródło
Pip ,
3331292726 bajtów25 bajtów kodu, +1 dla
-S
flagi.Wypróbuj online!
Wyjaśnienie
Obserwujemy wzór w czterech typach słupków:
Więc:
źródło
SOGL V0.12 , 28 bajtów
Wypróbuj tutaj!
źródło
C (gcc) , 176 bajtów
Wypróbuj online!
Nieco mniej strasznie sformatowane (mniej golfa):
Wyjaśnienie
Najpierw rozważ następujący kod, aby odczytać liczbę całkowitą i wyprowadzić wersję podstawową 4:
Wykorzystuje rekurencję ogona do odwrócenia kolejności danych wyjściowych. Każdy cykl rekurencyjny przesuwa się o 2 (odciąga ostatnie 2 bity i dzieli przez 4). Wyprowadza wynikową maskę bitów za pomocą 3 (0b11), która pokazuje tylko dwa ostatnie bity, czyli ostatnią cyfrę 4.
Wywołanie funkcji jest uwzględnione w
printf
argumencie końcowym (nie jest drukowane, ale jest oceniane), aby uniknąć konieczności używania {} (+2 bajty) do grupowaniaprintf
wywołania funkcji i.Rozwiązanie tutaj rozszerza ten kod base-4. Po pierwsze, m jest zdefiniowane jako n, ale w taki sposób, że w bazie 4 będzie miał 10 dodanych i dołączonych do niego. Następnie drukujemy m.
Podczas drukowania bazy 4 regularnie używaliśmy maski bitowej 3, aby uzyskać cyfrę. W kodzie pocztowym górny wiersz to bit niskiego rzędu tej cyfry (maska bitowa 1), a dolny wiersz to bit wysokiego rzędu (maska bitowa 2). W związku z tym
r
inf(n,r)
jest maską bitów - nasza główna funkcja wywołujef(m,1)
pierwszą linię if(m,2)
ostatnią linię.Aby linia środkowa działała (zawsze wypisuje „|”), dodajemy
||!r
do warunkowego - jeśli r wynosi 0, zawsze będzie oceniać jako prawda i wypisze „|”. Następnie wzywamyf(m,0)
do środkowej linii.Wreszcie chcemy, aby zachowywały się nowe linie. Dołączenie dodatkowego
printf
jest kosztowne, jeśli chodzi o bajty kodu źródłowego, dlatego zamiast tego dodajemy kolejny specyfikator% c do istniejącegoprintf
.n?32:10
wypisuje znak nowej linii, jeśli n wynosi 0 (fałsz), a spacja w przeciwnym razie. 32 i 10 są używane zamiast „\ n” i „” do zapisywania bajtów.źródło
f(n,r){n&&f(n>>2);printf("%c%c",n?32:10,(n&r|!r)&&n?'|':32);}main(n){scanf("%d",&n);f(n=(n+(4<<(32-__builtin_clz(n)/2*2)))*16+4,1);f(n,0);f(n,2);}
Common Lisp, 191 bajtów
Wypróbuj online!
źródło
PHP, 99 + 1 bajtów
wymaga PHP> = 5,5 dla dosłownego indeksowania ciągów i <7,1 dla indeksowania, aby nie wyświetlać ostrzeżenia.
Uruchom jako potok z
-nR
lub spróbuj online .Wstaw jeszcze jedną nową linię, aby uzyskać końcową.
źródło
Python 2,
142126 bajtówWielkie dzięki dla ovs!
Próbowałem nie kopiować metod innych odpowiedzi i ... fuj.
źródło
C # (.NET Core) , 160 bajtów
Wypróbuj online!
Jestem pewien, że przegapiłem kilka ulepszeń.
DeGolfed
t<51 & y != 1 & t-(y>>1) != 49
sprawdza, czy znak nie jest „3”, a nie drugi rząd, a następnie trochę magii binarnej, aby sprawdzić, czy pierwszy lub trzeci rząd powinien zawierać spację.źródło
Zsh ,
156154151133 bajtówWypróbuj online!
Pobiera dane wejściowe base-10 z var
$x
źródło
Japt , 42 bajty
Wypróbuj online!
źródło
Pyth , 32 bajty
Wypróbuj tutaj!
źródło
C, 120 bajtów
Niestety działa tylko w systemie Windows, ponieważ
itoa
jest to zbyt duża wygoda, aby być standardem.źródło