mastersplinter19

AOC2021_04_1

Dec 3rd, 2021
649
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. void Main()
  2. {
  3.     var input = File.ReadAllLines(@"C:\Users\dostj\Documents\LINQPad Queries\AdventOfCode\2021\04.txt");
  4.     //input = File.ReadAllLines(@"C:\Users\dostj\Documents\LINQPad Queries\AdventOfCode\2021\04_test.txt");
  5.  
  6.     var numbers = input[0].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(n => int.Parse(n)).ToList();
  7.     var boardInput = input.ToList().GetRange(1, input.Length - 1);
  8.     var boards = new List<Board>();
  9.     for (var i = 0; i < boardInput.Count; i += 6)
  10.     {
  11.         boards.Add(new Board(boardInput.GetRange(i + 1, 5)));
  12.     }
  13.    
  14.     Board winningBoard = null;
  15.     int winningNumber = -1;
  16.    
  17.     foreach (var number in numbers)
  18.     {
  19.         var boardWins = false;
  20.         foreach (var board in boards)
  21.         {
  22.             board.MarkBoard(number);
  23.             boardWins = board.BoardWins();
  24.             if (boardWins)
  25.             {
  26.                 winningBoard = board;
  27.                 winningNumber = number;
  28.                 break;
  29.             }
  30.         }
  31.        
  32.         if (boardWins)
  33.         {
  34.             break;
  35.         }
  36.     }
  37.    
  38.     //boards.Dump();
  39.     //winningBoard.Dump();
  40.    
  41.     var winningSum = 0;
  42.     for (var i = 0; i < 5; i++)
  43.     {
  44.         for (var j = 0; j < 5; j++)
  45.         {
  46.             if (winningBoard.Markers[i,j] == 0)
  47.             {
  48.                 winningSum += winningBoard.Input[i,j];
  49.             }
  50.         }
  51.     }
  52.    
  53.     (winningSum * winningNumber).Dump();
  54. }
  55.  
  56. // Define other methods and classes here
  57. class Board
  58. {
  59.     public int[,] Input;
  60.     public int[,] Markers;
  61.     public int WinIPos = -1;
  62.     public int WinJPos = -1;
  63.     public Dictionary<int, Tuple<int, int>> PositionMap = new Dictionary<int, System.Tuple<int, int>>();
  64.    
  65.     public Board(List<string> input)
  66.     {
  67.         Input = new int[5,5];
  68.         Markers = new int[5,5];
  69.         for(var i = 0; i < 5; i++)
  70.         {
  71.             var numbers = input[i].Split(new char[] { ' '}, StringSplitOptions.RemoveEmptyEntries).Select(e => int.Parse(e)).ToArray();
  72.             for (var j = 0; j < 5; j++)
  73.             {
  74.                 Markers[i, j] = 0;
  75.                 Input[i, j] = numbers[j];
  76.                 PositionMap.Add(numbers[j], new Tuple<int, int>(i, j));
  77.             }
  78.         }
  79.     }
  80.    
  81.     public void MarkBoard(int number)
  82.     {
  83.         if (PositionMap.ContainsKey(number))
  84.         {
  85.             var position = PositionMap[number];
  86.             Markers[position.Item1, position.Item2] = 1;
  87.         }
  88.     }
  89.    
  90.     public bool BoardWins()
  91.     {
  92.         // check horizontal
  93.         var iMarkers = 0;
  94.         for (var i = 0; i < 5; i++)
  95.         {
  96.             iMarkers = 0;
  97.             for (var j = 0; j < 5; j++)
  98.             {
  99.                 if (Markers[i,j] == 1)
  100.                 {
  101.                     iMarkers++;
  102.                 }
  103.             }
  104.             if (iMarkers == 5)
  105.             {
  106.                 return true;
  107.                 WinIPos = i;
  108.             }
  109.         }
  110.  
  111.         // check vertical
  112.         var jMarkers = 0;
  113.         for (var j = 0; j < 5; j++)
  114.         {
  115.             jMarkers = 0;
  116.             for (var i = 0; i < 5; i++)
  117.             {
  118.                 if (Markers[i, j] == 1)
  119.                 {
  120.                     jMarkers++;
  121.                 }
  122.             }
  123.             if (jMarkers == 5)
  124.             {
  125.                 return true;
  126.                 WinJPos = j;
  127.             }
  128.         }
  129.        
  130.         return false;
  131.     }
  132. }
RAW Paste Data