ตรวจสอบว่าแก้ปริศนา 15 ข้อได้หรือไม่


9

ตัวต่อสิบห้าตัวนั้นมีลักษณะแปลกประหลาดเพียงครึ่งเดียวเท่านั้นที่สามารถแก้ไขได้ หากคุณพลิกกระเบื้อง 14 และ 15 ไม่มีวิธีที่คุณสามารถเลื่อนบล็อกเพื่อให้พวกเขาพลิกกลับ

งานของคุณคือการสร้างโปรแกรมที่ยอมรับรายการจำนวนเต็มในรูปแบบที่คุณเลือก (ประกอบด้วยหนึ่งอินสแตนซ์ของแต่ละหมายเลขตั้งแต่ 0 ถึง 15 โดยที่ 0 เป็นพื้นที่ว่าง) แสดงสถานะของการจัดเรียงของไพ่ใน กริด 4x4 และส่งออกค่าบูลีนเดี่ยวเพื่อพิจารณาว่ากริดสามารถแก้ไขได้หรือไม่

รหัสที่สั้นที่สุดที่จะทำในภาษาใดก็ได้ชนะ


เป็นคำถามที่ดี :)
Cruncher

ฉันจะถามคำถามนี้ แต่มีความยาวด้านโดยพลการ แต่นั่นเพิ่มความท้าทายให้น้อยมาก
Jonathan Allan

คำตอบ:


0

เยลลี่ขนาด 9 ไบต์

Œc>/€;TSḂ

Monadic Link ยอมรับรายการของจำนวนเต็มที่อ่านตามลำดับแถวหลักสลับกันระหว่างซ้ายขวาและขวาซ้ายซึ่งให้ผล0ถ้าแก้ไขได้และ1หากไม่ได้ (เพื่อกลับด้านนี้เป็นการเพิ่ม¬ทางด้านขวาของรหัส)

ลองออนไลน์! (ตัวอย่างนี้เป็นบอร์ดที่ 12 เพียงต้องการเลื่อนเข้าที่)

อย่างไร?

คล้ายกับคำตอบของ John Dvorakเราคำนวณ parities และใช้คำสั่งอินพุทเหมือนงูเพื่อทำให้ parity board-board parity ง่ายขึ้นแม้ว่าแทนที่จะตรวจสอบความเท่าเทียมกันของ parity เรารวมจำนวน out-of-order ด้วยดัชนีที่ไม่เป็นศูนย์และทดสอบว่า แปลก:

Œ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 ตัวอักษร

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

ลำดับการป้อนข้อมูลเป็นแถวหลักพร้อมแถวอ่านสลับซ้ายไปขวาและจากขวาไปซ้ายในเส้นทางเดียวทั่วตาราง ถือว่าศูนย์เป็นของมุมซ้ายบน

การใช้งานบน Windows:

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

คำอธิบาย:

  • <nul set /p=ใช้เพื่อป้องกันการขึ้นบรรทัดใหม่ในอินพุตซึ่งechoสร้างที่".ไม่ชอบ แน่นอน, Unix echo /nสนับสนุน
  • v&.".&.stdin''อ่าน "v ภายใต้การแยกวิเคราะห์ภายใต้ stdin" ความหมาย "อินพุตแล้วแยกวิเคราะห์อินพุตจากนั้นทำ v แล้วเลิกทำการแยกวิเคราะห์ (รูปแบบ =) แล้วยกเลิกการป้อนข้อมูล (= เอาต์พุต)" 1!:1]3สั้นกว่าหนึ่งตัวอักษร แต่ไม่มีอินเวิร์สที่นิยามไว้
  • C.!.2หมายถึง "การเปลี่ยนแปลงความเท่าเทียมกัน" มันจะส่งกลับทั้ง1(เท่าเทียมกันเท่าเทียมกัน) หรือ_1(คี่เท่าเทียม) นั่นคือ,_1^inversions
  • _1^i.&0 หมายถึง "-1 ถึงพลังของดัชนี 0"
  • ด้วยเหตุนี้C.!.2=_1^i.&0หมายความว่า "การเปลี่ยนแปลงของความเท่าเทียมกันเท่าเทียมกับตำแหน่งของหลุม?"

มันใช้งานได้กับบอร์ด 4x4 แต่ถ้าตำแหน่งสุดท้ายที่ต้องการคือซ้าย - ขวา - แถวใหญ่จากนั้นการเรียงสับเปลี่ยนตำแหน่งที่แก้ไขจะมีจำนวนการเปลี่ยนคี่เป็นจำนวนคี่ (สำหรับลำดับอินพุตใด ๆ ) เมื่อตำแหน่งของรูที่ต้องการเคลื่อนที่จากซ้ายไปขวาล่าง ในทั้งสองกรณีการแก้ไขคือหนึ่งอักขระ: เพิ่ม-หลังจาก=เพื่อย้อนกลับพาริตีที่คาดไว้

หลักฐานความถูกต้อง:

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


เมื่อคุณพูดว่า "ศูนย์ยังสลับระหว่างตำแหน่งคี่กับคู่": มันจะไม่เปลี่ยนด้วย +1, -1, +4 หรือ -4 ฉันคิดว่ารูปแบบที่ได้รับการตรวจสอบจะให้สีที่คุณต้องการ แต่สามารถอธิบายได้อย่างแม่นยำมากขึ้น
Peter Taylor

@PeterTaylor คุณถูกต้อง; ขอโทษ การแก้ไขของฉันถูกนับเป็นการแก้ไขที่ถูกต้องหรือไม่?
John Dvorak

ฉันคิดว่าการแก้ไขของคุณแก้ปัญหาแยกกันโดยสิ้นเชิง บิตที่ฉันยกมานั้นอยู่ในย่อหน้าสุดท้าย
Peter Taylor

"ระหว่างตำแหน่งคี่และคู่" เป็นเหมือน "ระหว่างสี่เหลี่ยมสีดำและสีขาวบนกระดานหมากรุก"
Joe Z.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.