แก้ปริศนา Hitori


21

บทนำ

เขียนตัวแก้ปริศนาHitoriโดยใช้ไบต์น้อยที่สุด

ท้าทาย

งานของคุณคือเขียนตัวแก้สำหรับ Hitori (ひとりคำสำหรับ "คนเดียว" ในภาษาญี่ปุ่นความหมายของชื่อเกมคือ "ตรรกะให้ฉันอยู่คนเดียว") ปริศนาตรรกะ กฎมีดังนี้:

  • คุณจะได้รับตาราง n-by-n ของเซลล์แต่ละเซลล์มีจำนวนเต็มระหว่าง 1 ถึง n (รวม)
  • เป้าหมายของคุณคือเพื่อให้แน่ใจว่าไม่มีตัวเลขปรากฏมากกว่าหนึ่งครั้งในแต่ละแถวและแต่ละคอลัมน์ของตารางโดยลบตัวเลขออกจากกริดที่กำหนดโดยขึ้นอยู่กับข้อ จำกัด ที่ระบุในกฎสองข้อถัดไป
  • คุณไม่สามารถลบตัวเลขสองตัวออกจากเซลล์ที่อยู่ติดกัน (แนวนอนหรือแนวตั้ง) สองเซลล์
  • เซลล์ที่มีหมายเลขที่เหลือจะต้องเชื่อมต่อกัน หมายความว่าเซลล์ที่มีตัวเลขสองเซลล์ใด ๆ ที่เหลือสามารถเชื่อมต่อกับเส้นโค้งที่ประกอบด้วยส่วนที่เชื่อมต่อกับจำนวนที่เหลืออยู่ติดกันเท่านั้น (แนวนอนหรือแนวตั้ง) (ขอบคุณที่ @ user202729 สำหรับการชี้ให้เห็นว่าสิ่งนี้หายไป)

ฉันหวังว่ากฎระเบียบจะชัดเจนในตอนนี้ ถ้ามีอะไรที่ไม่ชัดเจนเกี่ยวกับหลักเกณฑ์การตรวจสอบหน้าวิกิพีเดีย

กรณีทดสอบ

เซลล์ที่มีการลบตัวเลขจะถูกแสดงด้วย 0s

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 

กรณีทดสอบเหล่านี้นำมาจากConcept Is Puzzles , PuzzleBooks , Concept Is Puzzles , WikipediaและYoutubeตามลำดับ

รายละเอียด

  • ไม่จำเป็นต้องกังวลเกี่ยวกับการจัดการข้อยกเว้น

  • คุณสามารถสันนิษฐานได้ว่าการป้อนข้อมูลเป็นปริศนาที่ถูกต้องเสมอด้วยโซลูชันที่ไม่ซ้ำกันและคุณสามารถใช้ประโยชน์จากสิ่งนี้ในการเขียนรหัสของคุณ

  • นี่คือจำนวนไบต์ต่ำสุดชนะ

  • 4 <= n <= 9 (16 เดิมเปลี่ยนเป็น 9 ตามคำแนะนำของ Stewie Griffin และบันทึกปัญหาบางอย่างใน IO)

  • คุณสามารถรับอินพุตและให้เอาต์พุตผ่านรูปแบบมาตรฐานและคุณสามารถเลือกรูปแบบได้ฟรี

  • คำแนะนำสำหรับรูปแบบผลลัพธ์บางอย่างคือ (แต่คุณไม่ได้ถูก จำกัด ในสิ่งเหล่านี้)

    • การแสดงผลกริดสุดท้าย
    • เอาท์พุทกริดที่มีหมายเลขที่ถูกลบทั้งหมด
    • ส่งออกรายการพิกัดหนึ่งในด้านบน
  • ตามปกติช่องโหว่เริ่มต้นจะมีผลที่นี่


เกี่ยวข้อง (ได้รับแรงบันดาลใจจากความท้าทายนี้): ตรวจสอบว่าองค์ประกอบทั้งหมดในเมทริกซ์เชื่อมต่อกันหรือไม่

ความท้าทายครั้งสุดท้ายของฉัน: ส่วนขยายของเกมแห่งสามัคคี


2
ฉันขอแนะนำให้คุณต้องรันไทม์ที่กำหนดหรือต้องการให้กรณีทดสอบที่ใหญ่ที่สุดสามารถแก้ไขได้ในไม่เกิน 1 นาที (หรืออาจจะมาก / น้อย) นอกจากนี้คุณพูดแต่กรณีทดสอบที่ใหญ่ที่สุดสำหรับ4 <= n <= 16 n=9ผมขอแนะนำให้คุณทั้งสองแสดงความกรณีทดสอบหรือพูดn=16 4 <= n <= 9เป็นการท้าทายที่ดีตามทาง :)
Stewie Griffin

