몬드리안 그림 설명 언어


16

이 과제는 MPDL ( Mondrian Painting Description Language) 의 통역사를 코딩하는 데 있습니다 .

언어 정의

언어는 사각형 스택에서 작동합니다. 사각형은 왼쪽 위 좌표와 오른쪽 아래 좌표로 정의됩니다. 좌표는 정수 여야합니다. 스택은 속성을 가진 단일 사각형으로 초기화됩니다(1,1,254,254)

각 명령의 형식은 다음과 같습니다. <character><integer>

세 가지 명령이 있습니다.

v<integer>: 스택의 최신 사각형에서 매개 변수로 표시된 위치 (백분율)에서 수직 분할을 수행합니다. 소스 사각형이 스택에서 제거되고 분할 결과로 생성 된 두 개의 새 사각형으로 바뀝니다. 왼쪽 사각형이 스택에서 밀린 다음 오른쪽 사각형이 밀립니다. 사각형 좌표는 정수이므로 분수는 가장 큰 작은 정수로 반올림해야합니다.

h<integer>: 수평 분할. 맨 위 사각형이 스택에서 밀린 다음 맨 아래 사각형이 밀립니다.

c<integer>: 스택에서 최신 직사각형을 제거하고 매개 변수로 지정된 색상으로 칠합니다. 1 = 흰색, 2 = 빨간색, 3 = 파란색, 4 = 노란색

도전

그림 설명을 매개 변수로 사용하고 그려진 사각형의 256x256 비트 맵 표현을 만드는 프로그램을 작성하십시오. 사각형은 3 픽셀의 검은 선으로 구분해야합니다. 하나 또는 두 개의 픽셀 사각형에는 검은 색이 아닌 픽셀이 검은 색 테두리로 숨겨져 있어야합니다.

입력은 매개 변수 또는 파일로 읽을 수 있습니다. 명령은 공백으로 구분해야합니다. 입력 파일에 올바른 구문이 있고 후행 또는 선행 공백, 탭 등이 없다고 가정 할 수 있습니다. 출력은 화면에 직접 표시되거나 파일에 직접 저장 될 수 있습니다.

가장 짧은 코드가 승리합니다.

테스트

다음 출처 :

v25 h71 v93 h50 c4 c1 c1 c2 h71 c3 h44 c1 c1

빨간색, 파란색 및 노란색으로 컴포지션 II를 생성해야합니다 .

여기에 이미지 설명을 입력하십시오


1
언어는 훌륭하지 않습니다. vh인수 픽셀에 있어야합니다
존 드보락

또한, 터지는 대신 스택을 회전시키는 지점이 무엇인지 잘 모르겠습니다.
John Dvorak

백분율을 사용하면 출력 비트 맵의 ​​크기를 선택할 수 있습니다. 결과는 동일합니다 (크기 만 조정 됨)
Arnaud

1
예, 그런 식이지만 모든 연산자에 일정한 수의 매개 변수가 있으므로 추가 구문 요소 없이도 여전히 할 수 있습니다. 따라서로 표현 될 때 위의 내용을 여전히 구문 분석 할 수 있습니다 v30 v50 c1 c5 h70 v50 c1 c3 c2.
nutki

3
정말 누군가가 Piet 에서 해결책을 쓰길 바라고 있습니다 !
Skyler

답변:


6

펄 5 + ImageMagick-297

시작할 것 :

