Визначте переможця гри Війна


19

Карткова гра Війна цікава тим, що кінцевий результат повністю визначається початковим розташуванням колоди, якщо дотримуються певних правил щодо порядку, в якому карти вибираються з ігрового поля та переміщуються до колод. У цьому виклику будуть лише 2 гравці, які значно спрощують справи.

Гра

  1. Кожному гравцеві роздають колоду з 26 карт.
  2. Кожен гравець розміщує верхню карту в колоді обличчям вгору. Гравець з картою вищого рангу ( Ace > King > Queen > Jack > 10 > 9 > 8 > 7 > 6 > 5 > 4 > 3 > 2) виграє раунд і розміщує їхню карту поверх картки опонента, перевертає їх і додає їх у нижню частину колоди (тому карта їх виграшу знаходиться в нижній частині колоди , а картка програшу іншого гравця знаходиться трохи вище неї). Це робиться, поки у одного з гравців не закінчиться карт.
    • Якщо картки мають рівний ранг, то кожен гравець розміщує дві топ-карти своєї колоди обличчям вгору на попередній картці (так що карта, яка знаходилася на вершині колоди, є другою картою в стеку, а карта, яка була другою зверху, знаходиться зверху). Потім порівнюються ранги (верхньої картки кожної стеки), і переможець розміщує всю свою групу поверх усієї стеки програвача, перевертає стек догори дном і ставить її на нижню частину колоди. Якщо є ще одна нічия, більше карт буде грати так само, доки не буде обраний переможець або у одного гравця не закінчиться карт.

Якщо в будь-який момент одному з гравців потрібно витягнути карту зі своєї колоди, але їх колода порожня, він негайно програє гру.

Змагання

Враховуючи два списки карт у колодах гравців, у будь-якому зручному форматі виведіть триєдине значення, якщо програвач перемагає, та значення фальси, якщо переможе програвач 2.

Для зручності 10 картка буде представлена символом a T, а лицькі картки будуть скорочені ( Ace -> A, King -> K, Queen -> Q, Jack -> J), так що всі картки мають один символ. Альтернативно, ранги можуть бути представлені десятковими цілими числами 2-14 ( Jack -> 11, Queen -> 12, King -> 13, Ace -> 14) або шістнадцятковими цифрами 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 Який колод карт має 1 ?
Suever

@Suever Вибачте, я не думав надто важко, я просто вибрав перші три різні номери, які прийшли мені в голову. Просто виберіть будь-які три картки, де перша найнижча.
Ніл

@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інакше. Приймає порівнянні ітератори, як правило, масиви цілих чисел або рядків шістнадцяткових символів. Відповідь складається з понад 22% .символів, що, на мою думку, має бути для мене рекордом.


Я, здається, не отримую правильних результатів, коли спробую це на тестах. Дивіться jsfiddle.net/xbq5xzco
Чак Морріс

@ChuckMorris Вибачте за це, я пропустив одне з правил. Слід виправити зараз.
Ніл

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

Це рішення є теоретично обґрунтованим, але вимагає збільшити максимальну глибину рекурсії пітона за замовчуванням для деяких тестових випадків.

Друге рішення на 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)

Редагувати: Рішення без вольф 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 запустить перше рішення добре (глибина рекурсії за замовчуванням необмежена), я хочу сказати, що перше рішення є дійсним.
Мего

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. Ви можете зберегти 4 байти в Python 2, замінивши пробіли однією вкладкою в циклі while.

Спробуйте в Інтернеті


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.