diff --git a/aoc2020.test/DayTests.cs b/aoc2020.test/DayTests.cs index dc4a663..16d8677 100644 --- a/aoc2020.test/DayTests.cs +++ b/aoc2020.test/DayTests.cs @@ -19,6 +19,7 @@ namespace aoc2020.test [DataRow(typeof(Day09), "138879426", "23761694")] [DataRow(typeof(Day10), "1980", "4628074479616")] [DataRow(typeof(Day11), "2303", "2057")] + [DataRow(typeof(Day12), "1710", "62045")] public void CheckAllDays(Type dayType, string part1, string part2) { // create day instance diff --git a/aoc2020/Day12.cs b/aoc2020/Day12.cs new file mode 100644 index 0000000..1c12c86 --- /dev/null +++ b/aoc2020/Day12.cs @@ -0,0 +1,94 @@ +using System; + +namespace aoc2020 +{ + /// + /// Day 12: Rain Risk + /// + public sealed class Day12 : Day + { + public Day12() : base(12) + { + } + + private static void Swap(ref int x, ref int y) + { + var tmp = x; + x = y; + y = tmp; + } + + private (int x, int y, int sx, int sy) ProcessInstructions() + { + // start facing east + int x = 0, y = 0, dx = 1, dy = 0; + int sx = 0, sy = 0, waypointX = 10, waypointY = -1; + + foreach (var instruction in Input) + { + var value = int.Parse(instruction[1..]); + + switch (instruction[0]) + { + case 'N': + y -= value; + waypointY -= value; + break; + case 'S': + y += value; + waypointY += value; + break; + case 'E': + x += value; + waypointX += value; + break; + case 'W': + x -= value; + waypointX -= value; + break; + case 'L': + for (var i = 0; i < value / 90; ++i) + { + Swap(ref dx, ref dy); + Swap(ref waypointX, ref waypointY); + dy *= -1; + waypointY *= -1; + } + + break; + case 'R': + for (var i = 0; i < value / 90; ++i) + { + Swap(ref dx, ref dy); + Swap(ref waypointX, ref waypointY); + dx *= -1; + waypointX *= -1; + } + + break; + case 'F': + x += dx * value; + y += dy * value; + sx += waypointX * value; + sy += waypointY * value; + break; + default: throw new InvalidOperationException(nameof(instruction)); + } + } + + return (x, y, sx, sy); + } + + public override string Part1() + { + var (x, y, _, _) = ProcessInstructions(); + return $"{Math.Abs(x) + Math.Abs(y)}"; + } + + public override string Part2() + { + var (_, _, sx, sy) = ProcessInstructions(); + return $"{Math.Abs(sx) + Math.Abs(sy)}"; + } + } +} \ No newline at end of file diff --git a/aoc2020/input/day12.in b/aoc2020/input/day12.in new file mode 100644 index 0000000..bbb1b41 --- /dev/null +++ b/aoc2020/input/day12.in @@ -0,0 +1,771 @@ +N2 +S5 +E2 +F35 +N2 +W5 +F83 +S5 +R180 +S3 +L270 +N1 +F35 +N1 +W4 +S3 +L180 +F46 +R180 +S4 +F29 +R90 +S3 +E1 +F65 +E4 +F29 +S4 +E5 +F33 +L90 +F28 +L270 +E3 +S5 +E2 +S5 +F82 +R270 +F81 +S3 +F68 +R180 +W5 +S3 +F70 +W4 +L180 +E2 +L90 +F28 +L270 +S4 +R90 +W2 +F39 +R90 +N5 +W5 +L180 +E3 +F66 +S5 +W3 +N5 +L90 +S2 +W4 +F77 +E1 +L90 +E3 +W1 +S3 +E4 +N4 +W5 +S1 +F55 +S3 +L90 +F20 +W2 +N2 +F23 +W2 +F48 +L90 +N1 +E3 +R90 +N4 +F73 +S4 +F7 +S1 +R90 +R90 +W3 +S3 +F71 +E5 +N1 +W1 +L90 +W3 +R180 +F60 +W2 +S5 +L90 +W2 +F6 +L180 +W4 +S2 +F28 +N4 +F56 +N4 +E4 +L90 +F67 +L90 +N1 +L90 +W3 +F43 +S2 +W4 +S1 +F67 +F72 +E2 +L90 +W2 +L180 +F35 +L90 +N2 +W1 +S5 +F58 +R180 +F68 +E2 +S5 +F61 +W4 +L180 +W2 +S2 +F35 +W4 +F50 +E3 +L90 +E3 +N5 +F16 +E2 +N4 +F87 +W4 +R180 +F25 +N3 +F6 +L90 +F57 +R180 +E2 +R90 +E1 +F99 +W1 +L90 +W4 +F76 +W2 +F48 +S1 +F19 +N1 +F54 +L90 +F66 +E4 +F88 +R90 +S5 +L180 +W2 +R90 +S2 +F54 +L90 +S2 +L180 +S4 +F14 +N2 +F51 +E3 +F83 +N2 +W1 +F61 +S1 +W3 +N2 +F15 +R180 +S3 +E3 +R90 +F50 +R90 +E5 +L90 +F53 +S3 +L90 +S5 +F22 +R90 +S5 +E3 +L90 +E4 +F88 +W1 +F10 +S2 +W4 +F68 +W3 +W2 +S3 +R90 +F1 +S1 +L270 +F51 +S2 +R90 +E3 +F6 +S1 +R90 +W2 +L180 +N1 +W5 +F51 +W1 +N1 +R90 +E1 +S3 +F21 +W3 +R180 +N1 +R180 +N1 +W4 +F21 +R180 +W3 +S5 +E3 +S5 +L180 +F3 +N4 +L90 +W5 +F23 +S3 +N5 +E1 +F88 +L90 +E4 +F18 +E3 +F27 +F51 +E3 +F58 +N5 +R180 +F36 +N4 +E2 +F14 +N4 +L180 +F87 +L180 +E3 +F67 +E4 +L90 +E2 +F62 +E3 +F60 +R90 +W2 +S1 +F47 +S5 +L90 +W2 +F11 +N2 +F29 +S2 +W1 +S1 +W1 +N2 +F73 +N3 +F92 +S2 +F1 +R180 +W4 +R90 +S5 +W4 +F33 +E2 +N2 +F40 +S1 +L180 +S2 +L90 +F95 +E2 +W2 +R180 +F26 +E1 +S3 +S1 +R90 +N4 +W4 +S5 +L90 +N1 +E5 +F9 +W5 +N1 +F89 +R180 +E5 +L90 +N2 +F90 +W4 +F33 +W2 +F62 +E1 +N4 +W4 +S5 +L90 +L90 +F81 +E3 +N5 +F81 +S1 +E3 +F89 +N3 +R90 +N3 +W3 +L90 +N2 +F93 +L90 +F48 +N5 +R180 +F66 +E5 +S1 +F47 +R180 +F61 +L90 +N2 +F74 +N1 +L180 +E2 +S5 +F39 +R180 +N5 +F26 +E5 +F12 +R90 +R90 +S4 +F7 +W5 +L90 +W1 +R90 +W2 +N2 +E2 +N1 +F15 +L90 +W4 +S2 +R90 +E3 +R180 +F86 +N5 +S5 +E2 +R90 +W1 +F64 +S2 +W3 +R180 +S4 +L180 +F58 +L90 +F100 +S2 +E4 +S2 +F52 +W2 +N4 +W4 +R90 +N2 +F45 +E5 +F84 +N3 +W2 +R90 +F36 +R90 +F85 +N5 +L90 +F6 +L90 +S4 +F21 +R90 +E5 +F9 +S4 +F53 +L90 +R90 +E1 +F55 +R90 +F56 +L90 +E4 +L90 +N1 +E1 +L90 +N1 +R90 +F51 +W1 +F39 +S5 +F96 +R90 +S1 +R180 +F72 +E1 +N4 +N3 +F77 +E3 +L90 +W4 +S3 +F53 +F92 +W5 +L90 +E4 +N2 +R180 +R90 +S3 +E2 +S3 +W1 +N1 +F86 +E3 +F46 +W1 +L90 +F97 +W3 +F45 +W4 +F73 +W2 +S2 +R90 +N2 +L180 +N4 +L90 +W1 +N2 +L90 +E1 +F93 +F36 +E2 +F74 +E3 +F49 +W5 +L180 +S3 +F5 +L180 +F53 +S2 +E3 +N1 +F96 +L90 +F44 +S3 +F32 +W1 +S2 +L90 +N2 +E3 +F17 +R90 +F34 +L90 +N4 +F22 +W2 +F58 +S2 +R90 +S2 +R90 +F12 +S5 +W5 +N5 +R90 +N3 +F12 +S4 +E1 +F86 +W3 +F6 +R90 +S5 +L90 +E4 +L180 +N2 +E4 +F50 +S5 +F85 +R90 +F13 +S1 +F69 +S2 +F97 +S1 +F66 +S4 +F86 +N5 +F34 +S2 +W5 +R180 +F42 +W4 +F72 +E3 +R270 +S3 +R90 +E2 +N4 +E5 +R90 +E2 +L180 +S2 +F35 +E4 +S2 +F50 +S1 +R90 +W3 +F100 +N3 +F10 +W4 +L90 +F19 +E2 +F10 +R90 +F27 +S4 +W3 +R90 +F53 +R90 +N3 +L90 +N5 +F46 +R90 +F3 +N1 +S4 +F17 +L270 +E2 +S2 +R90 +N4 +W4 +L180 +E3 +R90 +F86 +N5 +W1 +S4 +R90 +E4 +N4 +E5 +S4 +W1 +L90 +L180 +S1 +F42 +S2 +E2 +S5 +E1 +R90 +W1 +N4 +R90 +N3 +F58 +E3 +S1 +N5 +F65 +N5 +E4 +R180 +N5 +R90 +F90 +N3 +F1 +R180 +S2 +W3 +R90 +W1 +W2 +R180 +S1 +F93 +S2 +F35 +W2 +F62 +L90 +F15 +W3 +F79 +E5 +N4 +R180 +R90 +L90 +E2 +N2 +E5 +L270 +N3 +F31 +W3 +F39 +E5 +N3 +R90 +N2 +E3 +L90 +F50 +L90 +W5 +S3 +F68 +S3 +W3 +F20 +W3 +S2 +F7 +W1 +N1 +R90 +E2 +L180 +W4 +L90 +W4 +N5 +E5 +F19 +F11 +E2 +L90 +S3 +F30 +N2 +E5 +F51