Нещодавно я отримав нову програму судоку, яка виробляє дуже важкі судоку, які неможливо вирішити за допомогою стандартних стратегій. Тому мені довелося вивчити кілька нових. Однією з таких стратегій є стратегія Y-Wing . Він класифікується у розділі "Жорсткі стратегії", але насправді це не так складно.
Приклад
Для цієї стратегії важливі лише 4 клітини. Тому я ігнорував усі інші клітини на зображеннях.
Ми дивимося на всіх кандидатів у кожну клітинку. У наступному прикладі у нас є клітинка з кандидатами 3 7
(це означає, що ми вже відхилили кандидатів 1 2 4 5 6 8 9
, наприклад, тому що є 1
в тому ж рядку, а 2
в тому ж 3x3 полі, ...), комірка з кандидатами 6 7
, осередок з кандидатами 3 6
та осередок із кандидатами 2 6
. Стратегія Y-Wing передбачає, що 6
можна відсторонити кандидатів у прямому осередку, залишивши лише 2
кандидата, який ви можете заповнити. Отже, ми знайшли правильну кількість і на крок ближче до вирішення повного судоку.
Чому їх 6
можна видалити?
Пояснення
Припустимо, що 6
правильне число для прямолінійної комірки. Тепер 6
у цьому стовпці є знак , тому ми можемо видалити 6
з кандидатів верхньої правої комірки, залишивши лише a 7
, яке ми можемо заповнити. Те ж саме відбувається і з лівою нижньою коміркою. Ми можемо видалити 6
та заповнити 3
. Тепер, якщо ми подивимось на верхню ліву клітинку, ми отримаємо протиріччя. Тому що зараз вже є 7
в тій же рядку і 3
в тому ж стовпці, так що ми можемо видалити 7
і 3
кандидатів, не залишивши кандидатів на всіх. Що явно неможливо. Тому 6 не може бути правильним номером прямолінійної комірки.
Точніше: якщо у нас є 4 комірки з кандидатами [A B] [A C] [C D] [B C]
(у такому порядку або круговими поверненими) і комірки з'єднані (через той самий рядок, той самий стовпець або той самий ящик 3x3) по колу (комірка 1 з'єднана з коміркою 2, яка є підключений до Cell 3, який підключений до Cell 4, який підключений до Cell 1), ніж ви можете видалити C
з [C D]
комірки. Дуже важливо, що три клітини [A B]
, [A C]
і [B C]
містить тільки два кандидати кожних. По-різному комірка [C D]
, яка може містити більше або менше ( D
може бути нульовою, одного або навіть більше кандидатів).
Зауважте, що я прямо сказав, що їх можна пов’язати будь-яким способом. У наступному прикладі ви можете побачити стратегію, застосовану знову. Але цього разу 4 комірки не утворюють прямокутник. Ліві та прямолінійні клітини вниз просто з'єднані, оскільки вони знаходяться в одному і тому ж 3х3 полі. Y-Wing каже, що ми можемо видалити 1
кандидата в лівій верхній осередку. Цього разу в цій комірці залишилося ще 2 кандидати, тому ми не знайшли нове правильне число. Але все-таки зняття банок 1
може відкрити двері для різних стратегій.
Якщо ви хочете отримати додаткову інформацію про стратегію або хочете ще кілька прикладів, відвідайте sudokuwiki.org .
Технічні характеристики
Ви отримаєте 4 списки як вхідні дані, що представляють кандидатів комірок. Чотири комірки пов'язані подібно до кола (комірка 1 з'єднана з коміркою 2, яка з'єднана з коміркою 3, яка з’єднана з коміркою 4, яка з'єднана з коміркою 1). Можна припустити, що кожен список відсортований у порядку зростання.
Ваше завдання - видалити одного кандидата (застосовуючи стратегію Y-Wing) та повернути отримані списки кандидатів у тому ж порядку. Якщо ви не можете застосувати стратегію, просто поверніть ті самі списки кандидатів.
Якщо є два можливих рішення (ви можете видалити A комірки B або видалити C комірки D), поверніть лише один розчин. Не має значення, який саме.
Вхід може бути у будь-якому рідному списку чи форматі масиву. Ви також можете використати список списків або щось подібне. Ви можете отримати вхід через STDIN, аргумент командного рядка, аргумент підказки або аргумент функції та повернути вихід через зворотне значення або просто надрукувавши на STDOUT.
Це код-гольф. Виграє найкоротший код (у байтах).
Випробування
[3 7] [6 7] [2 6] [3 6] => [3 7] [6 7] [2] [3 6] # Example 1
[6 7] [2 6] [3 6] [3 7] => [6 7] [2] [3 6] [3 7] # Example 1, different order
[2 6] [3 6] [3 7] [6 7] => [2] [3 6] [3 7] [6 7] # Example 1, different order
[3 6] [3 7] [6 7] [2 6] => [3 6] [3 7] [6 7] [2] # Example 1, different order
[1 2 8] [1 8] [8 9] [1 9] => [2 8] [1 8] [8 9] [1 9] # Example 2
[3 8] [4 8] [3 4 8] [3 4] => [3 8] [4 8] [3 8] [3 4]
[1 3 6 7 8] [3 8] [3 4] [4 8] => [1 3 6 7] [3 8] [3 4] [4 8]
[7 8] [7 8] [4 7] [4 8] => [7 8] [8] [4 7] [4 8] or [7] [7 8] [4 7] [4 8]
[4 7] [7 8] [4 8] [4] => [4 7] [7 8] [4 8] [] # Fictional example
[3 7] [2 6] [6 7] [3 6] => [3 7] [2 6] [6 7] [3 6] # Y-Wing can't be applied here
[4 7] [2 7 8] [4 8] [1 4] => [4 7] [2 7 8] [4 8] [1 4] # -||-
7 8
- це кандидати для першої та другої комірок. Стратегія Y-Wing все ще може бути застосована.