using System.Collections;
using System.Collections.Generic;
public static class Program
public static void Main()
var output = input.ReadLines()
.Select(line=> Hand.Parse(line))
.Select((h,index)=> h.Bid*(index+1))
Console.WriteLine($"Part 1: {output}");
output = input.ReadLines()
.Select(line=> Hand2.Parse(line))
.Select((h,index)=> h.Bid*(index+1))
Console.WriteLine($"Part 2: {output}");
public static IEnumerable<string> ReadLines(this string input)
var sr=new StringReader(input);
while((line=sr.ReadLine())!=null)
if (string.IsNullOrWhiteSpace(line)) continue;
public static Hand Parse(string line)
var cards = new List<long>();
var card = GetCardIndex(line[i]);
Type = GetHandType(cards),
Bid = long.Parse(line.Substring(6)),
private static long GetCardIndex(char label)
if (label=='A') return 12;
if (label=='K') return 11;
if (label=='Q') return 10;
if (label=='J') return 9;
if (label=='T') return 8;
private static HandType GetHandType(IEnumerable<long> cards)
var freqs = cards.GroupBy(id => id).Select(g=>g.Count()).OrderByDescending(f=>f).ToArray();
if (freqs[0] == 5) return HandType.FiveOfAKind;
if (freqs[0] == 4) return HandType.FourOfAKind;
if (freqs[0] == 3 && freqs[1] == 2 ) return HandType.FullHouse;
if (freqs[0] == 3 ) return HandType.ThreeOfAKind;
if (freqs[0] == 2 && freqs[1] == 2 ) return HandType.TwoPair;
if (freqs[0] == 2 ) return HandType.OnePair;
return HandType.HighCard;
public static Hand2 Parse(string line)
var cards = new List<long>();
var card = GetCardIndex(line[i]);
Type = GetHandType(cards),
Bid = long.Parse(line.Substring(6)),
private static long GetCardIndex(char label)
if (label=='A') return 12;
if (label=='K') return 11;
if (label=='Q') return 10;
if (label=='J') return 0;
if (label=='T') return 8+1;
private static HandType GetHandType(IEnumerable<long> cards)
var jFreq = cards.Count(id=>id==0);
var freqs = cards.Where(id=>id>0).GroupBy(id => id).Select(g=>g.Count()).OrderByDescending(f=>f).ToArray();
var f0=(freqs.Length>0?freqs[0]:0)+jFreq;
var f1=(freqs.Length>1?freqs[1]:0);
if (f0 == 5) return HandType.FiveOfAKind;
if (f0 == 4) return HandType.FourOfAKind;
if (f0 == 3 && f1 == 2 ) return HandType.FullHouse;
if (f0 == 3 ) return HandType.ThreeOfAKind;
if (f0 == 2 && f1 == 2 ) return HandType.TwoPair;
if (f0 == 2 ) return HandType.OnePair;
return HandType.HighCard;
private static string input2 = @"
private static string input = @"