Графічне зображення Сніжинки Коха


13

Утворіть сніжинку Коха

Сніжинка Коха - це трикутник, який для кожного nдодається ще одна рівностороння точка посередині кожної сторони: http://en.wikipedia.org/wiki/Koch_snowflake#Properties

У нас уже був виклик для Koch Snowflaken=4 . Новим завданням є намалювати сніжинку Коха будь-якою nміж 1і 10.

Правила

Сніжинки можуть не бути жорстко кодованими в програмі або у файлах - вони повинні бути згенеровані вашою програмою.

Ваша програма повинна підтримувати всі розміри nвід 1 до 10.

Кількість сторін має вводити користувач через std-in.

Ви повинні надрукувати на екран графічне зображення сніжинки.

Зразок сніжинок Коха з nрівними 1, 2, 3 та 4 (зелені лінії лише для наочності не відтворюють їх):

Кох Сніжинки

У разі вибору з тай-брейку виграє програма з найбільшою кількістю оновлень (поп-конкурс).


Я не маю сенсу в цьому: "Ви повинні використовувати функцію, щоб обчислити, де розмістити піксель. Якщо у вашій програмі для цієї мети немає вбудованої функції, ви можете відняти витрати на її реалізацію. " Який піксель?
xnor

@xnor Спочатку було призначено обчислити, як намалювати сніжинку на основі пікселя / символу (виклик спочатку був також завданням ASCII-art). Більшість людей, ймовірно, просто використовуватимуть лінії, тому я зніму це.

Чи можна намалювати всю заповнену сніжинку?
xnor

Звичайно. Цей коментар повинен бути довшим.

Крім того n=7, ви не можете побачити нещодавно додані трикутники у сніжинці на екрані комп'ютера. Чи добре тут? Чи є мінімальна роздільна здатність для піксельних рішень?
xnor

Відповіді:


7

Математика 72

