Python -> Piet, 385 345 karakter
Bununla herhangi bir Piet programı oluşturmak mümkündür. Rasgele piksellerde durabilirdim ama "ilginç" programlar yapmak istedim. Fonksiyon m
bir piksele bir renk boyar ve tekrar tekrar bu piksel komşularına girer. Rastgele lekeler çizmenin daha iyi yolları var, ancak bu makul sayıda adımda sona erecek şekilde ayarlandı, bu nedenle golf için yeterince iyi. İşlev R(w,h,n)
, n rasgele bloğu ( w x s ) beyaz bir görüntünün üzerine çeker ve sonucu PPM formatında yazdırır.
Özellikle renkleri nasıl oluşturduğumla gurur duyuyorum - rastgele bir seçim için 0 <= c < 20
,
`[0,192,255][int(x)]`for x in'0002212220200101121100'[c:c+3]
Piet paletindeki geçerli bir rengin ondalık kodudur, tek izli Gray kodu ile . Yani, her renk 3 bitişik bit ile temsil edilir ve her dilim '0003...0'[c:c+3]
farklı bir rengi temsil eder. Bu, 3 harften oluşan 27 kelimenin tam listesi olmadığı için Gray kodunu bulma konusunda çok şanslıydım.
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])
Komut tarafından oluşturulan örnek çıktı R(30,40,500)
İçe aktarma olmadan, bunu uygun olarak (noktalı virgül içermeyen) 1 astar olarak da yazabilirim:
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)
ama gülünç derecede yavaş (ve neredeyse 100 karakter daha uzun) ... gerçi neden olduğundan tam olarak emin değilim (ve öğrenmeye meyilli değiller).