これは自己参照の問題です


49

タッパーの自己参照式(Wikipediaからコピー)

Tupperの自己参照式は、Jeff Tupperによって定義された式であり、平面内の非常に特定の場所で2次元でグラフ化すると、式自体を視覚的に再現するように「プログラム」できます。数式のグラフ化の演習として、さまざまな数学およびコンピューターサイエンスのコースで使用されます。

タッパーの自己参照式

床 フロア機能はどこに ありますか。

k次の543桁の数字にします。 960939379918958884971672962127852754715004339660129306651505519271702802395266424689642842174350718121267153782770623355993237280874144307891325963941337723487857735749823926629715517173716995165232890538221612403238855866184013235585136048828693337902491454229288667081096184496091705183454067827731551705405381627380967602565625016981482083418783163849115590225610003652351370343874461848378737238198224849863465033159410054974700593138339226497249461751545728366702369745461014655997933798537483143786841806593422227898388722980000748404719

1つのグラフの点の設定した場合(x, y)0 <= x < 106且つk <= y < k + 17上記の不等式を満足する、このように得られたグラフの外観(このプロットで軸が反転していることに注意してくださいが、そうでなければ画像が逆さまに出てきます)。

タッパーの自己参照式の結果

だから何?

この式の興味深い点は、可能な106x17の白黒画像をグラフ化するために使用できることです。現在、実際に検索して検索するのは非常に面倒なので、画像が表示されるk値を把握する方法があります。プロセスは非常に簡単です。

  1. 画像の最初の列の下のピクセルから始めます。
  2. ピクセルが白の場合、k値に0が追加されます。黒の場合は、1を追加します。
  3. ステップ2を繰り返して、列を上に移動します。
  4. 列の最後で、次の列に移動し、同じプロセスに従って下から始めます。
  5. 各ピクセルを分析した後、このバイナリ文字列を10進数に変換し、17を掛けてk値を取得します。

私の仕事は何ですか?

あなたの仕事は、106x17の画像を取り込み、対応するk値を出力できるプログラムを作成することです。次のことを想定できます。

  1. すべての画像は正確に106x17です
  2. すべての画像には黒(#000000)または白(#FFFFFF)ピクセルのみが含まれ、その間には何もありません。

いくつかのルールもあります。

  1. 出力は単にk値です。適切なベースにする必要がありますが、任意の形式にすることができます。
  2. 画像はPNGまたはPPMから読み取る必要があります。
  3. 標準的な抜け穴はありません。

テスト画像

[ 任天堂]は、〜1.4946x10 542を生成するはずです

[ 大きな数]は〜7.2355x10 159を生成するはずです

[ 2 ^ 1801 * 17]は2 1801 * 17を生成します

[ 2 ^ 1802-1 * 17]は(2 1802 -1)* 17を生成します

正確な解決策については、この要点をご覧ください。

これはなので、最小バイト数が勝ちます。


便利なリンク

ウィキペディア

Wolfram Mathworld


PPMを取り入れることはできますか?
マルティセン

編集:はい、PPM形式が許可されています。プログラムを思いついたとき、PNGを使用するつもりでしたが、PPMを許可すると、より多くのゴ​​ルフ言語が参加できるようになります。
カデ

3
この質問を読んでいたとき、「自分の仕事は何ですか」の部分に進む前に、quineどこかでこの言葉を見ることになりました。
ジェイコブ

私はこの種のことをすることができるプログラマのふりをするつもりはありません。代わりに、私は単に無邪気で真剣な質問を提示します。すなわち、ソリューションをフィードし、結果として生成された* .pngを見ますか?

@NotAsSharpAsYouGuys:任意精度の算術演算を行うのは簡単なことです。ピクセルごとにその式の結果を確認し、結果の画像を出力するだけです。
マッテオイタリア

回答:


12

CJam、16

l,l~q:~f*/W%ze_b

デニスに感謝します。オンラインで試す

URLに問題がある場合、これはテストした入力です。

P1
106 17
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000011111100000000000000000000000
0000000000000000000000000000000000000000000000000000000000000111111000
0000011111100110000000000000000000000000000000000000000000000000000000
0000000000000000000000000110011111100000100111100001000000000000001100
0110000000000000000000000000000000000000000000000000000000001000011110
0100010011111100001000000000000100101001110000000000000000000000000000
0011000000000000000000000100001111110010010110000110001000000000000100
0110010010000000011000000000000000000100100000000000000000000100011000
0110101111000000111111000000000001000110010011111100100100111001111100
0111001011110000000000000011111100000011111111000000110111000000000001
0000100111100000110000110001100000101000001100001000000000000011101100
0000111110110000001000010000000000010010000100100110011001100100100110
0100110010011001000000000000100001000000110110011000011000010000000000
0100110001001001100110011000001001100100110010011001000000000000100001
1000011001100111111111001100000000000100110001001001100110011001111001
1001001100100110010000000000001100111111111001101111111111111100000000
0001001010010010011001100101000110011001100000110000100000000000001111
1111111111010111001001001110000000000000110001101101100110011000111001
1001100111110011110000000000000001110010010011100010001001000100000000
0000000000000000000000000000000000000000000000000000000000000000000000
1000100100010000100000000001000000000000000000000000000000000000000000
0000000000000000000000000000000000001000000000010000010000000010000000
0000000000000000000000000000000000000000000000000000000000000000000000
0001000000001000000011111111000000000000000000000000000000000000000000
0000000000000000000000000000000000000000111111110000

コメントを削除して、ASCII pbmとしてエクスポートするときにGIMPが生成した形式を使用しました。

説明:

l,    read the first line ("P1" magic number) and get its length (2)
l~    read and evaluate the second line (106 17)
q     read the rest of the input (actual pixels)
:~    evaluate each character ('0' -> 0, '1' -> 1, newline -> nothing)
f*    multiply each number by 17
/     split into rows of length 106
W%    reverse the order of the rows
z     transpose
e_    flatten (effectively, concatenate the lines)
      now we have all the pixels in the desired order, as 0 and 17
b     convert from base 2 "digits" to a number

私はあなたのためにURLでそれを得ました。
mbomb007

@ mbomb007ありがとう、何が悪いのかわからない。
-aditsu

コメントを処理する必要がない場合はl;l~\qN-/W%zs:~2b*、同様に動作するはずです。
デニス

@Dennis OMG、そこにはいくつかのレベルの輝きがあります:)自分で投稿したいですか?
-aditsu