Region@Line@AnglePath[Nest[Join@@({#,1,4,1}&/@#)&,{4,4,4},Input[]-1]π/3]

n = 3

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

Дякую за алефальфу.


Хороша робота. Пограйте його двома символами, і ви отримаєте виграш!

@ Hosch250 Оновлено, дякую.
чіяно

Ви можете використовувати AnglePathв Mathematica 10.1.
алефальфа

@chyaongGraphics@Line@AnglePath[Nest[Join@@({-1,2,-1,#}&/@#)&,{2,2,2},Input[]-1]Pi/3]
alephalpha

1
@alephalpha 73 годин:ListLinePlot@AnglePath[Nest[Join@@({#,1,4,1}&/@#)&,{4,4,4},Input[]-1]π/3]
chyanog

15

МАТЛАБ, 119 115

У незвичному повороті подій я виявив, що ця програма насправді працювала краще, коли я займався її гольфу. По-перше, це стало набагато швидше завдяки векторизації. Тепер він відображає корисну підказку, яка ~n:~нагадує користувачеві, яку кількість потрібно ввести!

Нові рядки не є частиною програми.

x=exp(i*pi/3);
o='~n:~';
P=x.^o;
for l=2:input(o);
P=[kron(P(1:end-1),~~o)+kron(diff(P)/3,[0 1 1+1/x 2]) 1];
end;
plot(P)

n = 9: n = 9

o- довільна струна, яка дорівнює [0 2 4 0]модулю 6. e iπ / 3, піднята до цих потужностей, дає вершини рівностороннього трикутника в складній площині. Перший kronвикористовується для копіювання списку пунктів, кожен з яких дублюється 4 рази. ~~oце зручний спосіб отримати вектор із 4-х. По-друге, diff(P)знаходить вектор між кожною парою послідовних точок. Множини цього вектора (0, 1/3, (1 + e -iπ / 3 ) / 3 і 2/3) додаються до кожної старої точки.


Гм, не могли б ви пояснити дещо детальніше, як працює цей код? Я думав, що знаю якогось Матлаба, але це ... божевілля ?? =)
недолік

@flawr Я додав кілька приміток, чи це допомагає?
feersum

Велике спасибі! Я буду мати на увазі цей трюк із зловживанням жорстокістю =)
недолік

9

T-SQL: 686 (крім форматування)

Для SQL Server 2012+.

Незважаючи на те, що це ніколи не буде претендентом, я повинен був побачити, чи зможу це зробити в T-SQL. Йшли для підходу, починаючи з трьох початкових країв, потім повторюючи кожен край і замінюючи їх 4 ребрами для кожного рівня. Нарешті, об'єднавши все це в єдину геометрію для рівня, визначеного для @i

DECLARE @i INT=8,@ FLOAT=0,@l FLOAT=9;
WITH R AS(
    SELECT sX,sY,eX,eY,@l l,B,1i
    FROM(VALUES(@,@,@l,@,0),(@l,@,@l/2,SQRT(@l*@l-(@l/2)*(@l/2)),-120),(@l/2,SQRT(@l*@l-(@l/2)*(@l/2)),@,@,-240))a(sX,sY,eX,eY,B)
    UNION ALL
    SELECT a.sX,a.sY,a.eX,a.eY,l/3,a.B,i+1
    FROM R 
        CROSS APPLY(VALUES(sX,sY,sX+(eX-sX)/3,sY+(eY-sY)/3,sX+((eX-sX)/3)*2,sY+((eY-sY)/3)*2))x(x1,y1,x2,y2,x3,y3)
        CROSS APPLY(VALUES(x2+((l/3)*SIN(RADIANS(B-210.))),y2+((l/3)*COS(RADIANS(B-210.)))))n(x4,y4)
        CROSS APPLY(VALUES(x1,y1,x2,y2,B),
            (x3,y3,eX,eY,B),
            (x2,y2,x4,y4,B+60),
            (x4,y4,x3,y3,B-60)
        )a(sX,sY,eX,eY,B)
WHERE @i>i)
SELECT Geometry::UnionAggregate(Geometry::Parse(CONCAT('LINESTRING(',sX,' ',sY,',',eX,' ',eY,')')))
FROM R 
WHERE i=@i

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


Я не мав уявлення, що такого чаклунства можна досягти за допомогою T-SQL!
Гаррі Мусто-Плейфайр

9

ЛОГО: 95

to w:c ifelse:c=1[fd 2 lt 60][w:c-1 w:c-1 lt 180 w:c-1 w:c-1]end
to k:c repeat 3[w:c rt 180]end

Визначає функцію kз параметром одного рівня.

Редагувати

У цьому інтернет-редакторі http://www.calormen.com/jslogo/ ви можете додати, k readwordщоб використовувати підказку для введення, але чомусь ця команда не підтримує стандартну абревіатуру rw.

Розділ 102 символів нижче працює в USBLogo зі стандартним входом, як зазначено в питанні. Однак код потребував незначних змін, оскільки UCBLogo має якийсь дивний аналіз. Це вимагає toі endбути в окремих рядках та пробілі раніше, ніж :потрібно, але, з іншого боку :, необов’язково.

to w c
ifelse c=1[fd 2 lt 60][w c-1 w c-1 lt 180 w c-1 w c-1]
end
to k c
repeat 3[w c rt 180]
end
k rw

Як ви запускаєте LOGO?
Бета-розпад

@BetaDecay Я використав це: logo.twentygototen.org, але це було першим, що я знайшов: calormen.com/jslogo Ви також можете встановити USBLogo
nutki

8

BBC BASIC, 179

REV 1

INPUTn
z=FNt(500,470,0,0,3^n/9)END
DEFFNt(x,y,i,j,a)
LINEx-36*a,y-21*a,x+36*a,y-a*21PLOT85,x,y+a*42IFa FORj=-1TO1FORi=-1TO1z=FNt(x+24*a*i,y+j*14*a*(i*i*3-2),i,j,-j*a/3)NEXTNEXT
=0

Як і раніше, але у чорно-білій, у безгольовій (але обтічній) та гольф-версіях. Не є переможцем, незважаючи на те, що цим способом уникнути необхідності спеціального тременування при n = 1.

  INPUTn
        REM call function and throw return value away to z
  z=FNt(500,470,0,0,3^n/9)
  END

        REM x,y=centre of triangle. a=scale.
        REM loop variables i,j are only passed in order to make them local, not global.
  DEFFNt(x,y,i,j,a)

        REM first draw a line at the bottom of the triangle. PLOT85 then draws a filled triangle,
        REM using the specified point (top of the triangle) and the last two points visited (those used to draw the line.)
  LINEx-36*a,y-21*a,x+36*a,y-21*a
  PLOT85,x,y+42*a

        REM if the absolute magnitude of a is sufficient to be truthy, recurse to the next level.
        REM j determines if the triangle will be upright, inverted or (if j=0) infinitely small.
        REM i loops through the three triangles of each orientation, from left to right.
  IFa FORj=-1TO1 FORi=-1TO1:z=FNt(x+24*a*i,y+j*14*a*(i*i*3-2),i,j,-j*a/3):NEXT:NEXT

        REM return 0
  =0

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

REV 0

Відповідно до відповіді ОП на @xnor, сніжинки в порядку. Ця відповідь надихнула коментаря xnor. Кольори просто для розваги та показують, як він побудований. Візьміть трикутник (в цьому випадку пурпуровий) і перекрийте 6 трикутниками 1/3 основи.

  INPUTn
  z=FNt(500,470,n,1,0,0)
  END

  DEFFNt(x,y,n,o,i,a)
  a=3^n/22
  GCOLn
  MOVEx-36*a,y-o*21*a
  MOVEx+36*a,y-o*21*a
  PLOT85,x,y+o*42*a
  IFn>1FORi=-1TO1:z=FNt(x+24*a*i,y+14*a*(i*i*3-2),n-1,-1,i,a):z=FNt(x+24*a*i,y-14*a*(i*i*3-2),n-1,1,i,a)NEXT
  =0

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


1
Мені подобається, як це виглядає, як їх 7 злилися разом.

@ hosch250 Дійсно, я, здається, "винайшов" новий фрактал, силует якого, як буває, сніжинка Коха, і якщо ви видалите пурпурову частину, вам залишиться 6 менших сніжинок Коха. Версія для гольфу буде просто простим чорним силуетом, але я залишаю це зображення також.
Рівень річки Св.

Ви пишете це BBC Basic або BBC BASIC? Я берусь за останнє, але не знаю, чи це правильно ...
Бета-розпад

2
@BetaDecay BASIC - це назви для універсального стандартного / символічного коду інструкцій для початківців. Біт "Стандарт" є дискусійним, оскільки варіантів так багато. en.wikipedia.org/wiki/BASIC . Більшість варіантів BASIC надають перевагу великої літери, але відповідно до сторінки Вікіпедії, Visual Basic вважає за краще малі регістри. Я думаю, що BBC BASIC, що постачається, був великим. Я використовую версію на bbcbasic.co.uk/bbcwin/bbcwin.html . Це великі регістри веб-сайту та IDE, тому я б сказав, що верхня велика літера є більш правильною. Але я не думаю, що це має велике значення.
Рівень річки Св.

Ага гаразд, я продовжуватиму з великої версії
Beta Decay

8

Математика - 177

r[x_, y_] := Sequence[x, RotationTransform[π/3, x]@y, y]
Graphics@Polygon@Nest[
 ReplaceList[#, {___, x_, y_, ___}  Sequence[x,r[2 x/3 + y/3, 2 y/3 + x/3], y]
  ] &, {{0, 0}, {.5, √3/2}, {1, 0}, {0, 0}}, Input[]]

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

Бонусний кліп із зміною кута середньої частини

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


6

Пітон 3 - 139

Використовує графічну бібліотеку черепах.

from turtle import*
b=int(input())
a=eval(("FR"*3)+".replace('F','FLFRFLF')"*~-b)
for j in a:fd(9/b*("G">j));rt(60*(2-3*("Q">j))*("K"<j))])

Класно. Мені подобається ваш строковий підхід до пошуку форми з не більше двох рядків коду! Але ви не можете перевірити "G">j, "Q"<jі використовувати fd(9/b)для збереження 3 байта? Крім того, ви можете уникнути ifмноження тверджень, наприклад, ("G">j)з аргументом 9/bі поставити їх усі в один рядок позаду for. Ой! Тоді ви навіть можете комбінувати rtта ltвикористовувати120*(...)-60*(...)
Фалько

Це, мабуть, відображає вхід Сніжинки Коха + 1. Вхід 1 повинен бути просто трикутником, як показано на малюнку вище.

@Falko Дякую за всю допомогу!
Бета-розпад

@ hosch250 Відредаговано
бета-версія,

Тепер він нічого не малює, а введення 1 створює поділ на 0 помилок.

4

Python 3, 117 байт

from turtle import*
ht();n=int(input())-1
for c in eval("'101'.join("*n+"'0'*4"+")"*n):rt(60+180*(c<'1'));fd(99/3**n)

Спосіб:

  • У рішенні використовується графіка черепах Python.
  • n є input - 1
  • Починаючи з рядка, 0000ми з'єднуємо його кожен символ із 101 nчасом ітеративно з трюком eval (завдяки цьому xxnor).
  • Для кожного символу в останньому рядку повертаємо на 60 градусів вправо або на 120 градусів вліво на основі знаку символу ( 1або 0), а потім рухаємося вперед по довжині ( 99/3^n), що гарантує однаковий розмір для всіх n.
  • Останній 0у рядку буде марним, але він просто перемальовує той самий рядок, який 0малює перший .

Приклад виводу для input = 3:

кох


2

R: 240 175

Оскільки я намагаюся обвести голову навколо R, ось ще одна версія. Можливо, є набагато кращі способи зробити це, і я радий отримувати вказівки. Те, що я зробив, здається дуже суперечливим.

n=readline();d=c(0,-120,-240);c=1;while(c<n){c=c+1;e=c();for(i in 1:length(d)){e=c(e,d[i],d[i]+60,d[i]-60,d[i])};d=e};f=pi/180;plot(cumsum(sin(d*f)),cumsum(cos(d*f)),type="l")

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


2

Мудрий, з ким ти гулиш ...

Я знав, що хочу спробувати реалізувати це в Befunge-98 за допомогою TURT, але не міг зрозуміти, як це зробити, і просидів на ньому кілька місяців. Тепер, лише нещодавно, я придумав спосіб це зробити, не використовуючи самомодифікацію! І так ...

Befunge-98 з відбитками TURT, 103

;v;"TRUT"4(02-&:0\:0\1P>:3+:4`!*;
>j$;space makes me cry;^
^>1-:01-\:0\:01-\:0
0>I@
^>6a*L
^>ca*R
^>fF

Давайте спочатку вийдемо деякі деталі реалізації:

  • Я перевірив це за допомогою CCBI 2.1 , реалізація якого TURT (графічний відбиток черепахи) змушує I"друкувати" зображення у файл SVG. Якщо запустити це в CCBI без командного аргументу --turt-line=PATH, він вийде як файл з іменем CCBI_TURT.svg за замовчуванням. Це найближче, що я міг би підійти, щоб "надрукувати графічне зображення сніжинки на екрані" з доступними інтерпретаторами Funge, які я міг знайти. Можливо, колись там буде кращий перекладач, який має графічний дисплей для черепахи, але поки що ...
  • У кінці повинен бути новий рядок, щоб CCBI запустив його без вивішування (це входить до кількості символів). Я знаю, правда?

В основному, це працює, використовуючи стек як своєрідну імпровізовану L-систему та розширюючи її на льоту. Кожен прохід, якщо верхній номер у стеці:

  • -2, потім він друкує і зупиняється;
  • -1, черепаха повертається проти годинникової стрілки на 60 градусів;
  • 0, він обертається за годинниковою стрілкою на 120 градусів;
  • 1, він рухається вперед (на 15 пікселів тут, але ви можете змінити його, змінивши fв останньому рядку);
  • деяке число n, яке дорівнює 2 або більше, тоді воно розгортається на стек до n-1, -1, n-1, 0, n-1, -1, n-1.

Тому що n = 10цей процес займає дуже багато часу (пару хвилин у моїй системі), і отриманий SVG має розмір ~ 10 Мб і невидимий при перегляді в браузері, оскільки ви не можете налаштувати розмір пензля за допомогою TURT. IrfanView, здається, працює пристойно, якщо у вас є правильні плагіни. Я не надто знайомий зі SVG, тому не знаю, який саме кращий спосіб перегляду цих файлів (особливо, коли вони дійсно великі).

Гей, принаймні, це працює - що, вважаючи, що це Befunge, - це щось, за що треба вдячно.


1

Python 2, 127 байт

from turtle import *
def L(l,d=input()-1):
 for x in[1,-2,1,0]:[L(l,d-1),rt(60*x)] if d>0 else fd(l)
for i in'lol':lt(120);L(9)

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