Напишите самую короткую возможную программу, которая принимает набор различных положительных целых чисел и выводит рендеринг ASCII концентрических шестиугольников с длинами сторон, состоящими из косых черт, подчеркиваний, пробелов и новых строк.
Самая короткая программа в байтах по подсчету https://mothereff.in/byte-counter выигрывает.
Примеры
(Они выглядят лучше с меньшим межстрочным интервалом.)
Если на вход 1
выводится шестигранник с длиной стороны 1:
__
/ \
\__/
Обратите внимание, что два подчеркивания используются для верхней и нижней части шестиугольника, поэтому он лучше пропорционален.
Как правило, шестигранник размера N содержит N косых черт с каждой угловой стороны и 2 * N подчеркивания сверху и снизу.
Если на входе 1 2
вывод, то должны быть концентрические шестиугольники с длиной сторон 1 и 2:
____
/ __ \
/ / \ \
\ \__/ /
\____/
Если на входе 1 3
вывод, должен быть:
______
/ \
/ __ \
/ / \ \
\ \__/ /
\ /
\______/
Если на входе 1 3 2
вывод, должен быть:
______
/ ____ \
/ / __ \ \
/ / / \ \ \
\ \ \__/ / /
\ \____/ /
\______/
и т.п.
Правила ввода / вывода
Входные данные должны поступать либо из командной строки, либо из stdin, но могут быть в любом удобном для вас формате.
Например, вы могли бы дать каждому номер в качестве аргумента командной строки: > myprogram 1 3 2
или вы могли бы подсказать пользователю ввести число в качестве преформатированного списка: [1, 3, 2]
.
Вывод должен идти в стандартный вывод или ближайший эквивалент вашего языка.
Дополнительные правила
- Входными данными всегда будет набор различных положительных целых чисел, необязательно в любом порядке .
- Выход должен ...
- не содержит никаких символов кроме
/\ _
и новых строк. - не должно быть пробелов или лишних пробелов.
- не содержит посторонних начальных переносов, но может иметь один дополнительный завершающий перенос.
- не содержит никаких символов кроме
- Если ничего не введено, то ничего не выводится (кроме, возможно, одной новой строки).
- Если это поможет, вы можете предположить, что входные целые числа меньше 2 16 .
1
самому внутреннему или внешнему шестиугольнику?1
(или любое число) относится к шестиугольнику с длиной стороны 1. (с оговоркой, что 1 косая черта = 2 подчеркивает.) Так1
что всегда будет относиться к внутреннему шестиугольнику.Ответы:
CJam,
148116109 байтЭто заняло намного больше времени, чем я ожидал. Первоначально я просто хотел итеративно построить верхний левый квадрант, как в задачах с бриллиантами, а затем получить остальное от зеркалирования. Но я не заметил, что подчеркивания не подчиняются зеркальной симметрии между верхней и нижней половиной. Поэтому мне пришлось переделывать большую часть этого, генерировать правую половину итеративно, а затем отражать только один раз (слева).
Проверьте это здесь.
Пример Фибоначчи:
Объяснение:
Как указано выше, я начинаю с итеративного построения правой половины. То есть, изначально у меня есть только один пробел в сетке, а затем для каждого возможного кольца я либо окружаю существующую сетку пробелами, либо новым полукруглым.
После этого я зеркально отображаю каждую строку влево и дополняю ее начальными пробелами для правильного выравнивания. Вот разбивка кода:
источник
Питон -
251, 240, 239228Альтернативный подход (251):
источник
APL (222 байта в UTF-8)
(и 133 символа)
Так как этот вопрос специально запрашивает количество байтов в представлении UTF8, мне пришлось на самом деле немного раскрутить его, чтобы он был длиннее, но его представление в UTF8 короче. (В частности, символ оператора коммутирования
⍨
составляет три байта, а()
только два, так что оптимизация больше не работает, а также делает назначение очень дорогим.)Предыдущая версия, которая короче в символах (124), но использует больше байтов при представлении в UTF-8 (230, что поставило бы ее на второе место):
Тестовое задание:
источник
Perl 5, 352 (349 байт + 3 для
anE
флагов)Вероятно, это может быть гораздо больше ..
Ungolfed:
Пример (
1 5 3 14
):источник
C # -
388316 байтРедактировать: Изменено, как избежать печати пробелов и добавлено несколько LINQ
Простая программа, которая принимает аргументы командной строки. Он перебирает все возможные символы в каждой строке прямоугольника, определенного максимальным размером шестиугольника, и добавляет его к текущей строке, прежде чем обрезать строки и печатать их последовательно (он создает необязательный конечный символ новой строки).
Гольф-код:
Код Ungolfed:
источник
APL (Dyalog Classic) , 151 байт (93 с классической кодировкой APL)
Попробуйте онлайн!
источник