아코디언 게임 해결


13

Accordion 은 최근에 거의 모든 레이아웃을 해결할 수 있지만 엄청나게 어려운 솔리테어 카드 게임입니다. 여기서 재생할 수 있습니다 .

규칙

52 개의 얼굴 카드가 무작위 순서로 위로 향하게 배치됩니다. 매 턴마다 카드를 다음 카드로 교체합니다. 두 카드는 다음과 같습니다.

  • 양복이나 번호를 공유 하고
  • 1 (인접) 또는 3 (두 카드 사이)의 거리에 있습니다.

남은 카드가 1 장 남았을 때 승리 합니다. 각 입력을 해결할 수 있다고 가정 할 수 있습니다. 교체 된 카드는 항상 교체 카드보다 우선해야합니다.

예를 들어 다음 레이아웃을 고려하십시오.

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

여기에는 3 가지 가능한 동작이 있습니다.

  1. 를 교체 2H이웃과 2S우리가 끝낼 수 있도록,2S,1S,2D
  2. 를 교체 2S이웃과 1S우리가 끝낼 수 있도록,2H,1S,2D
  3. 바꾸기 2H과를 2D우리가 끝낼 수 있도록, (3의 거리)2D,2S,1S

그 3 개 이동 중 마지막 하나는 (당신은 대체하여 승리 승리의 가능성이 2D <- 2S그 다음을, 2S <- 1S).

입출력

당신의 임무는 아코디언 솔버를 작성하는 것 입니다. 당신은 카드의 목록을 전달하고 게임을 해결하기 위해 이동 목록을 반환해야합니다.

쉼표로 구분 된 문자열로 카드 목록이 전달됩니다. 여기서 각 카드는 숫자 값을 나타내는 정수로 전달 된 다음 해당 양복을 나타내는 문자로 전달됩니다.

교체 목록을 쉼표로 구분 된 문자열로 반환해야합니다. 여기서 각 교체는 형식 Card <- Card(위에서 설명한 카드 형식에 따름)으로되어 있습니다. 각 쌍의 첫 번째 카드는 교체되는 카드입니다.

테스트 사례 :

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

이 경쟁은 이지만, 특히 시간 효율적인 솔루션에 관심이 있으며 독창적 인 솔루션으로 현상금을 보상 할 수 있습니다. 그러나 천문학적 인 시간이 걸리는 솔루션은 여전히 ​​수용 가능합니다 (16 카드, 4 벌 데크와 같은 더 작은 데크로 테스트하는 것이 좋습니다).


규칙은 한 방향으로 만 움직일 수 있다고 언급합니까?
feersum

6
테이블 위의 모든 카드는 평균 약 0.25 + 0.25 = 0.5의 법적 움직임을가집니다. 따라서 검색 공간은 약 52입니다! * 0.5 = 4E67. (골프 골프 태그로) 작성된 문제는이 전체 공간을 검색하고 모든 솔루션 (또는 소진 된 경우 "없음")을보고하는 데 필요한 것으로 해석 될 수 있습니다. 성공률과 시간을 고려하여 코드 도전 과제로 삼고 코드 길이가 점수에 미치는 영향을 줄이거 나 완전히 제거하는 것이 좋습니다.
레벨 리버 스트리트

1
@ Pietu1998과 그 안에 문제가 있습니다. 나는 암기자가 바이트를 소비한다고 가정하므로 암기 기가없는 버전을 골프 버전으로 제출해야하지만 52 카드 데크에서 테스트하는 것은 불가능합니다. Codegolf는 검색 공간이 큰 문제에 대한 점수 시스템으로 잘 작동하지 않습니다.
Level River St

3
코드 골프 경쟁을 원하는 사람들을 위해 천문학적 런타임에 만족합니다. 그러나 사람들은 경쟁적이지 않고 런타임에 관한 답변을 게시 할 수 있습니다.
Nathan Merrill

4
또한 코드 골프 솔루션을 테스트하려는 경우 52 카드 데크가 필요하지 않습니다. 16 장의 카드 (4 장) 덱은 짧은 런타임을 제공하고 정확성을 확인해야합니다.
Nathan Merrill

답변:


5

파이썬 3, 274 272 271 바이트

2 바이트@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'')

이것은 매우 느립니다. 그러나, 당신은 그것을 시도 할 수 있습니다 memoize로 . 이것은 몇 가지 추가가 list- tuple변환을하지만, 그와 동일합니다.

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

이것조차도 특정 입력으로 천문학적으로 느립니다.

이 코드는 숫자가 아닌 문자열을 사용하므로 KH대신 대신 과 같은 표기법을 지원합니다 13H.

예:

$ 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

functools.lru_cache직접 쓰는 대신 사용하십시오 .
orlp

@ orlp는 할 것이지만 list해싱 할 수 없으므로 작동하지 않습니다.
PurkkaKoodari

그런 다음 튜플을 사용하십시오.
orlp

@orlp는 괜찮지 만 코드를 변경해야합니다 (예 : str.splitreturns list). 두 프로그램이 기능적으로 동등한 것을 선호합니다.
PurkkaKoodari

당신은 할 수 있습니다 h=lambda p:lru_cache(None)(g)(''.join(p)).
orlp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.