Python -> Piet, 385 345 char
Es posible generar cualquier programa Piet con esto. Podría haberme detenido en píxeles aleatorios, pero quería hacer programas "interesantes". La función m
pinta un píxel por color, y recursivamente pasa a cada uno de esos píxeles vecinos. Hay mejores formas de dibujar blobs aleatorios, pero esto está ajustado para terminar en un número razonable de pasos, por lo que es lo suficientemente bueno para el golf. La función R(w,h,n)
dibuja n blobs aleatorios en una imagen blanca ( w x h ) e imprime el resultado en formato PPM.
Estoy especialmente orgulloso de cómo genero los colores, para una elección aleatoria de 0 <= c < 20
,
`[0,192,255][int(x)]`for x in'0002212220200101121100'[c:c+3]
es el código decimal para un color válido en la paleta Piet a través de un código gris de una sola pista . Es decir, cada color está representado por 3 bits adyacentes, y cada corte '0003...0'[c:c+3]
representa un color diferente. Como esta no es la lista completa de 27 palabras en 3 letras, realmente tuve la suerte de encontrar el código 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])
Salida de muestra, generada por el comando R(30,40,500)
Sin la importación, también puedo escribirlo como un 1-liner adecuado (sin punto y coma):
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)
pero es ridículamente lento (y casi 100 caracteres más largos) ... aunque no estoy completamente seguro de por qué (y no estoy terriblemente inclinado a averiguarlo).