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, że String
jest równoważna{#Char}