From 0d37458ec5aeead89ea60b302b56c689e95c81ef Mon Sep 17 00:00:00 2001 From: Mikael CAPELLE Date: Wed, 7 Dec 2022 18:41:39 +0100 Subject: [PATCH] Add 2021 day 5. --- 2021/day5.py | 52 +++++ 2021/inputs/day5.txt | 500 +++++++++++++++++++++++++++++++++++++++++++ 2022/day7.py | 7 + 3 files changed, 559 insertions(+) create mode 100644 2021/day5.py create mode 100644 2021/inputs/day5.txt diff --git a/2021/day5.py b/2021/day5.py new file mode 100644 index 0000000..d1639f5 --- /dev/null +++ b/2021/day5.py @@ -0,0 +1,52 @@ +# -*- encoding: utf-8 -*- + +import sys +from collections import defaultdict + +import numpy as np + +lines: list[str] = sys.stdin.read().splitlines() + +sections: list[tuple[tuple[int, int], tuple[int, int]]] = [ + ( + ( + int(line.split(" -> ")[0].split(",")[0]), + int(line.split(" -> ")[0].split(",")[1]), + ), + ( + int(line.split(" -> ")[1].split(",")[0]), + int(line.split(" -> ")[1].split(",")[1]), + ), + ) + for line in lines +] + +np_sections = np.array(sections).reshape(-1, 4) + +x_min, x_max, y_min, y_max = ( + min(np_sections[:, 0].min(), np_sections[:, 2].min()), + max(np_sections[:, 0].max(), np_sections[:, 2].max()), + min(np_sections[:, 1].min(), np_sections[:, 3].min()), + max(np_sections[:, 1].max(), np_sections[:, 3].max()), +) + +counts_1 = np.zeros((y_max + 1, x_max + 1), dtype=int) +counts_2 = counts_1.copy() + +for (x1, y1), (x2, y2) in sections: + + x_rng = range(x1, x2 + 1, 1) if x2 >= x1 else range(x1, x2 - 1, -1) + y_rng = range(y1, y2 + 1, 1) if y2 >= y1 else range(y1, y2 - 1, -1) + + if x1 == x2 or y1 == y2: + counts_1[list(y_rng), list(x_rng)] += 1 + counts_2[list(y_rng), list(x_rng)] += 1 + elif abs(x2 - x1) == abs(y2 - y1): + for i, j in zip(y_rng, x_rng): + counts_2[i, j] += 1 + +answer_1 = (counts_1 >= 2).sum() +print(f"answer 1 is {answer_1}") + +answer_2 = (counts_2 >= 2).sum() +print(f"answer 2 is {answer_2}") diff --git a/2021/inputs/day5.txt b/2021/inputs/day5.txt new file mode 100644 index 0000000..04fa5cb --- /dev/null +++ b/2021/inputs/day5.txt @@ -0,0 +1,500 @@ +657,934 -> 657,926 +130,34 -> 570,474 +478,716 -> 226,464 +861,110 -> 861,167 +448,831 -> 370,831 +75,738 -> 390,738 +26,880 -> 864,42 +965,658 -> 527,220 +208,381 -> 80,381 +523,475 -> 807,475 +219,69 -> 219,434 +793,538 -> 534,797 +754,602 -> 754,148 +443,327 -> 443,611 +606,395 -> 546,395 +980,56 -> 51,985 +619,325 -> 354,325 +342,123 -> 819,600 +290,533 -> 374,533 +598,77 -> 598,75 +605,302 -> 605,636 +97,981 -> 692,386 +278,779 -> 278,800 +661,377 -> 661,10 +726,108 -> 518,316 +271,883 -> 271,50 +382,271 -> 606,271 +963,358 -> 891,286 +496,880 -> 496,855 +211,142 -> 211,49 +841,866 -> 260,285 +841,849 -> 173,181 +927,326 -> 391,862 +396,558 -> 459,558 +753,183 -> 953,183 +941,698 -> 941,407 +347,612 -> 347,476 +18,340 -> 18,612 +140,299 -> 797,956 +714,907 -> 714,228 +966,155 -> 194,927 +769,674 -> 712,674 +644,675 -> 948,979 +703,872 -> 812,763 +26,629 -> 120,535 +844,738 -> 844,253 +798,133 -> 798,795 +27,318 -> 288,57 +38,545 -> 872,545 +827,351 -> 195,983 +818,45 -> 21,842 +257,559 -> 626,928 +145,925 -> 886,184 +83,618 -> 590,111 +326,243 -> 53,243 +489,278 -> 526,278 +783,693 -> 783,525 +495,636 -> 495,585 +374,716 -> 215,557 +839,536 -> 839,966 +850,468 -> 955,468 +55,799 -> 55,447 +472,722 -> 296,898 +390,731 -> 120,461 +405,493 -> 208,296 +807,42 -> 56,793 +476,327 -> 655,327 +24,965 -> 967,22 +776,211 -> 776,850 +489,20 -> 822,20 +630,740 -> 871,499 +743,493 -> 283,953 +62,429 -> 62,720 +806,270 -> 806,332 +550,154 -> 107,597 +71,713 -> 533,251 +620,575 -> 620,156 +726,829 -> 143,246 +944,553 -> 468,553 +185,582 -> 185,468 +845,266 -> 212,899 +654,97 -> 265,486 +726,609 -> 726,147 +631,76 -> 860,76 +835,24 -> 928,24 +712,719 -> 74,81 +616,478 -> 616,117 +903,226 -> 903,577 +440,699 -> 136,395 +215,705 -> 890,30 +20,24 -> 981,985 +102,144 -> 850,892 +695,967 -> 582,967 +219,284 -> 219,388 +359,833 -> 665,833 +389,55 -> 305,55 +59,32 -> 957,930 +815,198 -> 64,949 +699,540 -> 717,558 +215,682 -> 182,682 +805,489 -> 328,489 +43,546 -> 578,546 +489,181 -> 489,363 +266,391 -> 266,582 +863,368 -> 448,368 +83,236 -> 83,487 +874,875 -> 874,413 +799,90 -> 799,802 +253,29 -> 253,905 +136,446 -> 435,745 +830,534 -> 550,534 +183,785 -> 107,785 +81,517 -> 159,517 +359,941 -> 359,560 +71,546 -> 948,546 +596,811 -> 596,791 +255,960 -> 255,159 +788,15 -> 788,682 +240,55 -> 240,244 +51,423 -> 137,423 +504,418 -> 809,723 +131,842 -> 914,59 +727,790 -> 82,145 +281,509 -> 841,509 +797,807 -> 834,807 +333,499 -> 790,499 +215,328 -> 215,139 +500,898 -> 500,862 +75,217 -> 777,919 +17,264 -> 17,446 +852,755 -> 150,755 +865,186 -> 385,186 +158,192 -> 158,733 +196,261 -> 196,128 +989,960 -> 131,102 +807,393 -> 807,153 +507,579 -> 507,764 +468,76 -> 535,76 +381,357 -> 659,357 +794,277 -> 749,277 +51,152 -> 546,647 +797,959 -> 458,959 +82,156 -> 967,156 +261,624 -> 460,624 +597,53 -> 197,53 +153,507 -> 411,765 +305,717 -> 768,717 +344,954 -> 344,217 +194,432 -> 545,432 +346,46 -> 557,46 +685,599 -> 685,312 +49,719 -> 49,631 +499,668 -> 304,863 +262,405 -> 554,405 +87,64 -> 295,64 +859,675 -> 74,675 +663,776 -> 99,212 +232,189 -> 232,904 +777,276 -> 703,276 +704,492 -> 86,492 +142,736 -> 514,364 +418,611 -> 224,417 +602,571 -> 602,424 +152,603 -> 248,603 +915,673 -> 143,673 +538,32 -> 128,32 +975,885 -> 975,344 +870,511 -> 870,756 +330,798 -> 46,798 +440,195 -> 587,195 +739,237 -> 568,66 +54,838 -> 196,980 +370,556 -> 47,556 +124,575 -> 748,575 +261,283 -> 880,902 +784,91 -> 426,449 +764,670 -> 148,670 +32,51 -> 967,986 +807,906 -> 10,906 +470,488 -> 579,597 +274,649 -> 285,649 +221,540 -> 221,94 +914,957 -> 914,510 +879,825 -> 145,91 +438,833 -> 438,775 +191,844 -> 911,124 +145,763 -> 595,763 +504,81 -> 622,199 +834,206 -> 834,704 +908,308 -> 815,308 +929,567 -> 929,322 +805,50 -> 620,235 +36,409 -> 133,312 +345,375 -> 19,701 +468,948 -> 468,108 +109,547 -> 446,547 +929,916 -> 69,56 +927,857 -> 318,248 +833,948 -> 833,61 +559,787 -> 559,982 +293,825 -> 293,775 +508,744 -> 545,744 +827,713 -> 753,639 +88,775 -> 555,775 +523,812 -> 684,812 +307,142 -> 307,265 +636,40 -> 355,321 +891,875 -> 891,25 +301,423 -> 712,12 +922,187 -> 219,890 +45,447 -> 230,262 +114,568 -> 233,687 +573,398 -> 677,398 +334,101 -> 324,101 +957,277 -> 957,652 +943,834 -> 610,834 +523,632 -> 523,379 +958,361 -> 90,361 +408,824 -> 380,824 +647,314 -> 647,449 +747,83 -> 59,83 +776,104 -> 937,104 +16,984 -> 989,11 +362,581 -> 362,226 +72,962 -> 940,94 +319,877 -> 319,122 +310,206 -> 986,882 +794,877 -> 267,877 +855,58 -> 976,58 +699,971 -> 598,971 +162,556 -> 162,440 +494,859 -> 494,255 +794,210 -> 142,862 +275,510 -> 548,510 +739,592 -> 739,793 +376,985 -> 376,990 +755,264 -> 280,739 +187,34 -> 187,688 +770,827 -> 770,548 +10,68 -> 913,971 +571,427 -> 571,944 +153,211 -> 153,560 +976,972 -> 55,51 +103,611 -> 674,40 +95,972 -> 924,143 +929,94 -> 38,985 +777,330 -> 60,330 +312,430 -> 312,326 +549,433 -> 269,433 +477,267 -> 477,403 +598,375 -> 19,375 +512,799 -> 512,831 +348,700 -> 348,43 +165,97 -> 63,199 +38,835 -> 38,828 +282,334 -> 282,909 +14,891 -> 390,515 +930,657 -> 334,61 +630,341 -> 630,85 +671,464 -> 319,112 +949,340 -> 894,285 +663,916 -> 245,916 +114,395 -> 286,223 +335,804 -> 529,804 +567,338 -> 14,891 +623,705 -> 379,949 +82,864 -> 545,401 +932,128 -> 932,134 +291,294 -> 291,101 +739,765 -> 739,757 +460,94 -> 892,94 +375,673 -> 367,681 +81,831 -> 90,831 +890,402 -> 890,138 +775,547 -> 790,547 +49,927 -> 966,10 +23,116 -> 257,116 +923,75 -> 18,980 +63,986 -> 687,362 +369,844 -> 357,844 +790,188 -> 644,188 +557,282 -> 557,669 +861,173 -> 390,644 +480,529 -> 893,529 +32,960 -> 830,162 +368,725 -> 368,40 +502,600 -> 701,600 +63,977 -> 873,167 +463,518 -> 788,193 +738,406 -> 324,406 +162,931 -> 822,931 +377,487 -> 707,817 +610,319 -> 901,319 +586,658 -> 690,658 +25,288 -> 53,288 +760,602 -> 760,628 +294,62 -> 951,62 +222,773 -> 661,334 +151,483 -> 646,483 +272,852 -> 317,852 +557,906 -> 503,960 +736,445 -> 736,703 +241,376 -> 241,692 +835,41 -> 835,369 +987,743 -> 987,210 +42,700 -> 42,244 +646,136 -> 646,440 +544,751 -> 404,751 +295,651 -> 295,805 +687,878 -> 113,878 +290,142 -> 604,142 +579,920 -> 579,807 +12,985 -> 987,10 +919,940 -> 919,808 +770,143 -> 770,832 +114,76 -> 962,76 +876,882 -> 428,434 +861,139 -> 861,320 +888,59 -> 888,39 +629,823 -> 707,823 +296,598 -> 296,305 +61,54 -> 578,54 +864,58 -> 253,58 +71,861 -> 306,861 +682,181 -> 326,537 +307,418 -> 307,910 +810,251 -> 810,431 +151,836 -> 602,385 +954,987 -> 243,276 +724,272 -> 350,646 +134,295 -> 434,295 +178,235 -> 802,859 +832,688 -> 832,573 +165,334 -> 165,378 +816,26 -> 114,728 +668,192 -> 540,192 +730,341 -> 969,341 +951,169 -> 286,834 +647,115 -> 886,115 +664,288 -> 507,131 +609,362 -> 609,295 +747,479 -> 287,19 +350,967 -> 350,725 +117,383 -> 311,383 +871,124 -> 292,124 +654,271 -> 547,271 +525,773 -> 345,953 +401,670 -> 610,670 +930,196 -> 301,825 +336,37 -> 961,662 +714,212 -> 714,667 +454,848 -> 454,107 +587,390 -> 587,577 +530,437 -> 542,437 +304,229 -> 517,229 +340,571 -> 766,571 +727,941 -> 138,352 +831,325 -> 11,325 +241,294 -> 403,456 +788,658 -> 788,126 +337,360 -> 337,589 +799,402 -> 342,402 +530,820 -> 530,319 +982,27 -> 20,989 +923,936 -> 923,721 +581,395 -> 64,912 +61,509 -> 61,827 +989,580 -> 610,580 +477,592 -> 219,592 +296,775 -> 296,58 +204,12 -> 204,457 +190,171 -> 190,673 +939,200 -> 939,457 +472,282 -> 472,631 +983,331 -> 734,331 +365,609 -> 365,817 +640,698 -> 145,698 +103,618 -> 549,618 +454,319 -> 454,346 +650,815 -> 381,546 +624,603 -> 507,603 +966,445 -> 723,445 +763,129 -> 763,784 +695,145 -> 695,511 +498,84 -> 435,147 +188,716 -> 967,716 +810,446 -> 810,924 +731,483 -> 731,51 +307,783 -> 307,533 +15,956 -> 956,15 +192,210 -> 882,210 +303,173 -> 38,438 +769,952 -> 769,863 +135,781 -> 405,781 +494,436 -> 494,892 +705,394 -> 714,394 +164,37 -> 164,633 +813,232 -> 813,620 +227,906 -> 222,906 +542,432 -> 414,432 +549,858 -> 88,397 +200,101 -> 958,859 +235,565 -> 469,331 +492,871 -> 503,882 +704,398 -> 869,563 +450,736 -> 746,736 +420,706 -> 420,635 +717,493 -> 686,524 +187,554 -> 717,24 +31,851 -> 315,851 +800,230 -> 466,230 +226,324 -> 226,614 +937,927 -> 937,798 +143,26 -> 534,417 +952,344 -> 12,344 +181,361 -> 782,361 +925,906 -> 415,396 +685,944 -> 470,944 +200,627 -> 290,627 +728,285 -> 728,326 +271,864 -> 271,34 +802,558 -> 207,558 +963,26 -> 84,905 +504,60 -> 529,60 +840,292 -> 180,292 +914,272 -> 914,330 +82,107 -> 925,950 +33,245 -> 33,134 +463,663 -> 463,82 +27,305 -> 27,675 +276,894 -> 891,279 +746,325 -> 746,948 +249,657 -> 341,749 +530,848 -> 28,346 +798,617 -> 798,609 +119,767 -> 312,767 +80,18 -> 674,18 +723,374 -> 583,374 +582,985 -> 239,642 +217,765 -> 217,395 +811,159 -> 609,159 +689,896 -> 501,896 +562,881 -> 562,96 +244,621 -> 629,621 +277,379 -> 277,287 +856,153 -> 20,153 +518,228 -> 518,898 +230,789 -> 243,789 +534,335 -> 534,592 +240,790 -> 413,617 +768,615 -> 768,560 +773,101 -> 912,101 +252,571 -> 767,56 +370,595 -> 681,906 +565,176 -> 565,318 +750,465 -> 750,724 +979,130 -> 120,989 +160,153 -> 160,785 +610,222 -> 610,191 +873,124 -> 130,867 +519,593 -> 519,32 +525,947 -> 525,562 +50,292 -> 291,533 +558,927 -> 960,525 +536,694 -> 249,981 +954,896 -> 277,896 +732,202 -> 732,288 +447,989 -> 541,895 +890,754 -> 367,231 +368,89 -> 564,285 +588,100 -> 588,156 +282,313 -> 943,974 +16,792 -> 495,792 +111,591 -> 111,493 +57,713 -> 685,85 +676,632 -> 676,575 +560,708 -> 560,602 +489,288 -> 489,404 +904,515 -> 443,54 +70,977 -> 985,62 +11,119 -> 11,403 +215,859 -> 937,137 +78,469 -> 110,437 +747,605 -> 747,369 +847,598 -> 847,299 +742,695 -> 159,112 +986,370 -> 986,460 +631,900 -> 771,760 +228,406 -> 683,861 +189,639 -> 61,639 +221,650 -> 820,650 +558,569 -> 834,845 +655,533 -> 558,630 +967,921 -> 967,169 +230,308 -> 429,308 +873,762 -> 873,528 +412,151 -> 412,538 +881,587 -> 881,21 +941,45 -> 26,960 +377,126 -> 700,126 diff --git a/2022/day7.py b/2022/day7.py index 6632b81..128a300 100644 --- a/2022/day7.py +++ b/2022/day7.py @@ -5,6 +5,13 @@ from pathlib import Path lines = sys.stdin.read().splitlines() +# we are going to use Path to create path and go up/down in the file tree since it +# implements everything we need +# +# we can use .resolve() to get normalized path, although this will add C:\ to all paths +# on Windows but that is not an issue since only the sizes matter +# + # mapping from path to list of files or directories trees: dict[Path, list[Path]] = {}