Я возился с бесконечными резисторными сетями (длинная история), когда натолкнулся на следующую интересную рекурсивную схему:
|-||
|---
Каждый экземпляр этого шаблона в два раза шире, чем высокий. Чтобы перейти от одного уровня шаблона к следующему, вы разбиваете этот прямоугольник на два подблока (каждый из которых представляет собой квадрат NxN):
AB =
|-||
|---
so A =
|-
|-
and B =
||
--
Эти половинки затем дублируются и переставляются по следующей схеме:
ABAA
ABBB
giving
|-|||-|-
|---|-|-
|-||||||
|-------
Вызов
Напишите программу / функцию, которая, учитывая число N
, выводит N
итерацию этой рекурсивной схемы. Это гольф.
Формат ввода / вывода относительно мягкий: вы можете вернуть одну строку, список строк, двумерный массив символов и т. Д. Допускается произвольный конечный пробел. Вы также можете использовать индексирование 0 или 1.
Примеры
Первые несколько итераций шаблона следующие:
N = 0
|-
N = 1
|-||
|---
N = 2
|-|||-|-
|---|-|-
|-||||||
|-------
N = 3
|-|||-|-|-|||-||
|---|-|-|---|---
|-|||||||-|||-||
|-------|---|---
|-|||-|-|-|-|-|-
|---|-|-|-|-|-|-
|-||||||||||||||
|---------------
N = 4
|-|||-|-|-|||-|||-|||-|-|-|||-|-
|---|-|-|---|---|---|-|-|---|-|-
|-|||||||-|||-|||-|||||||-||||||
|-------|---|---|-------|-------
|-|||-|-|-|-|-|-|-|||-|-|-|||-|-
|---|-|-|-|-|-|-|---|-|-|---|-|-
|-|||||||||||||||-|||||||-||||||
|---------------|-------|-------
|-|||-|-|-|||-|||-|||-|||-|||-||
|---|-|-|---|---|---|---|---|---
|-|||||||-|||-|||-|||-|||-|||-||
|-------|---|---|---|---|---|---
|-|||-|-|-|-|-|-|-|-|-|-|-|-|-|-
|---|-|-|-|-|-|-|-|-|-|-|-|-|-|-
|-||||||||||||||||||||||||||||||
|-------------------------------
Интересно, есть ли какой-нибудь короткий алгебраический способ вычисления этой структуры.
f(n,x,y)
которая может напрямую вычислять, должна ли данная координата содержать-
или|
. Это может включать операции по модулю или побитовые операции. Все техники, которые я видел до сих пор, включают в себя вырезание / соединение массивов, как показано в спецификации.f(x,y)
также работает, так как еслиx,y
он действителен, то результат не зависит отn
|-
?Ответы:
APL (Dyalog Classic) ,
2925 байтПопробуйте онлайн!
⍳2
это вектор0 1
⍪
превращает его в матрицу 2x1⍉
транспонирует, так что становится 1x2⎕
оцененный вклад{
}⍣⎕
применить функцию, которая много раз⍪⍨⍵
объединить аргумент поверх себя - матрица 2x2a←
помните какa
~
NEGATE⍉
транспонирования⌽
повернуть горизонтально⊖
повернуть вертикальноa,
соединитьa
слева'|-'[
]
использовать матрицу в качестве индексов в строке'|-'
, то есть превратить 0 в|
и 1 в-
источник
JavaScript (Node.js) ,
130...1069492 байтаГольф от моего альтернативного метода и исправления символов, -14 байт Спасибо @Shaggy
Попробуйте онлайн!
Мой оригинальный подход (
106102 байта)-4 байта Спасибо @ShaggyПопробуйте онлайн!
Объяснение и уклонение:
Мой оригинальный альтернативный метод, если
"|"->"2", "-"->"1"
это разрешено,105104 байта:Попробуйте онлайн!
Просто выяснил какой-то алгебраический метод решения этой проблемы.
Попробуйте онлайн!
(наконец, функция, длина которой сравнима с моим исходным ответом)
f(n, x, y)
вычисляет тип блока в блоке (x, y) наn
итерации следующей замены:где
0 = "|-", 1 = "||", 2 = "--"
, начиная сf(0, 0, 0) = 0
.Затем
g(x)(y)
вычисляет символ в точке (x, y) исходного шаблона.источник
Stax ,
241715 байтЗапустите и отладьте его
Вот представление ascii той же программы.
Основная идея - начать с сетки 0-го поколения, а затем повторить блок, который расширяет сетку.
источник
Холст ,
1716 байтовПопробуй это здесь!
Пояснение, показывающее стек для ввода 1:
Обновлен до 16 байт, исправив ошибку, из-за которой значения, установленные для
α
/ω
для работы, не были скопированы должным образом (Canvas должен быть полностью неизменным, но, увы, это не так).источник
Python 2 ,
8877 байт-11 байт Тенск Линн
Попробуйте онлайн!
источник
f=lambda x:x<1and['|-']or[n+2*n[i:i+2**x/2]for i in(0,2**x/2)for n in f(x-1)]
Perl 5 , 72 байта
Попробуйте онлайн!
источник
66
:$.=map{s/.{$.}$/$&$
$/,push@1,$
. $ & X3} @ 1for (@ 1 = "| -") x <>; скажем, для @ 1`Шелуха , 17 байт
1-индексироваться. Попробуйте онлайн!
объяснение
источник
Желе ,
2119 байтПопробуйте онлайн!
Объяснение:
Изначально значение есть
⁾|-
, то есть["|","-"]
.Последняя ссылка (
Ç
), данная[A, B]
, вернется,
¡
Неоднократно применить последнее звено (вход) число раз, иZY
форматирует его.Пояснение к последней ссылке:
источник
Чисто ,
121106 байтПопробуйте онлайн!
источник
Haskell , 86 байт
Попробуйте онлайн!
Довольно просто Вывод представляет собой список строк. Мы берем предыдущую версию и разделяем каждую строку пополам, а затем собираем их в два новых списка
unzip
. Тогда это просто вопрос объединения массивов вместе правильным способомисточник
J , 49 байт
Неуклюжий перевод решения ngn APL. У меня были проблемы с молчаливым - я буду благодарен за любой совет.
Попробуйте онлайн!
источник
Древесный уголь ,
4746 байтовПопробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Чтобы получить согласованную позицию курсора для следующего цикла, я должен напечатать шаг 0 в позиции (-2, -2) и оставить курсор в точке (-2, 0). (Это может быть связано с ошибкой в древесном угле.)
Цикл по первым
N
степеням 2.Сделайте копии предыдущего вывода с различными смещениями, в результате чего получается холст, содержащий желаемый следующий шаг в прямоугольнике внутри него.
Переместитесь в положение этого прямоугольника и обрежьте холст.
Альтернативное решение, также 46 байтов:
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Этот шаг времени 0 должен быть напечатан в позиции (2, 0), но, по крайней мере, позиция курсора не имеет значения.
Цикл по первым
N
степеням 2.Сделайте копии предыдущего вывода с различными смещениями, в результате чего получается холст, содержащий желаемый следующий шаг в прямоугольнике внутри него.
Переместитесь в положение этого прямоугольника и обрежьте холст.
источник
R , 126 байт
Попробуйте онлайн!
Возвращает
matrix
. В ссылке TIO есть немного кода, чтобы его можно было легко распечатать для удобства проверки.источник
К (нгн / к) , 25 байтов
Попробуйте онлайн!
источник
Wolfram Language (Mathematica) ,
6765 байтПопробуйте онлайн!
Простая реализация рекурсии. Возвращает массив символов, заключенных в список.
источник