diff --git a/Days/Day9.cs b/Days/Day9.cs new file mode 100644 index 0000000..5e14308 --- /dev/null +++ b/Days/Day9.cs @@ -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(); + + 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(); + var iBoundsAtJ = new Dictionary(); + 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 ParseTilePositions(string input) + { + var tilePositions = new List(); + + 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); +} \ No newline at end of file diff --git a/Inputs/Day9.txt b/Inputs/Day9.txt new file mode 100644 index 0000000..bda8746 --- /dev/null +++ b/Inputs/Day9.txt @@ -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 \ No newline at end of file