[2k25] Add day 9

This commit is contained in:
2026-01-18 11:56:23 +01:00
parent ded4631c3b
commit f1ad810991
2 changed files with 688 additions and 0 deletions

192
Days/Day9.cs Normal file
View File

@@ -0,0 +1,192 @@
using Spectre.Console;
namespace AdventOfCode.Days;
public class Day9 : Day
{
public override int Number => 9;
public override string Name => "Movie Theater";
public override void RunPart1(bool display = true)
{
var tilePositions = ParseTilePositions(Input);
var maxArea = 0L;
for (var firstIndex = 0; firstIndex < tilePositions.Count - 1; firstIndex++)
{
for (var secondIndex = firstIndex + 1; secondIndex < tilePositions.Count; secondIndex++)
{
var firstTile = tilePositions[firstIndex];
var secondTile = tilePositions[secondIndex];
var area = (Math.Abs(secondTile.I - firstTile.I) + 1) *
(Math.Abs(secondTile.J - firstTile.J) + 1);
if (area > maxArea)
{
maxArea = area;
}
}
}
if (display)
{
AnsiConsole.MarkupLine($"[green]Max tile area is: [yellow]{maxArea}[/][/]");
}
}
public override void RunPart2(bool display = true)
{
var tilePositions = ParseTilePositions(Input);
// Make a list of possible areas in descending order
var tileAreas = new List<TileArea>();
for (var firstIndex = 0; firstIndex < tilePositions.Count - 1; firstIndex++)
{
for (var secondIndex = firstIndex + 1; secondIndex < tilePositions.Count; secondIndex++)
{
var firstTile = tilePositions[firstIndex];
var secondTile = tilePositions[secondIndex];
var area = (Math.Abs(secondTile.I - firstTile.I) + 1) *
(Math.Abs(secondTile.J - firstTile.J) + 1);
tileAreas.Add(new TileArea(firstTile, secondTile, area));
}
}
// Sort list in descending order (biggest area first)
tileAreas.Sort((left, right) => right.Area.CompareTo(left.Area));
// Compute polygon bounds with green tiles
var jBoundsAtI = new Dictionary<long, PositionBounds>();
var iBoundsAtJ = new Dictionary<long, PositionBounds>();
foreach (var (firstTile, secondTile) in tilePositions.Zip(tilePositions.Skip(1).Append(tilePositions[0])))
{
// Tiles are on same line, set bounds for columns (j)
if (firstTile.I == secondTile.I)
{
var start = Math.Min(firstTile.J, secondTile.J);
var end = Math.Max(firstTile.J, secondTile.J);
for (var j = start; j <= end; j++)
{
// Update bounds
if (iBoundsAtJ.TryGetValue(j, out var bounds))
{
iBoundsAtJ[j] = new PositionBounds(
Math.Min(firstTile.I, bounds.Min),
Math.Max(firstTile.I, bounds.Max)
);
}
else
{
iBoundsAtJ[j] = new PositionBounds(
firstTile.I,
firstTile.I
);
}
}
}
// Tiles are on same column, set bounds for rows (i)
else if (firstTile.J == secondTile.J)
{
var start = Math.Min(firstTile.I, secondTile.I);
var end = Math.Max(firstTile.I, secondTile.I);
for (var i = start; i<= end; i++)
{
// Update bounds
if (jBoundsAtI.TryGetValue(i, out var bounds))
{
jBoundsAtI[i] = new PositionBounds(
Math.Min(firstTile.J, bounds.Min),
Math.Max(firstTile.J, bounds.Max)
);
}
else
{
jBoundsAtI[i] = new PositionBounds(
firstTile.J,
firstTile.J
);
}
}
}
}
// Find the first area that is valid (composed of green or red tiles)
var maxValidArea = -1L;
foreach (var tileArea in tileAreas)
{
// For each point in this area, check if it is within bounds
var iStart = Math.Min(tileArea.First.I, tileArea.Second.I);
var iEnd = Math.Max(tileArea.First.I, tileArea.Second.I);
var jStart = Math.Min(tileArea.First.J, tileArea.Second.J);
var jEnd = Math.Max(tileArea.First.J, tileArea.Second.J);
// Check if any point is out of bounds
var outOfBounds = false;
for (var i = iStart; i <= iEnd; i++)
{
for (var j = jStart; j <= jEnd; j++)
{
var iBound = iBoundsAtJ[j];
var jBound = jBoundsAtI[i];
if (i < iBound.Min || i > iBound.Max ||
j < jBound.Min || j > jBound.Max)
{
outOfBounds = true;
break;
}
}
if (outOfBounds)
{
break;
}
}
// If no points are out of bounds, we have our biggest valid area
if (!outOfBounds)
{
maxValidArea = tileArea.Area;
break;
}
}
if (display)
{
AnsiConsole.MarkupLine($"[green]Max valid tile area is: [yellow]{maxValidArea}[/][/]");
}
}
private static List<TilePosition> ParseTilePositions(string input)
{
var tilePositions = new List<TilePosition>();
foreach (var line in input.EnumerateLines())
{
var splitIndex = line.IndexOf(',');
var j = long.Parse(line[..splitIndex]);
var i = long.Parse(line[(splitIndex + 1)..]);
tilePositions.Add(new TilePosition(i, j));
}
return tilePositions;
}
private record TilePosition(long I, long J);
private record TileArea(TilePosition First, TilePosition Second, long Area);
private record PositionBounds(long Min, long Max);
}

