আমি পাইথাগোরিয়ান গাছ পছন্দ করি


17

... তাই আমাকে গাছ বানানো চ্যালেঞ্জ।

গাছ নামে একটি প্রোগ্রাম বা ফাংশন তৈরি করুন যা একটি একক পূর্ণসংখ্যার যুক্তি, N গ্রহণ করে এবং পাইথাগোরিয়ান ট্রি এন স্তরগুলি গভীর করে যেখানে স্তর 0 কেবল ট্রাঙ্ক।

গাছের প্রতিটি সংযোগস্থলে ত্রিভুজের প্রান্তটি ঘেরের এলোমেলো বিন্দুতে রাখা উচিত (এই বিন্দুটি কমপক্ষে ৫ টি সমান দুরত্বের পয়েন্টে বা সম্পূর্ণ অর্ধবৃত্তের উপর সমানভাবে বিতরণ করা উচিত)।

Treeচ্ছিকভাবে আপনার গাছটি 3 ডি হতে পারে, রঙিন হতে পারে বা দিনের সময় অনুসারে আলোকিত হতে পারে। তবে এটি কোড-গল্ফ, তাই ক্ষুদ্রতম ফাইলটি জিতে।

সম্পাদনা: আমি প্রতিযোগিতাটি বন্ধ করে দেব এবং এক সপ্তাহ বয়সে সবচেয়ে ছোট উত্তরটি গ্রহণ করব



মিথ্যা। আমি একটি আলাদা অ্যালগোরিদমের পরে আছি :)
আলেকজান্ডার-ব্রেট

ঠিক আছে. যথেষ্ট ফর্সা। আপনি "পাইথাগোরিয়ান ট্রি" এ জমা দেওয়ার জন্য পুনরায় প্রত্যাখ্যান করার বিষয়টি বিবেচনা করতে পারেন।
ডেভিডসি

আমি ট্রেন পছন্দ করি? :)
টেমসডিং

উত্তর:


15

গণিত, 246 234 221 টি অক্ষর

