|
|
@@ -14,28 +14,74 @@ public class Hand : IComparable<Hand>
|
|
|
};
|
|
|
|
|
|
private static readonly string CardOrder = "23456789TJQKA";
|
|
|
+ private static readonly string CardOrderWild = "J23456789TQKA";
|
|
|
+
|
|
|
+ private readonly bool _jacksAreWild;
|
|
|
|
|
|
public string Cards { get; }
|
|
|
- public int Type { get; }
|
|
|
+ public int Type { get; set; }
|
|
|
public int Bid { get; }
|
|
|
|
|
|
public Hand(string cards, int bid)
|
|
|
+ : this(cards, bid, false)
|
|
|
+ {
|
|
|
+ }
|
|
|
+
|
|
|
+ private Hand(string cards, int bid, bool jacksAreWild)
|
|
|
{
|
|
|
+ _jacksAreWild = jacksAreWild;
|
|
|
Cards = cards;
|
|
|
Bid = bid;
|
|
|
Type = GetHandType();
|
|
|
}
|
|
|
|
|
|
+ public Hand Recalculate(bool jacksAreWild)
|
|
|
+ {
|
|
|
+ return new Hand(Cards, Bid, jacksAreWild);
|
|
|
+ }
|
|
|
+
|
|
|
private int GetHandType()
|
|
|
{
|
|
|
- var set = new Dictionary<char, int>();
|
|
|
- foreach (var c in Cards)
|
|
|
+ int[] counts;
|
|
|
+
|
|
|
+ if (_jacksAreWild)
|
|
|
{
|
|
|
- set.TryAdd(c, 0);
|
|
|
- set[c]++;
|
|
|
+ var set = new Dictionary<char, int>();
|
|
|
+ var wild = 0;
|
|
|
+ foreach (var c in Cards)
|
|
|
+ {
|
|
|
+ if (c == 'J')
|
|
|
+ {
|
|
|
+ wild++;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ set.TryAdd(c, 0);
|
|
|
+ set[c]++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ counts = set.Values.OrderDescending().ToArray();
|
|
|
+ if (counts.Length > 0)
|
|
|
+ {
|
|
|
+ counts[0] += wild;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ counts = new int[] { wild };
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ var set = new Dictionary<char, int>();
|
|
|
+ foreach (var c in Cards)
|
|
|
+ {
|
|
|
+ set.TryAdd(c, 0);
|
|
|
+ set[c]++;
|
|
|
+ }
|
|
|
+
|
|
|
+ counts = set.Values.OrderDescending().ToArray();
|
|
|
}
|
|
|
-
|
|
|
- var counts = set.Values.OrderDescending().ToArray();
|
|
|
|
|
|
return Types.First(kvp => kvp.Key(counts)).Value;
|
|
|
}
|
|
|
@@ -55,14 +101,14 @@ public class Hand : IComparable<Hand>
|
|
|
return cardCmp;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- throw new Exception("Not expecting equal hands");
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
private int CompareCard(char left, char right)
|
|
|
{
|
|
|
- var vLeft = CardOrder.IndexOf(left);
|
|
|
- var vRight = CardOrder.IndexOf(right);
|
|
|
+ var vLeft = (_jacksAreWild ? CardOrderWild : CardOrder).IndexOf(left);
|
|
|
+ var vRight = (_jacksAreWild ? CardOrderWild : CardOrder).IndexOf(right);
|
|
|
|
|
|
return vLeft.CompareTo(vRight);
|
|
|
}
|