Add 2021 day 5.

This commit is contained in:
Mikael CAPELLE 2022-12-07 18:41:39 +01:00
parent 198927e4a3
commit 0d37458ec5
3 changed files with 559 additions and 0 deletions

52
2021/day5.py Normal file
View File

@ -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}")

500
2021/inputs/day5.txt Normal file
View File

@ -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

View File

@ -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]] = {}