Giải quyết một trò chơi của Accordion


13

Accordion là một trò chơi bài solitaire tôi mới bắt gặp, nơi gần như mọi bố cục đều có thể giải được, nhưng cực kỳ khó. Bạn có thể chơi nó ở đây .

Quy tắc

52 thẻ mặt được đặt ngửa theo thứ tự ngẫu nhiên. Mỗi lượt, bạn thay một thẻ bằng một thẻ sau, trong đó hai thẻ :

  • Chia sẻ một bộ quần áo hoặc số
  • Ở khoảng cách 1 (liền kề) hoặc 3 (hai thẻ ở giữa).

Trò chơi được chiến thắng khi chỉ còn 1 thẻ . Bạn có thể giả định rằng mỗi đầu vào là có thể giải quyết được. Thẻ thay thế phải luôn luôn đi trước thẻ thay thế.

Thí dụ

Ví dụ, xem xét bố cục sau:

2H,2S,1S,2D  (H: Hearts, S: Spades, D: Diamonds)

Có 3 động thái có thể ở đây:

  1. Thay thế 2Hbằng liền kề 2S, vì vậy chúng tôi kết thúc với2S,1S,2D
  2. Thay thế 2Sbằng liền kề 1S, vì vậy chúng tôi kết thúc với2H,1S,2D
  3. Thay thế 2Hbằng 2D(ở khoảng cách 3), vì vậy chúng tôi kết thúc bằng2D,2S,1S

Trong số 3 nước đi đó, chỉ có người cuối cùng có khả năng chiến thắng (Bạn thắng bằng cách thay thế 2D <- 2S, sau đó 2S <- 1S).

Đầu ra đầu vào

Công việc của bạn là viết một bộ giải Accordion . Bạn được thông qua một danh sách các thẻ, và bạn cần trả về một danh sách các động tác để giải quyết trò chơi.

Bạn được thông qua một danh sách các thẻ dưới dạng một chuỗi được phân cách bằng dấu phẩy, trong đó mỗi thẻ được truyền dưới dạng một số nguyên biểu thị giá trị số của chúng, sau đó là một ký tự đại diện cho phù hợp của chúng.

Bạn phải trả về danh sách thay thế dưới dạng chuỗi được phân cách bằng dấu phẩy, trong đó mỗi thay thế có định dạng Card <- Card(theo định dạng thẻ được mô tả ở trên). Thẻ đầu tiên trong mỗi cặp là thẻ được thay thế.

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

5H,1C,12S,9C,9H,2C,12C,11H,10C,13S,3D,8H,1H,12H,4S,1D,7H,1S,13D,13C,7D,12D,6H,10H,4H,8S,3H,5D,2D,11C,10S,7S,4C,2H,3C,11S,13H,3S,6C,6S,4D,11D,8D,8C,6D,5C,7C,5S,9D,10D,2S,9S
5H,9C,11H,7S,7D,12D,6H,10S,3H,4D,12C,2S,3C,5C,7H,6S,1H,8S,2H,11S,4C,10D,12H,9H,2D,4H,6C,13H,11C,2C,10H,8C,1S,11D,3S,12S,7C,5D,13S,8D,4S,6D,13C,3D,8H,13D,1D,9D,9S,1C,5S,10C
7H,11C,8C,7S,10D,13H,4S,10C,4D,2C,4H,13D,3C,2H,12C,6C,9H,4C,12H,11H,9S,5H,8S,13S,8H,6D,2S,5D,11D,10S,1H,2D,5C,1C,1S,5S,3H,6S,7C,11S,9C,6H,8D,12S,1D,13C,9D,12D,3D,7D,10H,3S

Trong khi cuộc thi này là một , tôi đặc biệt quan tâm đến các giải pháp hiệu quả về thời gian và có khả năng thưởng cho các giải pháp khéo léo bằng tiền thưởng. Điều đó nói rằng, các giải pháp mất nhiều thời gian trong thiên văn học vẫn có thể chấp nhận được (tôi khuyên bạn nên thử nghiệm với một bộ bài nhỏ hơn, chẳng hạn như bộ bài 16 lá, 4 bộ bài phù hợp).


Các quy tắc của bạn đề cập rằng các động thái chỉ có thể được thực hiện theo một hướng?
frageum

6
Mỗi thẻ trên bàn có trung bình khoảng 0,25 + 0,25 = 0,5 di chuyển hợp pháp. Do đó, không gian tìm kiếm là khoảng 52! * 0,5 = 4E67. Thử thách như được viết (với thẻ golf mã) chỉ có thể được hiểu là bắt buộc phải tìm kiếm toàn bộ không gian này và báo cáo bất kỳ giải pháp nào (hoặc "không" nếu hết), điều này không có nhiều chỗ cho sự khéo léo và đòi hỏi thời gian thiên văn. Tôi khuyên bạn nên biến điều này thành một thách thức về mã, xem xét tỷ lệ và thời gian thành công và giảm ảnh hưởng của độ dài mã đến điểm số hoặc loại bỏ hoàn toàn.
Cấp sông St

