Javascript’te Bitwise Operatörleri Kullanarak Sudoku Çözme

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.


Yayımlandı

kategorisi

yazarı:

Etiketler:

Yorumlar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir