Накресліть криву Стріпінських стрілок


14

Вступ

Серпінського Arrowhead Curve кривої, це межа Трикутник Серпінського.

Спочатку починається так:

 _
/ \

Потім кожен рядок замінюється на поворотну версію першого:

  _
 / \
 \ /
_/ \_

Далі:

     _
    / \
    \ /
   _/ \_
  /     \
  \_   _/
 _  \ /  _
/ \_/ \_/ \

Еволюція кривої Стріпінської стрілки

Ваше завдання

З огляду на число n , виведіть n -ітерацію кривої Стріпінської стрілки.

Ви можете вибрати 0- або 1-індекс, але вкажіть, будь ласка, у своїй відповіді.

Ви можете генерувати зображення або використовувати Ascii Art у форматі, який я мав вище.

Ви не можете використовувати вбудовані модулі для генерування цієї кривої.

Пам'ятайте, що це , тому виграє код з найменшими байтами.

Відповіді:


14

Октава, 240 236 221 байт

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

m=input(0);g=2*pi/6;u=cos(g);v=sin(g);A=[1,0];B=[u,v];C=[-u,v];D=-A;E=-B;F=-C;for k=1:m;f=[E;F;A];b=[A;B;C];A=[B;A;F];d=[C;D;E];C=[D;C;B];E=[F;E;D];B=b;D=d;F=f;end;A=[0,0;cumsum(A)];plot(A(:,1),A(:,2));axis off;axis equal

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


u=.5;v=3^u/2;B=[u,v];C=[-u,v];A=C<0;на 16 байт коротше :) Ви також axis off equalможете зберегти ще 5 байт.
Стюі Гріффін

3

Діаграми Haskell +, 176 байт

import Diagrams.Prelude
import Diagrams.Backend.SVG
g n=renderSVG"a"(mkWidth 99).strokeT.a n
a 0=hrule 1
a n|b<-a(n-1)=b%6<>b<>b%(-6);a%n=rotateBy(1/n).reflectY$a::Trail V2 Double

Створює SVG-файл з прозорим фоном під назвою "a".

g 0виводить горизонтальну лінію, g 1є /¯\.

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


Чудово, я не знав про це Diagrams!
flawr

@flawr, це чудово, але застосовуються звичайні застереження графічної програми Haskell. Було б чудово просто назвати еквівалент plot() відкриття вікна.
Ангс

2

MSWLogo (версія 6.5b), 102 байти

Бере дві функції shapeL, shapeRнаведені тут, і об'єднує їх, додаючи додатковий аргумент :a, який викликає протилежну функцію при запереченні.

to s :n :a :l
if :n=0[fd :l stop]
rt :a
s :n-1(-:a):l
lt :a
s :n-1 :a :l
lt :a
s :n-1(-:a):l
rt :a
end

sВизначається функція , яка займає кількість ітерацій :n(на основі 1), кут :a, довжину :l. Це рекурсивно, викликаючи нижчу ітерацію себе з кутом, :aзапереченим у двох випадках, щоб отримати правильну орієнтацію.

  • rt :a, lt :aповерніть черепаху (трикутник, чий шлях простежено) праворуч, ліворуч:a градуси.
  • fd :lпереміщує черепаху вперед :lкроками.

Функцію потрібно викликати :aрівним 60.

Стрілки

Тут, repeatпо суті, цикл FOR, із вбудованим лічильником repcount. puі pdозначають «ручка вгору» і «ручка вниз», які не дозволяють черепашці малювати під час встановлення її положенняsetxy .

Креслення кожної ітерації називають довжиною, :lрівною power 2 (7-repcount), яка зменшується в експоненціальному відношенні; це тому, що визначення використовує те ж саме :lна етапі рекурсивності, тому при фіксованому :lзагальний розмір випуску збільшиться в експоненціальному масштабі :n.


Це правильна мова для роботи, але технічно у відповідях не допускаються додаткові дані, тому в ідеалі ви б зашифрували 60 у своїй відповіді.
Ніл

@Neil Отже, я просто включу 60до числа байтів?
для Моніки

Я не впевнений, що це так просто, але я сама не знаю мови.
Ніл

1

Пітон 2, 124 байти

Виходячи з коду в статті Вікіпедії.

from turtle import*
def c(o,a):
 if o:o-=1;c(o,-a);lt(a);c(o,a);lt(a);c(o,-a)
 else:fd(9)
n=input()
if n%2==0:lt(60)
c(n,60)

Порядок 0 - це пряма лінія.


Ви повинні змінити свій код, щоб використовувати кут 60 градусів, інакше це не буде наближатись до трикутника Серпінського. Також орієнтація змінюється залежно від порядку, який я не вважаю правильним. trinket.io/python/a803546939
mbomb007

Відповідь логотипу також дає функцію, яка приймає кут як параметр, тому я вважаю, що це нормально. Що стосується орієнтації, це все одно та сама крива, щойно повернута.
BookOwl

Хоча відповідь логотипу - це завжди однакове обертання. Твоя - це різне обертання для кожного замовлення, і вони не однакові. Це не нормально. Подивіться на картинки, які містить питання.
mbomb007

Де виклик говорить про те, що обертання повинні бути однаковими?
BookOwl

1
Будь-який математичний фахівець може сказати вам, що ліміт повинен збігатися. Твій ні.
mbomb007

1

Математика / Вольфрам Мова 73 байти

s=1;Region@Line@AnglePath[Nest[Join@@({#,s=-s,s}&/@#)&,{#~Mod~2},#]Pi/3]&

Просте пояснення:
AnglePath [{θ1, θ2, θ3,…}] дає список 2D координат, що відповідають шляху, який починається з {0,0}, а потім робить ряд кроків одиничної довжини під послідовними відносними кутами θi.

n = 1

Graphics@Line@AnglePath[60°{1,-1,-1}]

n = 2

Graphics@Line@AnglePath[60°{0,1,1, -1,-1,-1, -1,1,1}]

n = 3

Graphics@Line@AnglePath[60°{1,-1,-1, 1,1,1, 1,-1,-1, -1,1,1, -1,-1,-1, -1,1,1, -1,-1,-1, 1,1,1, 1,-1,-1}]

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



0

JavaScript (ES6), 180 байт

f=(n,d=0,r=n=>` `.repeat(n))=>n?f(--n,d=3-d%3).map(s=>r([l=s.length/2,0,1,~n&1][d]+l)+s+r([,1,0,~n&1][d]+l)).concat(f(n,d+1).map(s=>s+r(!(d%3))+a.shift(),a=f(n,d+2))):[`_/\\`[d%3]]
<input type=number min=1 oninput=o.textContent=f(this.value).join`\n`><pre id=o>

Повертає масив рядків. Отримати правильний пробіл було найважче! Чиста версія рядка на 205 байт:

f=(n,d=0,r=n=>` `.repeat(n))=>n?f(--n,d=3-d%3).replace(/.+/g,s=>r([l=s.length/2,0,1,~n&1][d]+l)+s+r([,1,0,~n&1][d]+l))+`\n`+f(n,d+1).replace(/.+/g,s=>s+r(!(d%3))+a.shift(),a=f(n,d+2).split`\n`):`_/\\`[d%3]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.