Advertisement
Guest User

Untitled

a guest
Dec 7th, 2019
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.48 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Threading.Tasks;
  7. using System.Threading.Tasks.Dataflow;
  8.  
  9. namespace AdventOfCode
  10. {
  11.     internal static class Day7
  12.     {
  13.         public static async Task SolveAsync()
  14.         {
  15.             int[] program = File.ReadAllText("day7.txt").Split(',').Select(int.Parse).ToArray();
  16.             int max = -1;
  17.             foreach (int[] perm in Permutations.Unordered(new[] { 0, 1, 2, 3, 4 }))
  18.             {
  19.                 int signal = 0;
  20.                 for (int i = 0; i < perm.Length; i++)
  21.                 {
  22.                     BufferBlock<int> inputs = new BufferBlock<int>();
  23.                     inputs.Post(perm[i]);
  24.                     inputs.Post(signal);
  25.                     BufferBlock<int> outputs = new BufferBlock<int>();
  26.                     await RunAsync(program.ToArray(), inputs, outputs);
  27.                     signal = await outputs.ReceiveAsync();
  28.                 }
  29.  
  30.                 max = Math.Max(signal, max);
  31.             }
  32.  
  33.             Console.WriteLine(max);
  34.  
  35.             max = -1;
  36.             foreach (int[] perm in Permutations.Unordered(new[] { 5, 6, 7, 8, 9 }))
  37.             {
  38.                 BufferBlock<int>[] blocks = Enumerable.Range(0, perm.Length).Select(_ => new BufferBlock<int>()).ToArray();
  39.                 List<Task> amps = new List<Task>();
  40.                 for (int i = 0; i < perm.Length; i++)
  41.                 {
  42.                     blocks[i].Post(perm[i]);
  43.                     amps.Add(RunAsync(program.ToArray(), blocks[i], blocks[(i + 1) % blocks.Length]));
  44.                 }
  45.  
  46.                 blocks[0].Post(0);
  47.                 await Task.WhenAll(amps);
  48.                 max = Math.Max(max, await blocks[0].ReceiveAsync());
  49.             }
  50.  
  51.             Console.WriteLine(max);
  52.  
  53.             static async Task RunAsync(int[] mem, BufferBlock<int> inputs, BufferBlock<int> outputs)
  54.             {
  55.                 int ip = 0;
  56.                 while (true)
  57.                 {
  58.                     ref int GetParam(int index)
  59.                     {
  60.                         ref int fst = ref mem[ip + 1 + index];
  61.                         int divisor = 1;
  62.                         for (int i = 0; i < index; i++)
  63.                             divisor *= 10;
  64.                         int mode = (mem[ip] / 100) / divisor % 10;
  65.                         if (mode == 0)
  66.                             return ref mem[fst];
  67.                         Trace.Assert(mode == 1);
  68.                         return ref fst;
  69.                     }
  70.  
  71.                     switch (mem[ip] % 100)
  72.                     {
  73.                         case 1:
  74.                             GetParam(2) = GetParam(0) + GetParam(1);
  75.                             ip += 4;
  76.                             break;
  77.                         case 2:
  78.                             GetParam(2) = GetParam(0) * GetParam(1);
  79.                             ip += 4;
  80.                             break;
  81.                         case 3:
  82.                             int input = await inputs.ReceiveAsync();
  83.                             GetParam(0) = input;
  84.                             ip += 2;
  85.                             break;
  86.                         case 4:
  87.                             outputs.Post(GetParam(0));
  88.                             ip += 2;
  89.                             break;
  90.                         case 5:
  91.                             if (GetParam(0) != 0)
  92.                                 ip = GetParam(1);
  93.                             else
  94.                                 ip += 3;
  95.                             break;
  96.                         case 6:
  97.                             if (GetParam(0) == 0)
  98.                                 ip = GetParam(1);
  99.                             else
  100.                                 ip += 3;
  101.                             break;
  102.                         case 7:
  103.                             GetParam(2) = GetParam(0) < GetParam(1) ? 1 : 0;
  104.                             ip += 4;
  105.                             break;
  106.                         case 8:
  107.                             GetParam(2) = GetParam(0) == GetParam(1) ? 1 : 0;
  108.                             ip += 4;
  109.                             break;
  110.                         case 99:
  111.                             return;
  112.                         default:
  113.                             Trace.Fail("Oh shit " + mem[ip]);
  114.                             break;
  115.                     }
  116.                 }
  117.             }
  118.         }
  119.     }
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement