Sieben-Segment-Scrolling

15

Sandbox-Post

Intro

Die Informationstafeln sind überall. Als die Technologie billiger wurde, wurden die Papierplakate in leuchtende Zeichen umgewandelt, die Wörter zeigen, die auf der einen Seite erscheinen und auf der anderen herauskommen, wie das auf der Abbildung:

Bildbeschreibung hier eingeben

Wenn eines dieser Zeichen startet, beginnt es normalerweise leer und der Text wird von rechts nach links verschoben, bis er verschwindet.

Die Funktion besteht darin, die kleinen Glühbirnen (LEDs) ein- und auszuschalten, um ein Gefühl der Bewegung zu erzeugen.

Wenn wir anstelle von Text nur Zahlen anzeigen müssen, kann das Poster mit den so genannten Siebensegment-Markern wie den folgenden viel weniger raffiniert sein:

Bildbeschreibung hier eingeben

In diesem Fall wird jede Zahl durch die Kombination von nur 7 Lichtsegmenten dargestellt, mit denen alle Zahlen dargestellt werden können:

Bildbeschreibung hier eingeben

Die Frage, die wir uns stellen, ist, wie viele Lichtwechsel (wie viele an und aus) durchgeführt werden müssen, um eine bestimmte Anzahl dieser Plakate zu passieren.

Wenn Sie beispielsweise die 123 in einem dreistelligen Zeichen anzeigen möchten, bei dem alle LEDs ausgeschaltet sind, müssen Sie Folgendes tun:

Bildbeschreibung hier eingeben

Dies macht insgesamt 42 Lichtwechsel.


Herausforderung

Berechnen Sie bei einer nicht negativen Zahl und einer positiven Vorzeichenlänge die Anzahl der Lichtwechsel.

Regeln

  • Angenommen, die Eingabe besteht aus einer nicht negativen Zahl (N> = 0) und einer positiven Vorzeichenlänge (M> 0).
  • Angenommen, Zeichenlänge> = Zahlenlänge (M> = Ziffern (N))

Testfälle

123, 3        => 42
45, 5         => 60
111, 3        => 12
98765, 10     => 220
0, 3          => 36
Luis Felipe De Jesus Munoz
quelle
1
Was ist das Ziel der Frage? In der Realität steuert ein Teil wie MAX7219 die 8 Ziffern. Um sie anzuzeigen, müssen Sie nur die 8 Ziffern über SPI-Befehle an den MAX7219 senden. Das Dezimalpunkt-8-Bit aus 1 oder 2 Ziffern würde für das - / + -Licht verwendet. Zum Beispiel könnte 4 verkettet werden, um eine 8 x 32-Punkt-Anzeige zum Scrollen von Text zu erstellen, wie diese, die ich erstellt habe: youtube.com/watch?v=hwYqgyMc5S4
CrossRoads
3
@CrossRoads Eigentlich ist das nicht für eine echte Hardwareantwort oder so gedacht. Es ist eine Herausforderung, einen Algorithmus zu entwickeln, der die Anzahl der
Lichtänderungen
1
Vorgeschlagener Testfall:0,3 => 36
Chas Brown
1
Dürfen wir die erste Ganzzahl als Zeichenfolge oder als Ziffernliste verwenden?
Οurous
1
@ Οurous nein, Sie müssen beide Eingaben als Ganzzahl nehmen
Luis Felipe De Jesus Munoz

Antworten:

7

Python 2 , 129 126 119 104 Bytes

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')

Probieren Sie es online!

Thx für große 15 Bytes von ovs .

Nimmt wie angegeben eine nicht negative Zahl und eine positive Vorzeichenlänge und gibt die gesamten Änderungen zurück.

