Mondrian resim tanımlama dili


16

Bu zorluk Mondrian resim tanımlama dili (MPDL) için bir tercüman kodlamasından oluşur .

Dil tanımı

Dil bir dikdörtgen yığını üzerinde çalışır. Bir dikdörtgen sol üst koordinatı ve sağ alt koordinatı ile tanımlanır. Koordinatlar tamsayı olmalıdır. Yığın, nitelikleri olan tek bir dikdörtgenle başlatılır(1,1,254,254)

Her komut aşağıdaki biçime sahiptir: <character><integer>

Üç komut vardır:

v<integer>: yığındaki en son dikdörtgenin üzerinde, parametre ile belirtilen konumda (yüzde olarak) dikey bir bölme gerçekleştirir. Kaynak dikdörtgen yığından kaldırılır ve ayrılmanın sonucu olan iki yeni dikdörtgenle değiştirilir. Sol dikdörtgen desteye, ardından sağ dikdörtgene itilir. Dikdörtgen koordinatlar tamsayı olduğu için kesirler en küçük daha küçük tamsayıya yuvarlanmalıdır.

h<integer>: yatay bölünmüş. Üst dikdörtgen önce yığına, sonra da alt dikdörtgene itilir.

c<integer>: en son dikdörtgeni yığından kaldırır ve parametre olarak verilen renge boyar. 1 = beyaz, 2 = kırmızı, 3 = mavi, 4 = sarı

Meydan okuma

Parametre olarak bir resim açıklaması alan ve boyalı dikdörtgenlerin 256x256 bitmap gösterimini oluşturan bir program yazın. Dikdörtgenler 3 piksel siyah bir çizgi ile ayrılmalıdır. Bir veya iki piksel dikdörtgenin siyah olmayan piksellerinin kenarlık siyah pikselleri tarafından gizlenmesi gerekir.

Giriş size bir parametre veya bir dosya olarak okunabilir. Komutlar bir boşlukla ayrılmalıdır. Girdi dosyasının doğru sözdizimine sahip olduğunu ve sondaki veya öndeki boşluklar, sekmeler vb. Olmadığını varsayabilirsiniz. Çıktı doğrudan ekranda görüntülenebilir veya bir dosyaya kaydedilebilir.

En kısa kod kazanır.

Ölçek

Aşağıdaki kaynak:

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

Kompozisyon II'yi Kırmızı, Mavi ve Sarı renkte üretmelidir :

resim açıklamasını buraya girin


1
Dil iyi değil. vve hargümanlar piksel cinsinden olmalıdır
John Dvorak

Ayrıca, haşhaş yerine yığını döndürmenin ne anlama geldiğinden emin değilim.
John Dvorak

Yüzdeleri kullanmak, çıktı bitmap'i için herhangi bir boyut seçmenize izin verir - sonuç aynı olacaktır (sadece ölçeklendirilecektir)
Arnaud

1
Evet böyle bir şey, ancak tüm operatörler sabit sayıda parametreye sahip olduğundan ekstra sözdizimi öğeleri olmadan da yapabileceğinizi unutmayın. Böylece yukarıda gösterildiği gibi hala ayrıştırılabilir v30 v50 c1 c5 h70 v50 c1 c3 c2.
nutki

3
Gerçekten birileri yazıyor bir çözüm umuduyla Piet !
Skyler

Yanıtlar:


6

Perl 5 + ImageMagick - 297

Başlamak için bir şey:

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"

Komut satırında girdi alır ve üretir 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

Program talimatları stdin'den bir satır olarak okur, bu kabul edilemezse bana bildirin.

-W width -h height -o outputfile bayraklarını alan bir programda derler . Koddan hemen anlaşılmadıysa bir "a.svg" dosyası çıkarır. Çıktı bir vektör görüntüsü olduğundan, 'piksel mükemmel' değildir.

Bu benim ilk kez Diyagramlar -paket ile çalışıyorum, yaptığım hataları belirtmekten çekinmeyin. Özellikle daha az kodla çıkmama izin veren herhangi bir arka uç iyi olurdu.

Kodu geliştirirken attığım ilk adımlardan bazılarını http://paste.hskll.org/get/1737 adresinde görebilirsiniz . Paste.hskll.org kendi ana ve çizim ortamını sağladığından, ithalatta yukarıdaki koddan farklıdır ve ana eksiktir.


2

Python - 434 405 377 364 361

İlk piton golfüm. Bu muhtemelen bir çok geliştirilebilir, bu nedenle herhangi bir geri bildirim takdir edilmektedir.

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
Çizgileri 4, 5 numaralı satırları noktalı virgülle birleştirerek kaydedebilirsiniz. Ayrıca a+=[x]yerine a.append(x). Ve split boşlukla ayrılırsa argüman gerektirmez.
Sp3000

1

HTML + JavaScript ES6 (407)

Firefox 32.0.3 ile test edildi

<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
Çok daha golf edilebilir! x.charAt(0)-> x[0]; x.substr-> x.slice; white yellow-> #fff #ff0; document.getElementById("c")-> c... ve daha fazlası
edc65

@ edc65 Teşekkürler! Yarın daha da geliştireceğim.
Mika Lammi

Cevabınız için teşekkürler, ama test etmeye çalışıyorum ve beyaz bir ekranım var mı?
Arnaud

@SuperChafouin Hangi tarayıcıyı kullanıyorsunuz? Firefox dışında ok işlevlerinin (ve diğer ES6 öğelerinin) gerçekten desteklendiğini düşünmüyorum.
Mika Lammi

1

HTML + JavaScript (ES6) 335

Mika yanıt - CW işaretlemesine çok benzer.

  • split ... map yerine fonksiyonla değiştir
  • yayma operatörü
  • aynı anda 2 değeri it
  • işlev özellikleri yerine üçlü operatör

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.