7-segmentowe różnice

26

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 1i 2wynosi 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 12345i 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 ni n+1.
  • Możesz wyprowadzać dane poprzez STDOUT (lub najbliższą alternatywę), wartość zwracaną przez funkcję lub argument funkcji (out).

Punktacja

Obowiązują standardowe zasady , 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, 1999powinno dać 11. 11. Oto kilka innych większych przykładów:

n          7SD
1999        11
12345        1
999999      14
5699999     15
8765210248   1
Martin Ender
źródło

Odpowiedzi:

8

Galaretka , 25 22 21 20 bajtów

‘DṁDḟ"DFị9979482ḃ5¤S

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

tło

Najpierw zwiększamy wejście n i odrzucamy wszystkie cyfry n + 1 , które się nie zmieniły.

Na przykład, jeśli n wynosi 5699999 , otrzymujemy następujące.

n     : 5700000
n + 1 : 5699999
Result:  700000

Wszystkie cyfry w tym wyniku mają stałą liczbę segmentów, które muszą zostać przełączone. Możemy przekonwertować listę przełączników na bijective base 5, aby zaoszczędzić niektóre bajty.

digit:   1 2 3 4 5 6 7 8 9 0
toggles: 4 5 2 3 3 1 5 4 1 2

Wynik jest po prostu sumą poszczególnych przełączników.

Działa to w przypadku większości wartości n , ale należy zachować szczególną ostrożność, jeśli n + 1 ma więcej cyfr niż n . W takim przypadku wszystkie cyfry muszą być cyframi 9 , a my rozwiązujemy ten problem, odcinając końcowe 0 od n + 1 .

Na przykład, jeśli n wynosi 999999 , otrzymujemy następujące.

n     :  999999
n + 1 : 1000000
Result: 100000

Działa to, ponieważ wiodący 1 ocenia na 4 przełączniki (odległość między 0 a 1 ), podczas gdy faktyczna ilość przełączników wynosi 2 (odległość między 0 a 1 ), a pominięcie jednego końcowego 0 usuwa jego 2 przełączniki z sumy.

Jak to działa

‘DṁDḟ"DFị9979482ḃ5¤S  Main link. Argument: n

‘                     Compute n+1.
 D                    Convert n+1 from integer to base 10.
   D                  Convert n from integer to base 10.
  ṁ                   Mold the left result as the right result.
                      This chops of a 0 if n+1 has more digits than n.
    ḟ"D               Vectorized filter-false with the base 10 digits of n.
                      This removes the digits from n+1 that are identical to
                      the corresponding digits of n.
       F              Flatten the resulting list of lists.
         9979482ḃ5¤   Convert 9979482 to bijective base 5.
                      This yields [4, 5, 2, 3, 3, 1, 5, 4, 1, 2].
        ị             Retrieve the digits at the right that correspond to the
                      indices at the left.
                   S  Compute the sum of the results.
Dennis
źródło
10

JavaScript (ES6), 46 40 bajtów

f=n=>n?+"452331541"[n%10]||f(n/10|0)+2:2

Alternatywne sformułowanie, również 46 40 bajtów:

f=n=>n?26523308>>n%10*3&7||f(n/10|0)+2:2

Edycja: Zapisano 6 bajtów dzięki @xsot.

Neil
źródło
Jeśli operator logiczny lub operator w ES6 zachowuje się jak ten w pythonie, możesz dodatkowo skrócić swój drugi kod. Przykład można znaleźć w moim zgłoszeniu.
xsot
@xsot Właściwie mogę skrócić oba! Nie sądzę, żeby pomogło mi to zmienić specjalny przypadek zero, ponieważ to tylko 4 bajty.
Neil,
Wow, jestem zaskoczony, że pierwszy działa. Spodziewałem się błędu.
xsot
@xsot javascript po prostu nie popełnił błędu. Po prostu robi to, co wydawało się najbardziej poprawne, w ciągu tych dziesięciu dni, kiedy narodził się Javascript. . Późniejsze wersje pozwalają ci na nieco bardziej rygorystyczne zachowanie, ale dlaczego ktokolwiek miałby to zrobić? Zachowanie zwarciowe operatorów logicznych jest jednak dość powszechne, tylko PHP robi coś złego, zawsze zwracając wartość logiczną.
John Dvorak
@JanDvorak Właściwie byłem zaskoczony faktem, że możesz uzyskać dostęp do indeksu łańcucha większego niż długość łańcucha.
xsot
10

Python, 50 48 bajtów

f=lambda n:26523308-0**n*2>>n%10*3&7or f(n/10)+2

Wyjaś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ą 9cyfrę.

26523308to maska ​​bitowa, która koduje odwzorowanie cyfr 0-8. Kiedy n=0, co występuje tylko wtedy, gdy nzawiera tylko 9s, odpowiedź zostanie wyłączona o dwa. Jest to kompensowane przez wyrażenie 0**n*2. Jeśli chodzi o cyfrę 9, 2maska ​​bitowa ocenia się na zero, co wyzwoli wywołanie rekurencyjne podczas dodawania do 7SD.

xsot
źródło
Czy możemy wyjaśnić, w jaki sposób dokonuje się transformacja? Mam na myśli +1 za spryt, ale zgubiłem się w spryt.
97 CAD
8

05AB1E , 31 30 28 27 26 bajtów

Kod:

9Ü©T%•2X›ùì•sè¹g®g-·¹Ú9Q·O

Objaśnienie ( nieaktualne ):

9Ü                              # Trim off trailing 9's
  ©                             # Copy this into the register
   T%                           # Get the last non-9 digit
     žh                         # Short for 0123456789
       •2X›ù앧                 # Compressed version of 4523315412
               ‡                # Transliterate

Zmieniamy następujące na ostatnią cyfrę inną niż 9:

0 -> 4
1 -> 5
2 -> 2
3 -> 3
4 -> 3
5 -> 1
6 -> 5
7 -> 4
8 -> 1
9 -> 2

W szczególnych przypadkach:

                ¹g              # Get the length of the input
                  ®g            # Get the length of the input with all trailing 9 gone
                    -           # Substract, giving the number of 9's at the end of 
                                  the input
                     2*         # Multiply by two
                       O        # Sum everything up
                        ¹Ú      # Uniquify the input
                          9Qi   # If this is equal to 9 (only 9's in the input)
                             Ì  #   Increment by 2 (_ -> 1)

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .

28 bajt alternatywa: D[¤©•2X›ùì•sès®9Ê#¨]\rÚ9Q4*O.

Adnan
źródło
3

MATL , 61 39 36 bajtów

tQvV15\'3dAsMh818RG5'6Y27WZaw)Z}Z~Bz

Wypróbuj online!

Wyjaśnienie

tQv            % Implicit input. Duplicate, add 1, concatenate vertically
V              % Convert to 2D char array: each number in a row, possibly left-padded 
               % with a space
15\            % Modulo 15. With modular indexing this corresponds to the order
               % '9', ' ', '0', '1', ..., '8'
'3dAsMh818RG5' % This string encodes active segments for each of the 11 chars
6Y2            % Source alphabet printable ASCII chars (predefined literal)
7W             % Target alphabet: [0 1 ... 127]
Za             % Base conversion: decode string into vector of 11 numbers, where each
               % number from 0 to 127 encodes the 7-segment representation of a digit,
               % in the order '9', ' ', '0', '1', ..., '8'
w              % Swap top two elements in stack
)              % Use as index. Gives 2-row array, where each column is a digit 
Z}             % Split into the two rows
Z~             % Bitwise XOR, elementwise
B              % Convert to binary. Each number gives a row
z              % Number of nonzero elements. Implicitly display
Luis Mendo
źródło
3

Julia, 44 bajty

!x=x<1?2:(t=x%10÷1)<9?3045058÷6^t%6:2+!.1x

Wypróbuj tutaj.

Dennis uratował bajt!

Lynn
źródło
1
Z ciekawości dlaczego nie użyć liczb?
Conor O'Brien,
Nie mogę uwierzyć, że jest Julia TIO. Welp, czas na naukę Julii, a potem ...
Mama Fun Roll
3

Python, 71 66 bajtów

48 bajtów xsot . Jeszcze więcej magicznych matematyki!

f=lambda n:(2+f(n/10)if n%10==9else 26523308>>n%10*3&7)if n else 2

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.

CAD97
źródło
możesz zabrać miejsce po9
Maltysen
@Maltysen najwyraźniej masz rację. Myślałem, że to błąd, ponieważ ejest to poprawna litera po cyfrze, na przykład 9e9.
97 CAD
To dłużej niż moja odpowiedź Java ! Jak możemy temu zaradzić? Zwróć uwagę, że odwrócenie porównania z n%10==9na n%10<9nie powoduje zapisania, ponieważ if nie potrzebuje spacji w tej kolejności.
97 CAD
Wracam, aby zobaczyć, że xsot stworzył znacznie krótszą wersję Pythona. Dobra robota!
97 CAD
2

Jolf, 32 bajty

Ώ?H?<γ%Ht9P."452331541"γ+2Ώc/Ht2

Wypróbuj tutaj!

Wyjaśnienie

To jest transpozycja odpowiedzi Neila.

Ώ?H?<γ%Ht9P."452331541"γ+2Ώc/Ht2
Ώ                                 define a function Ώ of H
 ?H                            2  (when H is zero, return is 2)
      %Ht                         H mod 10
     γ                            γ = ^
   ?<    9                        is it less than 9?
                                  if so:
           ."452331541"γ           get the γth element of that string
          P                        as a number
                                  else
                        +2         add two to
                          Ώ        Ώ over
                           c/Ht    int(H / 10)
Conor O'Brien
źródło
2

Pyth - 78 30 27 bajtów

Ten pierwszy był zawstydzający.

s@LjC"
(J"ThC{I#.tjRThBQT

Pakiet testowy .

Maltysen
źródło
26 bajtów
Leaky Nun
26 bajtów
Leaky Nun
0

J, 53 bajty

2:`((2+10$:@<.@%~[)`(6|3045058<.@%6^])@.(9>])10&|)@.*

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

2:`((2+10$:@<.@%~[)`('452331541'".@{~])@.(9>])10&|)@.*

Stosowanie

   f =: 2:`((2+10$:@<.@%~[)`(6|3045058<.@%6^])@.(9>])10&|)@.*
   f 1999
11
   f 1999 12345 999999 5699999 8765210248
11 1 14 15 1
mile
źródło
0

Retina , 34 bajty

M!`.9*$
^9
0
T`d`4523315412
.
$*
.

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 9zmiany niebędące cyframi zwiększają się. Tak też działa ta odpowiedź.

M!`.9*$

Odpowiada to ( M) wyrażeniu regularnemu, .9*$tj. Pierwszej cyfrze oddzielonej tylko 9s od końca. !Mówi Retina wymienić wkład z tego meczu, odrzucając wszystko, co nie ma wpływu na 7SD.

^9
0

Jeśli dane wejściowe zaczynają się teraz od 9tego, oznacza to, że samo dane wejściowe składały się tylko z 9s, więc 7-segmentowy wyświetlacz musi poprzedzić, 1który kosztuje 2. Najprostszym sposobem na poradzenie sobie z tym jest zastąpienie wiodącej 9w tym przypadku przez 0, ponieważ koszt inkrementacji 9(do 0) jest, 2a koszt inkrementacji 0(do 1) jest 4, więc podnosi to całkowity koszt 2zgodnie z wymaganiami.

T`d`4523315412

Teraz mamy etap transliteracji, który zastępuje każdą cyfrę kosztem jej zwiększenia (ponieważ drozwija się do 0123456789). Zauważ, że jest to pierwsza subdiagonalna tabeli 7SD.

.
$*

Zastępuje każdą cyfrę nz nkopiami 1, 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ą.

Martin Ender
źródło