1
@ Pietu1998 và vấn đề nằm ở đó. Tôi giả sử bộ ghi nhớ làm bạn tốn nhiều byte, vì vậy bạn nên gửi phiên bản mà không có bộ ghi nhớ như phiên bản chơi gôn, nhưng sau đó không thể kiểm tra trên bộ bài 52 lá. Codegolf không hoạt động tốt như một hệ thống tính điểm cho các vấn đề với không gian tìm kiếm lớn.
Cấp sông St

3
Tôi ổn với thời gian chạy của thiên văn học cho những người muốn thi đấu golf mã. Tuy nhiên, mọi người chắc chắn có thể (và được khuyến khích) đăng câu trả lời không cạnh tranh và sắp hết thời gian.
Nathan Merrill

4
Hơn nữa, nếu bạn muốn thử nghiệm giải pháp chơi gôn, không cần bộ bài 52 lá. Một cỗ bài 16 thẻ (4 bộ quần áo) sẽ cung cấp thời gian chạy ngắn và xác minh tính chính xác.
Nathan Merrill

Câu trả lời:


5

Con trăn 3 274 272 271 byte

2 byte nhờ @orlp .

def g(p):
 q=lambda a:[[i,a]for i in range(len(p)-a)if p[i][:-1]==p[i+a][:-1]or p[i][-1]in p[i+a]]
 for n in q(1)+q(3):
  s=sum(n);c=p[:s]+p[s+1:];c[n[0]]=p[s]
  if g(c):return p[n[0]]+' <- '+p[s]+','+g(c)
 return' 'if len(p)<2else[]
print(g(input().split(','))[:-2]or'')

Điều này là vô cùng chậm. Tuy nhiên, bạn có thể thử nó với một bản ghi nhớ . Này có một vài phụ list- tuplechuyển đổi, nhưng nếu không tương đương.

import functools
@functools.lru_cache(maxsize=None)
def g(p):
 q=lambda a:[[i,a]for i in range(len(p)-a)if p[i][:-1]==p[i+a][:-1]or p[i][-1]in p[i+a]]
 for n in q(1)+q(3):
  s=sum(n);c=list(p[:s]+p[s+1:]);c[n[0]]=p[s]
  if g(tuple(c)):return p[n[0]]+' <- '+p[s]+','+g(tuple(c))
 return' 'if len(p)<2else[]
print(g(tuple(input().split(',')))[:-2]or'')

Ngay cả cái này là chậm về mặt thiên văn với một số đầu vào nhất định.

Mã này sử dụng các chuỗi, không phải số, vì vậy nó cũng hỗ trợ ký hiệu như KH thay vì 13H.

Thí dụ:

$ python accordion.py
5H,9C,11H,7S,7D,12D,6H,10S,3H,4D,12C,2S,3C,5C,7H,6S,1H,8S,2H,11S,4C,10D,12H,9H,2D,4H,6C,13H,11C,2C,10H,8C,1S,11D,3S,12S,7C,5D,13S,8D,4S,6D,13C,3D,8H,13D,1D,9D,9S,1C,5S,10C
7S <- 7D,7D <- 12D,3C <- 5C,12H <- 9H,11C <- 2C,3S <- 12S,13D <- 1D,1D <- 9D,9D <- 9S,2S <- 6S,7H <- 1H,6S <- 8S,1H <- 2H,8S <- 11S,2H <- 9H,10D <- 2D,9H <- 4H,4H <- 4C,5C <- 4C,4D <- 4C,4C <- 12C,10S <- 11S,11H <- 11S,6H <- 3H,12D <- 2D,12C <- 2C,2C <- 6C,6C <- 8C,12S <- 13S,5D <- 6D,6D <- 8D,8D <- 3D,4S <- 9S,13S <- 9S,11D <- 3D,7C <- 1C,1S <- 1C,1C <- 13C,8C <- 13C,13C <- 13H,13H <- 10H,2D <- 3D,3D <- 3H,3H <- 8H,8H <- 10H,11S <- 5S,5H <- 10H,5S <- 9S,10H <- 10C,10C <- 9C,9C <- 9S

Sử dụng functools.lru_cachethay vì viết của riêng bạn.
orlp

@orlp Tôi sẽ làm như vậy, nhưng listkhông thể tin được, nó không hoạt động.
PurkkaKoodari

Sau đó sử dụng bộ dữ liệu.
orlp

@orlp OK, nhưng điều đó sẽ yêu cầu thay đổi mã (ví dụ str.splittrả về list). Tôi muốn hai chương trình tương đương về chức năng.
PurkkaKoodari

Bạn có thể làm h=lambda p:lru_cache(None)(g)(''.join(p)).
orlp
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.