496
Inputs/Day9.txt Normal file
View File

@@ -0,0 +1,496 @@
97585,50248
97585,51467
98011,51467
98011,52664
97624,52664
97624,53893
97833,53893
97833,55069
97390,55069
97390,56345
97829,56345
97829,57524
97460,57524
97460,58782
97572,58782
97572,59956
97198,59956
97198,61016
96374,61016
96374,62214
96181,62214
96181,63484
96212,63484
96212,64456
95248,64456
95248,65667
95066,65667
95066,67043
95291,67043
95291,68196
94873,68196
94873,69349
94448,69349
94448,70107
93166,70107
93166,71163
92581,71163
92581,72635
92788,72635
92788,73416
91675,73416
91675,74627
91340,74627
91340,75665
90702,75665
90702,76625
89944,76625
89944,77509
89088,77509
89088,78597
88521,78597
88521,79776
88055,79776
88055,80561
87084,80561
87084,81419
86215,81419
86215,82395
85482,82395
85482,83317
84685,83317
84685,84019
83666,84019
83666,84810
82745,84810
82745,85843
82045,85843
82045,86820
81277,86820
81277,87497
80251,87497
80251,88494
79477,88494
79477,88593
78030,88593
78030,89634
77280,89634
77280,89943
76026,89943
76026,90526
74967,90526
74967,91920
74383,91920
74383,91768
72899,91768
72899,92395
71864,92395
71864,93277
70949,93277
70949,93688
69798,93688
69798,94241
68712,94241
68712,94401
67468,94401
67468,95078
66428,95078
66428,95669
65344,95669
65344,95733
64087,95733
64087,96248
62972,96248
62972,96251
61718,96251
61718,96888
60623,96888
60623,97184
59440,97184
59440,97469
58252,97469
58252,97411
57010,97411
57010,97271
55770,97271
55770,97969
54625,97969
54625,97509
53368,97509
53368,97865
52177,97865
52177,98329
50972,98329
50972,97669
49751,97669
49751,98319
48523,98319
48523,97525
47341,97525
47341,98287
46069,98287
46069,97717
44896,97717
44896,97342
43719,97342
43719,97436
42479,97436
42479,97459
41237,97459
41237,96815
40124,96815
40124,96681
38910,96681
38910,96602
37673,96602
37673,96208
36516,96208
36516,96041
35290,96041
35290,95193
34288,95193
34288,95385
32921,95385
32921,94861
31808,94861
31808,94399
30671,94399
30671,93112
29918,93112
29918,92913
28671,92913
28671,92119
27718,92119
27718,91442
26713,91442
26713,90915
25626,90915
25626,90593
24402,90593
24402,90340
23110,90340
23110,89440
22241,89440
22241,88276
21584,88276
21584,88126
20168,88126
20168,87236
19312,87236
19312,86576
18267,86576
18267,85553
17540,85553
17540,84543
16818,84543
16818,84064
15578,84064
15578,82797
15134,82797
15134,82017
14188,82017
14188,81332
13114,81332
13114,80221
12539,80221
12539,79343
11679,79343
11679,78473
10797,78473
10797,77118
10600,77118
10600,76172
9833,76172
9833,75371
8818,75371
8818,74320
8188,74320
8188,73033
7986,73033
7986,72180
6992,72180
6992,70709
7218,70709
7218,69965
5942,69965
5942,68792
5570,68792
5570,67655
5122,67655
5122,66576
4514,66576
4514,65236
4651,65236
4651,64191
3928,64191
3928,62832
4250,62832
4250,61676
3913,61676
3913,60666
2919,60666
2919,59414
2946,59414
2946,58189
2892,58189
2892,56982
2777,56982
2777,55788
2574,55788
2574,54613
2155,54613
2155,53375
2393,53375
2393,52161
2489,52161
2489,50972
1685,50972
1685,50233
94693,50233
94693,48547
2466,48547
2466,47345
2551,47345
2551,46084
1904,46084
1904,44845
1813,44845
1813,43720
2666,43720
2666,42503
2716,42503
2716,41195
2312,41195
2312,39998
2589,39998
2589,38961
3533,38961
3533,37735
3628,37735
3628,36546
3891,36546
3891,35426
4385,35426
4385,34229
4636,34229
4636,33077
5030,33077
5030,31900
5365,31900
5365,30944
6227,30944
6227,29769
6568,29769
6568,28433
6606,28433
6606,27418
7313,27418
7313,26275
7777,26275
7777,25552
8961,25552
8961,24577
9683,24577
9683,23129
9687,23129
9687,22300
10641,22300
10641,21279
11313,21279
11313,20286
12023,20286
12023,19683
13213,19683
13213,18319
13483,18319
13483,17693
14613,17693
14613,16947
15590,16947
15590,16218
16569,16218
16569,15163
17229,15163
17229,14557
18313,14557
18313,13183
18725,13183
18725,12585
19816,12585
19816,12148
21015,12148
21015,11048
21709,11048
21709,10762
22992,10762
22992,9767
23784,9767
23784,9322
24939,9322
24939,8676
25963,8676
25963,7514
26707,7514
26707,7778
28224,7778
28224,6471
28929,6471
28929,5994
30058,5994
30058,5415
31142,5415
31142,5016
32302,5016
32302,5001
33600,5001
33600,4185
34606,4185
34606,4274
35915,4274
35915,4067
37115,4067
37115,3573
38237,3573
38237,3513
39467,3513
39467,2540
40504,2540
40504,2957
41821,2957
41821,2937
43041,2937
43041,2846
44244,2846
44244,2199
45390,2199
45390,2050
46599,2050
46599,2503
47839,2503
47839,2250
49039,2250
49039,1529
50252,1529
50252,2416
51454,2416
51454,1673
52703,1673
52703,1731
53929,1731
53929,2741
55054,2741
55054,2806
56260,2806
56260,2303
57561,2303
57561,3250
58630,3250
58630,3491
59810,3491
59810,3232
61110,3232
61110,3305
62350,3305
62350,4267
63344,4267
63344,4292
64603,4292
64603,4541
65803,4541
65803,4718
67039,4718
67039,5971
67854,5971
67854,5795
69243,5795
69243,6472
70275,6472
70275,7075
71333,7075
71333,7586
72437,7586
72437,7724
73754,7724
73754,9007
74419,9007
74419,9432
75580,9432
75580,9758
76823,9758
76823,10995
77451,10995
77451,11204
78800,11204
78800,12349
79458,12349
79458,12754
80694,12754
80694,13689
81501,13689
81501,14846
82094,14846
82094,15182
83443,15182
83443,16129
84225,16129
84225,17007
85072,17007
85072,18270
85490,18270
85490,18716
86827,18716
86827,20047
87127,20047
87127,20860
88053,20860
88053,21861
88741,21861
88741,22893
89380,22893
89380,24056
89814,24056
89814,24648
91149,24648
91149,26031
91207,26031
91207,26881
92167,26881
92167,28131
92401,28131
92401,29090
93195,29090
93195,30092
93928,30092
93928,31302
94206,31302
94206,32338
94892,32338
94892,33518
95224,33518
95224,34662
95649,34662
95649,35913
95732,35913
95732,37043
96192,37043
96192,38216
96509,38216
96509,39482
96423,39482
96423,40678
96588,40678
96588,41805
97135,41805
97135,43000
97341,43000
97341,44214
97400,44214
97400,45418
97517,45418
97517,46570
98364,46570
98364,47828
97740,47828
97740,49030
98198,49030
98198,50248