Вступление
В этом вызове матрица 2 × 2 индексируется следующим образом:
0 1
2 3
Мы определяем семейство фрактально-подобных паттернов F(L)
, где список L
длин n
этих индексов F(L)
имеет размер .2n-1 × 2n-1
- Если
L == []
, тоF(L)
это шаблон 1 × 1#
. Если
L != []
, тоF(L)
строится следующим образом. ПозвольтеP
быть шаблоном, полученным изL
с удаленным первым элементом. Возьмите четыре сетки размера, заполненные точками , и замените индексированную сетку на шаблон . Затем склейте сетки, используя один слой хешей между ними. Вот диаграммы для четырех случаев:2n-1-1 × 2n-1-1
.
L[0]
P
#
L[0]==0 L[0]==1 L[0]==2 L[0]==3 #... ...# ...#... ...#... [P]#... ...#[P] ...#... ...#... #... ...# ...#... ...#... ####### ####### ####### ####### ...#... ...#... #... ...# ...#... ...#... [P]#... ...#[P] ...#... ...#... #... ...#
пример
Рассмотрим вход L = [2,0]
. Начнем с сетки 1 × 1 #
и пройдем L
справа. Самый правый элемент 0
, поэтому мы берем четыре копии сетки 1 × 1 .
, заменяем первую на #
и склеиваем их вместе с хешами. Это приводит к сетке 3 × 3
##.
###
.#.
Следующий элемент 2
, поэтому мы берем четыре копии сетки 3 × 3 .
s и заменяем третий на сетку выше. Четыре сетки
... ... ##. ...
... ... ### ...
... ... .#. ...
и склеивание их вместе с #
s результатов в сетке 7 × 7
...#...
...#...
...#...
#######
##.#...
####...
.#.#...
Это наш окончательный результат.
вход
Ваш вклад представляет собой список L
индексов 0, 1, 2, 3
. Вы можете принять его как список целых чисел или строку цифр. Обратите внимание, что он может быть пустым и содержать дубликаты. ДлинаL
не более 5.
Выход
Ваш вывод является шаблоном F(L)
в виде строки с разделителями новой строки.
Правила и оценки
Вы можете написать полную программу или функцию. выигрывает наименьшее количество байтов, и стандартные лазейки запрещены.
Контрольные примеры
[]
#
[0]
##.
###
.#.
[3]
.#.
###
.##
[2,0]
...#...
...#...
...#...
#######
##.#...
####...
.#.#...
[1,1]
...#.##
...####
...#.#.
#######
...#...
...#...
...#...
[1,2,0]
.......#...#...
.......#...#...
.......#...#...
.......########
.......###.#...
.......#####...
.......#.#.#...
###############
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
[3,3,1]
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
###############
.......#...#...
.......#...#...
.......#...#...
.......########
.......#...#.##
.......#...####
.......#...#.#.
[0,1,2,3]
.......#...#...#...............
.......#...#...#...............
.......#...#...#...............
.......#########...............
.......#.#.#...#...............
.......#####...#...............
.......#.###...#...............
################...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
###############################
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
[0,0,1,2,3]
.......#...#...#...............#...............................
.......#...#...#...............#...............................
.......#...#...#...............#...............................
.......#########...............#...............................
.......#.#.#...#...............#...............................
.......#####...#...............#...............................
.......#.###...#...............#...............................
################...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
################################...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
###############################################################
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
#
?L !=[]
в этом примере, поскольку он имеет 1 или более элементов. Означает ли это , что F (L) является всегда#
на первом?L = [2,0]
вы отсекаете голову и смотрите на шаблонF([0])
, затем отсекаете голову[0]
и смотрите на шаблонF([])
, который является сеткой 1x1#
. Затем вы используете отрубленный индекс0
для построения шаблона 3х3, а затем используете отрубленный индекс2
для построения шаблона 7х7. Чтобы ответить на ваш вопрос: да, вы всегда начинаете с сетки 1x1, так как это базовый случай рекурсии.Ответы:
CJam,
5947434140 байтСпасибо Sp3000 за сохранение 1 байта.
Проверьте это здесь.
объяснение
Немного устарел. Исправлю позже.
Все переупорядочения списков 4D вызывают у меня головокружение ...
Этот код реализует спецификацию в буквальном смысле, используя итерационный алгоритм из раздела примеров вместо его рекурсивного определения. Один из главных трюков игры в гольф заключается в том, что я использую пробелы вместо
#
вычислений и заменяю их только#
в конце, что упрощает код в одном месте и позволяет использоватьS
вместо'#
или"#"
в нескольких.источник
MATL ,
4241 байтПопробуйте онлайн!
объяснение
Это работает итеративно, используя продукт Kronecker для расширения массива в каждой итерации. Массив построен с
0
и1
вместо.
и#
, и в конце они заменяются соответствующими символами.Будет столько итераций, сколько и размера ввода. Ввод обрабатывается справа налево. Индекс итерации начинается с
1
.Используя пример в задаче, с вводом
[2,0]
, массив инициализируется какЭто соответствует начальному
1
(#
), расширенной на одну строку и один столбец, назначение которых будет ясно позже. Значения в этих столбцах не важны, так как они будут перезаписаны; они могут быть одинаково:На каждой итерации существующий массив умножается по Кронекеру на массив 2 × 2 с нулем один, который содержится
1
в позиции, указанной текущей записью ввода, и0
в других записях. В примере на итерации i = 1, так как самая правая входная запись0
массив с нулем одини произведение Кронекера этих двух массивов
Далее строка и столбец с индексом
2^i
заполняются таковыми:Первые три строки и столбцы составляют результат первой итерации. Как и прежде, существуют дополнительные строки и столбцы, которые полезны для расширения массива в следующей итерации.
На итерации i = 2, поскольку текущее входное значение содержит
2
указанный выше массив, умножается на Кронекеракоторый дает
Заполнение
2^i
строки и столбца единицами даетПоскольку это последняя итерация, лишняя строка и столбец удаляются:
и замена символов выполняется для получения окончательного результата:
Подробное описание кода приведено ниже:
источник
Haskell,
123122 байтаПример использования:
Как это устроено:
источник
JavaScript (ES6),
171152 байтаПринимает результат рекурсивного вызова, затем заменяет каждую строку на себя, плюс хэш плюс строку точек одинаковой длины, в обратном порядке, если это необходимо, затем из этого частичного результата создается строка точек, за исключением строк новой строки и центрального столбца. хэшей, а также строка хэшей с окружающими символами новой строки, затем соединяет эти три строки вместе в соответствующем порядке.
источник
Рубин,
143134 байтаАнонимная функция.
1 байт, сохраненный перестановкой первой строки. 6 байтов сохраняются путем изменения пути z от формулы к таблице. 2 байта сохранены за счет исключения varable
w
.Неуправляемый в тестовой программе
источник
Рубин, 150 байт
Анонимная функция. Использует рекурсивный вызов для создания списка строк, по одной строке на строку, а затем соединяет их все вместе в конце.
источник
Python 3.5, 1151 байт:
Не большая часть кода гольф, ну да ладно. Постараюсь подстричь его со временем, где смогу.
Довольно наивный способ сделать это, но, тем не менее, в настоящее время работает отлично и, как вы можете видеть, не использует никаких внешних модулей / библиотек. Кроме того, он может взять на пути более чем на 5 пунктов в предоставленном списке
s
без потери точности (то есть, если ваше оборудование может справиться с этим). Он удовлетворяет всем требованиям, и я не мог быть счастливее с тем, что получил. :)Теперь он может принимать не только любое число в диапазоне в
0=>3
качестве любого из значений, но и любое число , период, благодаря&
побитовому оператору! Вы можете прочитать больше о них здесь . Теперь, например, так[4,4,1,2,3]
как список ввода такой же, как[0,0,1,2,3]
.Примечание: ввод должен быть представлен в виде списка
Разгромленный с объяснением:
Более широкое и визуально привлекательное объяснение:
Для более широкого и визуально привлекательного объяснения рассмотрим второй раз, когда проходим через «главный» цикл в приведенном выше коде, в котором находится входной список
[0,2]
. В этом случае элементы в «основном» спискеl
будут:и
и список
y
будет содержать только0
. Используя преимущества индексации последнего элемента сетки в Pythonl[-1]
, мы можем пометить самые левые элементы сетки следующим образом:Какой шаблон вы видите? Каждый индекс в левой части сетки кратен 8, и, поскольку, используя уравнение,
2^(n-1)-1
дает длину каждого сегмента точек в сетке, мы можем((2^(n-1)-1)*2)+2
найти длину верхнего края сетки в целом. (+2, чтобы включить середину#
и\n
в конце). Мы можем использовать это уравнение, которое мы будем вызывать,i
чтобы найти значения индекса каждого элемента в левой части сетки любого размера, создав список и добавив в список каждое целое число, которое мы будем называть_
, в диапазоне0=>length of grid l[-1]
, такой, что этот элемент является кратнымi
, И также таким,_
который НЕ равенi*(2^(n-1)-1)
, так что мы можем исключить средний сегмент#
s отделяет верхнюю половину от нижней. Но нам нужны ВСЕ элементы с точками слева, а не только элементы с левой стороны. Что ж, есть исправление, и это было бы просто добавить в список список, содержащийi+h
где h - каждое целое число в диапазоне0=>2^(n-1)
каждый раз, когда значение из диапазона0=>length of grid l[-1]
добавляется в список, так что каждый раз будет столько же значений, добавленных в список, сколько длина одного квадранта точек. И это списокa
.Но как насчет точек на правой половине? Что ж, давайте посмотрим на индексацию по-другому:
Как видите, значения в середине - это те, которые нам нужны, так как они являются началом индекса каждого сегмента точек в правой части сетки. Теперь, что здесь за образец? Ну, если это уже недостаточно очевидно, то теперь все средние значения кратны
i/2
! Имея эту информацию, мы теперь можем создать другой список,b
к которому умножаютсяi/2
множители из диапазона0=>length of grid l[-1]
, так что каждое целое число из этого диапазона, которое мы снова назовем_
, НЕ равно(i/2)*(p*2)
исключению строки#
s, отделяющей верхнюю часть и нижние половины, И такие, что _ уже нет в списке a, так как нам действительно не нужны 8,16,32 и т. д. в спискеb
, И теперь, опять же, нам нужны не только эти конкретные индексы. Мы хотим, чтобы ВСЕ символы точек были на правой стороне сетки. Ну, так же, как мы сделали в спискеa
, здесь мы также можем добавить в список, где находится каждое целое число в диапазоне .b
списки,_+h
h
0=>2^(n-1)
Теперь у нас есть оба списка
a
иb
упакованы и готовы к работе. Как бы мы собрали их сейчас? Здесь спискиW
,T
,G
иC
входите. Они будут держать индексы для каждого конкретного квадранта точек в сеткеl[-1]
. Например, давайте зарезервируем listW
как список для всех индексов, равных квадранту 1 (index 0) сетки. В этом списке мы добавили бы первые2^(n-1)
списки из спискаa
, так как списокa
содержит все индексы для точек в левой половине сетки, а затем разделили их все так, чтобыW
теперь они содержали(2^(n-1))*(2^(n-1))
элементы. Мы сделали бы то же самое для спискаT
, но с той разницей,T
что содержали бы элементы из спискаb
, так какT
зарезервирован для квадранта 2 (индекс 1). СписокG
будет таким же, как списокW
, за исключением того, что он будет содержать остальные элементы из спискаa
, а списокC
будет таким же, как списокT
, за исключением того, что теперь он содержит остальные элементы из спискаb
. Вот и все! Теперь у нас есть значения индекса для каждого квадранта, содержащего точки в сетке, все разделены на четыре списка, соответствующих каждому квадранту. Теперь мы можем использовать эти 4 списка (W, T, G, C), чтобы сообщить программе, какие символы следует заменить в сеткеl[-1]
каждым символом из сеткиl[0]
, которая является самым первым элементом спискаl
. Поскольку значение0
здесь, оно заменит все точки в первом квадранте (индекс 0)l[0]
списком использования сеткиW
,Поэтому мы наконец имеем следующее:
Уф! Долгий процесс, не правда ли? Тем не менее, он работает отлично, и, опять же, я не мог быть счастливее. :)
источник