Skip to content

Instantly share code, notes, and snippets.

@En3Tho
Created October 13, 2022 15:18
Show Gist options
  • Save En3Tho/3d00041f0d0dc11bc2e7f91181bd1d48 to your computer and use it in GitHub Desktop.
Save En3Tho/3d00041f0d0dc11bc2e7f91181bd1d48 to your computer and use it in GitHub Desktop.
T[] Concat<T>(IEnumerable<T> first, params IEnumerable<T>[] others)
{
foreach (var other in others)
first = first.Concat(other);
return first.ToArray();
}
Player CreatePlayer()
{
IEnumerable<int> ReadPlayerDeck()
{
var x = int.Parse(Console.ReadLine()!);
for (var i = 0; i <= x; i++)
{
yield return Console.ReadLine()!.Trim('D', 'H', 'C', 'S') switch
{
['J', ..] => 11,
['Q', ..] => 12,
['K', ..] => 13,
['A', ..] => 14,
var card => int.Parse(card)
};
}
}
return new(ReadPlayerDeck().ToArray(), Array.Empty<int>());
}
string Round(int n, Player player1, Player player2)
{
switch (player1.Deck, player2.Deck)
{
case ([], []): return "PAT";
case (_, []): return $"1 {n}";
case ([], _): return $"2 {n}";
case ([var card1, ..var rest1], [var card2, ..var rest2]):
{
var stack1 = Concat(player1.WarStack, new[] { card1 });
var stack2 = Concat(player2.WarStack, new[] { card2 });
if (card1 > card2)
{
return Round(
n + 1,
new(Deck: Concat(rest1, stack1, stack2), WarStack: Array.Empty<int>()),
new(Deck: rest2, WarStack: Array.Empty<int>()));
}
if (card2 > card1)
{
return Round(
n + 1,
new(Deck: rest1, WarStack: Array.Empty<int>()),
new(Deck: Concat(rest2, stack1, stack2), WarStack: Array.Empty<int>()));
}
switch (rest1, rest2)
{
case ([var p11, var p12, var p13, ..var rest12], [var p21, var p22, var p23, ..var rest22]):
{
if (rest12 is [] || rest22 is [])
return "PAT";
return Round(n,
new(Deck: rest1, WarStack: Concat(player1.WarStack, new[] { card1, p11, p12, p13 })),
new(Deck: rest2, WarStack: Concat(player2.WarStack, new[] { card2, p21, p22, p23 }))
);
}
default:
return "PAT";
}
}
default:
return "PAT";
}
}
Console.Write(Round(0, CreatePlayer(), CreatePlayer()));
record Player(int[] Deck, int[] WarStack);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment