Marching Squares - алгоритм з комп'ютерної графіки, який використовується для відновлення 2D ізоконт з сітки зразків (див. Також його старший брат Marching Cubes для 3D-налаштувань). Ідея полягає в тому, щоб обробити кожну клітинку сітки незалежно та визначити контури, що проходять через неї, на основі значень у її кутах.
Перший крок у цьому процесі - визначити, які краї з'єднані контурами, виходячи з того, чи кути вище або нижче значення контуру. Для простоти ми розглянемо лише контури вздовж значення 0
, такі, що нас цікавить, чи кути позитивні чи негативні. Існують випадки, які можна розрізнити:24 = 16
Джерело зображення: Вікіпедія
Ідентифікація білого та чорного тут насправді не має значення, але для певності скажіть, що білий колір є позитивним, а чорний - негативним. Ми будемо ігнорувати випадки, коли один із кутів точно 0
.
Точки сідла (випадки 5 та 10) створюють трохи додаткових труднощів: не ясно, які діагоналі слід використовувати, лише дивлячись на кути. Це можна вирішити, знайшовши середнє значення чотирьох кутів (тобто наближення до центрального значення) та вибравши діагоналі такі, що контури відокремлюють центр від кутів із протилежним знаком. Якщо середнє значення точно 0
, може бути обраний будь-який випадок.
Зазвичай ці 16 випадків просто зберігаються в таблиці пошуку. Це чудово для ефективності, але, звичайно, ми вважаємо за краще, щоб код тут був коротким . Отже, ваше завдання - виконати цей крок пошуку та надрукувати ASCII-представлення справи у якомога меншому коді.
Змагання
Значення чотирьох кутів (ненульових цілих чисел) вам задано у встановленому вами порядку. Потім слід генерувати правильне розташування контурів, правильно розв’язуючи випадки точки сідла.
Ви можете написати програму або функцію, взявши введення через STDIN (або найближчу альтернативу), аргумент командного рядка або аргумент функції та вивівши результат через STDOUT (або найближчу альтернативу), значення повернення функції або параметр функції (out).
Введення даних може здійснюватися у будь-якому зручному форматі рядка чи списку.
16 випадків будуть представлені в мистецтві ASCII, використовуючи один з наступних блоків 5x5:
o---o o---o o---o
| | | | | | |
| | |---| | | |
| | | | | | |
o---o o---o o---o
o---o o---o o---o o---o
|/ | | \| | | | |
| | | | | | | |
| | | | |\ | | /|
o---o o---o o---o o---o
o---o o---o
|/ | | \|
| | | |
| /| |\ |
o---o o---o
Ви не повинні друкувати жодної провідної чи кінцевої пробілів, але ви можете надрукувати один додатковий новий рядок.
Це кодовий гольф, тому найкоротша відповідь (у байтах) виграє.
Випробування
У тестових випадках передбачається, що введення подається в порядку ліворуч , зверху праворуч , знизу вліво , знизу праворуч . Тестові приклади представлені в 9 групах, по одному відповідає кожному з 9 поданих вище подань (у тому ж порядку, починаючи з порожньої комірки, закінчуючи двома точками сідла).
[1, 2, 1, 3]
[-9, -2, -2, -7]
[4, 5, -1, -2]
[-1, -2, 3, 4]
[7, -7, 7, -7]
[-5, 5, -5, 5]
[1, -6, -4, -1]
[-2, 3, 3, 4]
[-1, 6, -4, -1]
[2, -3, 3, 4]
[-1, -6, 4, -1]
[2, 3, -3, 4]
[-1, -6, -4, 1]
[2, 3, 3, -4]
[3, -8, -9, 2]
[-3, 8, 9, -2]
[8, -3, -2, 9]
[-8, 3, 2, -9]
Крім того, наступні тестові випадки можуть повернути будь-яку з точок сідла (на ваш вибір):
[1, -4, -2, 5]
[-1, 4, 2, -5]