Tìm cách di chuyển ngay lập tức tốt nhất trong trò chơi trận đấu-3


11

Thử thách của bạn hôm nay là nhận đầu vào như thế này:

fbcfbee
ffcabbe
debceec
bccabbe
edcfbcd
daeaafc
eebcbeb

Và đưa ra cách di chuyển tốt nhất có thể trong một trò chơi giống như Bejeweled sẽ khớp ba hoặc nhiều chữ cái, như thế này (lưu ý viết hoa BC):

fbcfbee
ffcabbe
deBCeec
bccabbe
edcfbcd
daeaafc
eebcbeb

Thông số kỹ thuật đầy đủ:

  • Đầu vào sẽ là ncác dòng nchữ thường mỗi chữ cái (trong đó ncó thể là bất kỳ số nào).
  • Đầu ra sẽ là bước đi tốt nhất bạn có thể thực hiện trong trò chơi khớp 3, với hai chữ cái bạn muốn hoán đổi viết hoa.
  • Các trận đấu phải có mức độ ưu tiên sau (trong các ví dụ này, .biểu thị một hình vuông không quan trọng):

    1. Năm liên tiếp

      xxYxx
      ..X..
      
    2. Bị hỏng năm liên tiếp

      X..
      Yxx
      x..
      x..
      

      hoặc là

      .X.
      xYx
      .x.
      .x.
      
    3. Bốn liên tiếp

      xYxx
      .X..
      
    4. Ba lần liên tiếp

      xYx
      .X.
      

    Bạn phải tìm trận đấu có mức độ ưu tiên cao nhất và xuất nó.

  • Nếu có nhiều trận đấu có cùng mức độ ưu tiên, bạn có thể xuất bất kỳ một trong số chúng.
  • Sẽ luôn có ít nhất một trận đấu (chương trình của bạn có thể bị hỏng nếu không có trận đấu hoặc làm bất cứ điều gì bạn muốn).
  • I / O có thể ở bất kỳ định dạng hợp lý nào (stdin / out, đọc và ghi tệp, đối số hàm / giá trị trả về, hộp thoại, v.v.) nhưng KHÔNG được mã hóa cứng (như x="[insert input here]").
  • Đây là để mã ngắn nhất tính theo byte thắng. Nếu bạn sử dụng bất kỳ quyền truy cập mạng nào vì một số lý do, tất cả các byte được tải xuống từ mạng đều tính vào điểm số của bạn.

1
+1, nhưng tôi phản đối tiêu đề; có thể có một động thái tốt hơn. Chẳng hạn, một người tạo ra hai người vợ hoặc một người gây ra sự sụt giảm để tạo ra nhiều thứ hơn.
Justin

Có phải năm liên tiếp bị hỏng cũng bao gồm ..x.\nxxYX\n..x.?
Peter Taylor

@Peter Vâng, đúng vậy.
Doorknob

Có 2 mẫu 5 bị hỏng trong một hàng: mẫu L và mẫu T. Bạn có yêu cầu cả hai phải được khớp?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@nhahtdh Vâng, tôi sẽ chỉnh sửa để làm rõ điều đó.
Doorknob

Câu trả lời:


2

Python3.4, 772

(Sử dụng các tab để thụt lề, thay vì dấu cách.)

import sys,itertools as I
B=[]
for l in sys.stdin:
    l=l.rstrip()
    B.append(list(l))
Z=len(B[0])
F=T=None
R=range
N=min
X=max
P=I.product
S=0
def C(I,J,K,L):
    global F,T,S
    if K<0 or K>=Z or L<0 or L>=Z: return
    B[I][J],B[K][L]=B[K][L],B[I][J]
    h=v=1
    m=B[K][L]
    for i in R(K+1,N(Z,K+5)):
        if B[i][L]!=m:break
        v+=1
    for i in R(K-1,X(0,K-5),-1):
        if B[i][L]!=m:break
        v+=1
    for j in R(L+1,N(Z,L+5)):
        if B[K][j]!=m:break
        h+=1
    for j in R(L-1,X(0,L-5),-1):
        if B[K][j]!=m:break
        h+=1
    c=X(h,v)*2
    if N(h,v)>=3:c+=N(h,v)
    if c>S:S=c;F=I,J;T=K,L
    B[I][J],B[K][L]=B[K][L],B[I][J]
for i,j in P(reversed(R(Z)),R(Z)):
    for d,e in (1,0),(0,-1),(0,1),(-1,0):
        C(i,j,i+d,j+e)
for i,j in P(R(Z),R(Z)):
    c=B[i][j]
    if (i,j)in(F,T):c=c.upper()
    print(c,end=('',"\n")[j==Z-1])

Thay vì [c for c in l], bạn chỉ có thể làm list(l).
Doorknob

Sử dụng (i, j) trong (F, T) thay vì hai so sánh - 778
Austin Hastings

F = (i, j) -> F = i, j. Khử cân bằng 2 triệu chứng r / o - 770
Austin Hastings

Đã sửa lỗi: broken-5 không nên đánh bại true-5.
Austin Hastings
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.