7セグメントの違い


26

ここにいるほとんどの人は、数字の7セグメントディスプレイが何であるかを知っていると思います。

 _         _   _         _    _    _    _    _ 
| |    |   _|  _|  |_|  |_   |_     |  |_|  |_|
|_|    |  |_   _|    |   _|  |_|    |  |_|   _|

2 間の7セグメントの差(7SD)を、一方から他方に切り替えるために切り替える必要があるセグメントの数として定義できます。例えば7SD間となる5(3つの水平セグメント及び下部二つの垂直セグメントをトグルする必要がある)、及び6と8との間7SDである112

さらに、2つの数値間の7SDを、対応する数字間の7SDの合計と定義できます。1つの数値が他の数値よりも長い場合、それらは右揃えであると想定し、大きい数値の最上位の桁を表示するために必要なセグメントの数を追加します。例として、間7SDを考慮12345して549

  x:  1 2 3 4 5
  y:      5 4 9
7SD:  2+5+2+0+1 = 10

あなたの仕事はnが与えられた場合nn + 1の間の7SD計算することです。

便宜上、個々の数字の間の7SDの完全な表を以下に示します。行_は空の位置を表します。

   _ 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

入力

  • 入力は単一の正の整数nです。
  • STDIN(または最も近い代替)、コマンドライン引数、または関数引数を介して入力を取得して、プログラムまたは関数を作成できます。
  • 入力が最大127を含む値をサポートしている限り、言語の標準整数型で表現できる最大数よりも最大で1つ少ないと仮定できます。

出力

  • 単一の整数、との間の7SDを印刷する必要がnありn+1ます。
  • STDOUT(または最も近い代替)、関数の戻り値、または関数(out)引数を介して出力できます。

得点

標準の規則が適用され、最短のコード(バイト単位)が優先されます。

テストケース

何らかのあいまいな理由で、このシーケンスはまだOEISにありませんが、密接に関連するシーケンスA123587があります。以下に、最初の100個の数字(で始まる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

7SDが9より大きい最初の入力は199911になります。他の大きな例を次に示します。

n          7SD
1999        11
12345        1
999999      14
5699999     15
8765210248   1

回答:


8

ゼリー25 22 21 20 バイト

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

オンラインでお試しください!または、すべてのテストケースを確認します

バックグラウンド

まず入力nをインクリメントし、変更されていないn + 1のすべての数字を破棄します。

たとえば、n5699999の場合、次のようになります。

n     : 5700000
n + 1 : 5699999
Result:  700000

この結果のすべての数字には、トグルする必要がある固定数のセグメントがあります。トグルのリストを全単射の基数5に変換して、バイトを節約できます。

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

出力は、個々のトグルの単純な合計です。

これは、nのほとんどの値で機能しますが、n + 1の桁数がnより大きい場合は特別な注意が必要です。この場合、すべての数字は9でなければなりません。この問題を解決するには、n + 1から末尾の0を切り取ります。

たとえば、n999999の場合、次のようになります。

n     :  999999
n + 1 : 1000000
Result: 100000

これは、先頭の14回のトグル(01の間の距離)に評価され、実際のトグルの量が201の間の距離)であり、1つの後続の0を抑制すると、合計から2回のトグルが削除されるためです。

使い方

‘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.

10

JavaScript(ES6)、46 40バイト

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

代替形式、46 40バイト:

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

編集:@xsotのおかげで6バイトを保存しました。


ES6の論理or演算子がpythonの論理演算子または演算子のように動作する場合、2番目のコードをさらに短縮できます。例については、提出物を参照してください。
xsot

@xsot実際、私は両方を短くすることができます!ゼロの特殊なケースを変更するのに役立つとは思わない
ニール

うわー、私は最初のものが動作することに驚いています。エラーが予想されました。
-xsot

@xsot javascriptは単純にエラーを出力しません。Javascriptが生まれた10日間で最も正しいアプローチのように思われたことは何でもします。。それ以降のバージョンでは、少し厳密な動作を選択できますが、なぜここの誰かがそれを行うのでしょうか?ただし、論理演算子の短絡動作は非常に一般的ですが、PHPだけが常にブール値を返すことで間違ったことをします。
ジョン・ドヴォルザーク

