Ver Fonte

Day 7 part 2

Lukas Angerer há 2 anos atrás
pai
commit
94d0ef6b83
2 ficheiros alterados com 74 adições e 11 exclusões
  1. 57 11
      Day7/Hand.cs
  2. 17 0
      Day7/Program.cs

+ 57 - 11
Day7/Hand.cs

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

+ 17 - 0
Day7/Program.cs

@@ -24,4 +24,21 @@ for (var rank = 1; rank <= hands.Length; rank++)
 Console.WriteLine();
 Console.WriteLine($"Total: {sum}");
 
+Console.WriteLine();
+hands = hands.Select(h => h.Recalculate(true)).Order().ToArray();
+sum = 0;
+
+for (var rank = 1; rank <= hands.Length; rank++)
+{
+    var h = hands[rank - 1];
+    var winnings = rank * h.Bid;
+    Console.WriteLine($"{h.Cards} {h.Bid} {h.Type} = {winnings}");
+
+    sum += winnings;
+}
+
+Console.WriteLine();
+Console.WriteLine($"Total: {sum}");
+
+
 return 0;