From 22a4b79550a1150477920f5cb0897f5ae10f72fe Mon Sep 17 00:00:00 2001 From: felixm Date: Sun, 3 Dec 2023 17:23:36 -0500 Subject: [PATCH] Do day 3. --- README.md | 2 + d3.py | 101 +++++++++++++++++++++++++++++++++++++++ d4.py | 40 ++++++++++++++++ i3.txt | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ i4.txt | 0 5 files changed, 283 insertions(+) create mode 100644 d3.py create mode 100644 d4.py create mode 100644 i3.txt create mode 100644 i4.txt diff --git a/README.md b/README.md index be6f9fe..a002ba3 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,5 @@ - Day 1: 40:00 (I don't know what I am doing.) - Day 2: 14:15 (Okay, but far way from leaderboard.) +- Day 3: 1st 20:00, 2nd 70:00... (I had a logic error that took me a while to find.) +- Day 4: diff --git a/d3.py b/d3.py new file mode 100644 index 0000000..ab2b8e6 --- /dev/null +++ b/d3.py @@ -0,0 +1,101 @@ +import re + +NUMBERS = "0123456789" +EXAMPLE = """ +467..114.. +...*...... +..35..633. +......#... +617*...... +.....+.58. +..592..... +......755. +...$.*.... +.664.598.. +""" + +def clean(text: str) -> list[str]: + return list(filter(lambda l: l.strip() != "", text.splitlines())) + +def is_adj_to_symbol(x, y, lines): + non_symbol = re.compile(r"[^0-9\.]") + for xo, yo in [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]: + try: + if x + xo < 0 or y + yo < 0: + continue + if non_symbol.match(lines[y + yo][x + xo]): + return True + except IndexError: + pass + return False + +def solve(lines: list[str]): + d = "" + adj_to_symbol = False + s = 0 + for (y, line) in enumerate(lines): + for (x, c) in enumerate(line): + if c not in NUMBERS: + if len(d) > 0 and adj_to_symbol: + s += int(d) + d = "" + adj_to_symbol = False + else: + if is_adj_to_symbol(x, y, lines): + adj_to_symbol = True + d = d + c + return s + +def get_entire_number(x, y, lines): + assert(lines[y][x] in NUMBERS) + x_start = x - 1 + while lines[y][x_start] in NUMBERS and x_start >= 0: + x_start -= 1 + x_start += 1 + x_start_orig = x_start + r = "" + while x_start < len(lines[0]) and lines[y][x_start] in NUMBERS: + r += lines[y][x_start] + x_start += 1 + return x_start_orig, int(r) + +def find_sourrounding_numbers(x, y, lines): + full_coords = [] + numbers = [] + for xo, yo in [(-1, -1), (0, -1), (1, -1), (-1, 0), (1, 0), (-1, 1), (0, 1), (1, 1)]: + new_x = x + xo + new_y = y + yo + if new_x < 0 or new_y < 0 or new_x >= len(lines[0]) or new_y >= len(lines): + continue + if lines[new_y][new_x] in NUMBERS: + x_start_orig, n = get_entire_number(new_x, new_y, lines) + if (x_start_orig, new_y, n) not in full_coords: + numbers.append(n) + full_coords.append((x_start_orig, y + yo, n)) + return numbers + +def solve2(lines: list[str]): + s = 0 + for (y, line) in enumerate(lines): + for (x, c) in enumerate(line): + if c == '*': + numbers = find_sourrounding_numbers(x, y, lines) + if len(numbers) == 2: + # print(numbers) + s += numbers[0] * numbers[1] + return s + +def main(): + example = clean(EXAMPLE) + print("Example 1:", solve(example)) + data = clean(open("i3.txt").read()) + print("Solution 1:", solve(data)) + + example = clean(EXAMPLE) + print("Example 2:", solve2(example)) + + data = clean(open("i3.txt").read()) + print("Solution 2:", solve2(data)) + +if __name__ == "__main__": + main() diff --git a/d4.py b/d4.py new file mode 100644 index 0000000..734a77c --- /dev/null +++ b/d4.py @@ -0,0 +1,40 @@ +import re + +EXAMPLE = """ + +""" + +def clean(text: str) -> list[str]: + return list(filter(lambda l: l.strip() != "", text.splitlines())) + +def solve(lines: list[str]): + s = 0 + for (i, line) in enumerate(lines): + print(i, line) + return s + +def solve2(lines: list[str]): + s = 0 + for (i, line) in enumerate(lines): + print(i, line) + return s + +def main(): + example = clean(EXAMPLE) + print("Example 1:", solve(example)) + return + + data = clean(open("i4.txt").read()) + print("Solution 1:", solve(data)) + return + + example = clean(EXAMPLE) + print("Example 2:", solve2(example)) + return + + data = clean(open("i4.txt").read()) + print("Solution 2:", solve2(data)) + return + +if __name__ == "__main__": + main() diff --git a/i3.txt b/i3.txt new file mode 100644 index 0000000..5c23864 --- /dev/null +++ b/i3.txt @@ -0,0 +1,140 @@ + 661 485 565 344 325 841 725 + *609 131 512 * 536* 462 60 424 * + 316 * 39 630 377 919 98 789 * * 788 2 564 + 431 535 * 622 * * 682 108 116 299 + 428 378 844 416 586 537 27 * 871 331 492 + 878 390 * * 739 496 867 867 867 344 487 + * 558 535 644 404 605 * * + 381 729 726 578 10 * 818 929 934 119 + 53 31 734 847* * 217 321 * + 509 315 654 60 925 747*559 * 430 226 * 290 848 + 546 664 507 337 94 359 528*996 + 351 638 * *433 337 226 859 378 + * 648 183 126 * 208 954 * 626 499* 803 642 235 + 518* 813 990 * * 699 133 68 79 838 447 * * * + 696* 586 6 243 * 224 392 275 * 699 177 230 593 + 326 683 761 491 26 * 56 305 262 150 + 41 908 819 785 276 + 618 401 599 124 34 * 676 342 473 + 889 888 454 723 * 141* 958 416 *94 + 212 826 552 569 * 728 143 + * 287 60 872 886 171 437 815 680 * 633 + 234 * 687 432 203 * 275 65 *341 * 246 272 922* + 967 495 * 161 474 97 * * 84 400 *295 805 915 + 419 * 979 932 * 729 215 * 81 * 554 263*567 812 + * 458 682 179 348 906 428 798 + 668 552 99 * 85 4 + 29 938 594 107 *171 98 * 896 491 412 12 326 * 705 4 * + * 332 949 * 750 974 342 * 558 * 794 + 459 342* 637 273 658 601 * 735 * 627 889 * + 697 131 718 689 450 390 994 793 * 241 + 991 89 14 * *912 39 698 953*240 87 + 324 618 * 328 * 538 307 920 515 * + *386 * 780 * 475 719 * * 910 410 384 999 *756 + 268 701 72 63 43 193 674 670 * * 95 893 + 16 * 663 407 * 258 264 298 202* + 574 187 88 53 931 759 672 385 + 938 192 297 * 723 * 930 692 283 349 981 + * 207 * 843 736 260 677 389 * 954 + 603 713 745 411 359 922 * * * 718 888 561 182 206 + 896 * 173*383 145 943 * * 622 382* 180 141 * * + 89 * 238 714 * 575 539 114*721 645 471 + *307 968 250 836 498 59 909 601* 117 435 944 + * 56* 498 730 882 975 680 * 95 152 517 + 150 142 473 713 262 577 266 736 668 70*111 811 165 + 741 * 97 * * 654 428 157 748*823 + * 48 * 772 892 350 760 148 440 731*563 + 260 227 * 795 649 27 107 219 23 226 369 + 41 136 546 920 * 981 * 454 + * 635 782 560 * 896 854 694 340 498* 41 959* + 486 63 810 641 * 532 642 90 76 + 325 539 407 9 550 + 787 * 105 126 810 497 576 538 718 * 317 519 + 303 493 462 647 * 875 641 644 * * 154 588 + 44 140 228 43 * * 132 794 628 669 110 * * + 579 348 32 491* 646 506 *708 74 117 24* 698 532 + * 902 722 700 610 878 * + 885 351 * 799 814*238 *339 428*825 965 862 125 + 723 243 852 757 784 472 814 603 151 279 617 849 + * * * * 91 246 384 * + 218 659 113 128 691 972 571 934 * * 442 236 + * 455 868 379 594 80 654 421 456 + 2*535 *410 553 409 235 173 779 116 * *646 418* * 596 + 70 361 493 * 440 317 865 323 696 202 952 187 + 767 318 * 1 * * 241 147 * 389 + 921 301 * * 67 540 149 827 347 956 980 204 + * 341 154 * 695 20 183 177 66 699 495 296 + 460 4 * 347 *36 * 912 * 765 + 142 163 885 480 805 587 289 310*389 843 417 * 628 * + * 434 803 482 556 294 33 79 358 + 407 873 *542 41 758 176 * + 842 442*766 284 842 856 * 647 422 94 + 799 433 318* 576 111 788 + 720 168 840 989 * 468 419 198 + * 392 282 591 * 101 340 187 + 746 499 779 * 456 346 * * 693 94 72 + 970 671 696 999 124 246 434 173 165 925* + 628 * 608 827 * * 634 418 185 311 808 372* 824 + 694 360 43 645 935 *516 * 555 * 33 + * 576 810*592 740 665 968 *499 775 882 998 + 303 433 280 147 82 * 751* + 608 560 827 227 448* 529 376 + 465 554 401 714 192 999 466 28 161 351 + 706 157 679 741 818 811 412 376 * + 441 955 63 * * * 399 613 444 *972 + * 697 600 965 354 392 827 665 326 323 483 + 381 972 373* * 9 289 * + * 239 863 * 341 *329 +801 638 659 358 29 695 241 680 863 310 941 216 311 + * 358 * * 786 *330 842 11 279 686 + 932 666 533 712 801 64 544 *972 *353 809 524 397 * + 795 * * 394 586 * 562 + 629 184 796 946 348 670 63 + 428 918 850 889 * 673 110 221 337 560 + 926* 809 627 * 344 343 * * 832 * * 216 + 624 78 915 701 876 734 402 181 193 460 639 * 558 138 + * 91 804 324 985 429 * * 892 * * 321 727 134 + 991 * * 39 633 213 623 601 919 378 318 * 34 + 183 399 297 973 622 * 855 684 * 335 733 + 576 597 * * 686 371 98 23 119 777 * + 901 * 412 102 754 332 47* * 861 539 495 801 * 404 777 + 577 577 978 990 * 236 339 * 534 + 169 * 687 * 598 * 349 723 864 972 196 491* 335 372 + 339 633 29 * 4 251* * 250 908 356 230 324 386 + 943 325 726 690 * 646 * 214 + 468 * 999 944 751 * 219 837 107 * 271 * 283 + * 210 *390 917* 996* 790 128 * 905 277 320 936 835 + 640 581 * 167 392 29 * 885 369 * + 708 106 223 817 * 277 795 296 172 633 229 + 82 679 * *806 10 * 456 * 95 3 + 536 12 914 458 214 995 97 735 370 334 876 * 950 + * 10 837 518 * * 761 + 414 794 * 813 394 815 718 759 403 738 + 463 238 419 810 41 452 2 435 468 + 103 * 11 927 282 * 234 229 * + 301 678 100 954 * 182 * 737 916 890 118* 625 + 67 312 865 910 * 382 516 973 * 874 500 153 * + 373 * * 979 469 *375 765 99 733 897 + 828 669 * 284 189 371 *168 762 + 4 565 226 562 190 281 257 * 889 57 210 * + 47 120 * * 169 549 414 744 503 208 + * 643 397 350 289 * 323 856 + * 458 104 931 855 89 469 882 * + 594 777 390 * 422 355 654 81 * * 282 630 195 + * 568 912 * * 377 * *877 419 * 148 768 471 * + 393 163 298 820 582 823 * 952 + *268 *733 59 403 14 502 481 231 + 970 * 981 711 261 701 244 323 * + 396 993 557 46 * 714*659 134 623 * 677 730 846 + 91 405 296 295 * 740 * + 345 792 * 834 100 891 764 697 570 * 620* 508 295 + *13 340 134 * * 247 660 607 705 165 + 521 824 222 * 372 290 844 825 867 820 627 * 128 777 + 629 * 788 535 * * 361 * 805 732 914 + * 743 853 637 880 849* 425 946 590 *302 * 748 + 120 271 862 70 207 233 * 443 263 + 680 825 793 * 720 555 184 509 22 * 811 + 772 272 134 * 374 * 573 * * +934 231 * 821 230 981 707 370 * 634 787 * 93 909 70 199 59 490 + * 525 * 747 676 * 829 324 952 * + 189 791 236 687 868 505 713 777 diff --git a/i4.txt b/i4.txt new file mode 100644 index 0000000..e69de29