펜타 플레이어 그리기


25

우선 ... 모든 사람들에게 즐거운 성탄절 보내길 바랍니다 (내 시간대가 늦어서 죄송합니다).

행사를 축하하기 위해 눈송이를 그릴 것입니다. 연도는 201 5 이고 크리스마스는 2 5 일 (대부분의 사람들에게)이기 때문에 펜타 플레이크를 그릴 것 입니다. Pentaflake는 오각형으로 구성된 간단한 프랙탈입니다. 다음은 몇 가지 예입니다 (여기에서 가져옴) .여기에 이미지 설명을 입력하십시오

각 펜타 플레이크는 차수 n을가집니다. 차수 0의 오각형은 단순히 오각형입니다. 다른 모든 주문 n에 대해, 펜타 플레이크는 이전 주문의 6 번째 펜타 플레이크 주위에 배열 된 이전 주문의 5 개의 펜타 플레이크로 구성된다. 예를 들어, 순서 1의 오각형은 중앙 오각형 주위에 배열 된 5 개의 오각형으로 구성됩니다.

입력

주문 n. 이것은 사전 정의 된 변수를 제외하고 어떤 식 으로든 주어질 수 있습니다.

산출

주문 nPentaflake 의 이미지입니다 . 너비와 너비가 100px 이상이어야합니다. 파일로 저장되거나 사용자에게 표시되거나로 출력 될 수 STDOUT있습니다. 다른 형태의 출력은 허용되지 않습니다. 이 챌린지 이전에 존재하는 모든 이미지 형식이 허용됩니다.

승리

codegolf는 바이트 수가 가장 적은 사람이 승리합니다.


3
눈송이는 6 배 대칭 만 갖기 때문에 -1입니다! = D
flawr

@flawr 이 기사 에 따르면 눈송이의 약 0.1 %만이 실제로 6 배 대칭 또는 전혀 대칭이 없습니다. 그러나 대칭이있는 눈송이는 6 중 대칭 외에 3 중 대칭을 가질 수 있습니다. : P
TheNumberOne

4
글쎄요,이 기사는 모든 눈송이의 .1 % 미만의 방법 만 연구했으며 미국 눈송이 만 연구했기 때문에 의미가 없습니다. 나는 메트릭 눈송이가 훨씬 대칭 적이라고 확신합니다! (! PS : 아름다운 이미지 눈송이 # 167 특히 재미있다 !) (난 그냥 메트릭 눈송이가 10 배 대칭이 있어야 것으로 나타났습니다.)
flawr

1
위의 방법 중 하나를 사용하여 출력하는 한 괜찮습니다. 그러나 n스크립트 파일에서 미리 정의 할 수 없습니다. n에서 읽고 STDIN, 사용자에게 프롬프트하고, 함수 / commad 행 인수로 가져갈 수 있습니다 ... 기본적으로 코드에 직접 포함시키는 것을 제외하고 원하는 모든 것
TheNumberOne

1
25 개이므로 +1하고 싶지 않습니다 :(
The_Basset_Hound

답변:


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

언 골프 드 :

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

다섯 번째 반복 (이미 렌더링하는 데 시간이 오래 걸렸습니다).

여기에 이미지 설명을 입력하십시오

코드를 약간 변경하면 (아쉽게도 더 많은 바이트)이 아름다움을 초래합니다 =)

여기에 이미지 설명을 입력하십시오

아, 또 하나 :

여기에 이미지 설명을 입력하십시오


이 문제를 지적 해 주셔서 감사합니다. 다른 솔루션을 추가했습니다. 걱정하지 않기를 바랍니다.) 바이트 수에서 안전하게 떨어져 있습니다.
Andras Deak

7

Mathematica, 200 바이트

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],#]&

마지막 줄은 정수에 적용될 수있는 함수입니다 n.

Mathematica 함수 이름이 길다. 누군가는 엔트로피 인코딩하고 새로운 언어를 만들어야합니다. :)

에 적용되는 경우 1:

여기에 이미지 설명을 입력하십시오

에 적용되는 경우 2:

여기에 이미지 설명을 입력하십시오


6

MATLAB, 235 233 217 바이트

업데이트 : @flawr 의 제안은 16 바이트를 잃는 데 도움이되었습니다. 이것만으로 flawr의 솔루션 을 이길 수 있었고 처음부터 flawr의 도움이 없으면 도전을 찾지 못했을 것이므로 이것을 공동 제출로 생각하십시오.)

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');

이것은 또 다른 MATLAB 솔루션으로, 반복 기능 시스템의 철학을 기반으로합니다. 나는 알고리즘 자체를 개발하는데 관심이 많았고 솔루션에 너무 많은 관심을 기울이지 않았습니다. 확실히 개선의 여지가 있습니다. (에 대해 하드 코딩 된 고정 소수점 근사법을 사용 c하려고 시도했지만 좋지 않습니다.)

언 골프 버전 :

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

결과 N=5(이후 axis equal off에 예쁘지 만 바이트 단위로 계산되지 않기를 바랍니다) :

N = 5 펜타 플레이크


1
나는 당신이 R=[p(:,2),[-p(2,2);p(1,2)]];(그리고 이전을 제거 하여) 몇 바이트를 절약 할 수 있다고 생각 R,C,S하고 사용할 수 q=[q R^l*[c-1+t(1,:);t(2,:)]/c]있다고 생각합니다c=1.5+5^.5/2;
flawr

@flawr 분명히 당신이 맞습니다 :) 1. 회전 행렬에 감사드립니다. 2. 새로운 q것에 감사드립니다. 4. 솔루션이 이제 원본보다 짧으므로이 부분도 제출물로 간주됩니다.
Andras Deak

6

Mathematica, 124 바이트

Mathematica는 Table버전 10 이후의 새로운 구문을 지원하므로 Table[expr, n]다른 바이트를 절약 할 수 있습니다. Table[expr, n]와 같습니다 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}])

이 함수의 핵심은 복소수를 사용하여 변환을 수행 한 다음로 점을 변환하는 것 ReIm입니다.

테스트 사례 :

f[4]

여기에 이미지 설명을 입력하십시오


1
πUTF-8에서 2 바이트를 차지하므로 총 125 바이트가됩니다.
2012rcampion

OMFG 이것은 무엇입니까
DumpsterDoofus

3

Mathematica, 199 196 바이트

머리로 Peter Richter의 대답을 알아 내십시오. 여기 저의 것이 있습니다. 그래픽 기능에 크게 의존하고 수학 및 FP에는 덜 의존합니다. CirclePoints 기본 제공은 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

편집 : GoldenRatio에 대한 DumpsterDoofus 덕분에


당신은 대체하여 3 바이트를 저장할 수 있습니다 ((1+Sqrt@5)/2)GoldenRatio. 또한 두 번째 줄에서 나는 p@0=Polygon@c[{1,0},5];대신에 있어야한다고 생각합니다 p@0=Polygon@cp[{1,0},5];. (BTW 저는 실제로 Peter입니다. lol라는 두 개의 프로파일이 있습니다).
DumpsterDoofus

예! 잘 했어 나는 오타도 발견했지만 고치는 것을 잊었다. D' oh,
hYPotenuser

2

매스 매 티카, 130 바이트

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

나는 njpipeorgan의 답변 (사실 그의 2Pi I/5 == Pi.4I트릭을 훔 쳤음) 과 비슷한 기술을 사용 하지만 재귀 함수로 구현되었습니다.

사용법 예 ( %마지막 줄에 출력 된 익명 함수에 액세스하는 데 사용 ) :

 %[5]

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.