전쟁 게임의 승자를 결정


19

카드 게임 전쟁 은 흥미 진진한 결과가 경기장에서 카드를 수령하고 덱으로 이동하는 순서에 대한 특정 규칙을 따르는 한 덱의 초기 배열에 의해 결정된다는 점에서 흥미 롭습니다. 이 도전에서, 단지 2 명의 선수 만이있을 것이고, 일을 크게 단순화 할 것입니다.

게임

  1. 각 플레이어는 26 장의 카드로 구성됩니다.
  2. 각 플레이어는 맨 위 카드를 자신의 덱에 놓습니다. 순위가 높은 카드 ( Ace > King > Queen > Jack > 10 > 9 > 8 > 7 > 6 > 5 > 4 > 3 > 2)를 가진 플레이어 는 라운드에서 이기고 카드를 상대방의 카드 위에 놓고 뒤집어서 덱 맨 아래에 추가합니다 (따라서 승리 카드는 덱 맨 아래에 있습니다) 다른 플레이어의 패배 카드는 바로 위에 있습니다). 이것은 플레이어 중 하나가 카드를 다 쓸 때까지 수행됩니다.
    • 카드의 순위가 같은 경우, 각 플레이어는 덱 맨 위의 카드 2 장을 앞면 카드 위에 놓습니다 (덱 맨 위에 있던 카드가 스택의 두 번째 카드가되도록합니다. 맨 위에서 두 번째 카드가 맨 위에옵니다). 그런 다음 (각 스택의 최상위 카드 순위)를 다시 비교하고 승자는 패자의 전체 스택 위에 전체 스택을 놓고 스택을 뒤집어 뒤집어 덱 맨 아래에 놓습니다. 다른 동점이있는 경우, 승자가 선택되거나 한 명의 플레이어가 카드를 소진 할 때까지 같은 방식으로 더 많은 카드가 사용됩니다.

어떤 시점에서 플레이어 중 한 명이 자신의 덱에서 카드를 뽑아야하지만 덱이 비어 있으면 즉시 게임에서 패배합니다.

도전

플레이어 덱에있는 두 가지 카드 목록이 편리한 형식으로 제공되면 플레이어 1이 이기면 참 값을, 플레이어 2가 이기면 거짓 값을 출력합니다.

편의상 10 장의 카드는로 표시되고 T, 얼굴 카드는 ( Ace -> A, King -> K, Queen -> Q, Jack -> J)로 표시되므로 모든 카드의 길이는 한 문자입니다. 또는 순위는 10 진수 2-14 ( Jack -> 11, Queen -> 12, King -> 13, Ace -> 14) 또는 16 진수 2-E ( 10 -> A, Jack -> B, Queen -> C, King -> D, Ace -> E) 로 표시 될 수 있습니다 . 소송은 중요하지 않으므로 소송 정보는 제공되지 않습니다.

  • 모든 게임이 특정 시점에 종료된다고 가정 할 수 있습니다 (시간이 오래 걸릴 수 있음). 한 플레이어는 다른 플레이어보다 먼저 카드가 부족합니다.
  • 각 플레이어는 동시에 카드와 카드를 한 번에 하나씩 배치하므로 어떤 플레이어가 먼저 카드를 소진했는지 모호하지 않습니다.

테스트 사례

테스트 사례 23456789ABCDE는 순위를 오름차순으로 나타내는 데 사용 됩니다.

