Ваша задача: получить целое число n
, сгенерировать шаблон встроенного шестиугольника, следуя приведенным ниже правилам, на n-ю глубину.
Встроенный шестиугольник имеет базовую форму: ( n=0
)
__
/ \
\__/
Встроенные шестиугольники n=1
и n=2
:
____
/ \ \
/\__/ \
\ /
\____/
________
/ \ \ \
/\__/ \ \
/\ / \
/ \____/ \
\ /
\ /
\ /
\________/
Длина каждой стороны в 2 раза больше длины той же стороны в предыдущей глубине, умноженной на два. Верхняя и нижняя стороны имеют длину 2 символа, n=0
а остальные начинаются с 1 символа. Не верхняя нижняя сторона должна быть 2^n
длинной ( OEIS: A000079 ), а верхняя и нижняя стороны должны соответствовать правилу 2^(n+1)
(то же самое OEIS).
Текущие шестиугольники имеют индекс 0, вы можете использовать индекс 1, если хотите.
Это код-гольф , поэтому выигрывает самый короткий ответ!
code-golf
ascii-art
hexagonal-grid
Товарищ Спаркл Пони
источник
источник
n
?Ответы:
Древесный уголь ,
4029 байтБлагодаря байту @Neil удалось сэкономить 11 байт, изменив цикл while на цикл for среди других приемов.
Попробуйте онлайн!
Объяснение (устарело)
Эта программа начинается с генерации самого большого шестиугольника, а затем делает меньшие по одному в цикле while (с 1 индексированием). Для справки,
α
это номер входа,β
является переменной , которая содержит2^(α-1)
иι
является итерация переменной в цикле.источник
×_X²ι
это то же самое×__β
, и еще несколько байтов, преобразовав вашW
в aF
, что также избавляет от необходимости хранить входной номер. Попробуйте онлайн! ,Haskell ,
230217207 байтРЕДАКТИРОВАТЬ:
#
может быть простоmax
.zipWith
иp
может быть объединено в?
оператор, и это я (как-то!) Переопределилreplicate
.m
принимаетInteger
и возвращаетString
.Попробуйте онлайн!
Как это устроено
m
это основная функция. Он использует&
для генерации шестиугольников с правильной подкладкой, а затем складывает их вместе сo
.l&t
генерирует маленький шестиугольник с длиной стороныt
, дополненный большим шестигранникомl
, в виде спискаString
строк.a
это верхняя линия шестиугольника с подчеркиванием.b
список других строк в верхней половине шестиугольника. Линииb
центрированы в отступе, который является прямоугольным; это позволяет следующему шагу работать.a
накладная на вершинуb
сo
, а затем обратным порядком (как линии и в пределах каждой строки).c
принимает два аргумента, список длин и строку, и генерирует строку, у которой столько копий каждого символа в оригинале, сколько и соответствующей длины, напримерc[1,3,2]"abc" == "abbbcc"
. Он используется&
для генерации линий.o
принимает два аргумента, представляющих изображения в виде списков строк, и накладывает первый, меньший, поверх второго.?
дважды, чтобы дополнить первое изображение бесконечным количеством пробелов как вниз, так и вправо, а затем сжать вместе соответствующие символыmax
, что выбирает непробельный символ, если таковой имеется.(f?e)l m
дополняет списокl
, добавляя бесконечное количество элементов 'e', затем архивирует результирующий список и списокm
с помощьюf
функции.источник
(#)
может бытьmax
.p
чтобы сохранить байт:o=max?' '?"";f?e=z f.(++repeat e)
. Может быть короче бессмысленно.(\n->(<$[1..n]))
естьreplicate
.replicate
? Теперь это просто стыдно. Я просто слишком привык<$[1..n]
или[1..n]>>
почти всегда побеждаю. Однако я не вижу, как сократить?
дальше. Я уже пытался сделатьp
pointfree, и++
он просто не в том месте, взрывая вещиflip
.JavaScript (ES6), 258 байт
Объяснение: Для шестиугольников после первого, предыдущий шестиугольник сначала создается и дополняется с каждой стороны (это зависит от того, является ли выход прямоугольником). (Для первого заголовка создается несколько фиктивных отступов.) Создаются верхняя и верхняя стороны шестиугольника, а все пробелы объединяются с предыдущим шестиугольником. (Есть некоторая хитрость, чтобы заставить шестиугольники выстраиваться в линию; это было бы легче, если бы были допущены дополнительные поля.) Нижние стороны шестиугольника генерируются аналогично верхним сторонам, а затем заполняется нижняя часть шестиугольника. Необходимо соблюдать осторожность, чтобы возвращать прямоугольный вывод, включая завершающий перевод строки, для рекурсии в работу.
источник
/
s популярны в искусстве ASCII, и этотreplace
метод является относительно дешевым способом их генерации в JavaScript.1<<n>>1
: Хорошая симметрия ;-)v
но, к сожалению,1
она не симметрична ни в одном из моих обычных шрифтов.PHP, 337 байт
0 Индексирование
Попробуйте онлайн!
расширенный
источник