Atölye › 15 Bulmacası › 18/27. adım

Hangi tahtalar çözülür?

Ne yapıyoruz

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
}
```

Ne işe yarıyor

Sıra sende

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

Tüm adımlar

  1. Tek listede bir tahta
  2. Tuval ve kalem
  3. Masayı boya
  4. Çizen bir fonksiyon
  5. Satır ve sütun
  6. Her kare nerede
  7. Bir taş çiz
  8. Taşın üstündeki sayı
  9. Bütün taşlar
  10. Tekrar tekrar çiz
  11. N'den çözülmüş tahta
  12. Komşular
  13. Taş kaydır
  14. Taşa tıkla
  15. Ok tuşları
  16. Hamleleri say
  17. Gerçek kaydırmalarla karıştır
  18. Hangi tahtalar çözülür?
  19. Çözüldü mü?
  20. Kaymayı hatırla
  21. Kareleri say
  22. Akıcı kayma
  23. Çözüldü!
  24. Kazandığını göster
  25. Yeniden oyna
  26. Kırılacak bir rekor
  27. Kendin yap: bir süre sayacı