Pure Sourcery-0から9の数字を出力するプログラムの形成


21

以下は、0〜9の数字のピクセル化された5 x 7フォントです。

.███.
█...█
█...█
█...█
█...█
█...█
.███.

..█..
███..
..█..
..█..
..█..
..█..
█████

.███.
█...█
....█
...█.
..█..
.█...
█████

.███.
█...█
....█
..██.
....█
█...█
.███.

█..█.
█..█.
█..█.
█████
...█.
...█.
...█.

█████
█....
█....
.███.
....█
█...█
.███.

.███.
█...█
█....
████.
█...█
█...█
.███.

█████
....█
....█
...█.
...█.
..█..
..█..

.███.
█...█
█...█
.███.
█...█
█...█
.███.

.███.
█...█
█...█
.████
....█
█...█
.███.

(このフォントとこのページは、ブラウザコンソールまたはURLバーの接頭辞javascript::でこのJavaSciptコードを実行すると、見栄えがよくなります$('#question pre,.answer pre').css('line-height',1)。)

.上記のフォントで空のスペースを表すテキスト()と、塗りつぶされたスペースを表すテキスト()の2つの等しいサイズの長方形のテキストブロックを記述します

これらの2つのテキストブロックが上の数字の1つと同じ5×7パターンに配置されている場合、結果の大きなテキストブロックはその数字を標準出力に出力するプログラムになります。これは、10桁すべてで機能するはずです。

たとえば、.テキストブロックが

