Время пюре!
Это часть № 5 моей серии «Случайный гольф дня» и серии ASCII Art of the Day от Оптимизатора . Ваша заявка (и) в этом конкурсе будет учитываться в обеих таблицах лидеров (которые вы можете найти связанные сообщения). Конечно, вы можете относиться к этому, как к любому другому вызову для игры в гольф, и отвечать на него, не беспокоясь ни об одной из этих серий.
Отверстие 5: алмазные плитки
Обычный шестиугольник всегда можно облицовать бриллиантами так:
Мы будем использовать ASCII художественное представление этих элементов. Для шестиугольника с длиной стороны 2 существует 20 таких углов:
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
/\_\_\ /\_\_\ /\_\_\ /\_\_\ /_/\_\ /_/\_\ /\_\_\ /_/\_\ /_/\_\ /_/\_\
/\/\_\_\ /\/_/\_\ /\/_/_/\ /\/_/\_\ /\_\/\_\ /\_\/_/\ /\/_/_/\ /\_\/\_\ /\_\/_/\ /_/\/\_\
\/\/_/_/ \/\_\/_/ \/\_\_\/ \/_/\/_/ \/\_\/_/ \/\_\_\/ \/_/\_\/ \/_/\/_/ \/_/\_\/ \_\/\/_/
\/_/_/ \/_/_/ \/_/_/ \_\/_/ \/_/_/ \/_/_/ \_\/_/ \_\/_/ \_\/_/ \_\/_/
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
/_/_/\ /\_\_\ /_/\_\ /_/_/\ /_/\_\ /_/\_\ /_/_/\ /_/_/\ /_/_/\ /_/_/\
/\_\_\/\ /\/_/_/\ /_/\/_/\ /\_\_\/\ /\_\/_/\ /_/\/_/\ /_/\_\/\ /\_\_\/\ /_/\_\/\ /_/_/\/\
\/\_\_\/ \/_/_/\/ \_\/\_\/ \/_/\_\/ \/_/_/\/ \_\/_/\/ \_\/\_\/ \/_/_/\/ \_\/_/\/ \_\_\/\/
\/_/_/ \_\_\/ \_\/_/ \_\/_/ \_\_\/ \_\_\/ \_\/_/ \_\_\/ \_\_\/ \_\_\/
Учитывая длину стороны N
, вы должны сгенерировать такой тайлинг для шестиугольника длины стороны N
наугад. Точное распределение не имеет значения, но каждый лист должен быть возвращен с ненулевой вероятностью.
Например N ≤ 4
, ваша заявка должна составить мозаику в течение 1 минуты, по крайней мере, в 80% случаев, и, по крайней мере, 80% плитки должны быть получены в течение 1 минуты. Большинству подходов не нужно беспокоиться об этом правиле (оно очень мягкое) - это просто исключение очень наивных алгоритмов, основанных на отклонении, которые генерируют произвольные строки, пока один из них не окажется мозаичным.
Возможно, вы хотели бы знать, что общее количество возможных значений мозаичности для данного N можно найти в OEIS A008793 .
Вы можете написать полную программу или функцию и получить ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции и произвести вывод через STDOUT (или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out).
Вы не должны выводить больше начальных пробелов, чем необходимо для выравнивания шестиугольника (то есть в левом углу шестиугольника не должно быть пробелов перед ним). Каждая строка может содержать до N
конечных пробелов (не обязательно последовательно, например, вы можете иметь прямоугольный вывод, печатая ограничивающий прямоугольник шестиугольника).
Это код гольф, поэтому выигрывает самое короткое представление (в байтах). И, конечно же, самая короткая заявка на пользователя также войдет в общую таблицу лидеров серии.
Leaderboards
Первый пост каждой серии генерирует таблицу лидеров.
Чтобы убедиться, что ваши ответы отображаются, начните каждый ответ с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(Язык в настоящее время не отображается, но фрагмент требует и анализирует его, и я могу добавить таблицу лидеров по языкам в будущем.)
For N ≤ 4, your submission must produce a tiling within 1 minute at least 80% of the time.
слишком просто: 80% времени то же самое, базовый тайлинг, в противном случае я нахожу другой тайлинг в любоеОтветы:
CJam, 105 байт
Добавлена новая строка, чтобы избежать прокрутки. Попробуйте онлайн
Объяснение:
Это решение начинает каждую строку в виде зигзага, а затем помещает на нее подчеркивание N на основе их положения в предыдущей строке и нескольких правил. Я получил это из серии наблюдений, глядя на результат в виде простой двумерной матрицы символов:
/\
в верхней половине,\/
в нижней половине)/_/
может изменяться только на -1 или 0 и\_\
может изменяться только на 0 или 1"_ "
шаблон или" _"
шаблон, оба хорошоПоэтому я решил реализовать его, сохранив предыдущие позиции подчеркивания, изменив их со случайным множителем (2 варианта для каждого подчеркивания) и повторяя до тех пор, пока не будут соблюдены правила. В процессе оптимизации я переключился на подчеркивание относительно левой стороны шестиугольника (не включая пробелы).
Старая «3D» версия, 189 байт:
Попробуйте онлайн
источник
Python 2,
337335324318311300296 байтИдея состоит в том, чтобы сначала создать шестиугольник из бриллиантов, например так:
А затем заполните его нисходящими путями подчеркивания, например так:
Окончательный результат со всеми добавленными путями будет выглядеть примерно так:
Довольно много кода делается для того, чтобы эти пути не выходили за пределы и не пересекались друг с другом.
Негольфированный код:
источник
randint(0,1)*(p<n*3+i*2-j)
доrandint(0,p<n*3+i*2-j)
.Perl,
174 168 166161Попробуй меня .
источник
JavaScript ( ES6 ), 376
416 494Просто чтобы быть там ...
Это построить все плитки, а затем выбрать случайный. Время 232848 тиллингов для N = 4 составляет ~ 45 секунд на моем ноутбуке. Я не пробовал N = 5.
Будучи EcmaScript 6, он работает только на Firefox.
источник
dom.max_script_run_time
. Это глобальное предпочтение в about: config, мой установлен на 30.SmileBASIC, 241 байт
Сильно основано на ответе Мэтти
источник