Нарисуйте кривую Серпинского стрелки


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-файл с прозрачным фоном под названием «а».

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

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


Отлично, я не знал о Diagrams!
flawr

@ Flawr, это здорово, но применяются обычные предостережения графической программы на Haskell. Было бы здорово просто вызвать эквивалент, plot() чтобы открыть окно.
Angs

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в счетчик байтов?
u54112

Я не уверен, что это так просто, но я сам не знаю язык.
Нил

1

Python 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

Mathematica / Wolfram Language 73 байта

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

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

п = 1

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

п = 2

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

п = 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.