В сегодняшнем эпизоде AAOD мы собираемся построить китайский храм различной высоты.
Рассмотрим следующие примеры для height ( N
) 1
для6
N = 1
:
.
|
. ]#[ .
\_______/
. ]###[ .
\__]#.-.#[__/
|___| |___|
|___|_|___|
####/_\####
|___|
/_____\
N = 2
:
.
|
. ]#[ .
\_______/
. ]###[ .
\___________/
. ]#####[ .
\___]#.---.#[___/
|__|_| |_|__|
|__|_|___|_|__|
#####/___\#####
|_____|
/_______\
N = 3
:
.
|
. ]#[ .
\_______/
. ]###[ .
\___________/
. ]#####[ .
\_______________/
. ]#######[ .
\____]#.-----.#[____/
|__|__| |__|__|
|__|__|_____|__|__|
######/_____\######
|_______|
/_________\
N = 4
:
.
|
. ]#[ .
\_______/
. ]###[ .
\___________/
. ]#####[ .
\_______________/
. ]#######[ .
\___________________/
. ]#########[ .
\_____]##.-----.##[_____/
|__|__|_| |_|__|__|
|__|__|_|_____|_|__|__|
########/_____\########
|_______|
/_________\
N = 5
:
.
|
. ]#[ .
\_______/
. ]###[ .
\___________/
. ]#####[ .
\_______________/
. ]#######[ .
\___________________/
. ]#########[ .
\_______________________/
. ]###########[ .
\______]###.-----.###[______/
|__|__|___| |___|__|__|
|__|__|___|_____|___|__|__|
##########/_____\##########
|_______|
/_________\
N = 6
:
.
|
. ]#[ .
\_______/
. ]###[ .
\___________/
. ]#####[ .
\_______________/
. ]#######[ .
\___________________/
. ]#########[ .
\_______________________/
. ]###########[ .
\___________________________/
. ]#############[ .
\_______]####.-----.####[_______/
|__|__|__|__| |__|__|__|__|
|__|__|__|__|_____|__|__|__|__|
############/_____\############
|_______|
/_________\
и так далее.
Детали конструкции
Я уверен, что большинство деталей о шаблоне ясны. Вот некоторые более мелкие детали:
- Дверь в нижней части храма может иметь минимальную
1
_
ширину и максимальную5
_
ширину. - Всегда будет два
.
над столбами вокруг двери (два вертикальных|
). - Лестница начинается с той же ширины, что и дверь, и увеличивается, как показано на схеме.
- Эти
]##..##[
блоки над каждым уровнем крыши увеличиваются в размерах2
от верхней части к нижней части . - Эти
\__...__/
уровни крыши увеличиваются в размерах4
от верхней части к нижней части . - Блоки стен вокруг двери должны как минимум содержать
1
_
и как максимум3
_
между ними|
. Приоритет отдается блокам наружной стены, поэтому ближайший к двери блок имеет различный размер для каждого уровня. - Пространство между
.
и]
(или[
) заполнено#
в крыше прямо над дверями.
Детали вызова
- Напишите функцию или полную программу, которая читает положительное целое число больше, чем
0
через STDIN / ARGV / аргумент функции или ближайший эквивалент, и выводит (в STDOUT или ближайший эквивалент)N
китайский храм - Трейлинг новой строки не является обязательным.
- Не должно быть либо пробелов в конце, либо пробелов, достаточных для заполнения вывода в минимальном ограничивающем прямоугольнике.
- Не должно быть никаких начальных пробелов, которые не являются частью шаблона.
Leaderboard
Первый пост серии генерирует таблицу лидеров.
Чтобы убедиться, что ваши ответы отображаются, начните каждый ответ с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
N=1
корпусе? Почему бы не 3 и иметь меньшие боковые окна, как вN=2
случае?N=1
случае, не является ли первая крыша слишком длинной (широкой)?#
рядом с ней не было бы никакой.
опоры]
и[
над ней. О начальном размере крыши - это размер крыши в верхней крыше каждой высоты.Ответы:
CJam, 200 байт
Добавлены новые строки, чтобы избежать прокрутки. Попробуйте онлайн
Краткое объяснение:
Программа строит левую половину храма (включая середину), затем переворачивает его и заменяет некоторые символы, чтобы получить правую половину. Последовательность из n пробелов представляется как число ~ n (побитовое «не») во время построения и заменяется фактическими пробелами в конце.
Программа начинается с двух верхних строк, затем для каждого уровня крыши добавляются все предыдущие строки с двумя пробелами и добавляется новая крыша (2 строки). Последняя крыша модифицирована, чтобы добавить часть «над дверью».
Затем строится верхняя стена, повторяя «| __» и обрезая до нужной длины, после чего следует фиксированный «_ |» и пробелы. Затем стена дублируется, а дверные пространства заменяются подчеркиванием. Наконец, нижняя часть строится построчно.
источник
Perl,
332 316294Попробуй меня .
С, 371
Попробуй меня .
JavaScript, 365
Выше можно перевести почти 1 к 1 в JavaScript:
Использование:
источник
s
. Если, конечно, вы не выделите это динамически.Python 2,
356352347344 байтаЭто в основном строит храм построчно. Функция
p
печатает строку с пробелами, необходимыми для ее центрирования.Я использовал python 2 для сохранения большого количества байтов, потому что объект карты python 3 не срабатывает. Я думаю, я всегда должен играть в гольф на питоне 2 , просто экономит еще несколько байтов (даже если просто не нужно анализировать входные данные для int). Хе-хе, это не похоже на кодекс для игры в гольф.
Изменить: и, конечно, мне больше не нужна карта ...
Вот код в негольфированной форме:
источник
print(B*(5+2*n-len(s)//2)+s)
вprint B*(5+2*n-len(s)/2)+s
(удалить скобки и перейти//
в/
).print B*(5+2*n-len(s)/2)+s
наprint(5+2*n-len(s)/2)*B+s
, вы можете удалить пробел послеprint
.JavaScript ( ES6 ), 440
Редактировать Исправлена ошибка перемычки
Функция с высотой в качестве параметра, вывод на консоль.
Использование строки шаблона много , все новые строки значимы и подсчитаны.
Запустите сниппет для тестирования в Firefox (с выводом на консоль)
Ungolfed версия для интерактивного теста:
источник
Haskell, 473 байта
источник
#
C 660 байт
Шаблон просто казался слишком нерегулярным, чтобы придумывать что-то необычное, особенно в языке без обработки строк. Итак, вот мой подход грубой силы:
Перед игрой в гольф:
Не так много, чтобы объяснить здесь. Он просто идет строка за строкой и генерирует необходимое количество каждого символа. Я пытался сохранить компактность самого кода, но он все равно складывается.
d
это ширина двери,w
ширина каждой кирпичной стены.источник
c(char*s){for(;*s;)putchar(*s++);}
==>#define c printf
;r(n,c){for(j=0;j++<n;)putchar(c);}
==>r(n,C){while(n--)putchar(C);}