Nonogram dòng giải quyết lực lượng


25

Lý lịch

Nonogram , còn được gọi là Picross hoặc Griddlers, là một câu đố trong đó mục tiêu là xác định xem mỗi ô trên lưới 2D nên được tô màu hoặc để trống, sử dụng số lượng các ô màu liên tiếp trên mỗi dòng.

Sau đây là một ví dụ về câu đố Nonogram với lời giải.

Vấn đề là, một số trò chơi / ứng dụng di động Nonogram thương mại có các câu đố không thể giải được bằng tay (ví dụ: có nhiều giải pháp hoặc yêu cầu quay lui sâu). Tuy nhiên, họ cũng cung cấp một số sinh mạng cho người chơi, trong đó một sinh mạng bị mất khi bạn cố gắng tô màu một ô có câu trả lời đúng là trống . Vì vậy, bây giờ là thời gian để vũ phu những "câu đố" khó chịu!

Để đơn giản hóa nhiệm vụ, hãy tưởng tượng chỉ một dòng với đầu mối của nó và không có gì khác:

3 7 | _ _ _ _ _  _ _ _ _ _  _ _ _ _ _

Các [3,7]manh mối, và độ dài dòng là 15 ô. Vì nó có nhiều giải pháp khả thi, chúng ta cần phải mạo hiểm một số mạng để giải quyết hoàn toàn dòng này (tức là xác định tất cả các ô màu).

Thử thách

Đưa ra một dòng có manh mối (một danh sách các số nguyên dương) và độ dài của dòng, tìm số mạng sống tối đa bạn sẽ mất, giả sử rằng bạn vũ phu dòng đó với chiến lược tối ưu.

Lưu ý rằng bạn luôn đoán các ô màu . Trong các trò chơi thực tế, việc đoán các ô trống (đúng hoặc sai) không ảnh hưởng đến cuộc sống của bạn, vì vậy bạn không thể "giải quyết" câu đố theo cách đó.

Ngoài ra, bạn có thể giả sử đầu vào luôn đại diện cho một dòng Nonogram hợp lệ, vì vậy bạn không cần phải lo lắng về điều gì đó như [6], 5.

Giải trình

Trước tiên hãy xem xét một số ví dụ đơn giản hơn.

[1,2], 5

Có chính xác ba khả năng cho dòng này ( Olà một ô màu, .là một ô trống):

O . O O .
O . . O O
. O . O O

Nếu chúng ta thử tô màu ô 0 (chỉ mục dựa trên 0 từ trái sang), một trong những điều sau đây xảy ra:

  • Các tế bào được tô màu chính xác. Bây giờ chúng ta có hai khả năng và chúng ta có thể chọn giữa ô 2 và ô 4 để giải quyết hoàn toàn dòng. Dù thế nào đi nữa, chúng ta sẽ mất một mạng trong trường hợp xấu nhất.
  • Phòng giam trống rỗng, và chúng ta mất một cuộc sống. Trong trường hợp này, chúng tôi đã xác định được giải pháp duy nhất cho dòng này, vì vậy chúng tôi đã hoàn thành với 1 mạng sống bị mất.

Do đó, câu trả lời cho [1,2], 5là 1.

[5], 10

Tìm kiếm nhị phân? Không.

Lựa chọn đầu tiên rõ ràng nhất là 4 hoặc 5, sẽ tiết lộ một khả năng nếu nó trống (với chi phí là 1 cuộc sống). Hãy nói rằng chúng tôi đã chọn 4 đầu tiên. Nếu ô 4 thực sự có màu, chúng ta mở rộng nó sang bên trái, tức là thử 3, 2, 1 và 0 cho đến khi mất một mạng (hoặc ô 0 được tô màu, thì cuối cùng chúng ta sẽ không mất mạng). Bất cứ khi nào một cuộc sống bị mất, chúng ta có thể xác định duy nhất giải pháp, ví dụ nếu chúng ta thấy một cái gì đó như thế này:

_ _ X O O _ _ _ _ _

sau đó chúng ta đã biết câu trả lời là đây:

. . . O O O O O . .

Do đó, câu trả lời cho [5], 10cũng là 1.

[3,7], 15

Bắt đầu với ô 11, nếu trống, sẽ tiết lộ giải pháp sau đây ngay lập tức.

O O O . O O O O O O O X . . .

Sau đó thử 12, nếu trống, sẽ đưa ra hai khả năng có thể được giải quyết với chi phí thêm 1 cuộc sống.

O O O . . O O O O O O O X . .
. O O O . O O O O O O O X . .

Bây giờ hãy thử 2. Nếu trống, nó dẫn đến ba khả năng có thể được giải quyết tương tự như [1,2], 5ví dụ.

. . X O O O . O O O O O O O .
. . X O O O . . O O O O O O O
. . X . O O O . O O O O O O O

Nếu bạn tiếp tục giảm thiểu rủi ro theo cách này, bạn có thể đạt được bất kỳ giải pháp nào với tối đa. 2 đời dành.

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

[1,2] 5 => 1
[2] 5 => 2
[1] 5 => 4
[] 5 => 0
[5] 10 => 1
[2,1,5] 10 => 0
[2,4] 10 => 2
[6] 15 => 2
[5] 15 => 2
[4] 15 => 3
[3,7] 15 => 2
[3,4] 15 => 3
[2,2,4] 15 => 4
[1,1,1,1,1,1,1] 15 => 2

[2,1,1,3,1] 15 => 3
[1,1,1,2,1] 15 => 5

Đối với hai trường hợp cuối cùng, chiến lược tối ưu không đi qua các khoảng trống tối thiểu, mà chỉ đơn giản là đi từ trái sang phải (hoặc phải sang trái). Cảm ơn @crashoz đã chỉ ra.

Quy tắc

Luật tiêu chuẩn được áp dụng. Đệ trình hợp lệ ngắn nhất tính bằng byte thắng.

Tiền thưởng

Nếu ai đó đưa ra thuật toán đa thức thời gian (với bằng chứng chính xác), tôi sẽ thưởng +100 tiền thưởng cho một giải pháp như vậy.


Đầu ra dự định là [6], 5gì?
Nữ tu bị rò rỉ

Khi bạn đoán, bạn có phải đoán rằng ô đó có màu đen hay bạn có thể đoán màu đen hoặc trắng?
frageum

@LeakyNun Đó là một dòng không hợp lệ. Bạn có thể giả sử đầu vào luôn là một dòng Nonogram hợp lệ.
Bong bóng

@feersum Bạn luôn đoán ô màu. Trong các trò chơi thực tế, việc đoán một ô trống (đúng hoặc sai) không ảnh hưởng đến cuộc sống của bạn, vì vậy bạn không thể nhận được bất kỳ phản hồi nào với nó.
Bong bóng

Thử thách tuyệt vời
Enrico Borba

Câu trả lời:


19

Ruby , 85 byte

f=->l,n,s=n-l.sum-l.size+1{*a,b=l;b&&s>0?(a[0]?1+f[a,n-b-2,s-1]:(n.to_f/b).ceil-1):0}

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

Giải trình

l=[l1,l2,...,tôix]xn

lx
nlx
nlx1+f(l,nlx)
1+f(l~,nlx2)l~tôi

