Це код гольфу. Переможець - дійсний код з найменшою кількістю байтів.
Виклик
Давши входи M і N , ширину і висоту прямокутної сітки квадратів, вивести багатокутник, який задовольняє наступному:
- Краї багатокутника складаються лише з квадратних ребер: діагональних ребер немає - всі вертикальні або горизонтальні.
- У полігоні немає дірок: кожен квадрат поза полігоном може бути досягнутий ортогональними кроками на квадратах поза полігоном, починаючи з квадрата поза полігоном на зовнішній межі прямокутника.
- Багатокутник не має самоперетину: з квадратних ребер, що зустрічаються у вершині, не більше 2 може бути частиною периметра многокутника.
- Полігон з’єднаний: будь-який квадрат у полігоні повинен бути доступний до будь-якого іншого квадрата в полігоні через ортогональні сходи, що знаходяться в межах багатокутника.
- Багатокутник має максимально можливий периметр: відповідно до наведеної нижче формули.
Ваш код повинен працювати для M і N від 1 до 255.
Формула для максимального периметра
Завдання тут - пошук найбільш гольфуючих із цих полігонів з максимальним периметром. Самий максимальний периметр завжди визначається формулою:
Це вірно, оскільки для максимального периметра кожна квадратна вершина повинна бути по периметру. Для непарної кількості вершин це неможливо, і найкраще, що можна досягти, - це одна вершина менше (оскільки периметр завжди парний).
Вихідні дані
Виведіть фігуру у вигляді рядка розділених символами нового рядка ( N рядків саме M символів). Тут я використовую простір для квадратів поза полігоном, а "#" - квадрати всередині полігону, але ви можете використовувати будь-які два візуально відмінних символи, за умови, що їх значення відповідає всім введенням.
Ви можете включати до однієї провідної нової та до однієї зворотної.
Якщо ви хочете, ви можете замість виведення M рядки рівно N символів, і ви можете вибрати M на N виходом для деяких входів і N по M виходом для інших.
Приклади
Недійсний через отвір:
###
# #
###
Недійсний через перехрестя (дотик по діагоналі - вершина з 4 квадратними краями по периметру) і, до речі, отвір:
##
# #
###
Недійсний через відключення:
#
# #
#
Дійсний багатокутник максимального периметра:
# #
# #
###
Кредити
Я спочатку недооцінював, як швидко можна було обчислити значення максимального периметра, і збирався просто просити це значення як вихід. Завдяки чудово корисним людям у чаті за пояснення, як розробити максимальний периметр для довільних N та M та допомогти перетворити це на виклик, який триватиме не одну відповідь ...
Зокрема завдяки:
Sparr , Zgarb , feersum , jimmy23013 .