Поток Змея, также известный как кривой Госпером , является фрактальной кривой, растет в геометрической прогрессии по размеру с каждым порядка / итерации процесса простой. Ниже приведены подробности о конструкции и несколько примеров для различных заказов:
Порядок 1 Flow Snake :
____
\__ \
__/
Порядок 2 Flow Snake :
____
____ \__ \
\__ \__/ / __
__/ ____ \ \ \
/ __ \__ \ \/
\ \ \__/ / __
\/ ____ \/ /
\__ \__/
__/
Порядок 3 Flow Snake :
____
____ \__ \
\__ \__/ / __
__/ ____ \ \ \ ____
/ __ \__ \ \/ / __ \__ \
____ \ \ \__/ / __ \/ / __/ / __
____ \__ \ \/ ____ \/ / __/ / __ \ \ \
\__ \__/ / __ \__ \__/ / __ \ \ \ \/
__/ ____ \ \ \__/ ____ \ \ \ \/ / __
/ __ \__ \ \/ ____ \__ \ \/ / __ \/ /
\ \ \__/ / __ \__ \__/ / __ \ \ \__/
\/ ____ \/ / __/ ____ \ \ \ \/ ____
\__ \__/ / __ \__ \ \/ / __ \__ \
__/ ____ \ \ \__/ / __ \/ / __/ / __
/ __ \__ \ \/ ____ \/ / __/ / __ \/ /
\/ / __/ / __ \__ \__/ / __ \/ / __/
__/ / __ \ \ \__/ ____ \ \ \__/ / __
/ __ \ \ \ \/ ____ \__ \ \/ ____ \/ /
\ \ \ \/ / __ \__ \__/ / __ \__ \__/
\/ / __ \/ / __/ ____ \ \ \__/
\ \ \__/ / __ \__ \ \/
\/ \ \ \__/ / __
\/ ____ \/ /
\__ \__/
__/
строительство
Рассмотрим построение потока 1 Змея из пути, содержащего 7 ребер и 8 вершин (помечено ниже. Увеличено для возможности):
4____5____6
\ \
3\____2 7\
/
0____1/
Теперь для каждого следующего заказа вы просто заменяете ребра повернутой версией этого исходного шаблона заказа 1. Используйте следующие 3 правила для замены ребер:
1 Для горизонтального края замените его исходной формой как:
________
\ \
\____ \
/
____/
2 Для /
кромки ( 12
в приведенной выше конструкции) замените ее на следующую повернутую версию:
/
/ ____
\ / /
\/ /
/
____/
3 Для \
кромки ( 34
и 67
выше) замените ее на следующую повернутую версию:
/
/ ____
\ \ \
\ \ \
\ /
\/
Так, например, порядок 2 с вершинами из порядка 1 будет выглядеть как
________
\ \
________ \____ \6
\ \ / /
\____ \5___/ / ____
/ \ \ \
4___/ ________ \ \ \7
/ \ \ \ /
/ ____ \____ \2 \/
\ \ \ / /
\ \ \3___/ / ____
\ / \ / /
\/ ________ \/ /
\ \ /
\____ \1___/
/
0___/
Теперь для любого более высокого порядка вы просто разбиваете текущий уровень на ребра длиной 1 /
, 1 \
или 2 _
и повторяете процесс. Обратите внимание, что даже после замены общие вершины между любыми двумя последовательными ребрами все еще совпадают.
Вызов
- Вы должны написать функцию полной программы, которая получает одно целое число
N
через аргумент функции STDIN / ARGV / или ближайший эквивалент и печатает порядокN
Flow Snake на STDOUT. - Входное целое число всегда больше чем
0
. - Не должно быть никаких начальных пробелов, которые не являются частью шаблона.
- Не должно быть либо конечных пробелов, либо достаточно пробелов, чтобы заполнить шаблон, чтобы полностью заполнить минимальный ограничивающий прямоугольник.
- Трейлинг новой строки не является обязательным.
Забавные факты
- Flow Snakes - игра слов снежных хлопьев, которая напоминает эту модель для порядка 2 и выше.
- Поток и Змеи на самом деле играют роль в паттерне, так как паттерн состоит из единственного пути, проходящего по всему.
- Если вы внимательно обратите внимание, паттерн порядка 2 (и выше) также состоит из поворотов паттерна порядка 1, повернутых на общей вершине текущего и предыдущего ребра.
- Существует не ASCII-вариант Flow Snakes, который можно найти здесь и в нескольких других местах.
Это код-гольф, поэтому выиграй самый короткий код в байтах!
Leaderboard
Первый пост серии генерирует таблицу лидеров.
Чтобы убедиться, что ваши ответы отображаются, начните каждый ответ с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Ответы:
CJam, 144 байта
Добавлена новая строка, чтобы избежать прокрутки. Попробуйте онлайн
Программа работает в несколько этапов:
источник
Python 2,
428411388 байтЭтот был довольно хитрым. Шаблоны не сохраняют свои соотношения после каждого шага, что означает, что очень трудно процедурно создать изображение от своего предшественника. То, что делает этот код, хотя его довольно нечитаемо после некоторой интенсивной игры в математику, на самом деле проводит линию от начала до конца, используя рекурсивно определенную
D
функцию.Размер также был проблемой, и я закончил с того, что начал с середины
5*3**n
бокового квадрата и потом обрезал его, хотя, если бы я мог придумать лучший способ рассчитать размер, я мог бы его изменить.источник
r=[s*[" "]for i in range(s)]
->r=[[" "]*s]*s]
*
повторяет изменяемые объекты .l
, переключившисьprint'\n'.join()
на печать внутри цикла for, используяreturn[...][t]+x,
и удаляя скобки из(t%2)
. Кроме того, вы можете использовать,min(c.find('\\')%s for c in S)
если вы измените имя списка,S
чтобы он не перезаписывал начальное значениеs
.JavaScript ( ES6 ), 356
362 370Это сложно ...
Каждая фигура хранится в виде пути. Есть 6 основных строительных блоков (3 + 3 назад)
0
диагональ вверх слева направо вниз (4
назад)1
диагональ снизу слева направо вверх (5
назад)2
по горизонтали слева направо (6
назад)Для каждого есть шаг замещения, который будет применен при увеличении заказа:
0
->0645001
(назад4
->5441024
)1
->2116501
(назад5
->5412556
)2
->2160224
(назад6
->0664256
)значения предварительно заполнены в
h
массиве, даже если элементы 4..6 могут быть получены из 0..2 с помощьюЧтобы получить форму для данного порядка, путь строится в переменной p, применяя подстановки несколько раз. Затем основной цикл перебирает переменную p и рисует фигуру внутри массива g [], где каждый элемент является строкой.
Начиная с позиции (0,0), каждый индекс может стать отрицательным (индекс y при высоких ордерах). Я избегаю отрицательных индексов y, сдвигающих весь данный массив всякий раз, когда я нахожу отрицательное значение y. Мне все равно, станет ли индекс x отрицательным, так как в JS допустимы отрицательные индексы, чуть более сложными в управлении.
На последнем шаге я сканирую основной массив, используя .map, но для каждой строки мне нужно использовать явный цикл for (;;), используя
b
переменную, которая содержит наименьший достигнутый индекс x (который будет <0).в
console.log
В версии есть удобная начальная новая строка, которую можно легко сделать конечной новой строкой, меняющей 2 строки, как в версии с фрагментом кода.Удобный фрагмент для тестирования (в Firefox):
источник
Haskell, 265 байт
(Примечание: на GHC до 7.10 вам нужно будет добавить
import Control.Applicative
или заменитьabs<$>
наmap abs$
.)Запустить онлайн на Ideone.com
f n :: Int -> IO ()
рисует уровеньn
flownake. Чертеж вычисляется в порядке растрового изображения, а не вдоль кривой, что позволяет алгоритму работать в пространстве O (n) (то есть логарифмически по размеру рисунка). Почти половина моих байтов потрачена на вычисление, какой прямоугольник нарисовать!источник
Perl,
334 316309Параметр взят на стандартный ввод. Проверь меня .
источник
Haskell,
469419390385365 байтфункция f :: Int-> IO () принимает целое число в качестве входных данных и печатает поток Snake
источник
$
в определенииk
, и заменить(!!)a
с(a!!)
которой можно избавиться от некоторых скобок. Кроме этого, вы, кажется, сами знаете много хитростей. НиццаC
479474468427 байтПолагаю, парней из Perl и Haskell нет, я думаю, но здесь пока нет представления на C:
Чтобы сэкономить место при вызове atoi (), для уровня используется количество аргументов, переданных программе.
Программа работает в O (n ^ 3) или хуже; сначала путь вычисляется один раз, чтобы найти координаты min / max, затем для каждой пары (x, y) он рассчитывается один раз, чтобы найти символ в этом конкретном месте. Ужасно медленно, но экономит на администрировании памяти.
Пример запуска на http://codepad.org/ZGc648Xi
источник
X,Y,K,L,M,N,i,j,c;
вместоint X,Y,K,L,M,N,i,j,c;
иmain(l)
вместоvoid main(int l)
Python 2,
523502475473467450437 байтПфффт, мне это стоило 3 часа, но было весело!
Идея состоит в том, чтобы разбить задачу на несколько этапов:
Вот код в негольфированной форме:
Изменить: я изменил язык на Python 2, чтобы быть совместимым с моим ответом для # 3 (и это также экономит еще 6 байтов)
источник
l.extend(x)
вl+=x
. Также вы, вероятно, можете использовать codegolf.stackexchange.com/questions/54/… вместо того, что.split()
вы используете (я сделал нечто подобное в своем ответе)extend
Пари / ГП, 395
Цикл по позициям символов x, y и вычисление того, какой символ печатать. Умеренные попытки свести к минимуму, забил с пробелами и комментарии лишены.
Каждый символ - это первая или вторая ячейка шестиугольника. Расположение ячейки - это комплексное число z, разбитое на основание b = 2 + w с цифрами 0, 1, w ^ 2, ..., w ^ 5, где w = e ^ (2pi / 6) шестой корень из единицы. Эти цифры сохраняются как отличительные знаки от 1 до 7, а затем переводятся от максимума к минимуму через таблицу состояний для вращения сети. Это в стиле кода потокового змея Эд Shouten (
xytoi
), но только для чистого вращения, не превращая цифры в индекс «N» вдоль пути. Экстенты относятся к началу 0 в центре фигуры. Пока предел не является конечной точкой, это середина 2-символьного шестиугольника, и необходим только 1 из этих символов. Но когда начало и / или конец змеи являются X пределом, необходимо 2 символа, то есть k = 0 начало и k <3 конец. В Pari есть «квадраты», такие как sqrt (-3), но то же самое можно сделать с реальными и мнимыми частями по отдельности.источник