สร้างเป็นเกลียว Padovan


34

บทนำ

คล้ายกับ Fibonacci Sequence, Padovan Sequence ( OEIS A000931 ) เป็นลำดับของตัวเลขที่สร้างขึ้นโดยการเพิ่มคำก่อนหน้าในลำดับ ค่าเริ่มต้นถูกกำหนดเป็น:

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

ข้อกำหนดที่ 1, ที่ 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, ...

การใช้ตัวเลขเหล่านี้เป็นความยาวด้านข้างของรูปสามเหลี่ยมด้านเท่าให้ผลเป็นเกลียวที่ดีเมื่อคุณวางพวกมันทั้งหมดเข้าด้วยกันคล้ายกับ Fibonacci Spiral:

ป้อนคำอธิบายรูปภาพที่นี่

เอื้อเฟื้อภาพของWikipedia


งาน

งานของคุณคือการเขียนโปรแกรมที่สร้างเกลียวนี้โดยเอาท์พุทกราฟิกที่มีการป้อนข้อมูลที่สอดคล้องกับคำที่

กฎระเบียบ

  • การส่งของคุณจะต้องสามารถจัดการได้อย่างน้อยสูงสุดเทอมที่ 10 (9)
  • การส่งของคุณจะต้องเป็นโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบที่รับอินพุตและแสดงผลลัพธ์แบบกราฟิก (ไม่ว่าจะเป็นภาพหรือกราฟ ฯลฯ )
  • คุณต้องแสดงหลักฐานการแสดงผลกราฟิกของคุณในการส่งของคุณ
  • อนุญาตให้มีการหมุนของเอาต์พุตในทวีคูณ 60 องศาด้วยการแสดงที่เหมือนกัน
  • อนุญาตให้ใช้ทวนเข็มนาฬิกา
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

คุณอาจจะสมมติว่าอินพุตนั้น> 0 และรูปแบบการป้อนข้อมูลที่ถูกต้องจะได้รับ

เกณฑ์การให้คะแนน

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ สวัสดีปีใหม่ทุกคน!


พื้นที่ต่อท้ายหลังจากบรรทัดอนุญาตหรือไม่
Pavel

@Pavel ใช่ ขอเพิ่มอีกหน่อย
แอนดรูว์หลี่

เอาต์พุตต้องเหมือนกันกับตัวอย่างหรือเป็นภาพสะท้อนและการหมุน (ทวีคูณของ 60 องศา) อนุญาตหรือไม่
เลเวลริเวอร์เซนต์

@LevelRiverSt ฉันจะอนุญาต ฉันขอชี้แจงว่าในโพสต์
Andrew Li

3
ไม่ใช่แฟนของการอนุญาตให้ทั้ง ASCII art และเอาต์พุตกราฟิกในความท้าทายเดียวกัน มันเป็นงานที่แตกต่างกันมากและการผสมเข้าด้วยกันทำให้คำตอบสามารถแก้ไขความเป็นไปได้ที่แตกต่างกันสองอย่างอย่างหาที่เปรียบมิได้ มันจะเป็นการดีกว่าถ้าคุณมีความท้าทายสองอย่างแยกกันอย่างใดอย่างหนึ่งสำหรับศิลปะ ASCII และหนึ่งสำหรับกราฟิกเอาท์พุท
Martin Ender

คำตอบ:


12

Mathematica, 119 108 ไบต์

ขอบคุณ Martin Ender ที่ช่วยประหยัด 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:

ป้อนคำอธิบายรูปภาพที่นี่

พัฒนาขึ้นพร้อมกับคำตอบ Matlab ของข้อบกพร่องแต่มีความคล้ายคลึงกันมากมายในการออกแบบ - รวมถึงคำนิยาม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
ไม่เป็นไรส่วนนั้นก็แค่ฉันโง่
Martin Ender

9

Matlab, 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

งานที่ดี! มีความเป็นไปได้ของคำอธิบายหรือไม่?
Andrew Li

เพิ่มคำอธิบายแล้ว!
ข้อบกพร่อง

ชอบการใช้จำนวนเชิงซ้อนที่นี่
ดอนสดใส

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
Kevin Cruijssen

4

Python 3, 280 , 262 bytes

บันทึกได้ 18 ไบต์ด้วย ovs

แข็งแรงเล่นกอล์ฟ:

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:

N = 9


2

151 dwitter

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 (ใช้เต็มหน้าจอ)

ป้อนคำอธิบายรูปภาพที่นี่

แนวคิดพื้นฐานคือเต่าโลโก้ golfed ขโมย P () func จากด้านบน!

ฉันคิดว่าอาจมีการตีกอล์ฟซ้ำโดยการเรียกซ้ำ แต่สิ่งนี้ก็ไม่เลว


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)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.