diff --git a/.gitignore b/.gitignore index 52a8de5..3e0dff2 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ riderModule.iml /_ReSharper.Caches/ .idea/.idea.AdventOfCode/.idea AdventOfCode.sln.DotSettings.user +BenchmarkDotNet.Artifacts diff --git a/AdventOfCode.csproj b/AdventOfCode.csproj index efbbd57..ddbe11f 100644 --- a/AdventOfCode.csproj +++ b/AdventOfCode.csproj @@ -8,6 +8,7 @@ + diff --git a/DayBenchmarker.cs b/DayBenchmarker.cs new file mode 100644 index 0000000..94b11e5 --- /dev/null +++ b/DayBenchmarker.cs @@ -0,0 +1,23 @@ +using AdventOfCode.Days; +using BenchmarkDotNet.Attributes; + +namespace AdventOfCode; + +[ShortRunJob] +[MemoryDiagnoser(false)] +public class DayBenchmark +{ + private Day Day => new Day15(); + + [Benchmark] + public void Part1() + { + Day.RunPart1(display: false); + } + + [Benchmark] + public void Part2() + { + Day.RunPart2(display: false); + } +} \ No newline at end of file diff --git a/Days/Day.cs b/Days/Day.cs index f84954d..1e3b747 100644 --- a/Days/Day.cs +++ b/Days/Day.cs @@ -4,9 +4,9 @@ public abstract class Day { public abstract int Number { get; } public abstract string Name { get; } - - public abstract void RunPart1(); - public abstract void RunPart2(); + + public abstract void RunPart1(bool display = true); + public abstract void RunPart2(bool display = true); public override string ToString() { diff --git a/Days/Day1.cs b/Days/Day1.cs index 2247034..0c53261 100644 --- a/Days/Day1.cs +++ b/Days/Day1.cs @@ -7,7 +7,7 @@ public class Day1 : Day public override int Number => 1; public override string Name => "Calorie Counting"; - public override void RunPart1() + public override void RunPart1(bool display = true) { int currentCalories = 0; int maxCalories = 0; @@ -27,14 +27,17 @@ public class Day1 : Day currentCalories += int.Parse(line); } - - AnsiConsole.MarkupLine($"[green]Max calories is: [yellow]{maxCalories}[/][/]"); + + if (display) + { + AnsiConsole.MarkupLine($"[green]Max calories is: [yellow]{maxCalories}[/][/]"); + } } - - public override void RunPart2() + + public override void RunPart2(bool display = true) { var elfCalories = new List(); - + int currentCalories = 0; foreach (var line in Input.ReadAllLines()) { @@ -51,18 +54,22 @@ public class Day1 : Day } var totalCalories = elfCalories.OrderByDescending(c => c).Take(3).Sum(); - AnsiConsole.MarkupLine($"[green]Total calories by top 3 elf is: [yellow]{totalCalories}[/][/]"); + + if (display) + { + AnsiConsole.MarkupLine($"[green]Total calories by top 3 elf is: [yellow]{totalCalories}[/][/]"); + } } #region Input - public const string Input = + public const string Input = """ 10062 15651 1271 14355 7220 - + 4878 1754 8466 @@ -73,14 +80,14 @@ public class Day1 : Day 3172 1327 6310 - + 22413 4145 22294 - + 23108 30453 - + 2084 3496 4800 @@ -91,11 +98,11 @@ public class Day1 : Day 2558 2120 6159 - + 25265 20200 2083 - + 7424 5830 2575 @@ -107,9 +114,9 @@ public class Day1 : Day 2059 7145 7223 - + 58621 - + 2926 9188 7432 @@ -119,7 +126,7 @@ public class Day1 : Day 5517 2703 5446 - + 2457 5814 1294 @@ -130,7 +137,7 @@ public class Day1 : Day 1964 1155 2380 - + 2812 1827 5533 @@ -145,20 +152,20 @@ public class Day1 : Day 2681 4849 5250 - + 2922 10365 5819 10227 2962 2702 - + 2982 9254 14137 5026 9374 - + 5933 2888 2250 @@ -172,7 +179,7 @@ public class Day1 : Day 1032 5847 5383 - + 5044 5922 3155 @@ -184,9 +191,9 @@ public class Day1 : Day 4649 2764 6444 - + 12932 - + 4764 4285 1278 @@ -201,7 +208,7 @@ public class Day1 : Day 5748 5573 5848 - + 6078 6687 5510 @@ -212,7 +219,7 @@ public class Day1 : Day 1356 4064 4159 - + 7426 1147 4176 @@ -220,11 +227,11 @@ public class Day1 : Day 9484 7907 10806 - + 24981 21675 9324 - + 5537 5730 1280 @@ -239,14 +246,14 @@ public class Day1 : Day 3816 3859 5406 - + 1315 8662 2280 11800 10201 3886 - + 3048 4147 3299 @@ -262,7 +269,7 @@ public class Day1 : Day 5213 1338 3929 - + 5456 4051 1621 @@ -277,7 +284,7 @@ public class Day1 : Day 4335 3015 1139 - + 2875 6387 2926 @@ -291,7 +298,7 @@ public class Day1 : Day 6728 3302 6345 - + 9641 5967 10265 @@ -300,7 +307,7 @@ public class Day1 : Day 5632 4913 6151 - + 5890 4285 3601 @@ -313,17 +320,17 @@ public class Day1 : Day 7214 4034 1032 - + 4266 2086 12754 8475 5044 9616 - + 27815 19415 - + 7914 11106 6938 @@ -331,17 +338,17 @@ public class Day1 : Day 6902 2983 3710 - + 7659 3565 1310 11842 - + 8750 17624 9697 16020 - + 4606 6296 2321 @@ -352,12 +359,12 @@ public class Day1 : Day 8016 7910 4786 - + 11012 12831 3980 12204 - + 7996 7933 1500 @@ -368,7 +375,7 @@ public class Day1 : Day 7506 8096 8661 - + 5694 4145 3095 @@ -381,7 +388,7 @@ public class Day1 : Day 5043 1241 5011 - + 2410 7373 6724 @@ -392,7 +399,7 @@ public class Day1 : Day 8336 6517 1376 - + 6084 9909 1760 @@ -400,15 +407,15 @@ public class Day1 : Day 4904 6734 9492 - + 8002 4098 - + 17545 1504 17040 14118 - + 1103 5378 6135 @@ -423,7 +430,7 @@ public class Day1 : Day 2252 1904 3474 - + 1788 5889 7810 @@ -433,7 +440,7 @@ public class Day1 : Day 1422 9526 6762 - + 1187 2137 6551 @@ -442,7 +449,7 @@ public class Day1 : Day 7099 3465 5179 - + 7056 3142 3237 @@ -455,7 +462,7 @@ public class Day1 : Day 4493 5359 1336 - + 4690 6692 4638 @@ -467,7 +474,7 @@ public class Day1 : Day 7742 1895 4528 - + 4929 5947 5044 @@ -481,14 +488,14 @@ public class Day1 : Day 6390 5467 5496 - + 11896 13381 1055 3993 4275 12480 - + 1903 1527 3280 @@ -503,7 +510,7 @@ public class Day1 : Day 2345 2551 1901 - + 2674 9184 3423 @@ -513,13 +520,13 @@ public class Day1 : Day 7827 4466 4901 - + 4653 12104 14737 8740 4164 - + 5317 5734 4580 @@ -535,11 +542,11 @@ public class Day1 : Day 5408 5952 1849 - + 9691 16403 16828 - + 3653 6762 2042 @@ -551,7 +558,7 @@ public class Day1 : Day 6303 1662 6814 - + 3720 6801 2350 @@ -565,7 +572,7 @@ public class Day1 : Day 4022 3702 3169 - + 7146 5318 1820 @@ -575,22 +582,22 @@ public class Day1 : Day 8848 6614 5497 - + 11545 4050 20095 - + 8230 11577 6426 4671 11838 - + 1726 7355 8115 2780 - + 1795 4697 10410 @@ -598,7 +605,7 @@ public class Day1 : Day 2370 9497 1221 - + 2909 6719 2733 @@ -612,7 +619,7 @@ public class Day1 : Day 5855 5432 3804 - + 7874 7949 6658 @@ -621,10 +628,10 @@ public class Day1 : Day 3235 9142 2856 - + 6968 7042 - + 7463 8035 4908 @@ -635,13 +642,13 @@ public class Day1 : Day 8611 2114 8748 - + 11054 16021 9826 11604 4819 - + 11214 4850 11665 @@ -649,9 +656,9 @@ public class Day1 : Day 1347 4053 4570 - + 66862 - + 1597 6127 6229 @@ -659,13 +666,13 @@ public class Day1 : Day 9308 9661 11410 - + 13224 1160 1978 13018 14604 - + 2773 3885 2383 @@ -680,7 +687,7 @@ public class Day1 : Day 4116 6281 2026 - + 3714 2840 2116 @@ -694,7 +701,7 @@ public class Day1 : Day 4974 2005 5293 - + 2580 1645 5677 @@ -708,7 +715,7 @@ public class Day1 : Day 5658 4817 5911 - + 2126 2851 2766 @@ -717,12 +724,12 @@ public class Day1 : Day 3449 2765 1299 - + 18470 9129 17956 14494 - + 1033 4468 5938 @@ -730,7 +737,7 @@ public class Day1 : Day 2406 1175 5997 - + 1256 7932 1544 @@ -738,7 +745,7 @@ public class Day1 : Day 5709 1348 2919 - + 4399 1449 8295 @@ -748,7 +755,7 @@ public class Day1 : Day 2857 1722 5204 - + 8161 6865 6428 @@ -758,7 +765,7 @@ public class Day1 : Day 5109 1769 2125 - + 1112 7417 1328 @@ -770,11 +777,11 @@ public class Day1 : Day 6639 6129 4144 - + 5554 15529 1499 - + 9459 3175 7412 @@ -783,7 +790,7 @@ public class Day1 : Day 6807 10056 8657 - + 5195 1397 5365 @@ -799,20 +806,20 @@ public class Day1 : Day 2455 6048 4488 - + 10875 - + 5322 8688 2636 14243 - + 11403 7465 10079 2270 15254 - + 11758 7630 5137 @@ -820,9 +827,9 @@ public class Day1 : Day 7119 10008 6125 - + 5184 - + 4306 1159 6483 @@ -836,7 +843,7 @@ public class Day1 : Day 6841 2189 3030 - + 3132 6730 5733 @@ -848,11 +855,11 @@ public class Day1 : Day 4264 6006 3295 - + 4829 23038 16150 - + 1519 10692 11102 @@ -860,7 +867,7 @@ public class Day1 : Day 2948 11851 6301 - + 5787 2664 6046 @@ -876,14 +883,14 @@ public class Day1 : Day 2568 3589 5334 - + 2303 10849 3983 10010 4854 2111 - + 4576 1236 3111 @@ -896,7 +903,7 @@ public class Day1 : Day 5623 7257 2589 - + 6031 4307 6669 @@ -908,7 +915,7 @@ public class Day1 : Day 7149 3091 1001 - + 8737 1843 4676 @@ -919,7 +926,7 @@ public class Day1 : Day 1739 4845 2909 - + 1396 2963 10672 @@ -927,7 +934,7 @@ public class Day1 : Day 9975 6511 8694 - + 5262 3743 1895 @@ -943,23 +950,23 @@ public class Day1 : Day 5040 4052 5291 - + 16754 8916 17259 17813 - + 9683 13286 13577 9343 1792 3335 - + 25505 12891 20104 - + 8618 6560 4584 @@ -968,12 +975,12 @@ public class Day1 : Day 1229 6759 8275 - + 18418 14090 3552 3156 - + 4681 2564 4557 @@ -988,12 +995,12 @@ public class Day1 : Day 3089 4322 4049 - + 3768 12991 1680 2378 - + 2609 5115 2179 @@ -1008,21 +1015,21 @@ public class Day1 : Day 1728 2087 4708 - + 11919 12306 11697 9806 11749 3995 - + 5298 1877 2065 10499 3493 2892 - + 4172 2913 2288 @@ -1035,7 +1042,7 @@ public class Day1 : Day 2610 5309 5175 - + 6904 9471 1232 @@ -1045,10 +1052,10 @@ public class Day1 : Day 6327 6507 7603 - + 23962 3536 - + 3214 1102 3823 @@ -1064,7 +1071,7 @@ public class Day1 : Day 2407 3129 3586 - + 8438 2649 4887 @@ -1075,14 +1082,14 @@ public class Day1 : Day 1160 6542 8475 - + 10172 1686 5999 9145 10361 7814 - + 3049 5192 2091 @@ -1098,7 +1105,7 @@ public class Day1 : Day 5652 3636 3827 - + 5944 7870 2055 @@ -1106,7 +1113,7 @@ public class Day1 : Day 7574 8691 8852 - + 2178 1658 6451 @@ -1118,16 +1125,16 @@ public class Day1 : Day 2348 5377 2680 - + 6607 13797 10728 6412 - + 10824 25891 24424 - + 2278 3407 1688 @@ -1143,7 +1150,7 @@ public class Day1 : Day 5260 2094 2334 - + 3330 2884 6186 @@ -1155,7 +1162,7 @@ public class Day1 : Day 4569 1909 5574 - + 2073 2159 1468 @@ -1170,7 +1177,7 @@ public class Day1 : Day 1432 5501 2600 - + 7484 8409 8216 @@ -1179,13 +1186,13 @@ public class Day1 : Day 5125 5532 10092 - + 3704 4032 13787 14642 6007 - + 2893 3724 6947 @@ -1198,7 +1205,7 @@ public class Day1 : Day 5402 5771 2995 - + 3027 2193 4194 @@ -1213,7 +1220,7 @@ public class Day1 : Day 6162 1556 5269 - + 6162 7433 2853 @@ -1225,7 +1232,7 @@ public class Day1 : Day 6655 5549 2992 - + 3304 3655 2028 @@ -1237,7 +1244,7 @@ public class Day1 : Day 2769 2514 2146 - + 2616 5717 1758 @@ -1251,10 +1258,10 @@ public class Day1 : Day 2327 6678 5738 - + 17934 19341 - + 6652 3289 6927 @@ -1268,14 +1275,14 @@ public class Day1 : Day 5324 6085 2571 - + 4344 6656 3831 4768 12536 13166 - + 2696 5427 9429 @@ -1283,7 +1290,7 @@ public class Day1 : Day 5758 9578 4958 - + 6889 3107 1112 @@ -1297,7 +1304,7 @@ public class Day1 : Day 4325 5497 4214 - + 3588 5313 1330 @@ -1307,9 +1314,9 @@ public class Day1 : Day 9578 8426 4836 - + 31988 - + 5561 3355 5593 @@ -1324,7 +1331,7 @@ public class Day1 : Day 6329 3297 5067 - + 4244 1729 1598 @@ -1339,7 +1346,7 @@ public class Day1 : Day 4259 2821 1968 - + 5291 7790 8452 @@ -1348,7 +1355,7 @@ public class Day1 : Day 2069 1365 9288 - + 5533 4261 6170 @@ -1363,12 +1370,12 @@ public class Day1 : Day 4188 3993 1592 - + 15202 9385 17135 10731 - + 4591 2068 1136 @@ -1383,7 +1390,7 @@ public class Day1 : Day 3815 3595 4846 - + 8033 7540 9200 @@ -1392,7 +1399,7 @@ public class Day1 : Day 2148 7195 9335 - + 6923 4006 5057 @@ -1406,20 +1413,20 @@ public class Day1 : Day 3240 4363 2870 - + 18428 1484 6717 - + 21437 10877 - + 13896 13142 14976 4279 7760 - + 3736 3606 6255 @@ -1433,7 +1440,7 @@ public class Day1 : Day 4794 1810 3891 - + 7568 9015 8576 @@ -1443,7 +1450,7 @@ public class Day1 : Day 7403 7606 8039 - + 3523 5469 4603 @@ -1455,11 +1462,11 @@ public class Day1 : Day 1976 8036 1708 - + 23475 - + 58206 - + 8598 4206 7981 @@ -1470,11 +1477,11 @@ public class Day1 : Day 4155 6886 7736 - + 10064 5532 4310 - + 5605 6163 3079 @@ -1485,24 +1492,24 @@ public class Day1 : Day 3829 8064 5976 - + 14566 2324 11737 8884 - + 5741 9973 5120 8385 6468 6446 - + 12939 7370 11204 3902 - + 6531 6059 3199 @@ -1516,7 +1523,7 @@ public class Day1 : Day 5311 1092 3929 - + 2969 5314 5341 @@ -1526,12 +1533,12 @@ public class Day1 : Day 1458 4516 1911 - + 18278 17057 19676 13319 - + 1740 1218 7693 @@ -1543,9 +1550,9 @@ public class Day1 : Day 2606 3634 4818 - + 51246 - + 7826 5544 5835 @@ -1556,7 +1563,7 @@ public class Day1 : Day 7170 1166 7254 - + 2013 4870 1732 @@ -1571,7 +1578,7 @@ public class Day1 : Day 3028 1304 3809 - + 4410 6375 5386 @@ -1583,7 +1590,7 @@ public class Day1 : Day 4051 5263 4460 - + 3437 4993 6230 @@ -1596,7 +1603,7 @@ public class Day1 : Day 3257 1333 3603 - + 1433 4953 4098 @@ -1604,7 +1611,7 @@ public class Day1 : Day 8320 11840 10795 - + 6925 7292 9340 @@ -1614,7 +1621,7 @@ public class Day1 : Day 5490 6380 6512 - + 4332 2273 3506 @@ -1627,7 +1634,7 @@ public class Day1 : Day 2109 4513 5392 - + 2597 7554 9150 @@ -1636,7 +1643,7 @@ public class Day1 : Day 7443 6788 3224 - + 6098 7293 6994 @@ -1646,16 +1653,16 @@ public class Day1 : Day 3312 7702 3616 - + 55975 - + 2514 10887 - + 7264 10835 21533 - + 6666 1428 6668 @@ -1667,9 +1674,9 @@ public class Day1 : Day 7279 7284 3344 - + 4809 - + 4748 7859 5322 @@ -1678,7 +1685,7 @@ public class Day1 : Day 2462 7973 1576 - + 1207 1949 2608 @@ -1688,27 +1695,27 @@ public class Day1 : Day 7804 2404 9159 - + 38251 - + 10983 5513 9496 7341 11958 7265 - + 10483 7081 5477 12178 - + 8421 13928 7231 10781 11620 - + 7219 2204 5179 @@ -1719,18 +1726,18 @@ public class Day1 : Day 1902 5293 8458 - + 13895 10711 10857 14214 - + 9062 4001 8483 4260 9408 - + 8856 2473 4738 @@ -1740,7 +1747,7 @@ public class Day1 : Day 1747 6853 8308 - + 6468 5359 8925 @@ -1749,7 +1756,7 @@ public class Day1 : Day 6194 4431 4177 - + 1452 2594 5079 @@ -1761,9 +1768,9 @@ public class Day1 : Day 2458 5843 3390 - + 59084 - + 4350 2892 6057 @@ -1778,19 +1785,19 @@ public class Day1 : Day 2641 6303 3518 - + 4595 15941 14489 12371 13428 - + 6748 3113 13130 13855 10202 - + 4461 4550 3781 @@ -1805,7 +1812,7 @@ public class Day1 : Day 1913 2538 5819 - + 5492 2956 6397 @@ -1819,16 +1826,16 @@ public class Day1 : Day 6510 5134 2251 - + 1912 11885 9792 9026 - + 15319 21333 4765 - + 1510 1760 1193 @@ -1844,7 +1851,7 @@ public class Day1 : Day 5830 1273 2963 - + 2625 5173 2499 @@ -1860,18 +1867,18 @@ public class Day1 : Day 2160 1791 2522 - + 20725 - + 15813 26702 - + 1464 3116 7046 5531 13731 - + 4178 4204 3722 @@ -1887,7 +1894,7 @@ public class Day1 : Day 2312 1086 1093 - + 1020 3213 1017 @@ -1902,7 +1909,7 @@ public class Day1 : Day 1308 2755 4357 - + 3010 5317 1507 @@ -1918,7 +1925,7 @@ public class Day1 : Day 1899 3390 1455 - + 2098 6531 3206 @@ -1931,7 +1938,7 @@ public class Day1 : Day 4543 5069 3491 - + 3195 3617 1509 @@ -1947,7 +1954,7 @@ public class Day1 : Day 2234 3937 3111 - + 6510 1964 6255 @@ -1962,7 +1969,7 @@ public class Day1 : Day 3088 3182 3470 - + 7230 5126 5584 @@ -1974,7 +1981,7 @@ public class Day1 : Day 3148 4209 3646 - + 2971 2439 2362 @@ -1987,11 +1994,11 @@ public class Day1 : Day 3723 4143 6503 - + 8492 19004 6323 - + 5999 7828 7411 @@ -2002,26 +2009,26 @@ public class Day1 : Day 5631 6110 1128 - + 6126 7809 1458 15754 3603 - + 8908 8693 8558 3270 5458 12906 - + 2463 7423 6250 2029 15528 - + 5146 6644 1905 @@ -2035,7 +2042,7 @@ public class Day1 : Day 5373 5591 6634 - + 2053 7877 2218 @@ -2046,7 +2053,7 @@ public class Day1 : Day 3502 8313 2841 - + 5471 5190 4424 @@ -2056,7 +2063,7 @@ public class Day1 : Day 4799 8122 1038 - + 4988 2833 4461 @@ -2069,14 +2076,14 @@ public class Day1 : Day 7435 7226 5779 - + 11587 6728 6765 11498 4711 3547 - + 2878 8426 11717 @@ -2084,18 +2091,18 @@ public class Day1 : Day 5481 10803 11181 - + 4915 2093 6057 6957 13009 12971 - + 17979 3250 19984 - + 5650 5756 3307 @@ -2104,7 +2111,7 @@ public class Day1 : Day 9579 2849 6885 - + 2609 2347 4692 @@ -2116,9 +2123,9 @@ public class Day1 : Day 2654 2221 1822 - + 13157 - + 10140 5075 10446 @@ -2127,11 +2134,11 @@ public class Day1 : Day 5856 8096 8762 - + 16951 9118 17962 - + 7524 4389 3716 @@ -2143,7 +2150,7 @@ public class Day1 : Day 4612 2477 6792 - + 6403 11307 10753 @@ -2151,7 +2158,7 @@ public class Day1 : Day 4919 6485 3189 - + 8790 10424 8816 @@ -2160,7 +2167,7 @@ public class Day1 : Day 5529 8946 3864 - + 1370 4810 3752 @@ -2176,7 +2183,7 @@ public class Day1 : Day 5629 4962 3203 - + 2120 4830 2859 @@ -2190,19 +2197,19 @@ public class Day1 : Day 4156 3624 2730 - + 58973 - + 18871 8511 - + 13088 1608 12123 5162 9357 2409 - + 3194 2605 8440 @@ -2211,10 +2218,10 @@ public class Day1 : Day 5709 4431 5553 - + 10532 36332 - + 7227 10011 7519 @@ -2222,7 +2229,7 @@ public class Day1 : Day 7444 2693 3845 - + 10004 5735 9671 @@ -2231,7 +2238,7 @@ public class Day1 : Day 1292 10428 2800 - + 4229 6072 3748 @@ -2245,14 +2252,14 @@ public class Day1 : Day 2712 2788 5133 - + 10716 11271 11169 9815 1641 1025 - + 3016 3916 6618 @@ -2263,15 +2270,15 @@ public class Day1 : Day 6525 1920 8741 - + 19472 - + 15684 10706 14780 15411 9358 - + 5290 8167 5269 @@ -2282,12 +2289,12 @@ public class Day1 : Day 4844 7749 5696 - + 9032 12663 11173 14750 - + 1121 2123 6582 diff --git a/Days/Day10.cs b/Days/Day10.cs index dd5dfd7..4cd424a 100644 --- a/Days/Day10.cs +++ b/Days/Day10.cs @@ -6,7 +6,7 @@ public class Day10 : Day { public override int Number => 10; public override string Name => "Cathode-Ray Tube"; - public override void RunPart1() + public override void RunPart1(bool display = true) { int cycle = 1; int x = 1; @@ -47,10 +47,13 @@ public class Day10 : Day } } - AnsiConsole.MarkupLine($"[green]Sum of signal strengths: [yellow]{sum}[/][/]"); + if (display) + { + AnsiConsole.MarkupLine($"[green]Sum of signal strengths: [yellow]{sum}[/][/]"); + } } - public override void RunPart2() + public override void RunPart2(bool display = true) { // Setup the CRT const char litPixel = '#'; @@ -122,7 +125,10 @@ public class Day10 : Day } // Print the CRT - AnsiConsole.Write(crtCanvas); + if (display) + { + AnsiConsole.Write(crtCanvas); + } } #region Input diff --git a/Days/Day11.cs b/Days/Day11.cs index df4024d..0f50f19 100644 --- a/Days/Day11.cs +++ b/Days/Day11.cs @@ -51,9 +51,9 @@ public class Monkey // Divide worry level by 3 before test if (divideWorry) { - newValue = newValue / 3; + newValue = newValue / 3; } - + // Even using this simplification, it's still needed to use longs because // they sometime overflow before being simplified in part 2 newValue = newValue % (2*3*5*7*11*13*17*19); @@ -77,7 +77,7 @@ public class Day11 : Day { public override int Number => 11; public override string Name => "Monkey in the Middle"; - public override void RunPart1() + public override void RunPart1(bool display = true) { const int roundsCount = 20; @@ -95,10 +95,13 @@ public class Day11 : Day var topMonkeys = monkeys.OrderByDescending(m => m.InspectionCount).Take(2).ToList(); - AnsiConsole.MarkupLine($"[green]Monkey business: [yellow]{topMonkeys[0].InspectionCount * topMonkeys[1].InspectionCount}[/][/]"); + if (display) + { + AnsiConsole.MarkupLine($"[green]Monkey business: [yellow]{topMonkeys[0].InspectionCount * topMonkeys[1].InspectionCount}[/][/]"); + } } - public override void RunPart2() + public override void RunPart2(bool display = true) { const int roundsCount = 10_000; @@ -116,7 +119,10 @@ public class Day11 : Day var topMonkeys = monkeys.OrderByDescending(m => m.InspectionCount).Take(2).ToList(); - AnsiConsole.MarkupLine($"[green]Monkey business: [yellow]{topMonkeys[0].InspectionCount * topMonkeys[1].InspectionCount}[/][/]"); + if (display) + { + AnsiConsole.MarkupLine($"[green]Monkey business: [yellow]{topMonkeys[0].InspectionCount * topMonkeys[1].InspectionCount}[/][/]"); + } } private static IImmutableList ParseMonkeys() diff --git a/Days/Day12.cs b/Days/Day12.cs index 708005b..a9e836d 100644 --- a/Days/Day12.cs +++ b/Days/Day12.cs @@ -43,7 +43,7 @@ public class Day12 : Day private (int x, int y) _end; private (int x, int y) _start; - public override void RunPart1() + public override void RunPart1(bool display = true) { var map = ParseMap(); var canvas = DrawMap(map); @@ -57,13 +57,16 @@ public class Day12 : Day canvas.SetPixel(x, y, Color.White); } - AnsiConsole.Write(canvas); - AnsiConsole.WriteLine(); + if (display) + { + AnsiConsole.Write(canvas); + AnsiConsole.WriteLine(); - AnsiConsole.MarkupLine($"[green]Minimum path length: [yellow]{minimumPathLength.length}[/][/]"); + AnsiConsole.MarkupLine($"[green]Minimum path length: [yellow]{minimumPathLength.length}[/][/]"); + } } - public override void RunPart2() + public override void RunPart2(bool display = true) { var map = ParseMap(); var canvas = DrawMap(map); @@ -77,10 +80,13 @@ public class Day12 : Day canvas.SetPixel(x, y, Color.White); } - AnsiConsole.Write(canvas); - AnsiConsole.WriteLine(); + if (display) + { + AnsiConsole.Write(canvas); + AnsiConsole.WriteLine(); - AnsiConsole.MarkupLine($"[green]Minimum path length: [yellow]{minimumPathLength.length}[/][/]"); + AnsiConsole.MarkupLine($"[green]Minimum path length: [yellow]{minimumPathLength.length}[/][/]"); + } } private (int length, List<(int x, int y)> path) ExplorePath(byte[,] map) diff --git a/Days/Day13.cs b/Days/Day13.cs index 6f25c9d..831e8db 100644 --- a/Days/Day13.cs +++ b/Days/Day13.cs @@ -153,7 +153,7 @@ public class Day13 : Day { public override int Number => 13; public override string Name => "Distress Signal"; - public override void RunPart1() + public override void RunPart1(bool display = true) { var pairs = ParsePacketPairs(); @@ -169,10 +169,13 @@ public class Day13 : Day } } - AnsiConsole.MarkupLine($"[green]Right order pair indices sum: [yellow]{sum}[/][/]"); + if (display) + { + AnsiConsole.MarkupLine($"[green]Right order pair indices sum: [yellow]{sum}[/][/]"); + } } - public override void RunPart2() + public override void RunPart2(bool display = true) { var packets = ParsePackets(); @@ -186,7 +189,11 @@ public class Day13 : Day var firstDividerIndex = orderedPackets.IndexOf(firstDivider) + 1; var lastDividerIndex = orderedPackets.IndexOf(lastDivider) + 1; - AnsiConsole.MarkupLine($"[green]Decoder key is: [yellow]{firstDividerIndex * lastDividerIndex}[/][/]"); + + if (display) + { + AnsiConsole.MarkupLine($"[green]Decoder key is: [yellow]{firstDividerIndex * lastDividerIndex}[/][/]"); + } } private static PacketElement ReadElement(ref ReadOnlySpan packet) { diff --git a/Days/Day14.cs b/Days/Day14.cs index 383964b..9e64f84 100644 --- a/Days/Day14.cs +++ b/Days/Day14.cs @@ -121,7 +121,7 @@ public class Day14 : Day private readonly Point _sandSource = new(500, 0); private Point _offsetSandSource; - public override void RunPart1() + public override void RunPart1(bool display = true) { var map = GenerateMap(); @@ -136,12 +136,15 @@ public class Day14 : Day sandBlocksCount++; } - AnsiConsole.Write(canvas); + if (display) + { + AnsiConsole.Write(canvas); - AnsiConsole.MarkupLine($"[green]Total sand blocks: [yellow]{sandBlocksCount}[/][/]"); + AnsiConsole.MarkupLine($"[green]Total sand blocks: [yellow]{sandBlocksCount}[/][/]"); + } } - public override void RunPart2() + public override void RunPart2(bool display = true) { var map = GenerateDictionaryMap(); @@ -156,9 +159,13 @@ public class Day14 : Day sandBlocksCount++; } - AnsiConsole.Write(GenerateCanvas(map, _sandSource)); - AnsiConsole.MarkupLine($"[green]Total sand blocks: [yellow]{sandBlocksCount}[/][/]"); + if (display) + { + AnsiConsole.Write(GenerateCanvas(map, _sandSource)); + + AnsiConsole.MarkupLine($"[green]Total sand blocks: [yellow]{sandBlocksCount}[/][/]"); + } } private static bool GenerateSand(CellType[,] map, Canvas canvas, in Point sandSource) diff --git a/Days/Day15.cs b/Days/Day15.cs index 993e2d7..5257161 100644 --- a/Days/Day15.cs +++ b/Days/Day15.cs @@ -74,7 +74,7 @@ public class Day15 : Day { public override int Number => 15; public override string Name => "Beacon Exclusion Zone"; - public override void RunPart1() + public override void RunPart1(bool display = true) { const int targetY = 2_000_000; @@ -129,10 +129,13 @@ public class Day15 : Day totalCovered -= beaconsOnTargetY.Count; // Print total covered columns on line Y - AnsiConsole.MarkupLine($"[green]Number of positions that cannot contain a beacon: [yellow]{totalCovered}[/][/]"); + if (display) + { + AnsiConsole.MarkupLine($"[green]Number of positions that cannot contain a beacon: [yellow]{totalCovered}[/][/]"); + } } - public override void RunPart2() + public override void RunPart2(bool display = true) { const int xMin = 0; const int xMax = 4_000_000; @@ -213,7 +216,10 @@ public class Day15 : Day var tuningFrequency = finalPoint.X * (long) 4_000_000 + finalPoint.Y; - AnsiConsole.MarkupLine($"[green]Tuning frequency: [yellow]{tuningFrequency}[/][/]"); + if (display) + { + AnsiConsole.MarkupLine($"[green]Tuning frequency: [yellow]{tuningFrequency}[/][/]"); + } } private static IList ParsePairs() diff --git a/Days/Day2.cs b/Days/Day2.cs index 8429968..255f74f 100644 --- a/Days/Day2.cs +++ b/Days/Day2.cs @@ -18,10 +18,10 @@ public enum Outcome : long public class Day2 : Day { - public override int Number { get; } = 2; - public override string Name { get; } = "Rock Paper Scissors"; - - public override void RunPart1() + public override int Number => 2; + public override string Name => "Rock Paper Scissors"; + + public override void RunPart1(bool display = true) { long score = 0; @@ -33,14 +33,17 @@ public class Day2 : Day score += (long) selfChoice; score += (long) ComputeOutcome(adversaryChoice, selfChoice); } - - AnsiConsole.MarkupLine($"[green]Total score: [yellow]{score}[/][/]"); + + if (display) + { + AnsiConsole.MarkupLine($"[green]Total score: [yellow]{score}[/][/]"); + } } - - public override void RunPart2() + + public override void RunPart2(bool display = true) { long score = 0; - + foreach (var line in Input.ReadAllLines()) { var adversaryChoice = AdversaryInputToChoice(line[0]); @@ -50,8 +53,11 @@ public class Day2 : Day score += (long) selfChoice; score += (long) desiredOutcome; } - - AnsiConsole.MarkupLine($"[green]Total score: [yellow]{score}[/][/]"); + + if (display) + { + AnsiConsole.MarkupLine($"[green]Total score: [yellow]{score}[/][/]"); + } } private Outcome ComputeOutcome(Choice adversary, Choice self) => (adversary, self) switch @@ -83,7 +89,7 @@ public class Day2 : Day 'C' => Choice.Scissors, _ => throw new ArgumentException("Invalid input") }; - + private Choice SelfInputToChoice(char input) => input switch { 'X' => Choice.Rock, diff --git a/Days/Day3.cs b/Days/Day3.cs index 922edbd..6789900 100644 --- a/Days/Day3.cs +++ b/Days/Day3.cs @@ -7,7 +7,7 @@ public class Day3 : Day public override int Number => 3; public override string Name => "Rucksack Reorganization"; - public override void RunPart1() + public override void RunPart1(bool display = true) { long sum = 0; @@ -22,10 +22,13 @@ public class Day3 : Day sum += CharToPriority(common); } - AnsiConsole.MarkupLine($"[green]Sum of priorities is: [yellow]{sum}[/][/]"); + if (display) + { + AnsiConsole.MarkupLine($"[green]Sum of priorities is: [yellow]{sum}[/][/]"); + } } - public override void RunPart2() + public override void RunPart2(bool display = true) { long sum = 0; @@ -40,10 +43,13 @@ public class Day3 : Day sum += CharToPriority(common); } - AnsiConsole.MarkupLine($"[green]Sum of priorities is: [yellow]{sum}[/][/]"); + if (display) + { + AnsiConsole.MarkupLine($"[green]Sum of priorities is: [yellow]{sum}[/][/]"); + } } - private int CharToPriority(char c) + private static int CharToPriority(char c) { if (char.IsLower(c)) { diff --git a/Days/Day4.cs b/Days/Day4.cs index 5dd2b0c..5c891f1 100644 --- a/Days/Day4.cs +++ b/Days/Day4.cs @@ -6,7 +6,7 @@ public class Day4 : Day { public override int Number => 4; public override string Name => "Camp Cleanup"; - public override void RunPart1() + public override void RunPart1(bool display = true) { int overlaps = 0; foreach (var line in Input.ReadAllLines()) @@ -18,7 +18,7 @@ public class Day4 : Day var firstSection = sections[0]; var secondSection = sections[1]; - + // Check if first section contains second section if (firstSection.Start <= secondSection.Start && firstSection.End >= secondSection.End) { @@ -30,11 +30,14 @@ public class Day4 : Day overlaps++; } } - - AnsiConsole.MarkupLine($"[green]Overlapping sections: [yellow]{overlaps}[/][/]"); + + if (display) + { + AnsiConsole.MarkupLine($"[green]Overlapping sections: [yellow]{overlaps}[/][/]"); + } } - public override void RunPart2() + public override void RunPart2(bool display = true) { int overlaps = 0; foreach (var line in Input.ReadAllLines()) @@ -46,15 +49,18 @@ public class Day4 : Day var firstSection = sections[0]; var secondSection = sections[1]; - + // Check if first section overlaps second if (firstSection.Start <= secondSection.End && firstSection.End >= secondSection.Start) { overlaps++; } } - - AnsiConsole.MarkupLine($"[green]Overlapping sections: [yellow]{overlaps}[/][/]"); + + if (display) + { + AnsiConsole.MarkupLine($"[green]Overlapping sections: [yellow]{overlaps}[/][/]"); + } } #region Input diff --git a/Days/Day5.cs b/Days/Day5.cs index 11da5ab..335a010 100644 --- a/Days/Day5.cs +++ b/Days/Day5.cs @@ -9,7 +9,7 @@ public class Day5 : Day private IDictionary>? _stacks; - public override void RunPart1() + public override void RunPart1(bool display = true) { _stacks = InitStacks(); @@ -26,14 +26,17 @@ public class Day5 : Day } } - for (int i = 1; i <= 9; i++) + if (display) { - AnsiConsole.Markup($"[{(i % 2 == 0 ? "yellow" : "green")}]{_stacks[i].Pop()}[/]"); + for (int i = 1; i <= 9; i++) + { + AnsiConsole.Markup($"[{(i % 2 == 0 ? "yellow" : "green")}]{_stacks[i].Pop()}[/]"); + } + AnsiConsole.WriteLine(); } - AnsiConsole.WriteLine(); } - public override void RunPart2() + public override void RunPart2(bool display = true) { _stacks = InitStacks(); @@ -53,11 +56,14 @@ public class Day5 : Day } } - for (int i = 1; i <= 9; i++) + if (display) { - AnsiConsole.Markup($"[{(i % 2 == 0 ? "yellow" : "green")}]{_stacks[i].Pop()}[/]"); + for (int i = 1; i <= 9; i++) + { + AnsiConsole.Markup($"[{(i % 2 == 0 ? "yellow" : "green")}]{_stacks[i].Pop()}[/]"); + } + AnsiConsole.WriteLine(); } - AnsiConsole.WriteLine(); } #region Input diff --git a/Days/Day6.cs b/Days/Day6.cs index 21722cc..534a5b4 100644 --- a/Days/Day6.cs +++ b/Days/Day6.cs @@ -6,7 +6,7 @@ public class Day6 : Day { public override int Number => 6; public override string Name => "Tuning Trouble"; - public override void RunPart1() + public override void RunPart1(bool display = true) { int position = 0; @@ -30,10 +30,13 @@ public class Day6 : Day charStream.Dequeue(); } - AnsiConsole.MarkupLine($"[green]Position of start-of-packet marker is: [yellow]{position}[/][/]"); + if (display) + { + AnsiConsole.MarkupLine($"[green]Position of start-of-packet marker is: [yellow]{position}[/][/]"); + } } - public override void RunPart2() + public override void RunPart2(bool display = true) { const int length = 14; int position = 0; @@ -48,7 +51,7 @@ public class Day6 : Day for (int i = length - 1; i < Input.Length; i++) { charStream.Enqueue(Input[i]); - + // Check if all 14 chars are different if (charStream.ToHashSet().Count == charStream.Count) { @@ -59,7 +62,10 @@ public class Day6 : Day charStream.Dequeue(); } - AnsiConsole.MarkupLine($"[green]Position of start-of-message marker is: [yellow]{position}[/][/]"); + if (display) + { + AnsiConsole.MarkupLine($"[green]Position of start-of-message marker is: [yellow]{position}[/][/]"); + } } #region Input diff --git a/Days/Day7.cs b/Days/Day7.cs index 06a8a66..012862b 100644 --- a/Days/Day7.cs +++ b/Days/Day7.cs @@ -32,7 +32,7 @@ public class Day7 : Day { public override int Number => 7; public override string Name => "No Space Left On Device"; - public override void RunPart1() + public override void RunPart1(bool display = true) { var fileSystem = ParseFileSystem(); @@ -42,10 +42,13 @@ public class Day7 : Day .Where(d => d.Size < 100_000) .Sum(d => d.Size); - AnsiConsole.MarkupLine($"[green]Total size: [yellow]{totalSize}[/][/]"); + if (display) + { + AnsiConsole.MarkupLine($"[green]Total size: [yellow]{totalSize}[/][/]"); + } } - public override void RunPart2() + public override void RunPart2(bool display = true) { const long fileSystemSpace = 70_000_000; const long requiredSpace = 30_000_000; @@ -63,7 +66,10 @@ public class Day7 : Day .Where(d => d.Size > missingSpace) .MinBy(d => d.Size); - AnsiConsole.MarkupLine($"[green]Directory to remove size: [yellow]{directoryToRemove!.Size}[/][/]"); + if (display) + { + AnsiConsole.MarkupLine($"[green]Directory to remove size: [yellow]{directoryToRemove!.Size}[/][/]"); + } } private static DirectoryEntry ParseFileSystem() diff --git a/Days/Day8.cs b/Days/Day8.cs index 02605f5..ba354e5 100644 --- a/Days/Day8.cs +++ b/Days/Day8.cs @@ -6,7 +6,7 @@ public class Day8 : Day { public override int Number => 8; public override string Name => "Treetop Tree House"; - public override void RunPart1() + public override void RunPart1(bool display = true) { var grid = CreateGrid(); @@ -92,10 +92,14 @@ public class Day8 : Day } } - AnsiConsole.MarkupLine($"[green]Total viewable trees: [yellow]{valid.Count}[/][/]"); + + if (display) + { + AnsiConsole.MarkupLine($"[green]Total viewable trees: [yellow]{valid.Count}[/][/]"); + } } - public override void RunPart2() + public override void RunPart2(bool display = true) { var grid = CreateGrid(); @@ -116,7 +120,10 @@ public class Day8 : Day } } - AnsiConsole.MarkupLine($"[green]Max scenic score: [yellow]{maxScenicScore}[/][/]"); + if (display) + { + AnsiConsole.MarkupLine($"[green]Max scenic score: [yellow]{maxScenicScore}[/][/]"); + } } private int ComputeScenicScore(int[,] grid, int i, int j, int size) diff --git a/Days/Day9.cs b/Days/Day9.cs index 81f8523..13c0007 100644 --- a/Days/Day9.cs +++ b/Days/Day9.cs @@ -7,7 +7,7 @@ public class Day9 : Day public override int Number => 9; public override string Name => "Rope Bridge"; - public override void RunPart1() + public override void RunPart1(bool display = true) { // Start (int x, int y) start = (0, 0); @@ -49,10 +49,13 @@ public class Day9 : Day } } - AnsiConsole.MarkupLine($"[green]The tail visited [yellow]{tailVisitedPositions.Count}[/] unique positions[/]"); + if (display) + { + AnsiConsole.MarkupLine($"[green]The tail visited [yellow]{tailVisitedPositions.Count}[/] unique positions[/]"); + } } - public override void RunPart2() + public override void RunPart2(bool display = true) { const int tailSegments = 9; @@ -130,7 +133,10 @@ public class Day9 : Day } } - AnsiConsole.MarkupLine($"[green]The tail visited [yellow]{tailVisitedPositions.Count}[/] unique positions[/]"); + if (display) + { + AnsiConsole.MarkupLine($"[green]The tail visited [yellow]{tailVisitedPositions.Count}[/] unique positions[/]"); + } } #region Input diff --git a/Program.cs b/Program.cs index 7635722..edc523e 100644 --- a/Program.cs +++ b/Program.cs @@ -1,9 +1,18 @@ - -using System.Diagnostics; +using System.Diagnostics; using System.Reflection; +using AdventOfCode; using AdventOfCode.Days; +using BenchmarkDotNet.Running; using Spectre.Console; +// Benchmark +if (args is ["--bench" or "-b"]) +{ + BenchmarkRunner.Run(); + Environment.Exit(0); +} + +// Normal run var days = Assembly.GetAssembly(typeof(Day))!.GetTypes() .Where(t => t.IsAssignableTo(typeof(Day)) && t.GetConstructor(Type.EmptyTypes) != null && !t.IsAbstract) .Select(t => (Day)Activator.CreateInstance(t)!);