Sztuka skradziona z Jakiego rozmiaru jest cyfra?
7-segmentowe cyfry mogą być reprezentowane w ASCII za pomocą _|
znaków. Oto cyfry 0-9
:
_ _ _ _ _ _ _ _
| | | _| _| |_| |_ |_ | |_| |_|
|_| | |_ _| | _| |_| | |_| _|
Twoim zadaniem jest parsowanie sztuki w normalne liczby.
Uwagi na temat liczb
- Każda cyfra ma inną szerokość.
1
ma szerokość1
3
i7
są2
szerokie245689
i0
wszystkie są3
szerokie
Również między każdą cyfrą jest jeden znak wypełnienia. Oto pełny zestaw znaków:
// <- powinna być jedna spacja, ale pomieszane zostało formatowanie SE | | ------------- _ _ | | _ ------------- _ _ | _ | ------------- | _ | | ------------- _ | _ _ | ------------- _ | _ | _ | ------------- _ | | ------------- _ | _ | | _ | ------------- _ | _ | _ | ------------- _ | | | _ |
Wkład
Dane wejściowe mogą być albo z konsoli, albo jako ciąg argumentu do funkcji.
Wydajność
Dane wyjściowe są umieszczane w konsoli lub zwracane przez funkcję.
Przykłady:
_ _ _
| | | |_
| | | |_|
1776
_ _ _
_| | | | |_
|_ |_| | |_|
2016
_ _
| |_| |_| |_
| _| | _|
1945
_ _ _ _ _ _
| | | | | | | | | | | | |
| |_| |_| |_| |_| |_| |_|
1000000
_ _ _ _ _ _ _ _
| | | _| _| |_| |_ |_ | |_| |_|
|_| | |_ _| | _| |_| | |_| _|
0123456789
To jest golf golfowy, więc wygrywa najkrótsza liczba bajtów!
Odpowiedzi:
Pyth,
3330 bajtówOto pomysł: kiedy transponujemy dane wejściowe i podzielimy je na cyfry, możemy sortować poszczególne ciągi cyfr i przypisywać je do ich wartości.
Wypróbuj tutaj .
źródło
Rubinowy, 184 bajty
Wyjaśnienie
To mój pierwszy golf. Dzięki za zabawę!
źródło
Pyth, 39 bajtów
To wydaje się działać? Wypróbuj online .
źródło
Japt, 119 bajtów
Try it here!
O rany, ten jest naprawdę długi. Chyba nie skończyłem grać w golfa.
Wyjaśnienie
Przygotowanie
Pobieramy dane wejściowe i przekształcamy dowolne
|_
na1
. Następnie dokonujemy transpozycji, usuwamy spacje końcowe i dzielimy wzdłuż podwójnych linii.Tłumaczenie
Mapujemy wynikową tablicę i znajdujemy indeks, w którym formularz pojawia się w tablicy referencyjnej. Oto schemat, który pomoże:
Następnie dołączamy do tablicy liczb i wyników!
UWAGA : Być może zastanawiasz się, dlaczego musimy zmienić każdą postać graficzną na serię 1. Jest tak, ponieważ wydaje się, że występuje błąd (lub coś w tym rodzaju), który nie pozwala mi przechowywać znaków w takim stanie, w jakim są
|_
.źródło
_
błąd, ale nie wiem, co go spowodowało."\n\n"
można zastąpićR²
, i"\\||_"
z"%||_"
. Myślę, że może także zaoszczędzić trochę bajtów poprzez zakodowanie długi ciąg w bazie 4 (zmiana każdego z 4 disinctive zwęgla się0
,1
,2
, lub3
, wyściółka o długości do wielokrotności 4, następnie działar"...."_n4 d}
na niego), ale z jakiegoś powodu , Nie udało mi się jeszcze tego uruchomić.Python2,
299261244 bajtówNaprawdę podobało mi się to wyzwanie, dobra robota!
Wyjaśnienie
Funkcja
s
przyjmuje trzy wiersze jako dane wejściowe, próbuje znaleźć separację cyfr (wszystkie znaki są spacjami). Po znalezieniu takiego rozdziału wzywas
resztę trzech wierszy i dodaje wartość zwracaną przez wywołanie do trzech wierszy składających się na cyfrę. Jeśli nie ma separacji, oznacza to, że jest tylko jedna cyfra.Ta funkcja
p
jest punktem wejścia, więc wymaga ciągu reprezentującego cyfry. Cyfry są przechowywane jako „skrót” obliczony wsum(ord(c)**i for i,c in enumerate("".join(n)))%108
celu zaoszczędzenia miejsca (dzięki innym odpowiedziom!).Przykład
Inne wersje
261 bajtów (py3):
249 bajtów, ten transponuje linie (py2):
źródło
JavaScript (ES6), 169 bajtów
Zaczyna się od podziału na trzy linie, ponownego mapowania każdej kolumny na wartość, a następnie budowania unikatowej tożsamości dla każdej kolumny na podstawie tych wartości. Następnie dzieli się według
0
(tożsamość przestrzeni między kolumnami) i ostatecznie mapuje każdą tożsamość na wartości liczbowe, które konkatenuje i wyprowadza.źródło
join
sznurek, aby móc go podzielić. Wierzę, że możesz to zrobić również w Pythonie?Python 3,
281254 bajtówEdytować
Właśnie spojrzałem na kod dla drugiej odpowiedzi Pythona i zauważyłem, że znaczna część kodu jest podobna. Zostało to osiągnięte niezależnie.
(dodano nowe linie dla „czytelności”)
Nie golfowany:
Testy:
Jak to działa
(Uwaga: wyjaśniam tutaj program bez golfa, ponieważ jest bardziej czytelny i ma dokładnie ten sam kod, z wyjątkiem tego, że
digit
funkcja jest wbudowana w lambda)Główną funkcją jest
parse
. Najpierw dzieli dane wejściowe na linie i tworzynumbers
tablicę.To moja ulubiona część (ponieważ tyle czasu zajęło jej zrozumienie). Tutaj mamy
zip
linie, dzięki czemu możemy zasadniczo pionowo przechodzić dane wejściowe. Gdy wiersz zawiera znaki, dodajemy go do ostatniej liczby wnumbers
tablicy. Jeśli nie ma na nim żadnych znaków, dodajemy nowy numer do tablicy.Bardzo proste,
numbers
jest mapowane za pomocądigit
funkcji i konwertowane na ciąg znaków.To jest (dość) proste.
fingerprint
to ciąg znaków cyfr utworzonych powyżej minus 2 pierwsze znaki (był to najmniejszy odcisk palca, jaki udało mi się znaleźć). Zwracamy indeks pierwszego dopasowania.źródło
Haskell,
270207 bajtówNie bądź zbyt trudny, to mój pierwszy program haskell;) Jestem prawie pewien, że można dalej grać w golfa, ale nie wiem, skąd moja ograniczona znajomość języka.
Nie golfowany:
Ogromne podziękowania dla @nimi za wskazówki!
źródło
import Data.List
liczbę bajtów. Dobre wiadomości: a) jeśli zostałyData.Lists
zainstalowane można go importować i zastąpić zamiasta
zsplitOn
:...map c$splitOn[" "]$transpose...
a...f<-splitOn",""|_...
. b)intercalate "" n
jestconcat n
lubid=<<n
. c) zastąpićres
jedną literą. d) stosowanie wzorca strzeże zamiastlet ... in
:c n|e<-drop 2$id=<<n,Just r<-elemIndex ... ]=(show r)!!0
.=<<
robi? Ani dokumenty hoogle, ani podpis typu nie są dla mnie bardzo pomocne.=<<
w kontekście listy jest toconcatMap
, że mapuje daną funkcję na liście i łączy wyniki w jedną listę.>>=
robi to samo, ale z odrzuconymi argumentami.id =<< n
(lubn >>= id
) odwzorowuje funkcję tożsamości na liście (listach), tzn. nie robi nic z listami podrzędnymi i łączy je. Więc to jest tak samo jakconcat
.