g[n_,s_:1]:={p=RandomReal[q=Pi/2],r=##~Rotate~(o={0,0})&,t=Translate}~With~If[n<0,{},Join[#~t~{0,s}&/@(#~r~p&)/@g[n-1,s*Cos@p],t[#,s{Cos@p^2,1+Sin[2p]/2}]&/@(r[#,p-q]&)/@g[n-1,s*Sin@p],{Rectangle[o,o+s]}]]
f=Graphics@g@#&

এটি অবশ্যই এটি করার জন্য সবচেয়ে মার্জিত / সংক্ষিপ্ততম উপায় নয়।

ব্যবহার: f[8]

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

এবং এখানে f[6]এবং f[10]যথাক্রমে উদাহরণ আউটপুট ।

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

কিছুটা নাড়িত:

g[n_, s_:1] := With[{p},
  r = Rotate;
  t = Translate;
  p = RandomReal[q = Pi/2];
  If[n < 0, {},
   Join[
    (t[#, {0, s}] &) /@ (r[#, p, {0, 0}] &) /@ g[n - 1, s*Cos[p]],
    (t[#, s {Cos[p]^2, 1 + Sin[2 p]/2}] &) /@ (r[#, p - q, {0, 0}] &) /@
       g[n - 1, s*Sin[p]],
    {Rectangle[{0, 0}, {s, s}]}
    ]
   ]
  ]
f = Graphics@g[#] &

এটি বেশ চিত্তাকর্ষক। লজ্জাজনক আমার কাছে এটি পরীক্ষা করার জন্য গণিত নেই - আপনি আরও কয়েকটি উদাহরণ আউটপুট যুক্ত করতে পারেন?
অ্যালেক্সান্ডার-ব্রেট 21

@ আলি0শা সম্পাদনা দেখুন
মার্টিন এন্ডার

আপনার Showসেখানে দরকার নেই এবং Moduleএটি অপ্রয়োজনীয়ও।
ফিটফাট

@ সুইশ Showইঙ্গিতটির জন্য ধন্যবাদ , তবে আমি কীভাবে এ থেকে মুক্তি পাব Module? আমি যদি pস্থানীয় ঘোষণা না করি তবে এটি পুনরাবৃত্ত কলগুলিতে ওভাররাইট করা হবে, তাই আমি উভয় কল একই সাথে করতে পারি না, তাই না p?
মার্টিন ইন্ডার

@ এম.বয়েটনার সম্ভবত আপনি ব্যবহার করতে পারেন Blockযা এর চেয়ে কম Module
আলেফাল্ফ

20

সিএফডিজি, 134 টি অক্ষর

এটি যথাযথভাবে বৈধ নয়, কারণ আপনি পুনরাবৃত্তির গভীরতা সীমাবদ্ধ করতে পারবেন না। তবে সমস্যাটি কেবল সমাধানের জন্য বলে calls এই এক । :)

startshape t
c(q)=cos(q/2)^2
d(q)=1+sin(q)/2
p=acos(-1)
shape t{w=rand(p)
SQUARE[x .5 .5]t[trans 0 1 c(w) d(w)]t[trans c(w) d(w) 1 1]}

ফলাফলগুলি এরকম কিছু দেখাচ্ছে

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

অন্য 46 টি অক্ষরের জন্য ( মোট 180 টি অক্ষর ), আপনি এটি রঙ করতে পারেন:

startshape t
c(q)=cos(q/2)^2
d(q)=1+sin(q)/2
p=acos(-1)
shape t{w=rand(p)
SQUARE[x .5 .5 h 25 sat 1 b .2]t[trans 0 1 c(w) d(w) b .08 .8 h 2.2]t[trans c(w) d(w) 1 1 b .08 .8 h 2.2]}

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


আমি জানি এটি সম্পূর্ণ অনটপিক নয়, তবে "সাদা গোলমাল" এর পরিবর্তে, আপনি "বাদামী শব্দ" কোণ হিসাবে ব্যবহার করলে কোনও সংস্করণ কেমন হবে?
Maru 15s

@ সিনথেটিকাকে আপনি প্রায় 90 around এর সাথে আরও কম এবং 0 এবং 180 এর চেয়ে কম কোণে বোঝাতে চান?
মার্টিন ইন্ডার

@ সাইনথেটিকা ​​এটির মতোই । আমি প্রকৃত র্যান্ডম-ওয়াক আওয়াজ বাস্তবায়ন করতে পারিনি, কারণ এর জন্য একটি ইনপুট প্যারামিটার নেওয়া (সর্বশেষ এলোমেলো মান) দরকার হয়, এটি সামঞ্জস্য করে এটি চালিয়ে যায়। এটি ব্যাকরণের প্রসঙ্গটি সংবেদনশীল করে তুলবে এবং তাই সিএফডিজি সমর্থন করে না। আমি এলোমেলোভাবে নমুনায় একটি সাধারণ কিউবিক ফাংশনটি ব্যবহার করে এলোমেলো মানগুলিকে কেবল π / 2 এর দিকে আরও কিছুটা চাপ দিয়ে সামান্য এটি নকল করেছি aked
মার্টিন ইন্ডার

আমি মনে করি যে আপনার ইমগুর লিঙ্কটি নষ্ট হয়ে গেছে, এবং যদিও আমি রঙ এবং আকৃতি উপভোগ করি তবে আমি মনে করি যে আপনি উল্লেখ করেছেন সেই কারণেই আমাকে
এইটিকে

@ অ্যালি শ্যাশা আপনি ঠিক বলেছেন, এখানে স্থির লিঙ্ক । এটিকে অযোগ্য ঘোষণা করা একেবারে ন্যায্য, আমি কেবল কিছু লোকের সাথে প্রাসঙ্গিক ফ্রি আর্টটি ভাগ করে নিতে চেয়েছিলাম এবং এটি সমস্যার ঝরঝরে মতামত বলে মনে হয়েছিল। ;) ... ঠিক আছে আমি এখনও ম্যাথমেটিকার উত্তর পেয়েছি ^^
মার্টিন এন্ডার

4

পোস্টস্ক্রিপ্ট, 322 270

সম্পাদনা: এটি প্রদর্শিত হয় যে realtimeযথাযথ র্যান্ডম জেনারেটর বীজ হিসাবে ব্যবহার করা যাবে না। অতএব, আমরা এই উদ্দেশ্যে পরিবেশ পরিবর্তনশীল ব্যবহার করব এবং সেইভাবে প্রোগ্রামটি চালাব:

gs -c 20 $RANDOM -f tree.ps

অথবা

gswin32c -c 20 %RANDOM% -f tree.ps

এখন আমাদের গাছগুলি কম অনুমানযোগ্য। 14 জন বাইট মোট গণনা যোগ করা হয়। অন্যান্য পরিবর্তনগুলি: 1) প্রোগ্রাম যুক্তি এখন কমান্ড লাইনে পাস করা হয়েছে। 2) কোন স্পষ্ট পুনরাবৃত্তি কাউন্টার - স্ট্যাক আকার এই উদ্দেশ্যে পরিবেশন করে (বাম শাখা ঘূর্ণন কোণ স্ট্যাকের উপর সংরক্ষণ করা হয়, পরে ডান শাখা আঁকতে)। 3) প্রয়োজনীয় গভীরতার জন্য কোনও নামকরণযুক্ত ভেরিয়েবল নেই - স্ট্যাকের আকার স্ট্যাকের উপরের এটি অফসেট। এটি সেখানে প্রস্থান করার সময় বাকি আছে, অর্থাত এটি খাওয়া হয় না।

srand
250 99 translate
50 50 scale
/f{
    count
    dup index div dup 1 le{
        0 exch 0 setrgbcolor
        0 0 1 1 rectfill
        0 1 translate
        rand 5 mod 1 add 15 mul
        gsave
        dup rotate
        dup cos dup scale
        f
        grestore
        dup cos dup dup mul
        exch 2 index sin mul translate
        dup 90 sub rotate
        sin dup scale 1
        f
        pop
    }{pop}ifelse
}def
f

আমি মনে করি এটি বেশ সুস্পষ্ট - গ্রাফিক্সের রাজ্য প্রস্তুত এবং f প্রক্রিয়াটিকে প্রতিটি একটানা পর্যায়ের গভীরতার জন্য পুনরাবৃত্তভাবে বলা হয়, দু'বার - 'বাম' এবং 'ডান' শাখার জন্য। 1x1আকারের আয়তক্ষেত্রের সাথে কাজ করা (মূল স্কেল দেখুন) পাশের দৈর্ঘ্য দ্বারা গুণিত করার সমস্যা বাঁচায়। বাম শাখার আবর্তনের কোণটি এলোমেলোভাবে তৈরি করা হয়েছে - 5 টি এলোমেলোভাবে সমান দূরত্বযুক্ত বিভাগগুলির মধ্যে একটি ব্যবহৃত হয় - আমি মনে করি এটি অভিন্ন এলোমেলো জন্য কুৎসিত সম্ভাব্য কেসগুলি প্রতিরোধ করে।

এটি 20 বা ততোধিকের বেশি গভীরতার জন্য ধীর হতে পারে।

এরপরে ASCII- এনকোডেড বাইনারি টোকেন (সংযুক্ত বিষয় থেকে লুসার ড্রোগের উত্তর দেখুন) ব্যবহার করে গল্ফ করা সংস্করণ রয়েছে। মনে রাখবেন, cos, sin, randএই স্বরলিপি ব্যবহার করতে পারবে না।

/${{<920>dup 1 4 3 roll put cvx exec}forall}def srand 250 99<AD>$ 50 50<8B>$/f{count(8X68)$ 1 le{0(>)$ 0<9D>$ 0 0 1 1<80>$ 0 1<AD>$ rand 5 mod 1 add 15<~CecsG2u~>$ cos<388B>$ f(M8)$ cos(88l>)$ 2(X)$ sin<6CAD38>$ 90<A988>$ sin<388B>$ 1 f pop}{pop}(U)$}def f

/${{<920>dup 1 4 3 roll put cvx exec}forall}def
srand
250 99<AD>$
50 50<8B>$
/f{
count(8X68)$
1 le{
0(>)$ 0<9D>$
0 0 1 1<80>$
0 1<AD>$
rand 5 mod 1 add 15 
<~CecsG2u~>$
cos<388B>$ 
f
(M8)$
cos(88l>)$
2(X)$ sin<6CAD38>$
90<A988>$ sin<388B>$
1
f
pop
}{pop}(U)$
}def
f

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


আমি মনে করি যে এখানে শৈলীটি হ'ল কমান্ড লাইন যুক্তি যুক্ত করা দরকার যাতে এই স্কোরটি 344 হয় ... আমাকে বলতে হবে যে কোডগল্ফের মানদণ্ডের দ্বারাও এটি বেশ কার্যকরভাবে বিদেশী দেখায়। বাইনারি টোকেন দিয়ে আপনি এটি কতদূর পেতে পারেন? আপনি অবশ্যই
গাণিতিকের খুব বেশি

@ অলি0শা, -dGraphicsAlphaBitsবড় স্কোয়ারের দাগযুক্ত প্রান্তগুলি রোধ করার জন্য অ্যান্টি-ওরফে আউটপুটটির পতাকা, এটি বাদ দেওয়া যেতে পারে (বা যেমন 'পরিবেশে পরিবর্তনশীল হিসাবে' লুকানো ')। কিছু লোক এই পতাকা ছাড়াই এটি বেশি পছন্দ করতে পারে (গাছের পাতাগুলি আরও 'ভলিউম' পায়)। ঠিক আছে, সেই 20 বাইটগুলি এত গুরুত্বপূর্ণ নয়। আমি বলব 20-25% এসিআই-এনকোডেড বাইনারি টোকেন (লিঙ্কযুক্ত বিষয়ের উত্তর দিয়ে বিচার করা) ব্যবহার করে বন্ধ করব। এস্কি-এনকোডিং ছাড়াই 50% ছাড়, সিস্টেমের নাম টোকেন প্রতি 2 বাইনারি বাইট। কিছু সাধারণত বিজয়ী ভাষার মতো দেখাবে;)
ব্যবহারকারীর 2846289

আমার মনে হয় আপনার এটি করা উচিত - এটিকে এখানে আরও প্রতিযোগিতামূলক করুন :)
আলেকজান্ডার-ব্রেট

3

কফিসক্রিপ্ট 377 বি 352B

আমি কফিস্ক্রিপ্ট লেখার জন্য নোংরা অনুভব করছি তবে পাইথন 3 এর জন্য আমি একটি ভাল অঙ্কন প্যাকেজটি খুঁজে পাচ্ছি না: - /

Q=(n)->X=(D=document).body.appendChild(C=D.createElement('Canvas')).getContext('2d');C.width=C.height=400;M=Math;T=[[175,400,50,i=0]];S=M.sin;C=M.cos;while [x,y,l,a]=T[i++]
 X.save();X.translate x,y;X.rotate -a;X.fillRect 0,-l,l,l;X.restore();T.push [e=x-l*S(a),f=y-l*C(a),g=l*C(b=M.random()*M.PI/2),d=a+b],[e+g*C(d),f-g*S(d),l*S(b),d-M.PI/2] if i<2**n

জাভাস্ক্রিপ্ট 393 বি 385 বি

জাভাস্ক্রিপ্টে সামান্য সামান্য সুন্দর এবং আমি লুপটির সাথে অনেক বেশি খুশি তবে [x, y, z] = একটি বাক্য গঠন যা আমি কেবল কফিস্ক্রিপ্টকে হারাতে যথেষ্ট সংক্ষিপ্ত করতে পারি না

function Q(n){X=(D=document).body.appendChild(C=D.createElement('Canvas')).getContext('2d');C.width=C.height=600;M=Math;T=[[275,400,50,i=0]];while(A=T[i++]){X.save();X.translate(x=A[0],y=A[1]);X.rotate(-(a=A[3]));X.fillRect(0,-(l=A[2]),l,l);X.restore();S=M.sin;C=M.cos;i<M.pow(2,n)&&T.push([e=x-l*S(a),f=y-l*C(a),g=l*C(b=M.random()*M.PI/2),d=a+b],[e+g*C(d),f-g*S(d),l*S(b),d-M.PI/2])}}

আমি গণিতের সমাধানের চেয়ে প্রায় দ্বিগুণ লম্বা এই কথাটি বললাম: - / এটি কার্যকরভাবে দেখুন : http://jsfiddle.net/FK2NX/3/


কয়েকটি পরামর্শ: আপনি কফিস্ক্রিপ্টে লাইন বিরতির পরিবর্তে অর্ধপরিমাণ ব্যবহার করে কমপক্ষে 16 টি অক্ষর সংরক্ষণ করতে পারেন। উভয় ক্ষেত্রেই, Xফেরতের ক্ষেত্রে যদি কোনও পদ্ধতি থাকে তবে Xআপনি সেগুলি চেইন করতে পারেন। এবং আপনি সংরক্ষণ করে M.sinএবং M.cosএকক-অক্ষর ভেরিয়েবলগুলিতে আরও একটি ভাল গুচ্ছ সংরক্ষণ করতে পারেন ।
মার্টিন এন্ডার

দুর্ভাগ্যক্রমে প্রসঙ্গের ক্রিয়াকলাপগুলি প্রসঙ্গটি ফিরিয়ে দেয় না, যা দেখে আমি বেশ বিরক্ত হয়েছিলাম। এছাড়াও, আপনি এমসিনের নামটি মিস্রের নামে রাখতে পারেন, তবে এমএস = এমস লাইনটি তার সংরক্ষণের চেয়ে আরও বেশি চরিত্র গ্রহণ করবে ... আমি স্পেসগুলি সরিয়ে নেওয়ার দিকে নজর দেব।
আলেকজান্ডার-ব্রেট

না, আপনি ঠিক করতে পারেন s=M.sin
মার্টিন এন্ডার

আমি কীভাবে এস = এমসিন করতে পারি, তবে আর = এক্স.রোটেট না?
আলেকজান্ডার-ব্রেট

আমি মনে করি rotateব্যবহার করে this, এবং sinনা। আপনার মতো কিছু করা দরকার R=X.rotate.bind(X), তবে সম্ভবত এটি আর মূল্যহীন নয়।
মার্টিন এন্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.