ScratchParser.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. namespace Day4;
  2. public class ScratchParser
  3. {
  4. public IEnumerable<ScratchCard> Parse(string inputFile)
  5. {
  6. using var reader = File.OpenText(inputFile);
  7. while (!reader.EndOfStream)
  8. {
  9. var line = reader.ReadLine()!;
  10. var cardParts = line.Split(':', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
  11. if (cardParts.Length != 2)
  12. {
  13. throw new Exception($"Expecting a single colon in each line but got: {line}");
  14. }
  15. var id = int.Parse(cardParts[0].Substring(5));
  16. var card = new ScratchCard(id);
  17. cardParts = cardParts[1].Split('|', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
  18. if (cardParts.Length != 2)
  19. {
  20. throw new Exception($"Expecting a single pipe in each line but got: {line}");
  21. }
  22. foreach (var numStr in cardParts[0].Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries))
  23. {
  24. var num = int.Parse(numStr);
  25. if (card.Winning.Contains(num))
  26. {
  27. throw new Exception($"Unexpected duplicate in winning numbers in card {id}: {cardParts[0]}");
  28. }
  29. card.Winning.Add(num);
  30. }
  31. foreach (var numStr in cardParts[1].Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries))
  32. {
  33. var num = int.Parse(numStr);
  34. if (card.Draw.Contains(num))
  35. {
  36. throw new Exception($"Unexpected duplicate in winning numbers in card {id}: {cardParts[0]}");
  37. }
  38. card.Draw.Add(num);
  39. }
  40. yield return card;
  41. }
  42. }
  43. }