using System.Collections.Generic;
public class ScratchcardCalculator
public static void Main()
string scratchcardsInput = @"
Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53
Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19
Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1
Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83
Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36
Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11
scratchcardsInput = scratchcardsInput.Trim();
string[] scratchcards = scratchcardsInput.Split('\n', StringSplitOptions.RemoveEmptyEntries);
int totalPoints = CalculateTotalPoints(scratchcards);
Console.WriteLine($"Total Points: {totalPoints}");
catch (FormatException ex)
Console.WriteLine($"Error: {ex.Message}");
public static int CalculateTotalPoints(string[] scratchcards)
foreach (string scratchcard in scratchcards)
string[] parts = scratchcard.Split('|');
string cardNumberPrefix = parts[0].Split(':')[0].Trim();
int[] winningNumbers = ParseNumbers(parts[0].Replace(cardNumberPrefix + ":", ""));
int[] playerNumbers = ParseNumbers(parts[1]);
int cardPoints = CalculateCardPoints(winningNumbers, playerNumbers);
totalPoints += cardPoints;
public static int[] ParseNumbers(string numbersString)
string[] numberTokens = numbersString.Split(' ');
.Where(token => !string.IsNullOrWhiteSpace(token))
.Select(num => int.TryParse(num, out var result) ? result : throw new FormatException($"Invalid number format: {num}"))
public static int CalculateCardPoints(int[] winningNumbers, int[] playerNumbers)
HashSet<int> matchedNumbers = new HashSet<int>();
foreach (int number in playerNumbers)
if (winningNumbers.Contains(number) && !matchedNumbers.Contains(number))
matchedNumbers.Add(number);
int count = matchedNumbers.Count;
cardPoints = count > 0 ? (int)Math.Pow(2, count - 1) : 0;