namespace Day4; public class ScratchParser { public IEnumerable Parse(string inputFile) { using var reader = File.OpenText(inputFile); while (!reader.EndOfStream) { var line = reader.ReadLine()!; var cardParts = line.Split(':', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); if (cardParts.Length != 2) { throw new Exception($"Expecting a single colon in each line but got: {line}"); } var id = int.Parse(cardParts[0].Substring(5)); var card = new ScratchCard(id); cardParts = cardParts[1].Split('|', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); if (cardParts.Length != 2) { throw new Exception($"Expecting a single pipe in each line but got: {line}"); } foreach (var numStr in cardParts[0].Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)) { var num = int.Parse(numStr); if (card.Winning.Contains(num)) { throw new Exception($"Unexpected duplicate in winning numbers in card {id}: {cardParts[0]}"); } card.Winning.Add(num); } foreach (var numStr in cardParts[1].Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)) { var num = int.Parse(numStr); if (card.Draw.Contains(num)) { throw new Exception($"Unexpected duplicate in winning numbers in card {id}: {cardParts[0]}"); } card.Draw.Add(num); } yield return card; } } }