Tatamibari แก้ปัญหา


10

พื้นหลัง

Tatamibariเป็นปริศนาตรรกะที่ออกแบบโดย Nikoli

ปริศนา Tatamibari +เล่นบนตารางสี่เหลี่ยมที่มีสามชนิดที่แตกต่างกันของสัญลักษณ์ในมัน-, |และ ตัวแก้ปัญหาต้องแบ่งพาร์ติชันของกริดออกเป็นพื้นที่สี่เหลี่ยมหรือสี่เหลี่ยมตามกฎต่อไปนี้

  • ทุกพาร์ติชันจะต้องมีสัญลักษณ์หนึ่งตัวอยู่ในนั้น
  • +สัญลักษณ์จะต้องมีอยู่ในตาราง
  • |สัญลักษณ์จะต้องอยู่ในรูปสี่เหลี่ยมผืนผ้าที่มีความสูงมากกว่าความกว้าง
  • -สัญลักษณ์จะต้องอยู่ในรูปสี่เหลี่ยมผืนผ้าที่มีความกว้างมากกว่าความสูง
  • สี่ชิ้นอาจไม่เคยแบ่งปันมุมเดียวกัน (นี่คือวิธีการวางกระเบื้องทาทามิญี่ปุ่นโดยปกติ)

ต่อไปนี้เป็นตัวอย่างปริศนาที่มีวิธีแก้ไข:

ตัวอย่างปริศนา Tatamibari ตัวอย่างวิธีแก้ปริศนา Tatamibari

งาน

แก้ปริศนา Tatamibari ที่ให้มา

อินพุตและเอาต์พุต

อินพุตเป็นตาราง 2D ที่แสดงถึงตัวต่อ Tatamibari puzzle เซลล์แต่ละคนมีหนึ่งในสี่ตัวอักษร: +, -, |, และตัวอักษรที่คุณเลือกที่จะเป็นตัวแทนเซลล์ที่ไม่ได้เบาะแส ในกรณีทดสอบ*จะใช้เครื่องหมายดอกจัน

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

  • รายการของ 4-tuples โดยที่แต่ละ tuple จะมีดัชนีด้านบน, ดัชนีด้านซ้าย, ความกว้างและความสูงของสี่เหลี่ยมผืนผ้า (หรือการแสดงที่เทียบเท่ากัน)
  • กริดตัวเลขที่มีรูปร่างเดียวกันกับอินพุตโดยที่แต่ละหมายเลขจะแทนสี่เหลี่ยมผืนผ้า
  • รายการชุดพิกัดที่แต่ละชุดมีพิกัดทั้งหมดของเซลล์ในสี่เหลี่ยมผืนผ้า

หากตัวต่อมีหลายทางคุณสามารถส่งออกจำนวนที่ถูกต้อง (หนึ่งหรือมากกว่า) ของการแก้ปัญหาที่ถูกต้อง อินพุตรับประกันว่ามีทางออกอย่างน้อยหนึ่งรายการ

กรณีทดสอบ

Puzzle:
|-*
*+|
*-*
Solution:
122
134
554
=====
Puzzle:
+***
**|*
*+**
***-
Solution:
1122
1122
3322
3344
======
Puzzle:
|*+*+
*****
****-
***+|
+****
Solution:
12233
12233
44444
55667
55667
=======
Puzzle:
****-**
**-**|*
*|*****
****-**
*******
**+*|**
*****+*
One possible solution:
1122222
1133344
1155544
1155544
6667744
6667788
6667788
===========
Puzzle:
*-****|+**
+*-******|
****+*****
*-******||
**++|*****
+****-|***
-****-**+*
********-*
|*+*+|****
*-*--**+*+
Solution:
1111122334
5666622334
7777822994
7777A2299B
CCDEA2299B
CCFFFFGGHH
IIIIJJGGHH
KLLMMNGGOO
KLLMMNGGPP
QQRRSSSTPP

กฎระเบียบ

ใช้กฎมาตรฐานของรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

คำตอบ:


5

Python 2 , 417 374 366 ไบต์

อินพุตคือรายการของบรรทัด~สำหรับ non-เงื่อนงำ เอาท์พุทเป็นทางออกเดียวที่จะ stderr (x_start, width, y_start, height)ในรูปแบบ

R=range
k=input()
X,Y=len(k[0]),len(k)
W,H=R(X),R(Y)
Q=[[]]
for q in Q:C=[(x,y)for(a,b,c,d)in q for x in(a,a+b)for y in(c,c+d)];max(map(C.count,C+W))<4>0<all(sum(w>x-s>-1<y-t<h<[c for r in k[t:t+h]for c in r[s:s+w]if'~'>c]==['+|-'[cmp(h,w)]]for(s,w,t,h)in q)==1for x in W for y in H)>exit(q);Q+=[q+[(s,w+1,t,h+1)]for s in W for w in R(X-s)for t in H for h in R(Y-t)]

ลองออนไลน์! สิ่งนี้ไม่มีประสิทธิภาพมากเกินไปสำหรับกรณีทดสอบที่แนะนำ


Ungolfed

grid = input()
total_width = len(grid[0])
total_height = len(grid)

partitions = [[]]

for partition in partitions:
    # list the corners of all rectangles in the current partition
    corners = [(x, y)
               for (start_x, width, start_y, height) in partition
               for x in (start_x, start_x + width)
               for y in (start_y, start_y + height)]
    # if no corners appears more than three times ...
    if corners != [] and max(map(corners.count, corners)) < 4:
        # .. and all fields are covered by a single rectangle ...
        if all(
                sum(width > x - start_x > -1 < y - start_y < height
                    for (start_x, width, start_y, height) in partition) == 1
                for x in range(total_width)
                for y in range(total_height)):
            # ... and all rectangles contain a single non-~
            # symbol that matches their shape:
            if all(
                [char for row in grid[start_y: start_y + height]
                    for char in row[start_x:start_x + width] if '~' > char]
                == ['+|-'[cmp(height, width)]]
                    for (start_x, width, start_y, height) in partition):
                # output the current partition and stop the program
                exit(partition)

    # append each possible rectangle in the grid to the current partition,
    # and add each new partition to the list of partitions.
    partitions += [partition + [(start_x, width + 1, start_y, height + 1)]
                   for start_x in range(total_width)
                   for width in range(total_width - start_x)
                   for start_y in range(total_height)
                   for height in range(total_height - start_y)]

ลองออนไลน์!

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