@JanDvorak実際、文字列の長さよりも大きい文字列のインデックスにアクセスできるという事実に驚きました。
xsot

10

Python、50 48バイト

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

説明

この関数は、数値の最下位桁で動作しn、最初の非9数字の後まで1ずつ増加したときに数字の7SDを合計します。

26523308は数字のマッピングをコード化するビットマスクです0-8。ときn=0ときにのみ発生し、n備えるだけ9だ、答えは2でオフになります。これは、式によって補正されます0**n*2。digitの9場合、ビットマスクはゼロと評価さ2れ、7SDに追加するときに再帰呼び出しがトリガーされます。


これにより変換がどのように行われるかについて説明できますか?つまり、賢さのために+1ですが、賢いことに迷いました。
CAD97

8

05AB1E31 30 28 27 26バイト

コード:

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

説明旧式):

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

次を9以外の最後の数字に変更します。

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

特別な場合:

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

CP-1252エンコードを使用します。オンラインでお試しください!

28バイトの代替:D[¤©•2X›ùì•sès®9Ê#¨]\rÚ9Q4*O



3

MATL61 39 36バイト

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

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

説明

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


3

Python、71 66バイト

xsotによる48バイト。さらに魔法の数学!

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

ideoneで見る

なぜなら前Pythonの答えは動作し、最適にはほど遠いものではありません。以前のES6バージョンの単純な移植。(ES6の代替製剤からの)少しの調整を使用して、キャストを切り取ります!

+1バイトにfloordivを明示的に使用することにより、Python 3で動作するようにできます。


後にスペースを取り出すことができます9
Maltysen

@マルティセンは明らかにあなたが正しいです。eたとえばのnumの後の有効な文字であるため、エラーになると思いました9e9
CAD97

これは私のJavaの答えよりも長いです!どうすれば修正できますか?ifがこの順序でスペースを必要としないので、比較を逆に保存n%10==9n%10<9ても保存されないことに注意してください。
CAD97

そして、xsotがはるかに短いPythonバージョンを作成したことを確認します。よくやった!
CAD97

2

Jolf、32バイト

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

ここで試してみてください!

説明

これはニールの答えの翻訳です。

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


0

J、53バイト

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

もともとは@Neilのソリューションに基づいていました。次に、@ Lynnのソリューションで同じ式を使用してバイトを保存することにより改善しました。

文字列に基づく54バイトバージョンは

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

使用法

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

0

網膜、34バイト

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

オンラインでお試しください!(最初の行では、複数のテストケースを一度に処理できます。)

説明

ほとんどの回答がこれまでに発見したように、9増分時に最下位の非数字のみが変化するため、フルテーブルを使用する必要はありません。それもこの答えの仕組みです。

M!`.9*$

これMは、正規表現、.9*$つまり9末尾からs だけで区切られた最初の数字に一致します()。!7SDには影響しません、すべてを捨て、この試合での入力を置き換えるために網膜を伝えます。

^9
0

入力が今で始まる場合9、その手段は、入力自体が成っのみ97セグメントディスプレイを先頭に追加する必要があるので、S 1たコスト2。これを処理する最も簡単な方法は、先頭を交換する9と、この場合、0増分のコストので、9(とは0)である2増分のコスト及び0(TO 1)が4、これは、全体的なコストを上昇させるように、2必要に応じ。

T`d`4523315412

これで、各数字をインクリメントするためのコストで置き換える音訳ステージができました(がにd展開されるため0123456789)。これは、7SDテーブルの最初の対角線であることに注意してください。

.
$*

これは、各桁nをのnコピーで置き換えます1。つまり、各桁を単項に変換します。セパレータがないため、すぐにそれらを加算します。

.

最後.に、結果の文字数(つまりの一致数)をカウントし、単項の合計を10進数に変換します。

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