ম্যান্ড্রিয়ান চিত্রকরনের বর্ণনার ভাষা


16

এই চ্যালেঞ্জটি একটি মন্ড্রিয়ান পেইন্টিং বিবরণ ভাষার (এমপিডিএল) জন্য দোভাষীকে কোডিংয়ের অন্তর্ভুক্ত।

ভাষার সংজ্ঞা

ভাষাটি আয়তক্ষেত্রের একটি স্তরে কাজ করে। একটি আয়তক্ষেত্রটি এর উপরের বাম স্থানাঙ্ক এবং নীচের ডান স্থানাঙ্ক দ্বারা সংজ্ঞায়িত করা হয়। স্থানাঙ্কগুলি অবশ্যই পূর্ণসংখ্যা হতে পারে। স্ট্যাকটি বৈশিষ্ট্য সহ একটি একক আয়তক্ষেত্র দিয়ে আরম্ভ করা হয়(1,1,254,254)

প্রতিটি কমান্ডের নিম্নলিখিত ফর্ম্যাট থাকে: <character><integer>

তিনটি আদেশ আছে:

v<integer>: প্যারামিটার দ্বারা নির্দেশিত অবস্থানে (শতাংশ হিসাবে) স্ট্যাকের সর্বশেষ আয়তক্ষেত্রে উল্লম্ব বিভাজন সম্পাদন করুন। উত্স আয়তক্ষেত্রটি স্ট্যাক থেকে সরানো হয়েছে এবং দুটি নতুন আয়তক্ষেত্র পরিবর্তিত হয়েছে যা বিভক্ত হওয়ার ফলস্বরূপ। বাম আয়তক্ষেত্রটি স্ট্যাকের উপর ঠেলাঠেলি করা হয়, তারপরে ডান আয়তক্ষেত্রটি। আয়তক্ষেত্রের স্থানাঙ্কগুলি পূর্ণসংখ্যা হিসাবে, ভগ্নাংশগুলি বৃহত্তর ছোট সংখ্যায় পূর্ণ হয়।

h<integer>: অনুভূমিক বিভাজন। শীর্ষ আয়তক্ষেত্রটি স্ট্যাকের উপরে ধাক্কা দেওয়া হয়, তারপরে নীচের আয়তক্ষেত্রটি।

c<integer>: স্ট্যাক থেকে সর্বশেষতম আয়তক্ষেত্র সরান এবং এটি প্যারামিটার হিসাবে প্রদত্ত রঙে রঙ করে। 1 = সাদা, 2 = লাল, 3 = নীল, 4 = হলুদ

চ্যালেঞ্জ

এমন একটি প্রোগ্রাম লিখুন যা পেন্টিংয়ের বিবরণ হিসাবে প্যারামিটার হিসাবে নেয় এবং রঙিত আয়তক্ষেত্রগুলির 256x256 বিটম্যাপ উপস্থাপনা তৈরি করে। আয়তক্ষেত্রগুলি অবশ্যই 3 পিক্সেল কালো লাইনের সাথে পৃথক করা উচিত। এক বা দুটি পিক্সেল আয়তক্ষেত্রে তার অ-কালো পিক্সেল সীমানা কালো পিক্সেল দ্বারা লুকানো থাকা উচিত।

ইনপুটটি প্যারামিটার হিসাবে বা কোনও ফাইল হিসাবে আপনি পড়তে পারেন। কমান্ডগুলি একটি স্পেস দ্বারা পৃথক করা উচিত। আপনি ধরে নিতে পারেন যে ইনপুট ফাইলে সঠিক বাক্য গঠন রয়েছে এবং এর পিছনে বা নেতৃস্থানীয় স্থান, ট্যাব ইত্যাদি নেই The

সংক্ষিপ্ততম কোডটি জয়ী।

পরীক্ষা

নিম্নলিখিত উত্স:

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

লাল, নীল এবং হলুদে রচনা II তৈরি করা উচিত :

এখানে চিত্র বর্ণনা লিখুন


