Иногда, когда мне очень скучно ( очень скучно), мне нравится рисовать отрезок линии и рисовать на нем точки.
Сначала я рисую отрезок линии определенного размера, который равен 2 ^ N для некоторого значения N. Линия будет представлена серией .
символов.
................
Затем я рисую точку на левом конце. Точки будут представлены X
символами.
X...............
Затем я следую шаблону. Начиная с самой последней нанесенной точки (которую я назову A), я перехожу к следующей нанесенной точке (B) на линии (при необходимости оборачиваясь). Затем я перехожу к следующей нанесенной точке на линии (С). Затем я строю новую точку на полпути между этой третьей точкой (C) и следующей уже нанесенной точкой (D).
Всякий раз, когда вы оборачиваете линию, «середина» определяется в виде обтекания. Вновь построенная точка всегда находится справа от C.
Допустим, следующая строка была моей текущей строкой. Вот как я бы наметил следующие две точки. Для этого примера я обозначу каждый важный пункт буквой.
X...A...X.X...X.
^
X...A...B.X...X.
^
X...A...B.C...X.
^
X...A...B.C...D.
^
X...X...X.X.A.X.
^
X...X...X.X.A.B.
^
C...X...X.X.A.B.
^
C...D...X.X.A.B.
^
X.A.X...X.X.X.X.
^
Возвращаясь к предыдущему примеру, следующая точка будет построена в середине линии.
X.......X.......
Это, возможно, немного особый случай: переход к следующему пункту просто оставляет вас, где вы начали. Единственной полезной точкой на полпути является «циклическая» точка на полпути (точка на полпути на линии), в отличие от построения точки сверху самой себя.
Ниже приведен ряд точек, которые я нанесу на линию отсюда до конца.
X.......X.......
X.......X...X...
X.......X.X.X...
X...X...X.X.X...
X...X...X.XXX...
X.X.X...X.XXX...
X.X.X...XXXXX...
Больше нет места для построения следующей точки, так как она должна быть втиснута между двумя соседними точками, поэтому я достиг максимальной глубины для данного значения N = 4. Последняя строка в приведенном выше списке - «завершена» «.
Соревнование
Цель состоит в том, чтобы написать самую короткую программу / именованную функцию, которая будет печатать / возвращать завершенную строку для заданного значения N. Выше показано N = 4.
вход
На входе будет одно неотрицательное целое число N. Длина сгенерированной строки будет тогда 2 ^ N.
Выход
Выход будет завершена линией длиной 2 ^ N, образованная .
и X
символы. Завершающий перевод строки не имеет значения.
Пример ввода / вывода
0
X
1
XX
2
X.XX
3
X.X.XXX.
4
X.X.X...XXXXX...
5
X.X.X...X...X...X.XXX.XXX.......
(c%b+b)%b
? Вы ожидаетеc
быть отрицательным?c=0
иd=0
может быть сокращено до всегоc
иd
.int
типы, определенные на уровне класса, автоматически инициализируются равными 0.Haskell, 182 байта
Использование:
f 5
. Выход:X.X.X...X...X...X.XXX.XXX.......
.К сожалению, Haskell не имеет функции слияния в стандартных библиотеках, поэтому я должен предоставить свою собственную (->
%
). К счастью, мне приходится объединять только бесконечные списки, поэтому мне не нужно покрывать базовые случаи, то есть пустые списки. Это все еще стоит 40 байтов.Как это работает: вместо того, чтобы устанавливать
X
s непосредственно в массиве, я держу список позиций, где они находятся. Кроме того, я не оборачиваюсь вокруг,2^N
а продолжаю увеличивать позиции к бесконечности (например, для N = 2 сX
передней частью, список позиций выглядит так[0,4,8,12,16,20,…]
). Я беру 3-й и 4-й элемент (c
иd
), вычисляю новую позицию(c+d)/2
, сохраняю ее для выходного списка, объединяю старый список позиций с позиции 4 (d
) с новым, начинающимся с(c+d)/2
и повторяюсь. Я останавливаюсь, когда(c+d)/2
равняетсяc
. Наконец, я добавляю a0
в список вывода и печатаюX
s в заданных позициях и в.
других местах.источник
Mathematica,
110102112108источник