Dzięki Twojej pomocy w wyzwaniu Oznacz moją pocztę , PPCG-Post pomyślnie stempluje wszystkie swoje paczki wygenerowanymi kodami kreskowymi!
Czas je rozszyfrować.
W tym wyzwaniu Twój program, biorąc pod uwagę kod kreskowy wygenerowany z wyzwania Mark My Mail , dekoduje go i zwraca zakodowaną liczbę całkowitą.
Ale uważaj! Kod kreskowy może być odwrócony ...
4-stanowe kody kreskowe
W przypadku pominięcia wyzwania kodowania musisz wiedzieć, o jakich kodach kreskowych mówimy. 4-stanowy kod kreskowy to rząd pasków z czterema możliwymi stanami, z których każdy reprezentuje liczbę całkowitą base-4:
| |
Bar: | | | |
| |
Digit: 0 1 2 3
Renderowane w ASCII, kody kreskowe zajmą trzy linie tekstu, używając |
znaku potoku ( ) do reprezentacji części paska oraz spacji ( ) do reprezentacji pustej sekcji. Pomiędzy każdym taktem będzie jedna spacja. Przykładowy kod kreskowy może wyglądać następująco:
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Aby przekonwertować kod kreskowy z powrotem na liczbę całkowitą, którą koduje, zamapuj każdy słupek na odpowiadającą mu 4 cyfrę podstawową, połącz je i przekonwertuj na dziesiętny.
Ponieważ każdy kod kreskowy będzie również reprezentował inny kod kreskowy, odwrócone do góry nogami, implementujemy sekwencję start / stop, aby można było obliczyć orientację. 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, biorąc pod uwagę 4-stanowy kod kreskowy ASCII, parsować go i zwracać liczbę całkowitą, którą koduje - zasadniczo odwrotność Mark My Mail .
Ale aby urozmaicić wszystko, jest pewien haczyk - kod kreskowy może zostać podany do góry nogami. Podobnie jak w prawdziwym świecie, pozostawienie czytnika kodów kreskowych (twojego programu) ustalenie prawidłowej orientacji za pomocą sekwencji start / stop będzie pozostawione .
Przykład:
Biorąc pod uwagę następujący kod kreskowy:
| | | | | | | | | | | | | | | | | | | |
Widzimy wyraźnie, że pierwsza i ostatnia para cyfr są, 0, 2
a nie są 1, 0
. Oznacza to, że kod kreskowy jest odwrócony - więc musimy go obrócić o 180 stopni (nie tylko odwrócić każdy pasek), aby uzyskać prawidłową orientację:
| | | | | | | | | | | | | | | | | | | |
Teraz możemy rozpocząć dekodowanie. Mapujemy każdy słupek na odpowiadającą mu cyfrę podstawową 4, ignorując sekwencje start / stop, ponieważ nie kodują danych.
| | | | | | | | | | | | | | | | | | | | - - 2 1 0 3 0 2 3 - -
Łączymy to z liczbą całkowitą base-4 2103023
, a następnie przekształcamy do postaci dziesiętnej w 9419
celu uzyskania ostatecznego wyniku.
Zasady
- Dane wejściowe zawsze będą prawidłowym, 4-stanowym kodem kreskowym, renderowanym w ASCII, jak określono powyżej, z opisaną sekwencją start / stop.
- Możesz poprosić o końcowe spacje lub linie rozebrane, a także o spację nowej linii - w zależności od tego, który format pasuje do gry w golfa.
- Może, ale nie musi być w prawidłowej orientacji - twój program musi ustalić, czy odczytać go do góry nogami, używając sekwencji start / stop.
- Nie koduje wiodących cyfr zerowych w liczbie całkowitej base-4.
- Możesz wziąć dane wejściowe jako listę linii lub ciąg znaków z nowymi liniami.
- Dane wyjściowe powinny być liczbą całkowitą w standardowej podstawie liczb całkowitych w języku użytkownika, reprezentującą dane zakodowane przez kod kreskowy.
- Ponieważ znaczki pocztowe są małe i mogą na nich zmieścić bardzo mało kodu, twój kod musi być możliwie jak najkrótszy: to jest gra w golfa - więc wygrywa najkrótszy program (w bajtach)!
Przypadki testowe
| | | | | | | | | | | | | |
= 4096 (odwrócony)
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
= 7313145 (odwrócony)
| | | | | | | | | | | | | | | | | | | |
= 9419 (odwrócony)
| | | | | | | | | | | | | | | | | | |
= 990 (bez odwrócenia)
| | | | | | | | | | | | | | | | | | |
= 12345 (nieodwrócone)
[String]
,[{#Char}]
,[{Char}]
,[[Char]]
?, Zważywszy, żeString
jest równoważna{#Char}
Odpowiedzi:
Galaretka , 18 bajtów
Wypróbuj online!
źródło
Łuska , 16 bajtów
Wypróbuj online!
Dane wejściowe to lista wierszy (łącze TIO używa łańcucha wielowierszowego dla zachowania przejrzystości). Linie muszą mieć równe długości i nie mogą być dodatkowe spacje końcowe.
Wyjaśnienie
źródło
SOGL V0.12 ,
4032 bajtówWypróbuj tutaj!
źródło
Python 2 ,
113105 bajtówWypróbuj online!
źródło
Python 2 , 96 bajtów
Wypróbuj online!
źródło
Retina , 71 bajtów
Wypróbuj online! Link zawiera mniejsze przypadki testowe. Wymaga, aby pierwsza i ostatnia linia była wypełniona spacją do długości linii środkowej. Wyjaśnienie:
Usuń niepotrzebne spacje.
Odwróć znaki w kodzie, ale jeśli kod paskowy zaczyna się od a
|
, wybierz cały kod, w przeciwnym razie podziel go na znaki. Następnie odwróć je. Spowoduje to odwrócenie kodu, jeśli zaczyna się od0
.Usuń sekwencję start / stop i środkowy wiersz (który nie jest dla nas przydatny).
Konwertuj spacje
|
is z bazy 4 na unary.Podwój ostatnią linię.
Konwertuj na dziesiętny.
źródło
Java (OpenJDK 8) ,
181160 bajtówNie jestem zbyt odrażający jak na rozwiązanie Java, jestem pewien, że mogę dokonać optymalizacji, ale już na to gapiłem się zbyt długo.
Zmniejsz kilka bajtów, skracając pętlę zamiast używając podciągów.
Grał w golfa
Wypróbuj online!
Bez golfa
źródło
l+~i
zamiastl-1-i
Java 8 ,
208166157151 bajtówWypróbowanie go, prawdopodobnie może być lepsze, zmniejszyło 42 z powodu niepotrzebnych kontroli, -9 usunięcie zmiennych, -6 dzięki Luke Stevens
Dane wejściowe to
char[][3]
bez golfa:
źródło
Czysty ,
191...161144 bajtówWypróbuj online!
źródło
Pip ,
464342 bajtyPobiera wiersze kodu kreskowego jako trzy argumenty wiersza poleceń. Pierwsza i trzecia linia muszą być wypełnione do długości drugiej linii spacjami. Wypróbuj online!
Wyjaśnienie
Najpierw trochę przygotowań:
Teraz zauważ, że jeśli zignorujemy środkowy wiersz i traktujemy
jako 0, każdy słupek jest tylko 2-bitową liczbą binarną:
|
jako 1 iźródło
Łuska ,
3938 bajtówPobiera dane wejściowe jako listę ciągów: Wypróbuj online lub wypróbuj pakiet testowy!
Wyjaśnienie
źródło
Perl 5 , 152 + 2 (
-F
) bajtówWypróbuj online!
źródło
Oktawa ,
807568 bajtówWypróbuj online!
Co ciekawe,
bi2de
domyślny MSB jest po prawej stronie, a nie po lewej stronie, co prowadzi do pewnych bólów głowy podczas jego tworzenia ... Myślę, że powinienem mieć optymalny sposób odwrócenia tablicy przed jej zindeksowaniem, ale istnieje bardzo wiele sposobów na zrobienie tego ( zarówno w pierwszej indeksacji lub zflipud
,fliplr
,rot90
,'
(transpozycji), ostateczna indeksowanie ...). Pobiera prostokątny układ ze spacjami|
is (wymagane są spacje końcowe)źródło
JavaScript (ES6),
184181 bajtówNie jestem doświadczonym golfistą - jestem pewien, że można to poprawić, ale uwielbiałem to wyzwanie! Zawsze zastanawiałem się nad tymi znakami.
Funkcja
f
przyjmuje listę ciągów znaków z wymaganymi końcowymi spacjami. Nowe wiersze dodane do kodu poniżej dla przejrzystości (nieuwzględnione w liczbie bajtów).Stosowanie
Wersja bez golfa z wyjaśnieniem
źródło