Tạo một xoắn ốc Padovan


34

Giới thiệu

Tương tự như Chuỗi Fibonacci, Chuỗi Padovan ( OEIS A000931 ) là một chuỗi các số được tạo ra bằng cách thêm các số hạng trước đó trong chuỗi. Các giá trị ban đầu được định nghĩa là:

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

Các điều khoản 0, 1 và 2 đều là 1. Mối quan hệ lặp lại được nêu dưới đây:

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

Do đó, nó mang lại trình tự sau:

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

Sử dụng các số này làm độ dài cạnh của các hình tam giác đều tạo ra một đường xoắn ốc đẹp khi bạn đặt tất cả chúng lại với nhau, giống như hình xoắn ốc Fibonacci:

nhập mô tả hình ảnh ở đây

Hình ảnh lịch sự của Wikipedia


Bài tập

Nhiệm vụ của bạn là viết một chương trình tái tạo vòng xoắn ốc này bằng đầu ra đồ họa, với đầu vào tương ứng với thuật ngữ nào.

Quy tắc

  • Việc gửi của bạn phải có khả năng xử lý ít nhất đến nhiệm kỳ thứ 10 (9)
  • Nội dung gửi của bạn phải là một chương trình hoặc chức năng đầy đủ nhận đầu vào và hiển thị kết quả đồ họa (xuất ra hình ảnh hoặc biểu đồ, v.v.)
  • Bạn phải hiển thị bằng chứng về đầu ra đồ họa của bạn trong trình của bạn
  • Xoay của đầu ra được cho phép, trong bội số 60 độ, với cùng một đại diện
  • Đi ngược chiều kim đồng hồ cũng được cho phép
  • Sơ hở tiêu chuẩn bị cấm

Bạn có thể cho rằng đầu vào sẽ> 0 và định dạng đầu vào chính xác sẽ được cung cấp.

Chấm điểm

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng. Chuc mưng năm mơi mọi ngươi!


Là dấu cách không gian sau khi dòng cho phép?
Pavel

@Pavel Có. Hãy để tôi nói thêm
Andrew Li

Có phải đầu ra phải giống hệt với ví dụ hoặc được phản xạ và xoay (bội số của 60 độ)?
Cấp sông St

@LevelRiverSt Tôi sẽ cho phép điều đó. Hãy để tôi làm rõ điều đó trong bài viết.
Andrew Li

3
Không phải là người hâm mộ cho phép cả nghệ thuật ASCII và đầu ra đồ họa trong cùng một thử thách. Chúng là những nhiệm vụ rất khác nhau và trộn chúng lại với nhau khiến cho câu trả lời giải quyết hai khả năng khác nhau hoàn toàn không thể so sánh được. Sẽ tốt hơn nếu có hai thử thách riêng biệt, một cho nghệ thuật ASCII và một cho đầu ra đồ họa.
Martin Ender

Câu trả lời:


12

Toán học, 119 108 byte

Cảm ơn Martin Ender vì đã tiết kiệm 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~#}&@

Hàm không tên lấy tham số nguyên dương (lập chỉ mục 1) và trả về đầu ra đồ họa. Ví dụ đầu ra cho đầu vào 16:

nhập mô tả hình ảnh ở đây

Được phát triển một cách tự nhiên với câu trả lời Matlab của flawr nhưng có nhiều điểm tương đồng trong thiết kế, thậm chí bao gồm cả định nghĩa I^(2/3)cho gốc thứ sáu của sự thống nhất! Phiên bản dễ đọc hơn:

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

Dòng 1 định nghĩa chuỗi Padovan ±n = P(n). Dòng 4 tạo ra một mảng các số phức lồng nhau, xác định ztrên đường đi; phần cuối cùng ±# z^(#+{2,4,1})&~Array~#tạo ra nhiều bộ ba, mỗi bộ tương ứng với các vectơ chúng ta cần vẽ để hoàn thành tam giác tương ứng ( ±#điều khiển độ dài trong khi z^(#+{2,4,1})điều khiển các hướng). Dòng 3 thoát khỏi danh sách lồng nhau và sau đó tính toán tổng số chạy của các số phức, để chuyển đổi từ vectơ sang tọa độ thuần; dòng 2 sau đó chuyển đổi các số phức thành các cặp số thực theo thứ tự và xuất ra dòng đa giác tương ứng.


1
Không bao giờ phần đó chỉ là tôi ngu ngốc.
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

Đầu ra cho N=19(lập chỉ mục dựa trên 1):

nhập mô tả hình ảnh ở đây

Giải trình

Ý tưởng sơ bộ về cơ bản là làm việc với các số phức. Sau đó các cạnh của các hình tam giác luôn luôn theo hướng của một gốc thứ sáu của sự thống nhất.

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

Công việc tốt! Có bất kỳ khả năng của một lời giải thích?
Andrew Li

giải thích thêm!
flawr

thực sự thích việc sử dụng số phức ở đây.
don sáng

7

PHP + SVG, 738 byte

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

Đầu ra cho 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
Hai điều nhỏ để chơi golf: $k%6==0có thể $k%6<1$k%6==5có thể $k%6>4.
Kevin Cruijssen

4

Python 3, 280 , 262 byte

Lưu 18 byte nhờ vào ovs

Chơi gôn

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

Điều tương tự với một số ý kiến:

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

Ảnh chụp màn hình cho N=9:

N = 9


2

cư dân 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}

có thể được kiểm tra trên http://dwitter.net (sử dụng toàn màn hình)

nhập mô tả hình ảnh ở đây

ý tưởng cơ bản là logo rùa, chơi gôn. lấy trộm func P () từ trên cao!

Tôi tưởng tượng nhiều hơn có thể được đánh gôn bằng đệ quy nhưng điều này không phải là xấu.


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

Để sử dụng, hãy làm một cái gì đó như thế này :

reset
lt 150
s 12

Đầu ra mẫu (không thể nhúng vì đó không phải là HTTPS và không thể tải lên imgur)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.