1
ভাষা দুর্দান্ত নয়। vএবং hযুক্তিগুলি পিক্সেলগুলিতে হওয়া উচিত
জন ডিভোরাক

এছাড়াও, আমি নিশ্চিত নই যে পপিংয়ের পরিবর্তে স্ট্যাকটি ঘোরানোর মজাদার কী।
জন ডিভোরাক

শতাংশ ব্যবহার আপনাকে আউটপুট বিটম্যাপের জন্য যে কোনও আকার চয়ন করতে দেয় - ফলাফলটি একই হবে (কেবল এটি মাপা হবে)
Arnaud

1
হ্যাঁ এর মতো কিছু, তবে নোট করুন যে আপনি অতিরিক্ত সিনট্যাক্স উপাদানগুলি ছাড়াই এখনও করতে পারেন কারণ সমস্ত অপারেটরের নিয়মিত পরামিতি রয়েছে। সুতরাং হিসাবে উপস্থাপন যখন উপরের এখনও পার্স করা যাবে v30 v50 c1 c5 h70 v50 c1 c3 c2
নটকি

3
সত্যিই কেউ লিখেছেন যে একটি সমাধান প্রত্যাশী Piet !
স্কাইলার

উত্তর:


6

পার্ল 5 + চিত্রম্যাগিক - 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

প্রোগ্রামটি স্টিডিনের এক লাইন হিসাবে নির্দেশাবলীটি পড়ে , যদি এটি অগ্রহণযোগ্য হয় তবে আমাকে জানান।

ফ্ল্যাগ -W প্রস্থ -h উচ্চতা -O আউটপুটফাইলে লাগে এমন একটি প্রোগ্রামে সংকলন করে কোনও "a.svg" ফাইল আউটপুট করে যদি তা তাৎক্ষণিকভাবে কোড থেকে পরিষ্কার না হয় clear যেহেতু আউটপুটটি একটি ভেক্টর চিত্র, এটি 'পিক্সেল নিখুঁত' নয়।

ডায়াগ্রাম-প্যাকেজের সাথে এটি আমার প্রথম কাজ, আমি যে কোনও ভুল করেছি তা নির্দ্বিধায় মনে করি। বিশেষত যে কোনও ব্যাকএন্ড যা আমাকে কম কোড দিয়ে আউটপুট করতে দেয় তা দুর্দান্ত হবে।

Http://paste.hskll.org/get/1737 কোডটি বিকাশ করার সময় আমি যে প্রথম পদক্ষেপ নিয়েছি তা আপনি দেখতে পারেন । এটি আমদানিগুলির ক্ষেত্রে উপরের কোড থেকে পৃথক এবং মূল অভাবের কারণ পেস্ট.হস্কেল.আর.আর.গ্রيا তার নিজস্ব প্রধান এবং অঙ্কন পরিবেশ সরবরাহ করে।


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)। এবং সাদা অংশে পৃথক হলে বিভাজনের পক্ষে কোনও যুক্তির দরকার নেই।
Sp3000

1

এইচটিএমএল + জাভাস্ক্রিপ্ট ES6 (407)

ফায়ারফক্স 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 ধন্যবাদ! আগামীকাল এটিকে আরও উন্নত করব।
মিকা লাম্মি

উত্তরের জন্য ধন্যবাদ, তবে আমি এটি পরীক্ষা করার চেষ্টা করি এবং আমার একটি সাদা পর্দা আছে?
আর্নাউড

আপনি কি ব্রাউজারটি ব্যবহার করছেন? আমি মনে করি না যে ফায়ারফক্স ব্যতীত তীর ফাংশনগুলি (এবং অন্যান্য ES6 স্টাফ) সত্যই সমর্থিত।
মিকা লাম্মি

1

এইচটিএমএল + জাভাস্ক্রিপ্ট (ES6) 335

@ মিকা উত্তরের সাথে খুব মিল - সিডব্লিউ চিহ্নিত করে।

  • বিভক্ত ... মানচিত্রের পরিবর্তে ফাংশন দিয়ে প্রতিস্থাপন করুন
  • স্প্রেড অপারেটর
  • একবারে 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.