Намалюйте П’ятикласницю


25

Перш за все ... Я хотів би побажати всім з Різдвом Христовим (вибачте, якщо я запізнився на ваш часовий пояс).

Для святкування нагоди ми збираємося намалювати сніжинку. Оскільки рік 201 5, а Різдво припадає на 2 5- й (для значної частини осіб), ми намалюємо пластівці Пента . Пентафлик - простий фрактал, що складається з п’ятикутників. Ось кілька прикладів (взяті звідси) :введіть тут опис зображення

Кожен пентафлейк має n замовлення. Пентафрак порядку 0 - це просто п’ятикутник. Для всіх інших порядків n пентафлекс складається з 5 п’ятикласок попереднього порядку, розташованих навколо 6-го пентафлексу попереднього порядку. Наприклад, п'ятикутник порядку 1 складається з 5 п'ятикутників, розташованих навколо центрального п’ятикутника.

Вхідні дані

Порядок n. Це може бути задано будь-яким способом, за винятком попередньо визначеної змінної.

Вихідні дані

Зображення замовлення nПентафлейк. Повинен бути не менше 100 пікс. В ширину і 100 пікс. Він може бути збережений у файлі, відображений користувачеві або виведений в STDOUT. Будь-яка інша форма виводу не дозволена. Дозволені всі формати зображень, що існували до цього виклику.

Перемога

Як кодогольф, перемагає людина з найменшою кількістю байтів.


3
-1 тому що сніжинки мають лише 6-кратну симетрію! = D
недолік

@flawr Відповідно до цієї статті лише близько .1% сніжинок насправді має 6-кратну симетрію ... або будь-яку симетрію взагалі. Однак ті сніжинки, які мають симетрію, можуть мати 3-кратну симетрію на додаток до 6-кратної симетрії: P
TheNumberOne

4
Що ж, ця стаття вивчала лише менше, ніж 1,1% усіх сніжинок, і це все одно безглуздо, оскільки вони вивчали лише американські сніжинки. Б'юсь об заклад, метричні сніжинки набагато симетричніші! (PS: Красиві образи! Сніжинка №167 особливо цікава !) (Я щойно помітив, що метричні сніжинки повинні мати 10-кратну симетрію.)
недолік

1
Це буде добре, поки він виводить за допомогою одного з перерахованих вище методів. Однак nне можна заздалегідь визначитись у вашому файлі сценарію. Ви можете прочитати nз STDIN, підказувати від користувача, прийняти його в якості опції / рядки аргументу commad ... в основному все , що ви хочете для вбудовування безпосередньо в коді , за винятком.
TheNumberOne

1
Не хочу це
ставити

Відповіді:


14

Матлаб, 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

П'ята ітерація (виправлення вже зайняло досить багато часу).

введіть тут опис зображення

Невелика зміна коду (на жаль, більше байтів) призводить до цієї краси =)

введіть тут опис зображення

О, і ще один:

введіть тут опис зображення


Дякую, що вказали мені на цей виклик, я пішов і додав ще одне рішення, сподіваюся, ви не заперечуєте;) Я в безпеці подалі від вашого рахунку байтів, все одно, мені просто здалося, що це занадто цікаво пропустити.
Андрас

7

Математика, 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 довгі. Хтось повинен entropy-кодувати їх і зробити з нього нову мову. :)

При застосуванні до 1:

введіть тут опис зображення

При застосуванні до 2:

введіть тут опис зображення


6

MATLAB, 235 233 217 байт

Оновлення: купа пропозицій від @flawr допомогла мені втратити 16 байт. Оскільки тільки це дозволило мені перемогти рішення про недоліки , і що я б не знайшов виклику без допомоги флера в першу чергу, вважай це спільним поданням нами :)

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, очевидно, ти маєш рацію :) 1. дякую за матрицю обертання, 2. дякую за нову q, у мене навіть була непотрібна пара дужок ... 3. дякую, але в чому ця магія ??: D 4. Оскільки рішення зараз коротше вашого оригіналу, я вважаю, що це частково і ваше подання.
Андрас Деак

6

Математика, 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, тож виходите до 125 байт.
2012р. Кампіон

OMFG що це таке
DumpsterDoofus

3

Математика, 199 196 байт

Очищення відповіді Пітера Ріхтера за волосся, ось одна з моїх власних. Він значною мірою спирається на графічну функціональність і менше на математику та 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

Редагувати: Завдяки DumpsterDoofus для GoldenRatio


Ви можете зберегти 3 байти, замінивши ((1+Sqrt@5)/2)на GoldenRatio. Також у другому рядку я думаю, що це має бути p@0=Polygon@c[{1,0},5];замість p@0=Polygon@cp[{1,0},5];. (До речі, я насправді Пітер, у мене є два профілі, хаха).
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]

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.