Python -> Piet, 385 345 char
Có thể tạo bất kỳ chương trình Piet nào với điều này. Tôi chỉ có thể dừng lại ở các pixel ngẫu nhiên, nhưng tôi muốn tạo ra các chương trình "thú vị". Hàm này m
vẽ một pixel một màu và đệ quy từng bước vào từng pixel đó. Có nhiều cách tốt hơn để vẽ các đốm màu ngẫu nhiên, nhưng điều này được điều chỉnh để chấm dứt trong một số bước hợp lý, vì vậy nó đủ tốt để chơi gôn. Hàm này R(w,h,n)
vẽ n đốm màu ngẫu nhiên lên hình ảnh trắng ( w x h ) và in kết quả ở định dạng PPM.
Tôi đặc biệt tự hào về cách tôi tạo ra màu sắc - cho một sự lựa chọn ngẫu nhiên 0 <= c < 20
,
`[0,192,255][int(x)]`for x in'0002212220200101121100'[c:c+3]
là mã thập phân cho một màu hợp lệ trong bảng màu Piet bằng mã Gray theo dõi đơn . Nghĩa là, mỗi màu được biểu thị bằng 3 bit liền kề và mỗi lát cắt '0003...0'[c:c+3]
đại diện cho một màu khác nhau. Vì đây không phải là danh sách đầy đủ gồm 27 từ trên 3 chữ cái, tôi thực sự may mắn khi tìm được mã Gray.
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])
Đầu ra mẫu, được tạo bởi lệnh R(30,40,500)
Không cần nhập, tôi cũng có thể viết nó dưới dạng 1-liner thích hợp (không có dấu chấm phẩy):
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)
nhưng nó chậm đến mức nực cười (và dài hơn 100 ký tự) ... mặc dù tôi không hoàn toàn chắc chắn tại sao (và không có khuynh hướng khủng khiếp để tìm hiểu).