1
@StewieGriffin วิธีการเกี่ยวกับความท้าทายของอัลกอริทึมที่เร็วที่สุดแยกต่างหากได้อย่างไร
Jonathan Allan

@StewieGriffin พยายามเพิ่ม 16x16 แต่ยังไม่พร้อม เปลี่ยนเป็น 9 แล้ว
Weijun Zhou

@JonathanAllan ตามที่คุณต้องการ
Weijun Zhou

เรื่อง "ฉันตัดสินใจที่จะทำการเปลี่ยนแปลงเพื่อดูว่ามันจะดีกว่า": มันจะแย่ลงอย่างแน่นอน นอกจากนี้คุณไม่ควรเปลี่ยนความท้าทายที่โพสต์แล้ว
user202729

คำตอบ:


3

Haskell , 374 ไบต์

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])]

ลองออนไลน์!


ขอขอบคุณ. ที่น่าประทับใจมาก. โดยส่วนตัวผมเป็นมือใหม่ แต่ก็เป็นแฟนตัวยงของ Haskell ด้วย
Weijun Zhou


1
ด้านบนเป็นตัวละครมากเกินไปที่จะแสดงความคิดเห็น มันเป็นเพียงการลบช่องว่างบางส่วน
H.PWiz


2

APL (Dyalog Unicode) , 133 ไบต์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}

ลองออนไลน์!

การใช้กฎ # 4 ของฉัน (เซลล์ต้องเป็นส่วนประกอบเดียวที่เชื่อมต่อ) ค่อนข้างสิ้นเปลือง แต่ก็ยังผ่านการทดสอบทั้งหมดในเวลาประมาณ 10 วินาทีใน TIO


อัลกอริทึมโดยรวม: เก็บเมทริกแบบบูลีนสองเซลล์bและwเซลล์ที่แน่นอนจะเป็นขาวดำตามลำดับ กำหนดค่าเริ่มต้นbให้เป็นศูนย์ทั้งหมด เริ่มต้นwเป็น 1 เฉพาะสำหรับเซลล์เหล่านั้นที่มีเพื่อนบ้านที่ตรงข้ามกัน

ทำซ้ำจนกว่าbและwปักหลัก:

  • เพิ่มไปยังbเซลล์ที่อยู่ในบรรทัดเดียวกัน (แนวนอนหรือแนวตั้ง) และมีค่าเท่ากับเซลล์ในw

  • เพิ่มไปwยังเพื่อนบ้านทันทีของทุกเซลล์ในb

  • เพิ่มไปยังจุดตัดwทั้งหมด - เซลล์ที่การลบจะแยกกราฟของเซลล์ที่ไม่ใช่สีดำออกเป็นหลายองค์ประกอบที่เชื่อมต่อ

สุดท้ายเอาท์พุทnot(b)คูณด้วยเมทริกซ์ดั้งเดิม


ขอบคุณมากสำหรับความสนใจและคำอธิบายของคุณ ฉันคิดว่าสิ่งที่คุณอธิบายยังเป็นอัลกอริทึมทั่วไปที่ใช้หากมีใครแก้ปริศนาด้วยมือ
Weijun Zhou

1
พูดตามตรงฉันไม่เคยแม้แต่จะพยายามแก้ไข Hitori ด้วยมือ ฉันได้รับเคล็ดลับเหล่านี้จาก Wikipediaและฉันก็ไม่มีข้อพิสูจน์ว่าอัลกอริทึมจะรวมเข้ากับโซลูชัน (ไม่ซ้ำกัน) ได้ตลอดเวลา
ngn

2

เยลลี่ 62 ไบต์

ใช้ลิงก์ monadic isConnected ของ user202729จากคำถามอื่น


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

โปรแกรมเต็มรูปแบบการพิมพ์รายการของรายการ
ทำงานโดยใช้กำลังดุร้ายและไร้ประสิทธิภาพ

ลองออนไลน์! - ขนาด 3 คูณ 3 เนื่องจากมันไม่มีประสิทธิภาพเกินกว่าที่จะเรียกใช้แม้แต่ขนาด 4 ภายในขีด จำกัด TIO 60 วินาที!

อย่างไร?

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

NIce เป็นการเริ่มต้น ขอขอบคุณ. ฉันจะดู.
Weijun Zhou

คุณลืมกฎข้อที่ 4 (เชื่อมต่อแล้ว)
202729

(ขอให้โชคดีกับการนำ BFS / DFS / DSU ไปใช้ในเยลลี่)
user202729

โอ้ ... จะลบเมื่ออยู่ที่คอมพิวเตอร์ ขอบคุณ
Jonathan Allan

ใช่ฉันไม่คิดว่ามันเป็นไปได้ในการพูด <60 ไบต์ของเยลลี่ไม่ต้องพูด <100 ...
Erik the Outgolfer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.