Python -> Piet, 385 345 car
Il est possible de générer n'importe quel programme Piet avec cela. J'aurais pu m'arrêter à des pixels aléatoires, mais je voulais créer des programmes "intéressants". La fonction m
peint un pixel une couleur et pénètre récursivement dans chacun de ces pixels voisins. Il existe de meilleures façons de dessiner des blobs aléatoires, mais cela est réglé pour se terminer en un nombre raisonnable d'étapes, donc c'est assez bon pour le golf. La fonction des R(w,h,n)
jeux n blobs aléatoires sur une ( w x h ) image blanche, et affiche le résultat en format PPM.
Je suis particulièrement fier de la façon dont je génère les couleurs - pour un choix aléatoire de 0 <= c < 20
,
`[0,192,255][int(x)]`for x in'0002212220200101121100'[c:c+3]
est le code décimal d'une couleur valide dans la palette Piet au moyen d'un code Gray à piste unique . Autrement dit, chaque couleur est représentée par 3 bits adjacents, et chaque tranche '0003...0'[c:c+3]
représente une couleur différente. Comme ce n'est pas la liste complète de 27 mots sur 3 lettres, j'ai vraiment eu de la chance de trouver le code 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])
Exemple de sortie, généré par la commande R(30,40,500)
Sans l'importation, je peux également l'écrire en tant que 1 ligne (sans point-virgule):
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)
mais c'est ridiculement lent (et près de 100 caractères de plus) ... même si je ne sais pas vraiment pourquoi (et pas terriblement enclin à le découvrir).