मुझे पाइथागोरस के पेड़ पसंद हैं


17

... तो यह मेरे लिए एक पेड़ बनाने की चुनौती है।

एक प्रोग्राम या फंक्शन को ट्री कहा जाता है जो एक पूर्णांक तर्क लेता है, N और एक पायथागॉरियन ट्री N लेवल को गहरा खींचता है, जहाँ लेवल 0 केवल ट्रंक है।

पेड़ के प्रत्येक जंक्शन को परिधि पर एक यादृच्छिक बिंदु पर त्रिभुज के शीर्ष को रखना चाहिए (यह बिंदु समान रूप से कम से कम 5 समान रूप से स्थान बिंदुओं पर वितरित किया जाना चाहिए, या पूरे अर्धवृत्त पर समान रूप से वितरित किया जाना चाहिए)।

वैकल्पिक रूप से आपका पेड़ 3 डी हो सकता है, रंगीन हो सकता है, या दिन के समय के अनुसार जलाया जा सकता है। हालांकि, यह कोड-गोल्फ है, इसलिए सबसे छोटी फ़ाइल जीत जाती है।

संपादित करें: मैं प्रतियोगिता को बंद कर दूंगा और सबसे छोटा जवाब स्वीकार करूंगा जब यह एक सप्ताह का हो जाएगा


डुप्लिकेट प्रतीत होता है: codegolf.stackexchange.com/questions/18785/…
DavidC

असत्य। मैं एक अलग एल्गोरिथ्म के बाद हूं :)
अलेक्जेंडर-ब्रेट

ठीक है। काफी उचित। आप "पाइथागोरस ट्री" को प्रस्तुत करने पर विचार कर सकते हैं।
डेविड

मुझे रेलगाड़ी पसंद है? :)
tomsmeding

जवाबों:


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[#] &

यह काफी प्रभावशाली है। शर्म की बात है कि मुझे इसका परीक्षण करने के लिए गणित नहीं है - क्या आप उदाहरण आउटपुट के एक और जोड़े को जोड़ सकते हैं?
एलेक्जेंडर-ब्रेट

@ अलियाशा संपादित देखें
मार्टिन

आप Showवहाँ की जरूरत नहीं है , और Moduleभी अनावश्यक है।
बेंत की मार

@ हाइश Showसंकेत के लिए धन्यवाद , लेकिन मैं कैसे छुटकारा पा सकता हूं Module? यदि मैं pस्थानीय घोषित नहीं करता हूं , तो इसे पुनरावर्ती कॉल में अधिलेखित कर दिया जाएगा, इसलिए मैं एक ही के साथ दोनों कॉल नहीं कर सका p, है ना?
मार्टिन एंडर

@ m.buettner शायद आप उपयोग कर सकते हैं Block, जो इससे छोटा है Module
इलफ़लफा

20

सीएफडीजी, 134 वर्ण

यह एक बिल्कुल मान्य नहीं है, क्योंकि आप पुनरावृत्ति की गहराई को सीमित नहीं कर सकते। लेकिन समस्या सिर्फ इस एक में समाधान के लिए कहता है । :)

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

यहाँ छवि विवरण दर्ज करें


मुझे पता है कि यह पूरी तरह से ontopic नहीं है, लेकिन "सफेद शोर" के बजाय एक संस्करण कैसे दिखाई देगा, आपने कोण के रूप में "भूरे रंग के शोर" का उपयोग किया था?
atı

@Synthetica का मतलब है 90 ° से अधिक कोण और 0 और 180 पर कम?
मार्टिन एंडर

@Synthetica इसके समान । मैं वास्तविक रैंडम-वॉक शोर को लागू नहीं कर सका, क्योंकि इसके लिए एक इनपुट पैरामीटर (अंतिम रैंडम वैल्यू) लेने की जरूरत है, इसे एडजस्ट करना और इसे पास करना। यह व्याकरण के संदर्भ को संवेदनशील बनाता है और इसलिए CFDG द्वारा समर्थित नहीं है। मैं इसे थोड़ा बेतरतीब ढंग से यादृच्छिक मूल्यों पर एक साधारण क्यूबिक फ़ंक्शन का उपयोग करके यादृच्छिक मानों को थोड़ा और बढ़ा देता हूं।
मार्टिन एंडर

