Дом Деда Мороза
Примечание. Это первая задача, которую я попытался задать. Это было через Песочницу, однако, если вы обнаружите, что с ней что-то не так, пожалуйста, не просто понижайте голос, а оставляйте комментарий, чтобы я мог улучшить его.
Фон
Существует старая детская головоломка, в которой задача состоит в том, чтобы нарисовать коробку с крышей и крестиком через середину, не поднимая ручку из бумаги и не пересекая любую линию дважды.
В Германии это известно как "дас Haus Des Nikolaus" или "Дом Санта-Клауса". Я, честно говоря, не могу вспомнить, как мы это называли. Для тех, кто не знаком с загадкой, полная информация доступна здесь .
Вот ASCII художественное представление дома.
/\
/__\
|\/|
|/\|
----
Вызов
Напишите программу или функцию, чтобы нарисовать дом Санта-Клауса на любом языке по вашему выбору.
Звучит слишком просто? Ну вот и подвох. Также необходимо вывести каждый этап розыгрыша и соответствовать правилам головоломки. Ваша программа не обязана принимать какие-либо данные. Готовый дом должен выглядеть точно так, как показано выше.
Согласно вышеуказанному сайту существует 44 возможных решения. Вы можете использовать любой из них. Это художественная задача ASCII, поэтому вам не нужно вычислять решение, а только рисовать его.
Выход
Пример требуемого вывода из одного из 44 решений показан ниже:
----
\
\
----
__
\
\
----
\
__\
\
\
----
/\
/__\
\
\
----
/\
/__\
|\
| \
----
/\
/__\
|\/
|/\
----
/\
/__\
|\/|
|/\|
----
правила
- Я добавил 1 дополнительный символ новой строки между каждым ожидаемым выводом, чтобы попытаться прояснить требования. Это необязательно. Допускается любое количество пустых строк между каждым выводом.
- Ваш вывод должен состоять только из символов /, \, -, _ и пробела, как показано выше. Промежуточные пробелы разрешены.
- Каждая линия на вашем чертеже должна продолжаться с конца предыдущей строки, и вы не можете повторять какую-либо линию.
- Стандартные лазейки запрещены.
- Вы не обязаны выводить рифму, упомянутую в приведенной выше ссылке.
- Это код гольф, поэтому самый короткий ответ в байтах будет победителем.
Результат
Некоторые отличные ответы и спасибо и уважение всем, кто написал. Я сказал наименьшее количество байтов, но я отметил как лучший ответ не только за это, но и за отличное объяснение кода. Хороший один @ Деннис.
Ответы:
Желе ,
403936 байтПопробуйте онлайн!
Как это устроено
является биективным основанием-буквал 250; каждый символ соответствует своей кодовой точке на кодовой странице желе . Результатом является целое число 13192938935880491074 .
преобразует сгенерированное целое число в биективное основание 9, получая массив целых чисел
[9, 6, 7, 9, 6, 2, 2, 7, 1, 5, 3, 8, 1, 3, 5, 8, 4, 4, 4, 4] . Целые числа соответствуют порядку штриха, за исключением 9 , которое указывает пробел.
заключает сгенерированный массив в одноэлементный массив, который потребуется для добавления его к массиву, который мы сейчас сгенерируем.
работает следующим образом.
¤
объединяет две ссылки слева в ниладическую цепочку. Первый,“|_/-\/\|‘
дает кодовые точки указанных символов, приводя к [124, 95, 47, 45, 92, 47, 92, 124] . ЗатемĖ
перечисляет кодовые точки, получая[[1, 124], [2, 95], [3, 47], [4, 45], [5, 92], [6, 47], [7, 92] , [8, 124]] . Пара [n, c] означает, что n- й штрих будет символом ASCII с кодовой точкой c .
объединяет сгенерированные массивы. Результатом является массив
[[9,6,7,9,6,2,2,7,1,5,3,8,1,3,5,8,4,4,4,4], [1,124 ], [2,95], [3,47], [4,45], [5,92], [6,47], [7,92], [8,124]] .
выполняет кумулятивное (т. е. показывает все промежуточные шаги) уменьшение с использованием транслитерации (
y
) с замененными аргументами (@
). На первом этапе, например, мы заменяем каждую 1 в исходном массиве на 124 , что является кодовой точкой символа | ,выравнивает результат и заменяет все кодовые точки соответствующими символами ASCII. На всех этапах это создаст некоторые непечатаемые символы с кодовыми точками от 1 до 9 .
принимает символьный максимум с пробелом, заменяя все непечатаемые символы пробелами.
разбивает сгенерированную строку на куски длиной четыре и объединяет их с переводом строки в качестве разделителя.
источник
Javascript (ES6),
119116969291 байтисточник
Пакет,
356344341337 байтГлупые|
правила пакетного цитирования ... если вы хотите использовать a|
в переменной, вам нужно заключить его в кавычки с тремя^
s, поэтому@
вместо него дешевле использовать его и заменять при выводе, хотя для достижения этого я должен начать с левой стены. Первая строка имеет завершающий пробел.echo(
используется потомуr
, что переменныеc
, и,f
могут быть пустыми, и мы не хотимECHO is off.
печатать.Редактировать: Сохранено 12 байтов с использованием сквозного для последней части. Сохраняя 3 байта, используя
for
цикл для печати каждой части, это означает, что я теперь использую|
s в своих переменных, что делает код немного легче для чтения. Сохранено 4 байта с использованием явных@
символов вместо@echo off
. Я думаю, что начиная с левой стены все еще требуется меньше байтов.источник
echo:
является более стандартным, ноecho(
похоже, что вы злоупотребляете языковой функцией, так что +1.echo:
терпит неудачу в некоторых неясных крайних случаях, но я не знаю ни одного случая отказа дляecho(
.foo.bat
в текущем каталоге,echo(\..\foo.bat
echos,\..\foo.bat
ноecho:\..\foo.bat
выполняетсяfoo.bat
.echo:.\foo.bat
будет иметь такой эффект вместо этого. Это из-за сбоя в стеке каталогов, где «UP» из корневого каталога является текущим каталогом?C 118 байт
источник
char*p
(без пробела) и изменить'B'
и'J'
на их коды ASCII./// , 112 байт
Попробуйте онлайн!
источник
PHP,
9895 байтвдохновленный решением Арно
Примечание: первая строка кода имеет завершающий пробел.
источник
PHP с GD,
348338 байт (не конкурирует)не совсем то, что просили, но ...
сохранить в файл, позвонить в браузер
сломать
Чтобы нарисовать больший дом, измените
$w=9
желаемую ширину.источник