7セグメントスクロール


15

サンドボックスポスト

イントロ

情報パネルはどこにでもあります。技術がより安価になると、紙のポスターは、図のように、一方の側に現れて他方の側に出てくる単語を示す明るい標識に変換されました。

ここに画像の説明を入力してください

これらの兆候の1つが起動すると、通常は空になり、テキストは右側から左側に向かって消え、消えるまで移動します。

その機能は、小さな電球(LED)を点滅させて、動きの感覚を与えることです。

テキストの代わりに数字のみを表示する必要がある場合は、次のようないわゆる7セグメントマーカーを使用して、ポスターの洗練度を大幅に下げることができます。

ここに画像の説明を入力してください

この場合、各数値は、すべての数値を表すことができる7つのライトセグメントのみのオン/オフの組み合わせで表されます。

ここに画像の説明を入力してください

私たちが自問する質問は、これらのポスターの1つを特定の数だけ通過させるために、ライトの変更(オンとオフの回数)を何回行う必要があるかということです。

たとえば、すべてのLEDが消灯した状態で始まる3桁の記号で123を表示するには、次のようにします。

ここに画像の説明を入力してください

これにより、合計42回のライトの変更が行われます。


チャレンジ

非負の数と正の符号の長さが与えられたら、ライトの変化の数を計算します。

ルール

  • 入力が負でない数(N> = 0)と正の符号長(M> 0)で構成されていると仮定します
  • 符号長> =数字の長さ(M> =桁数(N))を想定

テストケース

123, 3        => 42
45, 5         => 60
111, 3        => 12
98765, 10     => 220
0, 3          => 36

1
質問の目的は何ですか?実際には、MAX7219のような部品が8桁を制御し、それらを表示するには、SPIコマンドを介して8桁をMAX7219に送信するだけです。-/ +ライトには、1桁または2桁の小数点8ビットが使用されます。たとえば、4をデイジーチェーン接続して8 x 32ドットのディスプレイを作成し、テキストをスクロールします。たとえば、youtube.com
watch

3
@CrossRoads実際には、これは実際のハードウェアの回答やこのようなものを対象とするものではありません。なお、出力することができる光の数は7セグメントディスプレイ倍数で指定された数値の変更アルゴリズムを作成することが課題である
ルイス・フェリペデイエスムニョス

1
推奨テストケース:0,3 => 36
Chas Brown

1
最初の整数を文字列または数字のリストとして使用できますか?
Οurous

1
@Οurいいえ、両方の入力を整数として取る必要があります
ルイスフェリペデジェススムニョス

回答:


7

パイソン2129の 126 119 104バイト

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

オンラインでお試しください!

ovsからの大きな15バイトのThx 。

指定されているように、負でない数と正の符号長を取り、合計変更を返します。


4
実際の性交はこの魔術です。あなたはPythonの主です。200バイト未満のコードを取得できてとてもうれしく思います。その後、あなたは次のように表示されます'7367355777e0d93bf0fb'
Don Thousand

@Rushabh Mehta:へーへー。まあ、私は巨人の肩の上に立っているだけです。真のジェダイナイト投稿したこれらのヒントをご覧ください。ここから学んだストリング戦略。
チャスブラウン

2
との間にunprintable()がある104バイトまたは102バイト\x7fp{
ovs

@ovs:すてきな調整!
チャスブラウン

3

ゼリー、23 バイト

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

左側に表示する整数を受け入れ、右側に符号の長さを受け入れるダイアディックリンク(変更する整数の桁数が符号の長さより大きい場合にも機能します)。

オンラインでお試しください!

どうやって?

ショー全体で、各7セグメントディスプレイは(ある時点で)空から最初の数字に、次に2番目の数字に、そして最後から最後に再び空に変わります。遷移はそれぞれ、開始桁と終了桁のオンセグメントのビット単位のXORを要します(ここで、空は0のオンセグメントを持つ「桁」です)。ETHproductionsの回答の以前のリビジョンから整数としてオンセグメントを盗みましたが、7セグメントの順列でも同様に機能します。

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

数字を数字配列として取得してバイトを節約できますか?tio.run/##ATsAxP9qZWxsef//...
シャギー

はい。ただし、「負でない数を指定する」および「入力が負でない数で構成されている」というのは厳密に思えました。
ジョナサンアラン

3

JavaScript(Node.js)104 94 93 93バイト

@Shaggyのおかげで1バイト節約

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

オンラインでお試しください!


これは-1バイトで機能すると思います。
シャギー

@Shaggy Niceトリック、ありがとう!
ETHproductions

OPは、両方の入力が具体的に整数でなければならないことを明確にしました(数字や文字列のリストではありません)
ousurous

@Οurousありがとう、+ 0バイトで修正。
ETHproductions

1
また、私0,3は与えるべきだと思う36; あなたが与え0ます。(私は同じ問題を抱えていました-これを修正すると、約10バイトgrrrr ...がかかりました)
チャスブラウン

2

Japt、31 30バイト

ジョナサンのゼリーソリューションを採用。数字の配列として表示される番号を逆順に入力します。

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

それを試してみてください


OPは、両方の入力が具体的に整数でなければならないことを明確にしました(数字や文字列のリストではありません)
18

2

クリーン、280バイト

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

オンラインでお試しください!

もっと短い方法が必要です。


1

、40バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。入力をバイナリセグメント値に変換し、各文字間の変更数をカウントすることで機能します。説明:

      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

1

JavaScript(Node.js)、88バイト

入力をとして受け取ります(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

オンラインでお試しください!

どうやって?

リストを与えられた {d1d2dn}n 数字と表示幅 w、総数 N 光の変化は次のように与えられます:

N=Td1+=2nTd1d+Tn×w

どこ Tバツy 数字からの遷移に対する光の変化の数です バツ 数字に y そして Tバツ 空白の数字から数字への移行に対する光の変化の数です バツ (またはその逆)。

コメント済み

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.