7セグメントディスプレイのデコード


17

おそらく、すべての数字を表示できる7セグメントディスプレイをご存知でしょう。09

7セグメントディスプレイ(wikipedia.org)

チャレンジ

セグメントのみを考慮します。あなたの仕事は、どのセグメントがオンになっているかを考えて、1桁をデコードすることです。AG

これは、8ビット整数としてエンコードできます。バイナリ表現と対応するリトルエンディアンおよびビッグエンディアンの値を持つ各桁の表は次のとおりです。

Digit.ABCDEFGLittle-endianBig-endian0011111101260x7E1260x7E100110000480x30120x0C2011011011090x6D1820xB63011110011210x791580x9E400110011510x332040xCC501011011910x5B2180xDA601011111950x5F2500xFA7011100001120x70140x0E8011111111270x7F2540xFE9011110111230x7B2220xDE

ルールとI / O

  • 入力は次のいずれかになります
    • 単一の整数(指定された2つの注文のうち1つ上の表のように)
    • ビットのリスト/配列/ ..
    • 文字で構成される文字列ABCDEFG(例としてABCエンコードするようにソートされていると仮定する場合があります)7
  • 出力は、エンコードした数字になります
  • 無効な入力がないと仮定できます(無効とは、対応する数字がないことを意味します)

テスト

この課題では複数の表現が許可されるため、表を参照してください。



整数(または配列)を指定されたビット順または表示された2つだけで受け入れることができますか?
ジョナサンアラン

@JonathanAllan:すでに示したものだけを明確にします。
ბიმო

なんてこった、すべての入力タイプを処理する必要はありませんか?唯一?おっと...
マジックタコ壺

@MagicOctopusUrn:はい確かに:)
ბიმო

回答:




7

Wolfram言語(Mathematica)、41バイト

