feat: Add day 9 (without definitiv solution for part 2)
This commit is contained in:
parent
96f50957a4
commit
ab2bf7f386
3 changed files with 623 additions and 0 deletions
8
AdventOfCode2025/Inputs/Day9_0.txt
Normal file
8
AdventOfCode2025/Inputs/Day9_0.txt
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
7,1
|
||||||
|
11,1
|
||||||
|
11,7
|
||||||
|
9,7
|
||||||
|
9,5
|
||||||
|
2,5
|
||||||
|
2,3
|
||||||
|
7,3
|
||||||
496
AdventOfCode2025/Inputs/Day9_1.txt
Normal file
496
AdventOfCode2025/Inputs/Day9_1.txt
Normal file
|
|
@ -0,0 +1,496 @@
|
||||||
|
97989,50290
|
||||||
|
97989,51491
|
||||||
|
97502,51491
|
||||||
|
97502,52723
|
||||||
|
97969,52723
|
||||||
|
97969,53929
|
||||||
|
97784,53929
|
||||||
|
97784,55111
|
||||||
|
97415,55111
|
||||||
|
97415,56355
|
||||||
|
97603,56355
|
||||||
|
97603,57620
|
||||||
|
97806,57620
|
||||||
|
97806,58795
|
||||||
|
97420,58795
|
||||||
|
97420,60036
|
||||||
|
97381,60036
|
||||||
|
97381,61082
|
||||||
|
96479,61082
|
||||||
|
96479,62403
|
||||||
|
96738,62403
|
||||||
|
96738,63461
|
||||||
|
95990,63461
|
||||||
|
95990,64680
|
||||||
|
95819,64680
|
||||||
|
95819,65812
|
||||||
|
95362,65812
|
||||||
|
95362,67051
|
||||||
|
95198,67051
|
||||||
|
95198,68160
|
||||||
|
94676,68160
|
||||||
|
94676,69290
|
||||||
|
94212,69290
|
||||||
|
94212,70413
|
||||||
|
93728,70413
|
||||||
|
93728,71204
|
||||||
|
92575,71204
|
||||||
|
92575,72650
|
||||||
|
92730,72650
|
||||||
|
92730,73331
|
||||||
|
91442,73331
|
||||||
|
91442,74529
|
||||||
|
91099,74529
|
||||||
|
91099,75554
|
||||||
|
90450,75554
|
||||||
|
90450,76726
|
||||||
|
90023,76726
|
||||||
|
90023,77816
|
||||||
|
89454,77816
|
||||||
|
89454,78682
|
||||||
|
88568,78682
|
||||||
|
88568,79549
|
||||||
|
87701,79549
|
||||||
|
87701,80687
|
||||||
|
87173,80687
|
||||||
|
87173,81723
|
||||||
|
86503,81723
|
||||||
|
86503,82480
|
||||||
|
85516,82480
|
||||||
|
85516,83576
|
||||||
|
84896,83576
|
||||||
|
84896,84275
|
||||||
|
83863,84275
|
||||||
|
83863,85339
|
||||||
|
83187,85339
|
||||||
|
83187,85797
|
||||||
|
81950,85797
|
||||||
|
81950,86483
|
||||||
|
80938,86483
|
||||||
|
80938,87077
|
||||||
|
79861,87077
|
||||||
|
79861,88209
|
||||||
|
79208,88209
|
||||||
|
79208,89104
|
||||||
|
78352,89104
|
||||||
|
78352,89637
|
||||||
|
77234,89637
|
||||||
|
77234,90451
|
||||||
|
76310,90451
|
||||||
|
76310,90829
|
||||||
|
75107,90829
|
||||||
|
75107,91245
|
||||||
|
73945,91245
|
||||||
|
73945,91916
|
||||||
|
72934,91916
|
||||||
|
72934,92396
|
||||||
|
71820,92396
|
||||||
|
71820,93211
|
||||||
|
70872,93211
|
||||||
|
70872,94077
|
||||||
|
69930,94077
|
||||||
|
69930,94527
|
||||||
|
68790,94527
|
||||||
|
68790,94258
|
||||||
|
67369,94258
|
||||||
|
67369,95368
|
||||||
|
66491,95368
|
||||||
|
66491,95479
|
||||||
|
65238,95479
|
||||||
|
65238,96120
|
||||||
|
64164,96120
|
||||||
|
64164,95840
|
||||||
|
62817,95840
|
||||||
|
62817,96910
|
||||||
|
61843,96910
|
||||||
|
61843,96748
|
||||||
|
60550,96748
|
||||||
|
60550,96930
|
||||||
|
59348,96930
|
||||||
|
59348,97072
|
||||||
|
58143,97072
|
||||||
|
58143,97949
|
||||||
|
57048,97949
|
||||||
|
57048,97240
|
||||||
|
55726,97240
|
||||||
|
55726,98112
|
||||||
|
54598,98112
|
||||||
|
54598,98237
|
||||||
|
53380,98237
|
||||||
|
53380,97914
|
||||||
|
52139,97914
|
||||||
|
52139,97992
|
||||||
|
50925,97992
|
||||||
|
50925,98410
|
||||||
|
49707,98410
|
||||||
|
49707,97863
|
||||||
|
48497,97863
|
||||||
|
48497,97485
|
||||||
|
47303,97485
|
||||||
|
47303,98306
|
||||||
|
46027,98306
|
||||||
|
46027,97967
|
||||||
|
44828,97967
|
||||||
|
44828,97098
|
||||||
|
43711,97098
|
||||||
|
43711,97154
|
||||||
|
42483,97154
|
||||||
|
42483,97339
|
||||||
|
41219,97339
|
||||||
|
41219,96502
|
||||||
|
40149,96502
|
||||||
|
40149,96571
|
||||||
|
38895,96571
|
||||||
|
38895,96615
|
||||||
|
37628,96615
|
||||||
|
37628,95738
|
||||||
|
36612,95738
|
||||||
|
36612,95467
|
||||||
|
35431,95467
|
||||||
|
35431,95568
|
||||||
|
34115,95568
|
||||||
|
34115,94799
|
||||||
|
33098,94799
|
||||||
|
33098,94374
|
||||||
|
31962,94374
|
||||||
|
31962,93971
|
||||||
|
30814,93971
|
||||||
|
30814,93488
|
||||||
|
29698,93488
|
||||||
|
29698,92987
|
||||||
|
28589,92987
|
||||||
|
28589,92387
|
||||||
|
27531,92387
|
||||||
|
27531,91964
|
||||||
|
26374,91964
|
||||||
|
26374,91195
|
||||||
|
25412,91195
|
||||||
|
25412,90587
|
||||||
|
24359,90587
|
||||||
|
24359,90142
|
||||||
|
23193,90142
|
||||||
|
23193,88876
|
||||||
|
22590,88876
|
||||||
|
22590,88559
|
||||||
|
21324,88559
|
||||||
|
21324,87802
|
||||||
|
20371,87802
|
||||||
|
20371,86713
|
||||||
|
19692,86713
|
||||||
|
19692,86217
|
||||||
|
18525,86217
|
||||||
|
18525,85067
|
||||||
|
17930,85067
|
||||||
|
17930,84389
|
||||||
|
16911,84389
|
||||||
|
16911,83742
|
||||||
|
15846,83742
|
||||||
|
15846,82958
|
||||||
|
14904,82958
|
||||||
|
14904,81974
|
||||||
|
14175,81974
|
||||||
|
14175,81240
|
||||||
|
13160,81240
|
||||||
|
13160,80274
|
||||||
|
12409,80274
|
||||||
|
12409,79076
|
||||||
|
11962,79076
|
||||||
|
11962,78077
|
||||||
|
11274,78077
|
||||||
|
11274,77102
|
||||||
|
10554,77102
|
||||||
|
10554,76169
|
||||||
|
9765,76169
|
||||||
|
9765,75200
|
||||||
|
9019,75200
|
||||||
|
9019,74195
|
||||||
|
8323,74195
|
||||||
|
8323,72908
|
||||||
|
8132,72908
|
||||||
|
8132,72167
|
||||||
|
6929,72167
|
||||||
|
6929,70969
|
||||||
|
6588,70969
|
||||||
|
6588,69949
|
||||||
|
5879,69949
|
||||||
|
5879,68497
|
||||||
|
6165,68497
|
||||||
|
6165,67407
|
||||||
|
5643,67407
|
||||||
|
5643,66510
|
||||||
|
4579,66510
|
||||||
|
4579,65176
|
||||||
|
4704,65176
|
||||||
|
4704,64177
|
||||||
|
3836,64177
|
||||||
|
3836,62896
|
||||||
|
3875,62896
|
||||||
|
3875,61817
|
||||||
|
3194,61817
|
||||||
|
3194,60482
|
||||||
|
3554,60482
|
||||||
|
3554,59411
|
||||||
|
2752,59411
|
||||||
|
2752,58208
|
||||||
|
2547,58208
|
||||||
|
2547,56980
|
||||||
|
2517,56980
|
||||||
|
2517,55823
|
||||||
|
1958,55823
|
||||||
|
1958,54524
|
||||||
|
2667,54524
|
||||||
|
2667,53339
|
||||||
|
2335,53339
|
||||||
|
2335,52126
|
||||||
|
2375,52126
|
||||||
|
2375,50925
|
||||||
|
2009,50925
|
||||||
|
2009,50270
|
||||||
|
94671,50270
|
||||||
|
94671,48487
|
||||||
|
1828,48487
|
||||||
|
1828,47303
|
||||||
|
2513,47303
|
||||||
|
2513,46074
|
||||||
|
2271,46074
|
||||||
|
2271,44890
|
||||||
|
2603,44890
|
||||||
|
2603,43602
|
||||||
|
2079,43602
|
||||||
|
2079,42477
|
||||||
|
2804,42477
|
||||||
|
2804,41220
|
||||||
|
2668,41220
|
||||||
|
2668,40118
|
||||||
|
3347,40118
|
||||||
|
3347,38850
|
||||||
|
3239,38850
|
||||||
|
3239,37808
|
||||||
|
4061,37808
|
||||||
|
4061,36600
|
||||||
|
4219,36600
|
||||||
|
4219,35259
|
||||||
|
3995,35259
|
||||||
|
3995,34127
|
||||||
|
4466,34127
|
||||||
|
4466,33015
|
||||||
|
4977,33015
|
||||||
|
4977,32062
|
||||||
|
5871,32062
|
||||||
|
5871,30606
|
||||||
|
5552,30606
|
||||||
|
5552,29497
|
||||||
|
6079,29497
|
||||||
|
6079,28474
|
||||||
|
6780,28474
|
||||||
|
6780,27581
|
||||||
|
7708,27581
|
||||||
|
7708,26356
|
||||||
|
8004,26356
|
||||||
|
8004,25160
|
||||||
|
8381,25160
|
||||||
|
8381,24143
|
||||||
|
9070,24143
|
||||||
|
9070,23088
|
||||||
|
9700,23088
|
||||||
|
9700,22283
|
||||||
|
10688,22283
|
||||||
|
10688,21165
|
||||||
|
11226,21165
|
||||||
|
11226,20507
|
||||||
|
12371,20507
|
||||||
|
12371,19452
|
||||||
|
12995,19452
|
||||||
|
12995,18580
|
||||||
|
13845,18580
|
||||||
|
13845,17660
|
||||||
|
14637,17660
|
||||||
|
14637,16652
|
||||||
|
15341,16652
|
||||||
|
15341,16010
|
||||||
|
16419,16010
|
||||||
|
16419,15192
|
||||||
|
17311,15192
|
||||||
|
17311,14185
|
||||||
|
18034,14185
|
||||||
|
18034,13675
|
||||||
|
19196,13675
|
||||||
|
19196,12791
|
||||||
|
20033,12791
|
||||||
|
20033,12200
|
||||||
|
21105,12200
|
||||||
|
21105,10904
|
||||||
|
21654,10904
|
||||||
|
21654,10593
|
||||||
|
22924,10593
|
||||||
|
22924,9648
|
||||||
|
23754,9648
|
||||||
|
23754,9111
|
||||||
|
24855,9111
|
||||||
|
24855,8201
|
||||||
|
25734,8201
|
||||||
|
25734,7917
|
||||||
|
26974,7917
|
||||||
|
26974,7749
|
||||||
|
28254,7749
|
||||||
|
28254,6483
|
||||||
|
28979,6483
|
||||||
|
28979,5864
|
||||||
|
30043,5864
|
||||||
|
30043,5557
|
||||||
|
31245,5557
|
||||||
|
31245,5054
|
||||||
|
32361,5054
|
||||||
|
32361,5264
|
||||||
|
33738,5264
|
||||||
|
33738,4569
|
||||||
|
34777,4569
|
||||||
|
34777,4441
|
||||||
|
36008,4441
|
||||||
|
36008,3722
|
||||||
|
37060,3722
|
||||||
|
37060,3583
|
||||||
|
38281,3583
|
||||||
|
38281,3084
|
||||||
|
39411,3084
|
||||||
|
39411,2546
|
||||||
|
40546,2546
|
||||||
|
40546,2210
|
||||||
|
41732,2210
|
||||||
|
41732,2116
|
||||||
|
42960,2116
|
||||||
|
42960,2271
|
||||||
|
44214,2271
|
||||||
|
44214,2396
|
||||||
|
45450,2396
|
||||||
|
45450,2291
|
||||||
|
46657,2291
|
||||||
|
46657,2476
|
||||||
|
47878,2476
|
||||||
|
47878,1871
|
||||||
|
49071,1871
|
||||||
|
49071,2077
|
||||||
|
50289,2077
|
||||||
|
50289,2199
|
||||||
|
51500,2199
|
||||||
|
51500,1876
|
||||||
|
52732,1876
|
||||||
|
52732,2410
|
||||||
|
53913,2410
|
||||||
|
53913,2140
|
||||||
|
55159,2140
|
||||||
|
55159,2707
|
||||||
|
56314,2707
|
||||||
|
56314,2740
|
||||||
|
57532,2740
|
||||||
|
57532,3112
|
||||||
|
58696,3112
|
||||||
|
58696,3343
|
||||||
|
59882,3343
|
||||||
|
59882,2828
|
||||||
|
61247,2828
|
||||||
|
61247,3779
|
||||||
|
62266,3779
|
||||||
|
62266,3854
|
||||||
|
63506,3854
|
||||||
|
63506,4047
|
||||||
|
64723,4047
|
||||||
|
64723,4846
|
||||||
|
65739,4846
|
||||||
|
65739,5010
|
||||||
|
66972,5010
|
||||||
|
66972,5441
|
||||||
|
68112,5441
|
||||||
|
68112,5931
|
||||||
|
69227,5931
|
||||||
|
69227,6172
|
||||||
|
70459,6172
|
||||||
|
70459,6919
|
||||||
|
71456,6919
|
||||||
|
71456,7579
|
||||||
|
72486,7579
|
||||||
|
72486,7942
|
||||||
|
73678,7942
|
||||||
|
73678,8504
|
||||||
|
74766,8504
|
||||||
|
74766,9270
|
||||||
|
75730,9270
|
||||||
|
75730,9968
|
||||||
|
76731,9968
|
||||||
|
76731,10498
|
||||||
|
77850,10498
|
||||||
|
77850,11140
|
||||||
|
78898,11140
|
||||||
|
78898,12581
|
||||||
|
79328,12581
|
||||||
|
79328,12708
|
||||||
|
80784,12708
|
||||||
|
80784,13781
|
||||||
|
81475,13781
|
||||||
|
81475,14230
|
||||||
|
82711,14230
|
||||||
|
82711,15695
|
||||||
|
83006,15695
|
||||||
|
83006,15935
|
||||||
|
84479,15935
|
||||||
|
84479,17023
|
||||||
|
85114,17023
|
||||||
|
85114,18332
|
||||||
|
85480,18332
|
||||||
|
85480,18794
|
||||||
|
86798,18794
|
||||||
|
86798,19621
|
||||||
|
87719,19621
|
||||||
|
87719,20964
|
||||||
|
87983,20964
|
||||||
|
87983,21736
|
||||||
|
88981,21736
|
||||||
|
88981,22800
|
||||||
|
89587,22800
|
||||||
|
89587,23867
|
||||||
|
90178,23867
|
||||||
|
90178,24657
|
||||||
|
91212,24657
|
||||||
|
91212,26069
|
||||||
|
91221,26069
|
||||||
|
91221,26769
|
||||||
|
92456,26769
|
||||||
|
92456,28143
|
||||||
|
92466,28143
|
||||||
|
92466,29304
|
||||||
|
92844,29304
|
||||||
|
92844,30131
|
||||||
|
93940,30131
|
||||||
|
93940,31209
|
||||||
|
94528,31209
|
||||||
|
94528,32510
|
||||||
|
94564,32510
|
||||||
|
94564,33582
|
||||||
|
95164,33582
|
||||||
|
95164,34788
|
||||||
|
95398,34788
|
||||||
|
95398,36002
|
||||||
|
95576,36002
|
||||||
|
95576,37113
|
||||||
|
96087,37113
|
||||||
|
96087,38310
|
||||||
|
96298,38310
|
||||||
|
96298,39518
|
||||||
|
96444,39518
|
||||||
|
96444,40649
|
||||||
|
96940,40649
|
||||||
|
96940,41756
|
||||||
|
97650,41756
|
||||||
|
97650,42969
|
||||||
|
97823,42969
|
||||||
|
97823,44226
|
||||||
|
97631,44226
|
||||||
|
97631,45435
|
||||||
|
97757,45435
|
||||||
|
97757,46669
|
||||||
|
97524,46669
|
||||||
|
97524,47877
|
||||||
|
97545,47877
|
||||||
|
97545,49067
|
||||||
|
98367,49067
|
||||||
|
98367,50290
|
||||||
119
AdventOfCode2025/Solutions/Day9.cs
Normal file
119
AdventOfCode2025/Solutions/Day9.cs
Normal file
|
|
@ -0,0 +1,119 @@
|
||||||
|
using Position = (long X, long Y);
|
||||||
|
|
||||||
|
namespace AdventOfCode2025.Solutions;
|
||||||
|
|
||||||
|
public class Day9() : Solution(9)
|
||||||
|
{
|
||||||
|
private const char SplitChar = ',';
|
||||||
|
|
||||||
|
public override string SolvePart1() =>
|
||||||
|
GetPositionCombinations(GetPositions().ToList())
|
||||||
|
.Select(combination => CalculateRectangleArea(combination.Pos1, combination.Pos2))
|
||||||
|
.Max()
|
||||||
|
.ToString();
|
||||||
|
|
||||||
|
public override string SolvePart2()
|
||||||
|
{
|
||||||
|
List<Position> positions = GetPositions().ToList();
|
||||||
|
|
||||||
|
// var areas =
|
||||||
|
// GetPositionCombinations(positions)
|
||||||
|
// .Select(GetRectangleCorners)
|
||||||
|
// .Where(corners => corners.All(pos => IsPointInsidePolygon(pos, positions)))
|
||||||
|
// .Select(corners => CalculateRectangleArea(corners[0], corners[2]))
|
||||||
|
// .Max();
|
||||||
|
var areas =
|
||||||
|
GetPositionCombinations(positions)
|
||||||
|
.AsParallel()
|
||||||
|
.Where(combination => AreAllRectanglePointsInsidePolygon(combination.Pos1, combination.Pos2, positions))
|
||||||
|
.Select(combination => CalculateRectangleArea(combination.Pos1, combination.Pos2))
|
||||||
|
.Max();
|
||||||
|
return areas.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool AreAllRectanglePointsInsidePolygon(Position pos1, Position pos2, List<Position> polygon)
|
||||||
|
{
|
||||||
|
var minX = Math.Min(pos1.X, pos2.X);
|
||||||
|
var maxX = Math.Max(pos1.X, pos2.X);
|
||||||
|
var minY = Math.Min(pos1.Y, pos2.Y);
|
||||||
|
var maxY = Math.Max(pos1.Y, pos2.Y);
|
||||||
|
|
||||||
|
if (GetRectangleCorners(pos1, pos2).All(corner => IsPointInsidePolygon(corner, polygon)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var x = minX; x <= maxX; x++)
|
||||||
|
{
|
||||||
|
for (var y = minY; y <= maxY; y++)
|
||||||
|
{
|
||||||
|
if (!IsPointInsidePolygon((x, y), polygon))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ray-casting algorithm or even-odd rule
|
||||||
|
private static bool IsPointInsidePolygon(Position point, List<Position> polygon)
|
||||||
|
{
|
||||||
|
var intersections = 0;
|
||||||
|
var n = polygon.Count;
|
||||||
|
|
||||||
|
for (var i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
var p1 = polygon[i];
|
||||||
|
var p2 = polygon[(i + 1) % n];
|
||||||
|
|
||||||
|
if (p1.Y > point.Y != p2.Y > point.Y && point.X < (p2.X - p1.X) * (point.Y - p1.Y) / (p2.Y - p1.Y) + p1.X)
|
||||||
|
{
|
||||||
|
intersections++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return intersections % 2 == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IEnumerable<(Position Pos1, Position Pos2)> GetPositionCombinations(List<Position> positions)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < positions.Count; i++)
|
||||||
|
{
|
||||||
|
for (var j = i + 1; j < positions.Count; j++)
|
||||||
|
{
|
||||||
|
yield return (positions.ElementAt(i), positions.ElementAt(j));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static long CalculateRectangleArea(Position pos1, Position pos2)
|
||||||
|
{
|
||||||
|
var length = Math.Abs(pos1.X - pos2.X) + 1;
|
||||||
|
var width = Math.Abs(pos1.Y - pos2.Y) + 1;
|
||||||
|
return length * width;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Position[] GetRectangleCorners(Position pos1, Position pos2)
|
||||||
|
{
|
||||||
|
var minX = Math.Min(pos1.X, pos2.X);
|
||||||
|
var maxX = Math.Max(pos1.X, pos2.X);
|
||||||
|
var minY = Math.Min(pos1.Y, pos2.Y);
|
||||||
|
var maxY = Math.Max(pos1.Y, pos2.Y);
|
||||||
|
|
||||||
|
return
|
||||||
|
[
|
||||||
|
(minX, minY),
|
||||||
|
(maxX, minY),
|
||||||
|
(maxX, maxY),
|
||||||
|
(minX, maxY)
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerable<Position> GetPositions() => Input.Lines.Select(line =>
|
||||||
|
{
|
||||||
|
var values = line.Split(SplitChar);
|
||||||
|
return (X: long.Parse(values[0]), Y: long.Parse(values[1]));
|
||||||
|
});
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue