Hitori Bulmacaları Çözme


21

Giriş

En az bayt kullanan Hitori bulmacaları için bir çözücü yazın .

Meydan okuma

Senin görevin Hitori için bir çözücü yazmak (for と り, Japonca "yalnız" kelimesi; oyun adının anlamı "beni yalnız bırak" dır) mantıksal bulmacalar. Kurallar aşağıdaki gibidir:

  • Sizlere bir n-by hücre ızgarası sunulur, her hücre 1 ile n arasında bir tamsayı içerir (dahil).
  • Amacınız, bir sonraki iki kuralda belirtilen kısıtlamaya tabi olarak verilen ızgaradan sayıları kaldırarak, her satırda ve ızgaradaki her sütunda birden fazla sayı görünmemesini sağlamak,
  • İki sayıyı iki bitişik (yatay veya dikey) hücreden çıkaramazsınız.
  • Kalan numaralı hücrelerin hepsi birbirine bağlanmalıdır. Bu, kalan iki numaralı hücrenin, yalnızca bitişik kalan sayıları (yatay veya dikey) birleştiren bölümlerden oluşan bir eğriye bağlanabileceği anlamına gelir. (Bunun eksik olduğunu gösterdiği için @ user202729'a teşekkür ederiz)

Umarım kurallar şimdiye kadar açıktır. Kurallarla ilgili net olmayan bir şey varsa, Wikipedia sayfasını kontrol edin .

Test Kılıfları

Sayıların çıkartıldığı hücreler 0 ile temsil edilir.

Input  ->  Output

4
2 2 2 4      0 2 0 4
1 4 2 3  ->  1 4 2 3
2 3 2 1      2 3 0 1
3 4 1 2      3 0 1 2

4
4 2 4 3      0 2 4 3
4 1 1 2  ->  4 1 0 2
3 1 2 1      3 0 2 1
4 3 1 3      0 3 1 0

5
1 5 3 1 2      1 5 3 0 2
5 4 1 3 4      5 0 1 3 4
3 4 3 1 5  ->  3 4 0 1 5
4 4 2 3 3      4 0 2 0 3
2 1 5 4 4      2 1 5 4 0

8
4 8 1 6 3 2 5 7      0 8 0 6 3 2 0 7
3 6 7 2 1 6 5 4      3 6 7 2 1 0 5 4
2 3 4 8 2 8 6 1      0 3 4 0 2 8 6 1
4 1 6 5 7 7 3 5  ->  4 1 0 5 7 0 3 0
7 2 3 1 8 5 1 2      7 0 3 0 8 5 1 2
3 5 6 7 3 1 8 4      0 5 6 7 0 1 8 0
6 4 2 3 5 4 7 8      6 0 2 3 5 4 7 8
8 7 1 4 2 3 5 6      8 7 1 4 0 3 0 6

9
8 6 5 6 8 1 2 2 9      8 0 5 6 0 1 2 0 9
5 6 2 4 1 7 9 8 3      5 6 2 4 1 7 9 8 3
5 8 2 5 9 9 8 2 6      0 8 0 5 0 9 0 2 0
9 5 6 6 4 3 8 4 1      9 5 6 0 4 3 8 0 1
1 1 6 3 9 9 5 6 2  ->  0 1 0 3 9 0 5 6 2
1 1 4 7 3 8 3 8 6      1 0 4 7 0 8 3 0 6
3 7 4 1 2 6 4 5 5      3 7 0 1 2 6 4 5 0
3 3 1 9 8 7 7 4 5      0 3 1 9 8 0 7 4 5
2 9 7 5 3 5 9 1 3      2 9 7 0 3 5 0 1 0 

Bu test vakaları sırasıyla Concept Is Puzzles , PuzzleBooks , Concept Is Puzzles , Wikipedia ve Youtube'dan alınmıştır .

gözlük

  • İstisna işleme konusunda endişelenmenize gerek yok.

  • Sen edebilirsiniz girişi her zaman sahip geçerli bir bulmaca olduğunu varsayalım eşsiz çözüm ve size kod yazarken bu yararlanabilir.

  • Bu , en düşük bayt sayısı kazanır.

  • 4 <= n <= 9 (Stewie Griffin'in önerisini takiben aslen 16, 9 olarak değiştirildi, ayrıca IO’da da biraz sorun çıkardı)

  • Herhangi bir standart form aracılığıyla girdi alabilir ve çıktı alabilirsiniz ve formatı seçmekte özgürsünüz.

  • Çıktı formatı için bazı öneriler: (ancak bunlarla sınırlı değilsiniz)

    • Son kılavuzun çıktısı
    • Kaldırılan tüm sayıları içeren ızgara çıktısı
    • Yukarıdakilerden birinin koordinatlarının listesini çıkar.
  • Her zamanki gibi burada varsayılan boşluklar geçerlidir.


İlgili (bu zorluğa ilham veren): Bir Matristeki Tüm Öğelerin Bağlantılı olup olmadığını kontrol edin

Son meydan okumam: Yedilerin Oyununun Uzatılması


2
Deterministik çalışma zamanına veya en büyük test durumunun 1 dakikadan (veya belki daha fazla / daha az) çözülmesine ihtiyaç duymanızı öneririm. Ayrıca, diyorsunuz 4 <= n <= 16, ama en büyük test durumu n=9. Size bir n=16test davası göndermenizi ya da söylemenizi öneririm 4 <= n <= 9. Bu arada güzel bir meydan okuma :)
Stewie Griffin,

1
@StewieGriffin, ayrı bir en hızlı algoritma mücadelesine ne dersiniz?
Jonathan Allan,

@StewieGriffin 16x16 eklemeye çalıştı ama henüz tam olarak hazır değil. Şimdi 9 olarak değiştirildi.
Weijun Zhou,

@ JonathanAllan Dilediğiniz gibi.
Weijun Zhou,

Re "Daha iyi olacağını görmek için bir değişiklik yapmaya karar verdim": Kesinlikle daha kötü olurdu. Ayrıca daha önce yayınlanmış bir mücadeleyi değiştirmemelisiniz.
user202729

Yanıtlar:


3

Haskell , 374 bayt

import Data.Array;import Data.List;r=range;p=partition
c(e,f)=p(\(b,p)->any(==1)[(b-d)^2+(p-q)^2|(d,q)<-e])f
n#g=[s|(o,(e:f))<-[p((==0).(g!))$indices g],
 null.fst$c(o,o),null.snd$until(null.fst)c([e],f),
 s<-case[((l,c),d)|((l,c),h)<-assocs g,h>0,
 d<-[filter((==h).(g!))$r((l,c+1),(l,n))++r((l+1,c),(n,c))],d/=[]]
 of[]->[g];((c,d):_)->n#(g//[(c,0)])++n#(g//[(c,0)|c<-d])]

Çevrimiçi deneyin!


Teşekkür ederim. Çok etkileyici. Şahsen ben acemi ama aynı zamanda Haskell'in büyük bir hayranıyım.
Weijun Zhou,


1
Yukarıdakiler çok fazla karakterdi ve yanlarında bir yorum bıraktı. Sadece bazı boşlukları kaldırıyor
H.PWiz


2

APL (Dyalog Unicode) , 133 bayt SBCS

{q←{⊢/4 2⍴⍵}⌺3 3g←⍵=⊂∪,⍵⋄⍵×~1⊃{((⌈/q b)⌈b<{2<≢∪0,,(⍵×⊢⌈⌈/∘q)⍣≡⍵×(⍴⍵)⍴1+⍳≢,⍵}¨~b∘⌈¨⊂⍤2∘.≡⍨⍳⍴b)(+/↑w<g×⌈.⌈⍨w×g)⌈w b←⍵}⍣≡×\(⌈/=∘⌽⍨q⍵)0}

Çevrimiçi deneyin!

4. kural uygulamam (hücreler birbirine bağlı bir bileşen oluşturmalıdır) oldukça israf edicidir, ancak yine de bu, TIO'da yaklaşık 10 saniye içinde tüm testleri geçmektedir.


Genel algoritma: İki boolean matrisi bve wsırasıyla siyah ve beyaz olduğu kesin olan hücreler için saklayın. bSıfır olarak başlat . wKarşılık gelen komşuları olan hücreler için yalnızca 1 olarak ilklendirin .

Kadar tekrarlayın bve wsakinleşin:

  • baynı çizgideki (yatay veya dikey) ve içindeki bir hücreyle aynı değerde olan hücrelere eklew

  • wiçindeki tüm hücrelerin acil komşularına ekleyinb

  • wtüm kesme noktalarına ekle - kaldırılması siyah olmayan hücrelerin grafiğini bağlı birden fazla bileşene bölen hücreler

Son olarak, çıktı not(b)orijinal matris ile çarpıldı.


İlginiz ve açıklamanız için çok teşekkür ederim. Açıkladığınız şey aynı zamanda bulmacayı elle çözmek için kullanılan tipik bir algoritma olduğunu düşünüyorum.
Weijun Zhou,

1
Dürüst olmak gerekirse, Hitori'yi elle çözmeyi hiç denemedim. Bu hileleri Wikipedia'dan aldım ve algoritmanın her zaman (benzersiz) çözüme kadar yaklaştığına dair bir kanıtım yok.
ngn

2

Jöle , 62 bayt

Kullanımları user202729 en IsConnected monadic bağlantı başka bir soru dan.


FJṁa@µ«Ḋoµ€ZUµ4¡ÐLFQL<3
ḟ0ĠḊ€
¬T€œ&2\;Ç€FȦ
ZÇȯÇ_1Ŀ
2ḶṗLṗLa⁸ÇÞḢ

Listelerin bir listesini gösteren tam program.
Kaba kuvvetle çalışır ve aptalca verimsizdir.

Çevrimiçi deneyin! - 3'e 3, çünkü 60 saniyelik TIO limiti dahilinde bir beden 4'ü bile çalıştırmak yetersiz!

Nasıl?

FJṁa@µ«Ḋoµ€ZUµ4¡ÐLFQL<3 - Link 1 isConnected? List of lists
...                     - 1 if connected 0 if not -- see linked answer in the header

ḟ0ĠḊ€ - Link 2, helperFor-AnyRepeatedValues: list
ḟ0    - filter out zeros
  Ġ   - group indices by value (i.e. [[indices of min],...,[indices of max]]
   Ḋ€ - dequeue €ach -- leaving a list of empty lists iff no repeated values
      -                 any remaining values are non-zero (1-based indexing in Jelly)

¬T€œ&2\;Ç€FȦ - Link 3, columnwiseAnyAdjacentZerosOrRowwiseAnyRepeatedValues: list of lists
¬            - logical not (convert all zeros to ones and all others to zeros)
 T€          - for €ach row get a list of truthy indexes (i.e. indexes of original zeros)
     2\      - pairwise reduction (i.e. for neighbouring rows) with:
   œ&        -   intersection (empty if no columnwise adjacent original zeros
             -                 any remaining values are non-zero due to 1-based indexing)
        Ç€   - call last link (1) as a monad for €ach row
       ;     - concatenate
          F  - flatten into a single list (empty iff no columnwise adjacent original zeros
             -                                   AND no rowwise repeated values)
           Ȧ - any and all (0 if empty [or contains any zero -- never] else 1)

ZÇȯÇ_1Ŀ - Link 4, validity check? list of lists
Z       - transpose
 Ç      - call last link (2) as a monad rowwiseAnyAdjacentZerosOrColumnwiseAnyRepeatedValues?
   Ç    - call last link (2) as a monad columnwiseAnyAdjacentZerosOrRowwiseAnyRepeatedValues?
  ȯ     - logical OR
     1Ŀ - call link 1 as a monad (isConnected?)
    _   - subtract
        - this yields -1 for valid, while it yields 0 or 1 if not.

2ḶṗLṗLa⁸ÇÞḢ - Main link: list of lists
2Ḷ          - lowered range of 2 -> [0,1]
   L        - length (number of rows in the input)
  ṗ         - Cartesian power (all lists of zeros and ones of length L)
     L      - length (number of rows in the input again)
    ṗ       - Cartesian power (all grids of zeros and ones of same shape as the input)
       ⁸    - the input
      a     - logical AND -- effectively uses each of the formed grids as a mask
         Þ  - sort by:
        Ç   -   last link (3) as a monad
          Ḣ - head
            - implicit print

Bir başlangıç ​​olarak güzel. Teşekkür ederim. Bir bakacağım.
Weijun Zhou,

4. kuralı unuttun. (bağlı)
kullanıcı202729


Oh ... bilgisayardayken silinecek. Teşekkürler.
Jonathan Allan,

evet, bu mümkün de, diyelim ki, <Jelly 60 byte, demek değildir <100 ... sanmıyorum
Outgolfer Erik
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.