9[,6,0,8,2,3,1,7,5,4][[#~Mod~41~Mod~11]]&

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

整数のリトルエンディアン列を入力として使用します。構文の警告を無視します。

入力Xの場合、まずX mod 41を取得し、次に結果mod 11を取得します。結果は異なるmod 11であるため、テーブルから抽出できます。たとえば、126 mod 41 mod 11は3なので、位置3を0にすると、126の入力に対して正しい答えが得られます。

表は9[,6,0,8,2,3,1,7,5,4]です。パート0はヘッドです9。パート1が欠落しているのでNull、バイトを節約するために、パート1を取得する必要はありません。その後、通常どおり6、パート2が、パート3が0、というように続きます。


ジョナサン・アランの答えは私たちに与え 1[4,9,8,6,2,0,5,3,7][[384~Mod~#~Mod~13]]&ます。これは短くはありませんが、構文の警告を回避します!


Wolfram言語(Mathematica)27 25バイト

Mod[Hash[")dD}"#]+2,11]&

(ここには表示されないキャラクターがあります。申し訳ありません。下のリンクをクリックすると表示されます。)

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

これは、一部の文字列を強引に強制して内部にHash入れることであり、ハッシュは最終的にmod 11の正しい値になります。


Mathematicaを知らない人のために、この答えを少し説明してもらえますか?
-jrook

誰でも読めると思ったが、説明で編集する。
ミシャラヴロフ

おめでとうございます。41バイトのソリューションはMathematicaコンプレッサーを壊しました。
リルトシアスト



4

Java(JDK)、32バイト

n->"99608231754".charAt(n%41%11)

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

クレジット



ありがとう、@ JonathanAllan!大変感謝いたします!
オリビエグレゴワール


3

空白、152バイト

必須の「S、T、およびLは実際には存在せず、コマンドの単なる可視表現です」。

S S S T	S S L
S S S T	S T	L
S S S T	T	T	L
S S S T	L
S S S T	T	L
S S S T	S L
S S S T	S S S L
S S S L
S S S T	T	S L
S S S L
S S S T	S S T	L
S S S L
S L
S T	L
T	T	T	T	T	S S S T	S T	S S T	L
T	S T	T	S S S T	S T	T	L
T	S T	T	L
S S L
S L
S L
T	S S L
S T	L
S T	L
S S S T	L
T	S S T	L
S L
L
L
S S S L
S L
L
T	L
S T	

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

エラーで終了します。

同等のアセンブリのような構文:

	push 4
	push 5
	push 7
	push 1
	push 3
	push 2
	push 8
	push 0
	push 6
	push 0
	push 9
	push 0
	dup
	readi
	retrieve
	push 41
	mod
	push 11
	mod
slideLoop:
	dup
	jz .slideLoop
	slide 1
	push 1
	sub
	jmp slideLoop
.slideLoop:
	drop
	printi

3つの末尾の改行を削除して、3バイトを節約できます。STDERRでエラーが発生しますが、プログラムは引き続き機能し、meta-rulesで許可されています
ケビンクルーイッセン

3

brainfuck474の 176 154 151 149 137バイト

入力文字列取り8 0及び1第含む0小数点のために。

(投稿の表の2番目の列のように)

0〜9の数字を出力します。

,>,>,>,,,>,>,>+[[->]<++<<<<<<]>[>[>[>[->[>++++++<-<]>[--<]<]>>.>>]<[>
>[>->++<<-]>-[+>++++<]>+.>]]>[>>>+<<<-]>[>>+++.>]]>[>>>[>+++<-]>-.>]

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

アルゴリズム

特定のセグメントの状態を観察することにより、可能な数字のセットをより小さなサブセットに分割できます。以下は、私のコードで使用されている静的なバイナリ検索ツリーです。左のサブツリーはセグメントのオン状態に対応し、右のサブツリーはセグメントのオフ状態に対応します。

                                         0,1,2,3,4,5,6,7,8,9
                                                  |    
                                         /-------[A]-------------------------\
                                 0,2,3,5,6,7,8,9                             1,4
                                        |                                     |
                         /-------------[B]----------------\             /----[G]----\
                   0,2,3,7,8,9                            5,6          4             1   
                        |                                  |
              /--------[E]--------\                  /----[E]----\    
            0,2,8                3,7,9              6             5
              |                    |
        /----[F]----\        /----[F]----\
      0,8            2      9            3,7   
       |                                  |
 /----[G]----\                      /----[G]----\
8             0                    3             7

ゴルフに役立ついくつかの観察

  1. ビットCおよびDは冗長であり、無視できます。
  2. 先行ゼロ(小数点のビット)は、入力の解析と出力の準備の両方に重要な値48として(ab)使用できます。
  3. リーフに到達して数字が印刷されたら、それ以降のすべての条件をスキップするだけです。データポインターをゼロの領域まで十分に移動して、戻れないようにすることで実行できます。
  4. 一部のBF実装は負のデータポインターをサポートしていないため、互換性のために右側にゼロを使用することをお勧めします。
  5. したがって、出力値を右端のセルに保存する方が良いので、右側のゼロの領域に簡単に到達できます。
  6. したがって、出力セルに簡単にアクセスできるように、ビットを左から右にA、B、E、F、Gで確認することをお勧めします。
  7. 異なる数字が出力コードを共有する場合があります。たとえば、5と6は同じサブツリーにあります。+++++両方の値に対して行うことも+、6つの値に対してのみ行うこともできます。
  8. +事前に出力値に2を追加すると、コマンドの数を減らすことができます。その場合は、0それ1だけを減らして、他の数字を活用する必要があります。

2

網膜、96バイト

^(A)?(B)?C?(D|())(E|())(F)?(G)?
$.($.5*$.8*$(6*$7$2$2)$#6*$.3*$($.2*$(___$7)5*$7)$#4*$(6*$1_3*$8

オンラインでお試しください!最善の方法ではないかもしれませんが、Retinaでのプログラミングの興味深い方法です。説明:

^(A)?(B)?C?(D|())(E|())(F)?(G)?

興味深いケースをキャプチャしようとします。ポジティブキャプチャは、文字が存在する場合に単に文字をキャプチャします。したがって、キャプチャの長さは、存在する場合は1、存在しない場合は0です。特殊なケースは、DまたはEがそれぞれ存在しない場合にのみ存在するキャプチャ4および6です。これらは、専用として小数で表現することができる$#4$#6それは我々がここで必要なすべてのです。次に、キャプチャは、長さが目的の数値である文字列に構築されます。たとえば、6*$1Aが存在する場合、この文字列の長さは6で、存在しない場合は0です。異なる式から選択するために、0または1に評価される($.ポジティブキャプチャの場合)または$#(ネガティブキャプチャの場合)のいずれかを使用し、これに文字列を掛けることができます。

$.5*$.8*$(6*$7$2$2)

Fが6回とB2 回繰り返されます(ゴルファーなので連結によって)。しかし、その結果は、両方の場合を除き、無視さEG存在しています。これは26およびのケースを処理し8ます。

$#6*$.3*$($.2*$(___$7)5*$7)

Fが5回繰り返さBれ、存在する場合は、6回目に追加の3(長さ3の定数文字列で表される)が追加されます。ただし、結果がD存在し、存在しない限り、結果は無視されEます。これは35およびのケースを処理し9ます。

$#4*$(6*$1_3*$8

Aは6回G繰り返され、3回繰り返さ1れ、さらに追加されます(ゴルファーなので、2つの間に一定の文字で表されます)。ただし、結果がない場合は無視されDます。これは14およびのケースを処理し7ます。

$.(

上記の文字列は連結され、長さが取得されます。上記のいずれも当てはまらない場合、文字列は生成されないため、その長さはです0

結果の文字列(長さを取得する前)は次のとおりです。

1   _
2   BB
3   ___
4   _GGG
5   FFFFF
6   FFFFFF
7   AAAAAA_
8   FFFFFFBB
9   ___FFFFFF

2

MATL、14バイト

'/lx2Z^o~z'Q&m

入力は、リトルエンディアン形式のセグメントを表す数値です。

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

説明

'/lx2Z^o~z'  % Push this string
Q            % Add 1 to the codepoint of each char. This gives the array
             % [48 109 ... 123], corresponding to numbers 1 2 ... 9. Note that
             % 0 is missing
&m           % Implicit input. Call ismember function with second output. This
             % gives the 1-based index in the array for the input, or 0 if the
             % input is not present in the array.
             % Implicit display



1

Japt、15バイト

入力としてビッグエンディアン値を取ります。

"~¶ÌÚúþÞ"bUd

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


説明

文字列には、ビッグエンディアン値の各コードポイントの文字が含まれています。Ud入力のコードポイントで文字を取得bし、文字列でそのインデックスを見つけます。




1

TI-BASIC(TI-83 + / 84 +シリーズ)、15バイト

int(10fPart(194909642ln(Ans

リトルエンディアン入力を使用します。ハッシュはTI-BASICではかなり一般的であるため、このような場合のためにハッシュ関数ブルートフォーサーを作成しました。

ここで、乗数は予想された10ではなく9桁であるため、少し幸運です。

      fPart(194909642ln(Ans   hash function mapping onto [0,1)
int(10                        take first digit after decimal point

1

05AB1E17 16 15 12 バイト

•NŽyf¯•I41%è

@ErikTheOutgolferのおかげで-1バイト。@MishaLavrovのMathematica回答の
ポートを作成して-1バイト。@Grimyの おかげで-3バイト。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

NŽyf¯•       # Push compressed integer 99608231754
       I41%   # Push the input modulo-41
           è  # Index this into the integer (with automatic wraparound)
              # (and output the result implicitly)

理由を理解するに•NŽyf¯•、この05AB1Eのヒント(大きな整数を圧縮する方法?参照してください99608231754



@EriktheOutgolferああ、もちろん..偶然にもそうです128в128半分になるためのビルトインを忘れました256。ありがとう!
ケビンクルーイッセン

私も15歳未満にはならない気味の悪いものをいくつか試しました¦C•26¤æÈÛµÀš•2ô₂+sk
魔法のタコ

1
@Grimyありがとう!圧縮された整数でサイズ11とラップアラウンドキックあるので、今、私はそれを見ることは、明らかです。
ケビンCruijssen

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