ภาษาคำอธิบายการวาดภาพ Mondrian


16

ความท้าทายนี้ประกอบด้วยการเข้ารหัสล่ามสำหรับภาษาคำอธิบายภาพวาดมอนเดรียน (MPDL)

นิยามภาษา

ภาษาดำเนินการกับกองสี่เหลี่ยม สี่เหลี่ยมถูกกำหนดโดยพิกัดด้านซ้ายบนและพิกัดล่างขวา พิกัดจะต้องเป็นจำนวนเต็ม สแต็กเริ่มต้นด้วยสี่เหลี่ยมเดียวที่มีคุณลักษณะ(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

ควรผลิตComposition II เป็นสีแดงน้ำเงินและเหลือง :

ป้อนคำอธิบายรูปภาพที่นี่


1
ภาษาไม่ดี vและhอาร์กิวเมนต์ควรเป็นพิกเซล
John Dvorak

นอกจากนี้ฉันไม่แน่ใจว่าจุดหมุนของสแต็คแทนที่จะเป็นอะไร
John Dvorak

การใช้เปอร์เซ็นต์ช่วยให้คุณสามารถเลือกขนาดของบิตแมปเอาท์พุท - ผลลัพธ์จะเท่ากัน (จะได้รับการปรับสัดส่วน)
Arnaud

1
ใช่สิ่งเช่นนั้น แต่โปรดทราบว่าคุณยังสามารถทำได้โดยไม่ต้องมีองค์ประกอบของไวยากรณ์เพิ่มเติมเนื่องจากตัวดำเนินการทั้งหมดมีพารามิเตอร์จำนวนคงที่ v30 v50 c1 c5 h70 v50 c1 c3 c2ดังนั้นข้างต้นสามารถแยกวิเคราะห์ยังคงเมื่อแสดงเป็น
nutki

3
หวังว่าจะมีคนเขียนคำตอบในPiet !
Skyler

คำตอบ:


6

Perl 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

Haskell - 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 กว้าง -h สูง -o outputfile ส่งออกไฟล์ "a.svg" หากยังไม่ได้ล้างรหัสในทันที เนื่องจากผลลัพธ์เป็นภาพเวกเตอร์จึงไม่ใช่ 'พิกเซลสมบูรณ์แบบ'

นี่เป็นครั้งแรกที่ฉันทำงานกับไดอะแกรม - แพคเกจอย่าลังเลที่จะชี้ให้เห็นข้อผิดพลาดใด ๆ ที่ฉันทำ โดยเฉพาะอย่างยิ่งแบ็กเอนด์ที่จะให้ฉันออกด้วยรหัสน้อยจะดี

คุณสามารถเห็นบางส่วนของขั้นตอนแรกผมเอาเมื่อมีการพัฒนารหัสในhttp://paste.hskll.org/get/1737 มันแตกต่างจากรหัสข้างต้นในการนำเข้าและขาดหลักเนื่องจาก paste.hskll.org ให้สภาพแวดล้อมหลักและการวาดภาพของตัวเอง


2

Python - 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)และการแยกไม่จำเป็นต้องมีข้อโต้แย้งถ้าแยกด้วยช่องว่าง
Sp3000

1

HTML + JavaScript 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
มากขึ้น golfable! x.charAt(0)-> x[0]; x.substr-> x.slice; white yellow-> #fff #ff0; document.getElementById("c")-> c... และอีกมากมาย
edc65

@ edc65 ขอบคุณ! ฉันจะปรับปรุงให้ดีขึ้นในวันพรุ่งนี้
Mika Lammi

ขอบคุณสำหรับคำตอบ แต่ฉันลองทดสอบและฉันมีหน้าจอสีขาว
Arnaud

@SuperChafouin เบราว์เซอร์ใดที่คุณใช้อยู่ ฉันไม่คิดว่าฟังก์ชั่นลูกศร (และสิ่ง ES6 อื่น ๆ ) ได้รับการสนับสนุนจริงๆยกเว้นใน Firefox
Mika Lammi

1

HTML + JavaScript (ES6) 335

คล้ายกันมากกับ @mika answer - การทำเครื่องหมาย CW

  • แทนที่ด้วยฟังก์ชั่นแทนแผนที่แยก ...
  • ผู้ประกอบการแพร่กระจาย
  • กด 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.