Стратегія Y-Wing для судоку


11

Нещодавно я отримав нову програму судоку, яка виробляє дуже важкі судоку, які неможливо вирішити за допомогою стандартних стратегій. Тому мені довелося вивчити кілька нових. Однією з таких стратегій є стратегія 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] # -||-

Чи можуть кілька наборів на одному вході бути абсолютно однаковими?
Оптимізатор

@Optimizer Так, наприклад, у 8-му тестовому випадку 7 8- це кандидати для першої та другої комірок. Стратегія Y-Wing все ще може бути застосована.
Якубе

@Jakube ах добре, не бачив цього.
Оптимізатор

Якщо можливо більше 1 рішення, чи можу я вивести будь-яке з них?
Оптимізатор

Так, я уточнив це у питанні.
Якубе

Відповіді:


3

CJam, 90 байт

Так, це занадто довго через обмеження, що в інших 3 осередках має бути лише 2 кандидати.

l~_:_(a+2/::&_{,}$2>:&:Y;{:PY&Y{P1<}?~}%:X,3>1${,}$W=_,2>\Y&,1?*{X:_(+2/{~:I=}#)_2$=I-t}&p

Це очікує введення у вигляді списку у форматі CJam. Наприклад:

[[2 6] [3 6] [3 7] [6 7]]

дає вихід у форматі списку CJam у форматі списку:

[[2] [3 6] [3 7] [6 7]]

Додамо пояснення, як тільки я закінчу гольф ..

Спробуйте в Інтернеті тут або спробуйте весь тестовий набір тут .


3

Математика, 124 110 байт

Cases[e@n_:>n]/@(Plus@@e/@#&/@#/.NestList[RotateLeft/@#&,{x:a_+b_,y:b_+c_,z:c_+a_,w:a_+_.}->{x,y,z,w-a+1},3])&

Приклади:

In[1]:= yWing = Cases[e@n_:>n]/@(Plus@@e/@#&/@#/.NestList[RotateLeft/@#&,{x:a_+b_,y:b_+c_,z:c_+a_,w:a_+_.}->{x,y,z,w-a+1},3])& ;

In[2]:= yWing[{{3, 7}, {6, 7}, {2, 6}, {3, 6}}]

Out[2]= {{3, 7}, {6, 7}, {2}, {3, 6}}

In[3]:= yWing[{{4, 7}, {7, 8}, {4, 8}, {4}}]

Out[3]= {{4, 7}, {7, 8}, {4, 8}, {}}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.