Это код гольф. Победителем является действительный код с наименьшим количеством байтов.
Вызов
Учитывая входные данные M и N , ширину и высоту прямоугольной сетки квадратов, выведите многоугольник, который удовлетворяет следующему:
- Ребра многоугольника состоят только из квадратных ребер: диагональных ребер нет - все они вертикальные или горизонтальные.
- Многоугольник не имеет отверстий: каждый квадрат за пределами многоугольника может быть достигнут с помощью ортогональных шагов на квадратах за пределами многоугольника, начиная с квадрата за пределами многоугольника на внешней границе прямоугольника.
- Многоугольник не имеет самопересечения: из ребер квадрата, встречающихся в вершине, не более 2 может быть частью периметра многоугольника.
- Многоугольник связан: любой квадрат в многоугольнике должен быть доступен из любого другого квадрата в многоугольнике с помощью ортогональных шагов, которые остаются внутри многоугольника.
- Полигон имеет максимально возможный периметр: согласно формуле, показанной ниже.
Ваш код должен работать для M и N от 1 до 255.
Формула для максимального периметра
Задача здесь - найти наиболее пригодные для игры в гольф из тех полигонов с максимальным периметром. Максимальный периметр всегда определяется по формуле:
Это верно, потому что для максимального периметра каждая квадратная вершина должна быть по периметру. Для нечетного числа вершин это невозможно, и лучшее, что может быть достигнуто, - это на одну вершину меньше (поскольку периметр всегда четный).
Выход
Выведите форму в виде строки символов, разделенных новой строкой ( N строк ровно из M символов). Здесь я использую пространство для квадратов за пределами многоугольника и '#' для квадратов внутри многоугольника, но вы можете использовать любые два визуально отличных символа, если их значение согласовано для всех входных данных.
Вы можете включить до одной новой строки перевода и до одной новой строки.
Если вы хотите, вы можете вместо этого вывести M строк ровно из N символов, и вы можете выбрать вывод M на N для одних входов и вывод N на M для других.
Примеры
Неверно из-за дыры:
###
# #
###
Неправильно из-за пересечения (касание по диагонали - вершины с 4 квадратными ребрами по периметру) и, кстати, отверстия:
##
# #
###
Недействительно из-за отключения:
#
# #
#
Допустимый полигон с максимальным периметром:
# #
# #
###
кредиты
Сначала я недооценил, как быстро можно рассчитать значение максимального периметра, и собирался просто запросить это значение в качестве выходного. Спасибо замечательным людям в чате, которые объяснили, как определить максимальный периметр для произвольных N и M, и помогли превратить это в испытание, которое будет длиться более одного ответа ...
В частности, благодаря:
Спарр , Згарб , Ферсум , Джимми23013 .