Advertisement
mastersplinter19

AOC2021_04_2

Dec 3rd, 2021
672
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.73 KB | None | 0 0
  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.             if (board.HasWon)
  23.             {
  24.                 continue;
  25.             }
  26.            
  27.             board.MarkBoard(number);
  28.             boardWins = board.BoardWins();
  29.             if (boardWins)
  30.             {
  31.                 winningBoard = board;
  32.                 winningNumber = number;
  33.             }
  34.         }
  35.     }
  36.    
  37.     //boards.Dump();
  38.     //winningBoard.Dump();
  39.    
  40.     var winningSum = 0;
  41.     for (var i = 0; i < 5; i++)
  42.     {
  43.         for (var j = 0; j < 5; j++)
  44.         {
  45.             if (winningBoard.Markers[i,j] == 0)
  46.             {
  47.                 winningSum += winningBoard.Input[i,j];
  48.             }
  49.         }
  50.     }
  51.    
  52.     (winningSum * winningNumber).Dump();
  53. }
  54.  
  55. // Define other methods and classes here
  56. class Board
  57. {
  58.     public int[,] Input;
  59.     public int[,] Markers;
  60.     public int WinIPos = -1;
  61.     public int WinJPos = -1;
  62.     public bool HasWon = false;
  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.                 WinIPos = i;
  107.                 HasWon = true;
  108.                 return true;
  109.             }
  110.         }
  111.  
  112.         // check vertical
  113.         var jMarkers = 0;
  114.         for (var j = 0; j < 5; j++)
  115.         {
  116.             jMarkers = 0;
  117.             for (var i = 0; i < 5; i++)
  118.             {
  119.                 if (Markers[i, j] == 1)
  120.                 {
  121.                     jMarkers++;
  122.                 }
  123.             }
  124.             if (jMarkers == 5)
  125.             {
  126.                 WinJPos = j;
  127.                 HasWon = true;
  128.                 return true;
  129.             }
  130.         }
  131.        
  132.         return false;
  133.     }
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement