Bu projede basit sudoku bulmacaları için programatik bir çözüm üreteceğiz. Yukarıda kod yazım videosunu izleyebilir ve kodlara buradan erişebilirsiniz.
Bitwise operatörler nedir nasıl kullanılır bunu biraz anlatayım önce. MDN dokümanlarında gayet açıklayıcı anlatılmış. Bu operatörler kullanıldığı elemanların ikilik tabanda değerleri ile uygun işlemi yaparak yeni bir değer döndürür. Birkaç küçük örnek verip devam edelim.
// 9 ikili tabanda 1001 // 2 ikili tabanda 0010 // | VEYA operatörü her iki sayının da aynı basamağı 0 ise 0 // diğer ihtimallerde 1 basar console.log(9 | 2); // 11 ikili 1011 // & VE operatörü her iki sayının da aynı basamağı 1 ise 1 // diğer ihtimallerde 0 basar console.log(9 & 2); // 0 // ^ XOR operatörü her iki sayının da aynı basamağı farklı ise 1 // diğer ihtimallerde 0 basar console.log(9 ^ 2); // 11
HTML dosyamızı açıp her zamanki gibi basitçe CSS ve Javascript dosyalarımızı ekliyoruz. CSS kısmında karmaşık bir durum yok.
Javascript dosyamızda da sudokuSolver
adında bir değişkene objemizi atıyoruz. Sudoku 81 hücreden oluşan bir oyun. Her hücre için bir input
elementi koyup bu elementleri doldurup çöz butonu ile çözümü yine bu inputlara yansıtacağız.
solve
fonksiyonumuzda kayıtlı numaraları aldığımız bir değişken ve satır, sütun, 9×9’luk karelerin değerlerini tuttuğumuz değişkenleri tanımlıyoruz. Hücrelerdeki sayılarımızı satır, sütun, karelere eklerken 2’nin kuvvetini alıp | operatörü ile eklemesini yapıyoruz. Çünkü ikili tabanda her bir basamağın bir sayımıza denk gelmesini istiyoruz.
findNumber
fonksiyonunu kendini ya da false döndürecek şekilde (recursive) çağırarak çözümü aramaya başlıyoruz. Bu fonksiyon başlangıcında bir kontrol yapıp kendini döndürme sayısına bir limit koyuyoruz. Sonrasında iç içe bir döngü ile her koordinattaki boş hücreler için olasılıkları & operatörü ile kontrol ediyoruz. Eğer olasılıklarımızın olduğu dizi (possibilities) içinde sadece bir eleman varsa bu hücre için değerimizi bulmuş oluyoruz. Gerekli değişkenleri güncelleyip findNumber
fonksiyonunu döndürüyoruz. TRUE dönene kadar bu işlem devam ediyor ve çözüm bulunmuş oluyor.
Bu işlemler yalnızca basit sudoku bulmacalarında doğru cevap verecektir. Karmaşık metotlar gerektiren sudokular için önereceği çözüm doğru olmayabilir.
Bir cevap yazın