Skip to content

Commit 267f859

Browse files
committed
2024/20
1 parent e429f36 commit 267f859

File tree

6 files changed

+125
-42
lines changed

6 files changed

+125
-42
lines changed

2024/Day20/README.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
## --- Day 20: Race Condition ---
2+
The Historians are quite pixelated again. This time, a massive, black building looms over you - you're [right outside](/2017/day/24) the CPU!
3+
4+
While The Historians get to work, a nearby program sees that you're idle and challenges you to a <em>race</em>. Apparently, you've arrived just in time for the frequently-held <em>race condition</em> festival!
5+
6+
_Visit the website for the full story and [full puzzle](https://adventofcode.com/2024/day/20) description._

2024/Day20/Solution.cs

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
namespace AdventOfCode.Y2024.Day20;
2+
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Numerics;
7+
8+
[ProblemName("Race Condition")]
9+
class Solution : Solver {
10+
11+
public object PartOne(string input) => Solve(input, 2);
12+
public object PartTwo(string input) => Solve(input, 20);
13+
14+
int Solve(string input, int cheat) {
15+
var path = GetPath(input);
16+
17+
// this nested loop is 6x times faster then the same thing with LINQ ¯\_(ツ)_/¯
18+
var res = 0;
19+
for (var i = 0; i < path.Length; i++) {
20+
for (var j = i + 1; j < path.Length; j++) {
21+
var dist = Manhattan(path[i], path[j]);
22+
23+
// the index of an element in the path equals to its distance
24+
// from the finish line
25+
26+
var saving = j - (i + dist);
27+
if (dist <= cheat && saving >= 100) {
28+
res++;
29+
}
30+
}
31+
}
32+
return res;
33+
}
34+
35+
int Manhattan(Complex a, Complex b) =>
36+
(int)(Math.Abs(a.Imaginary - b.Imaginary) + Math.Abs(a.Real - b.Real));
37+
38+
// follow the path from start to finish, supposed that there is a single track in the input
39+
Complex[] GetPath(string input) {
40+
var lines = input.Split("\n");
41+
var map = (
42+
from y in Enumerable.Range(0, lines.Length)
43+
from x in Enumerable.Range(0, lines[0].Length)
44+
select new KeyValuePair<Complex, char>(x + y * Complex.ImaginaryOne, lines[y][x])
45+
).ToDictionary();
46+
47+
var start = map.Keys.Single(k => map[k] == 'S');
48+
var goal = map.Keys.Single(k => map[k] == 'E');
49+
50+
var (prev, cur, dir) = ((Complex?)null, start, Complex.ImaginaryOne);
51+
52+
var res = new List<Complex> { start };
53+
while (cur != goal) {
54+
if (map[cur + dir] == '#' || cur + dir == prev) {
55+
dir *= Complex.ImaginaryOne;
56+
} else {
57+
(prev, cur) = (cur, cur + dir);
58+
res.Add(cur);
59+
}
60+
}
61+
return res.ToArray();
62+
}
63+
}

2024/Day20/input.in

19.6 KB
Binary file not shown.

2024/Day20/input.refout

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
1384
2+
1008542

2024/SplashScreen.cs

+41-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(0x4d8b03, false, "@");
52+
Write(0x7fbd39, false, "#");
5353
Write(0x5eabb4, false, "..");
54-
Write(0x488813, false, "@");
54+
Write(0x7fbd39, false, "#");
5555
Write(0xe3b585, false, "'. ~ ");
5656
Write(0xcc00, false, "\" ' ");
5757
Write(0xe3b585, false, "~ ");
@@ -68,10 +68,9 @@ public void Show() {
6868
Write(0xcccccc, false, "| 4 ");
6969
Write(0xffff66, false, "**\n ");
7070
Write(0xcccccc, false, "|");
71-
Write(0x7fbd39, false, "_");
71+
Write(0x1461f, false, "_");
7272
Write(0x5eabb4, false, ".~.");
73-
Write(0x4d8b03, false, "_");
74-
Write(0x488813, false, "#");
73+
Write(0x488813, false, "_@");
7574
Write(0xe3b585, false, "'.. ~ ~ ");
7675
Write(0xffff66, true, "*");
7776
Write(0xcccccc, false, "| | ");
@@ -84,10 +83,10 @@ public void Show() {
8483
Write(0xffff66, false, "**\n ");
8584
Write(0xcccccc, false, "| ");
8685
Write(0xffffff, false, "||| ");
87-
Write(0x488813, false, "#");
88-
Write(0x4d8b03, false, "@");
86+
Write(0x427322, false, "#");
87+
Write(0x4d8b03, false, "#");
88+
Write(0x7fbd39, false, "@");
8989
Write(0x488813, false, "@");
90-
Write(0x427322, false, "@");
9190
Write(0xe3b585, false, "'''...");
9291
Write(0xcccccc, false, "| |");
9392
Write(0xa25151, false, "... ");
@@ -98,11 +97,11 @@ public void Show() {
9897
Write(0xcccccc, false, "| 6 ");
9998
Write(0xffff66, false, "**\n ");
10099
Write(0xcccccc, false, "|");
101-
Write(0x7fbd39, false, "@");
100+
Write(0x427322, false, "@");
102101
Write(0xffffff, false, "~~~");
103-
Write(0x488813, false, "@# ");
104-
Write(0x4d8b03, false, "# ");
105-
Write(0x488813, false, "# @ ");
102+
Write(0x1461f, false, "@");
103+
Write(0x488813, false, "#@#");
104+
Write(0x4d8b03, false, "# ");
106105
Write(0xcccccc, false, "| |");
107106
Write(0xa5a8af, false, "/\\ ");
108107
Write(0xa25151, false, "''. ");
@@ -169,18 +168,16 @@ public void Show() {
169168
Write(0xffff66, true, ":");
170169
Write(0x333333, false, "::");
171170
Write(0xcccccc, false, "| | ");
172-
Write(0xffffff, false, ". ");
173-
Write(0xa2db, false, ". ");
171+
Write(0xffffff, false, ". ");
174172
Write(0xcccccc, false, "| 12 ");
175173
Write(0xffff66, false, "**\n ");
176174
Write(0xcccccc, false, "|");
177175
Write(0xffffff, false, "'. - -");
178-
Write(0xcccccc, false, "| | ");
179-
Write(0x333333, false, "::");
176+
Write(0xcccccc, false, "| | ");
177+
Write(0x333333, false, ".::");
180178
Write(0x9900, true, ":");
181179
Write(0x333333, false, "::");
182-
Write(0xcccccc, false, "| |");
183-
Write(0x91cc, false, "' ");
180+
Write(0xcccccc, false, "| | ");
184181
Write(0xffffff, false, ".' ");
185182
Write(0xcccccc, false, "| 13 ");
186183
Write(0xffff66, false, "**\n ");
@@ -215,7 +212,8 @@ public void Show() {
215212
Write(0x5555bb, false, "~ ");
216213
Write(0xcc00, false, "'.");
217214
Write(0xcccccc, false, "| |");
218-
Write(0x666666, false, " : ");
215+
Write(0x333333, false, ".");
216+
Write(0x666666, false, ": ");
219217
Write(0x333333, false, "::");
220218
Write(0x553322, true, ":");
221219
Write(0x333333, false, "::");
@@ -230,15 +228,17 @@ public void Show() {
230228
Write(0x5555bb, false, "~ ");
231229
Write(0xcc00, false, ":");
232230
Write(0xcccccc, false, "| |");
233-
Write(0x666666, false, " '. ");
231+
Write(0x666666, false, " '. ");
232+
Write(0x333333, false, ". .");
234233
Write(0xcccccc, false, "| |");
235234
Write(0x666666, false, "┬o┤ten├─");
236235
Write(0xcccccc, false, "| 17 ");
237236
Write(0xffff66, false, "**\n ");
238237
Write(0xcccccc, false, "| ");
239238
Write(0xcc00, false, "'..' .'");
240-
Write(0xcccccc, false, "| |");
241-
Write(0x666666, false, " '");
239+
Write(0xcccccc, false, "| | ");
240+
Write(0x333333, false, ".");
241+
Write(0x666666, false, "'");
242242
Write(0x456efe, true, "o ");
243243
Write(0xcccccc, false, "| |");
244244
Write(0x666666, false, "┘");
@@ -254,12 +254,24 @@ public void Show() {
254254
Write(0xcccccc, false, "| |");
255255
Write(0x666666, false, "─┘├┬┬┬┴─");
256256
Write(0xcccccc, false, "| 19 ");
257+
Write(0xffff66, false, "**\n ");
258+
Write(0xcccccc, false, "|");
259+
Write(0xcc00, false, "'''");
260+
Write(0xcccccc, false, ")) | | ");
261+
Write(0xbee4e7, true, "o ");
262+
Write(0xffff66, true, "*");
263+
Write(0x666666, false, " : ");
264+
Write(0xcccccc, false, "'. .'");
265+
Write(0x666666, false, "──┘");
266+
Write(0x9900, false, ">>");
267+
Write(0xff9900, true, "o");
268+
Write(0x9900, false, "<<");
269+
Write(0xcccccc, false, "| 20 ");
257270
Write(0xffff66, false, "**\n ");
258-
Write(0x333333, false, " | | | '. .' | ");
259-
Write(0x666666, false, "20\n 21\n ");
260-
Write(0x666666, false, " 22\n 23\n ");
261-
Write(0x666666, false, " 24\n ");
262-
Write(0x666666, false, " 25\n \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");
263275

264276
Console.ForegroundColor = color;
265277
Console.WriteLine();

0 commit comments

Comments
 (0)