Guest User

AOC 2021 Day20 iterative c#

a guest
Dec 29th, 2021
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.37 KB | None | 0 0
  1. using System;
  2. using System.Numerics;
  3. using System.Linq;
  4. using System.Collections.Generic;
  5. using System.Diagnostics;
  6. using System.IO;
  7.  
  8. namespace AOC2021
  9. {
  10.     public class Day20 : ISolvable
  11.     {
  12.  
  13.         public Day20(string[] lines)
  14.         {
  15.             Algo = lines[0];
  16.             var length = lines[2].Length;
  17.             Grid = new int[length, length];
  18.  
  19.  
  20.             for (int i = 0; i < length; i++)
  21.             {
  22.                 for (int j = 0; j < length; j++)
  23.                 {
  24.                     Grid[i, j] = lines[i + 2][j] == '#' ? 1 : 0;
  25.                 }
  26.             }
  27.         }
  28.  
  29.         private int[,] Solve(int n)
  30.         {
  31.             var grid = Grid;
  32.             while (n > 0)
  33.             {
  34.                 Console.WriteLine(new string('-', 80));
  35.                 Console.WriteLine("Initial State:");
  36.                 Utilities.PrintGridNumbers(grid);
  37.                 grid = Add_Border(grid, 2, n % 2 == 0);
  38.                 Console.WriteLine("After padding:");
  39.                 Utilities.PrintGridNumbers(grid);
  40.                 var next_grid = (int[,])grid.Clone();
  41.                 for (int i = 1; i < grid.GetLength(0) - 1; i++)
  42.                 {
  43.                     for (int j = 1; j < grid.GetLength(1) - 1; j++)
  44.                     {
  45.                         var binary = grid[i - 1, j - 1].ToString() + grid[i - 1, j].ToString() + grid[i - 1, j + 1].ToString() +
  46.                                      grid[i, j - 1].ToString() + grid[i, j].ToString() + grid[i, j + 1].ToString() +
  47.                                      grid[i + 1, j - 1].ToString() + grid[i + 1, j].ToString() + grid[i + 1, j + 1].ToString();
  48.                         next_grid[i, j] = Algo[Convert.ToInt32(binary, 2)] == '#' ? 1 : 0;
  49.                     }
  50.                 }
  51.                 grid = next_grid;
  52.                 Console.WriteLine("After Algo:");
  53.                 Utilities.PrintGridNumbers(grid);
  54.                 n--;
  55.             }
  56.             return grid;
  57.         }
  58.  
  59.         /**
  60.          *
  61.          * 12
  62.          * 34
  63.          *
  64.          * -> 1
  65.          *
  66.          * 0000
  67.          * 0120
  68.          * 0340
  69.          * 0000
  70.          * */
  71.  
  72.         private int[,] Add_Border(int[,] grid, int border_size, bool is_odd)
  73.         {
  74.             var length = grid.GetLength(0);
  75.             var new_grid = new int[length + 2 * border_size, length + 2 * border_size];
  76.  
  77.             for (int i = 0; i < length + 2 * border_size; i++)
  78.             {
  79.                 for (int j = 0; j < length + 2 * border_size; j++)
  80.                 {
  81.                     if (i < border_size || j < border_size || i >= border_size + length || j >= border_size + length)
  82.                         new_grid[i, j] = is_odd && Algo[0] == '#' ? 1 : 0;
  83.                     else
  84.                         new_grid[i, j] = grid[i - border_size, j - border_size];
  85.                 }
  86.             }
  87.  
  88.             length += border_size * 2;
  89.  
  90.             return new_grid;
  91.         }
  92.  
  93.         public string Algo { get; }
  94.         public int[,] Grid { get; }
  95.  
  96.         public object SolvePart1()
  97.         {
  98.             var grid = Solve(2);
  99.             return Enumerable.Range(0, grid.GetLength(0)).Select(i => Enumerable.Range(0, grid.GetLength(1)).Select(j => grid[i, j]).Sum()).Sum();
  100.         }
  101.  
  102.         public object SolvePart2()
  103.         {
  104.             throw new NotImplementedException();
  105.         }
  106.  
  107.         static void Main(string[] args)
  108.         {
  109.             var lines = File.ReadAllLines("input.txt");
  110.             var sw = new Stopwatch();
  111.             sw.Start();
  112.             var solver = new Day20(lines);
  113.             sw.Stop();
  114.             var precalc_time = sw.Elapsed;
  115.             Console.WriteLine("Precalculations took: {0}", precalc_time);
  116.  
  117.             sw.Restart();
  118.             var part1_solution = solver.SolvePart1();
  119.             sw.Stop();
  120.             var part1_time = sw.Elapsed;
  121.             Console.WriteLine("{0} Part 1 Solution: < {1} > Took: {2}", solver.GetType().Name, part1_solution, part1_time);
  122.  
  123.             sw.Restart();
  124.             var part2_solution = solver.SolvePart2();
  125.             sw.Stop();
  126.             var part2_time = sw.Elapsed;
  127.             Console.WriteLine("{0} Part 2 Solution: < {1} > Took: {2}", solver.GetType().Name, part2_solution, part2_time);
  128.             Console.WriteLine("Complete runtime: {0}", precalc_time + part2_time + part2_time);
  129.         }
  130.     }
  131. }
  132.  
  133.  
Advertisement
Add Comment
Please, Sign In to add comment