Người giải Tatamibari


10

Lý lịch

Tatamibari là một câu đố logic được thiết kế bởi Nikoli.

Một Tatamibari câu đố được chơi trên một lưới hình chữ nhật với ba loại khác nhau của các biểu tượng trong nó: +, -. và |. Người giải phải phân vùng lưới thành các vùng hình chữ nhật hoặc hình vuông theo các quy tắc sau:

  • Mỗi phân vùng phải chứa chính xác một biểu tượng trong đó.
  • Một +biểu tượng phải được chứa trong một hình vuông.
  • Một |biểu tượng phải được chứa trong một hình chữ nhật có chiều cao lớn hơn chiều rộng.
  • Một -biểu tượng phải được chứa trong một hình chữ nhật có chiều rộng lớn hơn chiều cao.
  • Bốn mảnh có thể không bao giờ chia sẻ cùng một góc. (Đây là cách gạch thường được đặt ở Nhật Bản.)

Sau đây là một câu đố mẫu, với một giải pháp:

Ví dụ câu đố Tatamibari Ví dụ giải pháp câu đố Tatamibari

Bài tập

Giải câu đố Tatamibari đã cho.

Đầu ra đầu vào

Đầu vào là một lưới 2D đại diện cho câu đố Tatamibari đã cho. Mỗi tế bào chứa một trong bốn nhân vật: +, -, |, và một nhân vật mà bạn lựa chọn để đại diện cho một tế bào không đầu mối. Trong các trường hợp thử nghiệm, một dấu sao *được sử dụng.

Bạn có thể chọn bất kỳ định dạng đầu ra phù hợp nào có thể đại diện rõ ràng cho bất kỳ giải pháp hợp lệ nào cho câu đố Tatamibari. Điều này bao gồm, nhưng không giới hạn ở: (nếu nghi ngờ, hãy hỏi ý kiến.)

  • Danh sách gồm 4 bộ, trong đó mỗi bộ bao gồm chỉ mục trên cùng, chỉ mục bên trái, chiều rộng và chiều cao của hình chữ nhật (hoặc bất kỳ đại diện tương đương nào)
  • Một lưới số có cùng hình dạng với đầu vào, trong đó mỗi số đại diện cho một hình chữ nhật
  • Một danh sách các bộ tọa độ, trong đó mỗi bộ bao gồm tất cả các tọa độ của các ô trong một hình chữ nhật

Nếu một câu đố có nhiều giải pháp, bạn có thể xuất bất kỳ số nào (một hoặc nhiều) giải pháp hợp lệ của nó. Đầu vào được đảm bảo có ít nhất một giải pháp.

Các trường hợp thử nghiệm

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

Quy tắc

Luật tiêu chuẩn được áp dụng. Mã ngắn nhất tính bằng byte thắng.

Câu trả lời:


5

Python 2 , 417 374 366 byte

Đầu vào là danh sách các dòng, ~cho đầu mối. Đưa ra một giải pháp duy nhất cho thiết bị lỗi chuẩn ở định dạng (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)]

Hãy thử trực tuyến! Điều này là quá không hiệu quả cho các trường hợp thử nghiệm đề xuất.


Ung dung

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

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.