Advertisement
Guest User

Untitled

a guest
Dec 14th, 2020
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.87 KB | None | 0 0
  1. namespace Aoc2020.Day14
  2. {
  3.     using System;
  4.     using System.Collections.Generic;
  5.     using System.Linq;
  6.     using System.Text;
  7.  
  8.     public class Day14 : IDay
  9.     {
  10.         public string ExecutePart1(string input)
  11.         {
  12.             var lines = input.ToLines();
  13.             var mask = new string('X', 36);
  14.             var memory = new Dictionary<long, long>();
  15.             foreach (var line in lines)
  16.             {
  17.                 if (line.Contains('X'))
  18.                 {
  19.                     mask = line.Substring(7);
  20.                 }
  21.                 else
  22.                 {
  23.                     var parts = line.Split("] = ");
  24.                     var memLoc = long.Parse(parts[0].Substring(4));
  25.                     var value = parts[1];
  26.                     var result = this.GetMaskedResult(mask, long.Parse(value));
  27.                     memory[memLoc] = result;
  28.                 }
  29.             }
  30.  
  31.             var ans = memory.Sum(x => x.Value);
  32.             return ans.ToString();
  33.         }
  34.  
  35.         public long GetMaskedResult(string mask, long value)
  36.         {
  37.             var result = new StringBuilder(new string('.', 36));
  38.             var valueString = this.LongToBinaryString(value);
  39.             for (int i = 0; i < mask.Length; i++)
  40.             {
  41.                 if (mask[i] == 'X')
  42.                 {
  43.                     result[i] = valueString[i];
  44.                 }
  45.                 else
  46.                 {
  47.                     result[i] = mask[i];
  48.                 }
  49.             }
  50.  
  51.             return this.BinaryStringToLong(result.ToString());
  52.         }
  53.  
  54.         public string LongToBinaryString(long value)
  55.         {
  56.             return Convert.ToString(value, 2).PadLeft(36, '0');
  57.         }
  58.  
  59.         public long BinaryStringToLong(string value)
  60.         {
  61.             return Convert.ToInt64(value, 2);
  62.         }
  63.  
  64.         public List<string> V2MaskToV1Masks(string v2mask)
  65.         {
  66.             var v1masks = new List<string>();
  67.             var xcount = v2mask.Count(x => x == 'X');
  68.  
  69.             for (int i = 0; i < Math.Pow(2, xcount); i++)
  70.             {
  71.                 var binaryString = Convert.ToString(i, 2).PadLeft(xcount, '0');
  72.                 var v1mask = new StringBuilder(new string('.', 36));
  73.                 var bCount = 0;
  74.  
  75.                 for (int j = 0; j < v2mask.Length; j++)
  76.                 {
  77.                     if (v2mask[j] == '0')
  78.                     {
  79.                         v1mask[j] = 'X';
  80.                     }
  81.  
  82.                     if (v2mask[j] == '1')
  83.                     {
  84.                         v1mask[j] = '1';
  85.                     }
  86.  
  87.                     if (v2mask[j] == 'X')
  88.                     {
  89.                         v1mask[j] = binaryString[bCount];
  90.                         bCount++;
  91.                     }
  92.                 }
  93.  
  94.                 v1masks.Add(v1mask.ToString());
  95.             }
  96.  
  97.             return v1masks;
  98.         }
  99.  
  100.         public string ExecutePart2(string input)
  101.         {
  102.             var lines = input.ToLines();
  103.             var masks = new List<string>();
  104.             var memory = new Dictionary<long, long>();
  105.             foreach (var line in lines)
  106.             {
  107.                 if (line.Contains('X'))
  108.                 {
  109.                     masks = this.V2MaskToV1Masks(line.Substring(7));
  110.                 }
  111.                 else
  112.                 {
  113.                     var parts = line.Split("] = ");
  114.                     var memLoc = long.Parse(parts[0].Substring(4));
  115.                     var value = long.Parse(parts[1]);
  116.                     foreach (var mask in masks)
  117.                     {
  118.                         var result = this.GetMaskedResult(mask, memLoc);
  119.                         memory[result] = value;
  120.                     }
  121.                 }
  122.             }
  123.  
  124.             var ans = memory.Sum(x => x.Value);
  125.             return ans.ToString();
  126.         }
  127.     }
  128. }
  129.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement