Skip to content

Instantly share code, notes, and snippets.

@En3Tho
Last active October 10, 2022 09:48
Show Gist options
  • Save En3Tho/65df73dd57d0d41b67e812671af7b3a2 to your computer and use it in GitHub Desktop.
Save En3Tho/65df73dd57d0d41b67e812671af7b3a2 to your computer and use it in GitHub Desktop.
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