Sudoku için Y-Wing Stratejisi


11

Son zamanlarda, standart stratejiler kullanılarak çözülemeyen gerçekten zor Sudoku'nun üreten yeni bir Sudoku uygulamasına sahibim. Bu yüzden birkaç yenisini öğrenmek zorunda kaldım. Bu stratejilerden biri Y-Kanat Stratejisidir . "Zor Stratejiler" altındadır, ama aslında o kadar da zor değildir.

Misal

Bu strateji için sadece 4 hücre önemlidir. Bu yüzden görüntülerdeki diğer tüm hücreleri görmezden geldim.

Her hücre için tüm adaylara bakıyoruz. Aşağıdaki örnekte adaylarla bir hücremiz var 3 7(bu , adayları zaten reddettiğimiz anlamına geliyor 1 2 4 5 6 8 9, örneğin 1, aynı satırda bir 2, aynı 3x3 kutusunda bir, ...), adaylarla bir hücre 6 7, adaylar 3 6ile bir hücre ve adaylar ile bir hücre 2 6. Y-Wing stratejisi 6, düpedüz hücrenin adaylarından çıkarılabileceğini, sadece 2doldurabileceğiniz bir aday olarak bırakılacağını önerecektir . Bu yüzden doğru bir sayı bulduk ve tüm Sudoku'yu çözmede bir adım daha yakınız.

İlk Örnek

Neden 6kaldırılabilir?

açıklama

Diyelim ki 6düpedüz hücre için doğru sayı. Şimdi 6bu sütunda bir var, bu yüzden 6sağ üst hücrenin adaylarından kaldırabiliriz, sadece 7doldurabileceğimiz bir a bırakabiliriz. Aynı şey sol sol hücre ile olur. 'İ kaldırabilir 6ve doldurabiliriz 3. Şimdi sol üst hücreye bakarsak bir çelişki yaşarız. Şimdi zaten var çünkü 7aynı satırda ve bir 3Kaldırabileceğimiz böylece, aynı sütunda 7ve 3tüm hiçbir aday bırakarak adayların. Bu açıkça mümkün değil. Bu nedenle 6 doğru dümen hücresinin doğru sayısı olamaz.

Daha kesin olarak: Adaylarla [A B] [A C] [C D] [B C](bu sırayla veya dairesel olarak döndürülmüş) 4 hücremiz varsa ve hücreler bir daireye (aynı satır, aynı sütun veya aynı 3x3 kutu ile) bağlanırsa (Hücre 1, Hücre 2'ye bağlanır. Kaldırabileceğiniz daha) 1 hücre bağlanır 4 hücreye bağlanır hücre 3, bağlı Cgelen [C D]hücre. Üç hücreleri olduğu, çok önemlidir [A B], [A C]ve [B C]sadece iki aday her içerirler. Farklı [C D]olarak daha fazla veya daha az içerebilen hücre ( Dsıfır, bir veya daha fazla aday olabilir).

Rakamlar yerine harflerle örnek

Her iki şekilde de bağlanabildiklerini açıkça söyledim. Bir sonraki örnekte, tekrar uygulanan stratejiyi görebilirsiniz. Ancak bu sefer 4 hücre bir dikdörtgen oluşturmuyor. Aşağı sol ve dümdüz hücreler basitçe bağlanır, çünkü aynı 3x3 kutusundadırlar. Y-Wing, 1sol üst hücrenin adayı olarak kaldırabileceğimizi söylüyor . Bu sefer bu hücrede hala 2 aday kaldı, bu yüzden yeni bir doğru sayı bulamadık. Ancak yine de 1kutunun kaldırılması farklı stratejilere kapı açabilir.

İkinci örnek, dikdörtgende değil

Strateji hakkında daha fazla bilgi veya birkaç örnek daha istiyorsanız sudokuwiki.org adresini ziyaret edin .

Zorluk Özellikleri

Hücrelerin adaylarını temsil eden giriş olarak 4 liste alacaksınız. Dört hücre bir daire gibi bağlanır (Hücre 1, Hücre 1'e bağlı olan Hücre 4'e bağlı olan Hücre 3'e bağlı olan Hücre 2'ye bağlanır). Her listenin artan sırada sıralandığını varsayabilirsiniz.

İşiniz bir adayı (Y-Wing stratejisini uygulayarak) kaldırmak ve elde edilen aday listelerini aynı sırayla döndürmektir. Stratejiyi uygulayamıyorsanız, aynı aday listelerini döndürmeniz yeterlidir.

İki olası çözüm varsa (B hücresinin A'sını veya D hücresinin C'sini çıkarabilirsiniz), yalnızca bir çözüm döndürün. Hangisinin önemi yok.

Giriş, herhangi bir yerel liste veya dizi biçiminde olabilir. Ayrıca bir liste listesi veya benzer bir şey kullanabilirsiniz. Girişi STDIN, komut satırı argümanı, komut istemi veya işlev argümanı ile alabilir ve çıktıyı dönüş değeriyle veya sadece STDOUT'a yazdırarak döndürebilirsiniz.

Bu kod golfü. En kısa kod (bayt cinsinden) kazanır.

Test Durumları

[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] # -||-

Tek bir girişteki çoklu setler tamamen aynı olabilir mi?
Doktor

@Optimizer Evet, örneğin 8. test durumunda, 7 8birinci ve ikinci hücre adaylarıdır. Y-Wing stratejisi hala uygulanabilir.
Jakube

@ Jakube ah tamam, görmedim.
Doktor

Birden fazla çözüm mümkünse, bunlardan herhangi birini çıktı alabilir miyim?
Doktor

Evet, soruda netleştirdim.
Jakube

Yanıtlar:


3

CJam, 90 bayt

Ugghhh, bu diğer 3 hücrenin sadece 2 adayının olması gerektiği için çok uzun.

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

Bu, girdiyi CJam biçiminde bir liste listesi olarak bekler. Örneğin:

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

CJam liste biçiminde çıktı verir:

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

Golf bittiğinde açıklama ekleyeceğim ..

Buradan çevrimiçi deneyin veya tüm test paketini buradan deneyin .


3

Mathematica, 124110 bayt

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])&

Örnekler:

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}, {}}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.