Chas Brown
quelle
4
Was zum Teufel ist diese Zauberei? Du bist ein Python Lord. Ich freue mich so, wenn mein Code unter 200 Bytes liegt, dann tauchen Sie auf mit'7367355777e0d93bf0fb'
Don Thousand
@ Rushabh Mehta: Heh heh. Nun, ich stehe nur auf den Schultern von Riesen. Schauen Sie sich diese Tipps der wahren Jedi-Ritter an. Die Zeichenfolge Strategie , die ich daraus gelernt hier .
Chas Brown
2
104 Bytes oder 102 Bytes mit einem nicht druckbaren ( \x7f) zwischen pund {.
Ovs
@ovs: Schöne Einstellung!
Chas Brown
3

Jelly , 23 Bytes

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

Eine dyadische Verknüpfung, die die links anzuzeigende Ganzzahl und die rechts angezeigte Vorzeichenlänge akzeptiert und die Anzahl der Änderungen angibt (funktioniert auch, wenn die Anzahl der Stellen in der anzuzeigenden Ganzzahl größer als die Vorzeichenlänge ist).

Probieren Sie es online!

Wie?

Während der gesamten Show wechselt jede 7-Segment-Anzeige (zu einem bestimmten Zeitpunkt) von leer zu der ersten Ziffer, dann zu der zweiten usw. und schließlich von der letzten zu wieder leer. Die Übergänge kosten jeweils das bitweise XOR der Ein-Segmente der Von-Ziffer und Zu-Ziffer (wobei leer eine "Ziffer" mit 0 Ein-Segmenten ist). Ich habe die on-Segmente als ganze Zahlen aus einer früheren Revision der Antwort von ETHproductions gestohlen , aber jede Permutation der 7 Segmente würde genauso gut funktionieren.

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
quelle
Könnten Sie ein Byte speichern, indem Sie die Nummer als Ziffernfeld verwenden? tio.run/##ATsAxP9qZWxsef//…
Shaggy
Ja, aber "Bei einer nicht negativen Zahl" und "Eingabe besteht aus einer nicht negativen Zahl" erschien mir streng.
Jonathan Allan
3

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

1 Byte dank @Shaggy gespeichert

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))

Probieren Sie es online!

ETHproductions
quelle
Ich denke, das funktioniert für -1 Byte.
Shaggy
@ Shaggy Netter Trick, danke!
ETHproductions
OP hat klargestellt, dass beide Eingaben spezifisch Ganzzahlen sein müssen (und keine Ziffern- oder Zeichenkettenlisten)
endete
@ Οurous Danke, fest auf +0 Bytes.
ETHproductions
1
Auch denke ich 0,3sollte geben 36; Sie geben 0. (Ich hatte das gleiche Problem - die Behebung dieses Problems kostete mich ungefähr 10 Bytes Grrrr ... :)).
Chas Brown
2

Japt, 31 30 Bytes

Angepasst an Jonathans Jelly-Lösung. Nimmt die Eingabe in umgekehrter Reihenfolge vor, wobei die Zahl als Ziffernfeld angezeigt wird.

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

Versuch es

Zottelig
quelle
OP hat klargestellt, dass beide Eingaben spezifisch Ganzzahlen sein müssen (und keine Ziffern- oder Zeichenkettenlisten)
endete
2

Sauber , 280 Bytes

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

Probieren Sie es online!

Es muss einen kürzeren Weg geben.

Οurous
quelle
1

Kohle , 40 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Wandelt die Eingabe in binäre Segmentwerte um und zählt dann die Anzahl der Änderungen zwischen den einzelnen Zeichen. Erläuterung:

      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
quelle
1

JavaScript (Node.js) , 88 Byte

Übernimmt die Eingabe als (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

Probieren Sie es online!

Wie?

Eine Liste gegeben {d1,d2,,dn} von n Ziffern und eine Anzeigebreite w, Die gesamte Anzahl N von Lichtänderungen ist gegeben durch:

N=(Td1+ich=2nTdich-1,dich+Tn)×w

Wo Tx,y ist die Anzahl der Lichtänderungen für einen Übergang von der Ziffer x zu digitalisieren y und Tx ist die Anzahl der Lichtwechsel für einen Übergang von einer leeren Ziffer zur nächsten x (oder umgekehrt).

Kommentiert

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
quelle