Python-> Piet,385 345个字符
可以生成任何Piet程序。我可以停在随机像素上,但是我想制作“有趣的”程序。该函数m
为像素绘制颜色,然后递归地进入每个相邻的像素。有更好的绘制随机斑点的方法,但是此方法已调整为以合理的步数终止,因此对于高尔夫来说已经足够了。该函数R(w,h,n)
将n个随机斑点吸引到(w x h)白色图像上,并以PPM格式打印结果。
我为自己产生的颜色而感到特别自豪-随机选择0 <= c < 20
,
`[0,192,255][int(x)]`for x in'0002212220200101121100'[c:c+3]
是Piet调色板中有效颜色的十进制代码(通过单轨格雷代码)。即,每种颜色由3个相邻位'0003...0'[c:c+3]
表示,并且每个条带表示不同的颜色。由于这不是3个字母上27个单词的完整列表,因此我非常幸运地找到了格雷码。
from random import*
r=randint
def R(w,h,n):
M=[6]*h*w
def m(x,y,c,d):M[y%h*w+x%w]=c;t=r(0,15)*(r(0,d)<2);t&8and m(x+1,y,c,d+1);t&4and m(x-1,y,c,d+1);t&2and m(x,y+1,c,d+1);t&1and m(x,y-1,c,d+1)
while n:m(r(0,w),r(0,h),r(0,19),0);n-=1
print"P3 %s %s 255 "%(w,h)+' '.join(`[0,192,255][int(x)]`for c in M for x in'0002212220200101121100'[c:c+3])
示例输出,由命令生成 R(30,40,500)
没有导入,我也可以将其编写为适当的(无分号)1-liner:
import random
R=(lambda P,I,E,T:lambda w,h,n:E(w,h,I(w,h,n,lambda z,c,d,t:sum((((z,c),)*t*T(0,1)or m((z[0]+a,z[1]+b),c,d+1,T(0,d)>1)for a,b in((0,1),(1,0),(-1,0),(0,-1))),()))))(range,lambda w,h,n,m:dict(sum((m((T(0,w),T(0,h)),T(0,19),0,0)for _ in P(n)),())),lambda w,h,M:"P3 %s %s 255 "%(w,h)+' '.join(' '.join(`(x&1)*255+(x&2)*96`for x in map(int,'0001121110100202212200'[c:c+3]))for c in(M[z]if z in M else 6for z in((x,y)for y in P(h)for x in P(w)))),random.randint)
但它是可笑的慢(几乎100个字符)......虽然我不完全知道为什么(而不是可怕的倾斜来查找出来)。