输出源代码的图像(非完全Quine)


29

高尔夫代码:打印源代码的图像。

要求

  1. 必须输出源代码本身的映像,而不是输出存储在其他位置并在运行时检索到的版本。
  2. 代码必须清晰易读,以手工复制并复制结果。

任何图像格式均适用。

奖金

  • 如果允许多个输出格式,则为分数的-10%。
  • 如果您的代码也是 “真实”字样,则为-15%。即它不读取其源代码,但源代码已嵌入(请参见此处的示例)
  • 如果您的代码是严格的标准,则为-30%-即代码的图像已嵌入程序中(Piet解决方案,我在找您。)

是否必须清晰易读?
Tim Seguine 2014年

7
“必须输出代码映像本身,而不是其他位置的存储版本。” 是否允许和/或要求读取源代码文件?
Tim Seguine 2014年

29
我刚刚在空白中实现了一个解决方案。生成的图像看起来很无聊。
霍华德

7
这是一个用Piet编写的有趣的图像奎因
ProgramFOX

Answers:




14

PHP-487×0.9×0.85 = 372.555(2000×99px)

<?php $y="imagecolorallocate";$l=[
'<?php $y="imagecolorallocate";$l=[',
'];$i=imagecreate(2e3,99);$y($i,99,99,99);$w=$y($i,$j=0,0,0);$z=function($_)use(&$j,$i,$w){imagestring($i,4,9,$j+=15,$_,$w);};$z($l[0]);foreach($l as$m)$z(chr(39).$m.chr(39).",");$z($l[1]);$argv[1]($i,"o");',
];$i=imagecreate(2e3,99);$y($i,99,99,99);$w=$y($i,$j=0,0,0);$z=function($_)use(&$j,$i,$w){imagestring($i,4,9,$j+=15,$_,$w);};$z($l[0]);foreach($l as$m)$z(chr(39).$m.chr(39).",");$z($l[1]);$argv[1]($i,"o");

如果警告很好,则PHP-479×0.9×0.85 = 366.435

<?php $y=imagecolorallocate;$l=[
'<?php $y=imagecolorallocate;$l=[',
'];$i=imagecreate(2e3,99);$y($i,99,99,99);$w=$y($i,$j=0,0,0);$z=function($_)use(&$j,$i,$w){imagestring($i,4,9,$j+=15,$_,$w);};$z($l[0]);foreach($l as$m)$z(chr(39).$m.chr(39).",");$z($l[1]);$argv[1]($i,o);',
];$i=imagecreate(2e3,99);$y($i,99,99,99);$w=$y($i,$j=0,0,0);$z=function($_)use(&$j,$i,$w){imagestring($i,4,9,$j+=15,$_,$w);};$z($l[0]);foreach($l as$m)$z(chr(39).$m.chr(39).",");$z($l[1]);$argv[1]($i,o);

您提供输出函数用作第一个命令行参数:

php timwolla.php imagepng

带有警告的解决方案:


5
我认为这是第一个实际的方法,而不仅仅是脚本读取其自身的源代码,或者只是截取其自身的屏幕截图。
nitro2k01 2014年

两个问题,您可以为小数使用不同的符号吗?这有点令人困惑。为什么图像这么小?很难看清(诚然我在打电话)
Pureferret 2014年

2
@Pureferret只是放大它。尽管被像素化了,但实际上还是很可读的。
Ruslan 2014年

1
@Pureferret只是更改了它们,我不记得英语有什么不同……
TimWolla 2014年

13

空格,125



















pbm格式输出图像文件。

如果您正在测试此代码,请通过单击“编辑”并在<pre>标签之间复制所有内容来复制它。

输出:

P1 1 1 0

7
手工复制,斜视屏幕,查看空格和制表符之间的细微差异 .... 运行程序 .. 硬盘爆炸
Jonathan Van Matre 2014年

17
该答案不符合要求2。图像可读性不足,无法再现源代码。
user2357112支持Monica 2014年

2
@ user2357112但是您不能证明这一点。这就是我在这里利用的漏洞。
duci9y 2014年

21
是的,我可以使用信息论。完全严格的辩解超出了600个字符的注释的范围,但是要点是,您的图像与不起作用的代码图像相同。
user2357112支持Monica 2014年

