Я нахожу удивительным, как буквы «Н» и «я» очень похожи. «Н» - горизонтальный штрих, окруженный двумя вертикальными штрихами; «I» - это вертикальный штрих, окруженный двумя горизонтальными штрихами (в зависимости от вашего шрифта). Могу поспорить, это может быть вложенным ... Вы знаете, что это мне напоминает? Фракталы !!!
Давайте определим пирамиду «IHIH» следующим образом: Первая итерация - это ASCII-представление буквы «I»:
---
|
---
Следующая итерация имеет вертикальный штрих с обеих сторон.
| |
|---|
| | |
|---|
| |
Если вы рассматриваете «Я» в середине как один горизонтальный штрих, то эта вторая итерация в основном представляет собой «Н». Третья итерация добавляет горизонтальный штрих сверху и снизу
-------
| |
|---|
| | |
|---|
| |
-------
Опять же, если вы рассматриваете букву «H» в середине как один вертикальный штрих, то эта итерация в основном представляет собой «I». Этот шаблон продолжается, чередуя "H" и "I" на каждой итерации. Для справки, вот первые 6 итераций:
1:
---
|
---
2:
| |
|---|
| | |
|---|
| |
3:
-------
| |
|---|
| | |
|---|
| |
-------
4:
| |
|-------|
| | | |
| |---| |
| | | | |
| |---| |
| | | |
|-------|
| |
5:
-----------
| |
|-------|
| | | |
| |---| |
| | | | |
| |---| |
| | | |
|-------|
| |
-----------
6:
| |
|-----------|
| | | |
| |-------| |
| | | | | |
| | |---| | |
| | | | | | |
| | |---| | |
| | | | | |
| |-------| |
| | | |
|-----------|
| |
Соревнование:
Напишите программу или функцию, которая выводит N-ю итерацию пирамиды IHIH и необязательный завершающий символ новой строки. Ваш ввод будет одним положительным целым числом в любом приемлемом формате. Вам не нужно обрабатывать недопустимые входные данные, например, нецелые числа, числа меньше 1 и т. Д. Ваша программа должна как минимум выдавать правильный выходной сигнал для входов до 20. Так как это код-гольф , стандартные лазейки не допускаются и самый короткий ответ в байтах побеждает!
Ответы:
Pyth ,
50403125 байтТестирование.
объяснение
Это рекурсивный алгоритм.
На каждой итерации мы выполняем три действия:
"-"
или в"|"
зависимости от количества итераций.После итераций выходные данные с нечетными номерами будут транспонированы. Поэтому мы их транспонируем.
источник
Python,
165145133123 байтаРекурсивное решение:
Вызывается с
print ("\n".join(i(int(sys.argv[1]))))
, где параметр является номером итерации пирамиды IHIH.Спасибо @DJMcMayhem за сохранение 20 байтов. Принятие идеи за этими предложениями дополнительно сэкономило еще 12 байтов. Спасибо @Maltysen за предложения, которые урезали еще несколько байтов.
Функция устанавливает разделитель ,
d
чтобы"|"
и промежуточные пространства к" "
(для нечетных итераций), имеет дело с возвращением в вырожденном случае, а затем сбрасывает разделитель к" "
и промежуточным пространствам , в"-"
течение четных итераций. Функция возвращает список строк для каждой строки IHIH, вставив результат рекурсивного вызова функции в нужное место в списке.источник
if e<1:return'|'
(без новой строки между ними), затем удалите «else» и удалите лишние отступы.return
. Кроме того, вы можете объединить строки безif
s с точкой с запятой и сэкономить на отступеЧеддер ,
186177165154148131 байтИспользует рекурсию. Добавлю объяснение, как только сделаю игру в гольф.
Попробуйте онлайн!
объяснение
Это тоже немного сложно, отследите все переменные, которые я использую, но я постараюсь сделать это проще:
Это было больно для гольфа, но его 55 байтов короче, чем оригинал.
источник
Python 2, 93 байта
Leaky Nun спас 7 байтов.
источник
int(x/2.)
потому что я принимал,range(-n,n+1)
но теперь я могу просто использовать их. Спасибо!Matricks ,
8062 байтаИтеративное решение (рекурсия в Matricks сложна ...)
Бежать с
python matricks.py ihih.txt [[]] <input> --asciiprint
Объяснение:
источник
JavaScript (ES6),
9290 байтРекурсивное решение работает, принимая предыдущую итерацию, добавляя
v
символ в стороны, затем добавляяc
символ в углы иh
символ вдоль верха и низа. Набор символов просто чередует каждую итерацию. Изменить: 2 байта сохранены, возвращаяv
когдаn=0
.источник
Дьялог АПЛ ,
5243 байтаv h s←'|- '
правопреемники три символа до трех имен ( об ertical, ч orizontal, S темп)⊃
первый, т.е.|
⍪
сделать в 1 × 1 таблице{
...}⍣⎕
получить ввод и применить функцию скобок, которая много разv=⊃⍵:
если верхний левый символ аргумента является вертикалью, то:h⍪⍨
горизонтали нижеh⍪
горизонтали вышеs,
пробелы слева от⍵,s
аргумент с пробелами справа⋄
еще:v,⍨
вертикали справа отv,
по вертикали слева отs⍪
пробелы выше⍵⍪s
аргумент с пробелами нижеПопробуй APL онлайн!
источник
Брахилог , 84 байта
Попробуйте онлайн!
Порт моего ответа в Pyth .
источник
C, 110 байтов
Вызывать как
f(n)
. Для 111 байтов я мог бы сделать:т.е.
#define
сохраняет ровно один байт.источник
Дьялог АПЛ, 34 байта
{
...}⍣⍵⍪'|'
Применение функции в фигурных скобках,⍵
начиная с матрицы символов 1x1|
. Результатом каждого приложения является аргумент для следующего приложения.s b←' -|'~⊃⍵
s - это пробел, а b - это строка, находящаяся не в верхнем левом углу аргумента (' -|'~'-'
удаляет горизонтальную черту и оставляет пробел и вертикальную черту)s,⍵,⊃s b
добавить пространство слева и справа (⊃
выбирает s из вектора sb)b,b,⍨⍉
транспонировать и добавить б влево и вправоДля нечетных чисел это оставляет результат транспонированным, поэтому требуется финальная транспонирование.
⍉⍣⍵
⍵
Время транспонирования (достаточно было бы одного раза, но для того, чтобы закодировать таким образом)Попробуй APL онлайн
источник
Чеддер , 107 байт
Попробуйте онлайн!
источник
Чеддер, 85 байт
Мой первый ответ Чеддер. Попробуйте онлайн!
Если я пытаюсь написать
r=(-n|>n).map(v->abs v).map
, а затемr(y->r(x->…))
, интерпретатор падает. ; -;источник
v->abs v
в(abs)
(напримерr.map((abs))
) , который будет возвращать функцию , которая имеет поведение функции абс. например(+)(1,2)
->3
.(^)(2,6)
-> 64. Кроме того, я не могу превзойти меня почти на 50%Runtime Error: `abs` has no behavior for types `Number` and `Number`
(потому чтоmap
получает и элемент, и его индекс, предположительно.)APL (Dyalog Classic) , 34 байта
Попробуйте онлайн!
(использует
⎕io←1
)⍳⎕
является1 2 ... N
(⌽,0,⊢)
это поезд, который превращает его в-N ... -1 0 1 ... N
∘.( )⍨
выполняет круглые скобки для каждой пары координат⍺ ⍵
Поезд
(≤-(1+=)×2|⌈)
или его dfn-эквивалент{(⍺≤⍵)-(1+⍺=⍵)×2|⍺⌈⍵}
создает матрицу, такую как:'- |'[2+ ]
делает эти действительные индексы⎕IO=1
и выбирает соответствующие символыисточник
Рубин,
817877 байтЭто основано на ответе Линн на Python . Предложения по игре в гольф приветствуются.
Редактировать: 3 байта благодаря Линн. Исправления и игра в гольф 1 байт благодаря Джордану.
Ungolfing:
источник
.map(&:abs)
?*
ничего не делает. Вы можете использовать*""
вместо.join
. Кроме того, использованиеp
окружает каждую строку кавычками (это вызываетinspect
ее аргументы), что может вас дисквалифицировать.&:abs
(map &:abs
). Возможно, вы сможете что-то делатьArray#product
вместо вложенныхmap
s, но это усложнит разрывы строк.r.product(r).map
(хотя это работает) длиннее и, по-видимому, не позволяют легко переносить строки.МАТЛАБ,
168163 байтаВероятно, это не самый умный способ сделать это: Развернуть строку со всех сторон
n
пошагово:Использование: Сохранить как
g.m
(я должен добавить это к количеству байтов?) И вызвать, например,g(15)
.Ungolfed:
источник
' '
на0
(Matlab рассматривает char 0 как пробел) и'-'
на45
. Имя файла не должно быть включено в число байтовНа самом деле ,
484544 байтЭто попытка перенести мой ответ Ruby на Actually. Это слишком долго, и предложения по игре в гольф очень ценятся. Попробуйте онлайн!
Вот 46-байтовая версия, которая разделяет вложенные функции, так что мы можем определить их
"| -"
в меньшем количестве байтов.Попробуйте онлайн!Ungolfing:
Первый алгоритм
Второй алгоритм
источник
u;±ux♂A╗╜`;2@%2╛%u╛(2±&<I"| -"E`#"╝╜%r£Mεj."%£M
больше, чем у вас в настоящее время (на 2 байта), но вы можете найти вдохновение для способов сделать его короче, чего я не вижу.Холст ,
19181714 байтовПопробуй это здесь!
Если бы мне было разрешено выводить все остальные выходные данные, повернутые на 90 °, последние 4 символа можно было бы удалить.
Пояснение (некоторые символы были изменены, чтобы выглядеть как ~ моноширинный):
источник
05AB1E ,
2928 байтПопробуйте онлайн!
-1 спасибо Дзайме ...
Это итеративное решение.
По сути, это делается путем создания следующего шаблона:
Затем попарно переставляем каждый элемент вместе и добавляем отступ.
Транспонируя после каждой итерации, мы в итоге создаем один угол шаблона.
Затем мы можем использовать команды отражения 05AB1E.
источник
Mathematica,
158164 байтаМатематически вычисляет правильный символ в координатах (i, j), где оба бегут от -n до n. Человек отформатирован:
источник
PHP, 166 байт
Гольф больше, чем 100 байтов от моего первого подхода, и это все еще самый длинный ответ здесь.
сломать
ungolfed
источник
Perl 5 , 150 байт
Попробуйте онлайн!
источник
Haskell , 110 байт
Попробуйте онлайн!
Объяснение / Ungolfed
Вспомогательная функция
g
принимает символ и список строк, затем предварительно и добавляет этот символ к каждой строке:Затем оператор
(!)
берет функцию (g
), число (n
) и символ (c
). Затем он вычисляет вывод дляn-1
, применяетg
к нему функцию и добавляет строку одинаковой ширины, состоящую изc
s, в начало и конец:Теперь мы готовы рекурсивно сгенерировать выходные данные. Сначала нам нужно охватить базовый случай:
И тогда рекурсия:
источник
J 37 байт
TIO
источник
Stax , 22 байта
Запустите и отладьте его
Распакованный, размазанный и прокомментированный, это выглядит так.
Запустите этот
источник