Skip to content

Commit 95e7bb0

Browse files
committed
wip
1 parent 92da7a8 commit 95e7bb0

File tree

6 files changed

+254
-43
lines changed

6 files changed

+254
-43
lines changed

2024/Day21/README.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
## --- Day 21: Keypad Conundrum ---
2+
As you teleport onto Santa's [Reindeer-class starship](/2019/day/25), The Historians begin to panic: someone from their search party is <em>missing</em>. A quick life-form scan by the ship's computer reveals that when the missing Historian teleported, he arrived in another part of the ship.
3+
4+
The door to that area is locked, but the computer can't open it; it can only be opened by <em>physically typing</em> the door codes (your puzzle input) on the numeric keypad on the door.
5+
6+
_Visit the website for the full story and [full puzzle](https://adventofcode.com/2024/day/21) description._

2024/Day21/Solution.cs

+194
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
namespace AdventOfCode.Y2024.Day21;
2+
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Collections.Immutable;
6+
using System.Linq;
7+
using System.Text.RegularExpressions;
8+
using System.Text;
9+
using System.Numerics;
10+
using System.Security.AccessControl;
11+
using AngleSharp.Common;
12+
using AdventOfCode.Y2021.Day11;
13+
using System.Security.Cryptography;
14+
15+
[ProblemName("Keypad Conundrum")]
16+
class Solution : Solver {
17+
18+
public object PartOne(string input) {
19+
return input.Split("\n").Sum(Solve);
20+
}
21+
22+
public object PartTwo(string input) {
23+
return 0;
24+
}
25+
26+
static readonly Complex Left = -1;
27+
static readonly Complex Right = 1;
28+
static readonly Complex Up = Complex.ImaginaryOne;
29+
static readonly Complex Down = -Complex.ImaginaryOne;
30+
31+
int Solve(string line) {
32+
var keypad1 = ParseKeypad("789\n456\n123\n 0A");
33+
var keypad2 = ParseKeypad(" ^A\n<v>");
34+
35+
Console.WriteLine("========");
36+
// var q = "<v<A>>^AvA^A<vA<AA>>^AAvA<^A>AAvA^A<vA>^AA<A>A<v<A>A>^AAAvA<^A>A";
37+
// Console.WriteLine(q);
38+
// q = Decode(q, keypad2);
39+
// Console.WriteLine(q);
40+
// q = Decode(q, keypad2);
41+
// Console.WriteLine(q);
42+
// q = Decode(q, keypad1);
43+
// Console.WriteLine(q);
44+
45+
// Console.WriteLine();
46+
47+
var xs = Encode(line, keypad1, keypad1['A']).ToList();
48+
var ys = xs.SelectMany(x => Encode(x, keypad2, keypad2['A'])).ToList();
49+
foreach (var y in ys) {
50+
Console.WriteLine(Decode(Decode(y, keypad2), keypad1));
51+
}
52+
53+
var cache = new Dictionary<(Complex, string), string> ();
54+
55+
var z = ys.Select(y => Mikkamakka(keypad2['A'], y, keypad2, cache)).MinBy(z => z.Length);
56+
57+
Console.WriteLine(Decode(Decode(Decode(z, keypad2), keypad2), keypad1));
58+
return z.Length * int.Parse(line[0..^1]);
59+
}
60+
61+
62+
63+
string Mikkamakka(Complex pos, string st, Dictionary<char, Complex> keypad, Dictionary<(Complex, string), string> cache) {
64+
if (st == "") {
65+
return "";
66+
}
67+
var key = (pos, st);
68+
if (!cache.ContainsKey(key)) {
69+
70+
var target = keypad[st[0]];
71+
72+
var dy = (int)(target.Imaginary - pos.Imaginary);
73+
var dx = (int)(target.Real - pos.Real);
74+
75+
var res1 = "";
76+
if (pos + dy * Up != keypad[' ']) {
77+
if (dy < 0) {
78+
res1 += new string('v', Math.Abs(dy));
79+
} else if (dy > 0) {
80+
res1 += new string('^', Math.Abs(dy));
81+
}
82+
if (dx < 0) {
83+
res1 += new string('<', Math.Abs(dx));
84+
} else if (dx > 0) {
85+
res1 += new string('>', Math.Abs(dx));
86+
}
87+
res1 += "A";
88+
res1 += Mikkamakka(target, st[1..], keypad, cache);
89+
}
90+
var res2 = "";
91+
if (pos + dx * Right != keypad[' ']) {
92+
if (dx < 0) {
93+
res2 += new string('<', Math.Abs(dx));
94+
} else if (dx > 0) {
95+
res2 += new string('>', Math.Abs(dx));
96+
}
97+
98+
if (dy < 0) {
99+
res2 += new string('v', Math.Abs(dy));
100+
} else if (dy > 0) {
101+
res2 += new string('^', Math.Abs(dy));
102+
}
103+
104+
res2 += "A";
105+
res2 += Mikkamakka(target, st[1..], keypad, cache);
106+
}
107+
108+
cache[key] = res1 == "" ? res2 : res2 == "" ? res1 : res1.Length < res2.Length ? res1 : res2;
109+
}
110+
return cache[key];
111+
}
112+
113+
114+
string Decode(string st, Dictionary<char, Complex> keymap) {
115+
var res = "";
116+
var pos = keymap['A'];
117+
foreach (var ch in st) {
118+
if (ch == '^') {
119+
pos += Up;
120+
} else if (ch == 'v') {
121+
pos += Down;
122+
} else if (ch == '<') {
123+
pos += Left;
124+
} else if (ch == '>') {
125+
pos += Right;
126+
} else if (ch == 'A') {
127+
res += keymap.Single(kvp => kvp.Value == pos).Key;
128+
}
129+
}
130+
return res;
131+
}
132+
133+
134+
IEnumerable<string> Encode(string st, Dictionary<char, Complex> keymap, Complex pos) {
135+
if (st == "") {
136+
yield return "";
137+
yield break;
138+
}
139+
140+
141+
var target = keymap[st[0]];
142+
143+
var dy = (int)(target.Imaginary - pos.Imaginary);
144+
var dx = (int)(target.Real - pos.Real);
145+
146+
if (pos + dy * Up != keymap[' ']) {
147+
var res = "";
148+
if (dy < 0) {
149+
res += new string('v', Math.Abs(dy));
150+
} else if (dy > 0) {
151+
res += new string('^', Math.Abs(dy));
152+
}
153+
if (dx < 0) {
154+
res += new string('<', Math.Abs(dx));
155+
} else if (dx > 0) {
156+
res += new string('>', Math.Abs(dx));
157+
}
158+
res += "A";
159+
foreach (var resT in Encode(st[1..], keymap, target)) {
160+
yield return res + resT;
161+
}
162+
}
163+
164+
if (pos + dx * Right != keymap[' ']) {
165+
var res = "";
166+
if (dx < 0) {
167+
res += new string('<', Math.Abs(dx));
168+
} else if (dx > 0) {
169+
res += new string('>', Math.Abs(dx));
170+
}
171+
172+
if (dy < 0) {
173+
res += new string('v', Math.Abs(dy));
174+
} else if (dy > 0) {
175+
res += new string('^', Math.Abs(dy));
176+
}
177+
178+
res += "A";
179+
foreach (var resT in Encode(st[1..], keymap, target)) {
180+
yield return res + resT;
181+
}
182+
}
183+
184+
}
185+
186+
Dictionary<char, Complex> ParseKeypad(string keypad) {
187+
var lines = keypad.Split("\n");
188+
return (
189+
from y in Enumerable.Range(0, lines.Length)
190+
from x in Enumerable.Range(0, lines[0].Length)
191+
select new KeyValuePair<char, Complex>(lines[y][x], x + y * Down)
192+
).ToDictionary();
193+
}
194+
}

2024/Day21/input.in

47 Bytes
Binary file not shown.

2024/Day21/input.refout

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
176650

2024/SplashScreen.cs

+39-29
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ public void Show() {
88

99
var color = Console.ForegroundColor;
1010
Write(0xcc00, false, " ▄█▄ ▄▄█ ▄ ▄ ▄▄▄ ▄▄ ▄█▄ ▄▄▄ ▄█ ▄▄ ▄▄▄ ▄▄█ ▄▄▄\n █▄█ █ █ █ █ █▄█ █ █ █ █ █ █▄ ");
11-
Write(0xcc00, false, " █ █ █ █ █ █▄█\n █ █ █▄█ ▀▄▀ █▄▄ █ █ █▄ █▄█ █ █▄ █▄█ █▄█ █▄▄ /* 2024 */\n \n ");
12-
Write(0xcc00, false, " ");
11+
Write(0xcc00, false, " █ █ █ █ █ █▄█\n █ █ █▄█ ▀▄▀ █▄▄ █ █ █▄ █▄█ █ █▄ █▄█ █▄█ █▄▄ /^2024$/\n \n ");
12+
Write(0xcc00, false, " ");
1313
Write(0x888888, false, " .-----. .------------------. \n ");
1414
Write(0xcccccc, false, ".--'");
1515
Write(0xe3b585, false, "~ ~ ~");
@@ -49,9 +49,9 @@ public void Show() {
4949
Write(0xcccccc, false, "| 3 ");
5050
Write(0xffff66, false, "**\n ");
5151
Write(0xcccccc, false, "|");
52-
Write(0x7fbd39, false, "#");
52+
Write(0x488813, false, "@");
5353
Write(0x5eabb4, false, "..");
54-
Write(0x7fbd39, false, "#");
54+
Write(0x4d8b03, false, "@");
5555
Write(0xe3b585, false, "'. ~ ");
5656
Write(0xcc00, false, "\" ' ");
5757
Write(0xe3b585, false, "~ ");
@@ -68,9 +68,10 @@ public void Show() {
6868
Write(0xcccccc, false, "| 4 ");
6969
Write(0xffff66, false, "**\n ");
7070
Write(0xcccccc, false, "|");
71-
Write(0x1461f, false, "_");
71+
Write(0x7fbd39, false, "_");
7272
Write(0x5eabb4, false, ".~.");
73-
Write(0x488813, false, "_@");
73+
Write(0x427322, false, "_");
74+
Write(0x7fbd39, false, "#");
7475
Write(0xe3b585, false, "'.. ~ ~ ");
7576
Write(0xffff66, true, "*");
7677
Write(0xcccccc, false, "| | ");
@@ -83,10 +84,10 @@ public void Show() {
8384
Write(0xffff66, false, "**\n ");
8485
Write(0xcccccc, false, "| ");
8586
Write(0xffffff, false, "||| ");
86-
Write(0x427322, false, "#");
87-
Write(0x4d8b03, false, "#");
87+
Write(0x488813, false, "#");
88+
Write(0x427322, false, "@");
8889
Write(0x7fbd39, false, "@");
89-
Write(0x488813, false, "@");
90+
Write(0x1461f, false, "#");
9091
Write(0xe3b585, false, "'''...");
9192
Write(0xcccccc, false, "| |");
9293
Write(0xa25151, false, "... ");
@@ -97,11 +98,13 @@ public void Show() {
9798
Write(0xcccccc, false, "| 6 ");
9899
Write(0xffff66, false, "**\n ");
99100
Write(0xcccccc, false, "|");
100-
Write(0x427322, false, "@");
101+
Write(0x488813, false, "@");
101102
Write(0xffffff, false, "~~~");
102-
Write(0x1461f, false, "@");
103-
Write(0x488813, false, "#@#");
104-
Write(0x4d8b03, false, "# ");
103+
Write(0x427322, false, "#");
104+
Write(0x7fbd39, false, "@@#");
105+
Write(0x488813, false, "@ ");
106+
Write(0x7fbd39, false, "@@");
107+
Write(0x488813, false, "# ");
105108
Write(0xcccccc, false, "| |");
106109
Write(0xa5a8af, false, "/\\ ");
107110
Write(0xa25151, false, "''. ");
@@ -156,8 +159,10 @@ public void Show() {
156159
Write(0xcccccc, false, "| |");
157160
Write(0xa5a8af, false, "/\\ ");
158161
Write(0xa25151, false, "..' ");
159-
Write(0xcccccc, false, "| | ");
160-
Write(0xffffff, false, ". ");
162+
Write(0xcccccc, false, "| | ");
163+
Write(0xb5ed, false, "' ");
164+
Write(0xffffff, false, ". ");
165+
Write(0xb5ed, false, "'");
161166
Write(0xcccccc, false, "| 11 ");
162167
Write(0xffff66, false, "**\n ");
163168
Write(0xcccccc, false, "| ");
@@ -173,8 +178,8 @@ public void Show() {
173178
Write(0xffff66, false, "**\n ");
174179
Write(0xcccccc, false, "|");
175180
Write(0xffffff, false, "'. - -");
176-
Write(0xcccccc, false, "| | ");
177-
Write(0x333333, false, ".::");
181+
Write(0xcccccc, false, "| | ");
182+
Write(0x333333, false, "::");
178183
Write(0x9900, true, ":");
179184
Write(0x333333, false, "::");
180185
Write(0xcccccc, false, "| | ");
@@ -212,8 +217,7 @@ public void Show() {
212217
Write(0x5555bb, false, "~ ");
213218
Write(0xcc00, false, "'.");
214219
Write(0xcccccc, false, "| |");
215-
Write(0x333333, false, ".");
216-
Write(0x666666, false, ": ");
220+
Write(0x666666, false, " : ");
217221
Write(0x333333, false, "::");
218222
Write(0x553322, true, ":");
219223
Write(0x333333, false, "::");
@@ -228,18 +232,18 @@ public void Show() {
228232
Write(0x5555bb, false, "~ ");
229233
Write(0xcc00, false, ":");
230234
Write(0xcccccc, false, "| |");
231-
Write(0x666666, false, " '. ");
232-
Write(0x333333, false, ". .");
235+
Write(0x666666, false, " '. ");
233236
Write(0xcccccc, false, "| |");
234237
Write(0x666666, false, "┬o┤ten├─");
235238
Write(0xcccccc, false, "| 17 ");
236239
Write(0xffff66, false, "**\n ");
237240
Write(0xcccccc, false, "| ");
238241
Write(0xcc00, false, "'..' .'");
239-
Write(0xcccccc, false, "| | ");
242+
Write(0xcccccc, false, "| | ");
243+
Write(0x333333, false, ".");
244+
Write(0x666666, false, " '");
245+
Write(0x456efe, true, "o ");
240246
Write(0x333333, false, ".");
241-
Write(0x666666, false, "'");
242-
Write(0x456efe, true, "o ");
243247
Write(0xcccccc, false, "| |");
244248
Write(0x666666, false, "┘");
245249
Write(0xffff66, true, "*");
@@ -250,7 +254,9 @@ public void Show() {
250254
Write(0x5555bb, false, "~ ");
251255
Write(0xcc00, false, "..' ");
252256
Write(0xcccccc, false, "| |");
253-
Write(0x666666, false, ": '. ");
257+
Write(0x666666, false, ": ");
258+
Write(0x333333, false, ".");
259+
Write(0x666666, false, "'. ");
254260
Write(0xcccccc, false, "| |");
255261
Write(0x666666, false, "─┘├┬┬┬┴─");
256262
Write(0xcccccc, false, "| 19 ");
@@ -268,10 +274,14 @@ public void Show() {
268274
Write(0x9900, false, "<<");
269275
Write(0xcccccc, false, "| 20 ");
270276
Write(0xffff66, false, "**\n ");
271-
Write(0x333333, false, ".------' '------. | '' | ");
272-
Write(0x666666, false, "21\n 22\n ");
273-
Write(0x666666, false, " 23\n 24\n ");
274-
Write(0x666666, false, " 25\n \n");
277+
Write(0x666666, false, ".------'.-((---.'------. | :|\\| ~ _'' O> >>@<o<| ");
278+
Write(0xcccccc, false, "21 ");
279+
Write(0xffff66, false, "*");
280+
Write(0x666666, false, "*\n ");
281+
Write(0x333333, false, "| | | | ");
282+
Write(0x666666, false, "22\n 23\n ");
283+
Write(0x666666, false, " 24\n 25\n ");
284+
Write(0x666666, false, " \n");
275285

276286
Console.ForegroundColor = color;
277287
Console.WriteLine();

0 commit comments

Comments
 (0)