Bahasa deskripsi lukisan Mondrian

16

Tantangan ini terdiri dari pengkodean juru bahasa untuk bahasa deskripsi lukisan Mondrian (MPDL).

Definisi bahasa

Bahasa beroperasi pada setumpuk persegi panjang. Sebuah persegi panjang ditentukan oleh koordinat kiri atas dan koordinat kanan bawah. Koordinat harus bilangan bulat. Tumpukan diinisialisasi dengan satu persegi panjang dengan atribut(1,1,254,254)

Setiap perintah memiliki format berikut: <character><integer>

Ada tiga perintah:

v<integer>: melakukan split vertikal pada persegi panjang terbaru di stack, pada posisi yang ditunjukkan oleh parameter (sebagai persentase). Persegi panjang sumber dihapus dari tumpukan dan diganti dengan dua persegi panjang baru hasil perpecahan. Persegi panjang kiri didorong pada tumpukan, lalu persegi panjang kanan. Karena koordinat persegi panjang adalah bilangan bulat, pecahan harus dibulatkan menjadi bilangan bulat terbesar yang lebih kecil.

h<integer>: perpecahan horizontal. Persegi panjang atas didorong pada tumpukan, lalu persegi panjang bawah.

c<integer>: menghapus persegi panjang terbaru dari tumpukan dan mengecatnya ke warna yang diberikan sebagai parameter. 1 = putih, 2 = merah, 3 = biru, 4 = kuning

Tantangan

Tulis sebuah program yang mengambil sebagai parameter deskripsi lukisan dan membuat representasi bitmap 256x256 dari persegi panjang yang dilukis. Persegi panjang harus dipisahkan dengan garis hitam 3 piksel. Persegi panjang satu atau dua piksel harusnya memiliki piksel non-hitam yang disembunyikan oleh piksel hitam tepi.

Input dapat dibaca sebagai parameter atau sebagai file, terserah Anda. Perintah-perintah harus dipisahkan oleh spasi. Anda dapat mengasumsikan bahwa file input memiliki sintaks yang benar dan tidak memiliki spasi tambahan, tab, dll. Outputnya dapat langsung ditampilkan pada layar, atau disimpan ke file, terserah Anda.

Kode terpendek menang.

Uji

Sumber berikut:

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

Harus menghasilkan Komposisi II Merah, Biru dan Kuning :

masukkan deskripsi gambar di sini

Arnaud
sumber
1
Bahasanya tidak bagus. vdan hargumen harus dalam piksel
John Dvorak
Juga, saya tidak yakin apa gunanya memutar tumpukan alih-alih muncul.
John Dvorak
Menggunakan persentase memungkinkan Anda untuk memilih ukuran apa pun untuk bitmap output - hasilnya akan sama (hanya akan diskalakan)
Arnaud
1
Ya sesuatu seperti itu, tetapi perhatikan Anda masih bisa melakukannya tanpa elemen sintaks tambahan karena semua operator memiliki jumlah parameter yang konstan. Jadi di atas masih bisa diurai ketika direpresentasikan sebagai v30 v50 c1 c5 h70 v50 c1 c3 c2.
nutki
3
Sangat berharap seseorang menulis solusi di Piet !
Skyler

Jawaban:

6

Perl 5 + ImageMagick - 297

Mulai dengan sesuatu:

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"

Mengambil input pada baris perintah dan menghasilkan a.gif.

nutki
sumber
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

Program membaca instruksi sebagai satu baris dari stdin , jika ini tidak dapat diterima, beri tahu saya.

Mengkompilasi ke dalam program yang menggunakan flag -w lebar -h tinggi -o outputfile . Keluarkan file "a.svg", jika itu tidak segera jelas dari kode. Karena outputnya adalah gambar vektor, itu bukan 'pixel perfect'.

Ini adalah pertama kalinya saya bekerja dengan Diagram -paket, merasa bebas untuk menunjukkan kesalahan yang saya buat. Terutama setiap backend yang akan membuat saya output dengan kode lebih sedikit akan lebih baik.

Anda dapat melihat beberapa langkah pertama yang saya ambil ketika mengembangkan kode di http://paste.hskll.org/get/1737 . Itu berbeda dari kode di atas dalam impor dan tidak memiliki utama karena paste.hskll.org menyediakan lingkungan utama dan gambar sendiri.

shiona
sumber
2

Python - 434 405 377 364 361

Golf python pertama saya. Ini mungkin dapat ditingkatkan BANYAK, sehingga umpan balik sangat dihargai.

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]]
William Barbosa
sumber
1
Anda dapat menyimpan char dengan menggabungkan baris 4, 5 dengan titik koma. Juga a+=[x]bukannya a.append(x). Dan split tidak perlu argumen jika dipisahkan oleh spasi.
Sp3000
1

HTML + JavaScript ES6 (407)

Diuji dengan 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>

Mika Lammi
sumber
1
Jauh lebih golf! x.charAt(0)-> x[0]; x.substr-> x.slice; white yellow-> #fff #ff0; document.getElementById("c")-> c... dan banyak lagi
edc65
@ edc65 Terima kasih! Saya akan memperbaikinya lebih lanjut besok.
Mika Lammi
Terima kasih atas jawabannya, tetapi saya mencoba mengujinya dan saya memiliki layar putih?
Arnaud
@SuperChafouin Browser apa yang Anda gunakan? Saya tidak berpikir bahwa fungsi panah (dan hal-hal ES6 lainnya) benar-benar didukung kecuali di Firefox.
Mika Lammi
1

HTML + JavaScript (ES6) 335

Terlalu mirip dengan jawaban @mika - menandai CW.

  • ganti dengan fungsi alih-alih membagi ... peta
  • operator penyebaran
  • tekan 2 nilai sekaligus
  • operator ternary alih-alih properti fungsi

<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>

edc65
sumber