Sắp xếp tối thiểu giống như Boggle


14

Xem xét làm thế nào một từ có thể được sắp xếp trên một lưới Boggle lớn tùy ý nếu quy tắc về việc không sử dụng cùng một khối chữ cái nhiều lần được bỏ qua . Cũng giả sử rằng bạn có số lượng chữ cái không giới hạn (có tất cả các chữ cái hiện diện), và Quchỉ là Q.

Từ này MISSISSIPPIcó thể được sắp xếp chỉ sử dụng 6 khối. Đây là một sự sắp xếp có thể:

 S
MIS
 PP

Bắt đầu từ Mchúng tôi liên tục thực hiện bất kỳ bước nào theo chiều ngang, chiều dọc hoặc đường chéo cho đến khi toàn bộ từ được đánh vần.

Đáng ngạc nhiên, một cụm từ dài hơn AMANAPLANACANALPANAMAcũng chỉ cần 6 khối:

MAN
PLC

Tuy nhiên, số lượng hình khối tối thiểu cần thiết cho các chuỗi dài hơn, phức tạp hơn không phải lúc nào cũng rõ ràng.

Thử thách

Viết một chương trình lấy một chuỗi và sắp xếp nó theo kiểu giống như Boggle này sao cho số lượng hình khối tối thiểu được sử dụng . (Kích thước của lưới kết quả và số lượng ô trống là không liên quan.)

Giả sử bạn có số lượng hình khối không giới hạn cho mỗi ký tự ASCII có thể in ngoại trừ khoảng trắng (mã hex 21 đến 7E), vì nó được sử dụng như một ô lưới trống. Chỉ các chuỗi ASCII có thể in (không có dấu cách) mới được nhập.

Đầu vào nên được lấy từ stdin hoặc dòng lệnh. Đầu ra nên đi đến thiết bị xuất chuẩn (hoặc thay thế gần nhất).

Các dòng mới và dấu cách hàng đầu hoặc dấu cách trong đầu ra đều ổn (nhưng hy vọng không có số lượng không phù hợp).

Không gian tìm kiếm sẽ tăng theo cấp số nhân khi chuỗi dài hơn, nhưng bạn không bắt buộc phải cố gắng làm cho thuật toán của mình hiệu quả (mặc dù điều đó sẽ rất tốt :)). Đây là môn đánh gôn, vì vậy giải pháp ngắn nhất tính bằng byte sẽ thắng.

Thí dụ

Nếu đầu vào là Oklahoma!(tối thiểu 8 ký tự), thì tất cả sẽ là đầu ra hợp lệ vì tất cả đều có đúng 8 ô lưới được điền và chúng tuân theo mẫu đọc Boggle (đã sửa đổi):

Oklaho
   !m

hoặc là

  !
Oamo
klh

hoặc là

   lkO   
  !amo              
    h    

Vân vân.


4
Điều này có vẻ như một vấn đề tối ưu hóa khó khăn. Tôi nghĩ rằng nó sẽ thực hiện một thử thách mã tốt đẹp.
Martin Ender

1
Tôi không thể chỉnh sửa vì có một chỉnh sửa đang chờ xử lý từ người dùng ít người biết, nhưng Mississippi có hai lần.
Peter Taylor

Còn trường hợp nhạy cảm thì sao?
tự hào

1
@proudhaskeller Tôi chắc chắn rằng đầu vào không phân biệt chữ hoa chữ thường, bởi vì: 1) đầu vào chỉ là bất kỳ ASCII 2 có thể in nào) OP không đề cập khác 3) Ví dụ oklahoma sẽ không tối thiểu nếu đầu vào không nhạy cảm.
Martin Ender

@ MartinBüttner Tôi nghĩ bạn có nghĩa là trường hợp nhạy cảm
Ypnypn

Câu trả lời:


5

Con trăn 342 355 398

R=(-1,0,1)
A=[];b={}
def s(w,x,y):
 if w: # not at the end of the word yet?
  for I in R: # search adjacent squares
   for j in R:
    if I|j: # skip the square we are on
     i=I+x;j+=y;c=b.get((i,j)) # get square in board
     if c==w[0]:s(w[1:],i,j) # square is what we are looking for?
     elif not c:b[i,j]=w[0];s(w[1:],i,j);del b[i,j] # we can set square?
 else:A.append(dict(b)) # all solutions
s(raw_input(),9,9) # run the search
A=min(A,key=len) # A is now the shortest solution
C=sum(map(list,A),[]) # put all board coords together
C=range(min(C),max(C)+1) # find the board biggest square bound
for r in C:print"".join(A.get((c,r)," ") for c in C)

Thụt vào bốn không gian thực sự là một ký tự tab.

AMANAPLANACANALPANAMA:

MC 
NA 
PL

MISSISSIPPI:

S  
SI 
PPM

Oklahoma!:

oh    
 ma   
 ! l  
    k 
     O

Llanfairpwllgwyngyllgây chết người ;)


Bây giờ có vẻ tốt, chỉ thực sự chậm: /
Sở thích của Calvin

1
Bạn có thể rút ngắn nó một chút bằng cách loại bỏ import sysvà thay thế sys.argv[1]bằng raw_input().
Sở thích của Calvin

@ Calvin'sHobbies thx một lần nữa, đầu gọn gàng :) Để có được một đầu ra bạn chỉ có thể thay đổi elifđể elif not c and (not A or len(b)<len(A[-1])):và nó chạy nhanh hơn rất nhiều
Will

1
Nếu "Oklahoma!"là đầu vào OK, bạn chỉ có thể sử dụng input()thay vì raw_input().
FryAmTheEggman
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.