Python -> Piet, 385 345 Zeichen
Es ist möglich, ein beliebiges Piet-Programm damit zu generieren. Ich hätte einfach bei zufälligen Pixeln stehen bleiben können, aber ich wollte "interessante" Programme machen. Die Funktion m
malt ein Pixel in eine Farbe und springt rekursiv in jedes der Nachbarpixel. Es gibt bessere Möglichkeiten, um zufällige Blobs zu zeichnen, aber dies ist so abgestimmt, dass es in einer angemessenen Anzahl von Schritten endet, also ist es gut genug für Golf. Die Funktion R(w,h,n)
zeichnet n zufällige Blobs auf ein ( B x H ) weißes Bild und druckt das Ergebnis im PPM-Format.
Ich bin besonders stolz darauf, wie ich die Farben generiere - für eine zufällige Auswahl von 0 <= c < 20
,
`[0,192,255][int(x)]`for x in'0002212220200101121100'[c:c+3]
ist der Dezimalcode für eine gültige Farbe in der Piet-Palette über einen einspurigen Gray-Code . Das heißt, jede Farbe wird durch 3 benachbarte Bits dargestellt, und jeder Schnitt '0003...0'[c:c+3]
repräsentiert eine andere Farbe. Da dies nicht die vollständige Liste von 27 Wörtern in 3 Buchstaben ist, habe ich wirklich Glück gehabt, den Gray-Code zu finden.
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])
Beispielausgabe, die vom Befehl generiert wird R(30,40,500)
Ohne den Import kann ich es auch als richtigen (Semikolon-freien) 1-Liner schreiben:
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)
aber es ist lächerlich langsam (und fast 100 Zeichen länger) ... obwohl ich nicht ganz sicher bin warum (und nicht schrecklich geneigt, es herauszufinden).