戦争ゲームの勝者を決定する


19

カードゲームの戦争は、カードがプレイフィールドからピックアップされてデッキに移動される順序について特定のルールに従う限り、最終結果がデッキの初期配置によって完全に決定されるという点で興味深いです。この課題では、2人のプレイヤーのみが存在し、物事を大幅に簡素化します。

ゲーム

  1. 各プレイヤーには26枚のカードが配られます。
  2. 各プレイヤーはデッキの一番上にあるカードを表向きに置きます。上位のカード(Ace > King > Queen > Jack > 10 > 9 > 8 > 7 > 6 > 5 > 4 > 3 > 2)を持つプレイヤーがラウンドに勝ち、相手のカードの上にカードを置き、裏返して、デッキの一番下に追加します(勝ったカードはデッキの一番下になります) 、他のプレイヤーの負けているカードはそのすぐ上にあります)。これは、プレイヤーの一人がカードを使い果たすまで行われます。
    • カードのランクが等しい場合、各プレイヤーは自分のデッキの一番上から2枚のカードを前のカードの上に表向きに配置します(そのため、デッキの上にあったカードはスタックの2枚目のカードになり、上から2番目のカードが上にあります)。次に、(各スタックの一番上のカードの)ランクが再び比較され、勝者は敗者のスタック全体の上にスタック全体を置き、スタックを上下逆にして、デッキの一番下に置きます。別のタイがある場合、勝者が選択されるか、1人のプレイヤーがカードを使い果たすまで、同じ方法でより多くのカードがプレイされます。

いずれかのプレイヤーがデッキからカードを引く必要があるが、デッキが空の場合、すぐにゲームに負けます。

チャレンジ

プレイヤーのデッキにある2種類のカードのリストを便利な形式で指定すると、プレイヤー1が勝った場合は真実の値を、プレイヤー2が勝った場合は偽の値を出力します。

便宜上、10枚のカードはで表され、すべてのカードの長さが1文字に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。スーツは重要ではないため、スーツの情報は提供されません。

  • すべてのゲームはある時点で終了すると仮定することができ(非常に長い時間がかかる場合があります)、あるプレイヤーは常に他のプレイヤーより先にカードを使い果たします。
  • 各プレイヤーは同時にカードを置き、一度に1枚のカードを置くので、どのプレイヤーが最初にカードを使い果たしたかについてあいまいさはありません。

テストケース

テストケース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カードのデッキには何があり1ますか?
Suever

@Suever申し訳ありませんが、私は考えすぎず、頭に浮かんだ最初の3つの数字を選んだだけです。最初のカードが最も低いカードを3枚選んでください。
ニール

@Neilただあなたに苦労を与えます:)ポイントをとった!
Suever

回答:


3

JavaScript(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%を超える.キャラクターで構成されており、これは私にとって記録に違いないと思います。


テストケースでこれを試しても、正しい結果が得られないようです。参照してくださいjsfiddle.net/xbq5xzco
チャック・モリス

@ChuckMorris申し訳ありませんが、ルールの1つを見落としていました。今すぐ修正する必要があります。
ニール

@Megoもう一度お試しください。更新しました。
ニール

すべてがチェックアウトされたようです。
メゴ

OK、今私は感銘を受けました!
チャックモリス

4

Python、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最大再帰深度を増やす必要があります。

2番目のソリューションは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ループでスペースを1つのタブに置き換えることで、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"

Haskellは速い... :)

real    0m0.039s
user    0m0.022s
sys     0m0.005s
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.