3
请原谅法国人,但可BS!规则规定该代码必须清晰易读。在Whitespace中编写代码并不能否认这一点。选中该程序后,该程序将显示在Sublime Text中:i.imgur.com/A2ZaQwI.png这是清晰的。不管您的程序输出是什么。此外,您还没有说明程序输出的是实际上的源代码还是只是一个空的图像。
nitro2k01 2014年

13

Mathematica,37个 31个字符

(#2[#1[#0[#1,#2]]]&)[Defer,Rasterize]

(Rasterize[#1[#0[#1]]]&)[Defer]

在此处输入图片说明

受到mathematica.stackexchange.com中答案的启发。


解释一下……#n代表什么?也许我们可以弄清楚。
Pureferret 2014年

至少它在没有FrontEnd的情况下有效。(Export["/tmp/out.png",%]在运行此命令后尝试使用)
Ruslan 2014年

2
@Pureferret #n表示n纯函数的参数(此时已创建&)。整个表达式扩展为Rasterize[Defer[#0[Defer,Rasterize]]],其中#0是原始纯函数的递归调用。从某种意义上说,这并不是严格的要求,但是它不需要任何前端即可工作,并且IMO是一个不错的解决方案。
Ruslan 2014年

我很欣赏Defer []和Rasterize []作为命令和命令对象的用法。我从未见过递归以这种方式呈现。
2014年

10

AppleScript,68 37

好吧,如果您可以在zsh中调用ImageMagick,那么这也是有效的。为了我自己的满意,我仍然在追求更优雅,更时髦的东西,但是为了纯粹的高尔夫,我们在这里:

新版本

do shell script "screencapture q.jpg"

旧版

tell application "System Events" to keystroke "#" using command down

我想这仍然会被击败,但是冗长的旧AppleScript为此做了简洁而令人敬佩的模仿。

停止你的奎因

do shell script "screencapture -c"

3
我认为,根据定义,quine会产生其源代码作为其唯一输出,但是不确定是否适用于此问题。nyx.net/~gthompso/quine.htm
duci9y 2014年

是的,我实际上是在尝试找出如何使其仅选择其自己的窗口的代码区域的方法,但是我认为我会继续进行此操作,以将自己的标志植入AppleScript领域。
乔纳森·范·马特雷

我认为这是有效的,并且期待这样的事情。
Pureferret 2014年

不是严格的要求。(不会以编程方式生成自己的源代码。)
nitro2k01 2014年

3
从技术上讲,除了Piet答案外,这些都不是严格的标准,因为这些语言都没有将图像作为源代码。但是我仍然决心做一个更严格的版本。:)
乔纳森·范·马特雷

8

Mathematica,83岁

SelectionMove[InputNotebook[],Previous,Cell];Rasterize@NotebookRead@SelectedCells[]

在此处输入图片说明


1
不是严格的要求。(不会以编程方式生成自己的源代码。)
nitro2k01 2014年

1
没有前端(in mathMathKernel),即使<<JavaGraphics`导入也无法使用。
Ruslan 2014年

8

Sh,X和ImageMagick 18.9:

 import -window root a.jpg

这应该在具有ImageMagick的任何外壳中都可以使用。

要仅打印代码前缀,clear &&此代码将在26.1中显示

clear && import -window root a.jpg

样本输出:

在此处输入图片说明


在我的计算机上经过测试,它可以工作。
user12205 2014年

4
Linux控制台上对我不起作用。您可能需要在需求中添加X。
Ilmari Karonen 2014年

2
不是严格的要求。(不会以编程方式生成自己的源代码。)
nitro2k01 2014年

1
@nitro我可能误用了“ Quine”一词,但是我的帖子的第一行只提到输出源代码的图像。我现在正在编辑以阐明我的初衷,也要使真/严格的奎因受益。
Pureferret 2014年

1
只是好奇,我看到了比特币和莱特币钱包。大约3年后,有什么重大收获?:D
Albert Renshaw

5

HTML5 / Javascript:615

<canvas id='i' width=500 height=5000></canvas><script>function d(){var e=document.getElementById("i");var t=e.getContext("2d");t.font="20px Arial";var n=400;var r=25;var i=(e.width-n)/2;var s=60;str="<canvas id='i' width=5000 height=500></canvas>\n<script>"+d+"d();"+wrapText+"<\/script>";wrapText(t,str,i,s,n,r)}function wrapText(e,t,n,r,i,s){var o=t.split(" ");var u="";for(var a=0;a<o.length;a++){var f=u+o[a]+" ";var l=e.measureText(f);var c=l.width;if(c>i&&a>0){e.lineWidth=1;e.strokeStyle="blue";e.strokeText(u,n,r);u=o[a]+" ";r+=s}else{u=f}}e.lineWidth=1;e.strokeStyle="blue";e.strokeText(u,n,r)}d()</script>

演示:http : //jsfiddle.net/E2738/2/

您可以右键点击图片并将其另存为PNG


2
它以<//script>
查尔斯

1
在小提琴的第11行末尾更改+wrapText+"<//script>";+wrapText+"<\/script>";
路加福音

@Charles感谢您指出这一点。固定。
Clyde Lobo 2014年

4

爪哇,570-10%-15%= 427.5

(包括“文件路径”),554-10%-15%= 415.5(不包括“文件路径”)
感谢Andreas删除BufferedImagejava.awt.image.BufferedImage

import java.awt.image.*;class Q{public static void main(String[]a)throws Exception{BufferedImage i=new BufferedImage(3500,12,1);String s="import java.awt.image.*;class Q{public static void main(String[]a)throws Exception{BufferedImage i=new BufferedImage(3500,12,1);String s=%s%s%s;char q=34;i.getGraphics().drawString(String.format(s,q,s,q,q,q,q,q),0,9);javax.imageio.ImageIO.write(i,%spng%s,new java.io.File(%sfilepath%s));}}";char q=34;i.getGraphics().drawString(String.format(s,q,s,q,q,q,q,q),0,9);javax.imageio.ImageIO.write(i,"png",new java.io.File("filepath"));}}

输出:在此处输入图片说明

要正确查看,请参见以下链接:http : //i.stack.imgur.com/RRSDw.png

除了将其输出到图像外,它的工作方式与常规的奎奴亚藜类似。当前格式为png,但是可以通过png使用所需的任何格式替换程序中的所有实例来轻松更改格式。

与这里的一些答案不同,这是一个真实的现象。没有读取程序文件。


如果将“ java.awt.image.BufferedImage”都替换为“ java.awt.image。*”,则可以去除另外24个字符
Andreas

4

JavaScript和JQuery的153 148

定期

(function f(){
  c=$('<canvas/>')[0];
  a=c.getContext('2d');
  l=('('+f+')()').split('\n');
  for(i=0;i<l.length;i++)
    a.fillText(l[i],5,12*(i+1));
  $('body').append('<img src="'
      +c.toDataURL("image/png")+'"/>')
})()
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

打高尔夫球

function f(){c=$('<canvas>')[0];c.width=750;a=c.getContext('2d');a.fillText(f+'f()',5,9);$('body').append('<img src="'+c.toDataURL("png")+'"/>')}f()
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


1
不是严格的要求。(不会以编程方式生成自己的源代码。)
nitro2k01 2014年

$?您也在使用jQuery吗?
克莱德·罗伯

@ClydeLobo是的,看来他是。等等,不用JQuery就可以做Javascript吗?谁曾想到!
皮埃尔·阿劳德

@ClydeLobo是的,我是。但是应该允许图书馆。确实与使用stdio.hxD 的C程序没有什么不同。不使用jQuery编写程序很容易。只需更换$('<canvas/>')[0]document.createElement('canvas')$('body').appenddocument.write。jQuery为我节省了字节。
aebabis 2014年

3

zsh,57×0.9 = 51.3

将输出文件名作为参数传递给它。

convert -annotate +0+10 "$(<$0)" -size 320x14 xc:white $1

产生:

输出示例


1
是zsh还是imagemagick?
卡亚2014年

@Kaya:恩,两个。语言是zsh(或bash,但不是Posix),并且库/工具是ImageMagick(如果需要,也可以是GraphicsMagick)–例如GD的PHP或RMagick的Ruby。
2014年

1
@Pureferret:已添加。
2014年

不是严格的要求。(不会以编程方式生成自己的源代码。)
nitro2k01 2014年

3

C99(使用SDL&SDL_ttf),414 354 346 - 15(%)= 294.1

#include<SDL_ttf.h>
#define Q(P)char*q=#P;P
Q(
i=5;main(){for(SDL_Surface*s=SDL_SetVideoMode(2048,80,SDL_Init(SDL_INIT_VIDEO),TTF_Init());i--;SDL_SaveBMP(s,"q.bmp"))SDL_BlitSurface(TTF_RenderText_Blended(TTF_OpenFont("q.ttf",9),(char*[]){"#include<SDL_ttf.h>","#define Q(P)char*q=#P;P","Q(",q,")"}[i],(SDL_Color){~0}),0,s,&(SDL_Rect){0,16*i});}
)

没有更多的换行符,这是非常丑陋的,但是不幸的是,它们需要缺席。文本呈现功能根本不压制控制字符,因此代码中的任何换行符都必须在输出中手动呈现。

这是相同的代码,但为了清晰起见还添加了一些额外的换行符:

#include<SDL_ttf.h>
#define Q(P)char*q=#P;P
Q(
i=5;main(){for(SDL_Surface*s=SDL_SetVideoMode(2048,80,
SDL_Init(SDL_INIT_VIDEO),TTF_Init());i--;SDL_SaveBMP(s,"q.bmp"))
SDL_BlitSurface(TTF_RenderText_Blended(TTF_OpenFont("q.ttf",9),
(char*[]){"#include<SDL_ttf.h>","#define Q(P)char*q=#P;P","Q(",q,")"}[i],
(SDL_Color){~0}),0,s,&(SDL_Rect){0,16*i});}
)

可悲的是,这并没有在图形输出中添加换行符:

输出

输出仍然清晰可见,尽管具有9点输出和红色字体颜色,但有点古怪。您可以通过将替换为来9以字符为代价来改善它12。(请注意,结果图像的尺寸被硬编码为2048x80。为适应各种字体的差异,已在右边距和开头处添加了一定数量的多余字符,以至于12号字体仍然可以舒适地适应。但是,如果您希望进一步增加尺寸,则可能还需要更改尺寸。)

生成程序的命令是:

gcc -Wall -o imgquine imgquine.c -lSDL_ttf `sdl-config --cflags --libs`

该程序假定q.ttf运行时当前目录中有一个字体文件。我事先通过运行以下命令(在大多数现代Linux上均应运行)来解决此问题:

ln -s `fc-match --format='%{file}' sans` ./q.ttf

(可以随意导入自己喜欢的TrueType字体。)

运行该程序后,将在当前目录中名为的文件中创建图像输出q.bmp。不幸的是,Windows位图文件是该程序提供的唯一输出格式。添加更多的输出格式将需要链接更多的库。

请注意,该程序利用C99的语法来引入非简单的文字值,从而大大减少了需要定义的变量数量。这是更多C高尔夫球手应该利用的东西。


2

C#-498-15%= 423.3

这可能打得更多。我以前从未在C#中完成过奎因斯或此类图形:

using System;using System.Drawing;class Q{static void Main(){var b = new Bitmap(3050, 20);var g=Graphics.FromImage(b);string f="using System;using System.Drawing;class Q{{static void Main(){{var b = new Bitmap(3050, 20);var g=Graphics.FromImage(b);string f={0}{1}{0},e={3}{0}{2}{0};g.DrawString(String.Format(f,(char)34,f,e,'@'),SystemFonts.MenuFont,Brushes.Black,0,0);b.Save(e);}}}}",e=@"D:\p.png";g.DrawString(String.Format(f,(char)34,f,e,'@'),SystemFonts.MenuFont,Brushes.Black,0,0);b.Save(e);}}

输出: 在此处输入图片说明

添加其他格式支持将很容易。不过,不确定是否值得。



1

Python:255 238 -10%-15%= 195.075 182.07

import sys,PIL.ImageDraw as D;i=D.Image.new('L',(2000,20));r="import sys,PIL.ImageDraw as D;i=D.Image.new('L',(2000,20));r=%r;D.Draw(i).text((0,0),r%%r,fill=255);i.save(sys.argv[1])";D.Draw(i).text((0,0),r%r,fill=255);i.save(sys.argv[1])

用法:

python imgquine.py quine.jpg

这是一个真实的信息,将输出绘制到命令行上指定的文件。只需更改文件扩展名即可设置文件格式(例如quine.jpgJPEG和quine.pngPNG)。

输出示例(2000x20图片):

奎因输出


您可以使用2e3代替来保存一些字符2000
卡亚2014年

@Kaya:不,我不能,不幸的2e3是:是floatImage.new要求ints。
nneonneo 2014年

哦,麻烦了,我以为会被胁迫。
卡亚2014年
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.