my advent of code solutions
1namespace Solutions._2020;
2
3/// <summary>
4/// Day 10: <a href="https://adventofcode.com/2020/day/10" />
5/// </summary>
6public sealed class Day10AdapterArray() : Day(2020, 10, "Adapter Array")
7{
8 private int[]? _adapters;
9 private long[]? _memo;
10
11 public override void ProcessInput()
12 {
13 var parsed = Input.Select(int.Parse).ToArray();
14 // add socket and device to the list
15 _adapters = parsed.Concat([0, parsed.Max() + 3]).OrderBy(i => i).ToArray();
16 _memo = new long[_adapters.Length];
17 }
18
19 private long Connections(int i)
20 {
21 if (i == _adapters!.Length - 1) _memo![i] = 1;
22 if (_memo![i] > 0) return _memo[i];
23
24 for (var j = i + 1; j <= i + 3 && j < _adapters.Length; j++)
25 if (_adapters[j] - _adapters[i] <= 3)
26 _memo[i] += Connections(j);
27
28 return _memo[i];
29 }
30
31 public override object Part1()
32 {
33 var ones = 0;
34 var threes = 0;
35
36 for (var i = 0; i < _adapters!.Length - 1; i++)
37 switch (_adapters[i + 1] - _adapters[i])
38 {
39 case 1:
40 ones++;
41 break;
42 case 3:
43 threes++;
44 break;
45 default: throw new("something went wrong");
46 }
47
48 return ones * threes;
49 }
50
51 public override object Part2() => Connections(0);
52}