Bir Padovan Spiral Oluştur


34

Giriş

Fibonacci Dizisine benzer şekilde, Padovan Dizisi ( OEIS A000931 ), dizide önceki terimler eklenerek üretilen bir sayı dizisidir. İlk değerler şöyle tanımlanır:

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

0, 1 ve 2. terimlerin tümü 1'dir. Yinelenme ilişkisi aşağıda belirtilmiştir:

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

Böylece, aşağıdaki sırayı verir:

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

Bu sayıları eşkenar üçgenlerin yan uzunlukları olarak kullanmak, hepsini bir araya getirdiğinizde Fibonacci Spiral gibi, güzel bir spiral oluşturur:

görüntü tanımını buraya girin

Görüntü Wikipedia'nın izniyle


Görev

Göreviniz, bu spirali grafiksel olarak yeniden oluşturan bir programı, hangi terime karşılık gelen girişi yazmaktır.

kurallar

  • Gönderiminiz en az 10. döneme kadar devam edebilmelidir (9).
  • Gönderiminiz, giriş alan ve grafiksel bir sonuç görüntüleyen (bir görüntü veya grafik çıktısı vb.) Tam bir program veya işlev olmalıdır.
  • Gönderiminizde grafik çıktılarınızın kanıtını göstermelisiniz
  • Çıktının dönmelerine, aynı gösterimle 60 derecenin katlarında izin verilir
  • Saat yönünün tersine gitmek de mümkündür
  • Standart boşluklar yasaktır

Girişin> 0 olacağını ve doğru giriş formatı verileceğini varsayabilirsiniz.

puanlama

Bu , yani bayt cinsinden en kısa kod kazanır. Herkese mutlu yıllar!


Satır sonrasındaki boşluğa izin verilir mi?
Pavel

@Pavel Evet. Şunu ekleyeyim
Andrew Li

Çıktı, örnekle aynı mı olmalı yoksa yansıma ve dönmelere (60 derecenin katları) izin verilmekte midir?
Seviye Nehri St

@ SevevRiverSt Buna izin verirdim. Yazıdaki açıklığa kavuşturmama izin ver.
Andrew Li

3
ASCII sanatına ve grafik çıktısına aynı zorlukta izin vermenin hayranı değil. Çok çok farklı görevler ve bunları bir arada karıştırmak, iki farklı olasılığı tamamen karşılaştırılamaz şekilde çözerek cevaplar veriyor. Biri ASCII sanatı için diğeri grafik çıktı için iki ayrı zorluğa sahip olmak daha iyi olurdu.
Martin Ender

Yanıtlar:


12

Mathematica, 119 108 bayt

Martin Ender'e 11 bayt kaydettiği için teşekkürler!

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

Adsız fonksiyon, pozitif bir tamsayı argümanı (1 indeksli) alarak ve grafik çıktısını döndürür. Giriş için örnek çıktı 16:

görüntü tanımını buraya girin

Kusurun Matlab cevabıyla eşzamanlı olarak geliştirilen ancak tasarımın bir çok benzerliği ile birlikte - birlikteliğin I^(2/3)altıncı kökünün tanımını da içeren ! Daha kolay okunur sürüm:

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

Çizgi 1, Padovan dizisini tanımlar ±n = P(n). Satır 4 z, yolu tanımlayan iç içe geçmiş karmaşık sayılar dizisi oluşturur ; Son kısım ±# z^(#+{2,4,1})&~Array~#, her biri karşılık gelen üçgeni tamamlamak için çizmemiz gereken vektörlere karşılık gelen birçok üçlü oluşturur ( yönleri kontrol ±#ederken uzunluğu z^(#+{2,4,1})kontrol eder). Satır 3, listenin iç içe geçmesinden kurtulur ve ardından vektörlerden saf koordinatlara dönüştürmek için karmaşık sayıların toplamını hesaplar; daha sonra satır 2, karmaşık sayıları sıralı gerçek sayı çiftlerine dönüştürür ve karşılık gelen poligonal çizgiyi çıkarır.


1
Sonunda o kısmı sadece benim aptallık oldu.
Martin Ender

9

Matlab, 202 190 bayt

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

Çıktısı N=19(1 tabanlı dizinleme):

görüntü tanımını buraya girin

açıklama

Kaba fikir temel olarak karmaşık sayılarla çalışmaktadır. O zaman üçgenlerin kenarları daima birliğin altıncı kökünü işaret eder.

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

İyi iş! Bir açıklama olasılığı var mı?
Andrew Li

açıklama eklendi!
kusur

Gerçekten burada karmaşık sayıların kullanımı gibi.
don

7

PHP + SVG, 738 Bayt

<?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 için çıktı

<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
Golf için iki küçük şey: $k%6==0olabilir $k%6<1ve $k%6==5olabilir $k%6>4.
Kevin Cruijssen

4

Python 3, 280 , 262 bayt

Ovs sayesinde 18 bayt kurtarıldı

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

Bazı yorumlar ile aynı şey:

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

Ekran görüntüsü N=9:

K = 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 adresinden test edilebilir (tam ekran kullanın)

görüntü tanımını buraya girin

temel fikir logo kaplumbağasıdır, golf. P () fonksiyonunu yukarıdan çaldın!

özyineleme ile daha çok golf oynayabileceğini hayal ediyorum ama bu fena değil.


1

LOGO, 119 bayt

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

Kullanım için, böyle bir şey yapmak bu :

reset
lt 150
s 12

Örnek çıktı (yerleştirilemiyor çünkü HTTPS değil ve imgur'a yüklenemedi)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.