---
'''

そして、あなたのテキストブロックました

ABC
123

その後、プログラム

---ABCABCABC---
'''123123123'''
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
---ABCABCABC---
'''123123123'''

出力する必要があります0。同様に、プログラム

------ABC------
''''''123''''''
ABCABCABC------
123123123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
ABCABCABCABCABC
123123123123123

出力すべき1、などのためのプログラムまでON 9

このスタックスニペットを使用して、数字型のプログラムを作成できます。

<style>textarea{font-family:monospace;}</style><script>function go(){var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");for(var e=document.getElementById("empty").value.split("\n"),n=document.getElementById("filled").value.split("\n"),l=[],o=0;o<7*e.length;o++){l[o]="";for(var d=0;5>d;d++)l[o]+=font[t][Math.floor(o/e.length)][d]?n[o%n.length]:e[o%e.length]}document.getElementById("output").value=l.join("\n")}font=[[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,0,1,0,0],[1,1,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,1,0,0],[0,1,0,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,0,0,1,0],[1,0,0,1,0],[1,0,0,1,0],[1,1,1,1,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,0,1,0]],[[1,1,1,1,1],[1,0,0,0,0],[1,0,0,0,0],[0,1,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,0],[1,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,1,1,1,1],[0,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,1,0,0],[0,0,1,0,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,1],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]]]</script><textarea id='empty' rows='8' cols='32' placeholder='empty space text block...'></textarea><textarea id='filled' rows='8' cols='32' placeholder='filled space text block...'></textarea><br>Digit <input id='digit' type='text' value='0'> <button type='button' onclick='go()'>Generate</button><br><br><textarea id='output' rows='16' cols='64' placeholder='output...' style='background-color: #eee;' readonly></textarea>

詳細

  • 10個の大きなテキストブロックプログラムはどれも入力を必要としません。1桁の数字とオプションの末尾の改行のみを出力します。stdoutまたは同様の代替への出力。
  • どのプログラムも、独自のソースコードを読み取ったりアクセスしたりすることはできません。これを厳しい馬の挑戦のように扱ってください。
  • テキストブロックは同一ではない可能性があり、ゼロ以外の次元でなければなりません。
  • テキストブロックには、行末記号以外の文字を含めることができます
  • 10個のプログラムは、同じ言語で記述された本格的なプログラムである必要があり、REPLスニペットではありません。必要に応じて、末尾の改行をすべてに追加することも、すべてに追加しないこともできます。

得点

スコアは、テキストブロックの1つの領域(幅と高さ)です。(これらは同じサイズなので、両方のブロックをカウントしても意味がありません。)例の面積は3 x 2で、スコアは6です。

最も低いスコアが勝ちます。同点の場合、最も投票数の多い回答が優先されます。


コード上で、多くの改善ができます。var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");として記述できますがvar t=document.getElementById("digit").value[0]/1;if(t!=t)return void alert("Invalid digit.");、これは同じですが短いです。改善できる点がいくつかありますが、見た目は素晴らしいです!
イスマエルミゲル

4
@IsmaelMiguel TBH 1行で取得するためにJSミニファイアーを使用しました。ゴルフをするつもりはなかった。
カルビンの趣味

ああ、ちょっと...それは少し怠け者です...ゴルフの質問では、ゴルフ以外のコードを投稿します... あなたは私が言ったことに従う必要はありません。しかし、それは良いことです。
イスマエルミゲル

6
@IsmaelMiguel バグを見つけやすくするために、おそらくできる限り読みやすくするべきであると思われるユーティリティコードを投稿しました。しかし、実際には、それが機能する限り、スタックスニペットのコードサイズはチャレンジの結果に文字通り影響を与えません。
カルバンの趣味

3
text blocks may not be identical本当に?すべての数字がまったく同じコードである場合に、魔法のように異なる数字を返す2つの同一のコードブロックを与えることで、誰かがこのルールを破るのを見たいです^^
Falco

回答:


13

CJam、20 18 14 13 12 * 1 = 12

オンラインでそれを試し:0123456789

空のブロック

];BG*K+ :BD%

ソリッドブロック

];B9+33%:B4/

説明

Sp3000のソリューションと同様の戦略を使用して、各ブロックで変数の乗算、加算、および(おそらく)モジュロ演算を実行し、値を保存します。最適な解決策を見つけるために、古き良きブルートフォースを使用しました。すべての可能な初期値(CJam変数の初期値)および変換関数の可能な数百万のペアのスペースを検索するプログラムを作成し、すべての数字形式の出力が一意になるようにしました。次に、空のブロックで終わる数字形式の最終結果(8個)をフィルタリングして、別の乗算、加算、モジュロ式を介して正しい結果にマップできるようにします。

CPUで数日間検索した後、これまでの最良の結果は12のサイズになりました!このソリューションは、の値で始まり11、空のブロック変換関数はx * 16 + 20、空のブロック結果関数はx % 13、ソリッドブロック変換関数は(x + 9) % 33、ソリッドブロック結果関数はx / 4です。


23

> <>(魚)、5 * 10 = 50

空のブロック

   \   !9 
4n;    n/ 
1n;\      
       \  
0n;n7\\\  

ソリッドブロック

   \; n8/ 
     /!/!v
     \  ;6
3n;\ ! /nn
2n;n5<  8;

このコードには、論理も算術も含まれていません。「ミラー」(/および\)と2つの「矢印」(<およびv)を。他の唯一のフローコントローラは!、次の文字をジャンプする「トランポリン」()です。

IPは、東の左上隅から始まります。いくつかのリダイレクトの後、それはスタックにプッシュされて出力されn、プログラムはで終了します;ます。

プログラムの流れ

ブロックは、IPがどのポイントに到達したかという事実からプログラムの現在の状態を「認識」し、その状態に基づいて、ポインターを出す方向(次に実行するブロック)と正確な位置を決定しますポインターはそのままにしておく必要があります(新しい状態になります)。もちろん、ブロックは、この動作がすべてリダイレクタに由来するロジックを実行しません。


私はこのような答えを望んでいました。純粋な魔法。
EagleV_Attnam

11

CJam、23 22 19 * 1 = 19

空のブロック:

];G)B%:G"73860594"=

固体ブロック:

];GW*B+3*D%:G    7-

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

数学的偶然の一致と失敗で幸運を得ようとしているので、ここではマーティンのソリューションとは少し異なる一意性マッピングのアプローチを示します。

前記空きブロックが1を追加し、3を掛け、11を追加し、-1 11.固体ブロック乗算モジュロ取ると開始は、次いで、これは魔法のマップ13モジュロ取る03456789(空きブロックのどの端桁)に41753026、我々はインデックスを使用し、正しくするために。12にきちんとマッピングします89。これは7を引くことで解決できます。


7

CJam、28 27 x 1 = 27

ここから始まります。

空のブロック

U):U;                       

ソリッドブロック

];U):UW+:WF%"1302986_7_54"=

ここでテストしてください。コードが長すぎるため、コードのパーマリンクを提供できません。そのため、チャレンジのスニペットから手動でコピーする必要があります。

アイデアは、次のように形状をハッシュすることです。

  • 各「ピクセル」ごとにcounterをインクリメントしますU
  • 黒い「ピクセル」ごとUに、現在の合計W(で始まる-1)に追加します。最後に、このモジュロ15を使用して、一意の結果が得られ、ルックアップ文字列へのインデックス付けに使用されます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.