Myślę, że większość ludzi tutaj wie, czym jest 7-segmentowy wyświetlacz cyfr:
_ _ _ _ _ _ _ _
| | | _| _| |_| |_ |_ | |_| |_|
|_| | |_ _| | _| |_| | |_| _|
Możemy zdefiniować 7-segmentową różnicę (7SD) między dwiema cyframi, aby była liczbą segmentów, które muszą być przełączane, aby przełączać się z jednej na drugą. Np. 7SD między 1
i 2
wynosi 5 (trzy segmenty poziome i dolne dwa pionowe segmenty muszą być przełączane), a 7SD między 6 a 8 wynosi 1 .
Ponadto możemy zdefiniować 7SD między dwiema liczbami, aby były sumą 7SD między odpowiadającymi im cyframi. Jeśli jedna liczba jest dłuższa od drugiej, zakładamy, że są wyrównane do prawej i dodajemy liczbę segmentów potrzebną do wyświetlenia dodatkowych najbardziej znaczących cyfr większej liczby. Jako przykład rozważmy 7SD pomiędzy 12345
i 549
:
x: 1 2 3 4 5
y: 5 4 9
7SD: 2+5+2+0+1 = 10
Twoim zadaniem jest obliczenie 7SD między n i n + 1 , biorąc pod uwagę n .
Dla wygody, oto pełna tabela 7SD między poszczególnymi cyframi. Rząd _
reprezentuje pustą pozycję.
_ 0 1 2 3 4 5 6 7 8 9
_ 0 6 2 5 5 4 5 6 3 7 6
0 6 0 4 3 3 4 3 2 3 1 2
1 2 4 0 5 3 2 5 6 1 5 4
2 5 3 5 0 2 5 4 3 4 2 3
3 5 3 3 2 0 3 2 3 2 2 1
4 4 4 2 5 3 0 3 4 3 3 2
5 5 3 5 4 2 3 0 1 4 2 1
6 6 2 6 3 3 4 1 0 5 1 2
7 3 3 1 4 2 3 4 5 0 4 3
8 7 1 5 2 2 3 2 1 4 0 1
9 6 2 4 3 1 2 1 2 3 1 0
Wkład
- Dane wejściowe to pojedyncza dodatnia liczba całkowita
n
. - Możesz napisać program lub funkcję, przyjmując dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji.
- Możesz założyć, że dane wejściowe są co najwyżej o jeden mniejsze od największej liczby, którą może reprezentować standardowy typ liczb całkowitych w Twoim języku, o ile ten typ obsługuje co najmniej wartości do 127 włącznie.
Wydajność
- Powinieneś wydrukować jedną liczbę całkowitą, 7SD pomiędzy
n
in+1
. - Możesz wyprowadzać dane poprzez STDOUT (lub najbliższą alternatywę), wartość zwracaną przez funkcję lub argument funkcji (out).
Punktacja
Obowiązują standardowe zasady gry w golfa , wygrywa najkrótszy kod (w bajtach).
Przypadki testowe
Z jakiegoś niejasnego powodu ta sekwencja nie jest jeszcze w OEIS, chociaż istnieje ściśle powiązana sekwencja A123587 . Oto pierwsze 100 liczb (zaczynających się od n = 1, 2, 3, ...
):
5, 2, 3, 3, 1, 5, 4, 1, 4, 4, 5, 2, 3, 3, 1, 5, 4, 1, 7, 4, 5, 2, 3, 3, 1,
5, 4, 1, 4, 4, 5, 2, 3, 3, 1, 5, 4, 1, 5, 4, 5, 2, 3, 3, 1, 5, 4, 1, 5, 4,
5, 2, 3, 3, 1, 5, 4, 1, 3, 4, 5, 2, 3, 3, 1, 5, 4, 1, 7, 4, 5, 2, 3, 3, 1,
5, 4, 1, 6, 4, 5, 2, 3, 3, 1, 5, 4, 1, 3, 4, 5, 2, 3, 3, 1, 5, 4, 1, 6, 4
Pierwsze wejście, dla którego 7SD jest większe niż 9, 1999
powinno dać 11. 11. Oto kilka innych większych przykładów:
n 7SD
1999 11
12345 1
999999 14
5699999 15
8765210248 1
Python,
5048 bajtówWyjaśnienie
Ta funkcja działa na najmniej znaczącej cyfrze liczby
n
, sumując 7SD cyfr, gdy jest zwiększana o jedną, aż po pierwszą9
cyfrę.26523308
to maska bitowa, która koduje odwzorowanie cyfr0-8
. Kiedyn=0
, co występuje tylko wtedy, gdyn
zawiera tylko9
s, odpowiedź zostanie wyłączona o dwa. Jest to kompensowane przez wyrażenie0**n*2
. Jeśli chodzi o cyfrę9
,2
maska bitowa ocenia się na zero, co wyzwoli wywołanie rekurencyjne podczas dodawania do 7SD.źródło
05AB1E ,
3130282726 bajtówKod:
Objaśnienie ( nieaktualne ):
Zmieniamy następujące na ostatnią cyfrę inną niż 9:
W szczególnych przypadkach:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .
28 bajt alternatywa:
D[¤©•2X›ùì•sès®9Ê#¨]\rÚ9Q4*O
.źródło
Java, 63 bajty
Świat ma rację, gdy Python ponownie przechodzi przez Javę.
Bo wiesz, Java.
Zobacz na ideone
Maksymalnie w 2147483647, ponieważ jest to Java
Integer.MAX_VALUE
.To jest port mojej odpowiedzi w Pythonie, który jest portem odpowiedzi ES6 .
źródło
MATL ,
613936 bajtówWypróbuj online!
Wyjaśnienie
źródło
Julia, 44 bajty
Wypróbuj tutaj.
Dennis uratował bajt!
źródło
Python,
7166 bajtów48 bajtów xsot . Jeszcze więcej magicznych matematyki!
Zobacz na ideone
Ponieważ poprzednia odpowiedź w języku Python nie działa i jest daleka od optymalnej. Prosty port poprzedniej wersji ES6 . Teraz używam kręcenia bitów (z alternatywnego sformułowania ES6), aby wyciąć obsadę!
Można sprawić, by działał z Pythonem 3, jawnie używając floordiv dla bajtu +1.
źródło
9
e
jest to poprawna litera po cyfrze, na przykład9e9
.n%10==9
nan%10<9
nie powoduje zapisania, ponieważ if nie potrzebuje spacji w tej kolejności.Jolf, 32 bajty
Wypróbuj tutaj!
Wyjaśnienie
To jest transpozycja odpowiedzi Neila.
źródło
Pyth -
783027 bajtówTen pierwszy był zawstydzający.
Pakiet testowy .
źródło
J, 53 bajty
Pierwotnie oparty na rozwiązaniu @ Neil . Następnie poprawiono, zapisując bajt przy użyciu tej samej formuły w rozwiązaniu @ Lynn .
Wersja 54-bajtowa oparta na ciągu to
Stosowanie
źródło
Retina , 34 bajty
Wypróbuj online! (Pierwszy wiersz pozwala na przetwarzanie wielu przypadków testowych jednocześnie.)
Wyjaśnienie
Jak większość odkrytych do tej pory odpowiedzi, nie musimy korzystać z pełnej tabeli, ponieważ tylko najmniej znaczące
9
zmiany niebędące cyframi zwiększają się. Tak też działa ta odpowiedź.Odpowiada to (
M
) wyrażeniu regularnemu,.9*$
tj. Pierwszej cyfrze oddzielonej tylko9
s od końca.!
Mówi Retina wymienić wkład z tego meczu, odrzucając wszystko, co nie ma wpływu na 7SD.Jeśli dane wejściowe zaczynają się teraz od
9
tego, oznacza to, że samo dane wejściowe składały się tylko z9
s, więc 7-segmentowy wyświetlacz musi poprzedzić,1
który kosztuje2
. Najprostszym sposobem na poradzenie sobie z tym jest zastąpienie wiodącej9
w tym przypadku przez0
, ponieważ koszt inkrementacji9
(do0
) jest,2
a koszt inkrementacji0
(do1
) jest4
, więc podnosi to całkowity koszt2
zgodnie z wymaganiami.Teraz mamy etap transliteracji, który zastępuje każdą cyfrę kosztem jej zwiększenia (ponieważ
d
rozwija się do0123456789
). Zauważ, że jest to pierwsza subdiagonalna tabeli 7SD.Zastępuje każdą cyfrę
n
zn
kopiami1
, czyli przekształca każdą cyfrę jednoskładnikowa, a ponieważ nie ma separatory natychmiast dodaje je razem.Na koniec zliczamy liczbę znaków (tj. Liczbę dopasowań
.
) w wyniku, co konwertuje unarną sumę z powrotem na dziesiętną.źródło