モンドリアン絵画記述言語


16

この課題は、モンドリアン絵画記述言語(MPDL)のインタープリターのコーディングにあります。

言語定義

この言語は、長方形のスタックで動作します。長方形は、左上の座標と右下の座標で定義されます。座標は整数でなければなりません。スタックは、属性を持つ単一の長方形で初期化されます(1,1,254,254)

各コマンドの形式は次のとおりです。 <character><integer>

次の3つのコマンドがあります。

v<integer>:スタック内の最新の長方形で、パラメーターで示された位置(パーセンテージ)で垂直分割を実行します。ソースの長方形はスタックから削除され、分割の結果の2つの新しい長方形に置き換えられます。左の長方形がスタックにプッシュされ、次に右の長方形がプッシュされます。長方形の座標は整数であるため、分数は最も小さい整数に丸められる必要があります。

h<integer>:水平分割。上の長方形がスタックにプッシュされ、次に下の長方形がプッシュされます。

c<integer>:スタックから最新の長方形を削除し、パラメーターとして指定された色にペイントします。1 =白、2 =赤、3 =青、4 =黄

チャレンジ

パラメータとしてペイントの説明を取り、ペイントされた長方形の256x256ビットマップ表現を作成するプログラムを作成します。長方形は、3ピクセルの黒い線で区切る必要があります。1ピクセルまたは2ピクセルの長方形は、黒以外のピクセルを境界線の黒ピクセルで非表示にする必要があります。

入力は、パラメータまたはファイルとして読み取ることができます。コマンドはスペースで区切る必要があります。入力ファイルには正しい構文があり、末尾または先頭のスペース、タブなどがないと仮定できます。出力は、画面に直接表示するか、ファイルを自分で保存できます。

最短のコードが優先されます。

テスト

次のソース:

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

赤、青、黄色コンポジションIIを生成する必要があります。

ここに画像の説明を入力してください


1
言語は素晴らしいものではありません。引数はピクセル単位である必要がvありhます
ジョンドヴォルザーク14年

また、ポップする代わりにスタックを回転させることのポイントがわからない。
ジョン・ドヴォルザーク

パーセンテージを使用すると、出力ビットマップのサイズを選択できます-結果は同じになります(スケーリングのみ)
Arnaud 14年

1
ええ、そのようなことですが、すべての演算子には定数のパラメーターがあるため、余分な構文要素がなくても実行できることに注意してください。したがって、上記はとして表される場合でも解析できますv30 v50 c1 c5 h70 v50 c1 c3 c2
nutki 14年

3
誰かがPietで解決策を書くことを本当に望んでいます!
スカイラー

回答:


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

ハスケル-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から1行として読み取ります。これが受け入れられない場合はお知らせください。

フラグ-w width -h height -o outputfileを取り込むプログラムにコンパイルします。 コードからすぐに明確にならない場合、「a.svg」ファイルを出力します。出力はベクトル画像であるため、「ピクセル完璧」ではありません。

Diagrams -packageを使用するのはこれが初めてです。私が犯した間違いを気軽に指摘してください。特に、より少ないコードで出力できるようにするバックエンドは素晴らしいでしょう。

http://paste.hskll.org/get/1737でコードを開発するときに私が取った最初のステップのいくつかを見ることができます。paste.hskll.orgは独自のメインおよび描画環境を提供するため、インポートの点で上記のコードとは異なり、mainがありません。


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)。空白で区切る場合、splitは引数を必要としません。
Sp3000 14年

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
はるかにゴルフ可能です!x.charAt(0)-> x[0]; x.substr-> x.slice; white yellow-> #fff #ff0; document.getElementById("c")- > c...ともっと
edc65

@ edc65ありがとう!明日はさらに改善します。
ミカランミ14年

答えてくれてありがとう、でも試してみると白い画面が表示されますか?
アルノー

@SuperChafouinどのブラウザを使用していますか?Firefoxを除き、矢印関数(およびその他のES6のもの)が実際にサポートされているとは思いません。
ミカランミ14年

1

HTML + JavaScript(ES6)335

@mikaの回答に似すぎます-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.