別の答えがあなたのものと十分に異なるとは思いません。
デニス

17

Pyth-21バイト

pythのi基本変換を行うのは簡単です。入力をPBMファイル名として受け取り、'コマンドを使用して読み取ります。私は!M黒と白を無効にするために使用する必要がありました。他のすべては自明です。

*J17i!MsC_cJrstt.z7 2

こちらからオンラインでお試しください。(Webインタープリターはファイルを読み取ることができないため、変更され、入力としてファイルを受け取ります)。


60
Pythの何も一目瞭然だとは思いません。:/
アレックスA.

3
私が知っている言語はこれを打ち負かすことができません。しかし、私が知っている言語はどれも「ゴルフのために作られた」ものではありません。
マヘシュ

リンクを開けない、パスが長すぎる、
ダン

サンプル画像が間違っているようです。P3ではなくP2を使用するつもりでしたか?
-aditsu

ああ、P2でもない、P1のように見えるが、逆になっている
-aditsu

9

Python 2:133110バイト

PILを使用したPythonでの最初の試み:

from PIL.Image import*
j=open(input()).load()
a=k=0
while a<1802:k=(j[a/17,16-a%17][0]<1)+k*2;a+=1
print k*17

以下の有益なコメンターに感謝します


2
Image.open(input())。loadを1回しか使用せず、変更しているように見えないので、var jを使用する代わりに、そのまま使用した方が良いと思いませんか?それはこのようなものになるだろうfrom PIL import Image k=0 for a in range(1802):y=a%17;x=a/17;k=(0 if Image.open(input()).load()[x,16-y][0]else 1)+k*2 print k*17
-Katenkyo

3
@Katenkyoのポイントを続けるa/17a%17、適切な場所にプラグインするだけで、1が真実で0が偽であるという事実を悪用することもできます。ここだこれらの変化の結果は、あなたは:) 111バイトにダウンになるだろう
カーデ

@Kateyenko、悲しいことinput()に、その変更を伴うループのすべての反復で呼び出されます。ただし、他のヒントを使用して編集していただきありがとうございます。
joc

1
(...<1) --> 0**...多分?
Sp3000

7

C#、199

これは楽しかった!ビットマップを106 * 17回再ロードしても問題はありませんか?いくつかのバイトを保存する機能としてそれを行いましたが、それが合法かどうかはわかりません。

BigInteger s(string i){return (Enumerable.Range(0,106).SelectMany(x=>Enumerable.Range(0,17).Select(y=>new BigInteger(new Bitmap(i).GetPixel(x,y).B==0?1:0)).Reverse()).Aggregate((x,y)=>(x<<1)+y)*17);}

i 入力ファイル名です。

また、単一の式として、それが1つの式であるという理由だけで、i提供またはサブベッドされます(167バイト)

(Enumerable.Range(0,106).SelectMany(x=>Enumerable.Range(0,17).Select(y=>new BigInteger(new Bitmap(i).GetPixel(x,y).B==0?1:0)).Reverse()).Aggregate((x,y)=>(x<<1)+y)*17)

1
質問は「あなたの仕事はプログラムを作成することです...」
ショーンレイサム

1

Mathematica 69バイト

17*FromDigits[1-Flatten[Reverse/@Transpose[ImageData@Binarize@#]],2]&

画像がモノクロ形式の場合、Binarize @は省略できます。

この関数は画像を再現します:

   ArrayPlot[Table[Boole[1/2<Floor[Mod[Floor[y/17]2^(-17Floor[x]-Mod[Abs[y],17]),2]]],{y,1+#,17+#},{x,106,1,-1}]]&
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.