D58B35926B92C7C4C7E8D3DAA2, 8E47C38A2DEA43467EB9566B95 -> False
669D9D846D4B3BA52452C2EDEB, E747CA988CC76723935A3B8EA5 -> False
5744B95ECDC6D325B28A782A72, 68394D9DA96EBBA8533EE7C6C4 -> True
87DB6C7EBC6C8D722389923DC6, E28435DBEBEA543AA47956594A -> False
589EAB9DCD43E9EC264A5726A8, 48DC2577BD68AB9335263B7EC4 -> True
E3698D7C46A739AE5BE2C49286, BB54B7D78954ED526A83C3CDA2 -> True
32298B5E785DC394467D5C9CB2, 5ED6AAD93E873EA628B6A4BC47 -> True
B4AB985B34756C624C92DE5E97, 3EDD5BA2A68397C26CE837AD48 -> False
9A6D9A5457BB6ACBC5E8D7D4A9, 73E658CE2C3E289B837422D463 -> True
96E64D226BC8B7D6C5974BAE32, 58DC7A8C543E35978AEBA34D29 -> True
C2978A35E74D7652BA9762C458, 9A9BB332BE8C8DD44CE3DE66A5 -> False
BEDB44E947693CD284923CEA82, 8CC3B75756255A683A6AB9E7DD -> False
EEDDCCBBAA8877665544332299, EEDDCCBBAA9988776655443322 -> False
EEDDCCBBAA9988776655443322, DDCCBBAA9988776655443E3E22 -> True

참조 구현

이 참조 구현은 Python 3으로 작성되었으며 테스트 사례와 동일한 형식으로 입력을받습니다 (쉼표와 공백 대신 개행 문자로 분리 된 경우는 제외).

#!/usr/bin/env python3

from collections import deque

p1, p2 = [deque(s) for s in (input(),input())]
print(''.join(p1))
print(''.join(p2))

try:
    while p1 and p2:
        p1s = [p1.popleft()]
        p2s = [p2.popleft()]
        while p1s[-1] == p2s[-1]:
            p1s.append(p1.popleft())
            p2s.append(p2.popleft())
            p1s.append(p1.popleft())
            p2s.append(p2.popleft())
        if p1s[-1] > p2s[-1]:
            p1.extend(p2s+p1s)
        else:
            p2.extend(p1s+p2s)
except IndexError:
    pass
finally:
    print(len(p1) > 0)


1
한 벌의 카드의 1, 2, 3경우 상대의 승리를 계속하면 게임은 끝이 없습니다 1. 홀수의 카드를 가지고있는 기발한가요?
Neil

@Neil 어떤 카드 덱에 1?
서버

@Suever 죄송합니다, 너무 열심히 생각하지 않았다, 나는 단지 내 머리에 들어온 처음 세 가지 숫자를 골랐다. 첫 번째 카드가 가장 낮은 카드를 3 ​​장 선택하십시오.

@Neil 단지 당신에게 힘든 시간을주는 것 :) 점을 찍었다!
Suever

답변:


3

자바 스크립트 (ES6), 134 바이트

f=([p,...r],[q,...s],t=[],u=[],v)=>!q||p&&(v|p==q?f(r,s,[...t,p],[...u,q],!v):p>q?f([...r,...u,q,...t,p],s):f(r,[...s,...t,p,...u,q]))
<div oninput=o.checked=f(p.value,q.value)>
Player 1's cards: <input id=p><br>
Player 2's cards: <input id=q><br>
<input id=o type="checkbox"> Player 2 loses

반환 undefined플레이어 2가 이기면true 갑니다. 비슷한 반복자, 일반적으로 정수 배열 또는 16 진 문자 문자열을 허용합니다. 답은 22 %가 넘는 .문자 로 구성되어 있으며 필자는 필자의 기록 일 것입니다.


테스트 사례로 시도 할 때 올바른 결과를 얻지 못하는 것 같습니다.
척 모리스

@ChuckMorris 죄송합니다. 규칙 중 하나를 간과했습니다. 지금 수정해야합니다.
Neil

@Mego 다시 시도하십시오. 방금 업데이트했습니다.
Neil

모든 것이 지금 확인되는 것 같습니다.
Mego

좋아, 이제 감동 받았다!
척 모리스

4

파이썬, 160 (155?) 바이트

f=lambda x,y,z=1:f(*((x,y,z+2),(x[z:]+y[:z]+x[:z],y[z:]),(x[z:],y[z:]+x[:z]+y[:z]))[(x[z-1]>y[z-1])+(x[z-1]<y[z-1])*2])if len(y)>z<len(x)else len(x)>len(y)

이 솔루션은 이론적으로 유효하지만 일부 테스트 사례의 경우 기본 Python 최대 재귀 깊이를 증가시켜야합니다.

두 번째 솔루션은 5 바이트 더 길지만 모든 테스트 사례에서 작동합니다.

f=lambda x,y,z=1:(f(x,y,z+2)if x[z-1]==y[z-1]else f(x[z:]+y[:z]+x[:z],y[z:])if x[z-1]>y[z-1]else f(x[z:],y[z:]+x[:z]+y[:z]))if len(y)>z<len(x)else len(x)>len(y)

편집 : Ungolfed 솔루션 1

def f(x,y,z=1):
    if len(y)<z>len(x):
        return len(x)>len(y)
    else:
        return f(*(
            (x,y,z+2),
            (x[z:],y[z:]+x[:z]+y[:z]),
            (x[z:]+y[:z]+x[:z],y[z:])
        )[(x[z-1]>y[z-1])+(x[z-1]<y[z-1])*2])

IronPython 은 첫 번째 솔루션을 잘 실행 하기 때문에 (기본 재귀 깊이는 무제한) 첫 번째 솔루션이 유효하다고 말할 것입니다.
Mego

2

Python, 261 ~ 265 바이트

def f(a,b):
 if a==""or b=="":return b==""
 p=a[0];q=b[0];a=a[1:];b=b[1:]
 if p>q:a+=q+p
 if p<q:b+=p+q
 while p[-1]==q[-1]:
  if len(a)<2 or len(b)<2:return len(b)<2
  v=a[1];w=b[1];p+=a[0:2];q+=b[0:2];a=a[2:];b=b[2:]
  if v>w:a+=q+p
  if v<w:b+=p+q
 return f(a,b)

게시 된대로 이것은 265 바이트이며 Python 2와 Python 3에서 모두 작동합니다. while 루프에서 공백을 단일 탭으로 바꾸면 Python 2에서 4 바이트를 절약 할 수 있습니다.

온라인으로 사용해보십시오


2

하스켈, 372

내 첫 Haskell 프로그램

(나의 첫 기능 프로그래밍이기도하다 ...)

w[]_=False
w _[]=True
w a b=if length j==0 then a>b else w (drop(d$head j)a++fst(head j))(drop(d$head j)b++snd(head j))where j=p a b
d(a,b)=quot(maximum[length a,length b])2
f (Just a)=a
p a b=map f$filter(/=Nothing)[t(a!!x,take(x+1)a,b!!x,take(x+1)b)|x<-[0,2..minimum[length a,length b]-1]]
t(a,b,c,d)=if a==c then Nothing else if a>c then Just(d++b,[])else Just([],b++d)

개선 방법에 대한 팁을 갖고 싶습니다.

용법:

w "D58B35926B92C7C4C7E8D3DAA2" "8E47C38A2DEA43467EB9566B95"
w "669D9D846D4B3BA52452C2EDEB" "E747CA988CC76723935A3B8EA5"
w "5744B95ECDC6D325B28A782A72" "68394D9DA96EBBA8533EE7C6C4"
w "87DB6C7EBC6C8D722389923DC6" "E28435DBEBEA543AA47956594A"
w "589EAB9DCD43E9EC264A5726A8" "48DC2577BD68AB9335263B7EC4"
w "E3698D7C46A739AE5BE2C49286" "BB54B7D78954ED526A83C3CDA2"
w "32298B5E785DC394467D5C9CB2" "5ED6AAD93E873EA628B6A4BC47"
w "B4AB985B34756C624C92DE5E97" "3EDD5BA2A68397C26CE837AD48"
w "9A6D9A5457BB6ACBC5E8D7D4A9" "73E658CE2C3E289B837422D463"
w "96E64D226BC8B7D6C5974BAE32" "58DC7A8C543E35978AEBA34D29"
w "C2978A35E74D7652BA9762C458" "9A9BB332BE8C8DD44CE3DE66A5"
w "BEDB44E947693CD284923CEA82" "8CC3B75756255A683A6AB9E7DD"
w "EEDDCCBBAA8877665544332299" "EEDDCCBBAA9988776655443322"
w "EEDDCCBBAA9988776655443322" "DDCCBBAA9988776655443E3E22"

하스켈은 빠르다 ... :)

real    0m0.039s
user    0m0.022s
sys     0m0.005s
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.