这是一个自我参考的问题


49

百乐的自指配方(从维基百科复制)

Tupper的自指代公式是Jeff Tupper定义的公式,当在平面中非常特定的位置以二维方式绘制图形时,可以对其进行“编程”以直观地再现公式本身。它在各种数学和计算机科学课程中用作绘图公式的练习。

特珀的自指公式

地板 楼层功能在哪里 。

我们k是以下543位数字: 960939379918958884971672962127852754715004339660129306651505519271702802395266424689642842174350718121267153782770623355993237280874144307891325963941337723487857735749823926629715517173716995165232890538221612403238855866184013235585136048828693337902491454229288667081096184496091705183454067827731551705405381627380967602565625016981482083418783163849115590225610003652351370343874461848378737238198224849863465033159410054974700593138339226497249461751545728366702369745461014655997933798537483143786841806593422227898388722980000748404719

如果一个图的点的集合(x, y)0 <= x < 106,并k <= y < k + 17满足上面给出的不平等,结果图如下所示(请注意,在该地块的轴已经发生了逆转,否则画面出来倒):

特珀自引用公式的结果

所以呢?

关于此公式的有趣之处在于,它可以用于绘制任何可能的黑白106x17图像。现在,从头到尾的搜索实际上非常繁琐,因此有一种方法可以计算出图像出现的k值。这个过程非常简单:

  1. 从图像第一列的底部像素开始。
  2. 如果像素为白色,则k值将附加一个0。如果是黑色,请附加1。
  3. 向上移动列,重复步骤2。
  4. 一旦到达该列的末尾,请按照相同的过程移至下一列并从底部开始。
  5. 分析完每个像素后,将此二进制字符串转换为十进制,然后乘以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吗?
Maltysen 2015年

编辑:是的,允许使用PPM格式。当我提出该程序时,我打算使用PNG,但允许PPM应该允许更多的高尔夫语言参与。
卡德2015年

3
在阅读此问题时,在进入“我的工作是什么”部分之前,我很肯定会在quine某个地方看到这个词。
雅各布

我不会假装自己是可以做这种事情的程序员,相反,我只会提出一个无辜的,认真的问题:是的,但是可以反向进行吗?即输入解决方案并看到作为结果生成的* .png吗?

@NotAsSharpAsYouGuys:如果您具有任意精度的算术,那么它是微不足道的,您只需检查每个像素的该公式的结果并输出结果图像。
Matteo Italia

Answers:


12

CJam,16岁

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

非常感谢丹尼斯。在线尝试

如果您在使用网址时遇到问题,这是我测试的输入:

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

我使用了GIMP导出为ASCII pbm时生成的格式,并删除了注释。

说明:

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

我在您的网址中找到了它。
mbomb007

@ mbomb007谢谢,不确定出了什么问题。
aditsu

如果您不必处理评论,也l;l~\qN-/W%zs:~2b*应同样有效。
丹尼斯

@Dennis OMG,那里有几个层次的光彩:)想自己发布吗?
aditsu

我认为单独的答案与您的答案不会有太大不同。
丹尼斯2015年

17

Pyth-21个字节

只需使用pyth的i基本转换即可。将输入作为PBM文件名并使用'命令读取。我不得不用来!M否定黑人和白人。其他一切都是不言自明的。

*J17i!MsC_cJrstt.z7 2

在这里在线尝试。(Web解释器无法读取文件,因此已被修改并以文件作为输入)。


60
我认为Pyth中的任何内容都不言自明。:/
Alex A.15年

3
我知道没有一种语言能胜过这一门。但是话又说回来,我所知道的语言都不是“为高尔夫而生”的语言。
Mahesh

无法打开链接,路径太长,当(Safari 8.1)
Kametrixom 2015年

您的示例图片似乎有问题。您是要使用P2而不是P3吗?
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并且看起来好像您没有对其进行修改,所以按原样使用它而不是使用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/17并插入a%17适当的位置,并且您可以滥用以下事实:1是真实的,0是虚假的。下面是这些变化的结果,你会下降到111个字节:)
卡德

@Kateyenko,可悲的input()是,每次修改该循环时都会调用它。尽管有其他提示进行编辑,谢谢。
2015年

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 是输入文件名。

同样,作为一个单独的表达式,仅因为它是一个带有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}]]&
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.