Atölye › 15 Bulmacası › 18/27. adım
Neden kart gibi karıştırmadık? Çünkü bu bulmacanın bütün dizilişlerinin yarısı ne yaparsan yap çözülemez. 1880'lerde bir bulmacacı, sadece 14 ile 15'in yeri değişmiş tahtayı düzeltene büyük bir ödül vaat etti; kimse kazanamadı, çünkü imkânsız.
Bir kural onları ayırır. Ters çift (inversion): tahtayı satır satır okurken büyük sayının küçükten önce geldiği her çift. 4×4 tahta için:
çözülebilir <=> ters çiftler + (boşluğun alttan sayılan satırı, 1'den başlayarak) tek sayı
Her kaydırma bu toplamın tek/çift oluşunu korur; kuralı bozan bir tahta çözülmüş tahtaya asla ulaşamaz. solvable
fonksiyonu bunu hesaplayacak; karıştırmamızın sözünü tuttuğunu kontrol edeceğiz.
```js
// A position can be solved when the number of pairs out of order, plus the gap's row counted from the bottom, is odd.
function solvable(list) {
const numbers = list.filter((t) => t !== 0)
let inversions = 0
for (let a = 0; a < numbers.length; a++) {
for (let b = a + 1; b < numbers.length; b++) if (numbers[a] > numbers[b]) inversions++
}
const gapRowFromBottom = N - rowOf(list.indexOf(0))
return (inversions + gapRowFromBottom) % 2 === 1
}
```list.filter((t) => t !== 0) → boşluk hariç sayılar.let inversions = 0 → ters çift sayacı.a her sayıyı seçer; içteki b ondan sonra gelen her sayıyı (b = a + 1'den
başlar). Böylece her çift bir kez karşılaştırılır.if (numbers[a] > numbers[b]) inversions++ → önce gelen daha büyükse ters çift: sayacı 1 artır (++).N - rowOf(list.indexOf(0)) → boşluğun alttan sayılan satırı: en alt satır 1, en üst 4.(...) % 2 === 1 → 2'ye bölümden kalan 1 mi, yani tek sayı mı? Sonuç true ya da false.function reset() { satırının üstüne yorum satırını ve solvable fonksiyonunu yaz; arada bir boş satır kalsın.
Çalıştır. Ekran değişmez; kontroller kuralı ünlü 14-15 tahtasında deniyor.
Beceriler: Döngüler
← Gerçek kaydırmalarla karıştır Çözüldü mü? →