f(tôi,n)= ={0,nếu Σ1xtôitôi+x-1nntôix-1nếu x= =11+tối đa{f(tôi,n-tôix)f(tôi~,n-tôix-2),nếu không thì

Dưới đây là một ví dụ _không xác định, Xlà một không gian đã biết, Olà một tế bào màu đã biết và Lbị mất mạng

[2,2,4] 15                  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
(1) -> [2,2,4] 11           _ _ _ _ _ _ _ _ _ _ _ L X X X
    (1) -> [2,2,4] 7        _ _ _ _ _ _ _ L X X X L X X X
        0                   X X X L X X X L X X X L X X X
    (2) -> [2,2] 5          _ _ _ _ _ X O O O O L L X X X
        0                   O O X O O X O O O O L L X X X 
(2) -> [2,2] 9              _ _ _ _ _ _ _ _ _ X O O O O L
    (1) -> [2,2] 7          _ _ _ _ _ _ _ L X X O O O O L
        (1) -> [2,2] 5      _ _ _ _ _ L X L X X O O O O L
            0               O O X O O L X L X X O O O O L
        (2) -> [2] 3        _ _ _ X O O L L X X O O O O L
            1               O O L X O O L L X X O O O O L               
    (2) -> [2] 5            _ _ _ _ _ X O O L X O O O O L
        2                   O O L L X X O O L X O O O O L

Ôi(2n)

h

h(tôi,n)= =n-Σ1xtôitôi-x+1

h

h

h(tôi,n-tôix)= =n-tôix-Σ1xtôitôi-x+1= =(n-Σ1xtôitôi-x+1)-tôix= =h(tôi,n)-tôix

h(l~,nlx2)=nlx21x1li(x1)+1=(n1xlix+1)1=h(l,n)1

h(l,n)={0,if 1xli+x1nnlx,if x=1max{h(l,nlx)+lxh(l~,nlx2)+1,otherwise

h

[h(l,nlx)+lx][h(l~,nlx2)+1]=nlxn1xlix+1+lx[nlx21x1li(x1)+1+1]=2

[h(l,nlx)+lx][h(l~,nlx2)+1]=2[h(l,nlx)+lx][h(l~,nlx2)+1]<0[h(l,nlx)+lx]<[h(l~,nlx2)+1]

h(l,n)={0,if 1xli+x1nnlx,if x=1h(l~,nlx2)+1otherwise

hfh

f(l,n)={0,if 1xli+x1nnlx1if x=11+f(l~,nlx2),otherwise

nO(n)


2
Chào mừng bạn đến với PPCG, bài đăng đầu tiên đáng kinh ngạc!
cole

1
@cole Đây không phải là bài viết đầu tiên của họ, nhưng chắc chắn là không thể tin được! Cách tiếp cận rất thông minh +1
Ông Xcoder

1
Công việc tuyệt vời Tôi sẽ thưởng tiền thưởng 2 ngày sau đó, nếu không ai tìm thấy bất kỳ lỗ hổng logic nghiêm trọng nào cho đến lúc đó.
Bong bóng

2

Python, 303 289 byte

Golf đầu tiên trong một thời gian dài, vì vậy có thể có rất nhiều chất béo dư thừa. (Cảm ơn Jo King vì đã tìm thấy giá trị 14 byte.)

Hàm f tạo ra tất cả các sắp xếp có thể (mặc dù luôn có một khoảng trống là ký tự đầu tiên, nhưng điều đó tốt miễn là chúng ta tăng chiều dài thêm 1 trước khi chúng ta gọi nó). Hàm g chọn vị trí có số lượng khoảng trống và đệ quy ít nhất. Hàm h đặt chúng lại với nhau.

f=lambda l,n:["."*i+"X"*l[0]+c for i in range(1,n-l[0]+1)for c in f(l[1:],n-i-l[0])]if l else["."*n]
def g(q,n):O,X=min([[[p[:i]+p[i+1:]for p in q if p[i]==u]for u in".X"]for i in range(n)],key=lambda x:len(x[0]));return(len(q)>1)*1and max(1+g(O,n-1),g(X,n-1))
h=lambda l,n:g(f(l,n+1),n+1)

Các ví dụ đều chạy tốt:

>>> h([3,7],15)
2
>>> h([3,4],15)
3
>>> h([1,1,1,2,1],15)
6


1
Bạn được phép trở lại Falsecho 0? Nếu vậy, bạn có thể thay đổi (len(q)>1)*1andthành len(q)>1and. Nếu bạn không được phép trở lại Falsecho 0, sau đó làm điều đó, nhưng thay đổi g(f(l,n+1),n+1)để 1*g(f(l,n+1),n+1)và nó sẽ vẫn tiết kiệm một byte
Zachary

1
Thậm chí tốt hơn: trong trường hợp Falsekhông được phép 0, thay vì đổi g(f(l,n+1),n+1)thành 1*g(f(l,n+1),n+1), hãy đổi nó thành+g(f(l,n+1),n+1)
Zacharý

2
Ngoài ra, bạn không cần phải đếm số h=byte của mình
Zacharý

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.