15 bulmacanın çözülebilir olup olmadığını kontrol edin


9

On beş yapboz , olası düzenleme durumlarının sadece yarısının çözülebilir olması bakımından tuhaftır. 14 ve 15 döşemeleri çevirirseniz, blokları geri çevirebilmeniz için kaydırmazsınız.

Göreviniz seçtiğiniz bir tamsayı listesini (0 ile 15 arasındaki sayıların her birinin tam olarak bir örneğini içeren, 0 boş alan olacak şekilde) kabul eden bir program oluşturmaktır. 4x4 ızgarasıdır ve ızgaranın çözülebilir olup olmadığını belirleyen tek bir boolean değeri verir.

Herhangi bir dilde bunu yapmak için en kısa kod kazanır.


İyi soru :)
Cruncher

Bu soruyu soracaktım, ama keyfi bir kenar uzunluğu vardı; ama bu meydan okumaya çok az şey katıyor.
Jonathan Allan

Yanıtlar:


0

Jöle , 9 bayt

Œc>/€;TSḂ

Sol-sağ ve sağ-sol arasında değişen satır-büyüklüğünde okunan tam sayıların bir listesini kabul eden 0, çözülebilir ve 1değilse (bu ¬kodu kodun sağına çevirmek için) verir.

Çevrimiçi deneyin! (bu örnek, 12'nin yerine kayması gereken bir tahtadır)

Nasıl?

John Dvorak'ın cevabına benzer şekilde, pariteleri hesaplıyor ve dama tahtası paritesini basitleştirmek için yılan benzeri bir giriş sırası kullanıyoruz, ancak parite eşitliğini kontrol etmek yerine sipariş dışı sayımı sıfır olmayan endekslerle topluyoruz ve bunun garip:

Œc>/€;TSḂ - Link: list of integers
Œc        - unordered pairs
    €     - for each:
   /      -   reduce with:
  >       -     greater than?
      T   - truthy indices (i.e. [1..16] without 1-indexed index of 0)
     ;    - concatenate
       S  - sum
        Ḃ - is odd?

4

J, 28 karakter

((C.!.2=_1^i.&0)&.".&.stdin''

Giriş sırası satır-büyüktür ve satırlar tablo boyunca tek bir yolda dönüşümlü olarak soldan sağa ve sağdan sola okunur. Sıfırın sol üst köşeye ait olduğunu varsayar.

Windows üzerinde kullanım:

<nul set /p="0 1 2 3 7 6 5 4 8 9 10 11 15 14 13 12" | jconsole c:\...\15.jhs

Açıklama:

  • <nul set /p=girişte yeni bir satır olmasını önlemek için kullanılır echo, bu ".da bunu beğenmez. Elbette Unix destekliyor echo /n.
  • v&.".&.stdin''"stdin altında ayrıştırma altında v" girişini okur, sonra girişi ayrıştırır, sonra v'yi yapar, sonra ayrıştırmayı geri alır (= format), sonra girişi geri alır (= çıktı) ". 1!:1]3bir karakter daha kısadır, ancak tanımlanmış bir tersi yoktur.
  • C.!.2"permütasyon paritesi" anlamına gelir. Ya 1(çift parite) ya da _1(tek parite) döndürür . Yani,_1^inversions
  • _1^i.&0 "-1 indeksinin gücüne -1" anlamına gelir.
  • dolayısıyla, C.!.2=_1^i.&0"permütasyon paritesi delik pozisyon paritesine eşit mi?"

Bu bir 4x4 kartı için işe yarar, ancak istenen son konum soldan sağa satır-büyükse, çözülmüş konumun permütasyonu tek sayıda inversiyona ve dolayısıyla garip pariteye sahiptir. Ayrıca, istenen delik konumu sol üstten sağa doğru hareket ettiğinde eşlik (herhangi bir giriş sırası için) ters çevrilir. Her iki durumda da düzeltme bir karakterdir: beklenen pariteyi tersine çevirmek için -after =.

Doğruluk kanıtı:

Her hareketten sonra sıfır, permütasyon paritesini çevirerek bir sayı ile bir konum değiştirir. Sıfır ayrıca giriş sıralamasında tek ve çift konumlarla gösterilen beyaz ve siyah dama tahtası konumları arasında değişir. Bu nedenle, bu durum gereklidir. Sayma argümanı ile de yeterlidir: pozisyonların tam yarısının çözülebilir olduğu yaygın bir bilgidir. Bu koşul olası konumların tam yarısını filtreler.


"Sıfır aynı zamanda tek ve çift konumlar arasında değişir" dediğinde: +1, -1, +4 veya -4 ile değişmez mi? Kontrol edilen bir desenin ihtiyacınız olan rengi verdiğini düşünüyorum, ancak daha doğru bir şekilde tarif edilebilir.
Peter Taylor

@PeterTaylor haklısın; afedersiniz. Düzenlemem geçerli bir düzeltme olarak sayılıyor mu?
John Dvorak

Düzenlemenizin tamamen ayrı bir sorunu ele aldığını düşünüyorum. Alıntıladığım bit son paragrafta.
Peter Taylor

"Tek ve çift pozisyonlar arasında" daha çok "bir satranç tahtasındaki siyah ve beyaz kareler arasında" gibidir.
Joe Z.
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.