Last active
October 10, 2022 09:48
-
-
Save En3Tho/65df73dd57d0d41b67e812671af7b3a2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
open System | |
type Player = { | |
Deck: int list | |
WarStack: int list | |
} | |
let createPlayer() = | |
let deck = seq { | |
let n = int(Console.In.ReadLine()) | |
for i in 0 .. n - 1 do | |
let card = Console.In.ReadLine().Trim([|'D'; 'H'; 'C'; 'S'|]) // ignore suit | |
match card[0] with | |
| 'J' -> 11 | |
| 'Q' -> 12 | |
| 'K' -> 13 | |
| 'A' -> 14 | |
| _ -> Int32.Parse(card) | |
} | |
{ | |
Deck = deck |> Seq.toList | |
WarStack = [] | |
} | |
let rec round n p1 p2 = | |
match p1.Deck, p2.Deck with | |
| [], [] -> "PAT" | |
| _, [] -> $"1 {n}" | |
| [], _ -> $"2 {n}" | |
| card1 :: rest1, card2 :: rest2 -> | |
let stack1 = p1.WarStack @ [card1] | |
let stack2 = p2.WarStack @ [card2] | |
if card1 > card2 then | |
let p1 = { p1 with | |
Deck = rest1 @ stack1 @ stack2 | |
WarStack = [] | |
} | |
let p2 = { p2 with | |
Deck = rest2 | |
WarStack = [] | |
} | |
round (n + 1) p1 p2 | |
elif card2 > card1 then | |
let p2 = { p2 with | |
Deck = rest2 @ stack1 @ stack2 | |
WarStack = [] | |
} | |
let p1 = { p1 with | |
Deck = rest1 | |
WarStack = [] | |
} | |
round (n + 1) p1 p2 | |
else | |
match rest1, rest2 with | |
| p11 :: p12 :: p13 :: rest1, p21 :: p22 :: p23 :: rest2 -> | |
if rest1 = [] || rest2 = [] then | |
"PAT" | |
else | |
let p1 = { p1 with | |
Deck = rest1 | |
WarStack = p1.WarStack @ [card1; p11; p12; p13] | |
} | |
let p2 = { p2 with | |
Deck = rest2 | |
WarStack = p2.WarStack @ [card2; p21; p22; p23] | |
} | |
round n p1 p2 | |
| _ -> | |
"PAT" | |
(createPlayer(), createPlayer()) | |
||> round 0 | |
|> printfn "%s" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment