Przewijanie siedmiu segmentów

15

Piaskownica

Wprowadzenie

Panele informacyjne są wszędzie. Gdy technologia stała się tańsza, papierowe plakaty zostały przekształcone w świecące znaki, które pokazują słowa, które pojawiają się z jednej strony i wychodzą z drugiej, tak jak to na rysunku:

wprowadź opis zdjęcia tutaj

Kiedy jeden z tych znaków zaczyna się, zwykle zaczyna się pusty, a tekst opuszcza się z prawej strony na lewą, przesuwając się, aż zniknie.

Jego funkcją jest włączanie i wyłączanie małych żarówek (LED), aby dać wrażenie ruchu.

Jeśli zamiast tekstu musimy tylko wyświetlać liczby, plakat może być znacznie mniej skomplikowany przy użyciu tak zwanych znaczników siedmiosegmentowych, takich jak:

wprowadź opis zdjęcia tutaj

W tym przypadku każda liczba jest reprezentowana przez kombinację wł. / Wył. Tylko 7 segmentów świetlnych, które pozwalają przedstawić wszystkie liczby:

wprowadź opis zdjęcia tutaj

Zadajemy sobie pytanie, ile zmian świateł (ile włączeń i wyłączeń) należy wykonać, aby przejść przez jeden z tych plakatów o określonej liczbie?

Na przykład, aby wyświetlić 123 w 3-cyfrowym znaku, który zaczyna się od wyłączenia wszystkich diod LED, będziemy mieli:

wprowadź opis zdjęcia tutaj

To łącznie 42 zmiany świateł.


Wyzwanie

Biorąc pod uwagę liczbę nieujemną i długość znaku dodatniego, oblicz liczbę zmian świateł.

Zasady

  • Załóżmy, że dane wejściowe składają się z liczby nieujemnej (N> = 0) i długości znaku dodatniego (M> 0)
  • Załóżmy, że długość znaku> = długość numeru (M> = cyfry (N))

Przypadki testowe

123, 3        => 42
45, 5         => 60
111, 3        => 12
98765, 10     => 220
0, 3          => 36
Luis Felipe De Jesus Munoz
źródło
1
Jaki jest cel tego pytania? W rzeczywistości część taka jak MAX7219 będzie kontrolować 8 cyfr, aby je wyświetlić, wystarczy wysłać 8 cyfr do MAX7219 za pomocą poleceń SPI. Punkt dziesiętny 8-bitowy z 1 lub 2 cyfr byłby użyty do światła - / +. Na przykład 4 można połączyć szeregowo, aby wyświetlać 8 x 32 kropki, aby przewijać tekst, tak jak ten, który zrobiłem: youtube.com/watch?v=hwYqgyMc5S4
CrossRoads
3
@CrossRoads W rzeczywistości nie jest to przeznaczone na prawdziwą odpowiedź sprzętową lub coś takiego. Wyzwanie polega na stworzeniu algorytmu, który może wyświetlać liczbę zmian świateł o określonej liczbie w wielu wyświetlaczach 7-segmentowych
Luis felipe De jesus Munoz
1
Sugerowany przypadek testowy:0,3 => 36
Chas Brown,
1
Czy możemy przyjąć pierwszą liczbę całkowitą jako ciąg znaków lub listę cyfr?
Οurous
1
@ Οurous nie, musisz wziąć oba dane wejściowe jako liczby całkowite
Luis Felipe De Jesus Munoz

Odpowiedzi:

7

Python 2 , 129 126 119 104 bajtów

def f(n,k,p=0):z=p<1or n>0;q=-~ord('}/lx2Z^o~z'[n%10])*z;return(z and f(n/10,k,q))+k*bin(p^q).count('1')

Wypróbuj online!

Dziękuję za duże 15 bajtów z ovs .

Jak określono, przyjmuje liczbę nieujemną i długość znaku dodatniego i zwraca sumę zmian.

Chas Brown
źródło
4
Co to za kurwa jest ta magia. Jesteś lordem Pythona. Tak się cieszę, że mój kod jest mniejszy niż 200 bajtów, a potem pojawia się'7367355777e0d93bf0fb'
Don Thousand
@Rushabh Mehta: Heh heh. Cóż, stoję tylko na ramionach gigantów. Sprawdź te wskazówki opublikowane przez prawdziwych Rycerzy Jedi. Nauczyłem się stąd strategii strunowej .
Chas Brown,
2
104 bajty lub 102 bajty z nadrukiem ( \x7f) pomiędzy pi {.
ovs
@ovs: Niezła regulacja!
Chas Brown,
3

Galaretka , 23 bajty

Dị“¤]þ+>~Œ¶?w‘Ø0j^ƝBFS×

Dyadyczny link akceptujący liczbę całkowitą do wyświetlenia po lewej stronie i długość znaku po prawej stronie, która daje liczbę zmian (działa również, jeśli liczba cyfr w liczbie całkowitej do wyświetlenia jest większa niż długość znaku).

Wypróbuj online!

W jaki sposób?

Podczas całego pokazu każdy 7-segmentowy wyświetlacz (w pewnym momencie) przechodzi od pustej do pierwszej cyfry, następnie do drugiej i tak dalej, a na koniec od ostatniej do pustej. Każde z przejść kosztuje bitowy XOR segmentów z cyfr i na cyfry (gdzie puste to „cyfra” z 0 segmentami). Ukradłem segmenty jako liczby całkowite z poprzedniej wersji odpowiedzi ETHproductions , ale każda permutacja 7 segmentów byłaby równie dobra.

Dị“¤]þ+>~Œ¶?w‘Ø0j^ƝBFS× - Link: integer to display, V; integer sign length, L  e.g. 123, 3
D                       - cast V to decimal digits                                  [1,2,3]
  “¤]þ+>~Œ¶?w‘          - code-page indices list = [3,93,31,43,62,126,19,127,63,119]
 ị                      - index into (1-based & modular) (vectorises)             [3,93,31]
              Ø0        - literal = [0,0]                                             [0,0]
                j       - join                                                [0,3,93,31,0]
                  Ɲ     - pairwise application of:
                 ^      -   bitwise XOR                                        [3,94,66,31]
                   B    - convert to binary digits (vectorises)               [[1,1],[1,0,1,1,1,1,0],[1,0,0,0,0,1,0],[1,1,1,1,1]]
                    F   - flatten                                             [1,1,1,0,1,1,1,1,0,1,0,0,0,0,1,0,1,1,1,1,1]
                     S  - sum                                                            14
                      × - multiply by L                                                  42
Jonathan Allan
źródło
Czy możesz zapisać bajt, biorąc liczbę jako tablicę cyfr? tio.run/##ATsAxP9qZWxsef//…
Shaggy
Tak, ale „biorąc pod uwagę liczbę nieujemną” i „dane wejściowe składają się z liczby nieujemnej” wydawało mi się surowe.
Jonathan Allan
3

JavaScript (Node.js) , 104 94 93 93 bajty

Zaoszczędzono 1 bajt dzięki @Shaggy

B=n=>n&&n%2+B(n>>1)
F=(d,w,q)=>w*B(q^(q=d&&"w`>|i]_p}".charCodeAt(d%10)))+(d&&F(d/10|0,w,q))

Wypróbuj online!

ETHprodukcje
źródło
Myślę, że to działa na -1 bajt.
Kudłaty
@Shaggy Dobra sztuczka, dzięki!
ETHprodukcje
OP wyjaśnił, że oba dane wejściowe muszą być konkretnie liczbami całkowitymi (a nie listami cyfr lub ciągów)
Οurous
@ Οurous Thanks, naprawiono na +0 bajtów.
ETHprodukcje
1
Myślę też, że 0,3powinienem dać 36; dajesz 0. (Miałem ten sam problem - naprawienie tego kosztowało mnie około 10 bajtów grrrr ... :)).
Chas Brown,
2

Japt, 31 30 bajtów

Zaadaptowano z roztworu galaretki Jonathana. Pobiera dane wejściowe w odwrotnej kolejności, a liczba jest wyświetlana jako tablica cyfr.

*Vm!c"w]+>~?" pT ä^T x_¤¬x

Spróbuj

Kudłaty
źródło
OP wyjaśnił, że oba dane wejściowe muszą być konkretnie liczbami całkowitymi (a nie listami cyfr lub ciągów)
Οurous
2

Czysty , 280 bajtów

import StdEnv,Data.List
~ =toInt
?s=sum[(~s>>p)rem 2\\p<-[0..6]]
$n l#j=repeatn l 0
#n=j++[~c-47\\c<-:toString n]++j
#k=[getItems(map((!!)[0,119,3,62,31,75,93,125,19,127,95])n)[i-l..i-1]\\i<-[0..length n]]
=sum(zipWith@(tl k)k)
@[u][]= ?u
@[u:x][v:y]= ?((bitxor)u v)+ @x y
@[][]=0

Wypróbuj online!

Musi być krótsza droga ...

Obrzydliwe
źródło
1

Węgiel drzewny , 40 bajtów

≔⁺×⁷0⭆S§⪪”)∧??%←⁶%*An”⁷IιθI×NΣEθ¬⁼ι§θ⁺⁷κ

Wypróbuj online! Link jest do pełnej wersji kodu. Działa poprzez konwersję danych wejściowych na wartości segmentu binarnego, a następnie zliczenie liczby zmian między poszczególnymi znakami. Wyjaśnienie:

      S                     Convert first input to string
     ⭆                      Map over digits and join
         ”)∧??%←⁶%*An”      Compressed segment value string
        ⪪             ⁷     Split into groups of seven characters
                        ι   Current digit
                       I    Convert to integer
       §                    Index into groups
    0                       Literal `0`
  ×⁷                        Repeat seven times
 ⁺                          Concatentate
≔                        θ  Assign to variable `q`

     θ          Variable `q`
    E           Map over characters
             κ  Current index
           ⁺⁷   Add seven
          θ     Variable `q`
         §      Cyclically index
        ι       Current character
       ⁼        Compare
      ¬         Logical not
   Σ            Sum results
  N             Second input
 ×              Multiply
I               Cast to string
                Implicitly print
Neil
źródło
1

JavaScript (Node.js) , 88 bajtów

Pobiera dane wejściowe jako (integer)(width).

n=>w=>[...n+'',g=n=>n&&1+g(n&n-1)].map(c=>s+=g(x^(x=Buffer('w$]m.k{%o')[c])),x=s=0)|s*w

Wypróbuj online!

W jaki sposób?

{re1,re2),,ren}nwN.

N.=(T.re1+ja=2)nT.reja-1,reja+T.n)×w

T.x,yxyT.xx

Skomentował

n => w =>                       // n = integer; w = width of display
  [ ...n + '',                  // coerce n to a string and split it
    g = n =>                    // g = helper function counting the number of 1's
      n && 1 + g(n & n - 1)     // by defining it here, we also force an extra iteration
  ]                             // with an undefined digit (interpreted as the blank digit)
  .map(c =>                     // for each entry c in this array:
    s += g(                     //   add to s the result of a call to g():
      x ^ (x =                  //     XOR the previous value of x
        Buffer('w$]m.k{%?o')[c] //     with the new one, picked from a 10-entry lookup
      )                         //     gives undefined (coerced to 0) for the last entry
    ),                          //   end of call to g()
    x = s = 0                   //   start with x = 0 and s = 0
  ) | s * w                     // end of map(); return s * w
Arnauld
źródło