Hasilkan Spiral Padovan

34

pengantar

Mirip dengan Urutan Fibonacci, Urutan Padovan ( OEIS A000931 ) adalah urutan angka yang dihasilkan dengan menambahkan istilah sebelumnya dalam urutan. Nilai awal didefinisikan sebagai:

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

Istilah 0, 1, dan 2 semuanya 1. Relasi perulangan dinyatakan di bawah ini:

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

Dengan demikian, ia menghasilkan urutan berikut:

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

Menggunakan angka-angka ini sebagai panjang sisi dari segitiga sama sisi menghasilkan spiral yang bagus ketika Anda menempatkan semuanya, seperti Fibonacci Spiral:

masukkan deskripsi gambar di sini

Gambar milik Wikipedia


Tugas

Tugas Anda adalah menulis program yang membuat ulang spiral ini dengan output grafis, dengan input yang sesuai dengan istilah mana.

Aturan

  • Kiriman Anda harus dapat menangani setidaknya hingga jangka waktu 10 (9)
  • Kiriman Anda harus berupa program atau fungsi lengkap yang mengambil input dan menampilkan hasil grafis (baik output gambar atau grafik, dll)
  • Anda harus menunjukkan bukti output grafis Anda dalam kiriman Anda
  • Rotasi output diperbolehkan, dalam kelipatan 60 derajat, dengan representasi yang sama
  • Berlawanan arah jarum jam juga diperbolehkan
  • Celah standar dilarang

Anda dapat berasumsi bahwa input akan> 0 dan format input yang benar akan diberikan.

Mencetak gol

Ini adalah , jadi kode terpendek dalam byte menang. Selamat Tahun Baru semuanya!

Andrew Li
sumber
Apakah membuntuti ruang setelah garis diperbolehkan?
Pavel
@Pavel Ya. Biarkan saya menambahkan itu
Andrew Li
Apakah output harus identik dengan contoh atau apakah refleksi dan rotasi (kelipatan 60 derajat) diperbolehkan?
Level River St
@LevelRiverSt Saya akan membiarkan itu. Izinkan saya mengklarifikasi hal itu di pos.
Andrew Li
3
Bukan penggemar yang memungkinkan seni ASCII dan output grafis dalam tantangan yang sama. Mereka tugas yang sangat berbeda, dan menggabungkan keduanya membuat jawaban memecahkan dua kemungkinan yang berbeda sama sekali tidak ada bandingannya. Akan lebih baik untuk memiliki dua tantangan terpisah, satu untuk seni ASCII dan satu untuk output grafis.
Martin Ender

Jawaban:

12

Mathematica, 119 108 byte

Terima kasih kepada Martin Ender karena telah menghemat 11 byte!

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

Fungsi tanpa nama mengambil argumen bilangan bulat positif (1-diindeks) dan mengembalikan output grafis. Contoh output untuk input 16:

masukkan deskripsi gambar di sini

Dikembangkan secara simultan dengan jawaban Matlab sempurna tetapi dengan banyak kesamaan dalam desain-bahkan termasuk definisi I^(2/3)untuk akar keenam persatuan! Versi yang lebih mudah dibaca:

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  ])&

Baris 1 mendefinisikan urutan Padovan ±n = P(n). Baris 4 menciptakan susunan angka-angka kompleks bersarang, mendefinisikan zsepanjang jalan; bagian terakhir ±# z^(#+{2,4,1})&~Array~#menghasilkan banyak tiga kali lipat, yang masing-masing sesuai dengan vektor yang perlu kita gambar untuk melengkapi segitiga yang sesuai ( ±#kontrol panjang sementara z^(#+{2,4,1})kontrol arah). Baris 3 menghilangkan daftar yang bersarang dan kemudian menghitung jumlah total bilangan kompleks yang berjalan, untuk mengkonversi dari vektor ke koordinat murni; baris 2 kemudian mengonversi bilangan kompleks menjadi pasangan bilangan real, dan mengeluarkan garis poligon yang sesuai.

Greg Martin
sumber
1
Namun, bagian itu hanyalah aku yang bodoh.
Martin Ender
9

Matlab, 202 190 byte

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

Output untuk N=19(pengindeksan berbasis 1):

masukkan deskripsi gambar di sini

Penjelasan

Ide dasarnya adalah bekerja dengan bilangan kompleks. Kemudian ujung-ujung segitiga selalu mengarah ke akar persatuan keenam.

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
cacat
sumber
Pekerjaan yang baik! Apakah ada kemungkinan penjelasan?
Andrew Li
penjelasan ditambahkan!
flawr
sangat suka menggunakan bilangan kompleks di sini.
don bright
7

PHP + SVG, 738 Bytes

<?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>

Output untuk 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>

Jörg Hülsermann
sumber
1
Dua hal kecil untuk golf: $k%6==0bisa $k%6<1dan $k%6==5bisa $k%6>4.
Kevin Cruijssen
4

Python 3, 280 , 262 byte

18 byte disimpan berkat ovs

Golf:

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

Hal yang sama dengan beberapa komentar:

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

Tangkapan layar untuk N=9:

N = 9

Bobas_Pett
sumber
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}

dapat diuji di http://dwitter.net (gunakan layar penuh)

masukkan deskripsi gambar di sini

Ide dasarnya adalah logo penyu, golf. mencuri fungsi P () dari atas!

Saya membayangkan lebih banyak yang bisa golf dengan rekursi tetapi ini tidak buruk.

jangan cerah
sumber
1

LOGO, 119 byte

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

Untuk menggunakan, lakukan sesuatu seperti ini :

reset
lt 150
s 12

Output sampel (tidak dapat disematkan karena bukan HTTPS dan gagal diunggah ke imgur)

Neil
sumber