sub a{my($x,$y,$X,$Y,$d)=@_;$_=shift@ARGV;
/v/?a($d=$x+($X-$x)*$'/100,$y,$X,$Y).a($x,$y,$d,$Y):
/h/?a($x,$d=$y+($Y-$y)*$'/100,$X,$Y).a($x,$y,$X,$d):
/c/&&"-fill ".qw/white red blue yellow/[$'-1]." -draw 'rectangle $x,$y $X,$Y' "}
system"convert -size 256x256 -stroke black xc: ".a(0,0,255,255)."a.gif"

명령 행에서 입력을 받아서를 생성 a.gif합니다.


2

하스켈-335

import Diagrams.Prelude
import Diagrams.Backend.SVG
c=centerXY
d((x:n):i)|x=='v'=(b#scaleX s#c|||a#scaleX(1-s)#c,k)|x=='h'=(b#scaleY s#c===a#scaleY(1-s)#c,k)|x=='c'=(square 1#fc([white,red,blue,yellow]!!(read n-1)),i)where{s=(read n)/100;(a,j)=d i;(b,k)=d j}
main=getLine>>=renderSVG"a.svg"(Width 256).pad 1.02.c.lwG 0.012.fst.d.words

허용되지 않는 경우 프로그램은 stdin에서 명령을 한 줄로 읽습니다 .

플래그 -w width -h height -o outputfile 을 사용하는 프로그램으로 컴파일 합니다. 코드에서 즉시 명확하지 않은 경우 "a.svg"파일을 출력합니다. 출력은 벡터 이미지이므로 '완벽한 픽셀'이 아닙니다.

Diagrams -package로 작업 한 것은 이번이 처음입니다. 제가 실수 한 점이 있으면 언제든지 알려주십시오. 특히 적은 코드로 출력 할 수있는 모든 백엔드가 좋습니다.

http://paste.hskll.org/get/1737 에서 코드를 개발할 때 수행 한 첫 번째 단계 중 일부를 볼 수 있습니다 . paste.hskll.org는 자체 메인 및 드로잉 환경을 제공하므로 수입시 위의 코드와 다르며 main이 부족합니다.


2

파이썬 - 434 405 377 364 361

내 첫 파이썬 골프. 이것은 아마도 많이 개선 될 수 있으므로 모든 의견을 부탁드립니다.

from turtle import*
a=[[1,1,254,254]]
for c in input().split():
 v,w,x,y=a.pop();p,b,f,g=int(c[1::1]),'hvc'.index(c[0]),x-v,y-w
 if b>1:goto(v,-w),color('#000',['#fff','red','#00f','#ff0'][p-1]),begin_fill(),[(fd(o),rt(90))for o in[f,g]*2],end_fill()
 else:a+=[[v,w,(x,v+(((x-v)/100)*p))[b],(w+(((y-w)/100)*p),y)[b]])],a+=[[[v,a[-1][2]][b],[a[-1][3],w][b],x,y]]

1
라인 4, 5를 세미콜론으로 병합하여 문자를 저장할 수 있습니다. 또한 a+=[x]대신에 a.append(x). 공백으로 분리하는 경우 split은 인수가 필요하지 않습니다.
Sp3000

1

HTML + 자바 스크립트 ES6 (407)

Firefox 32.0.3에서 테스트

<canvas id=c width=256 height=256><script>r=[[1,1,253,253]]
p=x=>r.push(x)
o=c.getContext("2d")
o.lineWidth=3
prompt().split(" ").map(x=>{q=r.pop()
v=q[0]
b=q[1]
n=q[2]
m=q[3],{c:x=>{o.beginPath()
o.rect(v,b,n,m)
o.fillStyle=[,"#fff","red","blue","#ff0"][x]
o.fill()
o.stroke()},v:x=>{s=x/100*n|0
p([v,b,s,m])
p([v+s,b,n-s,m])},h:x=>{s=x/100*m|0
p([v,b,n,s])
p([v,b+s,n,m-s])}}[x[0]](+x.slice(1))})</script>


1
훨씬 더 골프 타기! x.charAt(0)-> x[0]; x.substr-> x.slice; white yellow-> #fff #ff0; document.getElementById("c")-> c... and more
edc65

감사합니다! 내일 더 발전시킬 것입니다.
Mika Lammi

답변 주셔서 감사합니다,하지만 그것을 테스트하려고하고 흰색 화면이 있습니까?
Arnaud

@SuperChafouin 어떤 브라우저를 사용하고 있습니까? Firefox를 제외하고 화살표 기능 (및 기타 ES6 기능)이 실제로 지원되지 않는다고 생각합니다.
Mika Lammi

1

HTML + 자바 스크립트 (ES6) 335

@mika answer와 비슷합니다-CW 표시.

  • split ... map 대신 함수로 대체
  • 스프레드 연산자
  • 한 번에 2 개의 값을 밀어 넣기
  • 함수 속성 대신 삼항 연산자

<canvas id=c><script>
c.width=c.height=256,
s=[[1,1,253,253]],
o=c.getContext('2d'),
o.translate(0.5,0.5), // to avoid anti-alias on straight lines
o.lineWidth=3,
prompt().replace(/(\S)(\d+)/g,(_,c,n)=>(
p=s.pop(o.fillStyle=[,'#fff','red','#00f','#ff0'][n]),
c<'d'?(o.fillRect(...p),o.strokeRect(...p))
:(c=c<'i'|2,
 q=[...p],
 q[c]=r=q[c]*n/100|0,
 p[c]-=r,
 p[c-2]+=r,
 s.push(q,p))))
</script>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.