Vẽ Pentaflake


25

Trước hết ... tôi muốn chúc mọi người một Giáng sinh vui vẻ (xin lỗi nếu tôi trễ một ngày vì múi giờ của bạn).

Để kỷ niệm dịp này, chúng ta sẽ vẽ một bông tuyết. Bởi vì năm là 201 5 và Giáng sinh là vào ngày 2 tháng 5 (đối với một phần lớn người), chúng tôi sẽ vẽ một vảy Penta . Pentaflake là một fractal đơn giản bao gồm các hình ngũ giác. Dưới đây là một vài ví dụ (lấy từ đây) :nhập mô tả hình ảnh ở đây

Mỗi Pentaflake có một thứ tự n. Pentaflake của đơn đặt hàng 0 chỉ đơn giản là một hình ngũ giác. Đối với tất cả các đơn hàng khác, một Pentaflake bao gồm 5 Pentaflakes của đơn đặt hàng trước được sắp xếp xung quanh một Pentaflake thứ 6 của đơn đặt hàng trước. Ví dụ, một Pentaflake của đơn hàng 1 gồm 5 hình ngũ giác được sắp xếp xung quanh một hình ngũ giác trung tâm.

Đầu vào

Trình tự n. Điều này có thể được đưa ra theo bất kỳ cách nào ngoại trừ biến được xác định trước.

Đầu ra

Một hình ảnh của thứ tự nPentaflake. Phải rộng ít nhất 100px và dài 100px. Nó có thể được lưu vào một tập tin, hiển thị cho người dùng hoặc xuất ra STDOUT. Bất kỳ hình thức đầu ra khác không được phép. Tất cả các định dạng hình ảnh hiện có trước khi thách thức này được cho phép.

Chiến thắng

Là codegolf, người có số byte ít nhất sẽ thắng.


3
-1 vì bông tuyết chỉ có 6 lần đối xứng! = D
flawr

@flawr Theo bài viết này, chỉ có khoảng .1% bông tuyết thực sự có đối xứng 6 lần ... hoặc bất kỳ đối xứng nào cả. Tuy nhiên, những bông tuyết có đối xứng có thể có đối xứng 3 lần ngoài đối xứng 6 lần: P
TheNumberOne

4
Vâng, bài viết này chỉ nghiên cứu cách ít hơn .1% của tất cả các bông tuyết, và dù sao nó cũng vô nghĩa, vì họ chỉ nghiên cứu những bông tuyết Mỹ. Tôi đặt cược những bông tuyết số liệu là cách đối xứng hơn! (PS: Hình ảnh đẹp! Bông tuyết # 167 đặc biệt thú vị !) (Tôi chỉ nhận thấy rằng những bông tuyết số liệu phải có đối xứng 10 lần.)
flawr

1
Sẽ ổn thôi miễn là nó xuất ra bằng một trong các phương pháp trên. Tuy nhiên, nkhông thể được xác định trước trong tập tin kịch bản của bạn. Bạn có thể đọc ntừ STDIN, nhắc nó từ người dùng, xem nó như là một đối số dòng hàm / dấu phẩy ... về cơ bản là bất cứ điều gì bạn muốn ngoại trừ việc nhúng trực tiếp nó vào mã của bạn.
TheNumberOne

1
Không muốn +1 cái này vì nó có 25 :(
The_Basset_Hound

Câu trả lời:


14

Matlab, 226

function P(M);function c(L,X,Y,O);hold on;F=.5+5^.5/2;a=2*pi*(1:5)/5;b=a(1)/2;C=F^(2*L);x=cos(a+O*b)/C;y=sin(a+O*b)/C;if L<M;c(L+1,X,Y,~O);for k=1:5;c(L+1,X+x(k),Y+y(k),O);end;else;fill(X+x*F, Y+y*F,'k');end;end;c(0,0,0,0);end

Ung dung:

function P(M);                
function c(L,X,Y,O);          %recursive function
hold on;
F=.5+5^.5/2;                  %golden ratio
a=2*pi*(1:5)/5;               %full circle divided in 5 parts (angles)
b=a(1)/2;
C=F^(2*L);
x=cos(a+O*b)/C;               %calculate the relative position ofnext iteration
y=sin(a+O*b)/C;
if L<M;                       %current recursion (L) < Maximum (M)? recurse
    c(L+1,X,Y,~O);            %call recursion for inner pentagon
    for k=1:5;
        c(L+1,X+x(k),Y+y(k),O)%call recursion for the outer pentagons
    end; 
else;                         %draw
    fill(X+x*F, Y+y*F,'k');  
end;
end;
c(0,0,0,0);
end

Lặp lại thứ năm (đã mất khá nhiều thời gian để kết xuất).

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

Một sự thay đổi nhỏ của mã (không may là nhiều byte hơn) dẫn đến vẻ đẹp này =)

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

Ồ, và một cái khác:

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


Cảm ơn đã chỉ cho tôi thử thách này, tôi đã đi và thêm một giải pháp khác, hy vọng bạn không phiền;) Tôi an toàn tránh xa số đếm byte của bạn, dù sao, tôi chỉ thấy nó quá thú vị để bỏ lỡ.
Andras Deak

