private static bool GetWinner(HandPattern p1, HandPattern p2) { if (p1.Pattern != p2.Pattern) { return(p1.Pattern > p2.Pattern); } else { for (int i = 0; i < 5; i++) { if (p1.Max[i] != p2.Max[i]) { return(p1.Max[i] > p2.Max[i]); } } return(false); } }
private static HandPattern GetHandPattern(IEnumerable <string> pokers) { HandPattern result = new HandPattern(); int[] values = pokers.Select(p => { string value = p[0].ToString(); if (!int.TryParse(value, out int count)) { count = value switch { "T" => 10, "J" => 11, "Q" => 12, "K" => 13, "A" => 14, _ => 0, }; } return(count); } ).ToArray(); Array.Sort(values); values = values.Reverse().ToArray(); if (pokers.Select(p => p[1]).Distinct().Count() == 1) { if (values[0] - values[4] == 4) { if (values[0] == 14) { result.Pattern = Pattern.RoyalFlush; } else { result.Pattern = Pattern.StraightFlush; } } else { result.Pattern = Pattern.Flush; } result.Max = values; } else { if (values.Distinct().Count() == 5) { if (values[0] - values[4] == 4) { result.Pattern = Pattern.Straight; result.Max = values; } else { result.Pattern = Pattern.HighCard; result.Max = values; } } else if (values.Distinct().Count() == 4) { result.Pattern = Pattern.OnePair; int[] four = values.Distinct().ToArray(); int pair = values.Sum() - four.Sum(); result.Max[0] = pair; int[] three = values.Where(j => j != pair).ToArray(); result.Max[1] = three[0]; result.Max[2] = three[1]; result.Max[3] = three[2]; } else if (values.Distinct().Count() == 3) { if ((values[0] == values[1] && values[1] == values[2]) || (values[1] == values[2] && values[2] == values[3]) || (values[2] == values[3] && values[3] == values[4])) { result.Pattern = Pattern.ThreeKind; result.Max[0] = values[2]; int[] tmp = values.Where(j => j != result.Max[0]).ToArray(); result.Max[1] = Math.Max(tmp[0], tmp[1]); result.Max[2] = Math.Min(tmp[0], tmp[1]); } else { result.Pattern = Pattern.TwoPairs; int[] dis = values.Distinct().ToArray(); List <int> two = new List <int>(); for (int i = 0; i < dis.Length; i++) { if (values.Where(j => j == dis[i]).Count() == 1) { result.Max[2] = dis[i]; } else { two.Add(dis[i]); } } result.Max[0] = Math.Max(two[0], two[1]); result.Max[1] = Math.Min(two[0], two[1]); } } else if (values.Distinct().Count() == 2) { if (values[1] == values[3]) { result.Pattern = Pattern.FourKind; result.Max[0] = values[1]; result.Max[1] = values[1] == values[0] ? values[4] : values[0]; } else { result.Pattern = Pattern.FullHouse; result.Max[0] = values[2]; result.Max[1] = values[2] == values[0] ? values[4] : values[0]; } } } return(result); }