Défilement à sept segments

15

Poteau de bac à sable

Intro

Les panneaux d'information sont partout. Lorsque la technologie est devenue moins chère, les affiches en papier ont été transformées en panneaux lumineux qui montrent des mots qui apparaissent d'un côté et ressortent de l'autre, comme celui de la figure:

entrez la description de l'image ici

Lorsque l'un de ces signes démarre, il commence généralement à vide et le texte part du côté droit vers la gauche, se déplaçant jusqu'à ce qu'il disparaisse.

Sa fonctionnalité est d'allumer et d'éteindre les petites ampoules (LED) pour donner la sensation de mouvement.

Si au lieu du texte, nous devons seulement afficher des nombres, l'affiche peut être beaucoup moins sophistiquée en utilisant les marqueurs dits à sept segments comme suit:

entrez la description de l'image ici

Dans ce cas, chaque nombre est représenté par la combinaison marche / arrêt de seulement 7 segments lumineux qui permettent de représenter tous les nombres:

entrez la description de l'image ici

La question que nous nous posons est de savoir combien de changements de lumières (combien d'allumer et éteindre) doivent être effectués pour traverser une de ces affiches un certain nombre?

Par exemple, pour afficher le 123 dans un signe à 3 chiffres qui commence avec toutes les LED éteintes, nous aurons:

entrez la description de l'image ici

Cela fait un total de 42 changements de lumières.


Défi

Étant donné un nombre non négatif et une longueur de signe positive, calculez le nombre de changements de lumière.

Règles

  • Supposons que l'entrée consiste en un nombre non négatif (N> = 0) et une longueur de signe positive (M> 0)
  • Supposons que la longueur du signe> = longueur du nombre (M> = chiffres (N))

Cas de test

123, 3        => 42
45, 5         => 60
111, 3        => 12
98765, 10     => 220
0, 3          => 36
Luis felipe De jesus Munoz
la source
1
Quel est le but de la question? En réalité, une pièce comme le MAX7219 contrôlera les 8 chiffres, pour les avoir affichés, il vous suffira d'envoyer les 8 chiffres au MAX7219 via les commandes SPI. Le point décimal 8e bit de 1 ou 2 chiffres serait utilisé pour le voyant - / +. Par exemple, 4 pourraient être connectés pour créer un affichage de 8 x 32 points pour faire défiler le texte, comme celui-ci que j'ai fait: youtube.com/watch?v=hwYqgyMc5S4
CrossRoads
3
@CrossRoads En fait, ce n'est pas destiné à une vraie réponse matérielle ou quelque chose comme ça. Créer un algorithme capable de produire le nombre de changements de lumière d'un nombre donné sur plusieurs écrans à 7 segments est un défi
Luis felipe De jesus Munoz
1
Cas de test suggéré:0,3 => 36
Chas Brown
1
Pouvons-nous prendre le premier entier comme une chaîne ou une liste de chiffres?
Οurous
1
@ Οurous non, vous devez prendre les deux entrées en entier
Luis felipe De jesus Munoz

Réponses:

7

Python 2 , 129 126 119 119 104 octets

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

Essayez-le en ligne!

Thx pour un gros 15 octets de ovs .

Comme spécifié, prend un nombre non négatif et une longueur de signe positive et renvoie le total des modifications.

Chas Brown
la source
4
Qu'est-ce que c'est que cette sorcellerie. Vous êtes un seigneur Python. Je suis tellement content d'avoir mon code sous 200 octets, puis vous vous présentez avec'7367355777e0d93bf0fb'
Don Thousand
@Rushabh Mehta: Heh heh. Eh bien, je ne me tiens que sur les épaules de géants. Découvrez ces conseils publiés par les vrais chevaliers Jedi. La stratégie de chaîne que j'ai apprise d' ici .
Chas Brown
2
104 octets ou 102 octets avec un non imprimable ( \x7f) entre pet {.
2018
@ovs: Joli ajustement!
Chas Brown
3

Gelée , 23 octets

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

Un lien dyadique acceptant l'entier à afficher à gauche et la longueur du signe à droite qui donne le nombre de changements (fonctionne également si le nombre de chiffres dans l'entier à afficher est supérieur à la longueur du signe).

Essayez-le en ligne!

Comment?

Pendant tout le spectacle, chaque affichage à 7 segments (à un moment donné) passe du vide au premier chiffre, puis au deuxième et ainsi de suite, et enfin du dernier au vide à nouveau. Les transitions coûtent chacune le XOR au niveau du bit des segments actifs des segments de début et de fin (où vide est un "chiffre" avec 0 segment). J'ai volé les on-segments sous forme d'entiers dans une précédente révision de la réponse d' ETHproductions , mais toute permutation des 7 segments ferait aussi bien.

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
la source
Pourriez-vous enregistrer un octet en prenant le nombre comme un tableau de chiffres? tio.run/##ATsAxP9qZWxsef//…
Shaggy
Oui, mais "étant donné un nombre non négatif" et "l'entrée consiste en un nombre non négatif" m'a semblé strict.
Jonathan Allan
3

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

1 octet enregistré grâce à @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))

Essayez-le en ligne!

ETHproductions
la source
Je pense que cela fonctionne pour -1 octet.
Shaggy
@Shaggy Belle astuce, merci!
ETHproductions
OP a précisé que les deux entrées doivent être spécifiquement des entiers (et non des listes de chiffres ou de chaînes)
2018
@ Merci ,urous, fixé à +0 octets.
ETHproductions
1
Je pense aussi que 0,3devrait donner 36; vous donnez 0. (J'ai eu le même problème - réparer cela m'a coûté environ 10 octets grrrr ... :)).
Chas Brown
2

Japt, 31 30 octets

Adapté de la solution Jelly de Jonathan. Prend la saisie dans l'ordre inverse avec le nombre à afficher sous forme de tableau de chiffres.

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

Essayez-le

Hirsute
la source
OP a précisé que les deux entrées doivent être spécifiquement des entiers (et non des listes de chiffres ou de chaînes)
2018
2

Nettoyer , 280 octets

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

Essayez-le en ligne!

Il doit y avoir un moyen plus court ..

Οurous
la source
1

Fusain , 40 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Fonctionne en convertissant l'entrée en valeurs de segment binaire, puis en comptant le nombre de changements entre chaque caractère. Explication:

      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
la source
1

JavaScript (Node.js) , 88 octets

Prend l'entrée comme (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

Essayez-le en ligne!

Comment?

{1,2,,n}nwN

N=(T1+je=2nTje-1,je+Tn)×w

TX,yXyTXX

Commenté

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
la source