高尔夫代码:打印源代码的图像。
要求
- 必须输出源代码本身的映像,而不是输出存储在其他位置并在运行时检索到的版本。
- 代码必须清晰易读,以手工复制并复制结果。
任何图像格式均适用。
奖金
- 如果允许多个输出格式,则为分数的-10%。
- 如果您的代码也是 “真实”字样,则为-15%。即它不读取其源代码,但源代码已嵌入(请参见此处的示例)
- 如果您的代码是严格的标准,则为-30%-即代码的图像已嵌入程序中(Piet解决方案,我在找您。)
高尔夫代码:打印源代码的图像。
要求
任何图像格式均适用。
奖金
Answers:
<?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 $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
带有警告的解决方案:
(#2[#1[#0[#1,#2]]]&)[Defer,Rasterize]
(Rasterize[#1[#0[#1]]]&)[Defer]
Export["/tmp/out.png",%]
在运行此命令后尝试使用)
#n
表示n
纯函数的参数(此时已创建&
)。整个表达式扩展为Rasterize[Defer[#0[Defer,Rasterize]]]
,其中#0
是原始纯函数的递归调用。从某种意义上说,这并不是严格的要求,但是它不需要任何前端即可工作,并且IMO是一个不错的解决方案。
好吧,如果您可以在zsh中调用ImageMagick,那么这也是有效的。为了我自己的满意,我仍然在追求更优雅,更时髦的东西,但是为了纯粹的高尔夫,我们在这里:
新版本
do shell script "screencapture q.jpg"
旧版
tell application "System Events" to keystroke "#" using command down
我想这仍然会被击败,但是冗长的旧AppleScript为此做了简洁而令人敬佩的模仿。
do shell script "screencapture -c"
SelectionMove[InputNotebook[],Previous,Cell];Rasterize@NotebookRead@SelectedCells[]
math
或MathKernel
),即使<<JavaGraphics`
导入也无法使用。
import -window root a.jpg
这应该在具有ImageMagick的任何外壳中都可以使用。
要仅打印代码前缀,clear &&
此代码将在26.1中显示
clear && import -window root a.jpg
样本输出:
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
<//script>
+wrapText+"<//script>";
为+wrapText+"<\/script>";
(包括“文件路径”),554-10%-15%= 415.5(不包括“文件路径”)
感谢Andreas删除BufferedImage
了java.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
使用所需的任何格式替换程序中的所有实例来轻松更改格式。
与这里的一些答案不同,这是一个真实的现象。没有读取程序文件。
定期
(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>
$
?您也在使用jQuery吗?
stdio.h
xD 的C程序没有什么不同。不使用jQuery编写程序很容易。只需更换$('<canvas/>')[0]
与document.createElement('canvas')
和$('body').append
用document.write
。jQuery为我节省了字节。
将输出文件名作为参数传递给它。
convert -annotate +0+10 "$(<$0)" -size 320x14 xc:white $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高尔夫球手应该利用的东西。
这可能打得更多。我以前从未在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);}}
输出:
添加其他格式支持将很容易。不过,不确定是否值得。
require "RMagick"
include Magick
Draw.new.annotate(i=Image.new(999,99),0,0,0,9,File.read($0))
i.display
每个请求的示例输出:i.imgur.com/jMC594C.png
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.jpg
JPEG和quine.png
PNG)。
输出示例(2000x20图片):
2e3
代替来保存一些字符2000
。
2e3
是:是float
,Image.new
要求int
s。