एक पडोवन सर्पिल उत्पन्न करें


34

परिचय

फाइबोनैचि अनुक्रम के समान, पैडोवैन सीक्वेंस ( OEIS A000931 ) संख्याओं का एक क्रम है जो अनुक्रम में पिछले शब्दों को जोड़कर निर्मित होता है। प्रारंभिक मान इस प्रकार हैं:

P(0) = P(1) = P(2) = 1

0, 1 और 2 शब्द सभी 1 हैं। पुनरावृत्ति संबंध नीचे बताया गया है:

P(n) = P(n - 2) + P(n - 3)

इस प्रकार, यह निम्नलिखित अनुक्रम देता है:

1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37, 49, 65, 86, 114, 151, 200, 265, 351, ...

समबाहु त्रिभुज की लंबाई के रूप में इन संख्याओं का उपयोग करने से आपको एक अच्छा सर्पिल प्राप्त होता है, जब आप उन सभी को एक साथ रखते हैं, जैसे कि फिबोनाची सर्पिल:

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

चित्र विकिपीडिया के सौजन्य से


कार्य

आपका कार्य एक प्रोग्राम लिखना है जो इस सर्पिल को ग्राफिकल आउटपुट द्वारा फिर से बनाता है, जिसके साथ इनपुट भी होता है।

नियम

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

आप मान सकते हैं कि इनपुट> 0 होगा और इनपुट का सही प्रारूप दिया जाएगा।

स्कोरिंग

यह , इसलिए बाइट्स में सबसे छोटा कोड जीत जाता है। सभी को नए साल की शुभकामनाएँ!


लाइनों के बाद अनुगामी स्थान की अनुमति है?
पावेल

@ फावेल हाँ। मुझे वह जोड़ने दें
एंड्रयू ली

क्या आउटपुट को उदाहरण के समान होना चाहिए या प्रतिबिंब और घुमाव (60 डिग्री के गुणक) की अनुमति है?
लेवल रिवर सेंट

@LevelRiverSt मैं इसकी अनुमति दूंगा। मुझे पद में स्पष्ट करें।
एंड्रयू ली

3
एक ही चुनौती में ASCII कला और चित्रमय आउटपुट दोनों की अनुमति देने का प्रशंसक नहीं है। वे बहुत अलग कार्य कर रहे हैं, और उन्हें एक साथ मिलाना दो अलग-अलग संभावनाओं को पूरी तरह से अतुलनीय हल करने के उत्तर देता है। बेहतर होगा कि दो अलग-अलग चुनौतियाँ हों, एक ASCII कला के लिए और दूसरी चित्रमय आउटपुट के लिए।
मार्टिन एंडर

जवाबों:


12

गणितज्ञ, ११ ९ १० 119 बाइट्स

11 बाइट्स बचाने के लिए मार्टिन एंडर को धन्यवाद!