मुझे लगता है कि आपका imgur लिंक टूट गया है, और यह भी कि मैं रंग और आकृति का आनंद लेता हूं, मुझे लगता है कि मुझे इस कारण से अयोग्य घोषित करना होगा
अलेक्जेंडर-ब्रेट

@ अलियाशा आप सही कह रहे हैं, यहाँ निश्चित लिंक है । इसको अयोग्य घोषित करना बिल्कुल उचित है, मैं सिर्फ कुछ लोगों के साथ कॉन्टेक्स्ट फ्री आर्ट को साझा करना चाहता था और यह समस्या के लिए एक साफ दृष्टिकोण की तरह लग रहा था। ;) ... खैर मैं अभी भी गणित का जवाब मिला ^ ^
मार्टिन एंडर

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 या उससे अधिक की आवश्यक गहराई के लिए धीमा हो सकता है।

अगला गॉकेटेड संस्करण है, एएससीआईआई-एन्कोडेड बाइनरी टोकन (लिंक किए गए विषय से लुसर ड्रोग का उत्तर देखें) का उपयोग करते हुए। ध्यान दें, 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 में शामिल करने की आवश्यकता है ... मुझे यह कहना है कि कोडगॉल्फ मानकों द्वारा भी यह बहुत प्रभावशाली विदेशी दिखने वाला है। बाइनरी टोकन के साथ आप इसे कितनी दूर कर सकते हैं? आप निश्चित रूप से गणितज्ञ से दूर नहीं हैं
अलेक्जेंडर-ब्रेट

@ अलिहाशा, -dGraphicsAlphaBitsबड़े वर्गों के दांतेदार किनारों को रोकने के लिए एंटी-अलियास आउटपुट के लिए एक ध्वज है, इसे छोड़ा जा सकता है (या उदाहरण के वातावरण में 'छिपा हुआ')। कुछ लोग इस झंडे के बिना इसे अधिक पसंद कर सकते हैं (पेड़ के पत्ते अधिक मात्रा में मिलते हैं)। ठीक है, उन 20 बाइट्स इतना महत्वपूर्ण नहीं है। मैं कहता हूँ कि 20-25% का उपयोग आस्की-एन्कोडेड बाइनरी टोकन (लिंक किए गए विषय के जवाब से देखते हुए) का उपयोग करके किया जाता है। हो सकता है कि असिसी-एन्कोडिंग के बिना 50% की छूट, सिस्टम नाम टोकन प्रति 2 बाइनरी बाइट्स। आम तौर पर जीतने वाली भाषाओं की तरह दिखेंगे;)
user2846289

मुझे लगता है कि आपको यह करना चाहिए - इसे यहां थोड़ा और अधिक प्रतिस्पर्धी बनाएं :)
अलेक्जेंडर-ब्रेट

3

कॉफ़ीस्क्रिप्ट 377B 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

जावास्क्रिप्ट 393B 385B

जावास्क्रिप्ट में थोड़ा सा सुंदर और मैं लूप के लिए बहुत खुश हूँ, लेकिन बिना [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एकल-वर्ण चर में सहेज सकते हैं ।
मार्टिन एंडर

दुर्भाग्य से संदर्भ संचालन संदर्भ को वापस नहीं करते हैं, जिससे मैं बहुत परेशान था। इसके अलावा, आप M.sin का नाम बदलकर Ms कर सकते हैं, लेकिन पंक्ति Ms = M.sin को सहेजने से अधिक वर्ण लेता है ... मैं रिक्त स्थान को अलग करने पर ध्यान दूंगा।
अलेक्जेंडर-ब्रेट

नहीं, आप बस कर सकते हैं s=M.sin
मार्टिन एंडर

मैं कैसे आ सकता हूँ S = M.sin, लेकिन R = X.rotate नहीं?
एलेक्जेंडर-ब्रेट

मुझे लगता है rotateउपयोग करता है this, और sinनहीं करता है। आपको ऐसा कुछ करने की आवश्यकता होगी R=X.rotate.bind(X), लेकिन यह शायद इसके लायक नहीं है।
मार्टिन एंडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.