Python-> Piet, 385345 문자
이것으로 Piet 프로그램을 생성 할 수 있습니다. 난 그냥 임의의 픽셀에서 멈출 수 있었지만 "흥미로운"프로그램을 만들고 싶었습니다. 이 함수 m
는 픽셀에 색을 칠하고 각 픽셀 주변에 재귀 적으로 들어갑니다. 임의의 얼룩을 그리는 더 좋은 방법이 있지만 이것은 합리적인 단계로 종료되도록 조정되었으므로 골프에 충분합니다. 이 함수 R(w,h,n)
는 n 개의 랜덤 블롭을 ( w x h ) 흰색 이미지에 그리고 결과를 PPM 형식으로 인쇄합니다.
나는 색상을 생성하는 방법을 특히 자랑스럽게 생각합니다 0 <= c < 20
.
`[0,192,255][int(x)]`for x in'0002212220200101121100'[c:c+3]
는 단일 트랙 회색 코드 를 통해 Piet 팔레트에서 유효한 색상의 10 진수 코드입니다 . 즉, 각 색상은 3 개의 인접한 비트로 표현되며 모든 슬라이스 '0003...0'[c:c+3]
는 다른 색상을 나타냅니다. 이것은 3 글자로 된 27 단어의 전체 목록이 아니기 때문에 그레이 코드를 찾는 것이 정말 운이 좋았습니다.
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])
명령으로 생성 된 샘플 출력 R(30,40,500)
수입품이 없으면 적절한 (세미콜론 프리) 1 라이너로 쓸 수도 있습니다.
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)
그러나 그것은 엄청나게 느리다 (그리고 거의 100 자 더 길다). 그러나 나는 왜 그런지 완전히 알지 못한다.