±n_:=If[n<4,1,±(n-2)+±(n-3)];Graphics@Line@ReIm@Accumulate@Flatten@{0,z=I^(2/3),±# z^(#+{2,4,1})&~Array~#}&@

एक सकारात्मक पूर्णांक तर्क (1-अनुक्रमित) ले रहा है और ग्राफिक्स आउटपुट लौटा रहा है। इनपुट के लिए उदाहरण आउटपुट 16:

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

Simulataneously के साथ विकसित flawr के मैटलैब जवाब लेकिन डिजाइन भी परिभाषा सहित कई समानताएं के साथ I^(2/3)एकता की छठी जड़ के लिए! पढ़ने में आसान संस्करण:

1  (±n_:=If[n<4,1,±(n-2)+±(n-3)];
2   Graphics@Line@ReIm@
3   Accumulate@Flatten@
4   {0,z=I^(2/3),±# z^(#+{2,4,1})&~Array~#}
5  ])&

पंक्ति 1 पादोवण अनुक्रम को परिभाषित करता है ±n = P(n)। लाइन 4 जटिल संख्याओं का एक नेस्टेड सरणी बनाता है, zजिस तरह से परिभाषित करता है; अंतिम भाग ±# z^(#+{2,4,1})&~Array~#कई त्रिभुज उत्पन्न करता है, जिनमें से प्रत्येक वैक्टर से मेल खाता है जिसे हमें संबंधित त्रिभुज ( दिशाओं ±#को z^(#+{2,4,1})नियंत्रित करते समय लंबाई को नियंत्रित करता है) को पूरा करने के लिए खींचने की आवश्यकता है । पंक्ति 3 को घोंसले के शिकार से छुटकारा मिलता है और फिर जटिल संख्या के चल रहे योगों की गणना करता है, ताकि वैक्टर से शुद्ध निर्देशांक में परिवर्तित किया जा सके; पंक्ति 2 तब वास्तविक संख्याओं के जोड़े के लिए जटिल संख्याओं को परिवर्तित करती है, और इसी बहुभुज रेखा को आउटपुट करती है।


1
कुछ भी नहीं है कि मैं सिर्फ बेवकूफ था।
मार्टिन एंडर

9

मतलाब, 202 190 बाइट्स

N=input('');e=i^(2/3);f=1/e;s=[0,e,1,f,-e,e-2];l=[1,1,1,2];M=N+9;T=[l,2:M-3;2:M+1;3:M+2];for k=5:N;l(k)=l(k-2)+l(k-3);s(k+2)=s(k+1)+e*l(k);e=e*f;end;T=[T;T(1,:)];plot(s(T(:,1:N)));axis equal

N=19(1-आधारित अनुक्रमण) के लिए आउटपुट :

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

व्याख्या

मोटा विचार मूल रूप से जटिल संख्याओं के साथ काम कर रहा है। तब त्रिकोण के किनारे हमेशा एकता की छठी जड़ की दिशा में इंगित करते हैं।

N=input('');                         % Fetch input
e=i^(2/3);                           % 6th root of unity
f=1/e;                               %  "
s=[0,e,1,f,-e,e-2];                  % "s" is a list of vertices in the order as the spiral is defined
l=[1,1,1,2];                         % "l" is a list of edge-lengths of the triangles
for k=5:N;                           % if we need more values in "l"/"s" we calculate those
    l(k)=l(k-2)+l(k-3);
    s(k+2)=s(k+1)+e*l(k);
    e=e*f;
end;
M=N+9;
T=[[1,1,1,2,2:M-3];2:M+1;3:M+2]';    % this matrix describes which vertices from s are needed for each triangle (the cannonical way how meshes of triangles are stored)
trimesh(T(1:N,:),real(s),imag(s));   % plotting the mesh, according to "T"
axis equal

अच्छी नौकरी! क्या स्पष्टीकरण की कोई संभावना है?
एंड्रयू ली

स्पष्टीकरण जोड़ा गया!
त्रुटिपूर्ण

वास्तव में यहां जटिल संख्याओं का उपयोग पसंद है।
चमकीले

7

PHP + SVG, 738 बाइट्स

<?php
$a=[1,1,1];
for($i=0;$i<99;)$a[]=$a[$i]+$a[++$i];
$d=$e=$f=$g=$x=$y=0;
$c=[333,999];
$z="";
foreach($a as$k=>$v){
if($k==$_GET['n'])break;
$h=$v/2*sqrt(3);
if($k%6<1){$r=$x+$v/2;$s=$y+$h;$t=$r-$v;$u=$s;}
if($k%6==1){$r=$x-$v/2;$s=$y+$h;$t=$x-$v;$u=$y;}
if($k%6==2){$r=$x-$v;$s=$y;$t=$r+$v/2;$u=$y-$h;}
if($k%6==3){$r=$x-$v/2;$s=$y-$h;$t=$r+$v;$u=$s;}
if($k%6==4){$r=$x+$v/2;$s=$y-$h;$t=$r+$v/2;$u=$y;}
if($k%6>4){$r=$x+$v;$s=$y;$t=$r-$v/2;$u=$y+$h;}
$d=min([$d,$r,$t]);
$e=max([$e,$r,$t]);
$f=min([$f,$s,$u]);
$g=max([$g,$s,$u]); 
$p="M$x,{$y}L$r,{$s}L$t,{$u}Z";
$z.="<path d=$p fill=#{$c[$k%2]} />";
$x=$r;
$y=$s;
}
?>
<svg viewBox=<?="$d,$f,".($e-$d).",".($g-$f)?> width=100% height=100%>
<?=$z?>
</svg>

16 के लिए आउटपुट

<svg viewBox=-53,-12.124355652982,75.5,42.435244785437 width=100% height=100%>
<path d=M0,0L0.5,0.86602540378444L-0.5,0.86602540378444Z fill=#333 /><path d=M0.5,0.86602540378444L0,1.7320508075689L-0.5,0.86602540378444Z fill=#999 /><path d=M0,1.7320508075689L-1,1.7320508075689L-0.5,0.86602540378444Z fill=#333 /><path d=M-1,1.7320508075689L-2,0L0,0Z fill=#999 /><path d=M-2,0L-1,-1.7320508075689L0,0Z fill=#333 /><path d=M-1,-1.7320508075689L2,-1.7320508075689L0.5,0.86602540378444Z fill=#999 /><path d=M2,-1.7320508075689L4,1.7320508075689L0,1.7320508075689Z fill=#333 /><path d=M4,1.7320508075689L1.5,6.0621778264911L-1,1.7320508075689Z fill=#999 /><path d=M1.5,6.0621778264911L-5.5,6.0621778264911L-2,-8.8817841970013E-16Z fill=#333 /><path d=M-5.5,6.0621778264911L-10,-1.7320508075689L-1,-1.7320508075689Z fill=#999 /><path d=M-10,-1.7320508075689L-4,-12.124355652982L2,-1.7320508075689Z fill=#333 /><path d=M-4,-12.124355652982L12,-12.124355652982L4,1.7320508075689Z fill=#999 /><path d=M12,-12.124355652982L22.5,6.0621778264911L1.5,6.0621778264911Z fill=#333 /><path d=M22.5,6.0621778264911L8.5,30.310889132455L-5.5,6.0621778264911Z fill=#999 /><path d=M8.5,30.310889132455L-28.5,30.310889132455L-10,-1.7320508075689Z fill=#333 /><path d=M-28.5,30.310889132455L-53,-12.124355652982L-4,-12.124355652982Z fill=#999 /></svg>


1
गोल्फ के लिए दो छोटी चीजें: $k%6==0हो सकती हैं $k%6<1और $k%6==5हो सकती हैं $k%6>4
केविन क्रूज़सेन

4

पायथन 3, 280 , 262 बाइट्स

18 बाइट्स ने ओव्स के लिए धन्यवाद को बचाया

golfed:

import turtle
P=lambda n:n<4or P(n-3)+P(n-2)
N=int(input())
M=9
t=turtle.Turtle()
Q=range
R=t.right
L=t.left
F=t.forward
S=[P(x)*M for x in Q(N,0,-1)]
A=S[0]
F(A)
R(120)
F(A)
R(120)
F(A)
L(120)
i=1
while i<N:
 A=S[i]
 for j in Q(3):F(A);L(120)
 F(A)
 L(60)
 i+=1

कुछ टिप्पणियों के साथ एक ही बात:

import turtle

# P(n) returns nth term in the sequence
P=lambda n:n<4or P(n-3)+P(n-2)

# M: scales the triangle side-length
M=9
# N: show triangles from 1 to (and including) N from sequence
N=int(input())
t=turtle.Turtle()
Q=range
R=t.right # R(a) -> turn right "a" degrees
L=t.left  # L(a) -> turn left "a" degrees
F=t.forward # F(l) -> move forward "l" units

# S: M*P(N),M*P(N-1), ... M*P(1)
S=[P(x)*M for x in Q(N,0,-1)]

# draw the largest triangle
A=S[0]
F(A)
R(120)
F(A)
R(120)
F(A)
L(120)
i=1

# draw the next N-1 smaller triangles
while i<N:
 A=S[i]
 for j in Q(3):F(A);L(120)
 F(A)
 L(60)
 i+=1

इसके लिए स्क्रीनशॉट N=9:

एन = 9


2

dwitter 151

s=(n)=>{P=(N)=>N<3||P(N-3)+P(N-2)
for(a=i=0,X=Y=500,x.moveTo(X,Y);i<n*4;i++)k=9*P(i/4),x.lineTo(X+=C(a)
*k,Y+=S(a)*k),x.stroke(),a+=i%4>2?1.047:2.094}

http://dwitter.net पर परीक्षण किया जा सकता है (फुलस्क्रीन का उपयोग करें)

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

बुनियादी विचार लोगो कछुआ, गोल्फ है। ऊपर से P () फ़ंक चुराओ!

मैं कल्पना करता हूं कि पुनरावृत्ति से अधिक गोल्फ हो सकता है लेकिन यह बुरा नहीं है।


1

लोगो, 119 बाइट्स

to s:n
make"x 10
make"y:x
make"z:y
bk:z
repeat:n[lt 60
fw:z
rt 120
fw:z
bk:z
make"w:y+:z
make"z:y
make"y:x
make"x:w]end

उपयोग करने के लिए, ऐसा कुछ करें :

reset
lt 150
s 12

नमूना आउटपुट (एम्बेड नहीं कर सकता क्योंकि यह HTTPS नहीं है और यह imgur पर अपलोड करने में विफल रहा है)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.