diff --git a/2021/05/README.md b/2021/05/README.md new file mode 100644 index 0000000..6078701 --- /dev/null +++ b/2021/05/README.md @@ -0,0 +1,11 @@ +# 05 + +Description + +
+ Solutions +
    +
  1. 5608
  2. +
  3. 20299
  4. +
+
diff --git a/2021/05/input.txt b/2021/05/input.txt new file mode 100644 index 0000000..bd0db27 --- /dev/null +++ b/2021/05/input.txt @@ -0,0 +1,501 @@ +973,543 -> 601,915 +758,846 -> 758,168 +511,976 -> 568,976 +858,536 -> 858,677 +256,238 -> 265,238 +475,919 -> 718,919 +973,912 -> 134,73 +984,159 -> 175,968 +166,641 -> 15,490 +504,798 -> 504,946 +717,796 -> 128,207 +302,713 -> 168,713 +830,964 -> 830,444 +151,288 -> 549,686 +530,908 -> 820,908 +540,394 -> 717,394 +581,614 -> 581,496 +111,593 -> 230,712 +938,884 -> 938,917 +923,71 -> 20,974 +530,677 -> 530,332 +144,723 -> 144,980 +700,376 -> 700,917 +501,95 -> 198,95 +251,900 -> 435,900 +912,931 -> 96,115 +962,140 -> 181,921 +104,244 -> 104,178 +504,865 -> 504,612 +301,284 -> 301,173 +973,980 -> 17,24 +886,166 -> 886,455 +380,150 -> 971,741 +57,405 -> 135,405 +515,569 -> 774,310 +227,233 -> 874,880 +75,33 -> 75,290 +487,434 -> 983,930 +17,279 -> 20,279 +719,838 -> 508,627 +262,254 -> 555,254 +516,626 -> 631,511 +352,305 -> 352,715 +876,827 -> 876,731 +372,85 -> 372,344 +619,773 -> 619,799 +885,627 -> 441,627 +779,731 -> 42,731 +806,756 -> 806,237 +378,540 -> 187,540 +840,296 -> 210,296 +250,234 -> 171,234 +249,100 -> 757,608 +787,23 -> 787,826 +690,175 -> 365,175 +238,166 -> 238,738 +52,350 -> 574,872 +297,518 -> 297,590 +133,263 -> 133,219 +438,955 -> 939,955 +621,500 -> 621,948 +93,39 -> 530,476 +988,866 -> 220,98 +483,30 -> 329,184 +205,937 -> 419,723 +314,910 -> 842,910 +472,944 -> 923,944 +487,700 -> 586,601 +59,17 -> 333,17 +553,307 -> 553,746 +810,37 -> 810,167 +898,662 -> 858,662 +191,837 -> 191,157 +83,950 -> 83,910 +229,513 -> 559,843 +825,192 -> 44,973 +37,80 -> 460,503 +648,357 -> 29,357 +603,592 -> 425,770 +137,141 -> 693,141 +179,69 -> 479,69 +851,164 -> 172,164 +916,143 -> 99,960 +908,20 -> 28,900 +178,404 -> 700,404 +122,43 -> 645,43 +548,495 -> 155,888 +216,725 -> 216,583 +790,97 -> 51,836 +98,214 -> 98,200 +90,464 -> 141,464 +32,905 -> 912,25 +253,743 -> 253,115 +521,826 -> 304,826 +733,392 -> 733,485 +315,95 -> 964,744 +386,749 -> 553,916 +698,985 -> 59,346 +380,969 -> 820,969 +134,641 -> 310,641 +66,899 -> 860,105 +827,304 -> 560,37 +824,213 -> 132,905 +93,138 -> 200,245 +54,450 -> 54,436 +163,276 -> 31,408 +959,333 -> 976,333 +499,129 -> 645,129 +924,321 -> 924,332 +629,166 -> 629,901 +505,769 -> 864,410 +80,360 -> 48,360 +22,971 -> 983,10 +500,87 -> 721,87 +227,737 -> 227,540 +698,177 -> 698,713 +20,106 -> 20,204 +187,176 -> 902,891 +803,806 -> 574,806 +413,785 -> 413,858 +736,728 -> 28,728 +158,870 -> 20,870 +78,475 -> 75,472 +481,434 -> 80,434 +975,208 -> 425,208 +59,639 -> 304,639 +287,919 -> 923,283 +940,933 -> 104,97 +699,429 -> 466,429 +240,988 -> 929,299 +970,873 -> 396,873 +441,585 -> 441,697 +337,259 -> 36,259 +45,759 -> 45,382 +220,468 -> 373,315 +10,262 -> 793,262 +753,268 -> 147,874 +664,560 -> 603,560 +974,81 -> 974,26 +575,331 -> 254,331 +754,378 -> 727,378 +354,394 -> 298,450 +108,814 -> 108,804 +848,375 -> 604,375 +697,530 -> 697,288 +977,54 -> 967,44 +241,754 -> 484,754 +793,745 -> 755,745 +974,415 -> 974,98 +677,367 -> 677,731 +69,744 -> 695,118 +50,39 -> 940,929 +414,721 -> 414,917 +870,587 -> 870,396 +881,759 -> 583,759 +679,798 -> 679,226 +826,917 -> 217,917 +896,919 -> 102,919 +528,881 -> 498,881 +15,89 -> 15,212 +887,280 -> 747,280 +763,303 -> 967,507 +904,964 -> 562,964 +157,752 -> 433,752 +752,199 -> 34,917 +60,970 -> 921,109 +934,434 -> 683,183 +748,427 -> 748,601 +20,47 -> 957,984 +71,691 -> 332,691 +782,637 -> 782,137 +483,623 -> 704,623 +11,965 -> 274,965 +285,172 -> 700,172 +613,845 -> 855,845 +955,296 -> 738,296 +596,750 -> 596,974 +332,851 -> 360,851 +176,388 -> 107,388 +116,328 -> 325,119 +932,588 -> 403,588 +247,420 -> 247,69 +52,965 -> 52,740 +541,579 -> 541,48 +321,530 -> 321,115 +124,33 -> 986,895 +575,950 -> 922,603 +231,814 -> 755,814 +940,445 -> 957,462 +365,743 -> 432,810 +488,286 -> 777,286 +988,905 -> 887,905 +715,846 -> 842,846 +481,894 -> 481,954 +297,868 -> 297,441 +368,928 -> 368,348 +951,981 -> 49,79 +46,743 -> 551,743 +900,241 -> 50,241 +441,942 -> 441,762 +488,58 -> 488,482 +945,187 -> 945,639 +263,779 -> 476,779 +593,290 -> 593,985 +781,498 -> 914,498 +351,557 -> 351,324 +809,966 -> 709,966 +912,545 -> 522,155 +985,681 -> 903,599 +837,881 -> 532,881 +728,485 -> 753,460 +79,680 -> 79,448 +917,769 -> 917,456 +135,845 -> 135,777 +460,922 -> 981,401 +516,830 -> 516,403 +230,419 -> 230,267 +770,297 -> 583,297 +577,782 -> 488,693 +118,728 -> 791,55 +983,192 -> 983,340 +307,252 -> 393,338 +83,345 -> 83,628 +318,461 -> 318,670 +809,385 -> 809,383 +145,124 -> 444,124 +906,892 -> 906,990 +295,22 -> 295,617 +828,312 -> 828,227 +546,132 -> 546,100 +398,750 -> 398,237 +27,770 -> 299,770 +863,517 -> 863,869 +700,806 -> 168,806 +279,262 -> 169,152 +954,285 -> 681,12 +896,102 -> 127,871 +527,532 -> 404,532 +853,397 -> 168,397 +642,273 -> 595,273 +422,123 -> 422,805 +879,789 -> 879,177 +233,171 -> 917,855 +82,148 -> 559,148 +95,969 -> 95,65 +876,779 -> 876,257 +753,35 -> 51,737 +421,756 -> 735,756 +637,602 -> 637,886 +275,689 -> 275,360 +714,77 -> 714,353 +617,645 -> 764,645 +131,702 -> 689,702 +752,795 -> 524,567 +606,716 -> 632,716 +261,700 -> 261,104 +196,894 -> 377,713 +812,626 -> 812,76 +739,368 -> 360,747 +976,646 -> 976,981 +459,948 -> 500,948 +154,669 -> 179,644 +410,896 -> 661,645 +312,187 -> 248,123 +507,655 -> 513,655 +649,726 -> 649,447 +874,19 -> 24,19 +951,64 -> 57,958 +29,60 -> 533,60 +559,262 -> 941,644 +665,319 -> 531,185 +835,601 -> 918,601 +269,556 -> 871,556 +410,708 -> 410,163 +271,105 -> 860,105 +143,427 -> 475,95 +716,656 -> 716,270 +111,771 -> 822,60 +170,775 -> 233,775 +730,588 -> 730,106 +592,161 -> 901,470 +486,802 -> 289,802 +113,770 -> 726,157 +127,98 -> 825,796 +392,957 -> 794,957 +529,793 -> 529,117 +347,196 -> 347,310 +893,613 -> 360,80 +961,362 -> 961,399 +577,52 -> 577,566 +792,578 -> 792,622 +35,883 -> 35,395 +499,779 -> 499,752 +921,359 -> 921,90 +557,224 -> 290,224 +863,190 -> 874,190 +100,190 -> 100,519 +909,38 -> 33,914 +44,421 -> 98,421 +731,787 -> 731,462 +722,28 -> 722,685 +913,538 -> 274,538 +149,648 -> 149,186 +302,594 -> 521,594 +927,333 -> 546,714 +503,42 -> 333,42 +474,260 -> 835,621 +825,363 -> 825,188 +335,140 -> 227,32 +914,613 -> 914,15 +955,734 -> 398,734 +506,913 -> 506,232 +612,271 -> 612,881 +155,856 -> 282,856 +207,820 -> 898,129 +329,463 -> 475,463 +371,719 -> 371,737 +103,503 -> 103,722 +846,779 -> 360,293 +597,247 -> 253,247 +305,912 -> 305,960 +283,277 -> 283,358 +369,327 -> 418,327 +107,190 -> 107,269 +469,247 -> 918,247 +944,213 -> 990,213 +930,158 -> 594,158 +459,844 -> 459,519 +493,387 -> 107,387 +514,173 -> 669,328 +818,876 -> 73,131 +405,783 -> 405,54 +583,151 -> 583,654 +211,462 -> 211,938 +639,224 -> 639,728 +561,33 -> 561,719 +607,244 -> 47,244 +772,61 -> 772,795 +777,920 -> 63,206 +121,281 -> 90,281 +668,99 -> 893,99 +352,620 -> 652,620 +589,50 -> 547,50 +845,252 -> 845,974 +666,870 -> 94,870 +724,524 -> 344,904 +569,40 -> 482,40 +224,619 -> 741,619 +935,110 -> 143,902 +107,37 -> 906,836 +308,298 -> 821,298 +983,619 -> 868,734 +659,166 -> 497,328 +60,423 -> 60,507 +483,283 -> 90,283 +568,309 -> 568,873 +262,461 -> 890,461 +328,633 -> 94,867 +892,195 -> 177,910 +310,874 -> 915,269 +647,54 -> 531,54 +749,523 -> 408,864 +597,882 -> 857,882 +756,498 -> 468,498 +671,248 -> 671,510 +676,855 -> 130,309 +46,18 -> 659,18 +144,164 -> 87,221 +412,774 -> 412,930 +67,368 -> 745,368 +246,704 -> 619,331 +714,113 -> 159,113 +203,109 -> 203,641 +418,708 -> 110,708 +619,546 -> 619,531 +617,957 -> 545,957 +630,423 -> 630,909 +584,379 -> 679,474 +572,918 -> 572,16 +101,712 -> 755,58 +167,317 -> 912,317 +836,130 -> 570,130 +759,847 -> 523,847 +901,40 -> 901,479 +908,157 -> 908,558 +351,252 -> 280,181 +648,730 -> 253,730 +330,984 -> 110,984 +717,552 -> 746,581 +206,831 -> 904,133 +684,232 -> 684,20 +889,73 -> 155,73 +896,728 -> 896,589 +55,983 -> 988,50 +342,746 -> 342,617 +138,683 -> 795,26 +968,226 -> 787,226 +311,713 -> 355,713 +201,789 -> 201,401 +909,623 -> 205,623 +540,130 -> 540,722 +695,511 -> 191,511 +221,320 -> 221,68 +75,118 -> 599,642 +982,977 -> 30,25 +534,598 -> 720,784 +355,579 -> 13,921 +137,516 -> 137,665 +510,244 -> 510,392 +845,52 -> 327,570 +167,100 -> 909,100 +573,133 -> 34,672 +371,341 -> 371,823 +959,981 -> 20,42 +143,793 -> 143,134 +815,798 -> 914,897 +286,212 -> 188,114 +28,987 -> 985,30 +652,108 -> 652,540 +978,565 -> 507,94 +817,166 -> 402,166 +250,723 -> 128,845 +676,274 -> 53,897 +981,985 -> 12,16 +682,195 -> 270,195 +409,113 -> 114,113 +585,83 -> 585,514 +897,978 -> 569,650 +158,420 -> 158,709 +603,335 -> 966,698 +484,53 -> 972,541 +149,128 -> 149,329 +555,926 -> 555,393 +143,849 -> 614,378 +816,79 -> 507,79 +525,502 -> 812,502 +736,509 -> 736,579 +612,179 -> 629,179 +821,70 -> 821,566 +665,90 -> 416,90 +63,80 -> 837,854 +151,873 -> 890,134 +698,204 -> 698,973 +936,693 -> 612,369 +369,628 -> 947,50 +308,407 -> 308,590 +367,156 -> 963,752 +949,943 -> 536,530 +589,553 -> 256,886 +348,171 -> 348,759 +546,488 -> 546,585 +351,486 -> 779,58 +952,45 -> 33,964 +187,896 -> 187,100 +725,679 -> 725,486 +756,147 -> 264,639 +281,205 -> 281,764 +630,221 -> 73,221 +919,953 -> 775,953 +552,821 -> 925,821 +294,854 -> 922,226 +772,642 -> 961,831 +705,159 -> 308,556 +107,983 -> 393,697 +403,277 -> 403,802 +719,824 -> 719,187 +947,956 -> 253,956 +453,135 -> 952,135 +905,491 -> 574,160 +498,225 -> 764,491 +741,111 -> 597,111 +881,130 -> 881,668 +308,616 -> 866,616 +172,434 -> 855,434 +218,412 -> 218,861 +293,318 -> 293,770 +712,513 -> 679,513 +100,586 -> 434,920 +338,407 -> 176,407 +481,534 -> 715,768 +805,127 -> 216,127 +406,425 -> 322,425 +154,769 -> 823,100 +813,508 -> 159,508 +286,637 -> 286,24 +55,836 -> 665,836 +571,857 -> 459,969 +414,977 -> 414,604 +133,884 -> 972,45 +383,522 -> 383,141 +889,14 -> 62,841 +122,49 -> 43,49 +544,846 -> 544,76 +948,19 -> 62,905 +798,577 -> 833,542 +973,267 -> 751,45 +620,648 -> 620,419 +102,813 -> 633,813 +255,263 -> 826,263 +231,394 -> 231,811 + diff --git a/2021/05/python/main.py b/2021/05/python/main.py new file mode 100644 index 0000000..093ea54 --- /dev/null +++ b/2021/05/python/main.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python + +from os.path import join, dirname +from typing import List + +# Day 05 + +# Common + + +def read_input(filename): + data = join(dirname(__file__), '..', filename) + with open(data) as f: + return f.read().strip() + + +class Point: + def __init__(self, x, y): + self.x = x + self.y = y + + def __repr__(self) -> str: + return f'({self.x},{self.y})' + + @staticmethod + def parse(raw: str): + x, y = raw.strip().split(',') + return Point(int(x), int(y)) + + +class Line: + def __init__(self, a: Point, b: Point): + self.a = a + self.b = b + + def is_straight(self) -> bool: + return self.a.x == self.b.x or self.a.y == self.b.y + + def is_diagonal(self) -> bool: + return abs(self.a.x - self.b.x) == abs(self.a.y - self.b.y) + + def get_points(self) -> List[Point]: + if self.is_straight(): + if self.a.x == self.b.x: + return [ + Point(self.a.x, y) for y + in range(min(self.a.y, self.b.y), max(self.a.y, self.b.y) + 1) + ] + else: + return [ + Point(x, self.a.y) for x + in range(min(self.a.x, self.b.x), max(self.a.x, self.b.x) + 1) + ] + else: + dx = self.a.x - self.b.x + dy = self.a.y - self.b.y + sign_x = 1 if dx < 0 else -1 + sign_y = 1 if dy < 0 else -1 + return [ + Point(self.a.x + sign_x * i, self.a.y + sign_y * i) + for i in range(abs(dx) + 1) + ] + + def __repr__(self) -> str: + return f'{self.a} → {self.b}' + + @staticmethod + def parse(raw: str): + a, b = raw.strip().split('->') + return Line(Point.parse(a), Point.parse(b)) + + +class Scan: + def __init__(self, lines: List[Line]): + self.lines = lines + + def keep_straight(self): + self.lines = [line for line in self.lines if line.is_straight()] + + def keep_straight_and_diagonal(self): + self.lines = [ + line for line in self.lines + if line.is_straight() or line.is_diagonal() + ] + + def matrix(self) -> List[List[int]]: + x_max = max(max(line.a.x, line.b.x) for line in self.lines) + y_max = max(max(line.a.y, line.b.y) for line in self.lines) + matrix = [ + [0 for _ in range(x_max + 1)] + for _ in range(y_max + 1) + ] + for line in self.lines: + for point in line.get_points(): + matrix[point.y][point.x] += 1 + return matrix + + def plot(self) -> str: + output = '\n'.join([ + ' '.join(str(x) for x in row) + for row in self.matrix() + ]) + return output.replace('0', '.') + + def danger(self) -> int: + matrix = self.matrix() + return sum( + sum(1 for x in row if x > 1) + for row in matrix + ) + + @ staticmethod + def parse(raw: str): + return Scan([Line.parse(line) for line in raw.strip().split('\n')]) + + +test = read_input('test.txt') +data = read_input('input.txt') + +# 1 +print('1.') +scan = Scan.parse(test) +scan.keep_straight() +print(scan.plot()) +print('Test: ', scan.danger()) + +scan = Scan.parse(data) +scan.keep_straight() +print('Real: ', scan.danger()) + +# 2 +print('\n2.') + +scan = Scan.parse(test) +scan.keep_straight_and_diagonal() +print(scan.plot()) +print('Test: ', scan.danger()) + +scan = Scan.parse(data) +scan.keep_straight_and_diagonal() +print('Real: ', scan.danger()) diff --git a/2021/05/test.txt b/2021/05/test.txt new file mode 100644 index 0000000..b258f68 --- /dev/null +++ b/2021/05/test.txt @@ -0,0 +1,10 @@ +0,9 -> 5,9 +8,0 -> 0,8 +9,4 -> 3,4 +2,2 -> 2,1 +7,0 -> 7,4 +6,4 -> 2,0 +0,9 -> 2,9 +3,4 -> 1,4 +0,0 -> 8,8 +5,5 -> 8,2