7

Toán học, 200 byte

a=RotationTransform
b=Range
r@k_:={Re[t=I^(4k/5)],Im@t}
R@k_:=a[Pi,(r@k+r[k+1])/2]
Graphics@Nest[GeometricTransformation[#,ScalingTransform[{1,1}(Sqrt@5-3)/2]@*#&/@Append[R/@b@5,a@0]]&,Polygon[r/@b@5],#]&

Dòng cuối cùng là một hàm có thể được áp dụng cho một số nguyên n.

Tên hàm Mathicala dài. Ai đó nên entropy mã hóa chúng và tạo ra một ngôn ngữ mới từ nó. :)

Khi áp dụng cho 1:

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

Khi áp dụng cho 2:

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


6

MATLAB, 235 233 217 byte

Cập nhật: một loạt các đề xuất từ @flawr đã giúp tôi mất 16 byte. Vì chỉ điều này mới cho phép tôi đánh bại giải pháp của flawr và rằng tôi sẽ không tìm thấy thử thách nếu không có sự giúp đỡ của flawr ngay từ đầu, hãy xem đây là một đệ trình chung của chúng tôi :)

N=input('');f=2*pi/5;c=1.5+5^.5/2;g=0:f:6;p=[cos(g);sin(g)];R=[p(:,2),[-p(2,2);p(1,2)]];for n=1:N,t=p;q=[];for l=0:4,q=[q R^l*[c-1+t(1,:);t(2,:)]/c];end,p=[q -t/c];end,p=reshape(p',5,[],2);fill(p(:,:,1),p(:,:,2),'k');

Đây là một giải pháp MATLAB khác, giải pháp này dựa trên triết lý về các hệ thống chức năng lặp. Tôi chủ yếu quan tâm đến việc phát triển thuật toán và tôi đã không chơi golf quá nhiều về giải pháp. Chắc chắn có chỗ để cải thiện. (Tôi đã dự tính bằng cách sử dụng xấp xỉ điểm cố định được mã hóa cứng cho c, nhưng điều đó sẽ không tốt.)

Phiên bản bị đánh cắp:

N=input('');                                % read order from stdin

f=2*pi/5;                                   % angle of 5-fold rotation
c=1.5+5^.5/2;                               % scaling factor for contraction

g=0:f:6;
p=[cos(g);sin(g)];                          % starting pentagon, outer radius 1
R=[p(:,2),[-p(2,2);p(1,2)]];                % 2d rotation matrix with angle f

for n=1:N,                                  % iterate the points
    t=p;
    q=[];
    for l=0:4,
       q=[q R^l*[c-1+t(1,:);t(2,:)]/c];     % add contracted-rotated points
    end,
    p=[q -t/c];                             % add contracted middle block
end,

p=reshape(p',5,[],2);                 % reshape to 5x[]x2 matrix to separate pentagons
fill(p(:,:,1),p(:,:,2),'k');          % plot pentagons

Kết quả cho N=5(với một lần tiếp theo axis equal offcho sự đẹp mắt, nhưng tôi hy vọng rằng điều đó không được tính theo byte):

N = 5 pentaflake


1
Tôi nghĩ rằng bạn có thể tiết kiệm một vài byte bằng cách sử dụng R=[p(:,2),[-p(2,2);p(1,2)]];(và loại bỏ cái trước đó R,C,S) và bạn có thể sử dụng q=[q R^l*[c-1+t(1,:);t(2,:)]/c]và tôi nghĩc=1.5+5^.5/2;
flawr

@flawr rõ ràng là bạn đúng :) 1. cảm ơn vì ma trận xoay vòng, 2. cảm ơn vì cái mới q, tôi thậm chí còn có một cặp dấu ngoặc đơn không cần thiết trong đó ... 3. cảm ơn, nhưng ma thuật này là gì ??: D 4. vì giải pháp bây giờ ngắn hơn so với ban đầu của bạn, tôi coi đây là một phần trình của bạn.
Andras Deak

6

Toán học, 124 byte

Mathematica hỗ trợ cú pháp mới cho Tablephiên bản 10 : Table[expr, n], để lưu một byte khác. Table[expr, n]tương đương với Table[expr, {n}].

f@n_:=(p=E^Array[π.4I#&,5];Graphics@Map[Polygon,ReIm@Fold[{g,s}~Function~Join[.62(.62g#+#&/@s),{-.39g}],p,p~Table~n],{-3}])

Cốt lõi của chức năng này là sử dụng các số phức để thực hiện chuyển đổi và sau đó chuyển đổi chúng thành các điểm theo ReIm.

Trường hợp thử nghiệm:

f[4]

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


1
πchiếm hai byte trong UTF-8, do đó bạn có tổng cộng 125 byte.
2012rcampion

OMFG đây là gì
DumpsterDoustus

3

Toán học, 199 196 byte

Chỉnh sửa câu trả lời của Peter Richter bằng một sợi tóc, đây là một trong những câu trả lời của riêng tôi. Nó dựa rất nhiều vào chức năng đồ họa, và ít hơn về toán học và FP. Nội dung được xây dựng CirclePoints là mới trong 10.1 .

c=CirclePoints;g=GeometricTransformation;
p@0=Polygon@c[{1,0},5];
p@n_:=GraphicsGroup@{
        p[n-1],
        g[
          p[n-1]~g~RotationTransform[Pi/5],
          TranslationTransform/@{GoldenRatio^(2n-1),n*Pi/5}~c~5
        ]
      };
f=Graphics@*p

Chỉnh sửa: Cảm ơn DumpsterDoustus cho GoldenRatio


Bạn có thể lưu 3 byte bằng cách thay thế ((1+Sqrt@5)/2)bằng GoldenRatio. Ngoài ra trong dòng thứ hai tôi nghĩ rằng nó nên được p@0=Polygon@c[{1,0},5];thay thế p@0=Polygon@cp[{1,0},5];. (BTW Tôi thực sự là Peter, tôi đã có hai hồ sơ lol).
DumpsterDoustus

Vâng! Cuộc gọi tốt Tôi cũng phát hiện lỗi đánh máy, nhưng quên sửa nó. D'oh,
hYPotenuser

2

Toán học, 130 byte

r=Exp[Pi.4I Range@5]
p=1/GoldenRatio
f@0={r}
f@n_:=Join@@Outer[1##&,r,p(f[n-1]p+1),1]~Join~{-f[n-1]p^2}
Graphics@*Polygon@*ReIm@*f

Tôi sử dụng một kỹ thuật tương tự như câu trả lời của njpipeorgan (thực tế là tôi đã đánh cắp 2Pi I/5 == Pi.4Imánh khóe của anh ta ), nhưng được thực hiện như một hàm đệ quy.

Sử dụng ví dụ (sử dụng %để truy cập chức năng ẩn danh được xuất trên dòng cuối cùng):

 %[5]

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

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.