From 5494330b97052222e6da7a365b5a92738f66fe43 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Mon, 10 Nov 2025 21:01:22 -0600 Subject: [PATCH 01/91] refactor(2024.01-haskell): adopt advent-of-code-api --- .envrc | 1 + .gitignore | 1 + VERSION | 2 +- input/2024/day01.txt | 1000 ---------------------------- package.yaml | 7 +- src/AdventOfCode/Input.hs | 22 +- src/AdventOfCode/Util.hs | 9 +- src/AdventOfCode/Year2024/Day01.hs | 53 +- 8 files changed, 60 insertions(+), 1035 deletions(-) delete mode 100644 input/2024/day01.txt diff --git a/.envrc b/.envrc index 679635b..ae494c4 100644 --- a/.envrc +++ b/.envrc @@ -1,4 +1,5 @@ # shellcheck shell=bash +source_env_if_exists .envrc.custom watch_file \ emacs.el \ flake.lock \ diff --git a/.gitignore b/.gitignore index 1437639..bab2641 100644 --- a/.gitignore +++ b/.gitignore @@ -329,4 +329,5 @@ logs rebar.lock .DS_Store +/.envrc.custom /.pre-commit-config.yaml diff --git a/VERSION b/VERSION index 31fc67e..c568b6a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.24 \ No newline at end of file +2024.7.2.25 \ No newline at end of file diff --git a/input/2024/day01.txt b/input/2024/day01.txt deleted file mode 100644 index 31b5941..0000000 --- a/input/2024/day01.txt +++ /dev/null @@ -1,1000 +0,0 @@ -35446 18696 -46314 66062 -33933 83974 -83974 34443 -98207 12657 -38488 57125 -95930 81859 -52767 12657 -16477 53659 -14481 84757 -29083 51122 -36158 15438 -61387 10295 -76932 66328 -36700 83181 -90500 70317 -55528 55820 -31179 94554 -22822 16886 -23069 99080 -69000 50666 -91611 49688 -10965 12657 -62470 27096 -38922 83974 -88317 67082 -49184 78816 -46731 90213 -56390 89965 -67724 21120 -60777 88500 -38607 91051 -89620 42599 -19492 59958 -12399 89965 -14491 21092 -89224 65224 -92053 89616 -61752 33001 -14662 46961 -62308 99609 -63106 37570 -98323 89620 -10130 47868 -44468 92294 -55055 99080 -21162 23460 -62629 83614 -64760 76835 -59948 58492 -93112 81859 -19027 67250 -68050 27547 -39607 27547 -72923 77124 -59390 45817 -33001 47868 -70458 64427 -36441 47868 -44963 70577 -56327 83974 -35920 89031 -56574 16410 -19886 20797 -10538 56032 -43629 89965 -40166 54408 -71819 87037 -71239 58805 -84091 36969 -27282 83974 -61675 83974 -13092 65566 -22564 69172 -73337 83623 -65255 88498 -14204 49627 -90941 12657 -12650 65455 -39913 16886 -91204 42662 -12353 24980 -86940 43602 -45417 86117 -93805 13685 -86595 32060 -95504 49974 -49450 18696 -54656 82794 -24239 65070 -39200 94275 -45741 65455 -86169 41093 -30646 56972 -28947 45593 -27981 18232 -74967 83592 -28791 27193 -58805 69918 -41082 52767 -49770 52767 -40558 92562 -38248 72945 -51400 16886 -20599 11817 -77640 81133 -54049 56972 -82155 36807 -88848 49688 -74986 21092 -84534 83372 -52277 53938 -27375 46406 -82985 44993 -44699 83974 -56937 87037 -77717 49519 -97383 12353 -94620 17706 -93133 79684 -63717 33001 -13006 56032 -20078 55429 -68979 18696 -97191 84071 -47911 62971 -48256 56784 -34443 47868 -44941 56972 -43750 83153 -16717 42999 -36163 79265 -29877 82188 -54069 59608 -21897 70982 -46002 35871 -47632 28298 -92150 34443 -47440 90606 -21000 89334 -22797 91051 -67853 81395 -30016 59612 -65558 65566 -46885 12353 -49714 12353 -40300 27547 -97130 33789 -89917 70893 -99566 49688 -53392 56972 -92478 44580 -69059 12657 -88594 66111 -25017 51845 -66050 49129 -18086 33001 -44548 56032 -91368 26310 -90745 82691 -50489 65566 -29928 45682 -81859 89620 -74633 95869 -98553 47868 -80866 49688 -24016 20910 -36650 33001 -19561 74850 -63484 49688 -58451 18696 -29016 32060 -54718 25325 -89003 33001 -68471 11145 -88206 89620 -13290 66328 -86949 22014 -77758 88623 -75063 96681 -99425 31778 -71300 62538 -88500 11195 -78917 56972 -43065 88068 -33189 89088 -46705 83036 -56972 50663 -24844 91051 -57908 63316 -15446 88452 -76421 36179 -98232 25703 -37640 49688 -35383 44539 -11291 12353 -62140 83592 -55579 88733 -83570 87934 -76450 35834 -84820 47091 -24416 78402 -45763 65455 -82938 66922 -65397 65566 -45162 18361 -71395 72305 -72027 97029 -85465 28881 -32751 65455 -65455 80742 -79640 10727 -88492 84005 -66028 32752 -23677 43498 -22716 26101 -62036 87090 -18882 82877 -24085 91061 -97952 56032 -16125 12353 -69534 44480 -42997 33448 -45250 68695 -84290 92562 -22335 32582 -47550 99080 -36928 73869 -40790 11220 -41540 71545 -16448 67875 -44580 45593 -35045 70157 -69798 63807 -50519 97965 -69580 16886 -87702 24341 -57895 58808 -20766 27547 -74455 59612 -33358 83592 -80944 78627 -71806 29266 -88258 82877 -21771 64556 -88011 25173 -95793 49627 -95847 45593 -56747 12657 -32448 12657 -93453 50250 -72594 74557 -52172 18099 -93959 70300 -74332 38126 -79878 67746 -49680 54928 -18265 33001 -95331 59612 -18366 33001 -25504 88500 -62474 60901 -31197 29540 -66986 49688 -63340 88500 -69519 27915 -21052 52553 -72184 27193 -43404 49627 -95052 59327 -27977 83614 -13673 18696 -13363 27547 -82059 47868 -52928 82877 -55266 25800 -55292 89620 -66838 81751 -85014 62704 -18772 89391 -99322 39583 -68363 58608 -45148 58708 -63006 27193 -92687 12754 -55913 75671 -45593 65455 -79018 51305 -87110 56230 -66328 14246 -54561 53594 -56406 14740 -95001 49947 -12373 81859 -65064 16886 -17403 75896 -58690 53427 -50959 27547 -40939 52963 -50275 47946 -73990 32060 -39728 49688 -64531 74946 -44868 56972 -72719 27906 -35784 16310 -13911 26147 -45218 21092 -27025 54743 -64719 65566 -22135 12657 -13725 71262 -16787 49149 -26004 27547 -83956 25800 -20869 65750 -92705 49627 -41237 33001 -47868 54678 -46965 44772 -76833 67617 -10593 96338 -91447 12858 -41369 18696 -88036 97875 -56077 40100 -83258 73796 -17955 99080 -47587 12353 -71731 21884 -43926 76598 -26878 21142 -85135 21092 -13199 91051 -55583 72621 -72584 63423 -10908 82877 -59612 45593 -72725 95288 -22111 82877 -15422 16886 -51152 97377 -14804 61202 -62625 53427 -89653 38262 -13230 39503 -83705 39416 -88216 34340 -30601 23296 -86040 70921 -76367 32060 -17566 62842 -49688 26555 -51987 27192 -99083 16886 -50529 28284 -18618 92562 -49357 27193 -83692 27547 -34017 12353 -34588 65455 -79808 56032 -76557 83614 -52422 73787 -99664 83974 -23712 89620 -10628 79497 -35405 89633 -55143 97586 -97421 13687 -17759 32060 -94690 46885 -40501 39940 -41037 85460 -70591 40719 -64400 83974 -25588 12353 -92616 83974 -65267 12288 -21298 82152 -21216 24498 -83830 95148 -69200 34443 -92744 83974 -84255 72646 -60019 33001 -72406 89620 -80749 83614 -81952 73514 -80454 27193 -32161 15624 -96805 12657 -87229 45593 -52706 21688 -54224 33221 -59272 81859 -39664 89965 -52726 88500 -17451 53746 -53896 58280 -72032 56972 -41654 83606 -45801 76761 -59531 56972 -69619 65455 -47931 88500 -37408 15916 -46419 27677 -24027 99080 -87213 89400 -59190 71907 -91014 77947 -20262 52969 -99705 17001 -77899 98899 -66940 12657 -96845 16886 -85833 89620 -24005 72223 -70935 48677 -80570 92562 -14398 81859 -34541 83183 -28018 92562 -87037 90231 -71966 34443 -46070 83974 -28730 56032 -37205 65566 -78756 83974 -92078 88687 -84234 22235 -65644 83974 -69979 57474 -26206 40074 -10787 70635 -25443 81859 -16577 86943 -83988 11918 -12284 12657 -57347 16886 -25269 45386 -26028 52805 -28804 77340 -50690 72129 -79036 63115 -70738 71491 -66916 96652 -81977 46885 -43130 58805 -97899 98026 -50454 97303 -77142 33793 -20238 99451 -25279 49627 -37235 83614 -49627 84495 -40512 15742 -84237 18675 -57852 65767 -60277 53427 -60816 99080 -48621 62202 -48990 65455 -90883 47035 -32060 33001 -47930 56032 -53524 55589 -76420 16886 -12331 72983 -93348 48516 -21092 40456 -80416 62693 -18172 66930 -83267 47868 -56035 31836 -19129 12657 -31465 83592 -64173 33001 -74397 70918 -20717 12819 -51944 72328 -71053 27547 -80370 56032 -68857 90951 -48914 33001 -41820 53931 -31445 99080 -12669 38918 -79174 56972 -45196 22048 -43488 27193 -49986 39514 -65806 85882 -48018 89620 -86144 92562 -95852 58805 -47095 89620 -96313 45593 -39688 86998 -89088 56972 -10994 27193 -44290 45593 -32871 49668 -74126 69396 -59913 35109 -37148 83974 -56032 24108 -92348 23837 -76049 45593 -28805 74542 -35070 46272 -40283 47868 -32870 21092 -87890 11410 -85129 84836 -89021 23016 -54444 52767 -60250 15651 -82877 99080 -13101 66125 -95310 44178 -99602 87037 -39771 61194 -92562 67527 -26053 81299 -99211 52767 -31519 14876 -66988 89620 -55719 34142 -47519 37927 -81355 67645 -64580 83371 -53953 40028 -28575 23345 -88211 96106 -25538 33194 -35298 66440 -11466 12353 -33575 18696 -86250 59305 -84467 53562 -59023 91051 -81764 58973 -80503 18696 -73651 65455 -74173 65566 -59081 38453 -54695 27547 -25202 43565 -90138 53680 -87761 98899 -76616 26486 -98411 12657 -87945 89620 -69634 64725 -94813 92562 -64622 21092 -46511 18696 -49212 70971 -34375 23916 -64884 81859 -94136 95813 -89737 59612 -45383 16739 -60780 34100 -60956 56032 -27402 25216 -61698 78097 -77163 74327 -30740 83974 -78975 99080 -34208 88571 -74233 14179 -95918 47868 -74949 65566 -41203 47868 -27671 56032 -38515 20386 -82734 92813 -70727 25800 -10326 33001 -83563 45593 -46938 58588 -43092 65566 -96771 57693 -32365 21390 -65514 25800 -21151 91810 -53822 66328 -89965 49039 -97207 20005 -18794 23172 -85061 82877 -29500 93001 -86025 29962 -18550 74091 -92402 69893 -58049 16886 -47165 82877 -40002 81859 -82066 71414 -99593 12657 -95278 82877 -23474 33508 -26508 32060 -13412 78711 -58286 35717 -79549 25448 -59275 87684 -59102 83592 -59475 65455 -71391 49481 -64011 27193 -34907 27193 -96020 65566 -32676 48353 -82228 64987 -85683 33001 -84073 49627 -89790 91054 -79448 42717 -57726 66328 -30683 65566 -27124 74353 -13404 65566 -47973 32110 -75389 32060 -39880 90141 -47176 25763 -77298 75035 -36334 32060 -55391 40175 -75215 50282 -89669 27719 -36393 33001 -79118 21092 -81448 47868 -51834 49990 -40739 49688 -52754 56972 -35389 36568 -31791 30926 -44345 27193 -11231 58125 -21968 32060 -78789 12353 -81898 62528 -22004 84635 -50202 69626 -83592 51107 -58853 79346 -42190 68523 -45830 99080 -81738 12353 -99265 99469 -90691 38910 -38908 20889 -20275 89965 -24933 24939 -71243 83614 -67641 13684 -63940 34940 -16484 46405 -95114 80965 -52206 65455 -45310 68999 -76892 94531 -71763 25077 -28803 25055 -19132 65455 -62482 16017 -20185 65455 -53459 47868 -86711 18696 -25418 70965 -41208 97960 -18696 38086 -25923 21953 -90443 92562 -84272 27547 -58778 45593 -83614 10136 -46699 32890 -76064 27547 -99080 28452 -18497 12353 -60862 77196 -19752 27547 -22338 53427 -66112 32195 -41917 82202 -50594 45593 -15550 96715 -61435 88975 -96294 32060 -47560 77044 -60387 49627 -76943 45593 -78435 87312 -57089 89620 -97691 18696 -30869 76316 -51101 17127 -89100 49688 -28552 99080 -50599 21092 -62850 89620 -97312 27547 -81531 45593 -69183 54914 -88793 56972 -48548 45593 -66705 56032 -71169 16358 -55885 12353 -55064 66328 -59988 38915 -89486 45971 -66564 62229 -21432 73083 -69247 49688 -15787 12657 -91085 82877 -14618 12353 -99031 46480 -80969 91051 -68503 18696 -89919 12657 -97125 81859 -36492 34656 -50873 18696 -50741 27547 -27193 99250 -13260 89620 -70660 50852 -23872 40621 -23133 34336 -18937 49627 -84631 18350 -31466 97019 -82842 70754 -96642 16614 -99278 21092 -37578 44363 -87003 59612 -43407 43149 -73286 92643 -45369 18696 -60219 47988 -92605 12811 -80646 91257 -29493 25800 -64968 16886 -67454 56032 -39669 52921 -45812 92562 -98524 34245 -68102 13668 -33914 59590 -90204 20381 -78331 21373 -41990 17121 -98264 13737 -12657 97505 -14876 12560 -86663 13560 -81960 46045 -94521 12578 -84699 89846 -65933 89620 -69417 46940 -77051 30362 -75075 44987 -33494 56972 -49618 81859 -71385 41628 -72195 47868 -62025 65455 -23253 49627 -70062 81859 -14577 16886 -72180 61232 -92457 12657 -91879 53427 -49809 97285 -73214 49688 -63136 65455 -25107 99080 -77516 18306 -84079 45956 -68470 12935 -80077 35901 -33487 93929 -98439 81859 -25106 49627 -29578 21746 -41763 49627 -38888 82877 -21105 59612 -27547 85476 -34649 96912 -98652 37966 -26548 51315 -91140 70379 -88522 66328 -18801 81859 -88360 27197 -54575 33001 -54004 83017 -50564 99080 -19887 42385 -65566 93192 -13908 81859 -38021 51863 -53431 65566 -63143 49688 -77152 16886 -95334 94999 -99112 84555 -22226 47868 -81497 25800 -56613 89560 -32899 66913 -73926 32060 -14710 59039 -81998 56498 -51537 23626 -92298 72999 -61627 48753 -25800 33001 -89153 35814 -15490 59612 -98839 49749 -88591 27547 -47330 83974 -94242 38771 -30493 25606 -47111 97620 -76006 83974 -88435 49627 -12581 14185 -52999 82877 -64534 46741 -70617 18696 -78842 89208 -72607 51926 -44479 91090 -32783 26114 -27725 65566 -71384 17667 -75007 81596 -25465 98911 -97702 81141 -87869 32060 -85114 81859 -67686 97990 -22260 12353 -67159 32060 -97547 16886 -26163 79445 -90733 83974 -62958 47018 -87531 53073 -28421 82286 -31349 92110 -62113 17868 -59754 42706 -82004 12353 -69805 89458 -73669 77228 -36269 97413 -35228 27547 -38938 12657 -88675 89620 -90579 71041 -89858 83974 -19686 18696 -16625 49627 -91432 81859 -17607 83974 -89530 45593 -40107 56032 -28095 41567 -93573 70856 -85006 18696 -19091 45593 -82765 12657 -20545 24253 -24106 49627 -60438 88622 -27926 16886 -97985 89965 -79204 89810 -91051 83614 -75382 82877 -50290 96422 -66045 81859 -61679 35777 -46984 56988 -18043 21092 -53300 90453 -57214 78410 -11949 81859 -45225 22918 -82542 65566 -11498 27547 -44155 56972 -97659 13416 -64945 53035 -10456 52940 -66710 16886 -52752 68386 -21492 63909 -10804 70233 -53427 70763 -81459 89620 -24486 29799 -94315 88192 -99345 81859 -26426 16886 -59747 65455 -78335 28188 -76856 55257 -38024 89620 -76867 76062 -25261 27547 -21948 44580 -25796 49407 -26541 34513 -85517 29546 -51634 23929 -16886 98484 -94563 31195 -94244 82759 -19517 83614 -15629 47203 -13661 64125 -54946 63802 -69496 18696 -10488 32505 -92729 23426 -28136 32060 -55489 83964 -34355 47868 -75542 76179 -70632 99080 -29904 71317 -73989 53368 -86241 48586 -82353 46831 -78028 53147 -92984 83641 -55747 21015 -17389 18696 -94992 29411 -69555 88500 -66820 26798 -96784 92681 -19019 99080 -67383 42448 -64708 12353 -20616 92061 -22213 89965 -34850 12996 -99572 36736 -76670 92372 -11930 91013 -18321 99080 -42025 57447 -99887 75845 -95958 48242 -44579 18696 -79387 34443 -82753 27308 -93967 52098 -90819 66336 -38322 35403 -10019 12353 -78459 37576 -69905 16060 -14796 98743 -14487 17417 -79979 66300 -59836 12353 -37308 56032 -63835 88500 -30048 79432 -71914 99080 -76352 56972 -74621 56972 -33804 98899 -23449 33001 -99868 27547 -57457 83513 -44296 36718 -43642 99921 -49243 90701 -28205 27193 -98899 19172 diff --git a/package.yaml b/package.yaml index 730b7c3..b0e9cb0 100644 --- a/package.yaml +++ b/package.yaml @@ -13,6 +13,7 @@ extra-source-files: data-files: - input/*/day*.txt dependencies: + - advent-of-code-api - base - bytestring - comonad @@ -31,6 +32,7 @@ dependencies: - trifecta - universe-base - unordered-containers + - utf8-string default-extensions: - TemplateHaskell ghc-options: @@ -46,7 +48,6 @@ library: - astar - base16-bytestring - combinatorial - - comonad - composition - conduit - containers @@ -54,14 +55,12 @@ library: - data-interval - data-ordlist - dlist - - extra - fast-digits - finite-typelits - free-algebras - groups - hashable - infinite-list - - lens - linear - monoid-extras - mtl @@ -563,8 +562,6 @@ executables: aoc-2024-day01: <<: *executable main: AdventOfCode.Year2024.Day01 - dependencies: - - extra aoc-2024-day02: <<: *executable main: AdventOfCode.Year2024.Day02 diff --git a/src/AdventOfCode/Input.hs b/src/AdventOfCode/Input.hs index 2ec9b4e..f0911dc 100644 --- a/src/AdventOfCode/Input.hs +++ b/src/AdventOfCode/Input.hs @@ -1,11 +1,15 @@ {-# LANGUAGE LambdaCase #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Input where -import Control.Arrow ((>>>)) -import Control.Monad ((>=>)) +import Advent (AoC (..), AoCUserAgent (..), defaultAoCOpts, mkDay_, runAoC_) +import Data.ByteString.UTF8 qualified as UTF8 import Paths_advent_of_code (getDataFileName) -import Text.Trifecta (Parser, Result (..), parseFromFileEx) +import Relude +import System.Environment (getEnv) +import Text.Trifecta (Parser, Result (..), parseFromFileEx, runParser) import Text.Trifecta qualified as Trifecta parseInput :: Parser a -> FilePath -> IO a @@ -17,6 +21,16 @@ parseInput parser fname = Success result -> pure result Failure reason -> error (show reason) +parseInputAoC :: Integer -> Integer -> Parser a -> IO a +parseInputAoC year day parser = do + opts <- defaultAoCOpts userAgent year <$> getEnv "AOC_SESSION_KEY" + input <- toString <$> runAoC_ opts (AoCInput (mkDay_ day)) + case runParser parser mempty input of + Success result -> pure result + Failure reason -> error (show reason) + where + userAgent = AoCUserAgent "github.com/yurrriq/advent-of-code" "eric@ericb.me" + parseString :: Parser a -> String -> IO a parseString parser = Trifecta.parseString parser mempty >>> \case @@ -24,4 +38,4 @@ parseString parser = Failure reason -> error (show reason) rawInput :: FilePath -> IO String -rawInput = getDataFileName >=> readFile +rawInput = getDataFileName >=> readFileBS >>> fmap UTF8.toString diff --git a/src/AdventOfCode/Util.hs b/src/AdventOfCode/Util.hs index 6d79518..10a269c 100644 --- a/src/AdventOfCode/Util.hs +++ b/src/AdventOfCode/Util.hs @@ -1,6 +1,7 @@ {-# LANGUAGE BangPatterns #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE TypeApplications #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Util ( CyclicEnum (..), @@ -27,18 +28,12 @@ module AdventOfCode.Util ) where -import Control.Arrow (second, (>>>)) import Control.Comonad.Store (experiment) import Control.Lens (holesOf) -import Control.Monad (join, (>=>)) -import Data.ByteString (ByteString) -import Data.Function (fix) import Data.IntMap qualified as IM -import Data.List (unfoldr) -import Data.Map (Map) import Data.Map qualified as Map -import Data.Set (Set) import Data.Set qualified as Set +import Relude import Text.Trifecta (Parser, Result (..), parseByteString) -- https://github.com/bravit/hid-examples/blob/master/ch02/radar/Radar.hs diff --git a/src/AdventOfCode/Year2024/Day01.hs b/src/AdventOfCode/Year2024/Day01.hs index 60f3214..8ce1f0d 100644 --- a/src/AdventOfCode/Year2024/Day01.hs +++ b/src/AdventOfCode/Year2024/Day01.hs @@ -1,28 +1,45 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2024.Day01 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle (Puzzle, runPuzzle) +import AdventOfCode.TH (evalPuzzle) import AdventOfCode.Util (frequencies) -import Data.List (sort, transpose) -import Data.List.Extra (sumOn') +import Control.Foldl qualified as Foldl +import Control.Lens (makeLenses, (<.=)) import Data.Map qualified as Map -import Text.Trifecta (count, natural, some) +import Relude +import Text.Trifecta (count, natural) + +data PuzzleState + = PuzzleState + { _answerOne :: !Integer, + _answerTwo :: !Integer + } + deriving (Eq, Generic, Show) + +makeLenses ''PuzzleState + +emptyPuzzleState :: PuzzleState +emptyPuzzleState = PuzzleState 0 0 main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -partOne :: (Num a, Ord a) => ([a], [a]) -> a -partOne (xs, ys) = sumOn' abs $ zipWith subtract (sort xs) (sort ys) +partOne :: Puzzle ([Integer], [Integer]) PuzzleState Integer +partOne = do + (xs, ys) <- ask + answerOne <.= Foldl.fold (Foldl.premap abs Foldl.sum) (ZipList (zipWith subtract (sort xs) (sort ys))) -partTwo :: (Num a, Ord a) => ([a], [a]) -> a -partTwo (xs, ys) = sumOn' go xs - where - go x = x * fromIntegral (Map.findWithDefault 0 x (frequencies ys)) +partTwo :: Puzzle ([Integer], [Integer]) PuzzleState Integer +partTwo = do + (xs, ys) <- ask + let go x = x * toInteger (Map.findWithDefault 0 x (frequencies ys)) + answerTwo <.= Foldl.fold (Foldl.premap go Foldl.sum) xs getInput :: IO ([Integer], [Integer]) -getInput = - do - [xs, ys] <- - transpose - <$> parseInput (some (count 2 natural)) $(inputFilePath) - pure (xs, ys) +getInput = do + [xs, ys] <- transpose <$> parseInputAoC 2024 1 (some (count 2 natural)) + pure (xs, ys) From a73f4c567ed26cd34f779a5a3c1a56ec7d4bf8d1 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Mon, 10 Nov 2025 22:01:26 -0600 Subject: [PATCH 02/91] refactor(2024.02-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2024/day02.txt | 1000 ---------------------------- src/AdventOfCode/Year2024/Day02.hs | 48 +- 3 files changed, 37 insertions(+), 1013 deletions(-) delete mode 100644 input/2024/day02.txt diff --git a/VERSION b/VERSION index c568b6a..f278630 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.25 \ No newline at end of file +2024.7.2.26 \ No newline at end of file diff --git a/input/2024/day02.txt b/input/2024/day02.txt deleted file mode 100644 index e18c9cb..0000000 --- a/input/2024/day02.txt +++ /dev/null @@ -1,1000 +0,0 @@ -40 42 45 46 49 47 -65 66 68 71 72 72 -44 46 49 52 55 59 -62 63 66 68 71 74 80 -20 23 25 24 26 -37 38 35 38 39 38 -82 83 80 82 83 83 -69 72 75 74 77 79 83 -23 26 24 27 34 -59 62 62 65 67 -21 24 24 27 30 32 29 -56 57 58 59 59 62 62 -72 75 77 77 81 -79 81 81 83 86 93 -6 8 11 12 16 17 -13 16 20 23 24 21 -85 86 88 92 92 -74 76 78 82 85 88 92 -3 5 6 8 12 18 -48 51 54 61 63 -48 51 56 58 61 63 65 64 -13 14 19 20 23 23 -25 27 34 35 36 40 -59 61 64 67 68 73 74 81 -61 60 62 64 66 67 68 -19 17 18 21 20 -94 92 95 97 98 98 -75 72 74 75 78 82 -49 48 50 51 56 -42 39 40 41 40 41 44 -42 40 42 41 42 40 -70 67 64 66 66 -50 48 49 48 51 55 -66 65 68 66 67 69 75 -91 88 88 89 90 91 92 -28 25 27 29 29 31 32 31 -77 74 75 75 75 -86 83 85 85 88 92 -26 23 24 24 27 33 -48 45 47 51 54 56 58 -43 41 42 43 46 50 49 -20 19 22 25 26 30 30 -11 10 14 15 19 -19 17 20 23 26 30 37 -23 20 21 24 26 31 34 36 -94 91 96 99 97 -88 86 88 89 92 98 98 -19 16 18 21 27 29 32 36 -69 66 67 69 75 80 -2 2 3 6 7 8 9 10 -69 69 70 72 74 75 76 75 -23 23 26 29 29 -15 15 17 19 21 22 24 28 -34 34 35 38 44 -45 45 43 45 48 -52 52 54 56 54 57 56 -7 7 6 8 10 13 15 15 -81 81 84 83 87 -65 65 63 65 70 -23 23 24 25 25 27 29 -20 20 22 22 19 -2 2 4 6 6 6 -45 45 48 49 52 55 55 59 -74 74 76 76 79 82 87 -4 4 8 11 12 14 -38 38 41 43 47 44 -80 80 81 83 87 87 -3 3 6 8 10 12 16 20 -31 31 32 36 42 -81 81 82 88 91 94 97 98 -36 36 37 38 44 41 -2 2 3 8 8 -63 63 69 72 76 -2 2 7 10 15 -19 23 26 29 31 32 -51 55 56 59 62 65 63 -52 56 59 60 62 64 64 -71 75 77 79 81 85 -7 11 12 15 18 21 26 -32 36 33 36 37 40 43 46 -40 44 42 43 46 48 51 49 -14 18 21 24 21 21 -27 31 29 30 32 34 38 -56 60 61 64 66 69 66 72 -73 77 79 79 81 83 84 -5 9 10 13 14 14 17 16 -33 37 38 41 41 41 -64 68 70 70 73 77 -34 38 40 42 43 43 48 -46 50 53 55 59 62 -71 75 79 82 79 -38 42 46 49 51 51 -59 63 66 70 74 -82 86 90 91 97 -22 26 28 33 36 37 -64 68 73 76 74 -65 69 71 72 78 78 -20 24 27 30 36 40 -65 69 72 75 77 83 84 89 -6 13 16 18 20 -32 39 41 43 44 42 -52 57 59 61 64 66 66 -80 87 90 91 93 95 99 -22 29 32 35 38 43 -86 92 94 91 92 -81 87 88 89 87 88 86 -22 27 28 31 33 30 32 32 -7 13 15 14 18 -52 59 60 61 58 64 -32 38 38 41 44 47 49 -25 32 33 34 34 35 36 35 -68 73 75 75 77 80 82 82 -79 84 87 87 91 -25 30 31 34 35 35 42 -2 7 9 13 15 17 18 19 -11 18 22 23 22 -4 9 12 13 16 18 22 22 -48 53 54 58 61 65 -11 16 20 21 24 29 -10 15 22 24 26 -6 12 14 21 23 26 24 -55 60 61 64 65 72 72 -64 70 72 74 76 82 85 89 -28 34 40 42 44 45 46 51 -19 16 15 13 16 -30 29 27 26 26 -78 77 74 71 70 66 -70 68 67 66 65 62 60 55 -74 72 70 72 71 68 67 65 -80 79 82 80 83 -46 43 41 38 37 38 38 -55 54 56 55 51 -79 77 76 74 73 74 67 -32 30 30 29 28 25 23 -43 42 42 41 39 37 34 36 -30 28 26 26 24 24 -33 31 29 29 26 22 -94 91 89 86 86 80 -39 38 35 33 30 26 25 23 -36 34 32 30 29 26 22 25 -17 15 14 12 8 5 5 -33 32 31 27 24 23 19 -44 42 38 36 33 30 23 -92 90 83 82 80 -24 21 15 12 15 -88 85 83 77 74 73 73 -31 29 27 21 17 -78 75 70 69 68 61 -60 62 60 57 55 -92 95 94 91 94 -66 67 64 62 62 -67 70 67 64 60 -49 52 51 49 47 46 41 -94 95 97 94 93 90 -85 86 85 84 87 86 87 -40 43 40 39 41 38 38 -82 83 80 83 82 78 -95 97 99 96 90 -94 96 95 93 93 90 -29 31 31 28 27 30 -49 51 49 47 45 45 44 44 -16 19 19 16 15 13 12 8 -12 13 13 12 5 -59 61 57 55 54 -34 37 36 32 34 -45 47 43 42 41 41 -80 81 78 77 73 70 69 65 -88 91 90 86 79 -60 63 60 59 56 49 48 -83 85 83 81 80 74 72 73 -94 95 92 87 86 83 82 82 -67 70 69 67 60 56 -32 34 32 26 19 -25 25 22 21 18 -25 25 24 23 24 -82 82 81 80 77 74 71 71 -87 87 85 83 79 -27 27 26 24 17 -66 66 69 66 63 -73 73 70 67 64 67 66 69 -90 90 93 90 88 88 -77 77 74 75 71 -57 57 56 57 54 52 50 43 -29 29 28 25 25 22 -52 52 50 50 53 -19 19 19 16 14 12 9 9 -73 73 70 69 67 67 65 61 -96 96 93 90 88 88 82 -18 18 14 12 10 7 6 4 -27 27 23 22 20 19 17 19 -21 21 20 17 15 11 11 -92 92 89 85 82 79 75 -38 38 37 33 31 28 22 -15 15 13 7 4 3 2 -58 58 53 52 55 -70 70 69 64 64 -39 39 37 34 33 26 23 19 -49 49 42 41 34 -80 76 73 70 67 -79 75 73 70 67 70 -27 23 20 19 18 15 12 12 -92 88 87 84 81 78 77 73 -81 77 75 73 71 65 -67 63 66 65 63 -60 56 58 55 52 54 -98 94 96 95 95 -87 83 86 85 84 80 -35 31 33 31 24 -41 37 37 34 31 -26 22 20 17 16 16 18 -63 59 58 58 56 56 -96 92 89 86 86 82 -90 86 85 84 84 77 -22 18 14 13 10 8 6 -71 67 66 62 64 -71 67 65 62 60 56 56 -97 93 90 86 82 -35 31 27 25 19 -96 92 89 87 80 78 76 74 -69 65 58 57 55 53 55 -19 15 14 8 5 5 -72 68 67 64 62 60 54 50 -80 76 75 70 63 -32 27 25 24 21 -88 83 82 80 77 75 72 74 -82 76 73 72 72 -87 82 81 79 76 75 71 -99 93 90 89 86 81 -23 18 16 15 13 12 14 13 -82 77 75 72 69 71 74 -21 16 13 14 11 9 9 -67 62 60 63 60 56 -98 92 95 93 91 88 81 -14 9 9 8 6 3 2 -27 20 18 18 21 -20 13 13 11 11 -36 30 28 26 23 23 19 -51 46 46 45 38 -62 57 55 51 50 48 -45 38 34 31 33 -24 19 17 14 10 8 8 -88 81 77 76 74 70 -54 47 44 40 37 35 29 -90 83 80 78 71 68 65 -35 30 23 20 19 22 -76 69 63 60 58 57 57 -81 74 72 65 62 58 -29 24 21 20 13 10 5 -58 55 56 56 53 -43 40 38 33 30 -90 86 85 86 85 84 82 84 -46 50 53 51 52 56 -83 82 81 79 77 73 68 -56 60 63 66 68 70 73 77 -48 44 43 38 36 35 31 -61 54 53 51 52 45 -1 4 4 7 8 10 13 -35 41 43 48 48 -22 25 26 27 28 31 31 -4 8 11 11 18 -71 73 76 80 83 -42 47 50 51 55 57 60 -7 7 4 7 8 9 8 -64 64 62 61 59 60 63 -70 66 64 62 60 63 63 -13 10 13 18 23 -18 20 21 23 29 30 31 38 -38 38 41 40 44 -31 34 32 29 26 26 -46 44 46 49 51 53 60 64 -22 29 32 33 31 33 37 -34 34 28 26 25 24 -92 91 88 90 90 -18 17 19 20 23 23 -31 31 28 24 22 21 16 -84 83 80 76 76 -60 61 64 65 68 72 -57 54 58 60 63 66 -74 73 66 65 62 55 -52 54 53 48 42 -86 83 80 77 75 71 69 -50 46 45 44 47 45 42 -42 42 45 43 41 38 35 29 -37 34 37 40 40 44 -96 95 94 92 93 90 84 -7 4 7 9 7 8 15 -58 52 55 53 53 -37 41 43 50 52 54 52 -60 64 65 69 70 73 74 74 -61 61 58 61 59 56 53 49 -44 44 41 40 37 31 27 -46 50 50 53 55 56 54 -25 27 28 27 25 23 21 20 -96 96 93 91 88 87 81 74 -80 80 81 79 76 -53 58 65 66 63 -82 75 74 76 75 71 -12 11 16 18 18 -5 9 11 12 15 20 24 -36 32 30 30 28 25 26 -15 19 21 26 28 28 -61 59 62 63 65 66 69 72 -17 22 24 25 27 29 -76 74 73 70 64 64 -76 72 70 66 64 61 57 -12 14 13 10 7 2 3 -24 27 26 24 24 23 -11 9 10 10 10 -88 84 80 79 78 73 -90 87 89 89 96 -69 67 70 73 70 73 74 -63 67 69 74 75 78 -27 23 19 17 15 13 10 -46 52 53 54 54 56 62 -41 35 33 31 30 25 25 -8 7 11 12 17 -6 6 6 8 9 12 13 13 -13 20 25 28 30 33 -89 84 82 81 80 -41 48 52 53 55 55 -48 49 51 52 53 56 -92 91 89 88 86 83 82 -68 69 72 75 78 -89 90 92 94 95 -10 13 16 19 22 -88 87 86 83 80 77 -42 45 46 49 50 53 -31 28 26 24 21 20 17 -30 29 26 24 23 -90 89 87 84 83 82 81 -1 4 7 9 12 13 -52 53 56 57 58 60 -27 24 23 21 18 -2 3 5 7 10 12 15 -73 75 77 79 82 -78 79 82 85 88 -74 71 69 68 66 63 60 -23 24 27 29 30 33 34 35 -54 53 51 48 45 43 -30 33 35 36 39 40 -82 81 79 77 76 -88 87 85 84 82 81 -15 17 19 22 24 25 27 -26 24 22 21 20 18 17 16 -18 15 12 9 8 -32 33 36 39 41 -72 69 66 65 62 61 59 56 -84 83 82 79 78 -13 14 16 18 21 -67 66 63 62 59 56 -57 58 61 62 63 65 -14 12 10 8 7 5 3 -22 24 26 28 30 32 34 36 -65 62 61 58 57 54 -30 27 24 23 21 20 18 17 -69 68 66 65 63 62 -63 65 68 70 73 76 79 81 -32 35 38 40 41 42 45 47 -98 97 94 93 90 88 87 -7 8 10 13 15 -15 16 18 21 24 27 30 31 -23 24 26 28 30 31 34 -82 79 78 75 74 72 -70 73 76 78 81 84 85 87 -51 48 47 46 45 43 42 -48 45 42 39 38 37 -35 33 31 30 29 -24 26 27 29 32 35 -33 30 27 25 22 21 20 -17 20 23 26 27 30 32 -34 32 30 28 25 23 -30 31 33 35 37 39 42 43 -17 18 19 20 23 25 -52 54 55 56 58 61 62 -31 28 27 25 23 22 21 18 -42 44 46 47 48 -98 97 94 91 89 -57 54 52 50 48 45 44 43 -23 20 17 16 14 13 10 7 -47 49 52 53 55 56 57 59 -57 58 60 61 64 66 69 70 -70 72 74 76 79 -74 77 80 81 82 -27 24 22 19 16 14 -32 30 28 27 24 22 -72 71 70 68 66 63 61 60 -40 37 34 31 29 27 25 -15 13 12 10 9 -19 17 14 12 9 7 4 2 -84 82 79 76 73 72 -49 48 45 43 42 40 37 -68 65 62 61 60 59 56 -46 45 43 40 37 -79 76 75 74 73 -34 36 37 38 39 40 42 -70 72 74 75 77 78 81 83 -52 54 56 58 59 -33 35 38 40 43 46 47 -64 66 68 70 72 75 -46 45 42 40 37 -47 44 43 42 41 40 37 36 -85 82 80 77 76 74 -36 37 40 41 43 45 48 -39 42 44 47 49 51 -31 32 34 36 37 -52 55 58 60 62 65 -42 45 47 48 51 54 55 58 -11 10 8 7 6 3 -11 13 14 17 19 -92 89 86 83 81 79 -77 80 81 84 85 86 88 -44 46 49 50 52 -27 29 32 34 37 -84 85 87 89 92 94 -71 74 75 77 80 -47 49 52 53 55 -70 71 74 76 79 -14 17 18 20 22 23 -93 92 90 88 86 83 -92 91 89 87 85 82 80 78 -44 43 42 39 38 36 33 31 -27 26 23 22 20 -56 55 52 50 47 46 44 41 -83 82 81 80 78 76 73 70 -39 37 36 34 32 30 -22 23 26 29 32 33 35 -17 19 22 25 27 29 -92 91 90 89 88 -83 82 81 80 78 77 -45 43 42 41 40 -41 44 47 49 50 52 54 -62 63 66 68 71 73 76 -56 54 51 50 49 -21 19 17 15 12 10 -20 17 16 13 12 11 9 -81 82 84 85 86 89 -57 60 62 65 68 71 74 -29 27 25 24 21 19 -75 72 71 68 65 64 -20 17 14 12 9 6 3 -90 89 88 86 83 80 78 -80 81 82 83 86 87 88 -66 69 71 74 76 77 80 -43 40 37 35 32 30 27 26 -68 66 64 62 59 56 -42 45 47 48 49 50 52 55 -20 17 16 13 11 8 6 5 -29 30 32 34 37 40 -48 50 52 55 56 59 62 64 -86 87 90 91 92 -25 28 29 30 32 35 38 -28 26 23 22 20 19 -72 69 68 66 63 60 59 -83 82 79 76 74 73 71 -60 59 58 55 53 -8 10 12 15 17 18 19 21 -20 23 25 28 31 32 34 37 -77 75 72 69 67 -21 20 19 16 13 -25 24 23 22 21 19 16 13 -77 76 75 72 70 -56 53 52 51 50 49 47 -39 40 41 42 43 44 -55 58 61 63 65 67 69 -57 54 51 48 47 46 -76 74 73 72 69 66 -38 39 41 43 44 46 -15 16 19 21 22 23 26 27 -20 21 23 25 28 30 31 33 -40 37 36 33 30 29 26 23 -86 85 83 80 78 76 75 -47 48 50 51 54 57 -86 85 84 83 81 80 77 75 -62 63 66 68 71 -53 52 50 49 48 47 44 41 -97 94 91 88 85 82 79 -37 39 42 44 45 -90 87 85 83 80 78 75 -92 89 86 84 82 79 77 74 -86 83 80 78 76 74 72 71 -75 76 79 80 82 85 88 -38 40 42 44 45 46 48 -49 50 52 54 57 -11 14 16 19 22 23 -23 21 20 17 14 -51 53 54 57 60 61 63 -37 36 33 31 30 29 28 27 -25 22 21 18 16 14 13 10 -57 58 61 62 63 64 -87 89 91 94 96 -87 90 92 93 96 -89 87 84 81 80 79 76 73 -97 95 94 92 91 -86 85 83 80 79 -28 26 23 21 19 16 14 -83 81 79 76 74 71 70 67 -85 88 89 90 92 -49 51 52 54 56 57 58 -49 46 43 42 39 37 34 -35 34 31 29 28 25 -20 18 17 16 13 11 8 -84 83 80 77 76 75 -33 31 28 27 25 24 21 19 -73 72 69 66 63 61 60 57 -52 51 50 47 45 44 41 38 -14 12 9 8 6 -38 40 42 44 46 47 48 -87 86 85 84 83 -67 70 73 74 77 -25 24 22 20 19 17 -36 33 31 30 28 -50 51 54 57 59 62 64 65 -34 35 37 40 43 46 48 -45 47 48 50 52 53 55 -4 7 9 10 13 16 19 -80 81 82 85 88 91 -71 69 66 65 64 61 60 -17 18 21 23 26 27 -22 23 24 25 28 -28 31 34 37 38 40 -15 12 9 7 6 4 -60 63 66 67 68 71 -19 20 21 22 24 27 28 -25 27 30 32 35 38 40 -91 90 89 87 86 84 81 -65 62 61 58 56 54 52 -80 77 75 72 71 69 -15 13 10 8 6 3 1 -37 36 34 32 29 27 24 22 -89 86 84 82 79 -67 65 64 61 58 55 52 -97 94 92 89 86 -56 59 62 65 66 67 69 70 -28 31 34 35 36 39 -13 15 16 17 18 -50 49 46 43 40 39 36 35 -28 31 34 36 37 39 -18 17 14 13 10 8 -23 21 19 17 15 12 -61 63 65 68 69 -12 13 14 17 20 21 23 -29 27 25 23 20 -62 59 58 55 54 53 51 -45 44 42 39 38 37 35 -65 62 59 58 57 -35 34 32 30 27 -46 43 41 39 36 34 31 -21 23 25 28 30 33 35 -51 50 48 47 44 -69 70 72 75 77 -97 95 93 91 89 86 83 81 -23 26 29 31 33 34 -88 85 84 81 80 78 -44 47 49 52 55 56 -69 70 72 73 76 78 79 82 -73 70 68 66 64 63 61 59 -65 68 70 72 74 75 76 77 -53 51 48 45 44 42 40 38 -94 92 90 89 88 86 83 -39 38 36 34 33 -38 39 41 43 45 47 -42 41 38 36 34 -89 88 87 86 85 -20 22 25 28 31 34 -83 81 79 76 74 73 -98 95 92 91 89 87 -79 77 75 72 70 68 67 66 -9 8 7 4 3 -10 11 12 13 15 17 20 -61 58 56 55 52 50 -31 34 36 39 41 44 -89 92 94 95 97 99 -48 49 52 53 54 55 56 -80 78 76 74 71 69 66 -34 33 31 30 27 26 -44 41 38 37 34 32 -56 54 53 52 49 47 44 43 -37 38 39 40 42 -87 89 91 94 96 99 -37 39 42 45 46 -19 18 15 13 10 -47 44 41 40 37 35 33 30 -49 50 51 54 57 58 -33 31 28 25 23 20 18 -48 50 53 55 57 -32 33 36 38 41 44 45 -45 43 41 39 38 36 -75 73 71 68 67 -61 64 66 68 71 72 75 76 -58 59 60 62 64 67 69 -78 80 83 84 87 89 92 95 -18 17 15 14 11 9 8 -44 47 50 53 54 57 58 -21 24 27 30 31 -74 72 71 70 68 65 62 -62 59 58 56 53 -59 61 64 65 67 68 71 -64 66 67 70 71 74 -66 65 63 62 61 58 55 53 -1 2 5 7 8 9 11 12 -67 65 62 59 57 54 52 -11 8 6 3 2 -76 73 72 69 68 67 65 -30 28 25 22 21 20 -43 40 38 37 35 34 32 31 -77 79 80 81 82 85 86 89 -74 72 69 67 66 63 -42 44 45 47 50 51 53 -16 13 10 7 6 -73 76 78 79 82 84 86 -28 31 33 34 36 38 -80 83 84 86 87 90 91 92 -49 51 52 53 55 -15 18 20 23 25 -3 6 9 10 13 16 -41 43 45 47 49 -10 13 16 19 20 21 22 25 -38 41 43 45 47 48 49 -78 79 81 83 85 86 88 -43 40 38 37 35 32 30 -89 86 84 83 82 79 77 75 -62 61 59 58 57 54 51 -78 77 74 72 69 68 -17 14 11 8 6 3 1 -44 46 48 50 53 56 59 60 -48 47 44 43 40 -75 73 71 69 66 63 60 -2 3 5 6 7 8 10 -57 59 61 62 65 -93 91 88 87 86 -19 18 15 13 11 8 6 -54 57 58 61 64 66 69 -52 49 46 43 40 -28 27 24 21 18 15 14 -28 26 23 21 20 17 16 14 -86 84 83 81 78 75 74 71 -37 40 41 43 44 45 48 -7 8 9 10 13 16 19 -41 38 36 33 31 30 27 -67 65 63 61 59 56 -41 39 38 35 33 32 29 -13 12 9 8 5 4 -22 24 25 27 29 30 33 36 -38 37 35 32 31 28 27 -18 20 22 24 25 26 29 -87 85 82 81 80 78 -65 64 62 61 59 -23 24 25 28 29 31 -80 79 77 75 74 71 -9 10 13 15 16 17 20 21 -25 28 29 32 33 36 -24 21 19 17 15 -22 24 27 28 31 34 -77 78 79 82 83 84 85 86 -61 62 64 65 67 70 73 -39 38 37 36 35 33 31 29 -84 86 88 91 92 95 -59 56 55 52 49 46 44 -25 23 21 19 18 -9 7 6 4 3 -25 28 30 32 33 35 36 38 -39 41 44 46 49 52 54 -26 25 22 19 18 -80 77 75 73 70 -30 27 24 21 20 19 16 14 -76 77 79 80 83 -27 26 24 22 19 17 14 -50 53 55 56 58 61 62 -45 44 43 40 39 38 35 -41 44 45 47 48 49 -15 13 10 8 6 4 1 -41 40 39 36 34 31 -61 60 57 56 55 53 52 51 -27 24 21 20 17 -19 18 17 14 11 -22 21 19 17 14 11 9 -39 36 33 31 28 27 -72 69 66 64 62 60 -15 17 18 20 21 -34 35 36 39 42 44 -11 12 13 16 17 20 -75 73 70 69 66 63 62 61 -87 85 82 80 77 75 -96 95 92 90 87 84 -79 81 83 84 86 89 -83 86 88 89 91 93 95 -27 24 23 22 20 17 16 -80 82 83 85 87 90 -21 22 23 25 26 28 30 31 -20 18 17 14 11 8 6 -68 65 63 62 60 58 56 -55 56 59 62 64 66 68 -18 16 15 13 10 8 5 3 -37 40 42 43 45 47 48 -97 94 91 90 87 85 -84 86 89 92 93 94 -92 89 87 86 84 82 80 78 -39 41 44 46 49 51 54 56 -47 49 51 53 54 -72 74 75 78 79 81 -4 6 9 12 14 16 18 21 -45 48 51 53 55 -78 80 82 84 86 87 88 90 -76 75 74 71 69 -42 40 38 35 32 -13 10 8 7 4 2 1 -67 64 62 59 56 53 50 49 -48 50 51 52 54 57 58 -2 3 6 7 9 10 -17 16 14 13 11 8 6 -52 50 49 48 47 -46 44 42 39 37 35 -4 6 7 9 10 -35 38 41 43 44 45 48 -55 54 52 49 47 45 44 -60 63 65 66 69 -62 59 57 56 54 52 51 -53 56 57 60 62 63 -79 77 75 74 72 -27 26 23 20 17 15 -76 77 80 81 82 -70 71 72 75 76 79 80 -58 57 55 53 51 48 46 44 -50 53 55 56 58 60 -55 56 59 61 63 64 66 -27 28 31 34 36 37 39 -40 39 38 35 32 -75 72 71 69 66 65 64 -32 34 36 37 39 41 -31 28 27 25 23 20 18 -48 46 43 42 39 38 -25 24 23 22 19 18 16 14 -51 54 56 58 59 62 -64 62 61 58 55 53 -32 34 36 38 39 41 42 43 -38 37 36 34 33 -10 11 13 14 16 19 22 25 -39 36 33 30 27 24 23 21 -32 34 35 36 38 41 42 43 -17 19 21 23 26 29 30 31 -64 65 67 70 71 72 73 76 -58 59 61 62 63 -99 96 93 91 89 86 -31 32 35 36 39 41 42 -96 95 92 90 89 87 84 82 -29 32 33 35 37 39 41 -57 55 53 51 48 46 -14 12 11 9 7 6 -26 27 29 32 35 36 37 -31 30 29 26 23 21 -53 54 57 58 61 -59 56 54 51 48 45 42 40 -39 42 44 45 47 50 -42 39 36 34 32 29 26 24 -66 63 62 61 58 56 -11 14 16 17 20 21 22 23 -73 72 70 69 68 65 -37 38 41 43 44 -47 49 51 53 56 57 58 -34 37 40 42 44 47 -76 79 82 85 87 -71 70 69 68 67 66 64 61 -28 26 25 22 20 17 14 13 -43 46 48 49 51 -20 18 16 15 13 11 -69 66 65 62 59 -18 19 20 23 25 -65 68 69 72 74 77 79 81 -25 23 22 20 18 16 -21 20 17 15 14 13 11 10 -10 13 15 16 18 19 20 22 -52 53 56 57 59 61 62 63 -21 24 27 30 32 35 37 40 -78 77 76 73 72 70 68 65 -59 57 55 52 49 46 45 44 -31 34 37 40 43 46 49 50 -71 69 68 65 63 62 60 58 -61 62 65 66 67 68 -49 51 54 57 58 59 61 63 -38 36 35 34 33 30 28 26 -84 86 89 91 92 94 95 -46 48 50 52 54 56 -53 50 49 47 46 43 40 -33 35 36 37 40 42 -23 21 20 19 18 17 14 -70 68 67 66 63 60 -87 89 90 92 95 98 -91 90 87 85 83 81 -82 83 86 88 90 93 95 97 -87 88 90 93 95 -88 91 92 93 94 97 -24 23 21 20 18 17 -63 66 67 69 72 74 76 -47 50 53 56 57 59 61 -29 27 26 24 22 20 -20 18 17 16 13 11 9 6 -43 46 47 50 52 55 57 59 -7 8 9 11 14 15 -69 66 65 62 60 58 -15 18 21 24 26 -97 94 92 91 88 86 85 -55 52 49 48 47 -48 49 50 51 54 56 59 -29 31 32 35 38 41 42 43 -83 85 87 89 92 93 96 99 -71 74 76 77 80 82 84 86 -29 26 23 22 20 19 17 -45 47 50 51 52 55 57 -32 31 30 29 27 -99 98 97 96 94 91 88 -21 20 17 14 12 -85 84 82 79 76 75 -71 74 77 78 81 82 85 87 -78 79 80 81 83 -85 86 89 91 92 93 94 -9 11 14 15 17 18 -10 11 13 15 17 18 -50 52 53 55 57 -29 30 33 36 38 41 -17 18 21 24 27 30 31 -49 50 51 54 55 57 59 -64 62 60 59 57 54 53 51 -57 60 63 66 69 70 72 74 -96 95 93 91 88 86 -87 85 82 80 78 76 74 -67 69 72 75 78 81 -18 20 21 23 24 -19 16 13 11 8 7 5 2 -60 61 62 63 65 -40 38 35 32 29 28 25 -86 87 89 91 92 93 -21 23 24 25 27 28 29 -20 23 25 28 31 -52 55 56 57 59 -4 7 9 10 12 -39 42 44 47 48 51 -12 15 18 21 24 26 29 32 -1 3 5 8 9 11 13 -14 17 20 21 22 25 26 -14 11 10 8 6 5 2 -21 23 24 27 30 -33 35 36 37 39 -35 32 31 28 25 -79 78 75 72 69 -33 35 37 38 39 42 44 -22 21 19 18 15 12 9 8 -66 65 64 63 62 61 59 58 -88 85 84 81 79 76 74 -73 71 68 66 65 62 -66 67 69 71 73 -51 49 47 46 45 44 -29 26 24 21 18 17 16 -21 20 19 16 15 13 11 10 -65 63 62 60 58 57 -67 65 64 62 59 56 55 52 -10 11 12 14 15 -71 68 66 65 63 61 58 -41 39 36 35 34 31 29 27 -95 92 91 89 88 87 -24 26 28 30 33 35 38 -88 90 91 93 96 -51 48 47 45 44 -68 65 64 63 61 59 -84 83 82 79 78 77 76 -32 30 28 25 23 -42 40 38 37 34 -29 28 25 22 19 16 13 -21 24 26 29 30 32 35 38 -57 59 60 61 62 65 67 -50 53 56 59 61 63 66 67 -56 58 60 62 63 -44 43 41 38 36 33 -14 11 10 9 6 5 -17 18 19 20 23 26 -45 46 48 51 53 54 56 -93 92 90 88 86 84 -42 40 39 37 36 35 -11 14 17 20 22 -55 52 51 50 49 47 46 -30 32 35 38 39 41 44 -57 60 61 64 67 69 -49 46 44 41 38 -28 26 24 23 22 20 19 -3 6 7 8 11 14 15 16 -74 71 68 67 65 64 -73 72 70 67 66 64 -32 31 28 26 24 -86 89 91 93 96 99 -91 93 96 98 99 -63 61 60 57 55 53 51 48 -55 54 51 50 47 46 45 44 -76 73 71 69 68 65 -61 64 67 69 71 -20 23 26 27 30 33 36 39 -47 50 52 55 58 59 60 -68 66 63 62 61 60 -14 13 10 9 8 -71 72 75 78 81 84 87 -43 44 45 47 49 -97 95 93 92 91 90 87 -27 25 22 20 19 18 -61 64 67 68 69 -92 89 87 84 81 79 76 75 -79 80 83 86 89 90 92 93 -20 21 23 26 28 -40 37 34 33 32 30 28 27 -16 15 14 11 10 8 -46 43 40 39 38 -42 45 46 48 49 51 -15 12 9 8 6 4 1 -21 18 15 14 11 10 8 -32 31 30 28 25 -66 67 70 73 76 -31 33 34 37 39 42 44 -77 79 80 82 83 -71 73 75 78 80 83 86 -14 17 20 21 23 -61 59 58 57 54 53 51 48 -17 18 21 22 25 -19 22 24 27 28 31 -62 65 66 68 71 74 76 -76 79 81 83 84 -33 31 28 27 24 -85 83 82 81 80 79 76 74 -72 71 69 66 63 62 -83 86 89 91 92 93 94 -61 64 67 68 70 71 73 -59 61 63 64 65 66 69 72 -25 22 19 18 16 15 14 -56 54 51 49 48 46 -64 65 67 68 69 -71 72 73 75 76 78 79 -67 70 71 73 74 77 -88 89 90 93 96 98 -33 34 35 38 40 -28 31 32 35 37 -73 72 70 69 67 -41 39 37 36 35 -67 64 63 60 57 56 55 -75 72 71 70 67 64 62 -91 92 95 96 97 99 -58 57 56 54 51 -38 39 40 41 42 44 -54 52 51 50 47 -42 39 38 36 35 33 -27 30 33 34 37 -73 72 71 69 67 66 63 -68 67 66 65 62 61 -16 13 11 10 8 7 -25 26 28 30 33 34 35 37 -65 62 60 59 58 -46 44 43 42 40 37 34 -31 28 27 26 24 21 18 16 -10 12 13 15 16 19 21 24 -45 48 51 54 57 59 62 64 -84 87 90 92 94 96 -80 82 84 87 89 90 -17 18 19 20 23 -77 80 83 86 88 90 -40 37 35 33 31 30 28 -76 73 72 70 68 67 66 64 -53 54 56 59 60 -21 24 25 27 30 33 35 -59 57 54 53 52 49 46 45 -46 45 43 40 39 36 33 -49 46 43 42 41 -30 32 33 36 37 38 41 42 -15 12 10 8 5 -93 90 89 86 83 82 79 78 -63 64 66 68 71 72 75 -39 40 43 45 47 -42 39 37 35 32 31 28 -51 53 55 58 61 62 -59 56 55 52 51 -40 37 35 34 32 30 29 28 -31 33 34 36 39 42 43 -90 91 93 94 95 98 -33 34 37 39 42 45 48 -62 64 65 66 67 69 -65 62 61 60 57 -86 83 80 77 76 -74 73 72 71 69 67 -23 24 26 29 30 -19 17 15 12 10 7 -99 98 97 96 94 -22 23 25 28 30 33 35 -59 62 64 66 67 -24 21 19 18 16 15 14 11 -10 8 6 5 4 2 1 -87 85 83 80 79 77 74 73 -23 26 28 29 30 31 -14 16 19 22 25 -41 42 45 46 47 49 -78 81 82 85 87 -66 64 63 61 59 56 54 -16 15 12 10 7 -84 82 79 77 76 74 -81 82 84 85 88 91 92 -86 83 81 80 77 74 -81 83 86 88 89 diff --git a/src/AdventOfCode/Year2024/Day02.hs b/src/AdventOfCode/Year2024/Day02.hs index 2dc5e3b..cae2a0d 100644 --- a/src/AdventOfCode/Year2024/Day02.hs +++ b/src/AdventOfCode/Year2024/Day02.hs @@ -1,22 +1,45 @@ +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2024.Day02 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle (Puzzle, runPuzzle) +import AdventOfCode.TH (evalPuzzle) import AdventOfCode.Util (count, holes) +import Control.Lens (makeLenses, (<.=)) import Data.Ix (inRange) +import Relude +import Relude.Extra.Bifunctor (bimapBoth) import Text.Trifecta (char, decimal, newline, sepBy1, sepEndBy) +data PuzzleState + = PuzzleState + { _answerOne :: !Int, + _answerTwo :: !Int + } + deriving (Eq, Generic, Show) + +makeLenses ''PuzzleState + +emptyPuzzleState :: PuzzleState +emptyPuzzleState = PuzzleState 0 0 + main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -partOne :: [[Integer]] -> Int -partOne = count isSafe +partOne :: Puzzle [[Integer]] PuzzleState Int +partOne = do + reports <- ask + answerOne <.= count isSafe reports -partTwo :: [[Integer]] -> Int -partTwo = count (any isSafe) . map (map snd . holes) +partTwo :: Puzzle [[Integer]] PuzzleState Int +partTwo = do + reports <- ask + answerTwo <.= count (liftA2 (||) isSafe (any (isSafe . snd) . holes)) reports getInput :: IO [[Integer]] -getInput = parseInput ((decimal `sepBy1` char ' ') `sepEndBy` newline) $(inputFilePath) +getInput = parseInputAoC 2024 2 ((decimal `sepBy1` char ' ') `sepEndBy` newline) example :: [[Integer]] example = @@ -29,7 +52,8 @@ example = ] isSafe :: [Integer] -> Bool -isSafe [] = False -isSafe xxs@(_ : xs) = any (all (inRange (1, 3))) [diffs, negate <$> diffs] - where - diffs = zipWith subtract xxs xs +isSafe = + uncons >>> maybe False \(x, xs) -> + biany getAll getAll + $ foldMap (bimapBoth (All . inRange (1, 3)) . (id &&& negate)) + $ zipWith subtract (x : xs) xs From c5f0af732aac2e7172afe7366cfa10afd8c38a21 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Mon, 10 Nov 2025 22:36:30 -0600 Subject: [PATCH 03/91] refactor(2024.03-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2024/day03.txt | 6 -- src/AdventOfCode/Year2024/Day03.hs | 95 ++++++++++++++++-------------- 3 files changed, 53 insertions(+), 50 deletions(-) delete mode 100644 input/2024/day03.txt diff --git a/VERSION b/VERSION index f278630..cc0cae0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.26 \ No newline at end of file +2024.7.2.27 \ No newline at end of file diff --git a/input/2024/day03.txt b/input/2024/day03.txt deleted file mode 100644 index 34046ac..0000000 --- a/input/2024/day03.txt +++ /dev/null @@ -1,6 +0,0 @@ -}mul(417,770)%why(){/':mul(187,313)<@*select()mul(908,713)who()$mul(156,598)#from()* from()^-mul(233,874)&when()mul(346,616)what()(select(),when()where()when()when()&}mul(814,171)+;how() ?)when()?mul(68,188),[select(336,87)^%when(108,692)#mul(621,712){}when()how(69,755)mul(273,27)+:'?( /what()who()from()mul(135,680)-]{:;mul(7,723)where()@{mul(626,107))how()//when(),~+mul(834,113)&!where()$mul(951,76) /why(767,720)mul(107,588)mul(632,977)mul(55,47))[select()']what()mul(803,299)&%#mul(684,214)]}{-}[mul(806,141),mul(166,98)(select()[*'mul(619,823)mul(633,178)-how()from()?from()*#what()'mul(806,961)what()!?mul(529,544)?+[@$where()mul(498,66)?where()why()who()when()why()'from(742,433)mul(623,31)what()&{>]when()who()$/don't()-^!)where()select()mul(761,938) }}mul(799,944)]~what()mul(872,175) &]-@[mul(59,669)-:,:[{mul(457,618)&),(-[< / mul(490,407)>who()$do()who()!+^mul(579,603);>mul(365,610)!#<^;mul(802,476)}')select()what()don't()$%]}'*what(661,765)>+mul(506,360)*#&!mul(484,725),#~how()~select()don't()?what()mul(16,825)mul(732,513)##mul(990,859) <*,what()%$*?;what()mul(98,564)mul(312,793)~select()where()}$%mul(173,805)}what()/$##}mul(369,326):why(421,566)#mul(357where(305,979)what()*)*mul(775,55){when()%select()~/what() /mul(332,608)-who(),mul(592,150)~/#&#}]mul(453,71>~'from()~%mul(540,100)$/:}#(@ mul(789,978)%$](#{>]?mul(473,873)when()where() {@]why()mul(606,201)who()how()mul(212,663)^;#:when())#don't()where()what()where()*why()why(836,629)@%mul(95,601) +~%'{;mul*,mul(88,716)^ don't()how()when()?%$}when()]?mul(565,119*> $from()-~?mul(980,419)'}from():what()mul(877,181)why()~-, from();~~(mul(347,867)[mul(259,40)?&^/mul(707,897)!!why(589,359)+*>>?@!mul(657,687)/from()who()%-?>?who()mul(795,56) ;<))},mul(3,638)-)mul(243,985)$?where()[})what()mul(487,217)+~//;:mul(449,151)$#(select()why()$%}mul(201,260)select()([[)what()];mul(773,545)~;mul(859,808)mul(235,354)mul(388,265)mul(479,697)from()when()what()select()!^[from()mul(366,310)'*when()/[![(mul(288,12),!,#how()^}}mul(173,948))~why()/!mul(461,403)& where()mul(268,357) -when(578,754)mul(12,923)# /+who();&'^mul(874,174))from()] mul(294+$$[when()where()+mul(118,975)mul(954,230)(+when()mul(579,726)why()$+]$mul(796,252):@ ^?mul(108,275) $)who()why()^mul(782,400);*@~what()'-mul(712,375)[!who(791,378)mul(163,311-]:@!#[select()%%,mul(375,461)*''from()><},@{( ;mul(361,764)@mul(71,571)?%~from()what()[ +mul(384,899)@:]mul(627,870select():@!]/mul(676,247)?$what()%who()&from()from(228,681) mul(974@why()*mul(101,691)^do()[why()how()+&mul(228,575)%$where()&#why()from()mul(601,339)#:>@(from()mul(9,628)~{$],why(412,785)):mul(921,60)?when()$mul(230,472)%where(){?}@{mul(57,287)mul(620,392)who()))how()')}mul(920,110)) how()why()>*)from()'mul(66,955)who()mul(339,162)how()from()#mul(63,609)?+how()<&#where() mul(917,834)(mul(845,751)/mul(803,539)~>&:##?:why()']%^what():mul(462,669)select(),##;:&(mul(211,530)select()from()when()$mul(470,942){-select()what()> mul(934,811where(),mul(424,644))~-{mul(265,791)where()who())mul(403,892)select():<~-when()who(59,475)^mulselect()^mul(265,57)mul(465,609)mul(286,417)select()mul(208,44)#}:)}(+mul(997,988), mul(701,669)where()-from()mul(90,543)-[mul(609,511)>,%-why()why()(what()from()don't()[@;~mul(18,991){;/!^'}-mul(87,567))mul(571,648)-how()#~mul(191,910)}?<&&#~mul(324,407)$(#mul(354,471)^}^#&',)&mul(441,628)'mul(553,282)select(),select()where(){mul(485,690)what()?*]#when()$:>mul(939,289)'mul(482,608)'mul(14,642) how()<@^when(805,793)/mul(132,58)how()($}?where()mul(420,564)mul(542,105)&what()} !~!'why(){mul(380,891from()~where()]what(570,293){mul(255,57)@who(288,308)what()?[how()/mul(838,593)'#+who()what()mul(796,32)&why()who()when()when()^'how())?{(mul(821,630)$@mul(706,250)}+,/why(588,457)'>mul(451,548)where()]where()&?select()# %mul(194,6)how()how()why()( )/~from()&mul(519,83)&from(),mul(462,510),>,-?{)how()[mul(840,412)where()!;why()#where()/<)why()mul(452,646)?}?!$+!,/mul(502,96)^~(^mul(278,460)mul(478,959)where()-,select(233,181)why()>-mul(391,238)mul(59,361)when()-why()select();why()+:@who()[from()]mul(490,50;who()((when()!why()mul(667,140)what()mul]*from()!^}why()}>:do()~ {(select():why()*mul(691,254)select()why()mul(911,232)where()]#;'don't() *^when()]{}mul(479,259)select()'!}@ *?mul(673,636)how();#how()%^ mul(428,280) }}')*+mul(13,237 why()*/:/)mul(128,243)(mul(691,104)-$@mul(622,807)[:mul(489,852))what(55,333)where()#&[how()#mul(502,795)[?mul(820how()@'why()((mul(620,867)mul(507,4)$^- mul(206,143)- mul(10,462)/what()where()what()^what()what()mul(734,952)%how()@mul(730,42)what()]why()when()mul(80,180)how()~?{[:where()?+where(),mul(261,682);$>^mul(946,198)*-~{select()?where()]mul(331,301){@()how()don't()from():mul(105,560)when(378,815)+*):%^mul(613,583)where()##~mul(761,592)select()@[$why(),}{({mul(727,677) /do()#(what()%@$why()%/mul(488,910)who()who();mul(385,653)}mul+ mul(340,374))#(mul(853,934)#&??why()why()mul(764,68)what(){mul(759,904)*;%mul(398who()]}:@'$mul(126,742)how()how()+')@when(){mul(585,684)%$>)<)where()mul(463,855)how(222,976)mul?$#><&$;from()when()when()mul(100,686)!when()what(),>;mul(814,643/@>]>!]mul(835,81)&~select()how()+))+mul(155,781)'%<,;-@'who()mul(709,919) [#{select()(<,where()mul(269,144)what()'>~where()mulwhy()mul(329,330)&from()$:*from()how())mul(483,838)mul(51,282)-+@>++{mul(717,169)($)~]why()^%how(68,594)mul(51,386)where()from()why(424,17))@$mul(230,225)when()&why()*mul(472,522)^what(602,992) mul(169,570)what()/:who()['why(102,867)#'@ $mul(274,92)what(){from()from()from()who() {-mul(372,694){how()select()>mul(15,627)~'who()[what()from()mul(338,200%?*&'!<)mul(477,26)why()*+what()$who()>how()mul(945,996)why()[do()>;who()>why(289,937){!%who()mul(355,685)!mul(644,668)?/ }^}mul(300 [!how()*?when()why() mul(141,672)+&];$)mul(921,47)), {{]>where()from()select()mul(622,890);@$-mul(195,976)$[:when()where()/mul(887,64))mul(799,568),select() { @*>mul(535,258)?why(567,793)^{'*;]mul(202,214)(%when()^<]$-$mul(951,841)![ ];+how()mul(925,412)$;)%']mul(303,460)$where()(mul(369,207)why()>how()%@when()-~-do():+select()#!/usr/bin/perl>#}:mul(110,876'~%from()!{select()mul(924,516)from(){::[#)!&[mul(316how()!from()>mul(570,999) -'}who()&%;}#mul(541,894),'[mul(35,499);select()where()^$@}?mul(239,128)~mul(750,487);how()what(),what()why()]mul(842,927)'&{;what()mul(231,35)+why())who()from()how()why()select()mul(117,134)[*%;~+@/(?mul(184,337)mul(751,262;;mul(71,403),!]/what():*mul(49,974);%mul(556,780)#&;#>when(809,477))}how()mul(934,699)@{!mul(687,51)(where(319,422)why()how():'!mul(340,635) &where() when()-select())>mul(816,984)*;who(267,941){why()#]mul(999,933+ ]$ mul(706,15)!mul(797,760) )who()mul(577,413)(*don't()^@,+mul(551,920)(%@mul%* what()mul(107,870)$?when()how()mul(291,96)>>who()-{]<]'mul(607,186)why()select()mul(239,162) from()how(8,248)+*mul(603,94)*how();];!+mul(937,437)select()[+mul(720,689)@ where()[*<$mul(176,240)mul(488,6)mul(884,356)#what()(#mul(357,216)$why(981,545)mul(15,621):]when(384,172)%?from()/mul(556,42);/[/when()where()%select()mul(911,748);('mul(634,654)mul(187,910):;>mul(671,55)/>why()*mul(487,182) &mul(823,339^[*when()!~$do()mul(752,615)select()}select();) ;mul(891,463)why()who(749,89)&$who() *}-where()mul(483,646)>}-[/mul(463,928)) #when()*who(818,29)where()(&don't()when()%;mul(913,774)} mul(822,254)@]}-mul(949,6)where()from()when();;when()>@@(mul(631,409)where()select()who()~}mul(492,930)mul(388,777) }']select(441,164)!mul(957{{how()$]/%mul(626,541)~:do();mul(796,50)%^~mul(992,764)what(460,353))[what()how()>@;where()mul(944,226)(/?who()*@what()mul(986,707)!who() #++:mul(712,362)@)what()what(377,883)who(){who()~why()mul(570,45)-*why()what()!~<#mul(873,695)}{~ :~;'$+mul(526,676)?),/mul(106,52); ;%*how()from(165,744)what()from()do():?+ >;mul(151,167)mul~-!mul(873,682)%;;!~?mul(13,903)[$* }mul(188,728)#})(<mul(206,992)mul(112,681)who();from()why()mul(998,665)why(52,375)!mul(146,638){mul(783,242from(907,600))[why()@what()select()^ %*don't()mul(949]what(),,what()-<(%mul(519,474)who()~-)mul(640,389)%where()/~@ <&]why()mul(113,424)when()[mul(234,782;,(;-where()why()how()mul(838,733)why()mul(15,790)mul(239,592)^,select()!^*]mul(537,113) - )}>;why()#{ {mul(469,192)?#,'what()mul%!{>+&what()mul(392,708)'mul(156,225)?]+mul(436^who()why();@#!why()how()when()&mul(506,544)why()when()mul(211,662)what()/-)](from()(]?mul(530,199))}why()> mul(833,595)+?$ (mul(98,477)*/};{why()what(966,350)#'mul(44,78)why()!%]% ~}/mul(376,267)/why()'^&&;do()^{/+~how()mul(174,478);what() %{[+!mul}/<)where()@mul(825,710)[ ]mul(60,655)+mul(538,818)-*mul(917,316)!from()&[)mul ?why()'^mul(32,228)~@-~^^mul(803,610)$((;~when()how()mul(622,388)^from()why()mul(291,294)select()+ mul(61,978)mul(986,197)why(405,935)where() where()#{%mul(383,280)%#]*@mul(266select()<>mul(459,359)*&$who()-&+&from()mul(122,271)#mul(85,195)^>select()where()?&mul(953,467 @,^@}@@[mul(297,412)^mul(845,508)where()who()how()}[?when()~%why()mul(320,30)-mul(348,650)*~;&mul(694,123)#+why()mul(516,744)mul(873,547)-select()]mul(194,499)how()+what()>mul(542,764)who()%when()~mul(150,709)how()}where()@!{)from(773,172)mul(568,873)!+;mul(730,244)from()^ where()*[where()select()mul(554,163)(when()+$~where()*}@+don't()from()~select()who(421,469)&:)mul(279,687)who()%#^when() -select()}mul(8,389):)}why()do()when(984,806);!@:(&mul(59,374)&who():}:$ :mul(919,44)#)(!']why()select()mul(820,819){why(){*^#mul(439,942)>select()]/;select()/'mul(175,719)select()mul(890,515)+;)mul(611select()-mul(881,340)>~?mul(984,156)mul(330,398)/;why()^ :who()mul(677,667)what()&*what()what()mul(686,640)):-when(),(+mul(40,933)what(423,54)/&#+when()mul(914,37);how()!*~!when()/mul(456,51)when()when()!+]!what()#what()don't()what(225,210),from()~^[@>mul(370,841)what()from()@~-/mul(67,351)(&}mul(59,921)$--^*}mul(566,572)!how()+*mul(365,948)/$!@&mul(782,899)}/!}~how()mul(73,229);~what()when()*#&where(751,442)who()mul(487,586)when()mul(258,912)@~{what()#]>when()when()mul(124,236)<%(-from()mul(65,560)*when(73,56)mul(675,80)}:^don't()how()mul(32,556){select()%!where(500,153)@<&mul(445,212)from()&'who()who(910,924)}@~}what()mul#)why()(!)who(339,797)what()mul(151,749)how()%#>:select(761,257)]when()]mul(866,572)%@'what()~?where()&mul(544,274)-select())mul(159,997)mul(844,233)from(): +who()%what()select()%]do()%where()mul(226,633)/?]where()(when()?don't()$!~+![@mul(645,560)/who()from(715,999)?-mul(13,127)>#%'{mul(439,817)where(331,588)?+[mul(224,797)mul(464,432)mul(35,360)>when()%who()who()select()$#mul(356,503)#[mul(813,62){-<-where()##mul(241,813):[)mul(338,295)what(384,596)%;^who()mul(462,430)mul(182,412)+*/mul(616,721):;mul(10&&where()[^when(),@;{mul(954,803){])what()mul(23,586)mul(897,119)}]^&<{*mul(986,79)#??,,mul(613,13){from()when()mul(866,149)mul(772,870)(<:&who()*what()mul(515,452)what()why()$who()where()]mul(878,410)*mul(594,420)/}[where()>[+)mul(924,312)(#+select()$mul(310,382)$(mul(853,276)#$select()&]-:'when()mul(574,694):*mul(548@'why()[[mul(705,329)@why()#what();((where()mul(754,401)$:#*:#+%mul(958,635)@[)/select()@;why()(mul(648,81)!)from() +mul(792,904)'@@^}mul(987,166)>+?mul(282,196),[how()%!{?@+mul(486,579)%+who()'~why()mul(976,618)when()mul(763,421)mul(421,343)^!,/,-][@^mul(895,484)*how()(why()/from()mul(527,80)]-*:{%-%mul(568,730)-mul(923,402)(!how()%)?+what()^where()mul(744,416) why()mul(824,613)! who(339,629),mul(474,127)>^#select()select()>{from(955,780)mul(961,300)why();:how()*where(674,394)why()''mul(220,654)->)why())^-mul(352,662)?where()/from()mul(755,837)@::@why()mul(173,195){,#mul(369,738)^$?;how()do()@what()where()?@)select()$>$mul(610,930)mul(692,271)}(^@when()[@mul(825,772)),[$;what(364,840)how()&@mul(514,944)*(#^mul(600,592);why()&mul(360,432)>>$!when())from()why()mul(771,433)/who() $what()^^mul(759,696)mul(794,141)?*what();what()how()/mul(575,123)how()([!;],&mul(690,157){$~why()]why()don't()what()#@))~'[<)!from()what(){[]mul(901,549)'what()}from()why()when()how()<*mul(416,637)mul(518,747)!?when()why()?>don't()]]??]<;*^mul(946,35)what()[where()what()/[**/mul(60,183)/{how()~>>why()*mul(510,950)/%who()%{](,!'mul(871,310))]!mul(824,101)who(666,710))what()why()what()$how()%who()mul(96,822)how()who()mul(689,448)mul(469,609)!@^mul(977,145)& mul(836,253)?+where(42,895)?who()%mul(390,417)mul(641,894)what(312,406)(?when()how()?$mul(968,385)when()^^;mul(779,772)>/->(,where()mul(921,632):(select()(where(228,976)why():']mul(381,906) diff --git a/src/AdventOfCode/Year2024/Day03.hs b/src/AdventOfCode/Year2024/Day03.hs index 3540b7a..d44250a 100644 --- a/src/AdventOfCode/Year2024/Day03.hs +++ b/src/AdventOfCode/Year2024/Day03.hs @@ -1,60 +1,69 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2024.Day03 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) -import Control.Applicative ((<|>)) -import Control.Monad (void) -import Data.Either (rights) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle (Puzzle, runPuzzle) +import AdventOfCode.TH (evalPuzzle) +import Control.Lens (makeLenses, (<.=)) import Data.List.Extra (sumOn') +import Relude import Text.Parser.LookAhead (lookAhead) -import Text.Trifecta - ( anyChar, - comma, - decimal, - eof, - manyTill, - parens, - some, - string, - try, - ) +import Text.Trifecta (anyChar, comma, decimal, eof, manyTill, parens, string, try) + +data PuzzleState + = PuzzleState + { _answerOne :: !Integer, + _answerTwo :: !Integer + } + deriving (Eq, Generic, Show) + +makeLenses ''PuzzleState + +emptyPuzzleState :: PuzzleState +emptyPuzzleState = PuzzleState 0 0 main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -partOne :: [Either Bool (Integer, Integer)] -> Integer -partOne = sumOn' (uncurry (*)) . rights +partOne :: Puzzle [Either Bool (Integer, Integer)] PuzzleState Integer +partOne = do + memory <- asks rights + answerOne <.= partOne' memory -partTwo :: [Either Bool (Integer, Integer)] -> Integer -partTwo = go - where - go [] = 0 - go (Left False : muls) = go (dropWhile (/= Left True) muls) - go muls = - let (xs, ys) = span (/= Left False) muls - in partOne xs + go ys +partOne' :: [(Integer, Integer)] -> Integer +partOne' = sumOn' (uncurry (*)) + +partTwo :: Puzzle [Either Bool (Integer, Integer)] PuzzleState Integer +partTwo = do + memory <- ask + answerTwo <.= partTwo' memory + +partTwo' :: [Either Bool (Integer, Integer)] -> Integer +partTwo' = \case + [] -> 0 + (Left False : muls) -> partTwo' (dropWhile (/= Left True) muls) + muls -> + uncurry (+) + $ bimap (partOne' . rights) partTwo' + $ span (/= Left False) (dropWhile (== Left False) muls) getInput :: IO [Either Bool (Integer, Integer)] -getInput = parseInput (some go) $(inputFilePath) +getInput = parseInputAoC 2024 3 (some (skipNoise *> instruction)) where - go = - skipNoise - *> ( (Left <$> toggle) - <|> (Right <$> multiplication) - ) + instruction = (Left <$> toggle) <|> (Right <$> multiplication) skipNoise = do - void . manyTill anyChar $ - lookAhead - ( void multiplication - <|> void toggle + void + . manyTill anyChar + $ lookAhead + ( void (try multiplication) + <|> void (try toggle) <|> eof ) toggle = - try $ - (True <$ string "do()") - <|> (False <$ string "don't()") + (True <$ string "do()") + <|> (False <$ string "don't()") multiplication = - try $ - string "mul" - *> parens ((,) <$> (decimal <* comma) <*> decimal) + string "mul" + *> parens ((,) <$> (decimal <* comma) <*> decimal) From 76d2d2847d37169f3f8658aedc12ab2aeca7e754 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Mon, 10 Nov 2025 22:47:31 -0600 Subject: [PATCH 04/91] refactor(2024.04-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2024/day04.txt | 140 ----------------------------- src/AdventOfCode/Year2024/Day04.hs | 75 ++++++++++------ 3 files changed, 48 insertions(+), 169 deletions(-) delete mode 100644 input/2024/day04.txt diff --git a/VERSION b/VERSION index cc0cae0..e7ca9d9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.27 \ No newline at end of file +2024.7.2.28 \ No newline at end of file diff --git a/input/2024/day04.txt b/input/2024/day04.txt deleted file mode 100644 index d30973c..0000000 --- a/input/2024/day04.txt +++ /dev/null @@ -1,140 +0,0 @@ -SMXMMAXXXXMMMMSMMASASMSXMMAMSSMXSMMXMASAMXXMAMXAXXAMXAXASMSMSMMMSXXSXSXXAAMXXSXMASMAASXMXMSSMXXXXMMSSSMXSXXMASXMMSMSXMXSSMXSMMMSXMSAMSASXSAM -MASMMSXMMMMAMSMAXSAMXAXAXXAXSASAMASMMASAMAXMAXMMSXASMMMMSAAXAAAAXSMAAAAMAMXSSMMXMASMSAMXSAAAMSMMMSMAAAMMMXMXAXASAASXASAXMASMAAXXAXMAMXXSSMAM -MAMAAMXMAXSASAMMMXAMMMMAMMSMSAMXSAMXMASAMMSXSASAMXSMAAAMMXMMSMMXMAMSSMMAAMAMAXAAXMAMXAMSAMMSMAXAAAMMSMMAAXSMMSXMSMMSAMXSXMXXMMSSMMMSMMXMASXM -MAMMMXAMXMXXSASXAXAMSXMXSAAXMMMXMXSXMXSMMXMAXAMXXXXXSSSSXAMXXAMMAMXAXAXSAMMSMMMSMMSMSAMAAXMAMXSMSXXAXMSSSSMAXSAMXMMMSXAXAXAMMXMASXAMAMSXAMMX -SSSXXSMMSMMXSAAMSSSMMXSAMMSMMMMMMASASAMASMMMMXSSSSMXMAMMMXSASAMXXXSXMMMMASXAXASAMMAAMXMSMMSMXMXXAMXXSMAMMXMAMMXAAXMAMMSSMMXXAASAMMXSAMAMSSMM -AAXMASMAAASAMXMAMMAAXXMASAXXMAAAXMSAMXSAMAMXSAAAAXAAMAMAAXAMMMMSMAXMXSASAMMMMMAASMMSMAMAXXXMASAMXSAAMXAXMASXMSASMSMMMMMAXAAXSXMASAMSAMMXMAMA -MXMMAMASMMMXSXSASXSMMMMXMMSASMSMSAMXMXMMSSMAXMMMMMSXSASMSSMXXAAAMAMXMAMMAMXXAXSXMASAXSSSSMMSASAMASMMMSMSXAXXAAXXAAMAAXSMMMSMMAMMXXAMAMXMSMMS -MMXMAXXMMMAXMXMASXAXAAMMMMSAMXAMXMMAMXMMAAMXSXMXAAAASASAAXXSSMSSSMSSMSMSXMXXSXMXAXSMMMMXMMAMXMAMAMXAMAAMMMMMSMMMSMXMSMMXMXMAMMMSMMSSXMAAAXAM -MAASMXSAXSSMSAXXMMSSSMMAAAMXMMXXAXSXSASMSSMAMASMMXSAMXMMMXSAAMMXMAMAAAAXAASMMASXSMXXAAXMMMSSMSXMSSSXSMSMASAAAXMAMSMAMAMMXASXMSAMAAAMASXSMMSS -ASAMMAMXMXAAXMSAAXAAAASMMXSAXAMXMXAAAASMXMMASAMAAAMASXXMXMASMMMAMAMMSMSSMMXASAMAMAMSSMSAXMASAAXMXAXASXMXAXASMSMASMMMSAMXSASAMMASMMSSMMAAXAAS -MMAMMMSMSSMMAAMASMMXMASAAASASMAASAMSMXMXAXSAMASMMXSAMAMXAMXXMAMXSAMAXMAMAASAMASAMAMXAASMMMAXXMXMASMXMASMXSAMAXXXXAAAMAMAMXMAMAAMXMAMXMXMMMMS -XMAMSXMAAAXSXSMAMMXXXXXMMXMMMMSAXAXAXMMMMXMASAMAAXMXSAAMSSMXSSXMMMSSSMSXXMMXSMMXSXSMMMMAAMMMMSAMAXXXXMMAAAXMXMMSXSMMXAMXSSMSMMXXXMAMAMXMAMSS -SMSMXAXMMXMSMAMASXSXSAMXMAMMSXMASMMMAAAAXAMAMXSMMSMXSXSAAAMXMMXSAAAXAAAXMMSASAMXXMXMXSXSMSXAASAMSSMSAXMMMSXXXASAAXAMSSMMMMAAXMASMMSMSMSXXSAX -MAAMXSMMSXAXSXMMSXAAXMMASMSAXAMAMAAXMXSSSSSMSMAMXMMMMMMMSXMXAAAMMMSSMMMSMAAAMMAMSMAMAXAXMMMMXMAMXAAMAMXMXMXXMSMMSMAMSAAAAMMSMMMXAAXAMASAMMMM -MSMSAAAAAMSMMMXXXMMMMMSXSAAMSSMASXMMSMAMAMXMAAAMXMAXAASXMASXMMXSAMXMAAAAMAMMMXMMAMAMSSMSAMMXMSMMSMMMSSXXAAXMXAMMXXXMSXMMXMXMAXSMMMMAMAMAMAAX -XAAMXSMMMSXMMASXSMAXAAAMMMXXAXMAXAAAXMAMAMASXSASAMSSSXSASXMASAMMASASXMSAMXSXXMASASAMXMASAMXAMAXAAAMAXAASMSXMSMSAMXMMMMSMMMSMMMXAASMSMSSSSSSS -SMSMMMMSMXMAMXSAASMSMSMXAXMMASMXSSMSSSMSASMSAMAMAAMAMXSAMASXMAMSAMASXMAXMAMMAMXXASASAXXMXMSMSMSSSSMMMMMXAAMXAXMXMSAMXAAAXASAAMSSMSAXAXAAMAMM -MXMAAMAMAASAMAMXMMXAMXXSMSMMAMMAMXAAAAXSASXSASXXMMMAMXMAMXMXSAMMMMXMAXXXMASMSMSSXSAMMMMSSMMXAAAAXAAXAXXMMMASMSSSXMSSXSXSMASMMMAMXMMMSMSMMAMM -XASMMSASMMSASXXAMXAMSSMXAAAAASMMSMMMSMMMAMMMAMXXMXSSMMSAMAXXMMMAAMXMASMMSMXMAAMSAXXXXMAAXAAXMMMSMSMSMSAXAMMXXAAMAMXSAAAXMXMMMXXMXMXAXXAXMXMM -SMXXXMXMAMXAMXXSSMMXSAMMSMSSXSAMXXAMAXAMAMXMMMSXXAAAAXMAMAMXASMSSMXAAXAAMAMSMSMSXMASMMMSSMMXSAAXXXAXAMMXMSXSMMSMMSAMXMMSXAAAMAXMASMMMMMMSMSM -SAMSMMSSSXSAMXXMAAXXMAMAXMAMASAMXSASAMMMMMMXMMXAMSSSXMSAMXXSAMMMMAMSAMMMMAMXAMAXMAMXXAMAXXAAXMSMMMMMSMSMXMAXXAAMAAAXAMXXXMSSSMAMAXASAAAAAMAX -MAMSAMAAXMMAMXMSAMXSSMMSSXMMMMXSASXMAMMSMSMAMSMSMAAAXASASAAMMSAAMSMAAXSASASMSMAMSSXMASMMASMSSXMAXXXAXAAMAMSMXSXSMSMMAASAXMAMAMMSMSASMSMSSSMX -SAMMAMMSMSMSMAXSASAMAMXXMAMXMASMMSMMSAAAAASASXAXMMMMXMXAMMMMAMXMSMXMSMSASAMAAMXMAMAAAXAMAMMXMASXMASMMMMSASAMXMMMXAXXXMSAMXASMMAAXXXXXXMAXMXX -MXMXMMMAAAXAMXMMXMMSAMXMSSMAXMXMAMXAMXSMSMSMSMMMMSMSSSSSMXXMAMSSMXMMXAMMMMXSXSMMMSXSSSXMAXMASAXMAMAAASXSXSASXXAXMASMAXXMXSXMAMMSSXMSMSMXMXMS -SMSAMASMSMSXXAMMAXXSXMAMXMASMXAMAXMASAXXXAMAXAXAXAASAAXMAXXMAMSAMXAAMSMXSMXMASAAMXAMAMXSAXSAXXXXMSSSMMXXASMMMSSMMAXXXMASMXASMMSAMAXMASAXSAMX -XASXSASAAXAMMSXMMSMMSXMSASXMXSMMMSMAAMMMMMMMMMMMSMSMMMMSAMXMXXSAMXSXXAXAAXSSMSSMXMSMMMMMMXMASMSMAAXMMSSMAMMAAMXAMASMMSSMASAMXMMAXXAMXMAMSAMS -MXMAMASXSMXSAXASAMAASXMSAXASAMMSAAMMSXAXASASAMAMAMAMASMSXMXMMMSAXAMMMSMMSXMAXMASMSMSXXXAXSMMXAAMMMSMAAXMAMMXSSSXMXSAAXXXXMXSXXSMMSMXAMMMSMMA -AAMAMAMAXXAMMSAMASMASAMMAMSMMAAMXMMSMXMSMSASXSAXMSASASAMXXAXAAMMMXSAAXAXMMSMMSAMXAMSXXMASXMMMSMXSAXMMSSSMSAMAAAASXMMSMMMXMAAMMSAMASMXSAAXAMX -SXSXSXMMMMSSXMASMMMXSAMMAMXAMMSSMMSSMSMAAMAMASASASASXMAMXSMSSSMMSASMSSSMAAXSXMXMSXSMAMSMMAXMAAXMASMXAXXMASMMSSXMXAXSMXAAAMAMSASAMAMMMSMSMMMA -MAMAXAMSSXXAXMAMXMSMSXMXMXSXMAMAMMASAAXAMAAMMMAXAMAMXMAMXSAAAAAAMXSAAAAMMMSMXSSMAMAMAMAASMMMSXXAXXXMMSMMMMXAAAMXXMMMASXSXSSXMMSXMAMAASXXAMXM -MSSMMXXAXMSMXSAMXMAASASASXSSSXSAMXMMSMMMXSSSSMSMXMSMMSSSMMMMMMMMSMMMMMMMAXAAXSASASAMXSMMAASAAAXSAMXXAAAMMXMMSXSAAMAMMMXXMAMAMXMMSSXMMSASMMAM -AAAMMXXSXMXXASMSAXMSMAXASAMASAMXMSXAMXASMMMAMAXAXXXAAAAXAXXXXMXMAXXMASXSSSMSMSAMXSASXXMASMMMXSXMASMMSMSMMXSXAMMMMMASMSAMXASAMASXAAXSAMXMXSAM -MSSMMMMMXSMMMSASXSSMMMMMMXMAMSMAMXMMSSMMAAMAMMMMSSSMMMSMSXMMSMASAXMMMXMAXAAAAMAMXSAMXXSAXMASAMMSAMMAMSMASMMMMXSAMMXMASASXMSXSSSMMMMMASMMXXMX -MXAAAAAAXMAMSMMMMXXAAXSXMXMASMSMSXXAAAMSSMXMSMXAAAAAMAXXMASAMSMMMXSAAAMMMMMSSMMMXMAXSAMXSSXSAMAMSAMXMASAMAAAXXMASAMXMSASMASAXAMXSAAMAXAMXMSA -ASMMSSXMMMAMMAMXAMSMMSMAMAMXMXAMXMXMMSMAMXAXAMMMSSSMMASAMAMAMSXXAAMMXXMXMMAXAXXSXSMXMAMAMAMSXMXSMMSMSMMMSSSMSXSAMXMXAMAMMAMAMAMAMMMMMSMSAAMX -MSAMXXXASMSSSSMSSMXAMAXSSMSAXSXMAMMSAMMASMMXAMMMAMAAMMMMMASMMMMMMMSSMSMAMSMSMMMMASMXMXMXSAAMASXMMMAAAXAMAAAAXMXMMAMXMMXMMSMMAMMXMAXXXAAMMSMM -XSAMAMSAMAAAAXAMMXMASAMXAAMXMAMMASAMMXSASAXXSMAXASXMMMSMXASXASXMSAAAAAMAMAAAXMXMAMMXMAXASXMSAMAMXSMSMMMMMXMAMXAASASMXMXSAXAMXMAMSMSSMMSMAAXX -XXXMAXSXMMMMMMSMMAAMMAMSMMMMAMASMMMSMAMSMXMAXSXSAMXAAMAMAMXMXMAAXMSXSXSASMSMSSXMASXASMSMXMXMAMXMASAMASXMSMXXAMMMSASAAXMMASMMAMAMAMXAAXMASMMM -XMSSSXSAXMAMXMXASXSXSAMMAMMAMXXAXAMSMAXAMAMMMAMMMMMSXSASMMSXSMMMAMAAXMSAMXAMXXAMASMMAAXMASXMAASMMSASAMSAAXMSSSMAMMMXXSAMXMASMSSSSMSSMMXAASAM -AXMAMASAMMASAMSMMSXMSAMXAMXSXSMXMMSSSMSMXAXAMXMMASXAAMASMAAASXMAAMMMSAMAMSMSAMXMASASMXMSAMAAAXXAXSXMASXSMSAAAAAXXAXXMAMSASXSMAMAMXMAMXMMSMSX -MSMMMMMMMSASXXAASAMAXAASMMMXAAMASMAXXXAXSSSMSASAAXMMSMXMMMMXMASXXAXAMAMXMAAMAAXMXSAMXMXMASMXSSSMMXXXMMMMMSMMSMMSMSMSAMASASXXMAMAMMMAMSXXMAMX -AAMXAXAXMAMMXSSMMASMMSMAMAMMAMMAMMSMSAMXMMAASASMAMMAXMASAMXXSXMMMMMMMASMMMSMXSMSMMMMXMAMMMXAXMASASMMSAAMASAXXAAXAAASMSAMXMAMSMSASXXAMXMMMAMM -SMXSASMSMSAMXAMXMAMXAMXMMAXAMXMSSMAAXMXMSMAMMXMXXAMXMXMAMAMXMAXSAXMAXXSAAAMAMAAAMAMMMMMSMAMMMSXMXXAASASMASXMXMMMSMXMXMASMXSAAXAAAMSMMAMXMAMA -MXMAMMMAAXASXSSXSAMMSMAXSSSSSSXAAMMMMMAMAXAXSMSASXMSXMMMASXMSAASXMMSSXMXMXXAMMSMSASMSAAXMAMXAMASMSMMMAAMMMASXXXAXXXMSMXMXAMMMMMMMAAXXASMSSSS -MASXSAMXSSXMMXAXXAXAASXXMMAAAMMSMMXAASASMSMSMAMASAASAMAMAXAMXMMMXSAAXAXSMSSXMXMXSASASMMMSSSXMSAMXAAMMXMSXSAMXMMMMMXMAXMXMXSAASXSMSMSSMSAXMAX -SAMAMXSAXMASXMSMSSMXMAMXSMMMMMAAASMSXSXXXAXAMXMXSXMMAMXMMSMMXXXAAMMMSSMSAXAAXXMAMAMMMMSMAXAMMMASXSMXMSMAAMMMAXAAAAMXMSAMXSSXXXAXAAXXAAXXXMMM -MASMMMMXSMMSXSAAXAAMXSSXMASXSXMMSMAAXMASMMSXSXSXSXMMMMAAMAXXXAMMMMMXAMAMMMSMMAMSXSAXXXAASXMMSSXMAXXMXSMMSMASASMSMXSAAAXASMMXMMSMSMSSMMMMMSXA -XMAMXXSMXAAMMSXSMMMMMMAXXAMAXAMSAMXMSMAMAAAASAMMSXSAMSSMSASMMSAAMMSMMMAMXAAXAMXXAMXMASMSMAAAXXMMMSMMAXMAAXXMAMAAAASMMSMSMSAASMXAMXMMMSAAAMXS -XMASMMXAMMMSASAXXXMSAMXMASMMSSMAMXAXXXXXMMMMMAMASASAMAAXMAAAXASXSAMASXSSMSSSXMAMXMAXXAXAXMMMSXSAAAAMSSSSSMSMMMSMMMXMAXXAXMSMSAMMMAMAAXXXMMMM -XMAMASMSXMAMMMAMXMASMSXSXXAXAXXXMXMSSMMMXAASXSMMSASXMMSSMSMSMMMMMASMSAXXAAXMMMASAAASXSSSSSSXSASASMSMAXMAXAMXMAXAXSAMXSAMXMAMMMMASASMXXSSXSAS -MMASXMAXAMMSAMAMASXMASAXAMSMSSSSSSMAXAAASMMSAMXXMAMAXSAXAXXXAAAXSXMAMAMSASASXSXSAMXSAAAXAAMAMMMAXAAMXSMAMXMAMXMAMXASAAAXMXASXXSMSASMSAAMMMAS -XSAXAMMSXMXMASASASAXSMMMMXAMXAAMAAMASMMMXAAMAMXMMXMXSMMSAMASXSSXMAMXSAMXXMASASXMAMMMMMMMMMMAMAMXMMMSAXMASMSMSSSMMSSMMMMMMMASAMXXMASAAMXSXSAS -MMXXAMXSAMMSAMXMASMMMAASMMSSMMMMSMMASASMSMMMSMSMSSSXSAAMASXXMXXASMMAXXSXXMSMMMASMMMAAAXAMSXMXSSMMSAMMSMXXAAAXAAAMXMASXMASMSMMAAXMSMMMXXAXMAM -AAMSMMAXAXAAMMMMMMMMSSMSAAMXMMMXAMMXSAMAAXXXAAXAAAXASMMSAMXXSASMMMMMSMMMSSXASMAMAASXSSMMMASMAXAAAMASASXSMSMSMSSMMAMAMXMAMXXAMSMMMMAASMAMXMAM -MXMAXMXSMMSXMAAMAAXXMASMMSMAAASMMSMAMAMSMSSSMMMMMSMMMSMMAXSAMASAAXAAAAAAXXSMMMASMMMMMMAAAAAMMSSMMSAMAMAAAXAAAXAAMAMAMXMMXSSMMMMAASMMSXAXASAS -AMSSSMASAAAASXMMMSMSXMASAAXMMXMAAAMASAMXXAMASXSAAXXSASMMAMXMMAMMMMMSSSMSSMMMAMXMASXXAMXMMXSMXAAXAMAMAMMMXMSMSSMMSSSSSMSAXXAXMASXMMAMMMXMXSAS -XAXAXMASMMSXMAMSXXASAMXMSSXSSMMMMMSASMSMSMSAMXXMXXAMAMMSAMXSMMSSMXMAAXAMAAAXXXSXAXXMSSSMSMXXMMSMSMSSSSSSXAXAAAAMXAAMSAMXXSAMXAXMAMSASXSXMMMM -ASMSMMASXMMXMAAAAMMMXMMMMMMMMAASXMMAXAAAMXMAMSSMMSMMSMMASXAXXAAMAAMMSMSMSSMSSXSMSMXXAAAAXXSMSMMAMSAAAAAXMASMSSMMMMSMMMMXMAMAMMMMMXMAAAXMASAS -MAAXXXAXAXSXSMSMMMSMASAAAAAMMSMMAXMSSSMSMSSSXAAMXAAAXMSAMMSSMMSSSXSAMXXAMXAXMAMAMMMMMSMMMMAAAAMAMMMMMMMMMMAMAAAXXAXAMXMMMAMSMXASXSMMMXMASAMS -XMSMSMMXSMSAXAMXAAASAXXSSSXSAMASMMXAXAAXMAAMMSMMXSMMSAMASAAAXAXAAXMASMSMSMSAMXMAMMAAAAMAAAMSMSMSMMAXAAXMXSMXSSMMMXMXMSAASASXMSASAAXAXSAMAMXX -MXXASASAMXMAMSMSMSMMSSMMXMAMMMXMXMMMSMMMMMSMAMXMAMAMMXSSMMSSMMMMMXSXMASAXXMAMXMASXSMSASMSSMAMMAXAXMXSSSMAMXAXAMMSMSMMXMMMMMAXMMMMMMSXMASMXMA -MXXMMAMXXMMSXAAXAXXAAMXSAMXSSSXMXSAMAXAAXXXMMSAMASXXXXSXAAAAAXSXXXMAAMMAMXXMMSSMSMXXMXSMAXXAMSASMMSMMAMMAMMMMXMASAAASMMXAAMXMAXSAMAXXMAMXAAA -MSMSMSXMASMMSMSMMMMMMSASASAAMXASASASASMSSMMMASAMMMMMMMMSMMSSSMMXASMAMSSMSSMAMAAXSASASASMAMXMMSXXXAAAMSMSASXSASMAMXXMMAMMSMSMSSMMAMSSSMXXMMMM -XAAAAXAXAAXAMXAAXXXAAMASXMMSMSAMASAMMMXXMAAMASAMSSMAAAXAMAAXMAXXMASAXXAAAMSAMMSMMXMAMXSMASXSASAMMSMMXAAMASAXASMASXSMSSMAXASAAXXSAMXAMAASXMSS -XMMMXXXMSSMMSSSSMMMXXMAMAXXAMXAXAMMMMSMSSSMMXXAXAAXXMSMMMMASMXMSXMSMXSMMMXSMSXMXMAMAMXMMAAAMASMAAAMASMSMAMMMMMMXSAAAAXMXSAMMMMMMSXXMXMASAAAM -XSSSMSAAAMXAAMAXAXASMMSSMSSSMSSMXXXAXAAMAAASMSSMSSMMXXAMAXAMXXSXAMXXAMXSXXMASMSMSXXAXXSAMMMMXMXMAXXXMAXAMXSAAASAMMMMMMMXMXMAMXMAXMMXAXASMMMS -AXAAASMMMSXSMSAMXMMSAAXAXAAAMAXXXSSMSMSMMMMXAAXAMXXSASAMSMSXSXMXAMAMXSXXMMMXMAAXMAMSXMMXSMMXXXMSMSXMXSXMXAMXXMMASMXXSXSASASASMMAMAMSMSASXSSX -XMMMMMXXXAAXXMASXSXMXMMSMMSMMMMAMASAAMAAXAXMMMMMMAMMAMMMMAMXSASXSMXMAXMAXAXXMSMMMSMXASMSAMXAMAMAAAXMMXAMMMSMSSSMMMSMMASASASAMAMXMAMXAAAMAXXS -SAAAXAAMMMMMMSAMAMMSSMMXAXXMASASMAMXMSSSMSXAXAXAMAXMAMMAMAMAMAMAMASXMSSMMSMMMAMXMMAMAMMXXXAAAAXMSMMMAMAMAMAMXAAXXMAMMAMMMAMASXMSSSSMMMXMXMXM -ASXSSMMMAAAAAMMMSMSAXAASXMXMASAXMSSMXXMAAAASXMXSSSSSSXMASAMAMAMXMAMAXAAAXMAMSMSAAMAMSMMSMMSMSMSMAXAMSSSMXSASMMMMMSSMMASAMXSAMAAXAAXMXMMXMASX -MMXMAAASMSSMSXXAAXMASMMSXXXXXMMMMAAAXSXXMMAMAAAXMMAAMMSASXSSSMMXMASXMXMMMMSMMASXSMMSAAMAAAAAAAAMMMSMAAAXAXASMXAXXAAXSASXSASXSMMMMMMXAXMAXXXM -XMASMMMSAAAMXMMMXMXMXAAMMSSMMSMMMSSMMSXMXXXSMMMSAMMMMAMAMAMAMASMSASMMMASXAAAMAMSMAMAXXMMMXSSMSMAXAAMMMMMMSMXMSXSMMSMMASAMAXAXXAAMAMSMSSSXMAA -XXAMAAAXMXMMXAAAAMASMXXSAAAAAMAMAXAXAXAMMSMSXSXSAMAAMXSXSASMSAMAMASAASMXMXMXMMMXXAMMMMMXSAMAXXMMMSXMAAMAAAMAXSXMAAAAMXMAMMMSMSSSMAMAMXAAASMS -SMSSSMMSSSXMSSMSMSASAAMMMSSMMMAMMXAMSSXMAAMSAMXXXMSXXMAASASXMXSSMMMMMAMAMASMSMSSSMSXSAMAMAXSAMXXXAAXSSSSSSSMMSXXXMSXMXMASXAMAXMAXXXAMXMSMMAM -MXMAAASAXMAMAAMAAMAMMAXAMXAAASXSSMMMMXAMSMSMMMSMXMXSMAMMMMMMMMMAMSAXXMMAMMAAAAAAAAAAASMSSSMMAMSMMMSMAAXMAMAMAMMMMXXXSSMSSMXSSSSSMMSSSXMAMMMM -MSMSMMMMSSSMSSMMSMXMAMMASXXMXSMAXAAASXMMXXXXMAMSXSAMSXMAMXAASXSSMMXSMXSSSSMSMMMSMMMSMAMAAXAAAXAAXAAMMMMMSSSMMXAXAAMXMAMAMMASAMAMAXAXMASASAMX -XAAAXXAXMXAMXAMAAXXMAMSMMMASASMSMSSMSAMAXMXMASXAMMAMAMMSASMXSAMASMAXAMXAAAXXMXXAMAAMXAMMSMXXMSXXMMSMMASXAAXAXSSMSASXSAMAAAMMMMASAMXMXMXMMMMM -SMSMSSSSMXMSSXMSMSSMAXAAASMMAMAAMXMXXAMSSSXXAXMMMSMMXSAMXAXAMMMAAMAXMAMMMMSMSMSMSMSSSSSXXMAAXMMSSMXAMASMSMMXMXXAMAMMMXXSSXMAMMMXMAMSXSAMSMSM -AMAAMAAXASXAAAXAAMMSMSSXMXAMXMSMXAXXSXMXAMMMXXAXAXAAXMASMSMMSXMSSMMMSAMXAAAAAXSMMMAAAAAXAMXSXAAAAASAMAMAAXMAXAMMMAASXAMMAMSASAAMASMAAMMMAAAS -MSMSMMMMMMMMSSMXSMASXAXSSMMSAAMASXSMASAMAMMAMMSMSSSMXSAMAXAXAAMAMAAAMAMSMSSXSAMXSAMMMMMSASAAMMMSMMMMMMSSMMXAMMSSMSXMMXSMAMSASMSMMMMMSMSSMSMS -XAMXMSXMXAXXAAMAMMAMMXSAXAAXMMMAXAAAAMXSAMMMSAXAAAAMMMASMSXMSMMASMMMSMMXAXXAXASASAXMXMXMAMMXAXAAMAAAXAAAXSMMSAAMMXAXSAAMMMMMMMXXAXXAAAXMAAAX -AMXXXAASXMSSMMMXSMMSAMXMSMMSSXMXMSMMXSXSASAAMMMMMSMMSXAXAMXMAXSAMXXXAAXMSMMSMMMXSAMXASAMXXAASMSSSSSSMMSMMASAMXMSASMMMXSXSMSASMMSSMASMMMMAMSM -MSMSMSMMSAAXXXMMSAMXMAAXSXAAXXSSMAMSMSXSAMXSMXMAMAAAMMMSMXMMAXMASMXSSSMAMMAAAXAXMMMSMSMSXMAXXAMAAMAMAMMMSAMMXMXMAXSAMXXAMXSASMAAAXAMXSAMXMXM -XXAAAAXAMMSSMASAMAMMSMSXSMMSMMAXXASAAMAMXMSAMAMAMSXMSAMAXSMMSSSMAMXAAXMXMMMSSMSSMAXXMSXMAASAMXMXXMAMXSSXMAXXAMAMMMSXSAMAMXMXMMXSMMSAMXSSXSAS -MSSMSMMMXMXAMMMSMXMXSAMASXMAMMASMMXMXMAMAXAMSAXAXXAMSASXMXAAAXXMAMMXMMXSAMAMXAAAXMSAXMAXMAXAMMMASXXSAXMAXXMXASASAAXXMXSAMMMAMAXXXXMAXSAMASAS -XAAXMXMAAXSSMMAMXAMAMAMAMXXAXMAMAASXSSSSSSMMSMSMASAMSAMXMMMMSMSMSSMAXAMSAMSXMXSAMXMMMSMMMSXSMAMAMSAMAMSSMMSXASXXMXSMAMXAMAXASMMSMXSSMMAMAMXM -MSXMXAMSMXAMXMASXXMAXAMSSSMSAMXSMMMAAXAAXAAAXMAXMMMMMAMXMASAMAASMAXAMXMMXMXAMMMXMASMMMAXXXAXSMMMSMXMXMAMAAXMXMMXSSMAASXSSMSAMMAAMAMXXSXMSSSS -MMXMSXMAXMAMXMASMMMMSASAAXAXMAMMXAMMMMSMSSMMSSMSSXSASAMXXAMASXMMSAMXAAAXMASXMXMSXAAAAMAMMMMMAMSMAMXXXMXSMMMXMAXAMAXXASAXAAMXMAXAMXMMMSAMMAMX -XAAXXMASXSMMXMASAAAAMMMMSMMMMSAASXSASAAXAAMXXAXAAXSXSASXMAXMMAXXMSSMSXSASASAXMASMSXSMMAMMAMSAMXSASMMXSXSAAASMMMXSAMMMMMMSMXXMMSXMSAMASAMMAMA -MSMSASAMXMAMXMASMMSMSXMXXAXSAXMXMASAMMXSSXMASXMMSMMMXMMXAMXMSAMXAAXMMXMXMAXAMMMMAMMMMSMSXXMSXMXSXSAXMXASMMXMAMAXMMMSMAXAXXMXXXSAAAMMASXMSASX -XMXSXMXSAXAMXMASAMAMMASASMAMAXAAMXMAMMMAMAXMMMMXXXSAMSSSSSXMAMXMMMSMMASAMXMSXSAMMMAMXAXMASXMSAXXAMMSAMXMSMASMMSSMSAMSMMASMMMSASMMMXMAXMXSAMX -XMAMXMASMSXSAMXXMMXMMAMASMSMSMSASXSAMXAAXXMMAAMMMXMXSAAAXXXAXXAAAAAAXAMXMXXAASXMXMMSSMMMASAAAMMMXMXSMSXMASMXXAXSAMXXAXSXXAAMMMMAMMXSXXSAMAMM -SMSMXMAXXAAMASASASAMMSMMMMAMAAMASAMXMXMXMMMMAMXAAAAXMMSMSMMMSSSSXSSSMASXMSMMXMAMSSXAMSMMAMMMMXXAMSMSXSMSMSXXMSMMMMMSSMMMSMMSAAMSMSASXMMASXMA -SAAAAXXSMXSAAMAAAMMSAMAAAMAXMXMXMASASAXAMXAMSSSSSMSASAAAAAASMAMMMMAXXAMXMAAXXMASAAXMAAXMSMMASAMXSAASASAAXMMXSAAAMAAMXAMAXMASXSMXAMASXXXAMXXS -MXMXSXMMMMMMXMXMSMXMASXMSSMMMAXXSAMASXSAMSAMXAXMXAXMSSMMSMMSMMMMAMSMMMSSSSSXXXSXMMXXMMXMXASXSAMXSMSMAMMMMAMXSMSMSMSXSAMSSMASMMXMAMAMAAXSXMXM -SSMAXMMAAAXXAMMXAMAXAMAXAAXAASMMMASAMXMAXXAMMMMXMXMXMAMMMMMXAXAXXXAAXASAMXMMSMAMXXXSSXSASAMXSAMXXXAMAMSSSMMMMAXMXAXMMSXXAMXSXAASAMAMMMAMAMSX -SAMASASXSSSMXMASMSXSAMXMASMMMMAXSXMASXMAMSMMAAXSMMSSSMMASXMSSSMMSXMMMMXAAASAXXMAXMXMAAMMMAMAXAMAMSMXXSAXMAAAMSMSMMMXAMXXAXAMXSXSASXSMXMXAMAM -SAMASMMMXMAAAMMSAAMMAMXXXXAXASXMAMSAMMSMAAXSXSAAXASASXMMSAAAAXMASAMXAXXSMMMSSMXSXSAMMMMASMMXSSMSMAMSMMMSSSMSSXAXAMAMAMSSSMASMMAMMXMXMXMSMMAM -MMMMMMAXAMXSSSMMMMXSAMMSMXMSASAMXAMASAAMSMXXAMXMMXSAXMMXSMMMSMMMSAMASMMXAXAMXAXMASMSSXMMMAXXAXAXSMMAAAXAMAAMXMSMXXXSAMXAXSXMAMAMXAMSAMMAMMSS -XSASMSSSMSAXAAXMAAMSAAAAASXSXXMASASMMXXXAXSMXMAXXXMMMXMAMXXXXAXXMAMXAAASXMMSSSMMAMMMAASXSMMSMMMMXMSSXMMSAMXMAMAAMSMMMSMAMXMSMSMMSASMAMMASAAX -ASASAAXAXMMSSMMSMSMSSMMSSXMMASMXSASMAXXSASXMASASMMXSAMXSMMMMMMXSMMSMMMXMAAAAMASMAMAXSMMXAAAMXSAAAMAMMAAMMXMAMSMSMAAAXAMXMAAMXMXAMMXXMMSAMMSM -AMAMMMSMMXAAAAXXAMXMASMXMMAMAMAAMAMMXMXMXMXSAMSMXAMSAMAAXAAMASASAMXAXXMASMSXSAMSMMMXAXXXMMMMASXSXSASMMMSSSSMXSAMMSSMMXMASAMSAMMXSMMMMMMMSMMA -MMMMMAMXAMMSSMMSMSASAMXMASMMSSMSMXMAMSAMXMAMXXAMXXASMMSMSXMMAXASMMSAMMMAAXXAMAMXXASMSMSMMSAMXMAMXMAMXAAMMAAXAMAMXMXMAASMXMAMAXMXAMAAXAAASMMS -XASASXSXSSXAMMMSASAMAMAMAMXMXMXXMAMXXSXXXMASMSASMMMXMAMMXAMMSSMMXAXAMAMXSAMXMSAMMXSAMAAAASASMSXSAMAMMXMXMSMMXMAMXMAMSXMASMMSSMMSASMMSMMMSAAX -SXSASASMAMMMMSAMXMMSSMAMMSAMAMXMSMSMMMSMXMASAAAAXXASMXSASAXAMAASMXXMSXSXXMAMXMAXSAMXMXSMMSXMAAMMASXSXMMMXAMAMSMSAMSMMAMAAAXAMAXSAMXXMXSASMMS -SAMAMAMAAXXSAMXSAMXAAXXMAXASMMAXXMAXAAMMAMSSXMMMSAASAASAMAMSSSMMMMSMAAMMSSMASMXMMASXMXMAMSMMMMSSMMAAXMAAXMMAXAASMXMASXMSSMMSMSMMMMSAMAMXMAAS -MAMAMMMSMSXMASAXASMMSSSMXMAMXSMXSMAXXXAMXSAMMXSASMAMMMSAMXMAAAMAAAASMSMAXAMMXAMXMXMASMMAMXAMAAXXAMAMMSASXXSSSMXMMSMMMAMXAXAAXMAXSAXMMSSSXMXM -SXMASAAAMXASMMMMMMMXAXMAXMXMMAMASMMMSAMXMMXMMMMASMSXXASMMSAMXMMXMSMXSAMSSMMXXMSSXMMAXASXMSSSMSSXMMSXAMAXXAXAXXMMAAAASAMSXMSMMSAMMSSXMAAMMSSM -MAMAMMXMASXMAAAASASMSSMSMSAAAMMAMAAASMSXXSMMSAMXMAXMMXSMASXXMXSSMXAMMMXAMXAAASAMASMSMMMMAAAAAXAASAMXMXSMMXMXMMXMSSSMSAMXAXXXMXXAAMMAMMMMXAAM -SAMXXSMMAMASMMSMSASXMAAXASXMXXMSSSMMMXMXMXAMXAXSMMASMMXMASMMSAMXAMSSXMASXMMSSMASAMXXAXAMSMXMMMAXMASAMAMAXXMXXMAMAMXMXMMSMMMMMMMMMSSXMASXMSSM -MMXSAMAMASMAMXMAMAMASMMMASMXMAXAAXAXMAXASXSMSMMXXSAMAXXMAXAXMAMMXMAAMSAMAMXXAMMMMSSSMMXXAAASXSXSXXSAMASAMAXSSMXMMSAMXSAMAAXAAAAAMXMMSAMXXAAA -MAAMAMMSASXXMAXASASMMXXMXMAASAMMSMMASMSMXAMMSXAXMMMSMMSMMSSMXSSMMMXSMMASASMSMMXXXAXAAASXMSMSASASMMSASAMMSMAMAMAXXSASAMASXMXSSSSMSAMMMASMSSXM -MMSSMMASASMMMXSAMAXXSXMASMSMSAMAMASAAMAXMXMASMXMXSXAXAAAASAMXAAMXSAMAXXXAMAAMSMMMMSXMMMAXMAMAMAMMAMMMMXMAXXSSMSSXSAMXSMSASAMMAAMSASASAMXXAMA -MAAAXSXMASAXAAMXMAMMMXSASAMAMAMASMSMMSAMXSMMMMXSXMXSSSMMMSASMXXMAMASMMSMSMSMXAAAXXAXSMSMMMAMXMAMMSSSMMASMSMAMAXMAMXMXMAMAMSMMSMMSXMASASAMXAM -MMSSMSAXAMXMMSSXMASMAAXXSAMSMASXSAXMXMAMAXMMSSMMAMSXAAXAAMXXXSSMMSAMASAAAAAMXSMMSSSXSAAMMMXAXSMMMMXAASASAXMAMSMMAMASAMXMAMAXXAMXMSMXMMXXAAXS -MAMMAMXMMSXSAMXMSASMMMSMMAMXSXSXMMMSASXMMMSAAAASAMSMSMSMSMMMMAAAAMASMSMSMSMSAXAAAAMAMSAXAAMMMASXSSSSMMAMMMSASAAXSSMSXSXSXSMXXAXAXASAAMMMSSSM -MAXMSMXMAXXMMMSAMXXXXAXAXAAXAMXMXAAXMSMMSAMMSXMAMMXAAXAAAXAAXMSMMSAMXSXXAMAMASMMMMMAMAMSXSAMMAAXAAAMAMXMMXSMSXMMAAASAMAAXAXXXMMAXMMSMMAMAMAM -SMSAAAXASXXMMMAMMSSSMXSMMSMMXSAMXMXSASAAMAMAXXMASXMSMSMSMSSSSXXAMXMMMSAMSMSMMMXMAMMAMAXMAMMXMMMMMMMSSMMASASXMASMSMMMAMAMMMMSMSASMSMXXSXMXSAM -AAMXMMSAXASASMSXAAMAXXAAAXASMMAMSAMMXMMMSAMXMASASAAXAXXXAMXAMMMAXMASAMMXMAAMAMXXAASXSSSMMMSSMMXMAMXXAASAMXSXMAAMASXXAMASAAXAAAAXAAASMSASMSMS -MSMSMAMMAMMASAAMMXSAMXSMMSXMASMMAMXMMMAMXMXXSAMMXMMMMMAXASMMMAXAMXAMXXMAXSMSASMMMMMAAXAMXAAASAMSSSMSSMMASAMAMSMSASXSASXSMSXMXMMMMMSMASAMAXAX -AMAAMXMXAXMXMMMXMXMASAXAAMASMMSMAMMMASMSAMAMMMMMSSMSMASAMXAAMMSSMMMXAMXSMMXSXSAAAAMMMMMAMMXSMMMAAAMAAMSMMMSXMAXMASAMXMASAMXAASASXXXMXMMMMSXM -SMXMXSSSXSAMXXMSMMSAMASMMSAMXAAMAXXSXMMSAMASASAAXAAAAAXSXMSMSMAAXSSMXSAXAMASAMMSSSSXXAXSMSMXXSMMSMMSSXAXMAMXXXXMAMXMAXXMAMMXMSAXMMSSXXMSASAM -MAMXMMAAAMAXXAAXAAMASAMMMMXSMSSMXMAXASXSXMXSXSMSSMMMMMSMMMMMAMMSMAAMXSXXAMXXAAAMAAAMMMSMAAASAXSAXMXAXMMSMASMMSMMMSAMMSSMMMSXMMMMAXAXXSAMAMSM -XAAXAMSMMMAMSMAMMMSAMMMXAAXXXAAASMSMXXAXXMXMAMXMAMSXASXAASASASMMAMMMASASMMSSMMXMMMMXAXXMSMSMAMMMMMMMSMXXXXXXAAMXASMSAAMAMXMASAMSSSMMAAMMMMMX -SXSXSXXXAXMXXXAXAMMMSMMSMSMMMXAXMAMAMMMMXMAMAMAMMAMAXAMSMXASASMXAMXMASMSAAXXXMMXXSMSMXSMXMXXSXMMASAXAAXMXMXMSMXMXSASMXXAMAMAMAMAAAXAXMXMXAXA -XSAMXMMSMSMMMSXSXMASAMAAAAAAAMMSMXMASAAXASASXSSSMSASMMAAMSMMXMASAMXMASXSMMMMAMMSMSAAAMSASXAXMAMSASXSASMMMSAMASAAAMAMAMSSXSSSXSMMSMMSXXAMMXSM -SAMXMAAAAAXAXXAMXSMSASXMSSMMXSAAXMSASMXXAMXSXAAXAMAMXXSMXAXSXMMASAAXAMXXXMASAAAAAMSMXMMAMMSXSAMMMSXMAMAXASAMAXMSMMMMXMAMMXAMAAMXAXXXAMAXMMAM -AXMAMMSMSMSMMSSMAXXSMMAAAXAAAMMSMMMXSASAMXMMMSMMAMSSXAMXSMAMASXAXSMSSSMMSSMSXSXMSMXXSMMAMAXMMMMSAMAMXMMMMSMMMSAAMAAXXMMSSMAMMMMSXSASMSSMAMAA -MMSXSAAXAXAMAAAMASMMASMMMSMMMSAMAXSAMAMAXSXAAAXMXMMAMXSAMXMMAMMMMMMMMAASASMMMMMMMMMMSAMMMMXAAMAMASMMAMASXMXAXAXMSSSSXSAAAMXMXXAXAMAXXAAXXMAX -SAXAMASMXMXMMSAMAMAAAAXMASMAMMMSAMMASMMMMASMSSMMASMXMAMMMXSMXSAAAXAXXMMMASXMASAAAAAXMAMXAAMSMMAMXMASMSASAMMXSAMXAXXAAAMSMMSMMASMXMAMMMSMMSSM -XSMMSSMAXMMAMXXSXMSMMMMMSSXXXAXMXXSMMXAMXMXMAAASASXSMXSAXXSAASXSXSSSMXMMMMXSASMSSSSSMXMSMMAXMMSXXSMMAMASXMAMSXSMMSAMMMXMXAAASMMMAXSXAAXAMAAM -MXMAMAXMASAASXMXAAMMMSMXMMXMSMSXSXAMAXMSAXMSSSMMASAMMAAXAMMMMSAAAMMMXAAAAMMMMSAMXMAXMXMASMSMMAXSMMXMXMXMXMXMMMMAXMAMAXAXMMSAMXMSSSMMMXSAMSSM -SAMMSMMXAMMXSAAMMMAAMAAXASAAAAMAMSMMAASXMAXAAXXMXMAMMAMMXAASMMMMXMAAXMSMSMAAAMMMAMASXXMAXXMAMASAXMASASAMXXXASAMXMXSMMSMMAMXAMXMAXAXMSASAMXAX -SXSXMXMMSMMASXSXSSSSSMSSMXASMSMAMAMMMXSAMXMMSMXMASAMXSSMMSXSMAAXASMSSXAAMMSMSMXSAMXMASAXSASXMXSMMXMSMSASAMSMSASXMAXAXMXSSMSAMSMMSXMMMASMMSSM -SMMAMASMAAMASMMXMAXAAMAMMMMXMAXAMAXXMAMASXXXAXASXMMMXMAXAMMMMSXSMSAMXXMMSAXMXAAXXXXMAMMXMMMASMXMAAXMASMMAMAASAMAMAMMXMASAAMSAAXXSMMAMXMAMAMA -SAXMSAMXSMMSSXSMMMMMXMAXXAMXMMSMMMSSMMSAMMMMMMMMAAAMASMMXSASMMMSMMMSAMXAMAXAMMSXSSSMMMSAMXSAMXAXSXSXAXASMMMMMXSXMMMSAMXSAMXMSSSXMAXSSXSAMASX -XMMXMAXXMXSASXSAMXXSXMASXSMMXAAXAXXMAAMXSASAAASMSMMXMMAAXMMXAXAMXAMXMXMSSSMSXAMXXAAXAAMMSAMASMMMXMMMMSMMAASXSAMMMAASXMXMASXMAXMAXSMAAASASXSM -MSMMSSXAAXMASMSAMAMAMMASMMMSMSSSMSAMSMMXSASMSMSAMAAASXSMMMASMMMSSMSASXXMAXAXMASXMSMMMSSMMAMAMASAXAAAXSXMSMMAMXSAMMMSASAMASASXMASAAMXMMMMXMMA -XAAAAXSMMMMXMASMMAXMSMASMXAAAAAAAMXMAASAMMXAAAMAMMSMSAMAAXMSAXSAAXMAMSAMXMSMMSAXAAXXAMAXSSMMSAMXSSSSSXSAAAXSMASXSAASXMAMASAMSAAMMXXSAMXAAXSS -MSMMSXXXAXXSAMXXSASXMXSMXMSMSMMMMMASXSMXSMMSMSMMMAMXMXMSSSXSXMMMSMMMMXXXSAMXXMXMSMSMMSXMAMMXMASAXMMXMASXSSMMMXSXSMXSMSXMXMMMSMXSXMSMSXMSAMAM diff --git a/src/AdventOfCode/Year2024/Day04.hs b/src/AdventOfCode/Year2024/Day04.hs index fd9fbf8..015fc97 100644 --- a/src/AdventOfCode/Year2024/Day04.hs +++ b/src/AdventOfCode/Year2024/Day04.hs @@ -1,52 +1,71 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2024.Day04 where -import AdventOfCode.Input (parseInput, parseString) -import AdventOfCode.TH (defaultMain, inputFilePath) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle (Puzzle, runPuzzle) +import AdventOfCode.TH (evalPuzzle) import AdventOfCode.Util (count) -import Data.List (tails, transpose) +import Control.Lens (makeLenses, (<.=)) import Data.List.Extra (dropEnd, sumOn') import Data.Universe.Helpers (diagonals) import Linear (V2 (..)) -import Text.Trifecta (Parser, manyTill, newline, oneOf, some) +import Relude +import Text.Trifecta (Parser, manyTill, newline, oneOf) + +data PuzzleState + = PuzzleState + { _answerOne :: !Int, + _answerTwo :: !Int + } + deriving (Eq, Generic, Show) + +makeLenses ''PuzzleState + +emptyPuzzleState :: PuzzleState +emptyPuzzleState = PuzzleState 0 0 main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -partOne :: [[Char]] -> Int -partOne grid = - sum - [ countHorizontal grid, - countHorizontal gridRotatedRight90, - countDiagonal grid, - countDiagonal gridRotatedRight90 - ] +partOne :: Puzzle [[Char]] PuzzleState Int +partOne = do + grid <- ask + let gridRotatedRight90 = transpose (reverse grid) + answerOne + <.= sum + [ countHorizontal grid, + countHorizontal gridRotatedRight90, + countDiagonal grid, + countDiagonal gridRotatedRight90 + ] where countHorizontal = sumOn' (count ((`elem` ["XMAS", "SAMX"]) . take 4) . dropEnd 4 . tails) countDiagonal = countHorizontal . dropEnd 3 . drop 3 . diagonals - gridRotatedRight90 = transpose (reverse grid) -partTwo :: [[Char]] -> Int -partTwo grid = - count - ((`elem` ["MMSS", "MSMS", "SMSM", "SSMM"]) . map (square grid) . corners) - [ V2 x y - | x <- [0 .. size - 3], - y <- [0 .. size - 3], - square grid (V2 x y + 1) == 'A' - ] - where - size = length grid +partTwo :: Puzzle [[Char]] PuzzleState Int +partTwo = do + grid <- ask + let size = length grid + answerTwo + <.= count + ((`elem` ["MMSS", "MSMS", "SMSM", "SSMM"]) . mapMaybe (square grid) . corners) + [ V2 x y + | x <- [0 .. size - 3], + y <- [0 .. size - 3], + square grid (V2 x y + 1) == Just 'A' + ] corners :: (Num a) => V2 a -> [V2 a] corners xy = [xy + V2 a b | a <- [0, 2], b <- [0, 2]] -square :: [[Char]] -> V2 Int -> Char -square grid (V2 x y) = grid !! y !! x +square :: [[Char]] -> V2 Int -> Maybe Char +square grid (V2 x y) = grid !!? y >>= maybeAt x getInput :: IO [[Char]] -getInput = parseInput wordSearch $(inputFilePath) +getInput = parseInputAoC 2024 4 wordSearch wordSearch :: Parser [[Char]] wordSearch = some (manyTill (oneOf "XMAS") newline) From 70995d73fe334a6a25d91568c3e6a1568ada53e2 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 11 Nov 2025 13:29:20 -0600 Subject: [PATCH 05/91] refactor(2024.05-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2024/day05.txt | 1387 ---------------------------- src/AdventOfCode/Year2024/Day05.hs | 63 +- 3 files changed, 42 insertions(+), 1410 deletions(-) delete mode 100644 input/2024/day05.txt diff --git a/VERSION b/VERSION index e7ca9d9..3c0a25e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.28 \ No newline at end of file +2024.7.2.29 \ No newline at end of file diff --git a/input/2024/day05.txt b/input/2024/day05.txt deleted file mode 100644 index 3370a8d..0000000 --- a/input/2024/day05.txt +++ /dev/null @@ -1,1387 +0,0 @@ -46|53 -25|43 -25|66 -43|65 -43|35 -43|61 -54|83 -54|15 -54|46 -54|92 -84|23 -84|16 -84|11 -84|74 -84|88 -16|99 -16|65 -16|61 -16|66 -16|28 -16|46 -86|88 -86|61 -86|34 -86|31 -86|35 -86|27 -86|95 -61|84 -61|88 -61|92 -61|51 -61|45 -61|55 -61|34 -61|74 -23|18 -23|97 -23|99 -23|58 -23|54 -23|43 -23|89 -23|66 -23|39 -68|12 -68|55 -68|51 -68|92 -68|98 -68|74 -68|96 -68|42 -68|75 -68|14 -98|55 -98|92 -98|42 -98|45 -98|23 -98|34 -98|74 -98|73 -98|96 -98|51 -98|31 -58|86 -58|18 -58|98 -58|66 -58|25 -58|61 -58|54 -58|68 -58|43 -58|26 -58|28 -58|75 -99|51 -99|49 -99|53 -99|86 -99|66 -99|39 -99|26 -99|96 -99|98 -99|15 -99|61 -99|35 -99|65 -39|88 -39|42 -39|84 -39|53 -39|15 -39|51 -39|45 -39|92 -39|65 -39|75 -39|83 -39|12 -39|34 -39|35 -34|16 -34|45 -34|89 -34|14 -34|66 -34|74 -34|23 -34|55 -34|88 -34|12 -34|99 -34|26 -34|73 -34|62 -34|72 -65|27 -65|34 -65|55 -65|97 -65|42 -65|83 -65|22 -65|45 -65|58 -65|35 -65|12 -65|92 -65|14 -65|73 -65|64 -65|89 -88|22 -88|97 -88|12 -88|72 -88|52 -88|89 -88|64 -88|62 -88|23 -88|49 -88|26 -88|13 -88|66 -88|73 -88|18 -88|16 -88|58 -97|39 -97|43 -97|98 -97|86 -97|46 -97|16 -97|72 -97|49 -97|68 -97|26 -97|66 -97|58 -97|28 -97|22 -97|11 -97|61 -97|62 -97|18 -64|86 -64|22 -64|97 -64|18 -64|73 -64|39 -64|43 -64|26 -64|66 -64|58 -64|89 -64|46 -64|13 -64|62 -64|25 -64|68 -64|15 -64|72 -64|99 -55|26 -55|43 -55|99 -55|74 -55|86 -55|16 -55|89 -55|49 -55|97 -55|23 -55|64 -55|62 -55|25 -55|72 -55|39 -55|54 -55|58 -55|22 -55|73 -55|18 -73|16 -73|28 -73|89 -73|97 -73|25 -73|61 -73|54 -73|68 -73|43 -73|86 -73|18 -73|22 -73|58 -73|15 -73|49 -73|11 -73|72 -73|62 -73|26 -73|66 -73|13 -89|39 -89|66 -89|13 -89|62 -89|99 -89|75 -89|49 -89|16 -89|25 -89|15 -89|53 -89|98 -89|26 -89|46 -89|96 -89|72 -89|86 -89|11 -89|68 -89|43 -89|61 -89|54 -52|54 -52|55 -52|89 -52|66 -52|13 -52|11 -52|25 -52|64 -52|72 -52|74 -52|22 -52|18 -52|23 -52|97 -52|99 -52|39 -52|86 -52|62 -52|14 -52|49 -52|58 -52|73 -52|16 -18|99 -18|13 -18|35 -18|62 -18|53 -18|54 -18|28 -18|65 -18|86 -18|96 -18|49 -18|61 -18|16 -18|39 -18|15 -18|68 -18|43 -18|26 -18|98 -18|46 -18|25 -18|66 -18|75 -18|72 -66|96 -66|15 -66|98 -66|46 -66|35 -66|75 -66|92 -66|86 -66|51 -66|43 -66|83 -66|31 -66|53 -66|49 -66|39 -66|42 -66|84 -66|13 -66|28 -66|95 -66|61 -66|68 -66|54 -66|65 -74|16 -74|97 -74|73 -74|13 -74|54 -74|86 -74|26 -74|22 -74|25 -74|99 -74|66 -74|39 -74|72 -74|46 -74|11 -74|62 -74|23 -74|89 -74|18 -74|58 -74|49 -74|15 -74|64 -74|43 -95|64 -95|31 -95|97 -95|92 -95|11 -95|89 -95|12 -95|58 -95|16 -95|45 -95|52 -95|73 -95|84 -95|14 -95|72 -95|88 -95|23 -95|74 -95|55 -95|25 -95|22 -95|34 -95|18 -95|27 -27|62 -27|52 -27|64 -27|45 -27|11 -27|14 -27|12 -27|16 -27|97 -27|88 -27|66 -27|89 -27|22 -27|34 -27|73 -27|55 -27|25 -27|18 -27|74 -27|99 -27|72 -27|58 -27|23 -27|26 -14|15 -14|66 -14|64 -14|55 -14|86 -14|54 -14|58 -14|73 -14|25 -14|99 -14|13 -14|22 -14|16 -14|26 -14|89 -14|97 -14|39 -14|49 -14|62 -14|23 -14|11 -14|18 -14|72 -14|74 -96|83 -96|95 -96|35 -96|34 -96|45 -96|23 -96|97 -96|74 -96|84 -96|55 -96|88 -96|51 -96|14 -96|64 -96|31 -96|92 -96|27 -96|42 -96|12 -96|22 -96|73 -96|52 -96|65 -96|53 -75|84 -75|83 -75|65 -75|27 -75|74 -75|53 -75|88 -75|23 -75|97 -75|14 -75|92 -75|34 -75|64 -75|35 -75|51 -75|31 -75|96 -75|55 -75|52 -75|42 -75|45 -75|95 -75|73 -75|12 -13|15 -13|39 -13|98 -13|86 -13|65 -13|68 -13|61 -13|46 -13|84 -13|95 -13|28 -13|42 -13|92 -13|75 -13|53 -13|51 -13|35 -13|31 -13|43 -13|54 -13|34 -13|96 -13|27 -13|83 -49|42 -49|46 -49|95 -49|13 -49|83 -49|43 -49|54 -49|53 -49|39 -49|65 -49|86 -49|27 -49|92 -49|75 -49|31 -49|98 -49|68 -49|28 -49|96 -49|61 -49|35 -49|51 -49|84 -49|15 -45|49 -45|16 -45|11 -45|55 -45|99 -45|22 -45|58 -45|97 -45|73 -45|62 -45|74 -45|14 -45|66 -45|72 -45|25 -45|18 -45|13 -45|64 -45|26 -45|52 -45|86 -45|23 -45|89 -45|12 -42|88 -42|14 -42|74 -42|55 -42|51 -42|22 -42|34 -42|58 -42|92 -42|12 -42|52 -42|95 -42|31 -42|18 -42|83 -42|84 -42|97 -42|27 -42|45 -42|11 -42|64 -42|73 -42|89 -42|23 -35|55 -35|42 -35|58 -35|14 -35|95 -35|88 -35|52 -35|31 -35|12 -35|92 -35|51 -35|83 -35|34 -35|27 -35|89 -35|97 -35|64 -35|84 -35|11 -35|73 -35|74 -35|23 -35|22 -35|45 -51|45 -51|11 -51|97 -51|74 -51|12 -51|92 -51|83 -51|55 -51|14 -51|89 -51|22 -51|25 -51|27 -51|52 -51|84 -51|23 -51|34 -51|18 -51|95 -51|58 -51|64 -51|73 -51|31 -51|88 -11|65 -11|16 -11|61 -11|13 -11|99 -11|39 -11|28 -11|43 -11|66 -11|54 -11|26 -11|98 -11|62 -11|49 -11|53 -11|15 -11|96 -11|68 -11|72 -11|86 -11|18 -11|25 -11|75 -11|46 -26|13 -26|65 -26|54 -26|28 -26|35 -26|86 -26|42 -26|96 -26|43 -26|66 -26|15 -26|68 -26|51 -26|95 -26|92 -26|49 -26|53 -26|83 -26|75 -26|46 -26|39 -26|84 -26|61 -26|98 -53|22 -53|65 -53|97 -53|95 -53|74 -53|45 -53|84 -53|12 -53|34 -53|35 -53|73 -53|52 -53|27 -53|88 -53|23 -53|14 -53|31 -53|55 -53|92 -53|51 -53|64 -53|58 -53|83 -53|42 -12|13 -12|97 -12|66 -12|49 -12|55 -12|16 -12|23 -12|26 -12|86 -12|14 -12|18 -12|52 -12|11 -12|89 -12|62 -12|99 -12|22 -12|54 -12|74 -12|58 -12|73 -12|25 -12|64 -12|72 -92|23 -92|27 -92|25 -92|22 -92|18 -92|34 -92|11 -92|89 -92|88 -92|55 -92|97 -92|52 -92|72 -92|62 -92|12 -92|74 -92|31 -92|45 -92|73 -92|14 -92|16 -92|58 -92|99 -92|64 -62|98 -62|26 -62|39 -62|96 -62|49 -62|95 -62|53 -62|65 -62|54 -62|51 -62|61 -62|42 -62|66 -62|46 -62|15 -62|83 -62|43 -62|35 -62|86 -62|68 -62|75 -62|13 -62|84 -62|28 -22|86 -22|98 -22|18 -22|54 -22|99 -22|61 -22|75 -22|13 -22|28 -22|25 -22|72 -22|43 -22|16 -22|58 -22|49 -22|11 -22|26 -22|66 -22|15 -22|68 -22|89 -22|39 -22|46 -22|62 -28|84 -28|96 -28|42 -28|65 -28|95 -28|45 -28|64 -28|98 -28|61 -28|31 -28|52 -28|27 -28|92 -28|55 -28|14 -28|34 -28|74 -28|53 -28|35 -28|51 -28|75 -28|88 -28|12 -28|83 -72|53 -72|96 -72|39 -72|42 -72|43 -72|35 -72|86 -72|54 -72|51 -72|62 -72|65 -72|46 -72|83 -72|28 -72|66 -72|26 -72|75 -72|68 -72|13 -72|99 -72|61 -72|98 -72|49 -72|15 -83|45 -83|92 -83|64 -83|14 -83|97 -83|31 -83|73 -83|88 -83|22 -83|16 -83|95 -83|27 -83|12 -83|84 -83|55 -83|74 -83|18 -83|11 -83|25 -83|89 -83|34 -83|23 -83|58 -83|52 -31|52 -31|64 -31|14 -31|74 -31|88 -31|72 -31|27 -31|58 -31|26 -31|23 -31|99 -31|11 -31|45 -31|89 -31|73 -31|34 -31|12 -31|16 -31|55 -31|22 -31|97 -31|25 -31|62 -31|18 -15|61 -15|88 -15|84 -15|28 -15|96 -15|95 -15|35 -15|27 -15|53 -15|51 -15|45 -15|52 -15|75 -15|42 -15|65 -15|12 -15|83 -15|68 -15|34 -15|46 -15|43 -15|31 -15|98 -15|92 -46|34 -46|84 -46|52 -46|95 -46|83 -46|55 -46|61 -46|28 -46|65 -46|31 -46|98 -46|42 -46|12 -46|75 -46|92 -46|45 -46|35 -46|96 -46|51 -46|27 -46|68 -46|88 -46|14 -25|53 -25|26 -25|46 -25|49 -25|54 -25|35 -25|61 -25|98 -25|75 -25|68 -25|15 -25|99 -25|86 -25|72 -25|28 -25|65 -25|13 -25|62 -25|39 -25|96 -25|42 -25|16 -43|45 -43|52 -43|96 -43|53 -43|12 -43|51 -43|92 -43|98 -43|83 -43|46 -43|84 -43|68 -43|42 -43|88 -43|31 -43|75 -43|14 -43|27 -43|95 -43|34 -43|28 -54|95 -54|84 -54|43 -54|39 -54|45 -54|27 -54|35 -54|51 -54|42 -54|31 -54|75 -54|61 -54|34 -54|65 -54|88 -54|68 -54|96 -54|98 -54|53 -54|28 -84|27 -84|64 -84|34 -84|58 -84|73 -84|31 -84|97 -84|72 -84|52 -84|99 -84|14 -84|22 -84|55 -84|12 -84|45 -84|92 -84|25 -84|18 -84|89 -16|42 -16|39 -16|51 -16|98 -16|75 -16|53 -16|13 -16|35 -16|62 -16|54 -16|86 -16|49 -16|96 -16|26 -16|43 -16|15 -16|68 -16|72 -86|28 -86|15 -86|65 -86|46 -86|98 -86|43 -86|39 -86|42 -86|84 -86|83 -86|68 -86|96 -86|51 -86|54 -86|75 -86|92 -86|53 -61|31 -61|64 -61|42 -61|65 -61|52 -61|96 -61|95 -61|75 -61|12 -61|83 -61|98 -61|23 -61|27 -61|14 -61|35 -61|53 -23|22 -23|13 -23|26 -23|86 -23|16 -23|46 -23|28 -23|25 -23|11 -23|15 -23|73 -23|68 -23|62 -23|49 -23|72 -68|28 -68|53 -68|34 -68|65 -68|35 -68|45 -68|88 -68|83 -68|84 -68|31 -68|27 -68|52 -68|95 -68|61 -98|88 -98|27 -98|75 -98|53 -98|52 -98|35 -98|83 -98|14 -98|64 -98|12 -98|84 -98|65 -98|95 -58|16 -58|96 -58|13 -58|46 -58|11 -58|62 -58|89 -58|49 -58|72 -58|39 -58|15 -58|99 -99|54 -99|43 -99|46 -99|75 -99|95 -99|28 -99|83 -99|68 -99|42 -99|62 -99|13 -39|61 -39|98 -39|95 -39|28 -39|43 -39|46 -39|27 -39|68 -39|96 -39|31 -34|58 -34|18 -34|52 -34|25 -34|64 -34|22 -34|11 -34|49 -34|97 -65|74 -65|95 -65|31 -65|51 -65|88 -65|52 -65|23 -65|84 -88|99 -88|11 -88|55 -88|25 -88|14 -88|74 -88|45 -97|89 -97|15 -97|99 -97|54 -97|25 -97|13 -64|16 -64|11 -64|23 -64|54 -64|49 -55|15 -55|66 -55|11 -55|13 -73|99 -73|46 -73|39 -89|18 -89|28 -52|26 - -97,58,11,72,99,62,13,86,54,39,43,46,68,28,61 -74,64,23,73,97,22,58,89,11,25,72,99,62,26,66,49,13,86,39,15,43 -96,35,42,95,92,12,74,64,97 -74,23,97,58,89,11,18,25,16,72,99,62,26,66,49,13,86,54,39,15,43 -12,72,52,14,23,62,49,89,11,66,45,25,22,18,13 -64,25,11,14,62,99,55,26,97,74,34,22,66,58,73 -26,49,13,86,54,39,28,61,96,35,42,51,83,95,84 -66,49,13,86,39,15,43,46,68,28,61,75,96,53,65,35,42,51,95,84,92 -64,58,89,25,99,62,86,39,46 -68,28,61,98,75,96,65,35,51,95,84,92,27,34,88,45,12 -25,62,49,15,28,65,35 -84,92,31,27,34,88,45,12,52,14,55,74,73,97,22,58,89 -51,88,14,64,84,58,83,34,22,27,92,55,12,42,95,74,73,65,97,35,31,45,23 -52,45,66,74,55,64,34,16,58 -26,13,68,61,98,75,96,42,84 -74,64,23,73,25,16,72,26,49,86,54,15,43 -73,99,26,72,62 -61,98,96,53,42,51,83,84,31,27,34,88,45,12,55,74,64 -16,72,99,26,66,49,13,54,39,15,43,46,68,28,75,53,65,35,42 -97,73,15,39,72,54,25,28,16,66,68 -12,25,74,99,14,34,45 -89,11,18,25,16,72,99,62,26,66,49,13,86,54,39,15,46,68,28,61,98,75,96 -88,12,73,22,31,16,84,18,34,23,11,72,45,55,27,14,74,89,92,64,97,58,52 -53,65,42,51,83,84,92,27,12,52,55,74,22 -64,97,86,26,49,23,22,14,73,16,11,13,89,99,18 -89,11,18,25,16,72,26,13,54,39,43,28,98,75,96 -99,64,11,34,58,72,25,74,18,26,97,23,45,12,88,55,89,14,66,62,16,52,22 -86,54,39,15,43,46,68,28,61,98,75,96,53,65,35,42,51,83,84,92,31,27,34 -11,73,12,95,89,88,45,16,23,34,74,97,22,18,31,92,64,84,55 -68,25,46,65,61,86,96,15,35 -99,66,49,13,86,54,39,15,43,61,98,75,96,53,65,35,42,51,83 -31,42,14,95,84,97,51,27,45,88,55,64,96,34,73,53,12,74,65,35,83,92,23 -95,52,96,53,27,51,14,75,42,98,23,34,88,74,55,84,65,12,31 -27,16,12,99,25,89,55,62,14,52,18,23,97,22,31,11,72,34,64,73,58 -23,42,51,27,65,34,74,88,96,83,95,52,55,31,64 -23,97,22,58,89,11,18,16,72,99,62,26,66,13,54,39,43,46,68 -12,52,74,23,73,97,22,58,11,18,16,72,99,62,49,13,86 -49,73,43,25,86,22,89,54,62,16,15,39,11,72,13,18,64 -89,11,18,25,16,72,99,26,66,49,13,86,54,39,15,43,46,68,28,61,98,75,96 -73,97,22,89,11,18,25,16,72,99,62,66,49,13,86,54,39,43,46 -42,92,34,23,73 -98,75,96,53,65,35,42,51,83,84,92,31,27,34,88,45,12,52,14,55,74,64,23 -66,49,86,62,96,72,46,43,68,53,99,35,28,51,15 -58,72,86,66,49,18,25,89,61,22,68,62,13,98,26,54,99,46,15,39,11,16,43 -13,42,61,49,68,86,31,83,92 -64,52,86,14,66,72,89,11,54 -34,89,14,74,55,73,72,25,16,18,11,58,92 -62,26,49,54,15,43,61,98,75,96,42,51,95 -99,13,22,72,46,54,39,28,15,89,62,11,18,25,73,26,66 -14,27,34,72,84,16,55 -18,72,26,13,46,68,28,75,96,53,65 -46,68,75,96,53,42,83,95,84,34,88,45,12,52,14 -49,97,18,58,25,13,89,68,54,43,73,16,11,99,23,62,86,72,15 -86,42,51,61,43,83,92,53,46,98,68,15,75,96,34,84,35 -58,11,92,34,14,45,31,25,23,64,97,95,84,73,55 -25,26,68,98,43,28,16,66,15,54,22,13,46,61,89 -75,96,53,65,35,42,51,83,95,84,92,31,27,34,88,45,12,52,14,55,64,23,73 -12,52,14,55,74,64,23,73,97,22,58,11,25,16,72,62,26,49,86 -31,95,45,22,23,73,88,58,34,12,97 -28,98,42,46,27,53,83,88,92,12,35,84,96,61,95,14,45 -35,55,12,52,96,97,14 -96,92,12,34,75,52,27,84,73,55,14,83,23,51,95,64,74,53,65,31,42 -23,16,88,89,64,22,72,99,31,74,11 -89,99,54,22,18,72,13,58,62,39,16,15,11,66,43 -83,95,84,92,31,27,34,88,45,12,52,14,55,74,64,23,73,97,22,58,89,11,25 -46,51,84,92,13,27,35 -45,12,11,25,72,49,13 -35,65,55,12,68,31,45,98,51,61,14 -42,83,84,31,27,34,88,45,12,52,14,64,97,89,11 -83,43,27,39,35,98,28,53,75,92,46,68,95,31,51,86,42,13,54,84,61 -89,11,25,16,62,26,54,46,28,98,96 -11,16,99,62,26,66,49,86,54,39,15,43,46,68,61,98,75,96,53 -46,61,96,42,95 -15,43,58,61,26,99,18,97,72 -43,68,28,35,51,84,34,88,52 -18,16,72,99,62,26,49,13,54,39,43,46,68,28,75,53,65 -54,68,35,49,72,53,15,61,98,51,13,99,66 -61,53,65,35,51,83,31,27,34,88,12,14,55,74,64 -55,74,73,97,22,89,25,16,99,62,66,13,86,54,15 -13,86,46,75,96,65,83,92,27 -88,75,12,15,51,28,83,46,43,35,42,53,98,68,27,65,61 -51,62,28,46,15,68,53,99,75,49,72,96,39,61,42,65,66 -75,53,51,43,98,99,15,66,72,46,49 -35,42,51,83,95,84,92,31,34,88,45,12,52,14,55,74,64,23,73,97,22,58,89 -74,62,99,22,58,14,16,18,89,31,55,72,27,88,23,45,11,12,34 -28,46,45,68,51,88,35,39,31,42,95 -42,97,92,14,53,45,55,51,83,65,84,95,73,22,35 -68,96,54,53,42,46,15,13,66,98,28,26,39 -58,89,11,18,25,16,72,99,62,26,66,49,13,86,54,39,15,46,68,28,61,98,75 -96,15,42,35,26,99,75,39,72,13,53 -68,39,62,58,11,89,99,54,61,22,66,49,72,25,43,98,46,13,26,28,86,16,18 -31,88,45,14,74,25,16,99,62 -23,97,58,89,11,72,62,26,49,13,43,46,68 -58,73,64,34,12,31,84,14,27,22,35,55,65 -28,51,61,45,88,68,15,53,98,95,96,75,42,46,34,31,27,35,65,83,92,12,84 -92,34,14,74,97,22,89,16,99 -83,95,12,89,74 -53,28,86,66,15,49,61,25,96,13,46,72,62,54,11 -64,22,86,43,99,18,54,25,23,66,72,73,89,46,15,97,11,62,13 -66,45,64,74,58,97,52,73,25,16,99,49,62,18,22,23,88 -53,35,51,84,31,27,34,55,73,97,22 -15,53,61,51,83,68,75,28,39,86,65,92,42,27,98,95,84 -42,68,61,88,14,75,52,53,95,84,46,98,96 -26,72,14,88,25,66,34 -34,96,95,74,55 -46,49,68,15,13,98,28,72,54,35,96,42,26 -52,64,23,73,18,16,26,66,13 -62,26,66,49,13,86,54,39,15,46,68,28,61,98,75,96,53,65,35,42,51,83,95 -61,98,75,65,51,83,95,84,92,31,34,88,45,12,52,74,64 -83,12,95,52,53,14,22,64,45,35,74,97,42,51,73,34,65 -86,11,49,97,62,55,64,18,73 -73,97,22,18,25,16,99,66,13,86,15,46,28 -88,45,12,52,14,55,74,64,97,22,18,72,99,62,26,66,49 -16,72,49,54,98 -52,14,64,62,12,97,34,45,58,73,72,11,22,55,31 -55,83,34,73,64,75,95 -64,89,51,74,31,22,92,45,27,97,11 -18,49,86,43,98,96,65 -31,97,14,11,34,23,58,27,62,45,64,52,16,12,74,72,89,55,25 -64,12,34,25,27,83,18 -64,86,16,74,54,97,23,13,22,18,55,39,11,26,99,15,58,62,89,66,25,73,72 -18,39,28,26,15,98,54,43,61,62,89,75,99,58,16,66,49 -28,27,31,98,61,96,46,83,45,15,34 -12,84,83,14,74,31,92,97,96,55,95 -12,28,51,15,34,88,27,31,75,45,43,68,42 -68,28,75,96,65,35,42,51,83,84,92,27,12,52,55 -96,35,88,92,65,15,98,39,84,54,83,46,75,68,51 -46,68,28,61,98,75,96,65,35,42,51,83,95,84,92,31,27,34,88,12,14 -54,15,96,46,43,42,26,99,13,61,98,49,86,72,68,53,28,66,16 -43,26,62,39,11,49,54,89,13,28,15 -45,84,98,15,27,34,31,35,53,51,42,75,12,61,95,65,96,92,83,46,88 -97,58,11,25,16,62,26,66,49,86,54,39,43,46,68,28,61 -52,23,97,22,11,25,54 -18,25,72,99,62,26,66,49,86,54,39,15,43,68,98,75,96 -61,97,13,66,15,72,39,28,18,46,54,43,68,26,86,22,99,62,89,58,16 -68,96,35,51,83,84,31,45,12,52,55 -53,65,35,42,83,95,92,31,45,12,52,14,74,64,23,97,22 -97,52,83,22,25,58,64 -61,42,98,88,31,92,51,54,84,68,95,39,65,46,83,28,75 -14,64,23,22,89,11,25,72,99,62,26,49,13,54,39 -73,86,49,39,14,72,99,22,25,23,16,74,62,89,64,58,54,13,97,55,66 -49,16,97,26,13,15,89,28,86,66,43,62,22,73,68,11,54 -95,53,35,86,42 -25,66,49,39,43,98,35 -65,35,42,92,31,27,88,12,64,97,58 -42,51,95,84,92,34,88,45,55,74,64,23,73,22,11 -62,49,25,46,16 -46,96,65,51,12,52,88,42,14 -11,72,99,66,46 -11,18,25,72,99,62,26,49,86,15,46,96,53 -51,65,28,92,88,98,43,61,42,96,54 -95,54,35,34,27,86,39,83,92,15,96 -66,15,98,26,46,39,28,83,54,49,35,61,51,53,86 -34,42,43,28,61,65,68,83,12,92,15,98,95 -74,97,22,89,11,16,99,49,39,15,43 -15,46,28,61,98,75,96,53,65,35,42,51,95,84,92,27,88,45,12 -46,26,53,54,18,68,11,13,98,99,25,39,16,61,49,62,72,15,86,28,66 -18,99,62,86,39,46,68,28,61,53,65 -14,51,96,92,95,53,35,55,27,84,42,75,64,74,52,65,88,45,61 -26,49,86,28,35,95,84 -55,22,58,18,66,49,13,86,54,39,15 -13,86,15,75,35,83,95,84,92 -14,74,64,72,62,26,39 -84,92,34,88,45,14,55,73,97,89,11,25,72 -72,99,62,26,66,49,54,39,15,43,68,61,75,53,65,35,42 -88,45,12,52,14,55,74,64,23,73,97,22,58,89,11,18,25,16,72,99,62,26,49 -14,74,64,23,73,97,22,58,89,11,18,25,16,72,99,62,26,66,49,13,86,54,39 -11,18,25,16,49,13,54,15,98,96,53 -14,64,52,12,55,11,89,51,18 -16,72,99,66,49,86,54,15,43,68,28,98,96,53,65,35,42 -65,75,53,99,46,42,28,61,66,68,86,54,43,39,13 -18,39,13,72,62,55,23,22,64,14,26,49,58,66,11,74,97 -72,11,86,89,15,99,55,97,73,25,16,13,58,18,49,23,54 -92,28,27,95,13,46,68,42,75 -83,61,15,99,46,86,35,68,53 -83,95,92,31,34,45,12,52,14,55,64,23,97,22,58,89,11,18,25 -88,12,52,14,97,22,89,72,62,26,49 -86,84,96,42,28 -92,27,34,45,12,14,55,74,64,23,73,97,22,58,89,11,18,16,99 -28,61,98,53,65,51,84,34,88,45,74 -88,14,89,22,97,23,84,83,73,58,12,55,27 -61,43,28,98,31,84,52 -75,96,88,84,27,46,28,34,35,83,42,65,98,61,68,31,54,53,43 -15,18,16,72,62,22,25,99,54 -98,54,13,66,86,62,25,35,99,26,68,43,53 -86,54,46,28,75,35,51,92,31,27,34 -26,66,13,86,39,43,61,53,83 -23,97,58,11,18,72,49,86,54,46,68 -35,42,51,83,95,84,92,31,27,34,88,45,12,52,55,74,64,23,73,97,22,58,89 -83,84,98,86,95,65,26 -97,55,22,11,23,45,88,18,84,72,92,73,74,16,58,64,34 -83,95,84,92,31,27,34,88,45,12,52,14,55,74,64,23,73,22,58,89,11,18,25 -97,18,72,99,62,13,86 -28,13,89,98,96,16,49 -14,27,26,73,55,18,34,72,99,45,52,23,74,88,58,25,97,22,12,89,62 -18,25,16,72,99,62,26,66,49,13,86,54,39,15,43,46,68,28,98,75,96,53,65 -58,89,11,18,72,62,26,66,54,39,15,68,61,98,75 -68,72,11,39,58,25,54,86,61,49,75 -98,54,39,28,26,18,11,22,68,43,62,66,86 -45,99,73,97,58,92,89,25,11,14,52,74,23,27,88 -45,12,55,74,64,23,73,97,58,18,25,16,72,99,62,66,13 -27,22,14,84,73,95,58 -64,34,95,88,11,12,14,97,83,73,55 -89,11,45,31,73,14,97,34,58,92,55,51,64,22,23,27,74,84,52,12,95,83,88 -52,97,83,92,22,35,55,51,84,88,27,23,89 -88,42,27,55,84,14,95,98,96,65,74,83,51,34,61,53,12,45,28 -64,45,12,14,22,74,95,97,92,52,31,18,55,25,23,27,34,16,58 -26,51,49,54,75,28,98,42,62,61,46,53,66,96,68,39,43,13,83,65,86 -27,97,52,72,73,64,26,25,16,18,74 -27,52,74,23,73,97,22,58,89,11,18,25,16,72,99,62,26 diff --git a/src/AdventOfCode/Year2024/Day05.hs b/src/AdventOfCode/Year2024/Day05.hs index ee35992..4c433cd 100644 --- a/src/AdventOfCode/Year2024/Day05.hs +++ b/src/AdventOfCode/Year2024/Day05.hs @@ -1,31 +1,50 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2024.Day05 where -import AdventOfCode.Input (parseInput, parseString) -import AdventOfCode.TH (defaultMain, inputFilePath) -import Control.Arrow ((&&&)) -import Control.Monad (void) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle (Puzzle, runPuzzle) +import AdventOfCode.TH (evalPuzzle) +import Control.Lens (makeLenses, (<.=)) import Data.Graph qualified as Graph +import Data.Semigroup (Max (..), Min (..)) +import Relude import Text.Trifecta hiding (parseString) +data PuzzleState + = PuzzleState + { _answerOne :: !Int, + _answerTwo :: !Int + } + deriving (Eq, Generic, Show) + +makeLenses ''PuzzleState + +emptyPuzzleState :: PuzzleState +emptyPuzzleState = PuzzleState 0 0 + main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -partOne :: ([(Int, Int)], [[Int]]) -> Int -partOne (rules, updates) = - sum - [ middle update - | update <- updates, - update == applyRules rules update - ] +partOne :: Puzzle ([(Int, Int)], [[Int]]) PuzzleState Int +partOne = do + (rules, updates) <- ask + (answerOne <.=) + $ sum + $ mapMaybe middle + $ filter (uncurry (==) . (id &&& applyRules rules)) updates -partTwo :: ([(Int, Int)], [[Int]]) -> Int -partTwo (rules, updates) = - sum - [ middle sorted +partTwo :: Puzzle ([(Int, Int)], [[Int]]) PuzzleState Int +partTwo = do + (rules, updates) <- ask + (answerTwo <.=) + $ sum + $ mapMaybe middle + $ [ sorted | update <- updates, let sorted = applyRules rules update, update /= sorted - ] + ] -- TODO: look into fgl instead applyRules :: [(Int, Int)] -> [Int] -> [Int] @@ -34,11 +53,11 @@ applyRules rules update = filter (`elem` update) (Graph.topSort graph) graph = Graph.buildG bounds relevantRules relevantRules = filter (all (`elem` update)) rules bounds = - minimum &&& maximum $ - foldMap (\(before, after) -> [before, after]) relevantRules + bimap getMin getMax + $ foldMap (\(before, after) -> (Min (min before after), Max (max before after))) relevantRules getInput :: IO ([(Int, Int)], [[Int]]) -getInput = parseInput safetyManual $(inputFilePath) +getInput = parseInputAoC 2024 5 safetyManual safetyManual :: Parser ([(Int, Int)], [[Int]]) safetyManual = @@ -89,5 +108,5 @@ example = \61,13,29\n\ \97,13,75,29,47\n" -middle :: [a] -> a -middle xs = xs !! (length xs `div` 2) +middle :: [a] -> Maybe a +middle xs = xs !!? (length xs `div` 2) From f895bff42261f36ca1794c2589349edb0a200551 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 11 Nov 2025 14:06:28 -0600 Subject: [PATCH 06/91] refactor(2024.06-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2024/day06.txt | 130 ---------------------------- src/AdventOfCode/Year2024/Day06.hs | 133 ++++++++++++++++------------- 3 files changed, 77 insertions(+), 188 deletions(-) delete mode 100644 input/2024/day06.txt diff --git a/VERSION b/VERSION index 3c0a25e..d8e2ba0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.29 \ No newline at end of file +2024.7.2.30 \ No newline at end of file diff --git a/input/2024/day06.txt b/input/2024/day06.txt deleted file mode 100644 index 083f6d1..0000000 --- a/input/2024/day06.txt +++ /dev/null @@ -1,130 +0,0 @@ -#.....#.........#.........................#...#....................#......#.......#...........#........#.......................... -..................#......#..................................#..................#....#...............#.#....................#.....# -..............#...........#......#.#.......................................#..................#......#............................ -##...............................#..........#...................#.......#................................................#........ -#.....................#.......##................#...#..........#............................................#...#....#............ -........#........#.............#...............#...##...................#...........#...........#.......#...........##.#...#.#.... -................................................#....................................................#.#.......................... -.........#....#.....................................................................##......#.....#........#...............#...... -.............................#.....#.........#......................#...#................#.#..........#........................... -........................................#.........................................................................#............... -.........................................#.......#.............#.#.........................#....#.....#...........#............... -...#............##...................................#...........#........................................#..................#.... -....#.................#.......#............#.....#...........#................................#.#.#...........................#... -...#................................................................#.......................#.#........................#..#...#... -............................#......#.......#...............................................................................#....#. -.......................................................#.............................#...#.......#.............#............#..... -.....................................................................#......................................#.................##.. -......#.................#......................................................#................#................................. -...............................................................................#...............#............................#..... -........................................................#......................##..................#........#..................... -.#.................................#....#........#..#........#.................................#...............#..........#.#..... -.................#................#...................#.#.....#................#..................#.........#..................... -...............#........................................................................#............#..........#................. -....................#..................#...........#................................#.....................#...#......#............ -.............#..#..................................#..............................#...............................#...#......#...# -..................#.............................................................#...............................#......#.......... -................................................................#....#..............#.............................#............... -.............#............#............................#...#........#...#.........................##.............................. -....................................#....#.............#...#....#..........................#..................#.#............#.... -.......................#........................................................................................#................. -........#..................................#..#.........#.......................................#......#..............#........... -..........#............#............#..................#.......#..........#...................................#...........#....... -....#..............................#.....#...........##...#.....................#...........................#..........#.......... -................................#..#.................................................................#...#...................#.... -..#....................#..........................................................................#............................... -..................#........................#.......#..#......................................................................#.... -.#.....#......................#.....................................#.........................................#................... -..#....#...........................................#..........................................................................#... -..#.....#........................................................................#........#.#.............................#....... -................#......................................#...............#....................................#..........#.......... -....................................#........................##.............................#..........................#........#. -.#..............#..............................#......................................................#........................... -...#.#......................#.................#..................................#...........................#.................... -..#....#..........................................#...#.......#..............................................#.................... -.......#.................#............................#..................................................#..#....................# -.....##.#...........#...........................................#.....................................................#........... -................#.#........................................................................#..........#..#....#.##................ -..........#........#............................................#.#......................................#.............#.......... -............................................................#..........................................#.......................... -.......#........#.................#....................................................................#.......................... -........................................................#..........................#..............#............................... -.............#.#....................................#.................##............#.#.............................#..........#.. -.##.............................................^........#...................#.....#...................................#.......... -...............#..#..#................................................................#...........................#............... -.#.......##...........#.........#..................#......#..........#...#....#...................#............................... -....#................................................................#...................#........................................ -.........#............#..#......................................................#..#.............................................. -...#.............................................................#......#....#....................................#...#....#...... -.....#.........#.................#....................#..................#..#.#.............#......#.....................#........ -...........#.......#.##.#......#..#.............................#...........#..............................................#...... -................................................................................................#.#......#......................#. -##..................................##....#.................#...............##.................................................... -.....#.............................#.............................................#................#.....................#......... -............#..............................#.....................#...............#..#....#....#................................... -.........#.........................#...#................................................#........................................# -.#..........................................#.......#.....................................................#..............#...#.... -#.........#...........#.............#..........................#........................................#......................... -.......................................................................#.............................................#............ -....#..............#..#......................................................#..........................................#....#.... -........#...................................#...#................#.........................................................#...#.. -.........................................................#..#..#..#..........#...........#...........#............#............... -..............................................##......#.................#..............................................#.......... -.............................#..........#......#.....#....#.............#..............................................#...#..#... -......................................##......#.....................................#.......#....................#................ -...................................................................................................#.............................. -.................................#..................................................................................#............. -........#...................................................................#...................##............#................... -...............................#.................................................................................................. -...............................#...........................................................#...............##..............#...... -........................................................................#..........#..................................#........... -................#................................................................................................................. -...#.................#..........#...........#...................................#......................#.......................... -.......................#..........................................................#.............#.............#..........#........ -..........#..........#.#.................................#........#.............#..#..........................#........#.........# -.................#.........#.#........................#...#.............................................................#......#.. -......#.....................................................................#.....#...............#...............#....#.......... -......#...##....#..#.......................................##......#......#....#..............#............#....................#. -.#..........#........#...#........##..............#....#...........................#.....#................#...................#... -.........................#........................................................................................................ -..........................#.......................#.........#................................................#.#...........#...... -......#...#.....#..........#....................#..................................#...#.................................#........ -.......................................................#............................#.....................#.#.................#... -..............#...............#......................#......#...................#.....................#.........#................# -....#.........#...............................................................#.......#.......#...........#.................#..... -.......................#.........................#....................................#........................................... -...............#.................#..........#........................#...##....................................................... -....##..................#..#..................................................................................#.................#. -..................#.............#......................#...............#................#.#....................................... -........................#....#................................................#...#..........#....#.......#....................... -.........................................................#..............#.............#.#.......#..................#......#...#... -...........#...........................#.........#..................................#.....................................#....... -.#..........................................#................................................................#...........#........ -..................................##....................#..........#..............#..........#............#.....#................. -##..#..#....#.........................................................#...............#...................................#....... -....#.#...........#............................#....#........#......#............................................................. -#....#.........................#.............#.............................................................#.....#..#............. -............................#......#................#...............................................#.....#............#.......... -........................#.............#..................#........................................................................ -..#.............#........................................#.................................................#...................... -...................#...................#..........#..#.............................................#...........#...#............#. -....#...#..........................##...#...............#....#.....................................#............#................. -..............................#..............................................................###.................................. -.................#......................................#.......................##.#............#................................. -............#.........................................#......##.....................#............#................................ -....................#..#.............................#...#......................................#....................#.#........#. -....#...........#...........................................#....................................................#................ -............#.....#..................................##.........#........#.....................................#.................. -......#..............#..................................#...#.......#............................................................. -..........#.................#.......#.........................................................................#...........#....... -...........#..............#................#.....##.#............#........#....................................................... -................#.......................#.........................................................................#...........#... -..............................#............................................#.......#.............................................. -..............#..............................#......#..................#....#.....#.................................#........#.... -....................##..........#...#..#................#............#.......................#.................................#.. -........................##.......#..................#.......#.....................#................#.....................#.....#.. -..............#.............#...#......#.........#.................##..#...........#...........#.........................##....... -#........#...........#........#..#............#...........#....#....#......##..............................................#...... -........................................#.....................#....................................#........#......#......#....... -.............#........#.............#...........#..#..#.......................................................#......#............ -#...................#.#........................................#..................................#...#........................... diff --git a/src/AdventOfCode/Year2024/Day06.hs b/src/AdventOfCode/Year2024/Day06.hs index bc51a50..962fc4a 100644 --- a/src/AdventOfCode/Year2024/Day06.hs +++ b/src/AdventOfCode/Year2024/Day06.hs @@ -4,20 +4,22 @@ {-# LANGUAGE GADTs #-} {-# LANGUAGE MultiWayIf #-} {-# LANGUAGE ParallelListComp #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2024.Day06 where -import AdventOfCode.Input (parseInput, parseString) -import AdventOfCode.TH (defaultMain, inputFilePath) -import AdventOfCode.Util (CyclicEnum (..)) -import Control.Applicative ((<|>)) -import Control.Lens (ifoldl', makeLenses, to, (%=), (%~), (&), (&~), (+~), (.=), (.~), (^.)) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle (Puzzle, runPuzzle) +import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Util (CyclicEnum (..), count) +import Control.Lens (ifoldl', makeLenses, to, (%=), (%~), (&~), (+~), (.=), (.~), (<.=), (^.)) import Data.Ix (inRange) -import Data.Set (Set) import Data.Set qualified as Set import Linear (V2 (..), _x, _y) -import Text.Trifecta (Parser, char, newline, sepEndBy, some) -import Prelude hiding (Either (..)) +import Relude hiding (Down, Either (..), unlines) +import Text.Show qualified as Show +import Text.Trifecta (Parser, char, newline, sepEndBy) +import Prelude (unlines) data Heading = Up @@ -35,8 +37,8 @@ data Position where type Coordinates = V2 Int data Guard = Guard - { _position :: Coordinates, - _heading :: Heading + { _position :: !Coordinates, + _heading :: !Heading } deriving (Eq, Show) @@ -44,9 +46,9 @@ makeLenses ''Guard data SituationMap = SituationMap - { _bounds :: Coordinates, - _guard :: Guard, - _obstacles :: Set Coordinates + { _mapBounds :: !Coordinates, + _mapGuard :: !Guard, + _mapObstacles :: !(Set Coordinates) } deriving (Eq) @@ -56,66 +58,81 @@ instance Show SituationMap where show situation = unlines [ [ if - | V2 x y == situation ^. guard . position -> - case situation ^. guard . heading of + | V2 x y == situation ^. mapGuard . position -> + case situation ^. mapGuard . heading of Up -> '^' Right -> '>' Down -> 'v' Left -> '<' - | Set.member (V2 x y) (situation ^. obstacles) -> '#' + | Set.member (V2 x y) (situation ^. mapObstacles) -> '#' | otherwise -> '.' - | x <- [0 .. situation ^. bounds . _x] + | x <- [0 .. situation ^. mapBounds . _x] ] - | y <- [0 .. situation ^. bounds . _y] + | y <- [0 .. situation ^. mapBounds . _y] ] +data PuzzleState + = PuzzleState + { _answerOne :: !Int, + _answerTwo :: !Int + } + deriving (Eq, Generic, Show) + +makeLenses ''PuzzleState + +emptyPuzzleState :: PuzzleState +emptyPuzzleState = PuzzleState 0 0 + main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -partOne :: SituationMap -> Int -partOne = Set.size . go . (Set.empty,) +partOne :: Puzzle SituationMap PuzzleState Int +partOne = do + situation <- ask + answerOne <.= Set.size (go (Set.empty, situation)) where go (visited, situation) = moveGuard situation & \moved -> if guardInBounds moved - then go (Set.insert (moved ^. guard . position) visited, moved) + then go (Set.insert (moved ^. mapGuard . position) visited, moved) else visited -partTwo :: SituationMap -> Int --- partTwo situation = count (not . causesParadox situation) candidates --- where --- candidates = --- [ coords --- | x <- [0 .. situation ^. bounds . _x], --- y <- [0 .. situation ^. bounds . _y], --- let coords = V2 x y, --- coords /= situation ^. guard . position, --- situation ^. obstacles . to (Set.notMember coords) --- ] -partTwo = undefined +partTwo :: Puzzle SituationMap PuzzleState Int +partTwo = do + situation <- ask + let candidates = + [ coords + | x <- [0 .. situation ^. mapBounds . _x], + y <- [0 .. situation ^. mapBounds . _y], + let coords = V2 x y, + coords /= situation ^. mapGuard . position, + situation ^. mapObstacles . to (Set.notMember coords) + ] + + answerTwo <.= count (not . causesParadox situation) candidates causesParadox :: SituationMap -> Coordinates -> Bool -causesParadox situation candidate = go (Set.empty, situation & obstacles %~ Set.insert candidate) +causesParadox situation candidate = go (Set.empty, situation & mapObstacles %~ Set.insert candidate) where go (visited, situation') = moveGuard situation' & \moved -> guardInBounds moved - && ( Set.member (moved ^. guard . position) visited - || go (Set.insert (moved ^. guard . position) visited, moved) + && ( Set.member (moved ^. mapGuard . position) visited + || go (Set.insert (moved ^. mapGuard . position) visited, moved) ) guardInBounds :: SituationMap -> Bool guardInBounds situation = - situation ^. guard . position . to (inRange (0, situation ^. bounds)) + situation ^. mapGuard . position . to (inRange (0, situation ^. mapBounds)) moveGuard :: SituationMap -> SituationMap moveGuard situation = - if Set.member (moved ^. position) (situation ^. obstacles) - then situation & guard . heading %~ csucc & moveGuard - else situation & guard .~ moved + if Set.member (moved ^. position) (situation ^. mapObstacles) + then situation & mapGuard . heading %~ csucc & moveGuard + else situation & mapGuard .~ moved where moved = - (situation ^. guard) & \theGuard -> + (situation ^. mapGuard) & \theGuard -> theGuard & position +~ (theGuard ^. heading . to headingToCoordinates) headingToCoordinates :: Heading -> Coordinates @@ -126,19 +143,19 @@ headingToCoordinates = \case Left -> V2 (-1) 0 getInput :: IO SituationMap -getInput = parseInput situationMap $(inputFilePath) +getInput = parseInputAoC 2024 6 situationMap situationMap :: Parser SituationMap situationMap = - fmap mkSituationMap $ - flip sepEndBy newline $ - some $ - (Empty <$ char '.') - <|> (AnObstacle <$ char '#') - <|> (TheGuard Up <$ char '^') - <|> (TheGuard Down <$ char 'v') - <|> (TheGuard Left <$ char '<') - <|> (TheGuard Right <$ char '>') + fmap mkSituationMap + $ flip sepEndBy newline + $ some + $ (Empty <$ char '.') + <|> (AnObstacle <$ char '#') + <|> (TheGuard Up <$ char '^') + <|> (TheGuard Down <$ char 'v') + <|> (TheGuard Left <$ char '<') + <|> (TheGuard Right <$ char '>') mkSituationMap :: [[Position]] -> SituationMap mkSituationMap = ifoldl' (ifoldl' . go) (SituationMap (pure 0) (Guard (pure 0) Up) Set.empty) @@ -146,14 +163,16 @@ mkSituationMap = ifoldl' (ifoldl' . go) (SituationMap (pure 0) (Guard (pure 0) U go y x situation = \case TheGuard theHeading -> situation - & bounds .~ V2 x y - & guard .~ Guard (V2 x y) theHeading + & mapBounds + .~ V2 x y + & mapGuard + .~ Guard (V2 x y) theHeading AnObstacle -> situation &~ do - bounds .= V2 x y - obstacles %= Set.insert (V2 x y) + mapBounds .= V2 x y + mapObstacles %= Set.insert (V2 x y) Empty -> - situation & bounds .~ V2 x y + situation & mapBounds .~ V2 x y getExample :: IO SituationMap getExample = parseString situationMap example From 092d1ccc8293025fc2c6f204355b9a33964ecdec Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 11 Nov 2025 14:18:49 -0600 Subject: [PATCH 07/91] refactor(2024.07-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2024/day07.txt | 850 ----------------------------- src/AdventOfCode/Year2024/Day07.hs | 41 +- 3 files changed, 31 insertions(+), 862 deletions(-) delete mode 100644 input/2024/day07.txt diff --git a/VERSION b/VERSION index d8e2ba0..03a5876 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.30 \ No newline at end of file +2024.7.2.31 \ No newline at end of file diff --git a/input/2024/day07.txt b/input/2024/day07.txt deleted file mode 100644 index a2fd953..0000000 --- a/input/2024/day07.txt +++ /dev/null @@ -1,850 +0,0 @@ -64288413730: 91 79 4 9 7 8 91 7 30 -230456169: 3 630 12 7 2 1 6 26 3 69 -376955: 7 96 4 914 387 -2102493: 259 8 30 467 9 17 -144043977: 96 25 7 5 1 3 4 5 5 67 3 1 -691452935348: 864 3 16 1 3 8 25 6 348 -3472782: 119 2 384 5 687 -1627001896: 535 1 6 328 3 2 962 4 3 -24644441: 9 5 56 38 35 96 99 569 -48356500: 63 602 3 2 85 5 -21099440: 2 8 7 9 71 83 440 -93442: 33 6 342 7 76 -966401: 96 478 157 5 4 -9016: 88 5 2 3 215 -5278335745: 6 15 86 3 71 1 1 7 88 2 8 -30296778: 64 4 1 6 4 6 9 67 1 6 6 -660549: 14 902 720 42 2 985 -10997299576145: 143 1 94 96 47 8 1 45 -2708767806: 79 774 50 443 3 2 -3826013465684: 8 6 5 88 43 738 65 684 -4370535: 1 9 9 1 308 5 7 921 1 5 5 -268284: 1 4 3 3 3 1 8 38 9 73 3 9 -4932942: 7 908 9 775 67 -57820: 77 3 28 58 121 59 -3213956: 22 633 142 66 3 -2106786228: 220 14 15 1 31 6 22 8 -1810433087: 596 3 4 57 24 74 -6192: 616 412 4 6 -1880: 6 1 6 37 66 2 16 8 -64433821: 60 11 432 38 21 -9206506: 9 92 8 2 3 3 473 3 1 8 1 9 -44815741: 70 25 70 912 3 9 1 60 -116899244: 656 450 36 4 11 -4120: 2 3 8 55 40 -97844: 38 3 638 35 800 8 9 61 -92605659: 4 3 51 4 13 119 5 1 3 5 9 -17907621655925: 78 542 2 228 55 925 -29841: 6 13 136 835 819 25 7 -550207121: 5 6 5 69 3 32 3 5 54 6 6 5 -1493: 6 738 748 1 -2531: 42 6 45 6 749 -5186366: 96 1 6 36 73 1 605 53 -65402895: 6 4 465 3 8 1 5 8 2 7 6 46 -42965118: 9 9 41 9 3 3 137 266 -133: 22 5 8 8 7 -17145528694: 285 754 31 450 6 9 4 -3359666: 101 63 528 -34122760: 4 5 771 5 603 878 6 7 4 -25640341: 94 4 5 5 26 34 200 4 5 -953673600: 9 7 477 9 1 1 6 821 44 8 -44639873: 6 8 50 860 3 811 -384480771: 7 3 6 8 982 6 1 2 5 5 1 9 -1029304074: 35 8 1 7 58 15 1 358 16 -1069598: 70 6 40 28 5 1 -544501335: 825 660 884 449 2 -199: 2 50 5 2 85 -813270371: 951 6 2 37 1 4 955 6 8 3 -110505: 9 24 8 7 3 2 647 6 92 5 8 -93698167500: 90 8 7 95 71 9 375 6 1 -86663168: 5 8 1 74 376 548 9 8 -2025036: 4 3 3 302 45 6 2 6 9 2 2 1 -109466571: 1 89 99 23 175 39 3 4 -5435280217: 258 8 914 81 276 73 -2949251510726: 511 135 443 4 4 577 -2911041: 5 4 7 287 49 -1344423: 6 7 1 444 23 -10156: 9 2 9 39 24 841 6 64 36 -21047040974: 3 4 977 15 810 2 97 5 -179010: 4 5 99 9 90 -294720251715: 545 778 3 4 2 925 2 5 9 -38167353884: 6 731 4 9 5 7 9 83 2 50 -9184176: 481 265 93 72 -115752: 62 6 1 1 80 152 191 6 -284935: 5 92 95 366 381 5 -111632278: 3 582 111 576 22 -56679084: 4 8 1 7 2 3 9 9 322 7 22 -150495424: 5 95 678 5 8 3 2 6 4 8 2 -36540188532: 522 350 94 2 485 47 -25: 1 4 5 -3198840: 135 389 20 8 5 61 -103529984: 6 85 9 565 4 3 5 458 4 -3281192: 1 11 709 298 4 -73545: 77 106 9 9 6 -19570215631: 389 1 582 5 479 6 4 6 7 -983910880: 8 81 83 7 1 39 3 469 1 -16811480: 1 1 7 1 5 3 2 8 6 807 4 14 -480000: 57 85 99 4 341 -65771773: 657 714 3 67 6 -14979801: 27 121 1 7 97 9 2 5 7 4 -1433829668360: 738 9 477 5 503 4 5 2 4 -4071566: 610 2 47 6 71 -48492: 8 6 49 2 -61054: 52 3 3 37 4 -798452: 798 4 52 -606: 6 3 6 6 6 -492637266: 792 3 138 4 6 59 1 3 22 -1944701: 6 4 81 181 520 -13560759004: 802 32 5 4 177 169 91 -11301208011: 7 6 28 8 68 4 97 8 953 1 -524: 4 9 49 69 4 -2213964: 7 188 308 7 53 -80428411552896: 837 795 953 676 96 -3517087665: 96 62 5 2 2 7 9 52 65 -14515851: 85 43 6 3 900 2 42 49 7 -1257: 518 591 71 12 52 9 4 -235514545: 707 1 2 231 7 9 4 8 6 5 -2901484800000: 9 49 965 2 90 60 64 75 -441929: 7 63 44 41 4 75 -85354: 34 3 3 5 3 3 9 2 2 41 3 7 -3003221: 7 5 5 44 30 17 13 -32642292: 32 64 22 83 9 -20541967333: 681 6 798 63 12 97 33 -983147880: 73 14 94 22 65 -6386: 59 91 53 3 961 -10692: 2 2 2 1 8 40 86 7 9 3 66 -98520: 1 691 7 123 30 4 -383636: 7 854 5 8 6 5 3 18 8 4 3 8 -151: 9 6 55 -20328035: 18 37 40 42 220 33 2 -41345871: 4 8 9 4 78 4 850 1 3 7 1 -536775818: 4 3 9 7 6 143 5 46 871 8 -510055797: 9 46 3 539 9 4 -153188743707: 8 25 940 184 6 28 6 27 -182784192: 8 34 64 5 3 7 8 1 6 2 5 43 -161232: 3 2 643 7 7 5 99 -67454: 3 32 8 395 58 -1876: 74 1 3 19 90 304 -203352531293: 78 2 76 376 91 93 -6161474: 9 64 6 635 145 7 5 40 3 -635921842: 2 420 13 7 922 401 1 2 -8645243696: 7 489 589 4 4 8 8 134 1 -2317257234: 1 48 586 9 2 3 83 3 9 6 9 -45236: 12 92 2 10 43 -2880974425: 576 5 747 227 425 -333711769248: 243 800 917 34 6 312 -6188793: 2 192 156 526 201 -382518336: 6 4 890 724 9 5 552 8 -35700: 8 7 98 649 508 5 4 7 -762848067: 2 7 6 7 13 1 9 2 2 8 2 371 -1484000000: 5 625 29 2 7 80 250 7 8 -78746499: 11 663 50 83 81 -15876: 7 56 21 -1617961092: 5 603 440 672 9 132 -1019335531: 6 78 642 39 876 5 10 3 -58975970: 88 2 53 10 338 7 730 1 -99268075559: 262 934 830 755 59 -65373960: 4 7 8 749 6 9 6 7 670 7 1 -24640094683: 412 380 286 311 83 -12459: 59 246 9 101 3 3 -224960: 4 499 2 5 -63304966848: 5 5 55 6 42 2 69 5 68 4 8 -18180610: 12 9 9 606 608 -11636697: 364 74 9 7 8 1 1 6 3 -437: 1 13 4 44 259 -133186599: 386 4 5 7 18 149 9 273 -4296244: 8 5 9 354 518 2 4 442 4 -4991875: 68 807 815 7 -3103: 14 1 2 94 9 -243445: 5 4 84 5 6 22 5 53 3 8 5 -15296463: 8 19 96 4 63 -521668: 6 70 14 39 9 945 7 4 -61008657: 4 2 3 5 3 3 1 960 3 650 4 -213117984: 359 4 6 78 6 986 -238915893: 323 8 9 802 65 30 -3117470880: 234 91 20 1 732 2 -35204825: 4 98 4 6 32 1 66 179 -60297: 11 3 2 85 597 1 -603553213: 8 4 9 793 590 82 9 4 -648871: 79 2 8 520 351 -1090677: 3 8 6 408 94 5 3 7 924 -44526660558: 5 3 3 60 610 8 894 5 -30975402: 82 73 9 13 5 35 3 33 69 -2797: 3 4 8 59 377 9 6 37 -10167816: 16 689 3 1 922 -7116: 43 25 348 5 1 -10080: 7 118 1 16 5 -1286605: 9 57 209 12 1 -5641: 4 28 97 39 1 -25461: 840 3 28 3 168 -24458560: 813 60 2 5 16 28 20 -73836977: 87 943 9 77 1 -111940774200: 3 383 290 774 200 -57424: 5 65 10 912 2 -752385768: 653 8 85 2 4 9 880 5 1 8 -16488406180: 1 3 6 81 4 5 5 3 8 733 7 9 -268263: 45 366 652 20 271 -2302139112: 30 7 71 1 919 21 4 2 -308447: 70 440 32 12 7 -1109158414: 732 482 6 68 449 7 -1142: 31 36 6 13 7 -4311617856: 4 8 7 2 55 3 9 3 3 52 4 4 -55219027853: 829 6 8 1 416 9 89 2 7 3 -600691: 7 9 16 456 65 37 943 -18982810: 640 6 9 324 70 277 1 -2479694880: 8 9 461 42 2 52 710 3 -1725856: 3 91 830 318 110 22 -364307: 7 98 8 45 36 1 335 5 5 4 -416369616212: 7 3 5 9 7 239 6 9 62 1 2 -89372539: 24 86 6 8 43 3 8 7 539 -43649686080: 8 2 504 309 231 392 3 -5450: 452 2 5 455 2 -801918: 9 6 3 1 664 17 3 69 552 -9288627045930: 8 1 91 7 1 9 9 3 588 5 9 2 -502573: 1 6 88 3 5 8 11 2 4 8 957 -2275249227: 96 163 14 878 29 -119336707: 99 150 67 8 707 -56052: 2 30 54 491 78 -94465: 13 90 916 114 1 3 -729008280: 510 637 51 44 -140821: 138 1 1 839 980 -6083854: 8 76 377 4 2 78 -1886890: 14 1 669 8 2 294 -165298320: 3 423 29 5 70 9 297 -1534204989152: 9 588 781 182 2 16 -508326: 85 6 40 775 5 8 2 3 -4992289662: 32 3 583 477 187 30 -151184: 995 717 1 5 88 -133369957: 190 472 56 51 7 -3878781: 3 878 1 78 1 -3795035200: 98 44 540 40 22 -36005207: 4 87 3 8 99 5 830 369 8 -25391193: 70 642 565 85 8 -267540: 44 2 5 5 86 8 3 3 4 3 840 -34060160: 21 7 1 7 7 1 7 245 2 2 2 8 -104810565466: 5 2 3 668 4 48 7 3 4 60 6 -38399: 76 84 3 6 77 -44120979093: 5 6 7 122 5 4 57 541 9 3 -19301102: 13 786 350 4 698 4 -50556: 7 2 6 25 99 3 97 941 8 7 -1347815268: 403 40 6 2 7 17 55 3 -1153200: 2 6 39 1 930 -838660117: 9 6 2 6 8 4 53 72 5 2 120 -69072193807: 972 847 80 71 7 -6112844169: 6 674 43 8 328 57 9 -4195216964: 3 4 452 62 4 39 908 -2042564: 20 42 550 9 5 -23104713: 5 854 34 6 4 98 9 224 -203219: 64 13 23 246 15 1 2 9 -34607812: 23 45 512 994 705 3 -64993245117: 69 3 23 4 6 9 5 63 3 5 48 -12355336316: 74 3 57 259 890 79 4 -48319644808: 3 641 6 47 80 56 931 8 -41944: 465 59 80 24 -5993530053: 599 352 983 22 3 -13679965404: 3 6 4 6 73 6 962 1 3 40 4 -53500: 901 1 340 43 94 -26780520: 95 8 130 13 4 44 8 5 -779624: 23 472 35 5 9 -2879520: 31 3 2 3 9 4 7 4 7 5 2 662 -1251077: 9 3 724 64 5 -65246: 71 30 1 646 1 -16: 6 2 2 -362621273: 55 78 7 8 5 65 248 -85842: 3 89 156 3 342 -1650647484: 21 52 79 81 59 324 -23904929: 85 711 81 2 3 5 3 4 460 -30563647: 339 594 2 9 7 -3219312: 468 2 679 3 1 29 6 138 -966000632: 1 4 8 800 70 629 -138614170: 14 330 441 5 3 925 -10826201861: 664 18 2 8 3 815 215 1 -80625960: 569 53 54 54 72 37 1 -3919632: 6 1 621 8 74 -327364210: 301 9 3 22 2 3 3 4 78 5 2 -115704: 5 1 214 273 13 3 92 8 9 -5561453927: 737 3 653 9 4 428 6 93 -87643296327: 12 22 1 1 78 918 327 -239603: 1 291 3 82 80 3 -3622838: 352 7 86 9 89 38 -148812: 3 832 653 1 2 -16250: 8 4 9 8 7 4 1 1 80 9 9 622 -39296223432: 7 859 2 43 10 5 84 32 2 -259056345: 712 78 77 84 39 93 -989887572: 106 415 5 5 5 9 19 6 47 -5143: 64 80 23 -248304: 5 4 5 5 7 4 978 4 3 6 7 8 -3603692: 19 657 2 65 41 612 -42839616: 8 22 51 27 698 12 368 -98154830131: 973 8 548 30 13 1 -165277175: 2 361 7 7 175 -7780613488: 6 5 3 5 6 13 8 8 606 9 5 8 -18416712: 5 471 2 9 2 964 8 5 8 9 8 -59594828: 586 9 857 4 3 84 30 -790508: 788 93 81 6 70 8 -48543696: 89 8 65 6 32 6 2 831 -72083332391: 5 144 833 323 94 -764137724955: 6 6 3 4 3 8 6 5 48 67 1 67 -526190: 68 386 61 2 8 -4123: 86 556 5 908 5 -64381432554: 773 64 76 5 77 5 75 6 9 -164082757: 3 5 2 6 5 6 4 31 866 4 2 5 -237884584: 26 43 162 90 4 -36083237676: 70 359 56 2 3 14 7 46 6 -1878: 55 246 7 5 6 -457819: 3 3 228 7 807 7 -158996880072: 1 670 11 2 17 9 8 70 7 2 -6701935: 95 7 418 7 9 -110719: 8 502 31 7 7 -319891398: 4 551 655 87 729 878 -833602896: 66 8 84 434 103 3 -185184: 694 969 905 4 72 -213952: 41 1 40 4 63 59 4 16 8 -78931: 1 1 7 3 9 4 943 9 3 9 91 -134301604: 47 133 36 8 36 575 4 -671421: 3 6 2 6 8 2 97 7 4 6 328 5 -70158: 3 13 318 42 5 9 9 -5733100809: 915 4 59 3 8 8 236 7 8 9 -850783995: 696 1 5 25 35 7 23 279 -44154017: 7 35 3 30 6 15 -155318: 17 82 5 312 878 -34876800: 44 2 601 34 180 7 -18226: 981 3 86 6 52 -580372590: 56 86 987 72 590 -719555: 9 978 9 9 9 32 -4605867721045: 657 98 1 101 2 70 4 5 -24647706: 53 35 77 1 6 -7789398384: 778 93 942 7 34 84 -256672710: 320 67 3 3 42 95 -256570381: 249 3 98 62 165 6 -37337764268: 3 18 86 804 4 265 -1143: 4 32 4 8 2 9 980 -26189: 21 5 1 87 -1167: 717 380 70 -4151995878: 3 7 8 868 9 2 777 16 9 5 -20952985: 6 5 298 8 799 9 -658294531020: 6 7 1 6 588 1 5 5 310 2 2 -51940980: 6 8 9 5 9 2 27 4 3 4 546 6 -319465594: 4 46 68 894 7 8 2 -330139509: 823 44 7 93 2 807 49 -4478992: 8 9 6 4 9 5 227 393 7 4 2 -80030190: 4 50 4 292 33 957 -9832310681: 51 79 62 94 4 245 61 -815760: 9 407 972 4 44 -25354826: 160 93 19 35 826 -6151392: 6 1 5 13 93 -3226554: 9 497 91 51 54 -951: 29 756 128 4 34 -9197362: 6 4 2 7 4 6 5 5 14 4 383 -78551: 3 75 542 9 -111194: 281 9 38 99 4 -3928357: 8 49 834 9 8 -169317347: 6 1 7 3 91 3 5 4 9 66 7 47 -32251779: 10 4 2 8 2 9 2 21 53 4 1 7 -30253: 3 6 3 9 1 67 1 6 1 3 22 1 -3433675: 4 7 4 7 95 7 37 5 5 8 60 7 -7657276076: 73 3 2 67 3 617 28 4 9 8 -67351065: 4 422 16 41 5 1 4 241 -4095: 6 5 63 -844326123: 3 488 81 11 152 3 22 3 -1012680: 94 1 439 510 970 -146132303: 44 886 237 663 473 -41212: 73 17 225 97 12 -478035: 8 18 4 34 875 95 3 -58896002381: 917 3 22 2 1 64 237 7 4 -1659008661: 4 377 189 69 11 -1459654: 82 178 54 -18746219682: 6 7 39 1 3 218 2 994 7 6 -678912: 9 359 922 2 320 -4531938: 8 30 2 80 7 78 6 3 5 37 -2857380373: 31 3 84 50 9 2 788 373 -59851224235490: 997 5 15 5 4 6 23 548 9 -246475267: 36 683 7 44 107 4 769 -59518416: 574 1 23 5 6 9 6 8 1 36 6 -2962112: 2 4 54 4 9 9 5 3 7 45 583 -2489850: 301 4 4 4 4 29 25 503 -38062: 21 6 176 2 44 -2069: 6 9 1 9 8 4 3 4 5 6 461 22 -14854350054: 7 9 444 6 2 43 5 3 7 54 -500321: 4 15 64 4 1 4 321 -132252595: 8 5 2 252 5 94 -1434300510592: 700 3 683 510 592 -2411784329: 7 5 5 658 7 2 72 6 8 74 6 -5161755: 3 4 43 175 5 -626940: 6 5 4 9 2 74 7 836 9 270 -18794: 6 3 78 8 8 -16181779274: 53 67 401 6 947 2 53 2 -2620940: 37 3 240 39 20 7 -5358398: 1 4 6 367 21 2 9 7 39 8 -395221248: 2 6 742 910 8 576 -2269: 6 9 9 27 2 973 -23347872: 4 81 271 5 72 -30062928: 82 9 743 683 4 7 -32333: 7 2 298 10 5 1 82 -6065859: 2 8 4 8 9 5 9 4 7 3 8 859 -17176: 75 51 423 46 4 -177918: 8 4 94 95 4 866 388 -19283381223: 4 72 881 63 1 7 76 2 3 -569904: 67 882 8 4 6 -973406: 957 63 38 920 46 -1375428960: 6 37 970 687 48 -221204: 3 384 48 5 4 -9338621: 93 29 9 610 8 -295654092789: 238 55 42 616 2 873 3 -600078: 2 4 25 4 1 971 381 -304: 6 7 4 30 4 -298989664: 7 2 6 2 5 10 6 4 728 5 6 4 -205522805: 395 1 5 4 311 516 2 -270120: 32 8 4 51 4 177 25 60 -77992740: 5 4 5 38 762 3 2 315 1 3 -1412755629: 6 27 8 8 88 77 4 5 1 8 8 5 -236: 52 31 2 49 21 -24200: 8 72 64 3 7 -433162: 1 6 5 76 3 4 2 7 38 23 7 2 -8457022095: 5 9 94 32 89 702 5 2 3 5 -4718519: 7 6 13 52 4 6 1 766 559 -29256: 29 121 83 18 33 -388934891: 7 7 1 89 5 96 447 9 9 8 3 -274063839: 3 9 4 5 97 4 1 7 9 651 -792224259: 613 1 759 9 11 929 69 -5344491730542: 8 888 3 8 295 94 542 -225720: 3 1 9 90 209 -44436: 26 46 1 6 6 5 5 1 5 209 6 -616388: 1 58 2 6 388 -84658: 51 6 330 58 -61095174221: 2 289 7 151 5 741 9 3 1 -624188: 78 82 52 818 101 6 8 -6457: 7 832 1 14 570 42 6 -55512660355615: 6 168 9 660 355 61 5 -29198988: 1 2 9 704 8 9 32 6 2 4 9 -4686110: 781 60 27 83 -327770: 32 99 417 6 8 -1841813297379: 2 91 7 5 8 7 7 921 931 9 -12535012: 6 9 877 34 44 9 28 -1042: 5 7 8 622 62 -1921059: 318 6 5 3 4 2 63 8 1 8 41 -4338080: 3 6 9 88 2 5 608 -1466395: 65 5 161 4 7 1 28 954 5 -2043115844631: 6 92 3 1 952 273 31 2 -20717193: 7 3 16 2 912 533 21 -104593090: 873 25 282 59 946 7 -20760: 829 85 81 43 20 -516280: 1 417 33 38 3 327 7 3 -21824431200: 4 94 726 82 975 -76572: 2 64 79 5 9 6 6 51 5 54 -28421295360: 9 9 9 2 3 375 9 4 48 80 -15725965920: 8 8 45 97 4 226 6 70 7 -2192731311: 481 168 135 3 93 67 -4255: 834 8 9 1 5 -9611124: 31 762 3 815 2 9 4 994 -25331461341: 5 6 7 8 2 2 30 6 8 11 5 9 -1595880: 5 6 5 5 6 4 7 544 9 5 2 99 -3158499: 939 42 525 18 79 -1700028721746: 732 771 232 174 6 -116671594: 9 5 5 5 26 6 6 6 678 23 -323860350: 8 2 8 96 18 32 7 4 4 5 25 -7031: 91 9 1 7 588 -6280294: 704 8 589 59 294 -156529: 6 97 72 21 793 -30518262: 4 4 9 841 7 4 6 9 -696476: 1 5 6 67 5 659 908 40 -203616: 3 98 42 8 6 -70462318290: 74 3 431 119 910 -9170707391: 43 6 99 3 204 176 -1038160: 6 64 7 8 36 5 76 -50937: 490 9 52 345 640 -271152: 5 7 4 26 9 83 4 6 3 813 3 -3022601130: 24 4 311 85 342 159 -15126: 8 885 2 3 963 -24294419586: 5 881 51 106 81 -118272972: 6 3 4 26 8 9 540 3 3 5 7 -4402091685: 27 5 82 399 5 61 561 4 -111859: 64 57 924 18 37 -4914: 347 4 1 14 -594189: 185 3 44 8 4 8 2 6 47 5 4 -1254: 6 181 20 2 6 -781138122: 3 543 3 6 9 74 1 1 40 2 -12630: 9 7 6 68 5 7 6 3 1 3 165 6 -55725: 361 3 293 51 13 3 72 -1143632: 3 38 36 3 2 -153850: 17 9 850 -90216: 3 2 2 5 34 9 3 2 4 3 6 12 -59805: 67 68 443 -393488508995: 56 21 264 413 2 4 6 7 1 -34400: 676 3 672 4 21 25 -157113477: 359 84 521 9 708 -433254: 857 434 15 19 4 326 -10017346: 68 3 927 3 7 346 -1127: 37 3 4 6 7 -9558: 14 627 73 6 701 -26618042: 14 2 12 9 4 4 1 1 66 2 42 -752398826: 8 94 31 8 80 825 -468704: 46 25 7 59 604 -29316000: 61 5 858 2 7 75 758 7 8 -6823711592: 960 6 1 93 4 8 268 398 -2987040: 2 396 7 8 6 7 5 8 4 9 4 60 -77288552: 4 2 2 7 6 835 5 554 4 44 -46036028: 8 73 96 677 10 8 5 4 1 -2297817000: 75 9 5 3 6 63 6 3 34 8 8 -90: 4 6 74 6 -16973082771: 7 97 408 50 4 82 771 -723: 5 57 10 10 3 -4176: 6 305 321 64 6 -210943590: 87 372 2 37 434 4 15 -6583161720: 2 1 9 8 3 85 4 6 249 4 5 6 -236106070257: 4 9 95 9 1 858 59 1 55 2 -137060577: 2 7 2 4 3 1 445 2 1 9 69 2 -3528697210: 5 5 1 3 787 4 958 6 1 2 5 -6464593606244: 64 93 2 62 9 705 3 7 92 -17853: 1 8 647 3 74 310 -2556669358237: 7 6 6 1 3 3 2 92 6 9 823 7 -419724: 857 489 5 1 7 638 -1356: 4 69 58 332 593 97 -27593664: 93 883 8 40 42 -3855768: 97 5 3 96 569 8 826 6 -36893894830: 376 9 140 138 7 79 -15559530: 609 27 6 7 6 9 958 3 9 5 -1718032779: 29 5 77 1 5 587 262 5 -218925: 23 1 50 2 49 175 -3905167349265: 1 46 324 5 1 4 234 843 -181705: 268 404 270 2 263 -10496976: 178 52 588 -52210475: 5 801 1 63 9 8 -7188: 753 5 9 4 362 -241547936: 4 78 3 59 613 8 499 4 -9313: 83 1 5 50 67 -2012816904: 41 68 6 69 1 73 6 9 3 8 -554501: 55 44 99 -7663325508: 4 257 4 20 612 9 -24713450: 120 327 50 629 40 -5602093: 767 41 73 -40578645: 6 32 8 93 8 7 864 1 8 1 -8083151: 37 32 739 31 49 -249871440: 4 26 8 221 7 673 -2634215: 71 7 53 25 54 1 16 23 -324161: 3 22 2 1 61 -106897303: 432 2 4 7 59 8 5 2 7 8 6 7 -229610631: 558 575 733 714 369 -233821310: 9 60 433 812 4 489 5 -39270: 8 68 1 170 3 -18816313732: 3 5 5 78 8 2 3 1 1 4 6 542 -4308: 834 17 4 4 900 -25330058: 140 3 5 596 55 -8808870: 59 65 6 109 798 3 5 4 7 -36541877: 5 865 8 5 2 7 25 75 2 -4321100: 5 8 1 14 5 5 5 5 7 953 7 5 -127410456137: 7 92 918 48 3 8 87 137 -56880: 9 679 2 30 79 -106796160321: 9 4 3 697 4 5 384 6 3 21 -12696353411: 897 912 97 8 2 8 -1317: 5 1 219 -4506067: 52 53 327 5 7 -1032768: 8 6 34 4 72 -47792: 96 468 4 330 8 -148813: 3 2 1 722 29 62 1 84 7 1 -5571: 3 7 8 3 34 81 9 -51032215: 978 8 4 47 584 647 90 -2175: 33 7 7 9 9 24 -21125127855: 5 7 2 6 415 97 785 5 -72657447267: 21 8 2 7 1 3 6 1 9 2 6 857 -13194: 29 614 1 4 1 9 760 5 2 1 -3716117391: 7 53 5 558 559 386 5 -57760884: 91 9 269 2 8 64 9 172 8 -22394853473: 651 50 659 688 81 -28416821412: 947 227 37 1 9 4 3 -135864079: 1 224 370 3 7 1 1 8 -17322991: 2 63 21 7 35 9 3 8 1 57 7 -1876943: 5 374 6 940 3 -29392250: 8 5 955 5 790 445 5 -11138360: 794 6 5 1 1 288 33 7 2 2 -23711710488: 426 3 98 235 9 3 7 24 -748455: 396 813 3 5 615 -2911600: 565 690 8 290 -9350: 933 79 23 9 35 -4444052147: 4 440 3 36 3 3 686 14 7 -37315974494: 138 3 616 5 938 7 1 9 1 -7597472: 834 91 6 74 72 -5660264855: 2 8 599 341 5 851 6 -1004371132: 9 756 276 28 373 -4996: 5 803 1 441 4 -981846: 1 3 64 9 22 37 24 3 6 -62308: 8 8 2 81 2 6 88 -4799: 890 51 5 81 8 5 -3697566: 8 8 45 3 3 261 6 -47147: 697 341 2 5 45 122 -9362: 93 5 3 1 2 -127646682: 875 9 6 5 9 6 8 81 4 8 3 3 -1519106029630: 64 46 86 338 2 7 1 6 4 -4176: 81 5 26 403 5 6 -31200: 6 27 19 6 100 -22557668: 85 6 78 9 37 7 9 1 77 -1838: 43 7 160 5 7 7 1 82 692 -3505: 8 38 6 73 15 8 587 6 -139877308526: 36 2 8 69 7 4 9 459 5 26 -115508: 2 3 52 600 4 6 78 85 99 -73: 54 5 6 5 3 -11117039457: 3 88 97 9 912 516 2 4 9 -101476: 4 27 1 6 3 49 6 6 7 3 882 -71051003108: 3 7 516 5 3 6 79 4 563 -1408920005: 7 6 46 5 4 15 5 8 199 5 -4567288: 7 3 665 62 58 -16547564: 165 4 7 536 27 1 -32420585: 2 1 5 157 59 10 2 5 7 7 8 -5682885: 64 2 85 39 965 -12719252: 73 55 479 48 59 28 -126279: 10 5 7 1 1 9 22 57 2 3 9 -312837: 6 51 4 2 897 3 1 71 3 9 -15251921352: 28 843 8 2 524 58 9 9 8 -19117804: 58 759 585 1 4 -5469282: 449 81 159 1 9 882 -123961840129: 6 5 366 1 8 8 48 6 49 -4538624: 2 26 9 303 28 32 -4647704: 7 1 148 8 8 65 464 -59553166: 91 62 65 68 98 -1749153: 305 1 8 3 2 90 230 1 3 -26877927: 45 4 309 97 86 9 -20403125: 1 92 10 759 755 16 5 -49032608: 52 7 31 7 3 5 85 6 14 3 -266236: 738 18 1 2 8 3 4 9 5 4 8 2 -407523359: 2 213 26 7 2 8 3 6 9 4 9 2 -7964321328: 554 599 7 2 2 24 -5292084975: 49 8 135 849 1 75 -748553: 3 17 831 6 4 963 35 7 1 -858: 4 47 6 9 13 1 -26567147: 37 94 7 26 888 9 -264750906: 1 2 816 499 94 -22072138: 8 92 1 1 45 5 736 3 5 8 -1033: 35 4 6 32 161 -108028: 371 374 144 748 -24629302463: 57 8 15 264 426 -10674: 7 2 1 1 1 29 6 4 2 9 -273064: 572 60 6 428 -3771: 2 87 88 2 1 -1642741: 3 73 4 7 52 7 751 296 8 -8626: 4 4 9 329 2 65 849 459 -4522: 8 24 4 322 7 -4579924800: 48 891 944 5 381 55 -2483: 108 7 8 6 653 896 8 -1639304771: 2 968 169 47 71 -9420800: 5 80 12 87 80 640 -22016: 361 4 6 332 -2757294: 557 50 99 1 143 1 -4034670417625: 479 382 2 5 9 35 7 32 7 -186545: 8 42 8 2 8 3 5 240 894 5 -3367789562: 46 2 9 86 58 97 6 2 -31692758495: 6 1 5 56 92 787 8 84 9 5 -3687221020: 72 1 813 29 92 41 7 5 -1174068: 3 93 54 42 -6212876610: 25 8 29 117 35 887 30 -43997715: 1 466 59 3 10 3 -93053300: 7 705 6 6 72 3 5 2 1 25 2 -824971261: 6 30 44 150 97 12 61 -790043: 7 33 6 570 23 -1446700: 3 52 6 31 4 32 10 74 5 -188697796: 899 325 8 826 28 23 -62128108: 9 98 2 1 2 8 55 4 4 33 57 -269606526: 2 2 7 4 7 1 451 23 5 1 26 -40727: 637 19 61 670 41 -163974862: 4 6 70 8 6 99 5 5 5 7 2 -24957571896: 36 77 8 2 60 3 5 1 36 8 9 -398337: 753 529 1 -12531000: 995 76 156 4 75 -2369268: 2 9 1 4 6 5 1 975 1 9 8 1 -959968: 5 576 2 8 58 4 2 23 7 9 -19277779: 3 6 1 272 48 523 9 62 1 -2875: 5 76 99 6 -8752751700: 3 5 85 3 467 7 97 503 7 -63187: 84 6 7 396 9 -816126443: 6 796 4 6 6 322 2 3 -6447556730: 1 6 9 31 4 9 4 9 93 5 358 -1106: 3 31 8 6 88 -57056: 36 154 3 5 6 -2763419: 6 2 291 113 99 79 1 7 1 -32718971: 7 1 4 1 3 50 9 9 4 3 57 74 -120490076: 66 3 9 44 9 719 4 8 7 1 -6979920: 8 476 2 4 916 -6022045712: 1 601 167 36 9 3 64 12 -3436825088958: 143 8 239 50 88 957 -1481427625: 513 6 7 9 7 6 10 5 8 4 8 7 -1097550866074: 1 6 775 6 30 9 62 3 9 2 5 -1184486: 6 419 3 92 454 -1925030: 9 1 385 5 33 -1880172960: 926 72 7 4 3 9 1 9 94 1 -40501: 54 81 8 580 8 7 13 -234501: 66 9 1 5 70 -774432958: 484 80 7 6 2 6 958 -47851667615: 4 37 74 562 31 676 16 -1663446: 1 416 195 48 1 4 4 4 5 -46525: 56 827 202 6 5 -67840: 778 841 68 9 40 -119681348: 95 1 6 5 2 538 1 78 19 1 -1835433995913: 89 6 1 2 19 9 22 8 5 7 9 7 -3885633: 79 3 61 299 733 -1181222869: 14 89 94 993 5 2 871 -2259044: 2 511 49 829 87 2 -17659147653: 46 980 683 7 4 51 17 9 -8045506: 7 5 901 53 2 -14702223: 7 41 5 6 8 714 1 9 5 84 9 -40774706027: 44 4 95 70 77 467 3 52 -5550286445: 118 2 619 3 391 92 9 5 -565023096: 9 842 4 94 706 -55020: 248 83 9 8 4 5 620 -4796172: 58 50 93 9 3 2 673 786 -397644: 464 95 9 914 10 -3659947200: 98 585 7 240 38 -358785: 49 8 8 4 91 511 2 63 -21695046156: 9 785 6 930 3 4 3 7 4 81 -35339440: 7 1 5 33 1 880 56 7 8 -19456494: 122 219 3 42 57 -555189: 5 5 44 7 92 -55080183: 51 5 54 4 18 4 -167633333: 95 18 544 98 10 6 4 -509490: 32 18 278 4 466 544 9 -2671515: 3 690 771 5 -2178627673: 2 3 660 93 2 66 6 2 611 -1255776654369: 39 3 3 3 65 6 4 9 807 69 -1955515: 5 39 5 515 -4163520: 849 2 8 8 9 5 4 55 8 4 5 3 -297664269: 705 7 703 2 6 -1007957788: 7 86 5 1 16 9 1 370 9 8 8 -615600: 64 340 5 16 1 2 3 240 3 -671839: 2 957 7 7 7 -3679364: 4 2 36 9 6 2 8 6 8 682 4 4 -62349: 670 30 1 682 3 -74659416: 154 894 1 71 542 -13959000: 9 8 16 23 990 12 -52121632680: 5 212 1 632 680 -23815369: 8 4 7 1 66 4 897 90 7 7 5 -12089111: 120 61 28 111 -7895087415: 87 16 431 21 9 4 4 1 9 3 -544726: 53 1 3 3 7 2 4 4 3 3 1 26 -1016850240: 686 2 7 294 9 999 9 5 8 -712700: 5 8 62 9 3 63 8 9 2 844 5 -2292959459: 806 3 5 3 4 7 2 79 4 2 59 -415885666: 1 593 1 7 85 666 -2210: 1 9 3 532 798 868 -497834: 116 45 627 151 83 -216: 1 24 92 -1289365: 8 9 5 8 36 4 6 4 579 7 85 -67194816: 61 8 2 5 2 7 8 168 2 24 8 -81180: 2 83 226 598 82 -444550: 2 2 6 8 132 7 267 533 5 -253291776: 6 422 88 3 776 -520783740: 6 803 1 739 6 2 4 30 29 -6665: 8 7 119 -26535678: 10 9 6 4 5 7 69 1 2 4 324 -8909439693: 68 1 27 89 634 86 -108976: 50 89 28 4 1 7 -203112: 109 5 9 97 312 -6275557: 4 919 851 505 558 -59162940: 37 59 5 8 174 3 45 662 -4850: 9 523 6 63 74 -162291876: 53 11 98 2 75 7 447 3 3 -8361: 62 120 921 -2591: 87 23 590 -22457724: 5 6 3 8 448 68 28 876 1 -15640: 39 3 3 50 92 -1042002: 42 35 71 45 657 -2872147: 4 4 9 303 6 6 1 6 48 1 6 -135749: 44 5 9 7 303 5 -610317680964: 428 29 5 3 948 4 501 -3614347: 899 3 620 5 544 1 2 2 9 -2474220095: 7 4 5 660 6 7 76 68 7 95 -9754295: 91 5 7 71 145 -2440505: 21 911 87 5 479 -906663: 841 401 73 2 1 -326593610: 9 4 9 64 50 9 37 8 5 5 7 -7856: 46 8 24 8 2 -56728: 48 653 6 75 8 -26446421444: 84 3 9 8 2 2 352 485 2 2 -14309064: 29 1 924 89 6 -10858132837: 7 3 91 6 92 2 1 328 37 -110031480: 4 62 4 4 8 681 6 68 9 1 -183270830160: 2 87 5 3 3 7 728 6 9 5 8 6 -1738170: 117 3 55 8 90 -199413405: 72 8 1 5 8 4 8 8 30 5 9 -1024078: 58 882 2 90 4 1 9 1 9 1 -81018144: 15 399 604 6 54 -380432: 11 880 4 34 8 -756904320: 47 4 237 960 29 4 31 9 -37875841: 292 9 32 826 5 841 -18946: 611 31 5 -425004648: 804 659 83 9 35 1 -98830163: 455 2 6 23 181 -42235404: 5 844 3 540 4 -121345: 24 2 64 5 5 -18213336617: 416 9 3 6 6 81 617 -13878207: 554 25 22 6 166 40 -17332152: 3 5 91 12 34 9 5 3 3 4 3 8 -486720: 17 35 4 5 468 -69521: 18 5 2 746 889 -24464: 5 9 87 81 902 4 -579680: 1 9 5 1 1 497 53 8 8 6 16 -70545148: 37 22 8 3 7 5 7 4 3 56 9 7 -92546164: 9 2 511 35 164 -502900448688: 274 8 3 631 2 752 594 -261583474: 2 485 130 770 64 1 74 -8324640: 6 9 25 9 2 8 10 2 47 24 5 -883927: 9 774 169 72 5 859 16 -2363058: 11 579 763 4 6 -229942971699: 2 9 7 6 3 989 9 2 8 68 5 5 -88762181: 59 174 69 15 146 -535: 1 374 1 19 142 -3896068701: 81 1 68 1 80 88 696 6 -1821052: 2 481 734 -5695164: 181 7 841 91 36 -64607163: 3 6 5 9 6 18 7 97 14 2 3 -4459905363: 8 7 92 1 6 5 6 14 4 9 363 -10759540: 92 266 93 6 73 70 -74132578800: 460 69 335 84 83 -20723: 4 25 8 38 9 19 2 7 88 6 -29782203: 8 37 106 73 947 -1921715: 9 5 2 2 9 3 160 8 2 3 3 11 -145152: 6 4 39 6 89 58 56 -1493436877681: 7 5 426 1 66 5 3 82 6 81 -576576: 641 14 88 17 6 -64908: 56 4 4 228 463 22 71 -245893417888: 1 251 7 56 351 4 712 -2880342529218: 4 5 2 236 7 352 9 3 4 27 -108: 8 82 7 5 6 -14683: 3 8 6 98 185 -3410036: 8 16 18 526 339 6 -225840: 43 35 6 3 5 -64: 51 3 7 3 -43632269352: 971 234 9 7 127 27 8 -182654: 7 352 2 74 10 5 90 2 63 -8353994736: 83 53 994 733 3 -42552965: 351 70 50 6 3 96 4 96 5 -18379: 9 1 1 7 85 7 9 -65703: 929 9 69 1 1 25 940 6 8 -703626: 35 14 31 4 462 -4838557434: 80 553 59 6 183 743 4 -33374592: 2 9 2 71 4 24 888 -19947875: 717 7 6 3 5 5 51 8 6 532 -140339: 4 369 95 41 78 -6506952: 814 1 69 8 920 709 3 -50887: 525 5 95 287 250 -65062632: 836 85 163 377 2 6 -6662009528: 66 618 7 4 9 9 3 8 14 8 -3053345: 8 500 89 6 5 -72140629: 86 8 5 5 5 599 6 2 7 1 6 2 -4499: 8 7 99 7 7 3 2 1 -15752202: 7 3 895 8 44 3 1 33 2 5 7 -4928388480: 100 2 16 93 8 3 80 69 -109: 6 17 7 -5292008: 2 8 94 946 3 8 2 45 1 3 4 -9845309045: 8 77 872 3 6 532 5 -816929: 121 683 12 9 31 -1267274913: 22 8 72 749 13 -725976138: 2 63 99 783 11 7 -170838486: 1 1 7 3 350 4 7 2 3 6 8 6 -3252: 10 63 8 5 5 1 36 -4890566972: 488 463 593 689 8 2 -305667295613: 796 96 823 845 4 233 -87885: 9 77 1 19 837 -371014: 180 7 5 41 577 -19697057: 98 2 505 199 37 -8286699609: 7 299 91 46 7 3 39 9 9 -857291: 80 1 73 674 98 84 -921274333: 376 926 6 63 86 2 3 1 7 -540968278: 7 118 76 275 diff --git a/src/AdventOfCode/Year2024/Day07.hs b/src/AdventOfCode/Year2024/Day07.hs index 82c06f0..3ef53b6 100644 --- a/src/AdventOfCode/Year2024/Day07.hs +++ b/src/AdventOfCode/Year2024/Day07.hs @@ -1,4 +1,5 @@ {-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE NoImplicitPrelude #-} -- | -- Module : AdventOfCode.Year2024.Day07 @@ -31,12 +32,13 @@ module AdventOfCode.Year2024.Day07 ) where -import AdventOfCode.Input (parseInput, parseString) -import AdventOfCode.TH (defaultMain, inputFilePath) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle (Puzzle, runPuzzle) +import AdventOfCode.TH (evalPuzzle) import AdventOfCode.Util (numDigits) +import Control.Lens (makeLenses, (<.=)) import Data.Foldable (foldrM) -import Data.List.NonEmpty (NonEmpty (..)) -import Data.Maybe (mapMaybe) +import Relude import Text.Trifecta (Parser, char, decimal, newline, sepEndBy, sepEndByNonEmpty, string) -- $intro @@ -82,21 +84,37 @@ execInverseOperation operator x y = (d, m) = y `divMod` (10 ^ pow) in [d | m == x] +data PuzzleState + = PuzzleState + { _answerOne :: !Int, + _answerTwo :: !Int + } + deriving (Eq, Generic, Show) + +makeLenses ''PuzzleState + +emptyPuzzleState :: PuzzleState +emptyPuzzleState = PuzzleState 0 0 + -- | Solve the puzzle and print the results. main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -- | Calibrate the equations using addition and multiplication. -- -- @partOne = 'calibrate' ['(:+:)', '(:*:)']@ -partOne :: [CalibrationEquation] -> Int -partOne = calibrate [(:+:), (:*:)] +partOne :: Puzzle [CalibrationEquation] PuzzleState Int +partOne = do + equations <- ask + answerOne <.= calibrate [(:+:), (:*:)] equations -- | Calibrate the equations using addition, multiplication, and concatenation. -- -- @partTwo = 'calibrate' ['(:+:)', '(:*:)', '(:||:)']@ -partTwo :: [CalibrationEquation] -> Int -partTwo = calibrate [(:+:), (:*:), (:||:)] +partTwo :: Puzzle [CalibrationEquation] PuzzleState Int +partTwo = do + equations <- ask + answerTwo <.= calibrate [(:+:), (:*:), (:||:)] equations -- | Given a list of operators and a list of calibration equations, compute the -- sum of the test values from just the equations that could possibly be true. @@ -148,14 +166,15 @@ isPossible operators (testValue, operand :| operands) = -- | Parse the input into a list of calibration equations. getInput :: IO [CalibrationEquation] -getInput = parseInput (calibrationEquation `sepEndBy` newline) $(inputFilePath) +getInput = parseInputAoC 2024 7 (calibrationEquation `sepEndBy` newline) -- | Parse a calibration equation. calibrationEquation :: Parser CalibrationEquation calibrationEquation = (,) <$> (decimalInt <* string ": ") - <*> decimalInt `sepEndByNonEmpty` char ' ' + <*> decimalInt + `sepEndByNonEmpty` char ' ' where decimalInt = fromInteger <$> decimal From d687da5c675b2601c123d8db295035c90a8b01a6 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 11 Nov 2025 14:40:02 -0600 Subject: [PATCH 08/91] refactor(2015.01-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2015/day01.txt | 1 - package.yaml | 5 +---- src/AdventOfCode/SimplePuzzle.hs | 13 +++++++++++++ src/AdventOfCode/Year2015/Day01.hs | 26 ++++++++++++++------------ 5 files changed, 29 insertions(+), 18 deletions(-) delete mode 100644 input/2015/day01.txt create mode 100644 src/AdventOfCode/SimplePuzzle.hs diff --git a/VERSION b/VERSION index 03a5876..ad28f80 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.31 \ No newline at end of file +2024.7.2.32 \ No newline at end of file diff --git a/input/2015/day01.txt b/input/2015/day01.txt deleted file mode 100644 index becde71..0000000 --- a/input/2015/day01.txt +++ /dev/null @@ -1 +0,0 @@ -((((()(()(((((((()))(((()((((()())(())()(((()((((((()((()(()(((()(()((())))()((()()())))))))))()((((((())((()))(((((()(((((((((()()))((()(())()((())((()(()))((()))()))()(((((()(((()()))()())((()((((())()())()((((())()(()(()(((()(())(()(())(((((((())()()(((())(()(()(()(())))(()((((())((()))(((()(()()(((((()()(()(((()(((((())()))()((()(()))()((()((((())((((())(()(((())()()(()()()()()(())((((())((())(()()))()((((())))((((()())()((((())((()())((())(())(((((()((((()(((()((((())(()(((()()))()))((((((()((())()())))(((()(()))(()()(()(((()(()))((()()()())((()()()(((())())()())())())((()))(()(()))(((((()(()(())((()(())(())()((((()())()))((((())(())((())())((((()(((())(())((()()((((()((((((()(())()()(()(()()((((()))(())()())()))(())))(())))())()()(())(()))()((()(()(())()()))(()())))))(()))(()()))(())(((((()(()(()()((())()())))))((())())((())(()(())((()))(())(((()((((((((()()()(()))()()(((()))()((()()(())(())())()(()(())))(((((()(())(())(()))))())()))(()))()(()(((((((()((((())))())())())())()((((((((((((((()()((((((()()()())())()())())())(())(())))())((()())((()(()))))))()))))))))))))))))())((())((())()()))))))(((()((()(()()))((())(()()))()()())))(())))))))(()(((())))())()())))()()(())()))()(()))())((()()))))(()))))()))(()()(())))))))()(((()))))()(()))(())())))))()))((()))((()))())(())))))))))((((())()))()))()))())(())()()(())))())))(()())()))((()()(())))(())((((((()(())((()(((()(()()(())))()))))))()))()(()((()))()(()))(()(((())((((())())(())(()))))))))())))))))())())))))())))))()()(((())()(()))))))))())))))(())()()()))()))()))(()(())()()())())))))))())()(()(()))))()()()))))())(()))))()()))))()())))))(((())()()))(()))))))))))()()))))()()()))))(()())())()()())()(()))))()(()))(())))))))(((((())(())())()()))()()))(())))))()(()))))(())(()()))()())()))()))()))()))))())()()))())())))(()))(()))))))())()(((())()))))))))()))()())))())))())))()))))))))))()()))(()()))))))(())()(()))))())(()))))(()))))(()())))))())())()()))))())()))))))))(()))))()))))))()(()())))))))()))())))())))())))())))))))())(()()))))))(()())())))()())()))))))))))))))())))()(())))()))())()()(())(()()))(())))())()())(()(()(()))))())))))))))))())(()))()))()))))(())()())()())))))))))))()()))))))))))))())())))))(()())))))))))))())(())))()))))))))())())(()))()))(())))()))()()(())()))))))()((((())()))())())))))()))()))))((()())()))))())))(())))))))))))))))))()))))()()())()))()()))))())()))((()())))())))(()))(()())))))))()))()))))(())))))))(())))))())()()(()))())()))()()))))())()()))))())()))())))))))(()))))()())()))))))))(()))())))(()))()))))(())()))())())(())())())))))))((((())))))()))()))()())()(())))()))()))()())(()())()()(()())()))))())())))))(()))()))))())(()()(())))))(())()()((())())))))(())(())))))))())))))))))()(())))))))()())())())()(()))))))))(()))))))))())()()))()(()))))))()))))))())))))))(())))()()(())()())))))(((())))()((())()))())))(()()))())(())())))()(((()())))))()(()()())))()()(()()(()()))())()(()()()))())()()))()())(()))))())))))())))(())()()))))(()))))(())(()))(())))))()()))()))))())()))()()(())())))((()))())()))))))()()))))((()(()))))()()))))))())))))())(()((()())))))))))))()())())))()))(()))))))(()))(())()())))(()))))))))())()()()()))))(()())))))))((())))()))(()))(())(())()())()))))))))(())))())))(()))()()))(()()))(()))())))()(())))())((()((()(())))((())))()))))((((())())()())))(())))()))))))())(()()((())))())()(()())))))(()())()))())))))))((())())))))))(()(()))())()()(()()(((()(((()())))))()))))))()(())(()()((()()(())()()))())()())()))()())())())))))))(((())))))))()()))))))(((())()))(()()))(()()))))(()(()()((((())()())((()()))))(()(())))))()((()()()())()()((()((()()))(()))(((()()()))(((())))()(((())()))))))((()(())())))(()())(((((()(()))(()((()))(()())()))))(()(()))()(()))(())(((())(()()))))()()))(((()))))(()()()()))())))((()()()(())()))()))))()()))()))))))((((((()()()))))())((()()(((()))))(()(())(()()())())())))()(((()()))(())((())))(()))(()()()())((())())())(()))))()))()((()(())()(()()(())(()))(())()))(())(()))))(())(())())(()()(()((()()((())))((()))()((())))(((()()()()((((()))(()()))()()()(((())((())())(()()(()()()))()((())(())()))())(((()()(())))()((()()())()())(()(())())(((())(())())((())(())()(((()()))(())))((())(()())())(())((()()()((((((())))((()(((((())()))()))(())(()()))()))(())()()))(())((()()())()()(()))())()((())))()((()()())((((()())((())())())((()((()))()))((())((()()(()((()()(((())(()()))))((()((())()(((())(()((())())((())(()((((((())())()(()())()(())(((())((((((()(())(()((()()()((()()(()()()())))()()(((((()()))()((((((()))()(()(()(()(((()())((()))())()((()))(())))()))()()))())()()))())((((())(()(()))(((((((())(((()(((((()(((()()((((())(((())())))(()()()(()(()))()))((((((()))((()(((()(())((()((((()((((((())(((((())))(((()(()))))(((()(((())()((())(()((()))(((()()(((())((((()(()(((((()))(((()(((((((()(()()()(()(()(()()())(())(((((()(())())()())(()(()(()))()(()()()())(()()(()((()))()((())())()(()))((())(()))()(()))()(((()(()(()((((((()()()()())()(((((()()(((()()()((()(((((()))((((((((()()()(((((()))))))(()()()(())(()))(()()))))(())()))(((((()(((((()()(()(()())(((()))((((()((()(()(()((()(()((())))()(((()((()))((()))(((((((((()((()((()(())))()((((()((()()))((())(((()(((((()()(()(()()((()(()()()(((((((())())()())))))((((()()(()))()))(()((())()(()(((((((((()()(((()(()())(()((()())((())())((((()(((()(((()((((()((()((((()(()((((((())((((((((((((()()(()()((((((((((((((()((()()))()((((((((((((())((((()(()())((()(()(()))()(((((()()(((()()))()())(())((()(((((()((())(((((()((()(((((()))()()((((())()((((())(((((((((()(())(()(())))())(()((())(((())(())(())())(()(()(())()()((()((())()(((()(((((()(())))()(((()((())))((()()()(((()(((()((()(()(())(()((()())(()(()(((()(((((((((())(()((((()()))(()((((()()()()(((()((((((((()(()()((((((()(()()(()((()((((((((((()()(((((((()())(())))(((()()))(((((()((()()())(()()((((())((()((((()))))(())((()(()()(((()(()(((()((((()(((((()))())())(()((())()))(((()())((())((())((((()((()((((((())(()((((()()))((((((())()(()))((()(((())((((((((((()()(((((()(((((()((()()()((((())))(()))()((()(())()()((()((((((((((()((())(())(((((()(()(()()))((((()((((()()((()(((()(((((((((()(()((()((()))((((((()(((())()()((()(((((((()())))()()(()((()((()()(((()(()()()()((((()((())((((()(((((((((()(((()()(((()(()(((()(((()((())()(()((()(()(()(()))()(((()))(()((((()((())((((())((((((())(()))(()((((())((()(()((((((((()()((((((()(()(()()()(())((()((()()(((()(((((((()()((()(((((((()))(((((()(((()(()()()(()(((()((()()((())(()(((((((((()(()((()((((((()()((())()))(((((()((())()())()(((((((((((()))((((()()()()())(()()(()(()()))()))(()))(()(((()()))())(()(()))()()((())(()())()())()(()))()))(()()(()((((((())((()(((((((((((()(())()((()(()((()((()(()((()((((((((((()()())((())()(())))((())()())()(((((()(()())((((()((()(())(()))(((())()((()))(((((())(()))()()(()))(((())((((()((((()(())))(((((((()))))())()())(())((())()(()()((()(()))()(()()(()()((()())((())((()()))((((()))()()))(()()(())()()(((((()(())((()((((()))()))(()())())(((()()(()()))(())))))(()))((())(((((()((((()))()((((()))()((())(((())))(((()())))((()(()()(( diff --git a/package.yaml b/package.yaml index b0e9cb0..8923e09 100644 --- a/package.yaml +++ b/package.yaml @@ -83,6 +83,7 @@ _executable: &executable other-modules: - AdventOfCode.Input - AdventOfCode.Puzzle + - AdventOfCode.SimplePuzzle - AdventOfCode.TH - AdventOfCode.Util - Paths_advent_of_code @@ -91,10 +92,6 @@ executables: aoc-2015-day01: <<: *executable main: AdventOfCode.Year2015.Day01 - other-modules: - - AdventOfCode.Input - - AdventOfCode.TH - - Paths_advent_of_code aoc-2015-day02: <<: *executable main: AdventOfCode.Year2015.Day02 diff --git a/src/AdventOfCode/SimplePuzzle.hs b/src/AdventOfCode/SimplePuzzle.hs new file mode 100644 index 0000000..ccc896c --- /dev/null +++ b/src/AdventOfCode/SimplePuzzle.hs @@ -0,0 +1,13 @@ +module AdventOfCode.SimplePuzzle + ( runPuzzle, + SimplePuzzle, + emptyPuzzleState, + ) +where + +import AdventOfCode.Puzzle (Puzzle (..)) + +type SimplePuzzle i a = Puzzle i () a + +emptyPuzzleState :: () +emptyPuzzleState = () diff --git a/src/AdventOfCode/Year2015/Day01.hs b/src/AdventOfCode/Year2015/Day01.hs index c4c29e7..bac440b 100644 --- a/src/AdventOfCode/Year2015/Day01.hs +++ b/src/AdventOfCode/Year2015/Day01.hs @@ -1,22 +1,24 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2015.Day01 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) -import Control.Applicative ((<|>)) -import Data.Functor (($>)) -import Data.List (elemIndex, scanl') -import Text.Trifecta (char, some) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) +import Data.List (elemIndex) +import Relude +import Text.Trifecta (char) main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -partOne :: [Int] -> Int -partOne = sum +partOne :: SimplePuzzle [Int] Int +partOne = asks sum -partTwo :: [Int] -> Maybe Int -partTwo = elemIndex (-1) . scanl' (+) 0 +partTwo :: SimplePuzzle [Int] (Maybe Int) +partTwo = asks (elemIndex (-1) . scanl' (+) 0) getInput :: IO [Int] -getInput = parseInput (some instruction) $(inputFilePath) +getInput = parseInputAoC 2015 1 (some instruction) where instruction = (char '(' $> 1) <|> (char ')' $> -1) From 12e0e138afcadaceaf2f7062a7231d2885e6aac1 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 11 Nov 2025 16:59:48 -0600 Subject: [PATCH 09/91] refactor(2015.02-haskell): adopt advent-of-code-api --- VERSION | 2 +- package.yaml | 4 --- src/AdventOfCode/Year2015/Day02.hs | 49 +++++++++++++++++++----------- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/VERSION b/VERSION index ad28f80..a690143 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.32 \ No newline at end of file +2024.7.2.33 \ No newline at end of file diff --git a/package.yaml b/package.yaml index 8923e09..69c4d54 100644 --- a/package.yaml +++ b/package.yaml @@ -95,10 +95,6 @@ executables: aoc-2015-day02: <<: *executable main: AdventOfCode.Year2015.Day02 - other-modules: - - AdventOfCode.Input - - AdventOfCode.TH - - Paths_advent_of_code dependencies: - extra - linear diff --git a/src/AdventOfCode/Year2015/Day02.hs b/src/AdventOfCode/Year2015/Day02.hs index 5f7107e..25c9354 100644 --- a/src/AdventOfCode/Year2015/Day02.hs +++ b/src/AdventOfCode/Year2015/Day02.hs @@ -1,3 +1,7 @@ +{-# LANGUAGE ApplicativeDo #-} +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2015.Day02 ( main, partOne, @@ -6,23 +10,27 @@ module AdventOfCode.Year2015.Day02 ) where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) -import Data.List.Extra (sumOn') -import Linear (V3 (..)) -import Text.Trifecta (char, natural, some) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) +import Control.Foldl qualified as Foldl +import Control.Lens (view) +import Control.Monad (ap) +import Linear (V3 (..), _yzx) +import Relude +import Text.Trifecta (char, natural) main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -partOne :: [V3 Integer] -> Integer -partOne = sumOn' paperNeededFor +partOne :: SimplePuzzle [V3 Integer] (Maybe Integer) +partOne = asks (fmap getSum . foldMap paperNeededFor) -partTwo :: [V3 Integer] -> Integer -partTwo = sumOn' ribbonNeededFor +partTwo :: SimplePuzzle [V3 Integer] (Maybe Integer) +partTwo = asks (fmap getSum . foldMap ribbonNeededFor) getInput :: IO [V3 Integer] -getInput = parseInput (some box) $(inputFilePath) +getInput = parseInputAoC 2015 2 (some box) where box = V3 @@ -30,11 +38,16 @@ getInput = parseInput (some box) $(inputFilePath) <*> (natural <* char 'x') <*> natural -paperNeededFor :: (Ord a, Num a) => V3 a -> a -paperNeededFor (V3 l w h) = minimum sides + 2 * sum sides - where - sides = V3 (l * w) (w * h) (h * l) +paperNeededFor :: (Ord a, Num a) => V3 a -> Maybe (Sum a) +paperNeededFor = + (*) `ap` view _yzx >>> Foldl.fold do + m <- Foldl.minimum + z <- 2 * Foldl.sum + return (Sum . (z +) <$> m) -ribbonNeededFor :: (Ord a, Num a) => V3 a -> a -ribbonNeededFor dimensions = - product dimensions + 2 * (sum dimensions - maximum dimensions) +ribbonNeededFor :: (Ord a, Num a) => V3 a -> Maybe (Sum a) +ribbonNeededFor = Foldl.fold do + p <- Foldl.product + z <- Foldl.sum + x <- Foldl.maximum + return (Sum . (p +) . (2 *) . (z -) <$> x) From 873555d93700e3ca0d2d5cd481666d7792f212f9 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 11 Nov 2025 17:33:16 -0600 Subject: [PATCH 10/91] refactor(2023.01-haskell): adopt advent-of-code-api --- VERSION | 2 +- src/AdventOfCode/Input.hs | 21 ++++++++++++--- src/AdventOfCode/Year2023/Day01.hs | 41 +++++++++++++++++++----------- 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/VERSION b/VERSION index a690143..8527457 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.33 \ No newline at end of file +2024.7.2.34 \ No newline at end of file diff --git a/src/AdventOfCode/Input.hs b/src/AdventOfCode/Input.hs index f0911dc..b19bee6 100644 --- a/src/AdventOfCode/Input.hs +++ b/src/AdventOfCode/Input.hs @@ -2,7 +2,14 @@ {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE NoImplicitPrelude #-} -module AdventOfCode.Input where +module AdventOfCode.Input + ( parseInput, + parseInputAoC, + parseString, + rawInput, + rawInputAoC, + ) +where import Advent (AoC (..), AoCUserAgent (..), defaultAoCOpts, mkDay_, runAoC_) import Data.ByteString.UTF8 qualified as UTF8 @@ -28,10 +35,8 @@ parseInputAoC year day parser = do case runParser parser mempty input of Success result -> pure result Failure reason -> error (show reason) - where - userAgent = AoCUserAgent "github.com/yurrriq/advent-of-code" "eric@ericb.me" -parseString :: Parser a -> String -> IO a +parseString :: (MonadIO m) => Parser a -> String -> m a parseString parser = Trifecta.parseString parser mempty >>> \case Success result -> pure result @@ -39,3 +44,11 @@ parseString parser = rawInput :: FilePath -> IO String rawInput = getDataFileName >=> readFileBS >>> fmap UTF8.toString + +rawInputAoC :: Integer -> Integer -> IO String +rawInputAoC year day = do + opts <- defaultAoCOpts userAgent year <$> getEnv "AOC_SESSION_KEY" + toString <$> runAoC_ opts (AoCInput (mkDay_ day)) + +userAgent :: AoCUserAgent +userAgent = AoCUserAgent "github.com/yurrriq/advent-of-code" "eric@ericb.me" diff --git a/src/AdventOfCode/Year2023/Day01.hs b/src/AdventOfCode/Year2023/Day01.hs index 3fc9e22..ff458d3 100644 --- a/src/AdventOfCode/Year2023/Day01.hs +++ b/src/AdventOfCode/Year2023/Day01.hs @@ -1,30 +1,39 @@ -module AdventOfCode.Year2023.Day01 where +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE NoImplicitPrelude #-} -import AdventOfCode.Input (parseString, rawInput) -import AdventOfCode.TH (defaultMainIO, inputFilePath) -import AdventOfCode.Util ((<.>)) -import Control.Applicative ((<|>)) -import Control.Monad (void) +module AdventOfCode.Year2023.Day01 + ( main, + getInput, + partOne, + partTwo, + examples, + ) +where + +import AdventOfCode.Input (parseString, rawInputAoC) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) import Data.Char (digitToInt) import Data.List.NonEmpty qualified as NE +import Relude import Text.Parser.LookAhead (lookAhead) import Text.Trifecta hiding (digit, parseString) import Text.Trifecta qualified as Trifecta main :: IO () -main = $(defaultMainIO) +main = $(evalPuzzle) getInput :: IO String -getInput = rawInput $(inputFilePath) +getInput = rawInputAoC 2023 1 -partOne :: String -> IO Int +partOne :: SimplePuzzle String Int partOne = calibrate digit -partTwo :: String -> IO Int +partTwo :: SimplePuzzle String Int partTwo = calibrate digitOrSpelledDigit -calibrate :: Parser Int -> String -> IO Int -calibrate p = sum <.> parseString (calibrationDocument p) +calibrate :: Parser Int -> SimplePuzzle String Int +calibrate = fmap sum <=< asks . parseString . calibrationDocument calibrationDocument :: Parser Int -> Parser [Int] calibrationDocument p = (calibrationValue <$> NE.some1 p) `sepEndBy` newline @@ -43,8 +52,9 @@ digitOrSpelledDigit = pure d where skipLetters = - void . manyTill letter $ - lookAhead + void + . manyTill letter + $ lookAhead ( void spelledDigit <|> void Trifecta.digit <|> void newline @@ -65,7 +75,8 @@ spelledDigit = examples :: [String] examples = - unlines + toString + . unlines <$> [ [ "1abc2", "pqr3stu8vwx", "a1b2c3d4e5f", From 3dfdf750fa2544bb0242211e2c67aee3a9ae61dc Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 11 Nov 2025 17:55:54 -0600 Subject: [PATCH 11/91] refactor(2023.02-haskell): adopt advent-of-code-api --- VERSION | 2 +- src/AdventOfCode/Year2023/Day02.hs | 66 ++++++++++++++++++------------ 2 files changed, 40 insertions(+), 28 deletions(-) diff --git a/VERSION b/VERSION index 8527457..bd03cbf 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.34 \ No newline at end of file +2024.7.2.35 \ No newline at end of file diff --git a/src/AdventOfCode/Year2023/Day02.hs b/src/AdventOfCode/Year2023/Day02.hs index d225b70..7038ed3 100644 --- a/src/AdventOfCode/Year2023/Day02.hs +++ b/src/AdventOfCode/Year2023/Day02.hs @@ -1,41 +1,52 @@ -module AdventOfCode.Year2023.Day02 where +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE NoImplicitPrelude #-} -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) -import Control.Applicative ((<|>)) +module AdventOfCode.Year2023.Day02 + ( main, + partOne, + partTwo, + getInput, + example, + ) +where + +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) import Data.List.Extra (sumOn') import Data.Traversable (for) import Linear (V3 (..)) +import Relude import Text.Trifecta hiding (parseString) -import Prelude hiding (id) -newtype Game = Game {unGame :: (Integer, [V3 Integer])} +data Game + = Game + { idNumber :: !Integer, + revelations :: ![V3 Integer] + } + deriving (Eq, Generic, Show) main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -partOne :: [Game] -> Integer -partOne = sumOn' (fst . unGame) . filter (isPossible . snd . unGame) +partOne :: SimplePuzzle [Game] Integer +partOne = asks (sumOn' idNumber . filter (isPossible . revelations)) where isPossible = all (and . liftA2 (>=) (V3 12 13 14)) -partTwo :: [Game] -> Integer -partTwo = sumOn' (power . snd . unGame) +partTwo :: SimplePuzzle [Game] Integer +partTwo = asks (sumOn' (power . revelations)) where power = product . foldr (liftA2 max) 0 getInput :: IO [Game] -getInput = parseInput (game `sepEndBy` newline) $(inputFilePath) +getInput = parseInputAoC 2023 2 (game `sepEndBy` newline) game :: Parser Game -game = - fmap Game $ - symbol "Game" - *> ( (,) - <$> natural - <* symbol ":" - <*> (sum <$> revelation `sepBy` comma) `sepBy` symbol ";" - ) +game = Game <$> parseIdNumber <*> parseRevelations `sepBy` symbol ";" + where + parseIdNumber = symbol "Game" *> natural <* symbol ":" + parseRevelations = sum <$> revelation `sepBy` comma revelation :: Parser (V3 Integer) revelation = @@ -45,10 +56,11 @@ revelation = example :: String example = - unlines - [ "Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green", - "Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue", - "Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red", - "Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red", - "Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green" - ] + toString + . unlines + $ [ "Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green", + "Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue", + "Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red", + "Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red", + "Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green" + ] From 4079b2e314616cf1e9710fdbb6483e8724a676c6 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 11 Nov 2025 18:28:30 -0600 Subject: [PATCH 12/91] refactor(2023.04-haskell): adopt advent-of-code-api --- VERSION | 2 +- src/AdventOfCode/Puzzle.hs | 16 ++++++-- src/AdventOfCode/SimplePuzzle.hs | 14 ++++++- src/AdventOfCode/TH.hs | 3 +- src/AdventOfCode/Year2023/Day04.hs | 59 +++++++++++++++--------------- 5 files changed, 58 insertions(+), 36 deletions(-) diff --git a/VERSION b/VERSION index bd03cbf..c927235 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.35 \ No newline at end of file +2024.7.2.36 \ No newline at end of file diff --git a/src/AdventOfCode/Puzzle.hs b/src/AdventOfCode/Puzzle.hs index 555b843..225737a 100644 --- a/src/AdventOfCode/Puzzle.hs +++ b/src/AdventOfCode/Puzzle.hs @@ -2,11 +2,11 @@ module AdventOfCode.Puzzle where -import Control.Monad.Logger (LoggingT, MonadLogger) +import Control.Monad.Logger (LoggingT, MonadLogger, runStderrLoggingT) import Relude -newtype Puzzle i s a = Puzzle - {runPuzzle :: ReaderT i (StateT s (LoggingT IO)) a} +newtype Puzzle r s a = Puzzle + {runPuzzle :: ReaderT r (StateT s (LoggingT IO)) a} deriving ( Functor, Applicative, @@ -14,6 +14,14 @@ newtype Puzzle i s a = Puzzle MonadIO, MonadLogger, MonadState s, - MonadReader i, + MonadReader r, MonadFail ) + +evalPart :: (MonadIO m) => r -> s -> Puzzle r s a -> m a +evalPart input initialState = + liftIO + . runStderrLoggingT + . evaluatingStateT initialState + . usingReaderT input + . runPuzzle diff --git a/src/AdventOfCode/SimplePuzzle.hs b/src/AdventOfCode/SimplePuzzle.hs index ccc896c..0bf91c2 100644 --- a/src/AdventOfCode/SimplePuzzle.hs +++ b/src/AdventOfCode/SimplePuzzle.hs @@ -1,13 +1,25 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.SimplePuzzle ( runPuzzle, SimplePuzzle, emptyPuzzleState, + evalPart, ) where import AdventOfCode.Puzzle (Puzzle (..)) +import Control.Monad.Logger (runStderrLoggingT) +import Relude -type SimplePuzzle i a = Puzzle i () a +type SimplePuzzle r a = Puzzle r () a emptyPuzzleState :: () emptyPuzzleState = () + +evalPart :: r -> SimplePuzzle r a -> IO a +evalPart input = + runStderrLoggingT + . evaluatingStateT emptyPuzzleState + . usingReaderT input + . runPuzzle diff --git a/src/AdventOfCode/TH.hs b/src/AdventOfCode/TH.hs index 5d8a887..dd8b00d 100644 --- a/src/AdventOfCode/TH.hs +++ b/src/AdventOfCode/TH.hs @@ -2,6 +2,7 @@ module AdventOfCode.TH where +import AdventOfCode.Puzzle (runPuzzle) import Control.Monad.Logger qualified as Logger import Data.List.Split (splitOn) import Language.Haskell.TH @@ -62,7 +63,7 @@ evalPuzzle = $(varE 'Logger.runStderrLoggingT) $ evaluatingStateT emptyPuzzleState $ usingReaderT input - $ runPuzzle + $ $(varE 'AdventOfCode.Puzzle.runPuzzle) $ do putStr "Part One: " print =<< partOne diff --git a/src/AdventOfCode/Year2023/Day04.hs b/src/AdventOfCode/Year2023/Day04.hs index 9a0d830..d0e6de1 100644 --- a/src/AdventOfCode/Year2023/Day04.hs +++ b/src/AdventOfCode/Year2023/Day04.hs @@ -1,43 +1,46 @@ +{-# LANGUAGE BlockArguments #-} {-# LANGUAGE LambdaCase #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2023.Day04 where -import AdventOfCode.Input (parseInput, parseString) -import AdventOfCode.TH (defaultMain, inputFilePath) -import Control.Arrow ((>>>)) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) import Data.IntMap.Strict ((!)) import Data.IntMap.Strict qualified as IntMap -import Data.List (sortOn) import Data.List.Extra (sumOn') -import Data.Set (Set) import Data.Set qualified as Set +import Relude import Text.Trifecta hiding (parseString) newtype Scratchcard = Scratchcard {unScratchcard :: (Int, (Set Int, Set Int))} deriving (Eq, Ord, Show) main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -partOne :: [Scratchcard] -> Int +partOne :: SimplePuzzle [Scratchcard] Int partOne = - sumOn' $ - countWinners >>> \case + asks + $ sumOn' + $ countWinners + >>> \case 0 -> 0 k -> 2 ^ (k - 1) -partTwo :: [Scratchcard] -> Int -partTwo cards = sum . IntMap.elems $ foldl winCopies initial sortedCards - where - winCopies copies card@(Scratchcard (i, _)) = - case countWinners card of - 0 -> copies - k -> foldl (flip (IntMap.adjust (+ copies ! i))) copies [i + 1 .. i + k] - initial = IntMap.fromList [(i, 1) | Scratchcard (i, _) <- cards] - sortedCards = sortOn (fst . unScratchcard) cards +partTwo :: SimplePuzzle [Scratchcard] Int +partTwo = asks \cards -> + let winCopies copies card@(Scratchcard (i, _)) = + case countWinners card of + 0 -> copies + k -> foldl' (flip (IntMap.adjust (+ copies ! i))) copies [i + 1 .. i + k] + initial = IntMap.fromList [(i, 1) | Scratchcard (i, _) <- cards] + sortedCards = sortOn (fst . unScratchcard) cards + in sum . IntMap.elems $ foldl' winCopies initial sortedCards getInput :: IO [Scratchcard] -getInput = parseInput (some scratchcard) $(inputFilePath) +getInput = parseInputAoC 2023 4 (some scratchcard) countWinners :: Scratchcard -> Int countWinners (Scratchcard (_, (winners, numbers))) = @@ -55,21 +58,19 @@ posInt :: Parser Int posInt = fromInteger <$> natural partOneExample :: IO Int -partOneExample = partOne <$> getExample +partOneExample = flip evalPart partOne =<< getExample partTwoExample :: IO Int -partTwoExample = partTwo <$> getExample +partTwoExample = flip evalPart partTwo =<< getExample getExample :: IO [Scratchcard] getExample = parseString (some scratchcard) example example :: String example = - unlines - [ "Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53", - "Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19", - "Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1", - "Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83", - "Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36", - "Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11" - ] + "Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53\n\ + \Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19\n\ + \Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1\n\ + \Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83\n\ + \Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36\n\ + \Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11\n" From 87d100c93db382908b422838c2c1fc01da2d60ad Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 12 Nov 2025 00:04:54 -0600 Subject: [PATCH 13/91] refactor(haskell): fix the build --- VERSION | 2 +- package.yaml | 8 +++----- src/AdventOfCode/Year2024/Day01.hs | 2 +- src/AdventOfCode/Year2024/Day02.hs | 2 +- src/AdventOfCode/Year2024/Day03.hs | 2 +- src/AdventOfCode/Year2024/Day04.hs | 2 +- src/AdventOfCode/Year2024/Day05.hs | 2 +- src/AdventOfCode/Year2024/Day06.hs | 2 +- src/AdventOfCode/Year2024/Day07.hs | 2 +- 9 files changed, 11 insertions(+), 13 deletions(-) diff --git a/VERSION b/VERSION index c927235..ffcc340 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.36 \ No newline at end of file +2024.7.2.37 \ No newline at end of file diff --git a/package.yaml b/package.yaml index 69c4d54..a0f2eed 100644 --- a/package.yaml +++ b/package.yaml @@ -101,11 +101,6 @@ executables: aoc-2015-day06: <<: *executable main: AdventOfCode.Year2015.Day06 - other-modules: - - AdventOfCode.Input - - AdventOfCode.TH - - AdventOfCode.Util - - Paths_advent_of_code dependencies: - containers - linear @@ -188,6 +183,7 @@ executables: - unordered-containers other-modules: - AdventOfCode.Input + - AdventOfCode.Puzzle - AdventOfCode.TH - AdventOfCode.Util - AdventOfCode.Year2015.Day22.Types @@ -372,6 +368,7 @@ executables: main: AdventOfCode.Year2020.Day07 other-modules: - AdventOfCode.Input + - AdventOfCode.Puzzle - AdventOfCode.TH - AdventOfCode.Util - Data.Digraph @@ -414,6 +411,7 @@ executables: - mtl other-modules: - AdventOfCode.Input + - AdventOfCode.Puzzle - AdventOfCode.TH - AdventOfCode.Util - AdventOfCode.Year2020.Day14.Parsers diff --git a/src/AdventOfCode/Year2024/Day01.hs b/src/AdventOfCode/Year2024/Day01.hs index 8ce1f0d..e5f0cd9 100644 --- a/src/AdventOfCode/Year2024/Day01.hs +++ b/src/AdventOfCode/Year2024/Day01.hs @@ -4,7 +4,7 @@ module AdventOfCode.Year2024.Day01 where import AdventOfCode.Input (parseInputAoC) -import AdventOfCode.Puzzle (Puzzle, runPuzzle) +import AdventOfCode.Puzzle (Puzzle) import AdventOfCode.TH (evalPuzzle) import AdventOfCode.Util (frequencies) import Control.Foldl qualified as Foldl diff --git a/src/AdventOfCode/Year2024/Day02.hs b/src/AdventOfCode/Year2024/Day02.hs index cae2a0d..e2f704d 100644 --- a/src/AdventOfCode/Year2024/Day02.hs +++ b/src/AdventOfCode/Year2024/Day02.hs @@ -4,7 +4,7 @@ module AdventOfCode.Year2024.Day02 where import AdventOfCode.Input (parseInputAoC) -import AdventOfCode.Puzzle (Puzzle, runPuzzle) +import AdventOfCode.Puzzle (Puzzle) import AdventOfCode.TH (evalPuzzle) import AdventOfCode.Util (count, holes) import Control.Lens (makeLenses, (<.=)) diff --git a/src/AdventOfCode/Year2024/Day03.hs b/src/AdventOfCode/Year2024/Day03.hs index d44250a..5486250 100644 --- a/src/AdventOfCode/Year2024/Day03.hs +++ b/src/AdventOfCode/Year2024/Day03.hs @@ -3,7 +3,7 @@ module AdventOfCode.Year2024.Day03 where import AdventOfCode.Input (parseInputAoC) -import AdventOfCode.Puzzle (Puzzle, runPuzzle) +import AdventOfCode.Puzzle (Puzzle) import AdventOfCode.TH (evalPuzzle) import Control.Lens (makeLenses, (<.=)) import Data.List.Extra (sumOn') diff --git a/src/AdventOfCode/Year2024/Day04.hs b/src/AdventOfCode/Year2024/Day04.hs index 015fc97..3c2bfb8 100644 --- a/src/AdventOfCode/Year2024/Day04.hs +++ b/src/AdventOfCode/Year2024/Day04.hs @@ -3,7 +3,7 @@ module AdventOfCode.Year2024.Day04 where import AdventOfCode.Input (parseInputAoC, parseString) -import AdventOfCode.Puzzle (Puzzle, runPuzzle) +import AdventOfCode.Puzzle (Puzzle) import AdventOfCode.TH (evalPuzzle) import AdventOfCode.Util (count) import Control.Lens (makeLenses, (<.=)) diff --git a/src/AdventOfCode/Year2024/Day05.hs b/src/AdventOfCode/Year2024/Day05.hs index 4c433cd..4f3c15d 100644 --- a/src/AdventOfCode/Year2024/Day05.hs +++ b/src/AdventOfCode/Year2024/Day05.hs @@ -3,7 +3,7 @@ module AdventOfCode.Year2024.Day05 where import AdventOfCode.Input (parseInputAoC, parseString) -import AdventOfCode.Puzzle (Puzzle, runPuzzle) +import AdventOfCode.Puzzle (Puzzle) import AdventOfCode.TH (evalPuzzle) import Control.Lens (makeLenses, (<.=)) import Data.Graph qualified as Graph diff --git a/src/AdventOfCode/Year2024/Day06.hs b/src/AdventOfCode/Year2024/Day06.hs index 962fc4a..7b299ef 100644 --- a/src/AdventOfCode/Year2024/Day06.hs +++ b/src/AdventOfCode/Year2024/Day06.hs @@ -9,7 +9,7 @@ module AdventOfCode.Year2024.Day06 where import AdventOfCode.Input (parseInputAoC, parseString) -import AdventOfCode.Puzzle (Puzzle, runPuzzle) +import AdventOfCode.Puzzle (Puzzle) import AdventOfCode.TH (evalPuzzle) import AdventOfCode.Util (CyclicEnum (..), count) import Control.Lens (ifoldl', makeLenses, to, (%=), (%~), (&~), (+~), (.=), (.~), (<.=), (^.)) diff --git a/src/AdventOfCode/Year2024/Day07.hs b/src/AdventOfCode/Year2024/Day07.hs index 3ef53b6..8eff47a 100644 --- a/src/AdventOfCode/Year2024/Day07.hs +++ b/src/AdventOfCode/Year2024/Day07.hs @@ -33,7 +33,7 @@ module AdventOfCode.Year2024.Day07 where import AdventOfCode.Input (parseInputAoC, parseString) -import AdventOfCode.Puzzle (Puzzle, runPuzzle) +import AdventOfCode.Puzzle (Puzzle) import AdventOfCode.TH (evalPuzzle) import AdventOfCode.Util (numDigits) import Control.Lens (makeLenses, (<.=)) From 58bacda3087c61effbb3e7ac8142a31b64890826 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 12 Nov 2025 01:10:46 -0600 Subject: [PATCH 14/91] refactor(2023.05-haskell): adopt advent-of-code-api --- VERSION | 2 +- src/AdventOfCode/Year2023/Day05.hs | 38 +++++++++++++++++++----------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/VERSION b/VERSION index ffcc340..50555f8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.37 \ No newline at end of file +2024.7.2.38 \ No newline at end of file diff --git a/src/AdventOfCode/Year2023/Day05.hs b/src/AdventOfCode/Year2023/Day05.hs index 5801eb6..db5c959 100644 --- a/src/AdventOfCode/Year2023/Day05.hs +++ b/src/AdventOfCode/Year2023/Day05.hs @@ -1,29 +1,38 @@ +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2023.Day05 where -import AdventOfCode.Input (parseInput, parseString) -import AdventOfCode.TH (defaultMain, inputFilePath) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) +import Control.Foldl qualified as Foldl import Data.Interval (Extended (..), Interval, (<=..<)) import Data.Interval qualified as Interval import Data.IntervalMap.Strict (IntervalMap) import Data.IntervalMap.Strict qualified as IMap import Data.IntervalSet qualified as ISet import Data.List.Split (chunksOf) +import Relude import Text.Trifecta hiding (parseString) main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -partOne :: Almanac -> Int -partOne (Almanac (seeds, mappings)) = - minimum $ map (flip (foldl' convert) mappings) seeds +partOne :: SimplePuzzle Almanac (Maybe Int) +partOne = asks \(Almanac (seeds, mappings)) -> + Foldl.fold (Foldl.premap (flip (foldl' convert) mappings) Foldl.minimum) seeds where convert seed = maybe seed (seed +) . IMap.lookup seed -partTwo :: Almanac -> Int -partTwo (Almanac (seeds, mappings)) = - fromFinite . Interval.lowerBound . ISet.span $ - flip (foldl' convert) mappings $ - ISet.fromList [mkInterval src len | [src, len] <- chunksOf 2 seeds] +partTwo :: SimplePuzzle Almanac Int +partTwo = asks \(Almanac (seeds, mappings)) -> + fromFinite + . Interval.lowerBound + . ISet.span + $ flip (foldl' convert) mappings + $ ISet.fromList [mkInterval src len | [src, len] <- chunksOf 2 seeds] where convert iset imap = unmapped <> mapped where @@ -37,7 +46,7 @@ partTwo (Almanac (seeds, mappings)) = seen = IMap.fromList [(interval, ()) | interval <- ISet.toList iset] getInput :: IO Almanac -getInput = parseInput almanac $(inputFilePath) +getInput = parseInputAoC 2023 5 almanac newtype Almanac = Almanac {unAlmanac :: ([Int], [IntervalMap Int Int])} deriving (Show) @@ -60,8 +69,9 @@ almanac = mapping :: Parser (IntervalMap Int Int) mapping = - fmap IMap.fromList . some $ - do + fmap IMap.fromList + . some + $ do dst <- posInt src <- posInt len <- posInt From 3f2932b76afa03ce29804646062a11a911843a90 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 12 Nov 2025 21:32:16 -0600 Subject: [PATCH 15/91] chore: git rm input/2023/day0{1,2,4,5}.txt --- input/2023/day01.txt | 1000 ------------------------------------------ input/2023/day02.txt | 100 ----- input/2023/day04.txt | 213 --------- input/2023/day05.txt | 197 --------- 4 files changed, 1510 deletions(-) delete mode 100644 input/2023/day01.txt delete mode 100644 input/2023/day02.txt delete mode 100644 input/2023/day04.txt delete mode 100644 input/2023/day05.txt diff --git a/input/2023/day01.txt b/input/2023/day01.txt deleted file mode 100644 index 0e85701..0000000 --- a/input/2023/day01.txt +++ /dev/null @@ -1,1000 +0,0 @@ -tsgbzmgbonethreedrqzbhxjkvcnm3 -7qlpsnhbmnconeeight78 -prbqsfzqn57 -ctrv3hmvjphrffktwothree -9six9qbgcvljfvccdjslspprgonenine -eighteight9dnvcqznjvfpreight -one5sevenfour3 -gjgfiveonekzssz9c -one54 -rtsevenfourfive1rqhslone -xkxfdhk25fourtwot8 -kjgcsncmeightdxdgkxfzqmmkg1351 -7qpnldcvgs -reightwotz5 -nineqrtrsfsreightthreetworvrphxptlrbczxsix1 -1svfvgsfcssjpvhzr -1seven174ndseight2 -56lrkxdfive -2jvrgmmlninejf583 -fvsspqpt31 -3threemhjhvrvgkseven -eightoneoneeightttlpjqgnkndbnmppjsdhzdbhkhl12 -vxjgghc18dzbsssnssh -one2cgxdfbfhl3 -8ssfour997six6 -8onesrtcvqmxpzeighttwo6 -3twoptpvz5cbgpdrggdtwoseven -35smnsnzxmdjtsns6sevenonethree -fivetwoeightfdjpscncb41 -flkdknzdxtgdxcfqkn4mbh4tqvgdq -one3threethree -sevenfourgdnxhsqq5one1 -kkrjgpm2sixeight24 -krrhdhjqgmc5dv4 -cvlh16nineeight -495five2nine1 -tzmcxvdtvxpmrcsevenfour15one -2qvbrsxqsix45threeeight -pfmktwo29onensbfgdddfm2 -7xqjzxstvsthree -37ninetwo3 -5vhtctxvjrvftwoone2six -hbhxhjjl5twoqxmlprccr5 -ninefour2foureight69 -1sevenmggmcxfcfdxptktsgcgsc -fnkzsdjh3kqxpdvmkmvqqjcjn -twotcspvbvppqqntwo1hlcvppcpnv5 -xbfhpnkqbnxdfgbgtm5 -84tpzgonelnine6bzkx -bgslbmdkfpbx6 -lqpfphxdtfourxbqdhrbcz2cmhtddsnkpgln -7fourfzthreezhrjdjlvsix4lrrfv -2seven3 -fourtdggtgsdm5 -1pbphhpsxbnqmfbxzone -tskfvdph7mftvqpnvcj2oneninenine2 -3fiveeighttwothreeninenine -seven687two1pdjbbprztwo -eightrslvddpmonejfive4hhqbdq -xbhcqzx52eight52seventwo -fbgpj8fourthreecqngmbbvkktlbss -plckgsixeight6eight95bnrfonetwonej -1nine97rtrtxhqnone2 -cntfouronerdsnn4lfcmhvlrq1five -hrh34sixfourqqng7eightwot -sixlfldl7qjsclxqfive15 -khdfour17 -frmcpx65 -five6bjlbxkp7qthreethreecc3 -5four6qlmpsrdeightfour -9lxdxgfrnlk4lsgbjnz9two -one7five2fvdqfqqn92xsxnblxvhdfcrz -hmhmxvqljdgvvvdfour5one68zgm -718 -3onefive43 -xgpqs5four267six -pqseven17nineninephpszgqzsixldhxmhzgf -ncxxlsqdkvc8fiverslzqtzhzltcmbkthreelkjjckxsvljvs -nine6sixkrs -5kcqpgfms -1znbcrpxmjcsixeight -sixtwo28eight59fql -8nfcseven -8five864sixfive -8fzsvsrjmjxmc -kftvseven6dcsfqtmtjvmgbrninefvv6 -twoseven65 -nine58sjshtgtqlz -lhjfzvlbtrfffour9eighteight73 -9crhmmqkrrfour -threeklhhtlmczn6thfkvdd -dvjxkdgsnlds44kxs -9gtvhrcphvnzbmckkeightfour -fouronejtvrscxj9onethreelgslth -86four -4hvnqzfthree -8qone9 -lnkngkxsflqsvm3threenine2seven3 -65five -8529xdd5threeonexq -sevenlthree1 -5sevennineflfivevgp -6pmzqczjtlnfvgg1sevensix -sixtwoone2 -kqrxsgtrrjsix9 -2twonebs -fs9hmjmdmbhkskqvdb -293 -9sevenbprbbnzqjbhfpcgnxjmflxgkvqgvc -rkd58six -5mbgfldv7rskkllhm -fcjdzfjpvptdcxfltdddm7twornkskrnqnqv -bkqzf51two8twoeight8 -2fivefour4777six8 -mzq67threetwonrqpcrptwo -7bmkeightm8 -z6twoeight5threerfckddtc -threeninesixmtdc7xtjhvksjjc -5fxffvhqzgtdlfdxdhsixnmjtvlq2five -nqpsvzgql1 -six3qljkjbfeight -sgddglfjrtwoseven3 -rxzhvffr1rfxqpr -7zjv5 -3tcsxlpxhsmnmg27 -lbqkvfxp8sevendcjlrfour7 -cxlvqldcjhhlzcvsix6crleight6 -jhchtninehrvlsfvkr7two -48ninetwo -45fivefiveone2 -hthchfc1 -oneninetwobfk7two -ninesevenkfnlhrznqseventhree9 -2fzbgjdvbnktwoonefivefiveqhz -seven28mxjxnzb -gqrznvtjeight9six277five -four3three -1kpqmrjctwolngk8 -49zks -threesevensix9fivergmlzrblg -eight9sixeightlfvrbvfhd5one -4sevensevenonegm6 -six11one3lrztzsjczlnhddxbn -eightsevenpqdsxzmblmvdmjpeight9 -71seven -cjqcqjlkgffoursvfcqxfkkszjhjl73 -dgndjkhcplztmkjrdn53 -1eight91vqjhmxrq9nine6 -bthlrtwo54hxppxfourdsnxnlnpvhmrpqtqzlr -1bhdmvdrjvzthreenine6four6 -threerknmhjtfourtwoeight65eight7 -1hbgvsdxtrsixmsfzxrlzskkkgh -4hsjt -twothreefxhlr1bfngthreemthqqvgfpxeight -nineeight4hp5nhksqdvrhcn22 -hdcfdknjkhsxnk9 -pshjqxmqcbkhqkc5onekzfgkbeight -five3ninektmsrxhsdrseveneight1onenine -p5five -2sixrgznrrvmxbbvnxhqtpeightthree77 -threehmpjclsbhjlbxj1 -982 -vcjxvjvbmmzmrvv97one6rdxrdk -four8one9xpgfjgvjmdsevennineeight5 -five7jmcrkbnine2 -kmbhc8threessdnfmsix -214sixfkxkllldfive6 -dbhbfprsqkpmnfxgkgcone4qfgrgghqtqhxqn -1plplklqjqjdsix -ztzgqsixqsevenseven4 -3threedjnbdbvxseven3qpsjone -dnccnninetwomkzk52sixcgq -94rdhfgjjr1gzl -8three2ljbjjfvx -8sdklzklt -onexvrsttmhfninetftbrhtwo1gkpbninekh -vsbfour5six -2phhz85 -two73fourfive -2twonineninesjkljpdgx -2h -tghzldzcj38foursix -9srzlsv9seven -twojzssixfive53 -85eight35foursix -rzx2lb -ghfnqk396nxqgvvgsmnine9hhc -6sixnine746zlrksxcglg58 -1nbfivelvpcjnsddt3eight4fourblrzckjvf -sixninethreednqkk9zzspxbcfjmfive -16tsvqdplfnbnh -l13tkbfldqcdfzjsdvtfttphmcmsix7 -rcgmlmnine94foureightnine -lpvmrmtkthdqll5 -gjjprdvggvtjvqsnbg7xjvnp3eightninebhrdrq -lzzmsmbpqnineninemnine6two4 -52qldxmrfive36ninetwo -four6fourhrsgf29 -9zb97kffl -eighttwonine5fourkqtjsjthree -two21 -two6fourtjjn147 -lxnzlpcvzkbd9pxtr6qhbfmcmblbhmncljqd -zccjlmzhm9 -11zdnjgj -one5fourone4onerttltxrzgf3 -eight2nine83onepxjhx -38fourllqpbclqnlmfourthree -treight9threesevenqgj -jb7threezfvnine28seven -kmnkbmmnine53lddseven3 -3jxgfdzkgznine -72lzbqmclqtwo94nkt5 -threejdqnineeight4seven9two9 -sevenqnpjbznp6sevenfrnghcmvlfbns -oneone23oneeightone -52qngdcmftmchfzt -two8hnine1qsseven1three -seventjlsdnmx25pnxvtxtsix4 -3veightjkgnbmcssevenpjrszdxqthree -kkhxtnqzvz4jdqmtwoeight -4eight15niner -kreightpprcklznlcstjvqhn36ggfkphxdhm -four53ngjzlmhg -ztwoneoneshxnb2sevenxcrgjbckmfiveeight -3five5221ddgprnvgpnj -2hdkdzcvcmmtcrbsvfsevenone -dtkjdncq73threechgcccdgqqsixthreehlfroneightn -vtfvj4nine23seven2two -phcvhvlq4kjnjcdkjrgninefourthreethree57 -twopxngznkbrmrmrz7135one -one3bqdzone9sevenc2 -69threesix -6jcmfivenine6fivefivethreetr -six1jpxjrqkpgllkqldf -rjz4two59gjjgs2five -joneight9gvqknfour7sevenfhzjsrldj -9one4onesixhvvkqtpleightwovmh -seven4threekpstdppxhvtwo7 -flxzfrxp1 -seven57eightthreeeightseveneight1 -6sevengmkvrvone -five1eightfour19 -nqxnqn7five3txrngheightnine -rdfkkkthree7lnpmdgdb9 -jhhvznhlsevenninefourcmkrbtfive3thtfbjvgvdnv -2seven7eight8jrjkf4fourhv -oneone7hmdfjpzr57vfz -7vqsllrhznvrdccrdrnjvmzmmknp4 -412sevenflfcvksjzk -7eight43mq354oneightv -sevenseven7eightoneightvvj -twotwosix2ninefour9three -threefourtwotwothree1lj -jpqccxztdninepncqqmnlxninexjfgvgccrm1 -5cr -jlhrrqmtlgtqfqpmkrhqjmpmxjshshblthreefournine2 -four93kssrxr -bztqzsjkeight6two18four -sevenoneone587ghfbdmjpqxnpbh -823onesevenseven1 -tt3qmcsbcm1eight -prkptfivefourtwo8 -4six8836gmmgvlrz -qklnpxjqhpczsc775 -phblxtj9 -jgz8lrghthree813eightone -vppt4eightthreezpgqt6dmxdtllksgrtmcbpfjh -nine9lgsgzkjvbcmtfourr -7three61ninefqgsfbpvjrx -98ninenfzfh -two2one8seventwo3hpdbstnhvkthree -fourstrljqf8nine -5kzgf5rspljfnsljrfrhg2mdsh -jkbjkbjhvfoureightgfnnxxnqh826z -3ksgl -3vfivehntm -threeeightone64krfskdqlxsfive -oneseventwo8vqzvnine9ninenq -7fivesrkfkfthree8qmxmdrvhl -447lhctbzpphthreebkmrthreetwo -two92seven -95sevenonecgj -kcgsqqdpfhrpxzceight88 -9c4six -rdkqfzkdlggfq661tfmqlgkcfmfcvpqsmr82 -1zzhzhz -six2ndsdxkfxsfthreeonesevenzlp -eight5threeoneightmxp -sixfour4hdktht3two3seven -9zdphltlnrfg9225 -6eightfourplxbgjfnnzfk2sevendcpbl -threenineeightsltsrkvpl28six8nine -lmbqmrmjldlgb7 -2sixninedxnhmdfxh4five66 -5mllgtrxzkgxskkqxvpjttninefour3 -2hjl6two -h5 -eightthreethree3hcsrt -htjlplnfxgfqkm77seven -lpmggpmcq943lcsvrhdljsqqdlgrphlnnine -7twoonecgtdnfvlrsixrhnineseven -lxszmkhj983five -four9fourninefourtwol -eight58sixsix94 -2sixthreefkbvtdgjq -1rnc -86seven13 -one6f3jkrlrtf -two4nine72twojtfive -fourtdtwo27 -two6eight -nxhzvln3five5 -six7lbgqhnzkntwo -hsfjgnjxjvzskjninezfndhtwofghpstbqzcseven1four -6q -ffszknxdbqzgvmg2p -cvl52 -nmfmp8six5threenhnxs4 -9fdknpvztworqfdpjrk36eight9 -brmqzbhx84 -two72nvrlnhkjnineseven -1spsmjscthone8 -sevenphkpdzvgzcjvlskdzbhqgpknrzdpsn39 -gfmxvrrvk8 -8zkpvrq7ggjskkr -7ninemvm41sbftf6 -nine2sevenfiveonetlnhbbxv -rtwone881998 -eight5threegthree -fhlnkzgqh191 -48fourcmfivecz -5mdvbgmdhqbctxclonedhx1sevenqczd -12one -sixsixeightjmnbqzfive49bk -nine2seventhreehvrfvm11 -gnsixb3three2 -one3hrqzfsc3one8threehhjbzkmln -vvxcbrrone95 -nine7twosnpv2threeeighttgg -8onetwobqnxkkvhk5 -qrphvhfqninemcnzfrhfbvdtsnhst3 -2eightj -eightmdjmnqd1seven -seven5sixtwoeightcglpqvlzxdfive32 -nine3scvsffour6 -3onefourseven -cfqfkxv4five -2dbq8fnzpzp -fivekbblqgnjt12pxnvjxrssm -sixfive16r8dqkgspmlb -ninexjhfsgn9ninezv -lcfourtwofiveffrl6gfhxsrzmdl -8oneshvxjn -8threeeight8sixqbfnpxhr -smdjbhvsxlnhcqnxxgqcxfive5 -threeonesevenglblr56lsntrdsjhp -seven1ninevqpssj -58seven -lghxjdhpdbqs19 -lkcttrkrcpfourjtkfxmxcfive4kxnchspbqvqrfv -7mpgnvdrmsqbcnfzrhtpjhz -threezkjqk5fourthree8four3 -7398 -xpmrcfffmhqpnmxtqxsblcd2fourq6eightdqvj -6onedvdxtv9 -sevenzzvgmlqk5phcldhgghvshclp8 -xpddfttzsix63one3 -threem5eightwomp -2crrxnvrcjklzvdxk1slmrkq2 -5fivesix8mstzprjlvqhcrn -rzkhdgfvkqonexhblnnine32 -5rseight377fivepnlsngxvmthree -onesixseven9 -9dgr98 -6jjcb1hlmlchvtqhpp36nine -lrxhvzs538seven76mkt -six48fivexqxqxdzzhggvcb1 -94seven7two7 -five2bqxzjllksix4 -21three2eight -9rbsrdjbgmgln2fivesixninejfvk1 -9foursixsevennine1 -9zjxdzqbxjlbbsnine -8zfslsdlhdqmptwozzndjcskhptwo68 -9fiveone3fourpncrvfive9 -tbslbmgkqv936sixgsqzkfcjpl -fournxfsgdthq4bsmp38sevenfivegclrlpgxt -1kzql -7onehfzqjdnlzcxflzrlxdh8four9mzf -1sevensfivevgxeight9frcbzhpn -four1seven8njj8 -74dtgcn -sevennine8twothreeztstwoklxhgfbgnnb -7seven3bdrbpnzcr -2twooneggtzrfqcsqqq -rfxnrxkk5twocjddcmqbrqjvprtbdjtpngl99 -pspkmpxzmn9cndplpjskthree7klc -eighthcnhhvvjxc295rxgfour -74nine -jk17mxgfhjveight8twonine -2six8seven2nine4sevenkrgmk -6k96 -5jseveneight6eightnpfqt -ntwone1dkfrhmfourzngslfournine -nine64 -njeightwo52 -15mhnqxqcdgcqbqtdp -hlpgsrxf429four -tncmkps6bninergvfkrv649 -bqqlgvbdp3 -7sixpzpbrxbhqjgvgns -849zhtmsevenfour77 -three15seven9fourthreejfmxhllseven -ksixeight4three4fqkjthreemjqhxqgk -four4seven4eightkgsg -sxgrghvnfknfrsixnkflvngkmsznhc8 -6dzxmxkvvpnkp6fnzdfkjsevendlqrsgdztone -eighttwo81cbrtrrfour9fourqkkbk -hvnjpcxhlb9skfjsixseven9two9 -pmt113onertkj4 -seveneightdftwotttone6 -fnsmzpthreexcssct42 -5eight4threefgllrpsgqhdtsqbqvzxtpgpdgnvctt -rfddtbdpftrvf641five2x -1three8clseventjtwodlhggr -fivelxhrninej8fjngzdskseveneight -ninexxlhmhzdj7tfzds3khvctlrxmhsxdnbm -bggglk31threefivenineonepqcdzczjm -223seveneightfp -mkvsblkv76 -7three86 -xkmxnbmtzrpdp2threesixfjkpbhpzb -9four2 -7tqqg -three4five -zndhqdmkntwo6 -rgblqcvrxzv5clzjdmfkph5 -skcvbd2seven5 -eight8xnlmzm -9twovfnvrmcfhn2gm187 -seven8sevenjshjndsdgrnczlsevensix7djrk -bt2one4jgztwo -one126eightnzpxkgfj -blrlnfnnvbhkltmgqqsixsix2bdnprfp2rpqtnvbtwonenpx -prffzmfndlqfqjncvskgdtwovmbqnxm8twojttxpv2 -6qhjdzs5bm -76lcmfntskmxddthreesixone23 -bstcghjbhkrlpxf1six -7ptpcjchcfffivenineoneone -7ninethreezstzpdr1two -szxlzxpn2fiverhjrp -5625 -two6ghnhfvrzlqdtqflvfgldfjj37gcxnxf -one3scnfcdpsn2five3ninejbv -eight569nffztptqgd1mqbkssdcppjg -fbsvjlln4cdshlvmxpmmc4threemfqnseven -nljzcfzfive5ninen -gmhlb2sixfive55cvnkgknrpbdtnrd -47six -skkhbxfour6trmh7nineseven -three9five -12ninexcc -eight6kdtbvfourb -425threetwo4hxnxseven -five4jbbftjkcmjqxrdls3nlhvcgeightrjn3 -knnjdj5tgtsrgnmjqmjjrnht1 -nine3mhxxsix39 -fivefourseven2drz3eight -215xnm -6seven3 -77kqzfcbklvznhgvnpfivefivejx5 -8seven6sevengjssbvngxzbgcmm1 -mqqxqgmzdvzdgjrlkntdjhgfouronegrkddl14 -5threetxbscpfxdgfive -two3bdhxhkqnd87cmrkzxf5 -two7twobgnxklp -9sdnnzrkms8rbbzfqms8one -2hxdxxstwo -foursrb7smqxmkt -14xfhdkfmh -84trqvtltpqvdtzdlch -19hjjhfljxnine -1lbkvjcjbbeightngnqdvz8nddkmqmvvb8seven -mlnpptcflthdprj4fiveseven92sdhxchdcj -cdmbfivepgdbgdfvbklz8six7 -cbqvbtpljv8skzgmbzbfgrbffmmb -one9ninev4 -nzvjsqx7fivebgptkrxsx65sixfivesczbl -42bhjthree1 -twoqnsxllxrsfive64vgtpcmxc9 -sixbzflbdv7 -54threehf9vhctwofour -4pmkmlpnnine3 -3sk88qglhbsjxdsdcnqrnpdz -79szleighttwofivef -vbctcrttwo43oneone -qjhdlqzqftfgxgnbbscsbznfgslbltd6szdppxfpm -fivenbbsgfthree9 -hjqmr9rqsrhspcfjmfj379 -lxjeightwo6four8 -45twonkxhqq -ggcvxfz6lfpbcspvzsqztjllrrpd -qmlvh9bmlkfive83fivepbtnine -1qqqbrct45sevenx -ttgtbnzrn1dprs6four -nine1rcstjdlhb6hsrnvsjxeight1 -gtlhk3gjhqvtwotv -six278kd -vlgzjxlmfs6 -8d51 -seven6lzjgcc -sz7sixctstdkhlb89 -27three -6two3msmszdzcrfgxj5 -8dbvzcrqv -tftbmjrjd831gbzrhscthree6jvvfour -254sevensixzzkjsq1jmmbvdbhtmfjsp -ghqgzfkqhnqntwo4nfj1 -sixfourninetwoxjtsxcr3 -five2niner2 -22blmbkts7 -one2cbkvqstone5threekzvskbzdt5 -48lgvmpjvhlfsixone6seventwo9 -1five5pzglqpqltn -8dc6blpnqcjndthree5 -lncn3sevenptdrlpqsbseven -9mdzt -flnr3sevensevenpjgrgdbrvdgkhtlzzljdnppp -lpljgkpqdgqsevenseven8foureight5 -xzrkml7 -127 -hgxdcdprhg4qkxtwo1rlc -nine9five5g -three1lgdctzmqpgc4zbmc6ttsls -onethree495three -eightfblxhxptkdnhk6npbbsxgxlhoneights -fourm6sixeightmrztnbjptqfv -twoone76 -6dsbcqrjj -pfkoneightmv8bdrmhlnhmninektnbdtvtwo6twod -qttsnrppd6s -76three5 -thrxlfmbmtsxjzsx5fivelvknrgctp5vlmpf -nine7ninethreeztmlsfch -18eightthreetwo978seven -bseightwovtlxsb5sevensrqnrklqvzstncmr6zg -3zthdrzlqcjbdsfgqphkzqeight -mvfnine6sevenrkbxbhlld35five -cddpxjhdgt9fsfmkxmvtm3dnqndzsnm -vrhjfsfkt3sevenqcsxvkdrfndtfljvkxzckctwoonednpklkm -hqjfnbh9threexqfive -mrpdsqbhzjzplrlqf4fjstqq -6htcxzghbx -nine6dflrcbjl65 -bpclpbkbbmq9threeonetwonejn -eight5fivedcsqtsnfkthreefour9six -4lvl -fourq2 -four388rrkjtfjzrceight8 -7lznsixfh41pdlvhbh9tr -9nineseven438 -tgcqntlpqonevmcqninezcxfxbbone6 -seven2gg -two1one65threexsix -1one6lrgflmsixfivefour -sevenone46 -61crvnncdxmkseventzqvdsmfkx -khztxzpnl6nine -threeonehjxpgj3nine6threehcsix -twotwo5mpbgbtfjpcxbksix49two -62 -kssevengjcdtrcmklxdgftslsz7kfclxsdtc -9mgpqjhlfivesix34sevenone -89711 -3tgkpfrvvcpxfs8jhmdcxz392 -6ghbglhfive469x -9ctfqkhbgprf38 -cshsctcqr6tcxzjgrzsx -chn5onethreevqdhhdv74 -one9fmlbplqeightfthchbzjhzgkbv -fourtwopkllbslsix94bcshtp2 -rvmpsxkmcqninetwovhjzvhm3 -4eightbcdvjjr5ninethree6fiveone -6three6eightdqkcg -rsix7seven6fdpzpgvmkp -eightrvlmbdq91six -x978bsdxxnknine -81five3 -6bmmvdflqfxcmhtsixjprt -five6two4five37seven7 -nine6hldzbzxhzdvnptjeight4ninejxlhvtkpzd -eightfone9 -4vknnxxj6192q6nnfbcm -twolzt6two23two1 -84lltlrz4vsl3two -rnfour39cpcggzone -hgfx464 -6tdldmclkhqkkdzxmhvtthree8 -9sevensix -pfgb55 -mqnqnineplccphpctvxs3sldkl -cblchzhrsone4fcbvfxkjjbcptp8oneightv -5mndn -pptwone8 -fivejvzddb3bcvvskzxstfive5 -k7sevenninefivefiveqzbxlsgcmoneone -gxqthreejzntslggzhxnsevensix1onecphllcxc -6slttzsdvnkfgbqldqvlqrszlpsixtwo3 -7lqlkstbxpt87xcbssmn -fourtwoeightjnflkkbksn566 -dkjpckbtnninejcxg3 -6713ninetwo -9six3rskfprrbqhbstmp9 -4onepfqshseven4seven -1d -zdht4sksmztjpcrjthreenine -four29one2csmk -93lmdlxrrj4threeeight -zkbckninedlzxpmdneight4 -gjdshxctnszcrlxj8 -4nqfvtshhk -hvjvrh37threehznzlrprtptwo4one -eightghbtgpbjfdprqnpvhhcbdtrzsjgsix2 -sixmgpzcmxq3sixsixxpdrfpzdsmqsr -onefivegphhdggf6kdrmnvgfqj -mvtj2six -6jhtqngl7jtphdsvtkbvscm1fivehv -632onefiveeight2 -9ninezfbzdplrfourthree3eight8 -164three7fbznchn8 -fsklrdzbzv8threefour8sevensix -twosixtwo4sixsevenfivethree -foursevensix4fourxhfjzjbkhsix -eight26foursixseven -8frxqhzqstxzmlsqpqtcsevenfive9 -mgck4815plnnmrvhfvhbsln -3fxpccfplrfivetwobbngonephjs9four -4gbbgpbqnpbqjzgvjrgpprtwoqvjrrn -four17two93eightthree -twoseven3 -one5vqpmvkpgtwo88seven -sssmblvsixseven2 -6fsdxfxgdhnqkcpzmbljlfkfsjztdp94h -kx99pbk6 -nineone7knpqj -2fourzgseightseven5 -sixninekdbvrrllrl8sevencvrdhnine -8jtqlpz2 -hgblktnine92htpggp22 -8l3 -xfxb82srqlldfonelqjhssmsrfkbmldjqt2klnq -321one42seventhreenlrtm -jponefoureight6nine -3lsljdntnsjrseven -two1rvc9fiveonerkdnrnfd1 -1twoclddjfsixtwovhhczl -4two48krlhhbvzhq -78fourncglqhghzxhbrb98threeglzklqgkg -threetmzvnrfnqq23 -9five5four5ones8 -six4onefive6 -45lfmdrgsrvkkkzglnqmrlt -64onevthree -onefour9zvkgndsv2 -dmrk46vlrztxbjfsbll -2four8oneeighteight -pqtvvlbrgninethreeone1 -6four733d -seven1qhxhgxsx8fzlbkm9hpmnqkknjpseven -6cspj21fivetwo -seven3fllzkctljxlcqljbxfrcleightwov -73bkkkdnptddqqxhjteight -jjdmnfourp1threextxpmdnnnine -five2lvhh4kfg3 -rbconeightthree8 -59lqvpccqlbmqqtzfourseven547 -vdvsbhcptvxbgd46three6 -xtrbzgtwofour9kq9 -2nineeight -29nlcdzgrkh7 -onehglhgkcksm2onemzpnqmbxccvpxxssg1gcpvhl -sevenhhhgntcldxlfbrpks27threeeightwoh -2kccbsjdblthree -nine6threenine -nkbcdbseven8cqfour -bfour3 -nineeighttneight833 -3glgsvfhkz7fivefivefive -zzlxqlfour3mcjjp -93eight28 -1threeffive4c5oneightgdg -five4six -gpzjjxthree4fmvbzmzbjf31six -bcbdtbjrtn3five11 -kbtnkjvkmdh6 -fpjsqbxv5 -3twofive -9vplnvkkmhpdfxckm2js64 -4eightsixxgmbxzkkcsevennvdgprqcgvsqct -eightsix1five8one5sevenvqjmrkdjq -9seven7 -ngmnllfj49dlqdmnthree -sixthreeqbkmzvmt7sbgsscqsg -5sjbrdqvbksss7gnfcp6vjpbfcgps -nhssblqsixtwo57 -fourbthree7four -6foursix -pfcbeightfvtnlrmld273 -fivefhthree8189mvhf -nine5qzvxjvj1nkljhvdpnf9 -tgrllhmcmpmpeightzjd7 -vnblzqbhx4four6 -5qb6six2one9 -sevenprjnnznl9nvbfour28sixnpxttwonemcn -4sixsix -7two9 -7pzzdv2fourgxxczzqtdxfjgtxjztbvjt -218jxfvzrfournine -4sevennine -662onecvzlsixzj7six -bpnmf95seven2 -clfcfivetwo9mkxqnthnnhkpxcm -klgfmtjlctstwo9 -1zlqhkkhmdvszg2three4nljlbrzz -five6threesevensnprfgsggs1nqqjtsqxpdtjlfr -nhkvqk89four -rtgzhbhjcjcznp5cxbprzxfoureighteight4lng -xdvgfzxbvzfdkff5dthree -1two465sixnine -2six327mflsr -qpeightwo4sixfivetwokvzhkg -4seven9jmbnjrhrtthree -4flchcfh1four -94fourldjgvg7drlcxqtnv2 -99sevenfourmfhnjg9 -32fivesix275ninelpmkponeightnp -9xzgfxcmplrzjsbnlkgcbnpchth -htoneighttntmj6ninethreen7 -64one9sevenghcqjjrseven -8nvkfqkbbpzseven63zpnbbnine62 -fivefoursmdnvczb6 -mmrqfrtwo2hhpk7eightthree -dnrrfklrpxstln57vqzkrxlqnmsvmgdbthreeoneightc -19rqmvljqfrmfoureightseven -twofive9vm1csqlrvngtfiveeight -zeightwofivefour6gcmh97 -7pzts -42ninecnbthreedlgglgp -3kqthqfprdntgbfqqc -sixdrrqxxdgl8dhf4 -51three -39qpctcjfnh7 -9bfour4 -onefourseventwohbqpxn73 -jzbqdcsevenseven8seven8mmbktn -xlzeightwo3648threegrfourrjzvz -eighttmmtcrqhlpnrjjlchrvvthree6 -5five3one69eightthf -bctwonelppl122bkfivetwo -foursix2ddxqqz -hbmcnbvdhpkhp3sv88 -csdp3onebjxxlckthreetwoplskdphhmp -rvkdmmgfvsfive8ggvcvxgjgrsix -7zjsdzbeightfour7 -four3qfsvmbhhfv276 -krdnine4bnneightbpxfdvl9pcf -scdklgdh46fivefiveseven24seven -9rmmsthreethrlxjtjkb -7fivesevenstfourfivecddbzmxrrqeight -fivethreeninexgkpmpbvsix7 -sixvqpdpfk43rhmd9 -2zvkhxtfourpdfnsbsnbvone -four7lrcvtsczdp2sixvvlkzrzzk9gcxtmx7 -61pzlq74cmlkjvseven -qcjzncctvv237dsjvqm2three -89threezgd2eight8 -nxll6fivev6kt4rmtfkrnkfive -lvxxvnpzlrk8sbmbnhtmlds -sevensevenjhcxcninesevendlghdvfj5mkmdb -vfq4 -gxkcbkknqg8187eight -six79tcdlv -bsntwone3six8 -8nd -qdlhkvvpxrtgbrzpmcfourfivegpjqjfbfmngnnbpshfkdpsdgj2 -threetjbcjmzlcvnchp34nineseven -zjpxzkdlmhcbzkrflvfour5mdqldvgrnx5sixlmgjpqx -cjnvmsdrpmq8 -threeqr8xrxgv87 -rcfsntqrlonezlgl7dhlflqckc9vhd21 -9three7three -ptkqnrtmrnsixfiveseven67 -44fourfive9 -4fstrhjjctsvrz7cpbr6gjpkkxglx -6rjqcmpfbp -731 -fivexdfkzmjs3146five6kvdsnvsxsj -dhhz6 -sltpllcs4seven8771 -1fourkjfhfcfxbeightseven8three -sevengrzlghdkg8three -sixsixnkgfcfivekqfzsj59 -4qbqggqlmjkrgnrxthree9dxgssjkrseven -xhlmbone3one8 -3t -8six37 -fivethree3onegthree9thhfzp -9xdmvkx7fourfxpgsvnine77 -coneightfivedfkqrfjcckghzsrtrc9sevenone1 -five4ninevxldttfxxdfxfhttbxkvjkfour23 -cpfklzcpp2eightfjqcrsmhlnxckxmtdchbzqblqsqqp -34six1 -5fivex4 -fivefivepjfrpzdvcq2 -onelnppnxczthreelldqndvt3 -nine699ninexjnine -16one74 -8jdkblqbq59zlkhj97one -ckrft6sixeight -fourldmq24 -87zvt -threefiveone75hxnqqsjroneeight -lsxlzvssshlvbr5vtvgsznrxhkp73 -threeknpqxxgg84 -oneone3mvtlxjhfiveksgpnms9kzkf -thxrqsrninefourfive31kbcp57 -fivesixnine6oneqgxckbjqfszpsvhjgms -eightsix83 -ttwone9qqhg7 -7fhvffiveftkbfgxsdfourthree1 -hbkst6foursixdndhmtwosix -mhgxpvgmndjgsftqjkkxkfzxmhgtdpxxmbztwo6six -two6ljpjc8ffgmblpxrcsevenvbsm -xqbmzh85mqchftctnfourfkeight7 -xlbltdqcsx2sixmqdzvxhqj -eight468 -nine2rcrgfpx5 -eight5tjoneseven -hncnnjvbdfdfcthree1 -sixzfllx24threesevensix -7eighteight -8652sslmpr1 -m88ktthbnh5 -six1ninethree -sevengtb6 -9eightzpdkqzp3 -tplshfhqsshs4 -4twothreefpj -48threetwockbzxdhqp4eight -eightmkeightjdgmvxdqfx7 -six99 -69one -twodmnzphhsb2 -three3zhqckdqeight1 -2x9xjzgtdgk5ninefourseven -4vrpseven7tq -86cjqrqp -one8four67 -three7two7six2kxl -bhnbkthreetwofqchzvbxjqqm4seven4five -onehncctk2qnphtkjns -6stmbmtj1ms -mdhmknhftkdtnrgkbmh7six1six -six4three5 -fnccxltjdn4gteightfourone3 -twofoureight5seven4 -four7twosix8three -pgvjtszlkx4 -threeseven438two5 -six78qhspmhqtkc -56sevenjdfvfbzvsgthreemrbmcqctgonesixppg -fivesevenlsixvgxfkxtbclkbsqt35 -sixeightfiveseven7three -frmgthreefour3szxtf1 -5eightrvflvtqzq8sevenj -five5dbtfxqxzfour52mxfzmkfks -2ggjtsdmdr6 -cpszsjthree4 -rrd8rrfcvzhcdr651rfc6h -sfnfsc89eighttmsc888t -46eight -992sevenzsxkzxxppnkxlxkpbz -seven93tzgthree -952sszqqqrc1seven -fivetwo3sevenfive4 -pfgdhlvv23onesixtwoznfrlcndlvr8 -mhcvnl1three5 -3twofour3pgjtjp2five1 -nfcvxxcltwo49khnmggcdlr5 -8frh21n -6p477xtfrhvclvnxpbdmftrgd2 -sevenbqsdxlceight3 -seven2nine86jx -44cqv -7bfgmrc -88twoonethree4m5oneightn -94eightthreefourdqdrnx8threetwonepbt -onegvkdxllnd76 -onechljqc4mvhljvcgbthree -2ninenine1two -threenineone8ggnbmnfcnfteightsix1 -eight6fivermqnm94onessnplzpkzjm -7fivezcnlhtfournine -pfourvpqfqz7foursix -sevenonedcs9 -threebfspz4b6sevennzkznbd7 -tbg56jzgmkgmxnbncvtgrpk4 -337sdxdlbqd2 -4tcvrpvqkkhhthmcjzggqgmpdonektzmrrszs -twocfgqtp7 -sevenfcmgkblzh4mvgjmktn4 -ptnqxxf1two -fqftxjznine186three -6foursevenonenjkbdjfbhhtvdthreethreeeight -4two3 -zhronethree2six3five7 -3fxbqvvkh6twoneftm -zf2two4xndhkmb93 -fivefivefour9rhcjxxtbtd63nxtk -five3qpvgdcqcvcvbn6 -1qjckjqkbqvbtqkrbvkxp -2gnglzbllksix6fgfjrrltrhrspl5seven -four6five8gpktxzxcdtvqsevenqlbsnine -seven6lgkknlfouronegxnine2 -9ninefour8fourpd2threetwo -358lmjlsevensjrlhkbspkqxcfourmktxqrhjz -mbqnmgjcbninenine82djlmzk38 -four6lgd66eighteight8 -three566 -czeightwoninefive7one -threecmkmzszq337rsctbvvpgvlfvreight -btwone91blrcbjvpfl -cgfddzmnmz3 -seven3sixsixnqt9 -xsthfourtwo1nine5dpvjpnine -97fpjzktsixtzpdseven5 -seven6fivefive -two16 -nddxvnqnggdzcnhthree2 -1sixseven -three1nvpdzhrndgbvfiveeight1 -134 -threeeightlvbp6 -qmrmqcjkdfoursixfive8915six -2jrsix78twoninefour -5vgtsevenfoureighttmntdgptbvxonez -2npzxnpmdtxctgeightrbvrgdkqthree5fg -hxtvnvqffivekgzcl6dtmplhqprfdbzdoneninesix -two384zlqs8351 -2sevensgnxgzkqsixtwo -nkone877fivegtr -ldr43 -six3nrstcpvfive6 -one799onenineseven -4onetwofourfourghpzmgjthree -one53two8tnmlpcxvvqvrtjthreefour -49nine -sgnxr3two -threeblnc1six3hvdlj1 -8sskxtzkl35hknine8one -keightcqbkbz9gsbxdqshzngxcbjqtqn -7foursixnine -sbhv3lvkgsgk -dmvthree152cjh -two6nzdd7rrltcngdbshfzlhsix -1nxthreetchfsleightq6v -5threevrc9four6st -b2threeeightonesix44hnxzcm -2threefourfournine -1fxbbfszjhseven -lrxhhqdzx2sixsixtwo7eight6nine -2eightmzzcgszpxr -7nine7sevenzndthknx1 -kkstmkvmfeight92ninelpxhsssk9 -1zjpvbmzdxxc -ninevtqgtzxtprbst1bxxsrrrztnhbjrdqvlheightvbhncs -7seven8threeeight -mfzkktfoneseven8pvqpszgqjszx -lr9kddzcxmmxc253lxfournine -three29gpbvjthree6hcnxzqcdcj -sixljtcnxbq8vnbrjgd9qsqonethreenzdnvjjg -vpeightwo15 -lctthree6four14nine -eightfiveone47sevenhdxtlninegffpzhjmh -foursixhtx9nineseven8 -seven94four -9h6nine -fivemxkfxvbpneight8hqlmmrmeight6 -five5bhrghlfiveseventhreeoneseven -eight79nbmspstpkxhttvrq -xqcmqxnine6 -prcnjkshkvlcgsixfiveone6 -btbcs2rsrcrshzp8six89 -5tg578fldlcxponefourtwonet -v4 -gqrnpz5sth -xcsmcfour3eightts -eight691seven8cxdbveightzv -onenjhcd9 diff --git a/input/2023/day02.txt b/input/2023/day02.txt deleted file mode 100644 index 4f7922d..0000000 --- a/input/2023/day02.txt +++ /dev/null @@ -1,100 +0,0 @@ -Game 1: 1 red, 5 blue, 1 green; 16 blue, 3 red; 6 blue, 5 red; 4 red, 7 blue, 1 green -Game 2: 4 blue; 4 red, 3 blue, 1 green; 4 red, 9 blue, 2 green; 5 blue, 7 green, 4 red -Game 3: 10 blue; 7 blue, 1 green; 19 blue, 1 green, 9 red -Game 4: 2 green; 14 blue, 14 red, 4 green; 12 red, 11 green, 13 blue; 5 green, 9 red, 4 blue; 9 red, 7 green, 12 blue; 2 green, 3 blue, 8 red -Game 5: 3 blue, 4 red; 12 red, 2 green, 15 blue; 1 red, 10 blue, 1 green -Game 6: 1 blue, 7 red; 3 green, 5 red, 1 blue; 1 green, 7 red; 6 red, 1 blue, 4 green; 1 green, 8 red, 1 blue; 2 green, 4 red, 1 blue -Game 7: 11 green, 10 blue, 2 red; 1 green, 12 blue, 2 red; 9 green, 14 blue; 1 red, 19 blue, 15 green -Game 8: 4 green, 2 red, 14 blue; 9 green, 1 red, 15 blue; 2 green, 9 red, 8 blue; 11 green, 7 red, 8 blue; 9 red, 7 green, 6 blue -Game 9: 4 blue, 1 green, 2 red; 1 blue, 3 red; 1 red, 3 blue, 3 green -Game 10: 4 red, 3 green, 6 blue; 2 green, 15 blue, 6 red; 3 green, 2 blue; 2 red, 1 green; 11 blue, 7 red, 4 green; 2 blue, 2 red, 4 green -Game 11: 10 red, 1 green, 7 blue; 5 red, 2 green, 7 blue; 2 green, 4 blue; 1 green, 10 red, 10 blue; 8 blue, 4 red -Game 12: 6 green, 2 blue, 7 red; 3 green, 2 blue, 3 red; 6 red, 1 blue, 9 green; 9 green, 13 red, 5 blue; 6 green, 4 blue, 8 red -Game 13: 10 green, 4 red, 6 blue; 19 red, 6 green, 7 blue; 6 blue, 5 red, 8 green -Game 14: 4 blue, 2 green; 19 blue; 6 red, 17 blue; 10 blue, 7 red; 1 green, 2 blue, 7 red -Game 15: 4 green, 12 blue, 15 red; 10 blue, 18 green, 13 red; 20 blue, 6 green, 10 red; 20 red, 12 blue, 13 green; 12 blue, 17 green, 10 red; 1 red, 3 blue, 7 green -Game 16: 1 blue, 6 red, 5 green; 3 red, 3 green; 5 green, 1 red; 2 red, 1 blue, 6 green; 1 blue, 1 red, 6 green; 1 blue, 6 green -Game 17: 4 red, 3 blue, 3 green; 8 blue, 8 green; 5 red, 3 green, 9 blue; 9 green, 12 blue, 13 red; 1 green, 1 blue, 5 red; 7 green, 6 red -Game 18: 2 green, 11 blue, 6 red; 2 green, 11 red, 2 blue; 7 red, 4 blue, 9 green; 18 blue, 6 red, 1 green -Game 19: 4 red, 7 green, 17 blue; 5 green, 6 red, 4 blue; 4 blue, 4 red, 1 green -Game 20: 2 blue, 5 green, 9 red; 4 green, 8 red, 10 blue; 7 blue, 9 red, 1 green; 1 green, 10 blue, 9 red; 1 green, 8 red; 8 blue, 8 red, 1 green -Game 21: 1 blue, 14 red; 1 green, 2 red; 9 red, 1 blue, 1 green -Game 22: 7 green, 9 red, 4 blue; 9 red, 7 green, 9 blue; 8 green, 14 red; 5 blue; 10 red, 1 blue, 1 green; 8 green -Game 23: 2 red, 12 green, 5 blue; 3 red, 5 blue, 3 green; 1 red, 9 green, 1 blue; 8 green, 6 blue; 13 green -Game 24: 8 red, 7 green, 1 blue; 1 red, 6 green, 7 blue; 1 green, 3 red -Game 25: 4 green, 2 red; 1 red, 2 green, 8 blue; 1 green; 8 blue -Game 26: 1 green, 4 blue, 17 red; 15 red, 3 green, 3 blue; 2 blue, 2 red; 18 red, 2 green, 11 blue; 6 red, 7 blue; 10 blue, 1 green, 4 red -Game 27: 2 red, 5 blue, 1 green; 14 green, 2 red, 6 blue; 1 red, 4 blue, 14 green -Game 28: 3 red, 5 green, 2 blue; 2 red, 3 green, 4 blue; 1 red, 9 green, 3 blue; 13 green, 4 red, 4 blue -Game 29: 18 red, 11 green; 4 blue, 18 red, 9 green; 16 red, 2 green, 4 blue; 2 red, 3 blue, 12 green; 1 green, 18 red; 2 blue, 15 green, 1 red -Game 30: 10 red, 3 blue, 1 green; 6 red, 1 blue, 3 green; 2 green, 2 blue, 10 red; 6 green; 3 blue, 15 red -Game 31: 1 blue, 7 green, 2 red; 12 red, 8 green, 4 blue; 2 green, 2 blue, 5 red; 2 blue, 3 green, 12 red; 7 red, 5 green, 4 blue; 7 red, 1 blue -Game 32: 4 blue, 5 red, 11 green; 20 red, 8 green, 1 blue; 10 red, 7 green, 1 blue; 1 blue, 7 red, 2 green; 1 red, 19 green, 3 blue -Game 33: 9 red; 9 red, 6 green, 7 blue; 5 red, 7 blue, 2 green -Game 34: 5 green, 5 red, 3 blue; 8 green, 6 blue, 16 red; 12 blue, 8 red, 8 green; 1 blue, 10 red, 3 green; 1 green, 13 blue, 18 red; 4 blue, 5 green, 8 red -Game 35: 15 green, 4 red, 8 blue; 7 red, 1 green, 14 blue; 12 green, 16 blue, 2 red -Game 36: 3 blue, 3 green, 2 red; 7 red, 8 blue; 11 blue, 9 red; 4 red, 13 blue, 1 green -Game 37: 4 red, 11 blue, 8 green; 6 green, 4 blue, 14 red; 5 blue, 7 green, 13 red; 6 red, 2 green, 5 blue; 4 red, 3 blue, 1 green; 6 red, 4 green, 6 blue -Game 38: 10 green, 5 blue, 1 red; 3 red, 6 blue, 3 green; 9 green, 9 blue, 3 red; 9 blue, 1 red, 6 green -Game 39: 3 blue, 16 red; 10 red, 4 green, 2 blue; 2 blue, 13 red, 1 green; 2 blue, 11 red, 2 green; 3 green, 13 red -Game 40: 2 blue, 3 red, 2 green; 2 green, 2 blue, 6 red; 1 green, 9 red -Game 41: 1 blue, 12 red; 8 blue, 1 red, 5 green; 1 green, 7 blue, 13 red; 8 red, 7 blue, 7 green; 4 green, 17 red, 9 blue; 2 green, 8 blue -Game 42: 2 green, 6 red, 1 blue; 3 red, 2 green; 9 red, 1 green; 2 red, 2 green -Game 43: 10 blue, 9 red; 14 blue, 4 green; 5 red, 3 green, 9 blue; 5 blue, 8 green, 1 red -Game 44: 3 blue, 10 green, 1 red; 1 blue, 13 red, 3 green; 1 blue, 5 green, 16 red -Game 45: 1 red, 1 green, 3 blue; 2 green, 1 red, 5 blue; 1 red, 2 blue, 1 green; 1 blue; 1 green, 5 blue; 1 blue -Game 46: 8 green, 8 blue, 4 red; 10 green, 4 red, 7 blue; 2 red, 3 green, 14 blue -Game 47: 3 green, 3 red; 5 green, 2 blue, 6 red; 3 blue, 5 red, 15 green; 2 green, 2 blue, 2 red -Game 48: 11 blue, 12 green, 3 red; 8 blue, 3 red, 3 green; 1 green, 6 blue, 2 red -Game 49: 3 blue, 17 green, 1 red; 4 red, 16 blue, 17 green; 1 green, 3 red, 5 blue; 14 blue, 1 red, 12 green -Game 50: 2 blue, 5 red, 6 green; 8 blue, 11 green, 5 red; 2 green, 2 red, 6 blue -Game 51: 1 green, 2 red; 4 green; 1 blue, 10 green -Game 52: 8 blue, 9 red, 4 green; 2 green, 8 blue, 2 red; 1 red, 2 green, 1 blue; 2 blue, 8 green, 8 red; 4 red, 1 green, 9 blue; 11 blue, 4 green, 8 red -Game 53: 1 green, 2 red; 3 blue, 1 green, 9 red; 5 blue, 11 red; 4 blue, 6 red, 1 green; 5 blue, 10 red; 5 blue, 5 red, 1 green -Game 54: 1 blue, 8 green; 9 green, 1 red, 11 blue; 16 green, 8 blue; 5 green -Game 55: 7 blue, 2 red, 1 green; 16 green, 19 blue, 5 red; 9 green, 3 blue, 7 red; 8 blue, 2 green, 4 red; 8 green, 15 blue, 5 red -Game 56: 9 blue, 1 red, 4 green; 12 green, 12 blue; 1 green, 1 red, 5 blue -Game 57: 1 green, 10 blue; 1 red, 9 blue; 10 blue, 1 red, 3 green -Game 58: 6 red, 15 blue, 3 green; 13 blue, 5 red; 10 blue, 2 red; 5 red, 1 green, 14 blue -Game 59: 7 red, 1 blue, 9 green; 4 green, 12 red, 2 blue; 6 green, 20 red, 1 blue; 4 blue, 9 red, 2 green; 8 red, 4 blue, 2 green -Game 60: 11 red, 8 blue, 1 green; 18 green, 11 blue; 16 red, 10 blue, 7 green; 6 blue, 8 red; 7 red, 15 green, 4 blue -Game 61: 1 blue, 1 green, 8 red; 3 red, 7 blue; 4 blue, 10 red; 1 green, 5 red, 8 blue; 10 red, 7 blue -Game 62: 12 blue, 1 red, 1 green; 2 green, 1 red, 7 blue; 3 green, 18 blue; 11 blue, 4 green -Game 63: 4 green, 4 red, 8 blue; 7 red, 5 blue, 5 green; 2 green, 20 blue, 4 red; 1 green, 4 blue, 3 red -Game 64: 2 green, 2 red; 3 green, 2 blue; 12 green, 2 red, 4 blue; 5 red, 9 green, 8 blue; 7 blue, 6 green; 3 green, 5 red -Game 65: 8 red, 2 green, 13 blue; 11 blue; 7 blue, 2 green; 12 blue, 1 green, 9 red -Game 66: 1 blue, 3 red, 19 green; 3 red, 17 blue, 15 green; 9 green, 9 blue -Game 67: 2 green, 7 blue, 1 red; 3 green, 1 red, 7 blue; 1 red, 6 green; 7 blue, 2 red, 10 green; 2 red, 5 green, 4 blue -Game 68: 14 red, 10 green, 8 blue; 11 red, 1 blue, 6 green; 7 red, 7 green; 12 blue, 10 green, 3 red; 6 red, 12 blue, 10 green; 8 green, 14 red, 3 blue -Game 69: 4 green, 8 red; 2 red, 15 green; 5 red, 1 blue, 12 green; 13 red, 6 green; 10 green, 13 red, 1 blue -Game 70: 3 red, 10 blue, 3 green; 8 red, 11 blue, 11 green; 5 red, 13 green -Game 71: 18 green, 3 red, 1 blue; 3 blue, 14 green, 2 red; 6 blue, 20 green, 4 red -Game 72: 2 blue, 1 red; 2 blue, 3 green, 1 red; 4 blue, 2 red, 4 green -Game 73: 11 red, 11 green; 5 green, 1 blue; 8 red, 7 green, 4 blue; 5 blue, 7 red, 12 green -Game 74: 12 red, 12 green, 5 blue; 10 red, 7 blue, 15 green; 6 green, 19 red, 19 blue; 3 red, 7 blue, 16 green; 11 red, 14 green, 16 blue -Game 75: 5 red, 17 green, 8 blue; 10 red, 8 blue, 19 green; 9 blue, 6 red, 18 green; 3 blue, 13 red, 12 green -Game 76: 5 green, 2 red, 8 blue; 3 blue, 14 red, 2 green; 14 red, 1 blue; 3 green, 8 blue, 15 red; 11 red, 1 green; 11 red, 9 blue, 3 green -Game 77: 3 blue, 2 red; 1 blue, 8 green, 11 red; 14 green, 14 red; 3 red, 5 green, 5 blue; 2 green, 16 blue, 3 red; 13 red, 7 green, 5 blue -Game 78: 3 blue, 1 green, 1 red; 5 blue, 1 green, 1 red; 9 blue, 7 red, 1 green; 5 blue, 1 green, 5 red; 10 blue, 3 green, 7 red -Game 79: 19 green, 17 blue, 4 red; 7 green, 7 red, 16 blue; 4 red, 10 green; 13 blue, 17 green, 2 red -Game 80: 9 blue, 3 green; 15 blue, 1 red; 3 blue, 12 green, 2 red; 1 red, 14 green, 13 blue; 1 red, 10 blue, 16 green; 8 blue, 6 green, 2 red -Game 81: 1 green, 3 red, 19 blue; 2 red, 1 green, 9 blue; 1 green, 2 red, 8 blue; 1 red, 1 green, 11 blue; 1 green, 3 red, 11 blue -Game 82: 8 red, 1 blue, 4 green; 9 green, 3 blue, 4 red; 3 green, 3 blue, 18 red -Game 83: 3 red, 13 blue, 16 green; 16 green, 2 blue; 14 green, 12 blue; 8 green, 14 blue, 4 red; 12 green, 4 blue; 20 green, 1 red -Game 84: 4 green, 4 blue, 5 red; 6 red, 6 blue, 8 green; 5 blue, 12 green, 3 red; 5 red, 13 green; 6 blue, 1 green, 5 red -Game 85: 10 green; 7 green, 1 blue; 5 red, 5 blue, 1 green; 2 green, 2 red, 3 blue; 3 red, 10 green, 3 blue; 1 blue, 1 red -Game 86: 3 green, 1 red, 3 blue; 2 red, 2 green; 9 green, 2 blue, 3 red; 3 red, 3 blue, 4 green -Game 87: 6 red, 4 green; 1 red, 3 green, 5 blue; 1 green, 7 blue, 4 red -Game 88: 2 green, 4 red, 3 blue; 5 green, 1 blue; 3 red, 5 green, 2 blue; 1 green, 6 red, 1 blue; 7 red, 2 blue; 17 red, 13 green -Game 89: 4 green, 2 blue, 6 red; 15 red, 7 green, 10 blue; 7 red, 9 blue, 4 green -Game 90: 9 red, 17 blue; 1 green, 9 blue; 5 red, 8 blue; 3 blue, 9 red, 1 green; 17 blue, 1 red -Game 91: 7 green, 3 red, 5 blue; 4 blue, 3 red, 9 green; 9 red, 7 blue, 7 green; 5 red, 6 blue, 3 green; 10 red, 2 green, 6 blue -Game 92: 13 blue, 8 red; 7 green, 1 red, 8 blue; 5 blue, 4 red, 2 green; 9 red, 10 blue -Game 93: 6 green; 1 blue, 16 green, 6 red; 5 green, 1 blue, 5 red; 5 red, 6 green; 16 green, 2 red, 1 blue; 11 green, 2 red -Game 94: 9 blue, 4 green; 12 green, 17 blue; 4 green, 5 blue, 6 red; 2 red, 2 blue, 12 green -Game 95: 5 red, 4 blue, 5 green; 2 blue, 4 green, 4 red; 4 blue, 2 red, 7 green; 1 green, 7 blue, 8 red -Game 96: 7 blue, 6 green, 2 red; 3 green, 1 blue; 7 blue, 3 red, 5 green; 1 green, 5 blue; 6 blue, 2 red; 2 green, 1 red -Game 97: 10 red, 1 green, 1 blue; 4 green, 11 red, 2 blue; 4 red, 1 blue, 4 green -Game 98: 3 green, 4 blue, 7 red; 7 red, 8 green; 7 green, 16 red, 1 blue; 8 green, 2 blue, 4 red; 5 green, 3 blue, 18 red -Game 99: 6 green, 12 red, 1 blue; 5 blue, 1 red, 7 green; 5 green, 7 red, 10 blue; 8 blue, 1 red, 7 green; 17 red, 4 blue, 9 green -Game 100: 6 blue, 10 green; 3 green, 4 blue, 1 red; 7 blue, 1 red, 12 green diff --git a/input/2023/day04.txt b/input/2023/day04.txt deleted file mode 100644 index 66672be..0000000 --- a/input/2023/day04.txt +++ /dev/null @@ -1,213 +0,0 @@ -Card 1: 58 6 71 93 96 38 25 29 17 8 | 79 33 93 58 53 96 71 8 67 90 17 6 46 85 64 25 73 32 18 52 77 16 63 2 38 -Card 2: 34 79 17 22 15 73 61 58 46 32 | 36 53 22 32 56 15 71 7 17 19 79 81 44 59 46 34 52 61 24 73 54 28 88 50 58 -Card 3: 20 71 73 21 96 61 4 66 19 47 | 55 31 54 72 47 2 61 19 36 4 92 64 68 20 96 21 75 49 73 67 66 26 12 71 98 -Card 4: 6 34 71 49 82 67 22 9 72 96 | 49 32 84 82 2 72 60 67 14 99 22 9 38 6 7 34 91 83 43 96 74 40 71 53 58 -Card 5: 76 99 87 97 16 61 73 20 22 19 | 83 27 89 80 1 84 23 21 35 12 60 17 63 26 88 3 70 49 6 34 30 77 59 82 66 -Card 6: 26 46 80 73 50 3 44 27 87 96 | 92 46 76 87 50 27 58 68 3 47 93 80 41 64 26 9 96 43 63 73 91 74 22 53 7 -Card 7: 6 7 4 44 94 90 19 42 70 53 | 44 2 59 94 99 28 34 48 39 72 96 27 14 92 87 84 74 85 47 69 6 67 17 31 33 -Card 8: 17 88 30 94 59 60 79 90 18 9 | 88 94 96 59 18 34 30 86 62 16 2 79 9 70 60 17 95 91 73 40 90 4 93 15 39 -Card 9: 44 38 8 48 5 84 6 53 7 86 | 77 36 97 84 91 34 6 13 86 52 38 45 27 16 5 56 72 8 7 99 53 44 31 57 48 -Card 10: 89 97 85 41 94 37 36 79 8 64 | 83 34 66 32 49 80 86 84 52 43 5 25 73 7 74 55 72 78 63 14 28 48 16 75 30 -Card 11: 33 18 46 65 44 14 99 56 38 80 | 5 48 85 25 70 52 97 99 56 45 26 92 49 24 81 96 65 42 72 16 78 46 54 10 13 -Card 12: 43 48 2 90 99 20 69 51 6 88 | 88 99 52 79 80 29 43 51 19 62 66 18 23 32 55 60 7 85 90 16 2 46 27 69 9 -Card 13: 67 73 47 37 96 88 65 52 19 10 | 49 28 84 78 11 54 17 86 74 56 89 95 91 98 4 67 61 60 50 94 12 48 77 62 66 -Card 14: 22 49 71 37 92 30 54 47 26 68 | 35 67 76 96 27 89 43 58 82 11 17 8 94 77 69 3 9 29 39 55 6 87 84 7 46 -Card 15: 28 5 65 51 76 96 35 98 2 62 | 76 5 24 14 81 26 32 2 6 50 65 71 96 90 70 7 39 49 66 79 19 85 44 3 61 -Card 16: 13 93 1 50 51 28 73 67 56 4 | 12 81 20 82 9 48 21 78 36 17 76 35 57 91 18 27 11 16 49 23 5 65 58 29 62 -Card 17: 68 53 93 91 64 77 41 32 86 19 | 60 92 44 54 71 94 52 82 66 11 97 89 10 35 86 99 79 3 20 25 70 56 91 62 74 -Card 18: 24 60 95 5 52 71 82 55 31 45 | 59 87 7 49 77 80 27 62 78 53 14 90 3 96 44 54 91 30 17 51 73 12 66 84 20 -Card 19: 49 84 1 12 28 56 55 19 57 59 | 44 50 5 99 38 63 20 84 31 66 73 36 53 10 7 21 15 67 77 76 19 25 52 61 98 -Card 20: 43 12 26 91 27 66 49 95 14 18 | 47 73 40 85 89 1 17 48 52 39 88 50 58 19 16 68 65 38 32 97 4 34 75 91 54 -Card 21: 46 50 63 61 32 33 47 86 68 35 | 81 91 38 11 76 37 77 75 49 78 33 66 30 72 57 59 15 52 5 50 13 47 71 69 35 -Card 22: 45 7 69 50 42 94 19 64 26 96 | 22 89 37 56 72 3 80 11 70 42 61 52 87 65 86 90 31 39 53 91 23 81 62 9 4 -Card 23: 23 43 20 98 69 73 31 27 67 97 | 88 26 62 10 42 4 85 74 66 59 90 6 89 54 68 87 18 23 40 15 93 29 55 47 70 -Card 24: 35 70 13 23 19 50 58 91 69 99 | 38 94 91 60 63 92 55 74 62 15 26 4 52 28 78 10 46 89 87 53 37 32 85 18 2 -Card 25: 13 22 42 58 15 55 47 50 63 32 | 25 45 78 98 65 44 12 43 89 72 11 14 82 59 28 3 76 57 66 20 18 35 39 77 64 -Card 26: 33 62 41 81 19 10 99 64 63 85 | 11 81 85 2 52 19 64 15 33 59 99 54 1 10 43 96 56 84 58 53 12 41 63 62 94 -Card 27: 79 65 92 3 84 89 34 15 87 45 | 19 23 35 4 99 7 78 27 11 83 69 56 42 76 8 49 28 3 74 92 63 38 1 34 44 -Card 28: 64 4 50 16 29 87 18 34 61 11 | 29 61 50 87 16 94 51 47 37 41 11 49 9 93 4 80 57 99 64 54 53 33 32 18 84 -Card 29: 3 32 57 88 4 78 10 9 90 46 | 46 80 57 10 93 38 22 74 3 90 27 64 19 14 4 65 96 40 13 88 89 9 47 78 32 -Card 30: 68 71 42 36 14 87 63 28 47 39 | 55 37 48 34 52 35 3 67 68 47 98 62 22 27 18 87 29 38 80 14 65 82 31 92 50 -Card 31: 17 78 64 30 60 53 82 7 65 72 | 80 99 55 49 65 32 7 54 72 90 30 26 95 82 88 48 17 60 64 53 20 78 27 61 86 -Card 32: 54 20 29 6 14 24 25 18 38 97 | 31 99 20 39 59 28 12 16 30 76 10 69 48 56 8 15 72 13 62 42 3 51 9 40 83 -Card 33: 25 27 63 97 95 6 8 42 41 96 | 95 75 50 49 77 13 22 21 16 97 46 64 27 37 32 18 76 41 8 20 11 40 33 25 6 -Card 34: 73 43 53 1 87 52 56 9 26 83 | 55 56 82 28 5 74 14 25 53 87 86 70 52 83 77 90 57 31 9 19 3 26 1 8 60 -Card 35: 76 73 77 43 83 52 24 44 18 26 | 91 54 18 36 47 17 63 50 59 6 15 11 74 48 33 83 67 97 73 16 24 44 60 26 46 -Card 36: 93 29 51 71 43 41 73 91 89 58 | 87 7 41 21 89 25 91 20 99 3 13 58 95 30 51 31 98 53 15 22 29 81 45 47 73 -Card 37: 36 68 86 66 61 81 76 79 20 64 | 92 66 53 73 88 48 29 81 82 36 89 79 72 9 10 99 84 64 24 51 15 68 61 76 20 -Card 38: 46 68 48 82 27 94 79 10 41 14 | 57 94 11 10 14 40 9 72 36 41 79 65 99 66 82 46 43 22 49 24 48 2 90 47 89 -Card 39: 3 9 91 15 86 68 28 89 67 29 | 14 63 8 58 15 91 59 28 29 12 80 62 53 86 89 51 68 72 69 66 11 90 9 18 78 -Card 40: 40 51 46 81 7 35 94 96 23 16 | 18 94 61 51 50 27 46 9 99 85 29 36 84 43 81 71 56 38 23 96 40 16 28 1 88 -Card 41: 87 20 88 12 65 4 18 52 74 10 | 9 10 78 81 11 20 98 52 4 14 77 45 80 1 18 65 49 79 91 8 53 6 88 12 92 -Card 42: 44 94 36 68 31 26 76 89 16 1 | 76 52 28 68 43 17 74 44 87 94 63 20 36 51 1 83 42 56 67 49 57 8 31 72 93 -Card 43: 68 65 53 58 78 28 46 10 91 80 | 21 65 99 85 60 35 26 39 68 64 30 58 91 59 54 93 76 67 78 19 74 82 71 50 80 -Card 44: 71 59 82 37 51 19 57 24 52 80 | 97 74 98 13 91 70 85 61 36 43 90 12 6 75 93 7 89 84 15 73 11 41 34 86 47 -Card 45: 25 40 3 51 19 69 68 27 7 62 | 55 59 45 78 87 48 13 50 94 46 65 1 66 21 70 28 8 81 42 2 23 36 54 26 10 -Card 46: 39 51 95 90 80 83 19 73 41 54 | 81 78 62 18 58 84 83 71 31 88 43 86 28 70 5 4 24 34 85 33 72 53 23 94 61 -Card 47: 14 66 55 61 88 12 96 67 75 28 | 42 93 33 19 18 96 48 26 11 89 68 99 49 78 38 10 67 23 62 3 97 53 52 83 35 -Card 48: 8 88 37 27 45 30 87 79 46 75 | 57 60 56 40 67 51 59 35 93 77 41 95 14 82 96 11 87 34 52 62 94 78 92 98 20 -Card 49: 94 76 65 30 99 20 32 90 51 87 | 36 29 68 97 48 38 57 10 3 43 24 86 9 6 54 92 67 75 15 98 81 7 60 14 58 -Card 50: 88 12 95 13 44 80 51 76 66 42 | 76 2 51 28 37 55 30 19 83 12 44 82 34 39 33 70 13 80 66 32 42 71 27 72 88 -Card 51: 16 5 28 7 22 50 71 32 18 61 | 33 71 65 61 75 5 41 44 7 27 50 51 32 3 22 8 42 34 18 1 16 70 28 6 58 -Card 52: 45 25 80 42 79 37 70 88 59 97 | 62 45 83 8 59 27 97 30 61 85 69 67 70 28 65 87 41 43 42 37 80 25 79 88 18 -Card 53: 95 69 14 72 76 77 21 74 54 96 | 12 22 14 8 23 26 76 68 95 86 27 84 50 21 69 96 74 54 71 82 56 77 1 6 72 -Card 54: 5 45 68 98 6 14 9 50 85 42 | 22 99 92 36 93 17 27 51 53 71 12 54 52 50 35 40 5 76 28 66 63 85 74 65 44 -Card 55: 63 20 6 57 60 77 80 5 12 66 | 4 95 35 10 13 11 1 69 51 5 23 31 80 24 87 22 63 46 60 79 68 90 77 47 74 -Card 56: 83 62 93 85 15 30 53 31 96 2 | 98 66 27 91 36 89 41 74 12 21 23 76 57 24 15 55 88 47 3 19 60 30 83 85 92 -Card 57: 32 35 33 46 44 76 2 26 87 50 | 12 84 25 8 3 87 76 33 7 44 18 19 47 32 35 2 30 46 70 50 1 78 10 65 26 -Card 58: 19 64 82 63 11 24 68 77 91 20 | 64 1 85 30 20 52 16 8 19 10 11 56 4 82 15 68 63 77 24 2 83 6 91 76 5 -Card 59: 57 97 98 91 30 21 59 84 93 53 | 73 68 3 98 77 78 86 30 31 89 74 7 1 38 90 53 50 91 84 46 57 93 97 59 21 -Card 60: 49 43 92 57 25 60 26 85 69 88 | 25 69 71 3 49 41 89 96 52 12 92 97 26 83 57 66 62 24 23 28 98 43 82 80 85 -Card 61: 60 18 69 89 45 21 41 30 95 55 | 75 41 44 60 36 97 3 45 33 17 20 62 98 89 59 72 39 80 47 85 42 90 82 23 69 -Card 62: 67 25 34 10 49 41 45 80 65 33 | 65 53 11 21 67 90 45 96 80 19 81 7 30 64 33 34 10 39 29 98 57 68 89 54 41 -Card 63: 16 94 89 92 17 86 69 3 66 96 | 41 79 64 61 59 76 33 81 31 26 80 16 52 14 98 9 3 47 89 66 63 92 86 84 56 -Card 64: 59 94 14 65 69 22 36 27 91 3 | 21 45 23 11 15 56 36 32 40 69 92 78 83 25 94 80 33 9 90 63 81 24 96 7 35 -Card 65: 73 42 88 31 97 92 50 15 77 35 | 83 42 60 34 33 4 82 47 70 23 81 36 52 97 17 30 59 49 9 85 93 22 43 7 50 -Card 66: 24 40 81 73 60 14 20 31 28 88 | 15 49 73 72 23 36 50 16 14 2 61 44 57 96 27 93 60 24 6 94 91 92 18 8 74 -Card 67: 9 18 16 28 86 23 65 81 52 59 | 77 87 31 1 20 89 93 15 32 62 75 68 5 39 11 55 38 95 40 96 78 19 37 74 4 -Card 68: 73 4 5 13 92 85 20 24 75 55 | 42 87 30 72 95 17 28 66 61 15 96 93 97 27 43 76 63 81 70 68 64 32 25 53 33 -Card 69: 62 89 91 68 44 21 1 19 33 30 | 35 98 83 66 43 61 26 15 2 12 76 72 42 79 74 28 16 63 77 7 56 64 78 65 47 -Card 70: 43 27 74 56 26 77 59 72 33 20 | 25 89 86 85 96 82 69 16 60 55 99 95 31 73 5 8 9 92 83 53 21 32 23 71 78 -Card 71: 45 35 27 62 58 94 90 28 99 75 | 19 61 39 74 72 47 37 71 40 79 63 26 23 48 36 59 77 21 92 17 38 4 8 20 42 -Card 72: 36 43 39 45 58 2 38 12 69 74 | 14 2 81 80 85 12 38 43 49 4 88 69 74 40 39 28 67 58 89 13 68 45 36 87 79 -Card 73: 77 30 36 41 31 9 70 22 66 88 | 66 32 35 20 47 37 36 25 13 9 41 54 2 77 84 5 63 21 99 59 31 67 88 22 70 -Card 74: 82 10 5 28 32 30 73 9 55 53 | 27 43 28 22 64 36 55 5 53 90 29 73 44 49 32 69 14 52 45 23 70 3 2 15 66 -Card 75: 95 12 69 24 85 10 84 71 64 98 | 71 19 66 9 25 37 77 29 15 62 38 10 72 2 50 54 97 14 17 26 1 48 89 55 95 -Card 76: 50 77 72 64 93 82 28 65 57 43 | 39 89 70 54 86 49 83 5 56 57 12 32 28 3 7 38 51 34 22 66 84 19 73 50 71 -Card 77: 63 96 47 98 32 37 4 30 71 65 | 65 71 88 46 59 98 45 90 37 47 68 8 23 32 57 4 96 93 41 63 51 64 70 30 40 -Card 78: 16 63 74 26 24 61 99 41 91 85 | 73 50 67 14 57 93 91 63 7 75 99 85 66 62 95 88 77 53 64 94 1 96 15 16 36 -Card 79: 36 89 1 72 14 7 9 60 77 38 | 72 87 77 96 2 9 60 89 95 38 19 35 27 54 18 56 14 99 7 74 62 61 80 53 84 -Card 80: 74 14 52 76 87 19 36 57 37 67 | 51 65 26 11 5 87 22 21 94 9 41 79 93 67 52 74 36 75 76 96 8 81 14 60 1 -Card 81: 93 11 67 3 25 68 63 62 24 37 | 19 26 2 93 90 69 42 10 89 80 4 1 45 61 67 36 34 68 94 35 50 38 3 6 53 -Card 82: 37 23 20 54 2 76 87 9 8 31 | 31 62 37 13 32 43 40 72 87 44 20 42 1 29 93 51 69 8 53 76 91 34 23 2 54 -Card 83: 91 30 31 27 81 85 9 75 22 44 | 85 23 84 59 81 90 75 70 52 88 44 86 31 15 9 68 30 93 91 6 12 65 27 57 22 -Card 84: 23 19 67 74 60 95 37 90 6 45 | 36 62 26 71 94 67 96 21 18 99 84 23 19 95 82 60 30 45 4 29 75 80 90 43 74 -Card 85: 8 76 86 35 99 57 5 15 7 49 | 8 49 79 69 43 46 76 84 22 1 68 52 99 5 53 93 27 15 63 95 57 3 13 61 24 -Card 86: 97 17 85 58 9 44 99 73 27 57 | 96 85 57 60 64 68 18 36 79 97 45 43 55 1 26 31 73 44 14 39 78 27 76 99 63 -Card 87: 69 82 19 43 22 6 80 5 99 88 | 8 91 86 13 57 63 9 52 37 96 81 3 90 17 60 44 41 89 39 29 1 70 55 21 4 -Card 88: 44 8 41 84 38 91 70 31 1 50 | 60 83 4 51 49 88 90 14 34 45 70 25 56 23 91 11 38 41 48 7 2 19 28 9 27 -Card 89: 28 35 54 91 33 5 21 60 16 4 | 93 15 81 77 5 53 26 19 25 66 97 59 14 95 16 1 22 38 31 48 37 88 3 12 54 -Card 90: 10 34 24 28 91 5 29 69 93 17 | 58 82 43 79 78 51 48 66 2 76 37 70 52 94 15 53 88 16 32 23 38 59 83 44 31 -Card 91: 92 62 95 29 58 9 21 4 19 26 | 80 84 51 76 97 52 87 38 27 25 53 42 19 39 13 66 79 63 7 59 73 72 85 50 37 -Card 92: 81 89 79 75 73 76 74 2 91 53 | 48 63 70 58 65 37 60 86 64 36 16 15 32 66 35 76 78 54 25 94 45 30 71 21 83 -Card 93: 73 98 81 39 9 80 26 71 95 60 | 3 79 34 16 30 68 21 31 18 52 62 89 69 58 59 93 48 17 41 40 22 2 91 6 86 -Card 94: 47 67 80 63 87 90 55 95 91 82 | 55 10 91 39 63 95 50 82 83 43 87 67 69 31 78 94 71 28 8 32 47 5 80 56 90 -Card 95: 8 7 32 67 13 17 27 48 79 21 | 95 96 92 88 53 27 4 21 13 32 40 48 11 61 17 67 79 45 43 59 7 8 89 57 86 -Card 96: 30 23 1 77 92 31 27 67 39 55 | 77 87 3 92 31 90 58 67 71 60 1 30 8 27 23 17 86 64 55 39 82 43 44 33 99 -Card 97: 63 41 31 38 34 23 2 48 88 89 | 28 35 15 11 17 69 97 87 45 55 44 53 23 57 9 80 48 60 12 88 64 13 54 31 7 -Card 98: 1 90 5 6 10 60 23 21 43 53 | 6 10 60 80 5 50 69 39 76 23 21 66 70 44 53 81 34 65 90 1 43 85 31 98 59 -Card 99: 55 82 70 51 75 40 87 9 47 69 | 42 4 25 70 51 94 88 40 49 32 6 77 65 1 71 83 39 64 55 47 79 45 12 24 17 -Card 100: 28 69 65 17 11 29 93 21 83 23 | 9 42 55 49 62 20 95 56 30 43 54 71 32 3 58 19 16 82 41 21 51 59 80 23 63 -Card 101: 45 90 87 94 6 97 5 68 42 41 | 1 36 14 83 59 26 54 76 94 42 80 27 66 17 93 11 68 67 47 10 39 45 75 89 34 -Card 102: 65 25 7 97 66 83 57 1 61 51 | 17 74 50 84 54 69 18 2 30 86 25 16 5 48 58 34 78 97 12 66 53 61 46 44 8 -Card 103: 82 13 35 92 39 89 91 77 94 29 | 50 30 37 52 59 21 58 29 77 51 1 6 35 42 45 26 90 83 55 4 65 39 79 89 9 -Card 104: 17 40 30 48 90 87 16 97 14 79 | 44 39 22 99 49 50 71 23 45 38 97 61 86 35 20 12 67 59 28 47 72 81 34 83 25 -Card 105: 40 92 69 84 33 10 55 99 75 98 | 99 46 59 18 70 80 42 24 17 92 77 65 35 51 11 40 34 16 90 15 88 69 37 87 84 -Card 106: 83 86 9 38 42 96 32 8 98 40 | 24 35 65 56 93 37 91 31 57 15 76 42 19 12 67 83 29 30 81 66 87 94 80 18 92 -Card 107: 91 42 90 28 34 32 83 98 35 84 | 30 72 31 3 97 35 53 11 10 80 69 73 23 26 81 74 42 36 77 61 39 56 71 65 62 -Card 108: 45 53 47 86 13 25 5 66 68 71 | 38 35 56 11 82 80 94 31 10 74 93 29 65 90 27 75 60 39 99 97 55 92 37 57 17 -Card 109: 14 53 91 5 61 97 35 77 85 96 | 29 40 83 55 25 66 67 44 26 2 69 11 64 94 32 45 3 33 6 98 13 22 27 71 81 -Card 110: 81 83 71 72 44 46 59 10 47 18 | 64 76 97 93 52 38 94 28 51 48 17 22 69 79 98 30 14 31 20 66 89 2 9 55 21 -Card 111: 16 59 24 35 39 41 28 5 54 10 | 9 60 72 89 43 41 68 52 59 87 54 93 90 23 32 35 94 28 5 24 16 42 99 10 39 -Card 112: 31 76 81 11 50 62 40 13 57 66 | 40 21 77 95 56 76 66 22 12 46 52 1 57 64 63 83 25 49 62 3 81 94 87 11 98 -Card 113: 16 69 20 92 59 2 38 54 10 90 | 24 22 37 30 57 82 59 51 81 38 1 79 15 62 74 84 2 20 92 96 16 90 95 29 69 -Card 114: 9 66 93 18 40 58 25 36 72 50 | 55 33 82 40 96 68 95 58 43 18 93 50 8 9 94 47 36 23 7 38 75 24 66 72 25 -Card 115: 22 37 56 62 21 64 98 43 61 80 | 22 41 3 71 98 1 51 15 72 10 54 32 61 13 84 78 52 57 80 53 26 40 2 25 86 -Card 116: 61 62 48 15 90 76 18 11 97 89 | 33 12 69 15 82 24 38 6 61 28 40 1 54 50 81 76 68 59 26 94 43 20 51 4 58 -Card 117: 48 42 9 20 61 95 88 30 74 92 | 44 23 9 18 98 14 34 95 37 42 92 74 5 20 83 3 2 48 89 78 72 30 81 97 90 -Card 118: 35 19 87 33 11 86 16 79 90 50 | 41 64 61 83 53 30 94 86 98 68 44 1 32 34 35 79 58 21 19 84 85 25 73 67 24 -Card 119: 72 99 25 49 16 68 6 89 31 81 | 80 97 11 62 41 96 27 89 49 3 25 6 99 94 26 34 55 81 48 75 53 72 68 16 28 -Card 120: 78 77 54 70 9 6 22 43 40 16 | 48 20 54 25 75 91 33 67 3 5 95 37 29 90 1 24 32 39 12 51 71 16 36 76 63 -Card 121: 76 19 51 52 4 18 32 43 34 55 | 4 52 51 1 32 37 80 6 76 73 88 43 82 19 89 34 55 18 25 58 85 23 9 5 60 -Card 122: 62 13 36 6 12 87 37 89 71 61 | 61 96 35 57 41 27 52 82 22 26 6 87 14 72 73 84 68 29 39 15 16 75 12 62 37 -Card 123: 94 85 49 16 75 95 74 50 47 56 | 88 8 26 90 49 17 50 75 97 99 9 16 31 95 74 94 71 91 38 85 51 86 47 77 53 -Card 124: 42 47 86 68 46 12 76 11 92 28 | 8 87 93 61 58 91 53 34 4 51 50 17 73 84 6 60 3 31 65 22 90 95 85 19 49 -Card 125: 17 90 29 11 62 72 8 80 86 9 | 1 86 3 9 56 29 52 46 21 30 62 11 75 89 20 97 80 53 19 99 23 90 7 8 15 -Card 126: 83 45 41 89 78 37 17 19 68 75 | 65 50 14 67 75 31 88 87 64 36 44 17 37 19 63 40 89 78 43 85 7 10 72 13 41 -Card 127: 69 31 24 29 32 70 5 34 96 46 | 5 68 54 12 42 75 84 23 18 79 82 50 40 36 87 77 73 53 57 88 32 33 39 71 22 -Card 128: 25 31 17 76 94 82 77 44 68 62 | 64 81 29 78 68 80 38 93 27 90 69 9 88 15 47 11 73 28 42 57 51 70 13 5 26 -Card 129: 84 92 55 44 86 23 18 57 15 40 | 88 94 32 19 26 39 28 25 52 49 51 81 72 27 50 62 31 29 87 66 67 14 20 12 73 -Card 130: 97 57 99 82 46 73 48 25 47 12 | 30 5 77 75 35 67 18 37 52 64 74 38 11 59 41 68 80 73 83 46 71 36 33 84 47 -Card 131: 84 17 4 1 23 73 32 15 35 62 | 7 65 66 27 18 47 21 83 31 99 96 88 78 42 8 80 68 97 59 30 13 72 10 41 22 -Card 132: 17 45 87 44 13 68 85 3 99 21 | 64 53 78 93 49 57 79 60 90 10 63 27 68 55 4 91 73 92 83 26 70 35 8 41 97 -Card 133: 5 80 43 78 74 47 32 20 58 85 | 35 82 68 63 3 59 14 99 45 55 98 23 71 44 9 97 18 75 66 56 29 24 13 25 79 -Card 134: 84 91 50 6 28 57 78 74 44 14 | 3 78 32 35 31 59 45 5 89 23 11 38 49 40 82 65 4 19 17 33 60 77 7 71 62 -Card 135: 6 8 19 28 38 13 40 47 41 94 | 91 98 56 94 57 45 41 47 97 93 58 32 37 21 15 73 76 62 90 55 18 88 79 87 6 -Card 136: 15 94 90 19 71 20 62 46 47 9 | 47 19 84 83 53 28 71 91 61 77 43 38 27 15 42 23 97 48 7 52 46 76 81 9 57 -Card 137: 39 63 44 23 98 65 35 24 72 50 | 81 88 3 67 50 23 78 79 70 39 8 95 19 83 35 59 63 44 72 45 98 18 24 25 65 -Card 138: 33 56 23 48 32 7 83 52 39 63 | 38 33 34 84 70 74 56 13 95 52 59 22 77 75 20 58 72 16 7 28 61 14 50 83 55 -Card 139: 27 70 34 76 48 1 40 43 32 78 | 16 96 11 72 55 34 99 17 48 94 38 64 92 40 87 43 80 10 32 1 49 86 77 57 78 -Card 140: 80 40 91 86 71 81 41 54 72 53 | 40 64 71 38 22 60 92 14 72 90 81 62 23 86 29 52 73 17 95 67 91 6 19 44 26 -Card 141: 56 2 30 33 6 79 77 71 69 85 | 13 11 65 30 74 40 37 6 79 61 56 44 90 69 19 27 2 35 33 59 76 4 85 45 77 -Card 142: 9 23 40 75 53 63 48 3 27 22 | 71 96 7 94 28 55 64 91 56 8 84 88 38 21 51 17 72 46 76 30 14 1 39 85 58 -Card 143: 84 9 6 14 90 71 60 8 86 59 | 81 55 12 27 44 88 49 51 15 20 79 16 75 25 89 33 56 66 34 65 46 77 98 58 73 -Card 144: 13 95 62 75 80 30 4 5 97 38 | 81 39 67 8 28 59 35 38 92 84 73 23 48 13 16 64 30 52 88 41 15 99 18 86 11 -Card 145: 98 14 62 40 99 86 80 95 25 48 | 99 14 98 4 87 8 80 67 20 61 69 55 56 95 48 79 38 29 12 25 77 39 1 70 78 -Card 146: 56 60 7 64 40 95 76 28 72 14 | 45 34 63 69 72 21 97 84 22 94 7 96 77 23 47 98 64 42 76 87 95 12 55 14 75 -Card 147: 32 94 15 70 38 73 91 1 9 10 | 87 6 73 33 95 27 11 21 56 7 57 62 26 89 41 75 22 44 71 42 90 85 8 14 98 -Card 148: 46 59 96 7 79 82 26 44 55 37 | 31 69 32 61 43 11 66 42 5 21 29 98 3 16 94 62 95 26 17 88 7 86 54 24 91 -Card 149: 63 37 31 6 84 53 5 88 23 27 | 58 9 3 46 42 66 68 77 74 21 76 10 79 25 39 70 33 35 90 51 88 40 96 86 49 -Card 150: 70 53 20 30 92 11 2 8 64 69 | 63 60 58 96 31 75 35 61 74 67 50 45 78 69 81 26 88 24 9 8 43 20 19 95 91 -Card 151: 59 66 9 52 37 63 47 86 8 97 | 31 10 87 13 90 9 12 71 45 7 56 93 58 67 49 35 1 24 27 29 94 40 74 26 79 -Card 152: 8 15 20 57 56 78 34 98 46 92 | 94 38 33 99 63 62 95 5 85 81 80 13 28 48 96 36 51 4 25 22 90 40 9 39 47 -Card 153: 91 39 26 11 12 90 63 73 98 19 | 43 93 76 97 82 75 71 80 92 55 61 54 51 49 94 37 21 42 74 87 31 44 9 70 33 -Card 154: 96 52 59 41 86 90 63 3 77 23 | 8 66 89 65 74 34 73 20 21 47 77 85 91 87 51 28 97 24 69 2 82 60 50 15 19 -Card 155: 48 69 13 68 5 29 28 12 22 37 | 73 52 43 37 5 44 28 69 29 76 68 26 51 35 17 90 48 55 60 83 46 13 22 39 34 -Card 156: 32 26 55 22 93 14 30 33 9 84 | 24 82 83 40 22 79 52 23 11 3 9 78 70 37 26 44 54 1 20 65 6 2 67 61 77 -Card 157: 53 23 58 5 22 11 46 77 47 43 | 35 92 73 96 46 41 11 5 74 95 66 22 9 19 63 58 48 4 80 31 53 91 77 1 14 -Card 158: 90 13 3 4 94 85 8 83 60 14 | 30 67 46 60 43 23 73 51 50 29 97 92 57 52 14 59 90 63 33 69 77 21 70 66 3 -Card 159: 14 86 9 87 80 21 41 72 17 32 | 51 68 57 84 20 21 34 44 6 67 26 38 46 2 16 37 1 69 77 81 73 10 33 62 52 -Card 160: 45 51 83 25 31 63 26 94 56 40 | 91 72 31 84 22 1 51 52 25 83 40 5 2 41 17 63 45 56 54 86 97 94 67 19 26 -Card 161: 27 43 80 23 67 45 68 4 5 3 | 35 83 36 69 92 20 6 49 87 27 60 11 32 71 91 53 66 47 3 23 88 74 68 50 67 -Card 162: 81 73 42 3 39 37 9 23 59 94 | 75 17 11 93 30 16 70 29 27 47 1 4 12 73 79 96 5 85 39 13 6 56 44 92 3 -Card 163: 87 97 59 11 71 25 46 86 54 48 | 21 25 12 72 55 34 11 1 70 22 59 26 86 20 9 56 84 19 14 58 2 77 50 91 13 -Card 164: 40 23 99 8 80 75 30 52 92 88 | 37 66 5 68 62 84 73 99 92 26 28 15 67 14 54 51 30 69 75 39 23 34 27 72 3 -Card 165: 34 30 43 14 61 33 73 56 15 93 | 89 5 65 25 93 28 69 81 22 1 78 39 62 85 95 75 18 98 57 50 35 30 70 36 51 -Card 166: 16 74 94 44 71 60 7 90 84 40 | 5 12 70 45 49 71 61 91 48 75 53 30 65 55 11 89 88 67 76 25 77 24 15 16 81 -Card 167: 37 65 12 71 39 64 75 58 3 60 | 13 81 69 59 99 29 87 22 91 2 16 70 39 44 1 46 67 60 54 90 96 5 86 58 75 -Card 168: 76 44 60 13 10 42 87 34 58 93 | 88 73 48 2 99 35 37 4 69 82 15 81 43 21 64 30 5 14 87 19 7 55 51 53 90 -Card 169: 71 12 82 98 36 48 21 26 6 69 | 53 33 15 17 2 25 20 69 27 99 86 44 72 54 88 65 18 62 16 9 96 68 95 39 13 -Card 170: 79 98 45 46 68 49 34 17 91 13 | 6 78 25 41 15 72 87 59 73 9 94 37 34 93 92 27 81 30 60 70 11 50 10 1 36 -Card 171: 6 12 87 66 97 65 74 75 9 88 | 5 26 49 14 34 81 64 46 55 72 39 30 98 82 76 31 23 95 96 68 54 56 86 15 69 -Card 172: 54 13 27 98 1 9 53 71 17 11 | 92 62 55 54 1 17 24 40 39 98 11 5 80 75 71 99 53 20 50 81 9 89 27 13 86 -Card 173: 84 40 4 48 94 41 27 81 57 72 | 31 22 78 87 1 48 52 68 3 99 72 65 84 94 27 33 70 81 12 77 36 4 40 2 10 -Card 174: 86 4 71 29 27 36 42 56 77 19 | 56 3 93 27 76 86 77 10 60 89 53 71 4 52 74 19 96 36 29 88 94 39 24 42 49 -Card 175: 58 17 42 69 68 99 20 25 45 97 | 17 25 55 53 58 20 11 69 12 73 40 4 59 45 26 76 50 99 36 68 97 42 62 60 31 -Card 176: 16 88 74 2 77 24 89 56 80 58 | 83 28 44 77 16 5 17 27 23 47 38 14 20 39 88 60 80 2 79 58 24 78 64 34 69 -Card 177: 51 37 28 89 68 53 46 10 69 38 | 94 70 49 57 86 34 38 66 68 87 89 4 60 64 39 28 77 52 54 99 16 13 19 33 51 -Card 178: 76 31 77 22 92 72 74 15 61 29 | 9 50 77 58 90 1 89 83 67 71 76 22 31 5 12 27 20 29 30 96 92 95 42 80 93 -Card 179: 29 75 5 6 71 1 53 82 41 74 | 93 45 76 41 10 58 74 6 1 82 71 77 94 27 14 31 5 59 46 29 53 8 61 62 18 -Card 180: 41 23 21 18 11 87 68 35 80 7 | 34 95 14 80 67 24 11 7 21 75 13 9 18 71 50 68 53 91 78 27 88 16 81 23 25 -Card 181: 58 43 4 38 99 45 94 25 69 97 | 33 10 77 17 39 61 12 24 68 35 11 87 52 19 25 44 72 81 36 48 22 38 98 34 55 -Card 182: 31 79 39 50 78 66 16 4 91 41 | 25 80 85 81 12 98 11 13 65 30 87 60 24 94 70 36 99 92 14 10 53 51 2 8 76 -Card 183: 60 37 31 23 29 77 57 34 76 94 | 94 7 57 41 70 52 53 14 8 96 80 51 69 19 81 6 47 54 67 17 3 56 22 2 76 -Card 184: 19 78 23 11 26 79 37 42 83 66 | 54 99 50 68 65 89 7 86 92 18 41 96 71 44 67 48 59 37 93 64 91 75 16 11 29 -Card 185: 45 85 65 6 17 27 82 35 74 13 | 79 56 63 87 5 32 75 15 69 84 16 42 12 88 60 33 92 77 35 28 66 48 21 95 97 -Card 186: 10 45 16 1 46 27 50 59 83 65 | 82 14 4 49 57 59 95 7 68 78 98 2 52 9 44 39 23 24 27 97 58 93 50 26 54 -Card 187: 69 86 61 71 65 42 40 27 25 59 | 11 67 62 26 39 87 51 9 38 41 19 6 48 75 18 99 27 24 33 73 95 81 83 64 50 -Card 188: 79 28 69 4 93 38 31 62 18 67 | 12 68 83 3 76 41 23 61 11 73 94 74 30 32 90 20 58 46 7 98 65 82 88 49 48 -Card 189: 48 76 43 18 98 50 36 6 90 20 | 22 9 44 45 69 51 47 55 42 52 57 46 77 65 85 37 73 31 14 83 41 92 32 27 23 -Card 190: 6 8 77 28 62 2 30 76 94 90 | 5 20 94 96 43 55 41 75 76 38 45 78 33 77 90 68 62 63 23 6 30 8 12 28 2 -Card 191: 74 95 81 19 30 18 84 67 41 4 | 67 19 27 93 46 30 81 20 41 57 17 74 4 11 35 5 43 37 95 18 58 28 83 84 42 -Card 192: 88 95 72 25 27 10 19 15 63 5 | 72 49 73 95 5 19 85 7 88 25 40 51 61 52 76 15 29 27 35 91 96 63 98 70 10 -Card 193: 60 5 92 22 73 76 64 83 30 89 | 42 34 19 83 89 72 32 11 64 2 60 63 73 92 67 17 30 87 41 5 69 22 29 76 85 -Card 194: 58 66 59 28 55 35 61 20 22 89 | 63 37 49 68 89 59 19 4 28 92 24 26 87 62 97 66 60 61 6 99 58 53 57 47 45 -Card 195: 85 35 2 7 77 71 21 32 25 70 | 35 63 77 7 64 46 61 71 22 2 66 32 85 12 90 70 84 43 40 21 30 1 50 25 17 -Card 196: 31 61 66 19 79 35 85 68 15 54 | 74 85 35 20 75 40 44 14 69 54 33 31 61 51 43 68 56 16 37 46 15 77 79 66 19 -Card 197: 64 3 29 40 63 46 95 66 8 96 | 3 40 95 85 7 67 29 74 64 96 37 9 2 46 98 86 66 63 6 71 78 8 36 39 4 -Card 198: 27 26 20 24 50 96 81 76 68 19 | 66 59 40 67 9 55 69 8 75 65 18 82 73 41 70 21 23 52 83 11 89 58 60 97 22 -Card 199: 28 94 90 41 60 57 93 8 51 48 | 14 5 3 31 15 79 87 55 39 75 29 44 27 46 22 61 18 36 59 68 52 48 34 81 95 -Card 200: 22 27 9 45 65 86 67 41 46 66 | 98 43 46 41 55 56 15 73 71 89 84 86 77 51 17 3 34 65 18 67 76 22 26 74 38 -Card 201: 43 60 39 89 35 24 11 52 21 4 | 10 60 89 39 18 40 85 29 30 21 35 8 31 52 96 99 59 49 7 88 25 78 4 47 58 -Card 202: 47 76 20 50 3 10 53 6 15 78 | 2 86 20 4 78 10 9 53 1 72 58 65 3 6 76 51 71 80 47 77 90 39 5 15 61 -Card 203: 55 10 36 49 22 76 50 52 86 79 | 31 21 70 7 47 38 17 84 97 75 86 90 55 50 64 77 18 24 69 82 71 5 34 23 65 -Card 204: 32 79 4 51 24 36 52 16 95 47 | 69 72 25 70 6 20 37 82 29 3 61 75 13 34 54 49 76 67 7 15 40 64 97 9 74 -Card 205: 46 89 30 18 15 24 1 73 34 50 | 65 6 3 69 21 52 94 29 25 54 37 49 44 26 15 79 32 31 67 56 9 47 41 57 10 -Card 206: 51 80 60 54 95 50 76 14 2 92 | 20 84 9 60 14 74 10 94 90 47 58 64 7 4 15 89 79 36 80 70 68 81 69 93 19 -Card 207: 27 94 17 47 12 3 73 26 52 32 | 38 4 2 52 59 8 75 10 39 17 89 34 93 85 27 96 7 11 84 24 62 26 80 49 6 -Card 208: 65 9 31 99 98 59 96 46 63 12 | 68 48 61 38 94 1 23 71 66 35 21 30 20 58 14 12 93 19 52 45 92 25 49 80 65 -Card 209: 11 98 57 87 82 50 16 45 46 25 | 54 11 82 73 13 24 55 65 51 66 6 70 60 44 18 36 12 16 84 27 74 22 71 29 49 -Card 210: 77 36 67 31 25 58 28 8 16 29 | 98 85 14 50 99 58 37 31 2 39 84 24 65 80 41 62 97 78 20 74 40 30 83 38 47 -Card 211: 18 77 49 70 59 85 16 74 57 35 | 71 43 27 78 18 61 15 77 20 37 65 96 67 97 29 55 7 23 25 94 76 33 88 75 30 -Card 212: 40 48 44 77 98 29 21 99 82 79 | 81 52 56 6 2 11 94 62 22 65 43 47 83 69 42 17 70 92 36 77 87 15 71 27 66 -Card 213: 8 24 48 5 27 13 71 26 17 21 | 63 11 89 35 69 98 91 60 51 70 12 62 39 43 38 19 55 20 57 32 6 79 95 76 73 diff --git a/input/2023/day05.txt b/input/2023/day05.txt deleted file mode 100644 index 33e6aa3..0000000 --- a/input/2023/day05.txt +++ /dev/null @@ -1,197 +0,0 @@ -seeds: 432563865 39236501 1476854973 326201032 1004521373 221995697 2457503679 46909145 603710475 11439698 1242281714 12935671 2569215463 456738587 3859706369 129955069 3210146725 618372750 601583464 1413192 - -seed-to-soil map: -2824905526 2969131334 898611144 -0 322319732 9776277 -379216444 692683038 140400417 -3723516670 1559827635 9493936 -637824014 332096009 211964909 -929691047 1569321571 35824014 -965515061 1605145585 1281263183 -621118546 833083455 16705468 -9776277 0 322319732 -332096009 544060918 47120435 -3733010606 1319171816 134731872 -2329500810 1453903688 72388062 -2401888872 1526291750 33535885 -2246778244 2886408768 82722566 -2435424757 929691047 389480769 -519616861 591181353 101501685 - -soil-to-fertilizer map: -2819195624 2690204780 252557843 -1098298904 1339121422 10546957 -499510245 852292683 97183057 -4225167944 2372810194 69799352 -887408376 1808006977 56225538 -3071753467 4058417302 4632491 -2455749676 3452467754 363445948 -2243979338 3846646964 211770338 -3076385958 4063049793 231917503 -3860856553 2269547568 103262626 -943633914 21067281 39980869 -1388096097 1584043708 223963269 -3493291351 2442609546 247595234 -1801722612 949475740 41203502 -264653767 678191385 102026845 -3740886585 2942762623 89236706 -1152866424 310132079 235229673 -3830123291 3815913702 30733262 -249083929 1568473870 15569838 -1612059366 1506703078 61770792 -366680612 545361752 132829633 -1108845861 1992124969 44020563 -596693302 1048406348 290715074 -3467723121 2243979338 25568230 -1879110833 1349668379 157034699 -1858043552 0 21067281 -3308303461 3293048094 159419660 -3964119179 3031999329 261048765 -983614783 780218230 72074453 -1055689236 1005796680 42609668 -1673830158 1864232515 127892454 -1842926114 990679242 15117438 -0 61048150 249083929 - -fertilizer-to-water map: -0 434502471 470583313 -1739362496 1919893972 48874906 -2735409723 1968768878 16148586 -3324522082 1858151799 61742173 -4137416965 1984917464 25502361 -470583313 2971682591 186824423 -2751558309 2532295557 111781313 -3664705516 1340674299 435773845 -1851374390 3898529330 80666020 -857422234 2010419825 207606184 -1788237402 2418040507 63136988 -1065028418 0 434502471 -1499530889 2481177495 4578648 -4162919326 2916167530 55515061 -1670138099 3158507014 69224397 -3386264255 905085784 278441261 -2496170686 3979195350 239239037 -4100479361 2879229926 36937604 -1504109537 3227731411 166028562 -657407736 2218026009 200014498 -2909879036 3393759973 257495792 -1932040410 2644076870 235153056 -2167193466 3651255765 247273565 -2863339622 2485756143 46539414 -3167374828 1183527045 157147254 -2414467031 1776448144 81703655 - -water-to-light map: -894548549 593866955 6252040 -3168871398 327816880 11668092 -3549766643 2935057349 16258370 -1070236274 1304104659 106353135 -900800589 723222576 35881223 -2175309976 2744985745 82677694 -3969615926 3819543751 36919401 -4086160816 4015453657 208806480 -0 360262147 233604808 -3566025013 1514177176 87956572 -3440195928 1874477761 44575925 -1851853101 948479332 113304167 -2969520516 3389635913 199350882 -1504406289 1061783499 137386237 -623007058 1630426233 244051528 -1749186436 620555911 102666665 -2154532801 339484972 20777175 -1965157268 759103799 189375533 -4007153882 3758595179 60948572 -3180539490 2951315719 231363953 -233604808 1471149229 43027947 -276632755 1919053686 114911374 -1176589409 0 327816880 -867058586 1410457794 27489963 -391544129 1199169736 4581933 -603082303 600118995 19924755 -4068102454 4276290379 18058362 -3810625421 3856463152 158990505 -2969008355 620043750 512161 -3758595179 4224260137 52030242 -396126062 3182679672 206956241 -4006535327 4294348741 618555 -3484771853 3588986795 64994790 -2257987670 2033965060 711020685 -1641792526 2827663439 107393910 -3411903443 1602133748 28292485 -1037034802 1437947757 33201472 -936681812 1203751669 100352990 - -light-to-temperature map: -1726863959 864157287 834947717 -263199301 190436173 53620398 -1393417259 1699105004 333446700 -2783912856 244056571 155961192 -2939874048 400017763 299945457 -671449939 2517852185 721967320 -2561811676 2295751005 222101180 -0 2032551704 263199301 -481013766 0 190436173 -316819699 699963220 164194067 - -temperature-to-humidity map: -603287260 3766826980 8741130 -572607531 3684982838 30679729 -2084038135 1101548002 100083930 -655933651 3228345771 56278566 -1881393627 553997241 168332584 -553997241 2882185871 18610290 -627184746 1072799097 28748905 -612028390 3397056204 15156356 -1693489030 1430646491 187904597 -3039118107 1734352525 2023479 -220345266 0 43042720 -840454312 3775568110 147781659 -2184122065 3715662567 51164413 -317040325 171240045 2422893 -3245373536 4158663426 136303870 -145773749 385599932 74571517 -0 43042720 128197325 -1490020808 4094893831 63769595 -319463218 173662938 140708231 -712212217 1821839294 128242095 -128197325 314371169 17576424 -2474405575 3923349769 171544062 -2352890439 3105028111 121515136 -3467140696 3318936261 78119943 -2235286478 3226543247 1802524 -4084196651 722329825 210770645 -1553790403 933100470 139698627 -1261006249 1201631932 229014559 -263387986 331947593 53652339 -3137034338 2900796161 108339198 -988235971 3412212560 272770278 -2237089002 1618551088 115801437 -3381677406 1736376004 85463290 -3545260639 1950081389 538936012 -2049726211 3284624337 34311924 -2645949637 2489017401 393168470 -3041141586 3009135359 95892752 - -humidity-to-location map: -596652260 530461632 95173962 -3845096173 1731990943 158117085 -2243878974 1890108028 393769632 -0 625635594 63651375 -1920725725 753532949 155684321 -63651375 329652856 200808776 -264460151 0 60175490 -1381444473 2283877660 346420873 -4003213258 3594530530 47694548 -548036821 60175490 46076186 -4100105147 1678246429 53744514 -2637648606 3642225078 292412911 -324635641 106251676 223401180 -4050907806 3545333189 49197341 -4153849661 909217270 141117635 -3455132509 3477799963 67533226 -594113007 689286969 2539253 -2930061517 2630298533 525070992 -753532949 1050334905 627911524 -3522665735 3155369525 322430438 -2076410046 3934637989 167468928 -1727865346 4102106917 192860379 From 7ae122dbe934fac2ed524df7daab6f4d74b37ab3 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 12 Nov 2025 22:34:22 -0600 Subject: [PATCH 16/91] refactor(2023.06-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2023/day06.txt | 2 -- src/AdventOfCode/Util.hs | 7 +++++ src/AdventOfCode/Year2023/Day06.hs | 44 ++++++++++++++++++------------ 4 files changed, 34 insertions(+), 21 deletions(-) delete mode 100644 input/2023/day06.txt diff --git a/VERSION b/VERSION index 50555f8..1f44e73 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.38 \ No newline at end of file +2024.7.2.39 \ No newline at end of file diff --git a/input/2023/day06.txt b/input/2023/day06.txt deleted file mode 100644 index 4276bb5..0000000 --- a/input/2023/day06.txt +++ /dev/null @@ -1,2 +0,0 @@ -Time: 45 98 83 73 -Distance: 295 1734 1278 1210 diff --git a/src/AdventOfCode/Util.hs b/src/AdventOfCode/Util.hs index 10a269c..253e22b 100644 --- a/src/AdventOfCode/Util.hs +++ b/src/AdventOfCode/Util.hs @@ -22,6 +22,7 @@ module AdventOfCode.Util neighborsOf, holes, numDigits, + bitraverseBoth, (<&&>), (<||>), (<.>), @@ -120,6 +121,12 @@ holes (x : xs) = (x, xs) : map (second (x :)) (holes xs) numDigits :: (Integral a) => a -> Int numDigits n = truncate @Double (logBase 10 (fromIntegral n) + 1) +bitraverseBoth :: + (Bitraversable t, Applicative f) => + (a -> f b) -> t a a -> f (t b b) +bitraverseBoth f = bitraverse f f +{-# INLINE bitraverseBoth #-} + (<&&>) :: (Applicative f) => f Bool -> f Bool -> f Bool (<&&>) = liftA2 (&&) diff --git a/src/AdventOfCode/Year2023/Day06.hs b/src/AdventOfCode/Year2023/Day06.hs index 19b697e..7626906 100644 --- a/src/AdventOfCode/Year2023/Day06.hs +++ b/src/AdventOfCode/Year2023/Day06.hs @@ -1,33 +1,41 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2023.Day06 where -import AdventOfCode.Input (parseInput, parseString) -import AdventOfCode.TH (defaultMain, inputFilePath) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Util (bitraverseBoth, (<.>)) import Data.List.Extra (productOn') -import Text.Trifecta (Parser, natural, some, symbol) +import Relude +import Relude.Extra.Bifunctor (bimapBoth) +import Text.Trifecta (Parser, natural, symbol) main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -partOne :: [(Int, Int)] -> Int -partOne = productOn' waysToWin +partOne :: SimplePuzzle [(Int, Int)] Int +partOne = asks (productOn' waysToWin) -partTwo :: [(Int, Int)] -> Int -partTwo races = waysToWin (time, distance) - where - time = read $ concatMap (show . fst) races - distance = read $ concatMap (show . snd) races +partTwo :: SimplePuzzle [(Int, Int)] Int +partTwo = + ask + >>= waysToWin + <.> bitraverseBoth (parseString posInt) + . foldMap (bimapBoth (show @String)) waysToWin :: (Int, Int) -> Int -waysToWin (time, distance) = maxTime - minTime + 1 +waysToWin = bimapBoth fromIntegral >>> waysToWin' + +waysToWin' :: (Double, Double) -> Int +waysToWin' (time, distance) = maxTime - minTime + 1 where - maxTime = floor ((time' + delta) / 2) - minTime = ceiling ((time' - delta) / 2) - delta, time' :: Double - delta = sqrt $ time' ** 2 - 4 * fromIntegral distance - time' = fromIntegral time + maxTime = floor ((time + delta) / 2) + minTime = ceiling ((time - delta) / 2) + delta = sqrt $ time ** 2 - 4 * distance getInput :: IO [(Int, Int)] -getInput = parseInput document $(inputFilePath) +getInput = parseInputAoC 2023 6 document document :: Parser [(Int, Int)] document = From ce1a09af6acc2e867af4d2a67904ce963f81399d Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 12 Nov 2025 23:00:34 -0600 Subject: [PATCH 17/91] refactor(2023.03-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2023/day03.txt | 140 ----------------------------- src/AdventOfCode/Year2023/Day03.hs | 77 +++++++++------- 3 files changed, 47 insertions(+), 172 deletions(-) delete mode 100644 input/2023/day03.txt diff --git a/VERSION b/VERSION index 1f44e73..c9396bf 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.39 \ No newline at end of file +2024.7.2.40 \ No newline at end of file diff --git a/input/2023/day03.txt b/input/2023/day03.txt deleted file mode 100644 index 0d465e9..0000000 --- a/input/2023/day03.txt +++ /dev/null @@ -1,140 +0,0 @@ -.......262....300...................507.....961..............668.....................189.906...........................624.................. -..148.................805..130..880*...........*684.............*......*..............*..-......%.................$........17...65....91*... -......272.....464.....=......*.........................208*.....260.967.38.......692*.........676............@247..652.585.#......@......74. -.................*734........772......171.........728$.....52........................747.=866............350...........*.................... -..328....21...........941......../.....*...243................429@......567$...623.................654..#.....*815....360......812%......... -..........$.....%....@....6....583.....598...&.114@...618......................+...............156.........817...../.................340.... -.....883........359.....*.*..........................*............@............................./...920............302.712...........*...... -........*.....*......100..192.160........791......843...680*643.252.................322...354..........*.....+.........*............556..... -.........958.580.................*.............................................879.....-..$............633...63......561.....289............ -..............................745.......221..504-................356..............*827........355...............................*46......... -...................206..382...........$...........142@.105...534........./.......................*..........535.....................515..... -..201.....336.......-..*.....268..121..775...-...........%..............791.............129...449.....450..*.........790...........*........ -............%.559*......7.....+..*..........865......895............930.....427..242......#...............414.830............37..809........ -..................85.............466..550-..........+....................44...*...*.........361..215..........*......808.220*............... -................*......709....................577......430...&..148........*.696.988....801.*.....*..........202..25..*..................... -.....636......14...........372.............64...*...........586.%...15..241.............&....387..447...............*..811....146........... -.....-...........892*226....*....161.........%.623..................*...........$...............................................&.....657... -........987.................147.=....+.254..........887........773...321.....221....415.971..................74.......702..212.............. -......@............182............335.....*...........*..77.......#......................./.....29..........%...........&..*.......872...... -......643............*...................756.........677.*..........251......521..620......................................685.206.......132 -............274*...........929.................871........686.542..%........*......*.......................882....756.............*859..*... -................516.........*.....................*..............*...289...10.....890..985...258...963...............*.................526.. -.............................610...............857........210..818......*.......@.........#..=......*.....968.........42..........732....... -.............../..*453.................467..........376......$..........429..218.....................955..%..............357................ -.......841....493..............830#.......*342.........*........*................./....562....945................224.......*..435........... -..................843.803......................2........56...248.560.............281.....*.......*.........-........*5....728..*......156... -...822*288....352.*...+..............$.........$........................@..............794......539..-814..528.81.......+.......687.....*... -................*.783..../454.859....809..742........................663...267/..................................*.....847..............167. -....&371.296.484..............*..........=...........516.......925...............................#................441...............224..... -.........#............594..417....458............112*.....65.....#.....337...357....#..369*277.825....386..................212.............. -................651..#...........*.....$..................*............*.....*...125...................*......497.........*..............509 -......320..........*......-...883..989..733.....668.905...997.......454.....353...........946....18.....340...&......515...774........*..... -......-.....880....476...955.......=................*...........58.....................23....*69.+..102..............*.............933.687.. -........931....*..............................757....602.983......-..822..............*.............*.......732.....15...................... -....../....*....463.............183$..961........*.......*....#...........572......618.............52..........@........205......*....&429.. -...204......550............-.........%.........628.....240..588............*................................/..........*......167.776....... -................360....*....69..........*..........534..................%..340.....................885*912..52......949..................... -.........483......*..46.754......-....607.346.....*..............851.302..................@....................-........330.-201............ -.........@...274.811..............819...........56......326......................496....650...........382......168.420...*.........452...... -..............#........325.449........581...........112*........................+............163.......*.................407.......*...460.. -......595.........*......*...................226+.................268..153.........#123........*.....$..877..........#..........361...*..... -......*........280.287.427...........755...........................%.........................722...323................307................... -..132.553...............................*.......117......450.109...............849.....749.................................105..537#..741... -...*.................................788.......*....691...%...$............148.....960..*....512.728#..544.624.....$......*................. -.523..97...186..907....508....................739......*................*.....*856.&....15..................$.....911.......&..877..632..... -..............*.*.........*.........161*....+........381.............453.376..........................30..................806.......*....... -............560.877...773...............168..446..............465..............435@..24..622...%.................................=..347..... -...*165................-.......................................*......@816..............*....313..421......269....539.49.530..113........... -768......*626.926....=.....676...981=............703.........682.&141....................444......=........@.........*......*......539...... -......159.......$..362......../.......254.....14..=...............................219.................383.........*......182.............733 -.324........879.....................*.=...............316.....*480......*............*............439*.........621.961.......*481........... -....*...208*...........188.......763.....553...........*...957.......771.944........445......4...........375..............174.....903.665... -.................651........851.......37*...........303.................................446......61......*......346................@...*.... -......160....412*......../.....=.220.........354.........-.....838...........473..........#........$.870.......*............*........391.... -.....*....................218.....*.............*.....739..320*.........358....*...521......383.........*.....27...........107.............. -...969...718..................+....200.534.237+..........................=..889....*..........@........396.......................103..243... -........&..................841...-......&........./748...655..325.................430............813.................618.....687...#..@..... -..........825...761............800......................*....&...........496............652...$..*...............206..*..................... -...................+....&584.........35..663*590.....677...................*........741*....908...293..918............570....$......%....... -...........794.......................&...................852*...........361...............-.................................502.769.82...... -..535.......$............523*522................-..............847..........593..........267.....................................*.......... -....*...........73...............................299..262..941*..................813..............682..........877........494...411......... -..528................*997....*...477........464.....................521........@....*315......#...=..............*.......................... -............669...909.......342..*...........*..........444@...@.....-..611.911..............864......114....555..628..890.................. -............*.....................444.....921................783.......*.......................................*........=...414............. -..........622..................................422..-...............404......&906..381............438..........605.........@.....389.352@... -....77.........519...282........720.....159=..*....87......225.605......125...........+.............*..860-......................=.......... -...$...556.......-.....*..........#..........479............&....*.........*967...343..............400...........*883..................*881. -......*............207.653....113...359............227............357............*..........771...........426.905..............313..563..... -...74..233....959../.........*.........&............*...#.................543..64..*....179................*........@.............*......... -.....*..........*.......707.341..........&489.....206..132..407..........*........224..*................310........255./.........136........ -...251.......770........................................................475.............694....514.....................236.................. -........944........-379...............403.....934......47........................................*..............694........359.............. -732.............14..........*..........*.........*.................720....325..............375.483.............*.....356&..............686.. -.......160..672*.........250.125....791.....&76...1.....&963...422..#........../....191......*................925..........771...405&.-..... -...205....%......402................................117........*.........887....509..........44.....417.................=.-................. -...................*............=..145......746.......*........861..804....*.........313...............*....*.........761.......638......... -..852..767.....#67.835......$.359..*..................789.@................675.938.............957..........459.652..............*...949.... -........*.................977.....779.......348...627.....136.........+623..........964.............948+..........*.................=....... -........882......+............................./...#...............................*......311...152.......186......233.......374.......989.. -..148.........125.....931......706%....#...379.........................181.......227..........*..........*..............581..*.............. -.....*..179..............*.............970.../.......605...........736*......................700......970.................*.........+.487... -....209...*..............810....790..............787*......................#...+....-...824......587......709*.....899.....283....324..*.... -...........50...750............./.......633...............................364..66..593./......................115......-..............561... -...................#......989..............*217.......................620...........................................740.....*361....+....... -..........266.........647*....$..992....*...........318...345...........*..............-........252..797.................354........8...110. -.............................375.....344.334.......*.......*..........460......558.....364.......#..$...........@....%..........3........... -...$14...314...652...............................626............%...................%.....................778....868..215................... -...........&....*.......$........241.................*796....552..738..#234...@....358............993....*.................................. -................594..230..-..647*.....&............56.............*............479.....921..............519................426......713..... -.....944*................404........53..349....$........459......986..+......=..............-666..............237...897#..*........&....755. -.........176........280......714..........*..876.268...*.............946.492.113..........*..............................855................ -.....................*........*...936..................973.................*............736.......844.659....652.@............266...547..... -...677......@........426.....89........./...................185..........630.285............196...../....*...*....349....102....*....*...... -........765..677................*..46....85.901.....*...440...................../..........*.............304..952............1........507... -...........=.........669......847....*........*..821......*.301.......880.................829.951.460....................876................ -.................466*......*.........69.....207.........419...*...................442............*...........-.....898.....=.667............ -....421.56=................318....................................178...............+...............896*855...522..&..........%....151*405.. -....*.......481-...70*401..............550...................*.......*296...91........998.566..112.......................................... -...235.472..............................*......962....963.935...921.........+.....................-...........168.....=516.304...416*699.... -........#...*10.................240=.....687..*...................*.475..-...........697.......................*..............*............. -..261.....47.......750....954.........=......274........-...203.570....*..71...........*...484..*.....%61...397..854...#.......523.....931.. -..............34............$....%.....500........216.647............271.......908....906.......488...............*..92..634................ -..........83*....................994.......511.55*........991...16.........417*....*......96...................697.................&........ -.............582.450=.....................................=.....*...............654.411........313..................29.........32.849....... -.......563..............239.........&.............405............193......+.411.........%......*...&.....623.........$....+748..=.....840... -..........&......#.......-....761....639.275+.......*...................69..$....../.233..@..88.....226...*.....366................../...... -.............248.16............/...............+...556...........306............354......308..............682.../......894...#.............. -..697.......*.........@..........959...125....297.......................*337...................72....108...............*......991.344....781 -...*.......715...49.392.........*.......*................652/........#.......55*.......................-.844......./..344..........-........ -...591....................334.701.......838.......................397....501....759.....-.........................946.......442............. -..................557*421...@.....749........500..........#170..........%............941..373....425..818.......................828.....237. -..793*144...........................$.302....*.....938*..................................*..........*....%.378........66..63...*............ -............474...............893............267.......810................585..........558.......694......../.................340.701....... -..............#..798......332*.....855.....................592.589........&.....833=.........199......730.......+......177.................. -.................*..................*.........................*........................#.......*......*.....154.589...*..................... -.....64*809........../............@.139............228..374....../.......771.........534........281...........*......506.......=............ -..............427.750......546...98............707..=......&..381..877..*..........*........6.........%......489.........../.795............ -...895.805*.....*.....................*694....=........848...............616.....69.86.....*..460......895.......544.....651.......14.886... -...........390...850..777.534..138..52..........570....@.........812.$71................795.......557............-.....................*.... -..46*41...............*...........*................@.........613*.................584.......=........*...............106*....627.602....829. -........217*380.............721..928.873...........................593..353...............341..430..989..923.............695......-...%..... -..................586.......$.........*...207.......585&......485..*...*..........................*......*..........................929..... -............#.154*.....60.............95.......................*..138.764..........................425.275......%.331*664..854..........887. -908.917..359........../........659........125..785...........499..........991....358..........102*...........903..........*.....409....-.... -...*.........963*.../......408.............%........830*871...............*......*...828..........764.671................293...*............ -....................559....=..........81............................391...969.513....*.......991........&..518.....208*.......75............ -.....461.560*......................../........950.........320%.....*................97........................#..........+675.....352...339. -......*......439.%101.709...302.870......838....@.....594........953.......514*862........339....................................*.......... -...247...................@......*.................312....#.................................-...271..800...@..818.850....333*722...330..951.. -........922.................184.666.............../..........................356...105.........#...*.....353./........................*..... -832.....-.......758...800....$......................337.......419...........=.......*...258........926.........................../592..186.. -...................+...........220.287...117....783......646..#.........451........750..........27.....$.......*750......890................ -........719............982....%.......*..*.........*144.*..................*...........*764./.....*373..368.201..........@.................. -......../..........388....*........115...432.............594............345..658$...442......833.................408.........=..........542. -..........27.#498..*.....286..+490...............................966.....................262.......................#..542.237............... -72....251..#.......667.....................282..556..260...........%.$......................*....107..................*..................... -.......*.......*..............................*..-...*...............64..#...=.....402..@....790.@.....................295.766...484..969... -......85....882.80.......184$................117........................454..583......*..351...............266....................&....*.... -.......................................................48...........................436........275...................869............258..... diff --git a/src/AdventOfCode/Year2023/Day03.hs b/src/AdventOfCode/Year2023/Day03.hs index c35ab60..56baf78 100644 --- a/src/AdventOfCode/Year2023/Day03.hs +++ b/src/AdventOfCode/Year2023/Day03.hs @@ -1,25 +1,25 @@ -{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2023.Day03 where -import AdventOfCode.Input (parseInput, parseString) -import AdventOfCode.TH (defaultMain, inputFilePath) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) import AdventOfCode.Util (neighborsOf) -import Control.Applicative ((<|>)) import Control.Lens (ifoldl') import Data.Char (digitToInt) import Data.FastDigits (undigits) -import Data.HashMap.Strict (HashMap) import Data.HashMap.Strict qualified as HM -import Data.List (intercalate) -import Data.Set (Set) import Data.Set qualified as Set import Linear (V2 (..)) +import Relude +import Text.Show qualified import Text.Trifecta hiding (parseString) data Datum - = Number Int - | Symbol Char + = Number !Int + | Symbol !Char | Period deriving (Eq) @@ -30,24 +30,32 @@ instance Show Datum where instance Semigroup Datum where Number x <> Number y = Number (x + y) - _ <> _ = undefined + _ <> _ = error "Semigroup is only defined for Number." instance Monoid Datum where mempty = Number 0 instance Ord Datum where Number x <= Number y = x <= y - _ <= _ = undefined + _ <= _ = error "Ord is only defined for Number." -newtype Schematic = Schematic {unSchematic :: HashMap (V2 Int) Datum} +withNumber :: (MonadFail m) => (Int -> a) -> Datum -> m a +withNumber f = \case + Number n -> pure (f n) + _notNumber -> fail "Not a number" + +type Schematic = HashMap (V2 Int) Datum main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -partOne :: Schematic -> Int -partOne (Schematic hm) = let Number n = mconcat ds in n - where - ds = HM.elems (HM.filterWithKey (isNumberAdjacentToSymbol hm) hm) +partOne :: SimplePuzzle Schematic Int +partOne = do + hm <- ask + HM.filterWithKey (isNumberAdjacentToSymbol hm) hm + & HM.elems + & mconcat + & withNumber id isNumberAdjacentToSymbol :: HashMap (V2 Int) Datum -> V2 Int -> Datum -> Bool isNumberAdjacentToSymbol hm (V2 x y) (Number n) = @@ -55,38 +63,38 @@ isNumberAdjacentToSymbol hm (V2 x y) (Number n) = where isSymbol k = case HM.lookup k hm of Just (Symbol _) -> True - _ -> False + _notNumber -> False isNumberAdjacentToSymbol _ _ _ = False allNeighborsOf :: (Show a) => V2 Int -> a -> Set (V2 Int) allNeighborsOf (V2 x y) n = - flip Set.difference (Set.fromList points) $ - foldr ((<>) . neighborsOf) Set.empty points + flip Set.difference (Set.fromList points) + $ foldr ((<>) . neighborsOf) Set.empty points where - points = flip V2 y <$> [x .. x + length (show n) - 1] + points = flip V2 y <$> [x .. x + length (show @String n) - 1] partOneExample :: IO Int -partOneExample = partOne <$> parseString schematic example +partOneExample = flip evalPart partOne =<< getExample -partTwo :: Schematic -> Int -partTwo = undefined +partTwo :: SimplePuzzle Schematic Int +partTwo = fail "Not yet implemented" getInput :: IO Schematic -getInput = parseInput schematic $(inputFilePath) +getInput = parseInputAoC 2023 3 schematic schematic :: Parser Schematic schematic = mkSchematic <$> (some datum `sepEndBy` newline) mkSchematic :: [[Datum]] -> Schematic -mkSchematic xxs = Schematic hm +mkSchematic xxs = hm where (hm, _) = ifoldl' (ifoldl' . go) (HM.empty, []) xxs go _ _ (hm', ns) (Number n) = (hm', n : ns) go y x (hm', []) d@(Symbol _) = (HM.insert (V2 x y) d hm', []) go _ _ (hm', []) Period = (hm', []) go y x (hm', ns) d@(Symbol _) = - ( HM.insert (V2 (x - length ns) y) (Number (undigits' ns)) $ - HM.insert (V2 x y) d hm', + ( HM.insert (V2 (x - length ns) y) (Number (undigits' ns)) + $ HM.insert (V2 x y) d hm', [] ) go y x (hm', ns) Period = @@ -97,9 +105,16 @@ mkSchematic xxs = Schematic hm datum :: Parser Datum datum = - Period <$ char '.' - <|> Number . digitToInt <$> digit - <|> Symbol <$> notChar '\n' + Period + <$ char '.' + <|> Number + . digitToInt + <$> digit + <|> Symbol + <$> notChar '\n' + +getExample :: IO Schematic +getExample = parseString schematic example example :: String example = From b9c8baebd3d2c9518e6bb24cbd59a2ebd5024e00 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 13 Nov 2025 22:35:38 -0600 Subject: [PATCH 18/91] refactor(2022.01-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2022/day01.txt | 2264 ---------------------------- package.yaml | 2 + src/AdventOfCode/Year2022/Day01.hs | 65 +- 4 files changed, 37 insertions(+), 2296 deletions(-) delete mode 100644 input/2022/day01.txt diff --git a/VERSION b/VERSION index c9396bf..70c334f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.40 \ No newline at end of file +2024.7.2.41 \ No newline at end of file diff --git a/input/2022/day01.txt b/input/2022/day01.txt deleted file mode 100644 index afc57ea..0000000 --- a/input/2022/day01.txt +++ /dev/null @@ -1,2264 +0,0 @@ -17034 - -13495 -7368 -13905 - -68034 - -7796 -10348 -5088 -8836 - -15061 -1842 -7047 - -2477 -6629 -7998 -4235 -6505 -2875 -6059 -9423 -5315 - -4054 -6388 -5278 -4163 -10438 -10821 -2650 - -6424 -2420 -10363 -4275 -1876 -6357 -6364 - -5123 -1271 -3991 -2792 -2513 -4890 -2900 -7820 -6020 -4612 -3109 - -9072 -18898 -13848 -11609 - -1793 -1434 -2288 -4573 -5087 -7366 -3233 -3052 -5754 -1418 -6255 - -5372 -2497 -2289 -6782 -4154 -5081 -5984 -3164 -4111 -2951 -6928 -1798 -6525 - -19803 -23713 -7818 - -7662 -2324 -8206 -5409 -8225 -5513 -2664 -3870 -1428 -5189 - -5603 -8006 -1486 -1469 -5413 -5638 -2242 -8559 -6333 -1389 - -4187 -2794 -1067 -1632 -1679 -4572 -5964 -1170 -4199 -5612 -6321 -6658 -3737 - -2093 -2221 -4741 -5892 -3781 -4034 -1030 -1542 -1547 -5429 -1896 -1371 -4041 -2522 - -15827 -1404 -8514 -8983 -6878 - -56181 - -11350 -12192 -12659 -9552 -14896 - -5308 -6289 -5069 -3594 -1499 -1034 -5546 -3430 -2292 -2825 -4427 -2315 -2738 - -5102 -3295 -6423 -1653 -6199 -2459 -1569 -6588 -5691 -4490 -7235 - -6470 -9298 -10054 -6316 -1773 -6657 -4398 -4420 - -25785 -1283 - -9366 -10257 -3221 -2899 -7247 -4711 - -4108 -6265 -4824 -6589 -2869 -4826 -5853 -1770 -5627 -6581 -2591 -2107 - -1300 -1774 -9933 -6743 -11425 -8454 -8080 - -1292 -6230 -1017 -5895 -2718 -6219 -5511 -7161 -1201 -4493 - -3268 -1306 -5417 -4691 -13018 -13021 - -9165 -12000 -7531 -10585 -2802 -10764 -2744 - -8261 -4961 -3019 -3309 -6632 -7955 -3538 -7392 - -2730 -4479 -1909 -6013 -5214 -1188 -5074 -1589 -1103 -1393 -1745 -4162 -4231 -4197 -3307 - -1246 -5200 -2648 -6419 -5659 -7380 -4479 -4589 -4108 -7290 -5514 -4406 - -4256 -5658 -9668 -8745 -6698 -11874 -9277 - -19436 -11206 -7547 -1540 - -4757 -11223 -9685 -6113 -10587 -5328 -1896 - -3312 -2758 -3528 -3501 -1933 -5876 -3471 -1208 -3892 -5302 -2674 -1282 -1195 -5675 -5753 - -3127 -21845 - -5244 -9557 -8744 -2783 -6549 -6225 -1122 -7317 -7574 - -5154 -2790 -3239 -6496 -7433 -5770 -3835 -6644 -5503 -1273 -1244 -7098 - -4307 -1882 -9426 -7432 -3558 -5765 -9957 -6974 - -9510 -35767 - -3109 -5208 -4756 -1226 -5645 -7133 -2308 -5784 -5194 -2739 - -1850 -9199 -6957 -6793 -9231 -9094 -7275 -2519 - -52651 - -2337 -6455 -5574 -3001 -1296 -5120 -5175 -1704 -7041 -2118 -3446 -2219 - -10123 -2817 -6853 -11370 -9490 - -11194 -1887 -1922 -2390 -10687 -3573 -8476 - -3646 -1365 -5255 -1882 -5705 -2428 -5833 -2242 -3674 -2254 -5141 -1317 -4873 -4421 -4178 - -7264 -12898 -4423 -1871 -4998 -10540 - -9143 -9081 -6136 -6734 -6955 -6956 -5693 -8110 - -8820 -11554 -5474 -9848 - -7445 -8434 -7883 -3523 -2562 -5174 -3178 -5766 -5322 -5347 - -2666 -1556 -4772 -5053 -5874 -5711 -1684 -3351 -4037 -4770 -4755 -6280 -1326 -5756 - -4322 -10058 -6727 -3217 -9987 -3195 -10711 -5728 - -8382 -32068 - -3385 -1384 -3110 -1205 -2932 -4065 -3886 -5950 -6443 -2657 -2229 -4438 -2100 -3961 - -1654 -2028 -8414 -3662 -4270 -3923 -4827 -5443 -2710 -3406 - -8262 -6401 -2115 -7528 -1359 -1934 -1560 -3271 -8459 -8387 - -8437 -5394 -5589 -5243 -3421 -5228 -3601 - -6306 -5779 -5119 -2453 -1289 -1164 -1175 -7252 -7215 -2632 -6832 -2304 - -4788 -3723 -5887 -2748 -7350 -5974 -6015 -1545 -1092 -2524 -4130 -7297 - -3455 -5668 -1435 -2738 -5520 -4374 -2594 -4144 -4457 -6479 -1230 -3682 -6157 -4284 - -10449 -6988 -2505 -6083 -3844 -2655 -8953 - -6061 -5493 -4922 -3375 -1273 -4181 -4643 -4039 -1482 -5952 -3468 -4719 -4101 -4702 - -1135 -3886 -3308 -3986 -2662 -1814 -5813 -1079 -4916 -5059 -2155 -1404 -2398 -2730 -1972 - -5868 -5201 -3725 -4905 -1655 -3585 -6339 -5563 -6869 -4779 -4072 -5106 -3587 - -5997 -1240 -2115 -4558 -1572 -7031 -1568 -3230 -4081 -3767 -1916 -5388 - -6672 -7355 -7362 -6232 -6112 -7095 -5350 -8343 -8171 -8331 - -4370 -11625 -6923 -1583 -9520 -11093 -11708 - -4475 -23713 - -6310 -6536 -3243 -2910 -2861 -5076 -6562 -3924 -5933 -4044 -1572 -2351 -6665 - -6994 -5704 -5165 -7364 -5819 -1816 -3929 -6967 -1009 -2528 -6107 -6954 - -6855 -11865 -9195 -18609 - -5582 -3987 -7772 -2106 -1006 -5441 -6201 -7748 -1386 -1898 -7790 - -5332 -5371 -3515 -6367 -6657 -2677 -4790 -2448 -3401 -1668 -4425 -3758 -5385 - -4105 -3883 -4389 -2214 -1943 -2510 -2544 -1330 -6275 -1492 -5837 -1830 -4440 - -5041 - -40092 - -34451 - -14820 -10096 -24218 - -2095 -3608 -1467 -6098 -9586 -4062 -6745 -1217 -2074 - -5660 -7032 -7666 -2711 -3050 -2260 -6274 -4672 -1028 -6916 -7861 - -37401 -29831 - -15255 -6714 -2378 -13864 - -7618 -15264 -8496 -7847 -8750 - -6392 -4892 -1200 -2133 -2879 -6033 -5634 -1979 -5066 -3965 -4734 -1761 -5627 -2369 - -19691 -16626 -6806 - -3594 -1824 -4264 -5058 -2286 -6836 -4687 -4016 -2660 -7224 -6390 - -6213 -6396 -5387 -5318 -3022 -5080 -6098 -3699 -2437 -6430 -6091 -1255 -2480 -2490 - -8795 -3287 -14228 -10078 - -6720 -3431 - -13856 -2609 - -1683 -1241 -5941 -8021 -11838 - -3961 -3033 -4069 -3200 -2598 -3133 -6007 -2048 -2850 -2605 -5111 -3726 -1994 -1910 -2289 - -11960 -3800 -11919 -3808 -12138 -7118 - -60979 - -10777 -8860 -3736 -3591 -12500 -8963 - -3474 -3027 -5923 -1874 -3555 -5312 -5568 -1796 -2831 -3105 -3501 -4378 -5999 -4528 -5948 - -2493 -13969 - -6992 -14112 -3430 -14233 -13381 - -17059 -5737 -1290 -12844 - -6302 -4418 -2067 -5059 -2085 -3061 -4411 -5662 -4097 -3333 -2182 -1090 -4185 - -4811 -1351 -6050 -7344 -2745 -6588 -3506 -2056 -4229 -4256 -1853 -5912 - -9673 -2207 -4646 -2680 -12985 -3873 - -1110 -6118 -4411 -6331 -1668 -6023 -6977 -5049 -6669 -4421 -5027 -3131 - -9968 -2987 -5041 -18431 - -7436 -5660 -15858 -7130 -12737 - -5232 -9051 -10275 -9404 -3384 -5719 -5724 -10218 - -4350 -2456 -7892 -1318 -6932 -7890 -9595 -4605 -7672 - -2666 -9981 -1959 -5686 -3655 -2763 -6737 -8621 - -9915 -5955 -10523 -3976 -4166 -9602 -2985 -6160 - -25160 -18830 -7409 - -1322 -1283 -3839 -3054 -5782 -4615 -2579 -3332 -3046 -3634 -2428 -1373 -5638 - -13941 - -2653 -14138 -2355 -12340 -6598 - -4857 -9417 -13144 -9072 -4174 - -1946 -6030 -5875 -1649 -1757 -2198 -2673 -3743 -1357 -1134 -1602 - -2791 -10432 -4037 -2767 -11295 -11255 -9762 - -9232 -11015 -21925 - -6365 -1170 -4253 -5122 -5390 -7061 -7781 -4584 -6362 -6367 -5321 - -23166 -21313 -16147 - -7915 -10734 -6921 -4796 -6442 -3520 -4416 -5702 - -31627 -21575 - -9569 -2837 -3816 -5052 -9399 -6174 -3291 -2513 -2932 - -6255 -14356 -5389 -18970 - -26896 -3552 - -19037 -5180 -6855 - -4929 -5212 -15135 - -1114 -1338 -8702 -7914 -6690 -5981 -6129 -4246 -4660 - -2696 -4528 -4053 -5982 -2308 -6097 -1933 -6410 -4851 -4526 -5705 -5510 -3951 - -4693 -4906 -4570 -1161 -2974 -4099 -5423 -4146 -3305 -3057 -2079 -6187 -3196 -2285 - -6300 -6253 -5892 -3636 -5373 -5345 -1990 -7456 -1218 -4220 -3845 - -3028 -1790 -2104 -6750 -2516 -2482 -2574 -6806 -1613 -2279 -5389 -3979 -6672 - -48619 - -15159 -1029 - -13352 -5081 - -6292 -6989 -5568 -6181 -2773 -4529 -3205 -1134 -6416 -5199 -2830 -4813 - -4718 -5530 -5036 -2874 -2658 -2353 -5402 -3476 -1924 -3147 -2883 -6331 - -14524 -30079 - -4071 -4399 -3021 -5165 -2110 -6084 -1863 -3614 -4336 -5688 -1960 - -25783 -28718 - -13615 -1645 -11870 -8796 - -5951 -6447 -2501 -7770 -2999 -6715 -8707 -5124 -6215 -3113 - -6241 -2189 -1752 -1812 -2727 -5703 -2710 -6113 -1732 -6237 - -7990 -6499 -8481 -3443 -9375 -10439 -5892 -2758 - -7919 -8753 -5124 -6388 -8026 -7326 -4457 -4352 -5781 -5549 - -49501 - -10500 -23249 - -8352 -9128 -4905 -5833 -1218 -2859 -11489 - -6104 -6546 -6243 -6716 -3511 -3433 -4327 -2453 -2887 -5007 -4404 -4506 -2315 - -7269 -3193 -3535 -2566 -2745 -6483 -3880 -5042 -6931 -4519 -3442 -6667 - -16325 -7397 -21391 - -12648 -9268 -8280 -1497 -13788 -3384 - -1373 -2171 -2065 -5461 -4854 -2427 -5814 -2197 -4077 -5138 -6861 -6083 -1995 - -4817 -3501 -1937 -4840 -4299 -6083 -1330 -2737 -5361 -5941 -2762 -3191 -5530 -3913 -4139 - -10082 -7801 -5221 -4785 -6847 -4672 -8824 -4507 - -25999 -21078 - -34976 -27760 - -6972 -2714 -1051 -4905 -1102 -6332 -6113 -4218 -7125 -4372 -4669 - -3986 -10129 -16175 -6193 -11015 - -6260 -5523 -2032 -5304 -5167 -2908 -6518 -5491 -1718 -6229 -3264 -4899 -2873 - -6613 -4234 -6130 -1017 -7986 -7727 -3564 -8250 - -12031 -11879 -11614 -13472 -8471 -7369 - -4315 -1636 -6292 -6768 -3788 -4643 -6397 -7402 -1379 -3518 -6438 -6196 - -5667 -7559 -13899 -18285 - -5266 -34337 - -29305 -22273 - -9371 -5132 -1652 -2573 -8840 -8636 -4700 -3145 -7728 - -5864 -4845 -3567 -1247 -3070 -1378 -2836 -5574 -2398 -5191 -3520 -1395 -4933 -5530 -2656 - -5504 -5002 -4944 -4903 -3186 -1446 -3886 -1506 -2669 -5362 -2456 -2150 -4468 -5212 -2319 - -1543 -1581 -4295 -5685 -1977 -4361 -2381 -5288 -5557 -3159 -4833 -5577 -5892 - -8109 -4061 - -7132 -2394 -9579 -7360 -9023 -8589 -5666 -3108 - -25582 -3178 -2616 - -5742 -2967 -2577 -2141 -6022 -1148 -1971 -1779 -5039 -5210 -1043 -1633 -2697 - -5024 -1439 -3535 -4723 -3271 -3904 -4303 -2706 -2878 -2882 -4417 -5580 -2685 -5028 -2243 - -4788 -2903 -6717 -5514 -4434 -6396 -3370 -2964 -6940 -3018 -1328 -6527 -4651 - -5796 -7350 -15943 -7116 -11040 - -9110 -1795 -10997 -9811 -5571 -8786 -8690 - -1173 -4256 -2326 -2947 -3133 -4930 -1653 -4548 -3971 -4837 -4084 -3362 -4144 -4015 -2631 - -22258 - -1270 -8084 -3413 -1180 -7841 -3467 -1068 -3763 -7479 -2988 -5377 - -4833 -2453 -2985 -5365 -1128 -2411 -2103 - -29169 - -9451 -5237 -3547 -13513 -3528 -4937 - -14834 -6011 -11685 -17950 - -3040 -4721 -1809 -5755 -2326 -4373 -1018 -1433 -3180 -3173 -1313 -4158 -1867 -3349 -5629 - -4201 -12336 -18265 -14378 - -5248 -2091 -6755 -4523 -6049 -1183 -3834 -1242 -6517 -1561 -6666 -5117 -5600 - -2907 -1482 -2765 -8934 -1654 -3786 -8807 -8924 - -6131 -4724 -4774 -1030 -6359 -4452 -5557 -1501 -5743 -2434 -1809 -4657 -5609 -4773 - -24218 -26128 - -11710 -8138 -7143 -7236 -11903 -4547 -2419 - -1474 -13551 -6009 -12136 -13007 -9816 - -7230 -3816 -5352 -5591 - -7237 -5129 -2630 -3158 -4131 -1324 -2439 -2828 -1922 -6051 -3871 -3577 - -21875 -13945 -15782 - -10156 -15069 -18789 -6685 - -6292 -12221 -17527 - -11396 -11684 -2362 -12055 -6888 -9393 -11909 - -37154 -17860 - -22974 - -3693 -2551 -3077 -7444 -8973 -5966 -2728 - -2554 -3119 -2796 -1993 -3959 -4421 -2691 -3002 -4104 -5876 -2748 -3633 -3567 -2280 -3852 - -9583 -4003 - -3100 -4338 -6077 -4813 -3223 -2373 -1607 -7412 -7798 -7684 - -4354 -3140 -2957 -5563 -6119 -2571 -1742 -3603 -5854 -3755 -2827 - -1302 -4160 -1944 -1215 -1603 -5361 -5959 -3698 -5329 -3118 -4941 -1624 -4755 -3249 -5205 - -4707 -3243 -6299 -3689 -8496 -8594 -4187 - -5986 -4431 -1006 -1707 -1202 -4184 -3438 -5148 -4472 -6561 -5882 -5693 - -11346 -8748 -12659 - -2456 -2147 -1401 -5715 -5128 -5560 -1635 -3947 -5021 -4850 -1414 -2316 -5949 -4779 -2867 - -2530 -3901 -7034 -4665 -7109 -2416 -5461 -8825 - -5287 -4195 -9609 -5697 -3135 -6638 -2780 -6876 -6032 - -17278 -18581 -4060 -13610 - -14199 -19618 -4500 - -4423 -15765 -6614 -11352 -1941 - -30048 -17442 - -6881 -8630 -10121 -9792 -6340 -8848 -7245 -7764 - -5138 -9396 -2975 -5036 -6776 -7205 -8991 -3595 -4894 - -1065 -4272 -2155 -2655 -9405 -10274 -8344 - -8234 -3276 -1914 -11975 -8096 - -7358 -13681 -13640 -1543 -13683 - -24588 -22649 - -5034 -2818 -4103 -2328 -2311 -4241 -6145 -2694 -5191 -4266 -6477 -6412 -4566 -3077 - -4442 -2199 -7109 -6674 -5257 -4611 - -2544 -1810 -1941 -3389 -3473 -1813 -1232 -3782 -1733 -4191 -3953 -3793 -4832 -2560 -1321 - -3331 -2853 -5284 -1989 -4543 -4447 -5852 -2847 -3260 -5583 -5429 -2967 -3563 -1925 -2799 - -9448 -3662 -6703 -7356 -1600 - -4050 -6662 -7169 -2836 -2231 -1149 -5204 -4275 -6231 -7478 -1388 -6980 - -2185 -1526 -1640 -9156 -6623 -8572 -7426 -9419 - -10637 -9584 -8293 -7473 -3529 -7532 - -3987 -12127 -10749 -3399 -11041 -4600 -9896 - -3728 -1878 -5192 -3264 -6367 -4429 -6449 -7005 -4883 -5359 -2112 -6228 - -13574 -6574 -11518 -11909 -13625 - -16357 -19546 -7520 -8254 - -2122 -1712 -2729 -2847 -1157 -2895 -4850 -2805 -5603 -2321 -6113 -5468 -1230 -2385 - -3947 -3326 -2395 -5776 -4035 -3206 -5845 -6429 -5039 -4540 -5047 -4237 -6953 - -1738 -8822 -11967 -10160 -4327 -8382 -2686 - -2778 -6909 -7649 -2787 -8749 -1720 -6863 -5515 -8631 -3257 - -1369 -2470 -2726 -7415 -5232 -1919 -2981 -4437 -3168 -6412 -7072 -3201 - -19275 -10942 - -12930 -12593 -9356 -5680 -10193 -4399 - -11119 -10651 -8687 -12028 -1713 -8311 -10089 - -3752 - -10177 -9060 -4817 -3564 -7272 -10452 - -1563 -3885 -3191 -6312 -5524 -5207 -3669 - -8105 -7217 -4719 -9214 -3973 -10782 -10563 - -10142 -4264 - -7283 - -15973 -9578 -9884 -4478 -10540 - -5548 -4654 -3024 -2243 -3985 -1220 -3461 -1042 -1845 -2888 -3931 -2356 -1430 -3373 -4604 - -8036 -3016 -3510 -2659 -8700 -1539 -1202 -2116 -4351 -7388 - -2995 -7003 -8022 -2012 -1976 -3938 -3744 -6146 -5056 -7590 -4008 - -4459 -12305 -7633 -2742 -12867 -12607 - -3791 -5059 -6361 -3008 -4543 -1374 -6821 -5967 -8461 -4241 - -1641 -1364 -2037 -2479 -1413 -4250 -5042 -2438 -2855 -3081 -3535 -3966 -3574 -1149 -3606 - -3397 -2787 -5638 -2321 -3765 -5617 -4870 -4456 -6681 -1890 -1068 -3609 -3043 - -3436 -4011 -5212 -5576 -4139 -1387 -6298 -4179 -4000 -4207 -3302 -1539 -2793 -3551 diff --git a/package.yaml b/package.yaml index a0f2eed..0a90909 100644 --- a/package.yaml +++ b/package.yaml @@ -502,6 +502,8 @@ executables: aoc-2022-day01: <<: *executable main: AdventOfCode.Year2022.Day01 + dependencies: + - parser-combinators aoc-2022-day02: <<: *executable main: AdventOfCode.Year2022.Day02 diff --git a/src/AdventOfCode/Year2022/Day01.hs b/src/AdventOfCode/Year2022/Day01.hs index c010591..15f7ab1 100644 --- a/src/AdventOfCode/Year2022/Day01.hs +++ b/src/AdventOfCode/Year2022/Day01.hs @@ -1,43 +1,46 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2022.Day01 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) -import Data.List (sortBy) -import Data.Ord (Down (..), comparing) -import Text.Trifecta hiding (parseString) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) +import Control.Monad.Combinators.NonEmpty (sepBy1) +import Data.Foldable1 (maximum) +import Data.List.NonEmpty qualified as NE +import Relude +import Text.Trifecta (Parser, decimal, newline) main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -getInput :: IO [[Integer]] -getInput = parseInput inventory $(inputFilePath) +getInput :: IO (NonEmpty Integer) +getInput = parseInputAoC 2022 1 inventory -partOne :: [[Integer]] -> Integer -partOne = maximum . map sum +partOne :: SimplePuzzle (NonEmpty Integer) Integer +partOne = asks maximum -partTwo :: [[Integer]] -> Integer -partTwo = sum . take 3 . sortBy (comparing Down) . map sum +partTwo :: SimplePuzzle (NonEmpty Integer) Integer +partTwo = asks (sum . NE.take 3 . NE.sortBy (comparing Down)) -inventory :: Parser [[Integer]] -inventory = elfInventory `sepBy` newline +inventory :: Parser (NonEmpty Integer) +inventory = elfInventory `sepBy1` newline where - elfInventory = some (decimal <* newline) + elfInventory = sum <$> NE.some1 (decimal <* newline) example :: String example = - unlines - [ "1000", - "2000", - "3000", - "", - "4000", - "", - "5000", - "6000", - "", - "7000", - "8000", - "9000", - "", - "10000" - ] + "1000\n\ + \2000\n\ + \3000\n\ + \\n\ + \4000\n\ + \\n\ + \5000\n\ + \6000\n\ + \\n\ + \7000\n\ + \8000\n\ + \9000\n\ + \\n\ + \10000\n" From 5404b4c223f7468896e3ec6413642ffeb0a33162 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 13 Nov 2025 22:41:21 -0600 Subject: [PATCH 19/91] refactor(2022.02-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2022/day02.txt | 2500 ---------------------------- src/AdventOfCode/Year2022/Day02.hs | 21 +- 3 files changed, 12 insertions(+), 2511 deletions(-) delete mode 100644 input/2022/day02.txt diff --git a/VERSION b/VERSION index 70c334f..388da88 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.41 \ No newline at end of file +2024.7.2.42 \ No newline at end of file diff --git a/input/2022/day02.txt b/input/2022/day02.txt deleted file mode 100644 index 41022db..0000000 --- a/input/2022/day02.txt +++ /dev/null @@ -1,2500 +0,0 @@ -B Y -A X -B Y -A Y -A Z -B Y -B Z -C Y -A X -C X -A X -B Y -C Y -B Y -B Z -C X -C Z -A X -B Y -C Z -C Y -B X -B Y -A X -B Z -B Z -B Y -C Z -B X -B Z -C X -B Y -B Y -B Y -B Y -C X -C X -B Z -C X -B Z -C X -B Y -C X -B X -B Z -B Y -C Y -B Y -A X -B Y -B Y -C Y -B Z -B Y -B Z -C Y -B Y -A X -C X -C Y -B Y -A Z -A Z -A X -B Z -A X -A X -B Z -C Y -C Z -B Z -B X -C Y -B Y -C Y -C X -C Z -A X -B X -B Y -B Z -B Y -A X -B Z -B Y -B Z -B Z -B Y -A X -B Y -C X -A X -B Y -C X -A X -C Y -B Y -C Z -A X -B X -C X -B Z -A X -B X -B Y -B Y -B X -B Z -B Y -C Y -B Y -B Y -A X -C Y -C X -B Y -B Y -C Y -B Y -B X -B Z -B Y -B Y -C Y -B Z -B Y -B X -A X -B Z -A X -A X -B X -B Z -B X -B Y -B Y -B Y -B Y -C Y -C X -C Y -B Y -B Z -B X -B Z -C Z -C X -B Z -C X -B Y -C X -C Y -B Z -C X -C X -B Z -B Y -B Y -B Y -B Y -B Y -B Y -A X -A X -B Y -C X -B Y -B Z -B X -B Z -A Z -A X -C X -B X -A X -A X -C Z -A Z -B Y -A X -C X -C Y -C Y -A X -B Y -A X -B Z -C X -B Z -B Y -B Y -A X -C X -C X -B Y -A X -A X -C X -B Z -B Y -A X -A X -B Y -B Y -B Y -B Y -C X -B Z -B Y -B Y -A Y -B Y -B Z -A Y -B Y -C Y -B Z -B Y -B Y -C Z -A X -B Z -C X -C X -B Y -B Z -B X -A X -B X -B Y -B Z -B Z -B Z -B X -B Y -B Y -C Z -A X -C X -B Y -B X -C Y -B Y -B Y -A X -B Z -B Z -B Y -B Y -B Z -B Y -C Y -C Y -B Y -B Y -B Y -A X -A X -C Y -C Z -C Z -A Y -C Y -B Z -B Y -B Y -C Y -A X -B X -A Z -A Y -B Y -C X -B X -B X -A X -B Y -B X -C Y -B Y -B Y -B Y -B Y -B X -B Y -C X -C X -A X -B X -B X -B Y -C Y -B Z -C Y -B X -C X -C Y -B Z -C Z -A Y -B Y -A Z -B Z -C Y -A Z -B Y -C X -B Y -B Z -B Y -A X -B Y -B Y -C Y -C Y -A X -B Y -A X -C Y -B Y -C X -A X -C X -B Z -B X -B Y -B Y -B Y -B Y -B Y -C Y -A Z -C X -B X -B Z -B Y -B Y -B X -B Y -B Z -B Y -C Y -B Y -B Y -B Y -B X -B Y -B X -A Z -B Z -C Y -B Y -B Z -B X -B Z -A X -B Y -A X -B Z -B Z -C Z -B Y -B Y -B X -B Y -B Y -C X -B Z -B Z -B Y -B Z -B Y -B Z -A X -C X -C X -B Y -C Z -B X -B X -B Y -C X -C Y -B Y -C X -C Y -B X -B Z -A X -B Z -B Z -C Y -B Z -C X -B Y -C X -A X -A X -C Z -C X -B Y -C Y -B Z -C X -A X -C Y -B Z -B Y -C X -C Z -B X -A X -B Y -A X -B Y -C X -B Z -C Y -C X -B Z -B Z -B X -C Z -B Y -B Z -C X -B Y -B Y -B Y -C Z -B Y -B X -B X -C Z -B Z -A X -B Y -B Z -B Z -C Y -C Z -A Y -B Y -B Y -A X -B Y -C Z -A X -C X -B Z -C X -B Y -B X -B Y -B Y -C Y -A Z -B Y -C Z -B Z -C Z -B Z -A Y -A X -B Z -B Y -B X -B Y -B X -C X -C X -C X -B Y -C Y -B X -B Y -B X -C Y -A Z -B Z -B Y -B Y -B Y -B Y -C X -C X -A X -B Y -B Z -B Z -C Y -B Y -A X -C Y -C Y -B X -B X -A X -C X -C Y -B Z -A X -B Z -C X -B Y -B Y -C Y -B Y -C Y -A Y -B Y -B Y -B Z -A X -B Y -B Z -C X -B Z -B Z -B Y -B Y -B X -B Y -C Z -B Z -B Y -B Y -A X -B Y -B Y -B Y -B Y -B Y -B Y -C Y -B Z -B Y -C Y -A Z -C Y -B Y -C X -C Y -C Y -B Z -B Z -C Y -C X -B Z -B Y -B X -A X -A X -C X -B Z -C X -B Z -A X -B Y -B Y -C Y -A X -B Y -B Y -A X -A X -A Z -C Z -C X -A X -B Z -B Y -C Y -C Y -C Z -B Y -A X -B X -B Y -C X -C Y -B Z -C Y -B Y -B Y -B Y -B Z -B Z -B Y -B Y -C X -A X -B X -B Y -A X -B Y -B Z -B X -C X -B Y -B Y -B X -B Y -C Y -C Y -B Y -B Y -B Y -A X -C Y -B Y -B X -C Y -A X -B Y -A Y -A Z -B Z -B X -A X -C Y -C Y -B Z -A Y -B X -B Y -A X -C X -B Y -C X -B Z -B Z -C X -B Y -B Z -B Y -B Y -B Z -B Y -B X -B Z -C X -A X -C Y -C Y -B Y -B Z -A X -B X -C Y -A X -A X -A X -C X -B Z -B Y -C Z -B Y -B Y -C X -B Y -A X -A X -B Y -B Z -C X -C X -C X -A X -B X -C Z -C Y -B Y -C X -C X -B Y -B Y -C Z -A Z -A X -B Y -B X -A X -A X -B Y -B X -B Y -C Y -A Y -C X -B Y -B Z -B Y -B Z -C Z -B X -B Y -A X -B Y -B Y -C Z -A X -B Y -B Y -B Y -A X -C Y -A X -B Y -C X -C Y -C X -B Y -B Z -B Y -B Y -C X -C Y -B Y -C X -C Y -B Y -B Z -A X -A Z -B Y -C X -B X -B Y -C X -A X -A X -C Y -C Z -C X -C Y -A Y -C Y -C Z -C X -B Y -C X -A Z -B X -C X -B Y -B Z -B Z -B Y -C Y -B Z -B Y -B Z -A X -C X -B Z -C X -B Z -C X -C Y -C Y -C Y -B X -C Z -B Y -B Z -B Y -C Y -B Y -A X -B Y -C X -A Y -A Z -A X -B Y -C X -B Z -B Z -C X -A X -B Y -A Z -B Y -C X -B Z -B Y -C X -A X -B X -C Y -C Z -C Y -C Y -A X -B X -B Y -C Y -B Y -A X -B Y -B X -B Y -A X -B Y -B X -C Z -B Y -C X -B Y -A X -B X -B Z -B Y -A X -C X -B X -C X -B Y -A X -C X -B Y -A X -B Y -B Y -A X -B Y -B Z -A X -B Y -B X -C Y -B X -B Z -C X -B Y -C Z -B Y -C X -C X -A X -B Y -C Z -B Z -B Y -B Y -B Z -B Y -B X -B X -B Z -C Y -C Z -B Y -A X -B Y -B Y -C X -C X -B Z -A X -B Y -B Y -B Y -C X -B Y -B Y -C Y -B Z -C X -B Z -B X -B Y -C X -C X -A X -C X -B Y -C Y -B Y -C Z -A X -B Z -B Y -B Y -B Y -C X -C Y -B Y -B X -C X -B Y -A X -B Y -C X -A X -A X -C Y -B X -B X -B Z -B Z -B X -C Y -B Y -B Y -B Y -C X -C Y -B Z -B Z -C Z -B Y -B Y -A Z -C Y -C X -B Z -A X -A X -C X -A X -B X -B Y -B Z -B Y -A X -B Z -B Z -B Y -B Y -C Z -A X -C Y -B Y -B Y -B Z -B Y -C X -B Z -A X -B X -A X -B Y -C X -A X -C X -B Y -A X -C X -B Y -A X -B X -A Y -B Y -B Z -C Z -B Y -B Z -C X -B Z -B Y -C X -B Y -B Y -B X -A X -A Y -A X -B Y -B X -C X -B Y -B Y -B Z -C Y -A X -B Z -A X -A X -A X -A X -C Y -B X -C X -C X -A X -B Y -C Y -A X -A X -C Y -C X -C Y -B Y -B Z -A X -B Y -B Y -B Z -B Y -B X -C Y -C X -C Y -C X -B Y -A X -B Y -A X -C Y -C X -C Y -C X -C Y -B Y -B Y -A Z -A X -A X -B Z -A X -B Y -B Y -A X -A X -C Y -C Y -C Y -A X -B X -C X -B Y -A X -B X -B Y -C Y -A X -B X -B Y -B Y -B Y -C X -C X -B Y -B Y -A Z -B Y -A X -B Y -B Y -B Y -B Y -A X -B Z -C X -B Z -B Z -C Y -B Z -A X -A X -B Y -A Y -A X -A Z -C Y -C X -C X -C Z -C X -C Y -B X -B Y -A X -B Y -A X -C X -B Y -A Y -B Y -B X -B Y -A X -B Y -B Z -B Z -B X -B Z -C X -A X -B Y -B Y -B Y -A X -C X -C X -C X -B Y -C Y -A X -B Y -C Y -B X -B Z -A X -B Y -A X -C X -C Y -C Y -B Y -C Y -C X -B Z -B Y -B Y -A X -A X -B Y -B Y -B Z -C X -C X -C Y -C X -C Z -A Z -C X -B Y -A Z -B Y -A X -B Y -C X -B Y -B Y -B Z -C Y -B Y -A Z -A X -A X -C X -A Y -B Y -B Y -A X -A X -B Z -B Z -B Y -C X -C Y -C Z -A Z -B Z -A X -A Z -A X -C Y -C X -A X -A X -C Z -C X -A X -C Y -C X -A X -B Z -B Z -B Y -B Y -B Y -B Y -B Y -C Y -C X -B X -C X -B Y -B Y -A X -B Y -A X -A Y -B Z -B Y -A X -A Y -B X -B Y -C Y -B Y -C X -C Z -B X -B Z -B Y -C Z -B Y -C Y -A X -B Y -B Y -B Y -B Z -C Y -A Z -C X -B Y -B Z -C X -B Y -A X -C Y -B X -C X -A X -B Y -B Y -C X -B X -B Y -B Z -B Y -A X -B Y -B X -A X -A X -A X -B Y -C Y -C X -B Y -A X -A Z -B Z -A X -C X -B Y -B Y -C Y -B Z -B Y -C X -C Y -B Y -C Y -B Y -B Y -C X -A X -A X -A X -B Y -B Y -B Y -C X -A Z -B Y -B Z -B X -B Z -B Y -B Y -C X -A X -B Y -B Y -B X -B X -C X -C X -A X -C Y -B Y -C X -B Y -C Y -C X -B Y -C X -B Y -A X -B Z -C Z -C Y -A X -B Z -A X -C Y -C Y -B Z -B Z -A X -C X -B Y -C Z -B X -B Z -B Y -B Y -B Y -C Y -B Y -C X -A X -B Y -C Y -B Y -A X -B Y -B Y -C X -A X -B X -B X -B Z -C Z -B Y -C Y -C Y -B X -C X -C X -B Z -B Z -C X -C X -B Y -C X -B Y -B Y -B Z -B Y -B X -B Y -C X -C Y -C Y -B Y -A X -B Y -A X -C Y -C Z -C X -C Y -B Y -B Y -B Z -B Z -A Y -C X -B Y -B Z -A Z -B X -C X -B Y -B Z -B Y -C X -A X -B Z -C X -B Z -B Z -B Z -B Y -C X -B Y -B Y -B Y -A Z -B Y -B X -C X -B Y -C Y -A Z -B Z -A X -A X -B Z -A X -B Z -A X -A X -C X -C X -A Z -C X -B Z -B Z -B Y -B X -B Y -B Y -B Z -B Y -C Y -A X -C Y -B X -B Y -B Z -C X -A Z -A X -B Y -A X -A X -C X -A X -B Y -A Z -B Y -C Y -A X -B Y -A X -B Z -A Z -C X -B Z -B Y -B Z -B X -A X -B Z -C X -B X -B Z -B Z -C X -C X -C X -B Y -B Z -C X -B X -B Y -C Y -B Z -A Z -C X -B Z -B Z -B X -C Y -B Z -B Y -A X -B Y -B X -B Y -B Y -B Y -B Y -B Z -A X -B Y -B Y -B Y -B Y -C Y -A Z -C X -B X -A Y -B Y -A X -A X -B Y -A X -C Z -B Z -C Z -B Y -C Y -A X -C Y -C Y -C Y -B Y -C Y -B X -B X -C Y -A X -C Y -C X -C X -B Y -B Z -B X -B Z -B Z -B Y -C Y -B Y -C Y -B Y -B Z -B Y -A X -B Y -C Z -B X -B Y -C Z -C X -B Y -C Y -C X -A X -B Y -A X -B X -B Z -B Y -B Z -C X -B Y -A X -B Z -B Y -B Z -B X -B Z -B Z -A X -A Z -B Y -C Y -A X -B Z -B X -A X -A X -C X -B Y -C X -C Z -B Z -B Z -B Y -C Y -C X -B Y -B Y -A X -B Y -C Z -B Y -B Y -C Y -B X -B Y -B Y -B Z -B X -B Y -B X -B Y -B Z -B Z -B Z -B Z -B Z -C Y -B Y -C Y -A Y -C Y -C Z -A X -B Y -C Y -B Y -A X -C Y -B Z -A X -A X -B Z -C Y -B Y -C X -B Z -B Y -A X -B Y -C X -B Y -B Z -A X -C X -B X -B Y -A Y -C Y -C X -B Z -C Z -B X -B X -C Y -A X -A X -B Y -C Y -C X -C Y -B Z -C X -B Y -B X -B Y -C X -B Z -B Z -B Y -C X -C Z -B Y -B Z -B Z -B Z -A Y -B Y -A X -B Z -C X -C Z -A X -B Y -C X -A X -C Y -C Y -B Y -B Y -B Y -B X -B Y -B Y -C X -A X -B X -B Z -C X -B Y -C X -C Y -B Y -A X -B Y -B Y -A X -B Y -A X -C X -A X -B Y -A Y -A X -B Y -C X -C Y -B Z -A X -B Y -C X -A X -B Z -C Y -A X -C X -B Y -C X -C Z -B Y -B Z -C Z -C Y -B Y -B Y -B Y -B Y -B Y -B Y -A X -A X -B X -A X -C Y -B Z -B Y -B Y -B Y -B Y -C X -B Z -A X -A X -B X -B Y -B Z -B Z -B Y -C X -A X -B Y -B Y -B Y -B Y -A X -B Z -C Z -B Z -B Y -A X -A X -B Z -B Y -B Y -B Y -C X -B Z -B Y -B Y -B Y -B Z -C X -A X -B Z -C X -B Z -A X -A X -A X -C X -C X -B Z -C X -C X -C X -B Y -B Y -C X -A X -C X -C Y -B Z -B Y -B Z -A X -B Y -B Z -B Y -A X -B Z -B Y -B Z -A X -B Y -B X -C Y -C Y -B Y -C Y -C X -B Z -B Z -C Y -A X -B Y -B Y -C Y -C Y -A Z -B Y -B X -C X -B Y -C X -C Z -C X -C X -C Y -A X -C Z -C Z -B Z -B Y -A X -B Y -B Z -B Z -C Y -C Y -B Y -B X -B Z -A X -C X -C X -A X -B Y -C Y -C X -B Y -B Z -A Y -B Y -B Y -B Y -B Y -C Y -B Y -C Y -B Z -C Y -B Y -B Z -B Y -B Y -C X -C X -B Z -B Z -B Z -B Y -B Z -A X -A Y -C X -B Z -A X -A X -A X -C Y -A X -B Y -A Y -B Y -B Y -C X -B Y -B Y -A X -B X -A X -B Y -B Y -B X -A X -B X -B Z -C X -A X -B Y -B Z -C Y -C Z -B Y -C Y -C Z -B X -B Y -C Y -A X -B Y -C Y -C X -B X -C X -A X -C Y -C Z -B Y -A X -C Z -C X -B Y -B Y -C Y -C Z -C Y -A X -A X -C Y -A Y -A Z -A Y -C X -C Y -B Z -B Y -B Y -B Z -A X -C X -C X -B Y -A Z -B Y -B X -B Y -B Y -C Y -C Z -A Y -B Y -B Y -B Y -B Z -B Y -C Y -B X -B Y -C X -A X -B X -B Y -B Y -A X -B Z -C Z -C X -B Y -A X -A X -C Y -B Y -A X -B Y -B Y -C Z -A X -A X -B Z -C Y -B Y -B Y -A X -B Z -A X -C Z -B Y -A Z -B Y -A Z -C Z -B Z -B Y -C Z -B Y -C Y -A X -B Y -B Z -C Y -A X -C Y -C Z -B Z -A Z -B X -A Z -C Z -A X -C X -B Y -B Y -B Y -B Y -B Y -B Y -C X -B X -B Y -C X -B Y -C Y -A X -B Y -C X -A X -B Z -B Y -A X -B Y -C X -C X -B Y -A X -B Y -C X -C X -B Y -B Y -B X -C Y -B X -C X -A X -B Y -A Z -B X -B Z -A Z -A X -B Y -C Y -B Y -B Y -B Y -C Z -A X -B Z -C Y -C Y -C X -A Z -B X -C X -C Z -B Y -B Y -C Y -C X -B Y -C Y -B Y -C Y -B Z -C X -B X -B X -C Y -B Z -B Y -B Y -B Z -B Y -A X -C Y -B Y -B Y -B Z -B Y -C X -B Y -C X -B X -A X -A X -C X -B X -B Y -B X -A X -C X -B X -B Z -B Y -A X -A Y -B Y -C Y -B Y -A Z -B Y -B Y -C Y -A X -C Y -B Z -C X -C X -A X -C Y -C Y -A Y -B Y -B Z -B Y -C X -B X -C Y -C Y -A Y -C Y -B Y -B X -B Y -C Y -B Z -C X -B Y -C Y -B Y -B Y -B Y -A X -C Y -A X -B X -B X -C X -C Y -B Y -A Z -B Y -A X -B Z -B Y -C Z -B Y -C X -C X -C X -C X -B X -C X -B Z -A X -C Z -B Y -A X -C Y -A Z -B Y -C Y -B Y -B Z -A X -B Y -B Y -B Y -A X -B Z -C Y -B Y -B Y -B X -B Y -B Y -A Z -C Y -B X -C X -B Y -B Z -B Y -B Y -C X -B Z -B Y -C Y -B Y -B Y -A X -C X -A X -B Z -A X -C X -B Z -A X -B Z -C Z -A X -B Z -C X -B Y -B Y -B Y -C X -B X -A X -B Y -B Z -C X -B X -B Z -C Y -B X -B Y -C Y -B Y -C X -B Z -A Z -B Y -B Z -C X -B Z -B Y -C Y -C Y -A X -C Y -B Y -A Z -C X -C X -C X -B Y -C X -B X -B Y -B Y -A X -A X -B Z -A X -C Y -C X -B Y -C Z -B Y -B Y -C X -B Z -C Y -A X -B Y -A X -A X -B Y -B Y -B Y -B Z -A Z -B Z -B Y -A X -C X -A X -A Z -C Y -A X -C X -C X -A X -C Z -B Y -B Y -B X -B Y -C X -A X -A X -B Y -A Z -C Z -B Z -B Y -B Y -B Y -C Y -C Y -B Y -A X -B Y -B Y -C Z -B Y -A X -C Z -B Y -C X -B X -B Y -B Z -C X -C Y -B Y -B Z -B Z -A X -A X -B Y -B Y -C Y -C X -C X -A Z -C Z -B Y -B Y -A X -B Y -B Y -A X -C Y -C X -C X -C Y -C Y -B X -B Z -C X -B Y -C Y -B X -B Y -A X -C Z -C Y -C Y -A X -C Z -C X -B Y -B Y -C Y -C X -C X -C X -C Z -C Y -A X -B Y -C X -B Y -B X -C X -B Z -C X -C Z -B Z -B Y -A X -B Z -B X -C Y -B X -B Y -B Z -B Y -A Y -B Y -A X -A X -B Y -A X -C X -C Z -B Z -B Y -B Y -B Y -A X -C Z -B Y -C Z -C X -A X -B Y -A X -B Y -C Y -B Y -A X -B Y -C Z -B Z -A Y -C X -A X -A Z -C X -B X -B Y -B X -C Y -B Y -B Y -C Y -C Y -B Y -A X -B Y -B Y -B Y -C X -C Y -B X -B X -B X -A X -B Z -B Y -C Y -B Y -C X -B X -C X -C X -B Y -C X -B Z -B Z -C X -B Y -B Y -B Z -C X -C Z -B Y -A X -A X -A Y -C X -B Z -B X -B Y -B Y -C X -B Z -A X -C X -A Y -A X -C X -C Z -B Y -B Y -B Z -C X -B Z -B X -A Z -C Z -A X -B Y -A X -B Z -A X -B X -B Z -B Y -B Y -C X -B Y -B Y -A X -B Z -C Y -C X -B Y -C X -A Y -B Y -B Y -B Y -B Z -C Y -B Y -C X -B Y -A Z -C X -B X -A X -C Z -B Y -A X -B Z -B Z -C X -A Y -A X -B Z -B Z -B X -B Z -C Z -C Y -B Y -C X -B X -B Y -A Y -C X -B Z -B Y -C X -B X -C X -A X -B Z diff --git a/src/AdventOfCode/Year2022/Day02.hs b/src/AdventOfCode/Year2022/Day02.hs index 014af5d..1f44323 100644 --- a/src/AdventOfCode/Year2022/Day02.hs +++ b/src/AdventOfCode/Year2022/Day02.hs @@ -1,29 +1,30 @@ {-# LANGUAGE DataKinds #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2022.Day02 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) import Data.Finite (Finite, getFinite) -import Data.Functor (($>)) -import Data.Monoid (Sum (..), getSum) +import Relude import Text.Trifecta (Parser, char, choice, newline, sepEndBy, space) type Z3 = Finite 3 main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) getInput :: IO [(Z3, Z3)] -getInput = parseInput strategyGuide $(inputFilePath) +getInput = parseInputAoC 2022 2 strategyGuide -partOne :: [(Z3, Z3)] -> Integer -partOne = followGuide snd scoreOutcome +partOne :: SimplePuzzle [(Z3, Z3)] Integer +partOne = asks (followGuide snd scoreOutcome) where scoreOutcome (opponent, player) = player + (1 - opponent) -partTwo :: [(Z3, Z3)] -> Integer -partTwo = followGuide scoreShape snd +partTwo :: SimplePuzzle [(Z3, Z3)] Integer +partTwo = asks (followGuide scoreShape snd) where scoreShape (opponent, outcome) = outcome - (1 - opponent) From b7f6bc2cf69cc7a2f1ef7c2e324284de4187f87d Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 13 Nov 2025 22:50:10 -0600 Subject: [PATCH 20/91] refactor(2022.03-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2022/day03.txt | 300 ----------------------------- src/AdventOfCode/Year2022/Day03.hs | 48 ++--- 3 files changed, 26 insertions(+), 324 deletions(-) delete mode 100644 input/2022/day03.txt diff --git a/VERSION b/VERSION index 388da88..749db69 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.42 \ No newline at end of file +2024.7.2.43 \ No newline at end of file diff --git a/input/2022/day03.txt b/input/2022/day03.txt deleted file mode 100644 index 0b6d449..0000000 --- a/input/2022/day03.txt +++ /dev/null @@ -1,300 +0,0 @@ -VdzVHmNpdVmBBCpmQLTNfTtMhMJnhFhTTf -FgqsZbqDDFqRrhhJnsnLMTfhJG -bRRRPrRRwSwbDqgjvDZbRbQzpzmQVWCzzBdvQBFCzlWV -GcDdRdvhRssRhGDdShCRtqWjlQzqWgqzNfNjfQWWjt -mwwnnPFwmVrPmJmzfNzqCjQCbgVlgC -nPnHHLrHwmJTrCTJpThBscBSdSLGZvZBvRhZ -RVQQcVlcSRclfZCCCnMJJTSTnC -NdHwjdwjbBBZrrZrbJDZJJ -wmhjGGBGwwmjtjtdPlfRcpVQlhRppVJF -pplbNBPPrppllrFNbpvppSTcwqcWFhTTShhJDTchqd -RGzRfLjjmZmfmwLftTWhStStJWTdWmDm -nfsMjQssnpPvNnrPrw -SjjBgllzlQjBZvlBBgcFbgJHsMhJqbMHPggJbM -hRLRVDdRRWnJqnnHTqMCnH -GRfLddRRpVhNVrWSjwQQzSzcGSBQSc -qMwNqqBdQdnTVBBVVhMVnVFzTHPggTPjGRDzvPTjjmvPDj -sbSrWJpStrtPtRPttzmmDD -pfbJJcbsrcLpWLllsnFmcqcwQncnQQqVNQ -RBTWCMwCwdZThPZcZZ -pVmVpHLFFFHHVgVmvNmHSQNvddlPPzZJMPcdhclhjczLdZMP -vnnNnFStGMRDwWnn -fWDdJTpDJzdBBBdmDSbSRHRwPqbPbHgSbz -slQtQvNsMVvrrgPRgRglnhwWPH -sGMMQFrsjvNMfWmdpfFDFZBf -vnMRMWCMJwWWwwWPjmSdVmLdzvVbLrhL -HsNfDHQlZpNqfQzbLbrqhjLmVdjd -dfDZQsNpstHHHptZDDtZWgngtgBMPMMRwCPtBBGW -HwQwwbwFNWHwHBVFQFLQzRznZnSzcjjjpPbcPpSP -vTfTJsCmsftJZmTSSdPvzdjRSvPdjd -TrGtTJfmGDfDhrhJJJsqrZhDBFLHHLLQWFwwlWBVBBVwgLFD -FFTJRLccQgmTbSsbGm -PBPPqCvCwqwhQQVhQngmVmSgglmGnHbnmb -zqthvtQPBfCCzPwQPtwQzPwNLfNRFNLdLRLFRFFNLFdFdW -nszjQnsPwjznzCCrhJqvjqhmBv -tFWdHGWFGtctlNNpZBBhmqTrrbWqvTBT -dlFtcpHDVVVHFdNGHGpGfQgsPDzSMsQwwPwgLLBQ -TzQqTJGvnnSzqrWTnvfbbcflQcVltfcCMPVM -jFjNZFFJLpFwmBwblcpptcVtfbbVlR -jmmJdBBLNdGDWDDrdzqn -pzddqQmGgbqgGpbJmmdnLZDCRZnZvFlLRZLSlLRT -rVwchcBBMwVBHhHTZCTSGSCRTZlTDr -HtccPfjfBhMtVBGHWpNqJdJdpjNJppWz -WThTWWhtPbZRvvWbbvRTSRMjVRLLgFssgLpVsfSF -JdwrlJcCwfzdqwwjsjzpLMgVsMFgML -lQrwHNGJHClvTmfhBmPQmt -lbRLhcLRpLJzgdGddF -qvhwqDDCVtBDVhfMVGFnzGGzTBnGzGGgFg -VjCwCWCMtjVDtChvQhtffcSmHpNWrrcHZHHZpplWbp -DJVDVdvpmZdPgrCbgbgCJC -lzczcWwwznGhBgPSvTlCrNgqNC -wGzzQhzGGsBBGRBcQwGwnwjmmRHpRfmmMpppMjjHDvLL -HJjJQWjFmmWtFmJTMchghhDwNMhVMWML -SznPSRfRSSPdrrPSShbDVhbLPwcwGGwVNh -ddRfzdRrCrRsZDSnFjspvFvqFqFqTvJt -lflfjQfjvljfbfMLTTDCmHNLNVbL -HSJnRrrJZJssnGRrnsrcqqRnDCLBMhVCTLVLhVNVJBBBhhBm -SsrGGqqnSsWSnnqWHSrPfzftvFdvWlwfQgQwWvzz -nQlsGnFGwwqNJWmJJjpplt -HMTLPTRdvsTCCThDCZdLdLDNNpJBWJbjJMpBmbtNptBWmm -DLCzPzTzZDdLdGSGfSGrsnQGzr -LNPPLHNPHQNQSBFDWDPgggFv -hszfWCWJhrBMsSSBgvFD -GGZjfmJTjmZfrJrZrZJRGwNQnlLNHWjLVjlwdVNHpV -BdNVdTcGVclmTwrTnwPwrHCr -zttBWzfLsCggHPwDrf -szsWSMbWzzbqBbzJjtjsvMzzvdmdVpGllpcRNZZhmRpZcGGc -CjdbMmmmZFnzzgHlttGBVqtBGtsldG -LvPPWNcFSSRslWhBsllT -ppccvLPpcSNwLLwrDNNpLvwJHCMDmbCJbFzgmZZmFgbgnM -TTNRwZqhcTTjsNTTsmrJlvrmmmqqHSrlJH -fLQCCdtcfCDDVbVVQdFbQbdJHMHrJHrHnMllHdMHPrMdln -WfQLQWWDbwRTWcRssN -HQGQWHPDHNjMNQGNWNTWCvZllzqFZqzvvzhCtvFj -DfgwdgfcFpchztvt -sRggdwwVdgmnSTnnDBPBNWLn -WbCZCfTVTTJjSwGdWNDGGw -MMRqggMsqhlmlhrssHgRnRmRvdzdczvdNGNLzScGDrNzrLNc -lRqsnRhmqqQnQpgQMlgDqRfBTJVFbJZQtBCbZQJVZFFb -JnhQcCnmLDsmgmgr -bbMZppRFGGRPfBMMRGMZssTTrLlLfsLlVLdsLsdn -GZGSpPGMZtGGPFFRGBCwhvwjjcnJctvQcvHq -vvrPrHZMGJNRMnqn -BVChWWcDVWsBwCWwGrJNhRLJJnJtLqnq -cjDfcfpWWsfWccBsHgPgrPTdpZbbgggv -GshtVtVtjSCVtVvVGtlVvFZLMvLRZmHmZwbLwZdLdZmR -JWzNDQzjcgJgQBJgzgMwLLHZZcdPwRLwRdHZ -QWTppBWfDrrNBTTfffhFCpVSjnhCGsFtsqSl -nmbCnzHHNzCjCJHJNSCWHLBLrvBrrSGRBDhrDRLrGL -TVtPllwcgdmTRhLQTQhT -fdFtccFcpPmggfdfNzHzCMsbCnWnJs -fMgddvjgRRvjvjVJVdTlZGGtGnrlnqTccNjl -HHSFSWSmmpbBpZlGncrNGbNtrn -WDWBDDBDBDCwPBWBDWNQDgzvVvLRvsVLRwvwdJVLwL -ZSmmvcpsmcJmJvqgBZgZqqtCtZjl -WhDwhFSDgtBFjnFg -rTrSTLWTTHNMNwNrMVddwNNhsmJGQcRsRcJGsJzQJsrzPsPm -GBtLmPsCQqsGqgghZHDzzgLbFz -zjjVTzTlRjRJfznrvrfpnNhFSghbbNFgHrbHZbDHbH -vpfcTJVpcVlfcQPMPCGzCBsd -HMhZNffcPZfNMrzjjFdGcJDjvJ -VSBVVLlSQQmTVSWpSQzDrHzTTvDvFjFdGGzT -mQSplVHWbHLSgWQnShNwsZMZPfbsNCRNCt -MMqvDzLwZzlMqQfdGWPfgPffPglH -ShTcJshsrRdnrdfrrfHp -VVRtFhsCJVJVvwQqDdbDQd -dmnNMlFNvmvljnbpMWNDFQvfQJJGvfPCfHGgQQgcJg -bRVzLBSSTRBRBBrwTrVtRwCfcGHcsJgJgzgGsggHCzcC -ZbtVTTrrqrSSVwhqqwBRwFWMDFNdjdZpWjdDDppjMW -MTzqtbLtwFzJgbHgfbdWWH -VMNBjNVjvNfhhhhfNPhP -jmGMvlDZZnVMtzlwzqqCpwFt -PpzGspGmpPsFLrTnTLzzBg -QCWvfjfWjRPFZgrvqrBvTg -wwNRCNQQVNRWjNWfQbHCCClHGDGJdGhpdhtPGhltDlJD -dhbpGzhllzGlPvnzNcvtNVnc -gcFMsTJDMMwrZqfjjqvvfnPtqJ -sWRWTRFwrTgLDDFWgMsTlpSlpbSCdWWdcbmpChGd -QccdFFFcFbcQPQPHMgpPMp -NJlNSSMLDfJfmlSqHZRNpRqNBRPRPq -LlMmJfvDVVTJSmVMscsCFtvwcjWjrjCj -NVVMGWFSMRVGWSthwhTJWzcJCcJsTs -jqRLqlfRZcmjcCzT -rlRRrdrflpdvPbHpflfPlfDBgBMQpGVQMgpVDGMggBDV -VwRhccRsnQStRhtGQVQVsmjgDgqJdggDjqLDgJlLzmLl -BWFZpWHBNCBCNBzBNvWBpzHZqqlMqgNdlllDdqDgJDLlfDdd -pFbTrrrBzbzTtSwStQnnsrVn -DRfFbFqzbddfPFtsJnJRsnClJRsn -cgjgQgWvSLVQgmWWgWVjVSSSBTltThLnqJssnTCZsTThntZT -qjwpSrmWgcSrGMfdFDFdwHFd -RWjDDWDjDNjjgDtSRRgjcjzFpnzwdFbFNdbFbpnldwFF -vQfPfTQJbZdThTzL -PrBQJQsfQqrrbfmPqMBfJbggjRVgWjttsHRSgRctDjSs -NgqNWqqWWdnJdqpBNFtCmJGCDHttDGDsHsHm -BjvzhRLTrTBQhTMQRjRRcjPGtmDCZZDZSCmmMSSZmVmSSt -vQzRvRzQcPcvfQzRnddppFgnFfWwBFlb -nnPvfvgrtPDHgvvGTRRRPZQGpGCLLV -FlBsBdbllFdfWpbGMCVMZLVbZQ -lhchNcqFsJBlBszztvwHjvzgrzmzffgH -zZhdjTpJJpjmmpPZhvqnnZHqZcggvgMbgv -tFpFQFSFtBGlFNwFfNMnHfbHcnvcvcfvcqrM -GBFlNLSNVGVSSGtQSLLBBlNtphDdzpmmPmTPhRmdzdVCCDdR -rpRCCDLpmnCdJCjn -vMhSFvgsMGLmnmWMmm -wVqFFvwvPPHhFhhgHPwHshpqrDDzqlfRbpftRLblrllr -CRNDzdJCVDWzVgDjdjzRJzWRMTbHsMNZNbZMMbsfhTtMTLMB -wSlwQcSpqPpcqcqFSqpwslsTfZtLhtlthtBHtTMZ -SPGFGFFmpcPGDrWDmjDJVffR -dsmdtJthJphWqHRPnRRsvvnnfR -cDBMDDDlBZglDZTMDfzVvNRrvNPVHzRRTV -PGMCCDClBDDbbFqmmhqQdpWGmmWp -BJjcGhcvCnBdGHsmHSzZDzSDMHmRMQ -qLWPLVrTwWlwwwrfrFfGDNmDQRMbQMzzmmbQLNMM -rVWrFlGqlqwVwVGgWGphnvgBBsnvsjdBnCBnBg -sNNsfBsmcGmgNTcHHSpnTWHnpV -QlrhlrlMglhDQrdFblvFtMdnDWwSHDWWwnTSjLwVDSwwwT -QtdMvltZhbFlPPZbQtQthZQdqCsJJGzBqqCBmCNCqgRCBsfP -SZnQnnHRWRQRVjHnqlJTQPfdlqfJftqG -pDzmbDBFbBLvvzttfdlTTl -gsDLLpcmsSZVwlnRsV -LHsWjwjWqCLsqCHcLsjdLqcdbpMGZPPtBhthbZBpBhMllwPG -VFnVbbvJSfbgphSpGlhRBBSP -JrrTgmFgzvNbrmNnmnvzgTLjCQWDLDCsTjssjqcHLc -QmwwqTqsrdqNNqgtvnVDVcGNNtvv -WBFBpzzjSJBJzJbfntgPzVzcvPnzDf -HcpbHZJBFpjpcSZrZsdRQZrCwrwd -JqmLmbtTWThBTWvWGVSrrVDsSGSG -wwzRzNjNNbsPVPds -jfgQRZwpQclQfffHgpRpwpfTcqtLLqCbbFFFLmbmTTBnFB -fGpcccNNqcctqGMprvMPmbbzFSflSRzPBBlBbS -JCjnjTZTTGPSGmTFPb -ZWHhJjHLDVDgHLLDGjnhctsstwqctNwWqNwwQrtv -sDwQhcwhBDDwrhGsQnRBQHHMHHMNJMZFCFRbCRftMM -zjjlmjqfdTqlWdzTqmLzlzVjNCHJNHNFMFtbJNZgVNMMCCtN -vPTfLmPTLWBsPDnSscnS -ngznwDPPTzhPPDCTQnTTDQBQqHNNrHFVppbbjRFFqFhHqRqr -tZJtcGsGtLLcctRqVBbbqrspbHNq -BmZSvGBMdWPzMPgnnz -MpNWPVNWWZWVVNZHVcvJjgBjJMStMJSjjg -rzdCzrCTTLRCslvJDSjjdScgDm -RLhCQzqTCssThRQzRzwGQrrCFffbfWppNpWNWVcHqZbHpVPp -zQzCVWdSSjCdjpchWcGftflGZcgG -RwnJTJwmvFHTBFmtBccZZfBGMstllM -wwvvHRwqDnHFrmqnrSbQVVQfSbqQjbqjbQ -ttDftStSlftPgSHmJbFwnMnFwzbrLHMMzz -GqTBqhBqBvppBvMMTznrCbCnLwfr -RBjjpZZvvZqGcNhjjpNmDPfDcsgfDfgScsQQQg -rsSFccvBHppHPsvQrSHSprFjnbLGdbzLfbGLLtLjjzLzvl -JWWJhmwwTDTGtnzlhdbtLG -CWNqWRNCwnCJVppQFFFFNrgHBB -MSRVnMjnVRVnPlcsrtMtschgDl -NWHBwJBwBBQCHHqwWQGBNgdrFFtsthcqdltdDsqttq -CCTTGCNCCBfNJNNWbGGnvVzDSRfDRSZvLPSzRn -MpRfjRjWpZzzzRzZSpjzZjTCQcGdHLWNGqdBdcBWWBLccn -lrbrsPQDPQglDtwggcLCqnCdNNdHBLsqNd -blwbJggvgbwlvQbvtgwmvVwRfTzfMMjFVfSFjZjMTSTSzj -ttSGjHWVrwWrWWvhzvhmhDfR -qMBdNNsccQgfDRzRmqlhRl -gQJdfJPdQBsMggMjPrTCLjrGrCrtVT -tGFdlwDwGFdNtStghWWdQFSnTVfCfZhrfVTVCVprnRRhVn -cLsBPQJsQPmbmPHTnRRnHprCVfns -MjmvPqqQjPbQzjLwwDWDSlzSlGSgwl -NSCpFgfbscbZZZwrtgPZJT -zGCQlVGmmQGVqqJwGtHZGrPHHRTH -qQvVmvzmqCdhhjzCQLjljLQMnMDSFWcSfnMfpbfnNcFFbFDN -zFgqjQBmWNlWlfHrHdLc -wnbCpSSZZTJSJSnmdrtHfGtftlcpltpH -ZSwhVPPJgNVmNFzs -WNVJthVHRRfLqpqN -gdCGcCgJBCrgScRLzbjQQLfRRR -SCFdGSFvlhTJsnvW -FFZwFZZwRmFFhHtNLNLGRtsqjLMt -gbDnnrMbMCffMPbPLNjGNlcppNtspp -rgbzrzDrgVgnrBzFWMWmWBwHWHShSB -zjRVjDqzRjvSBnBGGsfsrFsV -fLccLLZpJMctwJWWWJWpJGCwFwsgnngFBPsCnnTBPT -LbJlZNWMtpMlHRNHzdfSDfdj -VGbbnJGSTsVTssTTnVVWMtfBBmvftRHfHBMJJfZp -ghqtrzgPrjdzQCjmZMHfRHZHBmQmmB -gltFtDqFVlTVWlTl -HqNqZDTvNvVTLPSTvzfrfHfdndffwnbdnwrH -MpSJlFcMJmcpFlmClcMcRnWbWtthrnfwnCGrrWfrwC -RjcJJmSFMRQpMRFjMNVvTZjNPPvLTBPBBB -MzClDtlzJzFzNGGm -bjcLRHlTBsFJGmRm -HcPSSfTSpLZLbSwtrtvMnlDCDPCl -gWWgQJCsVhgRLCWsdjpmcBHvfvrrnvCvBB -TqDtztqtStlbNTPtllqZpvmcFHjNjvjNvHvmrrmj -ztPPGZqTPSbJgchGgwRQgQ -wVrdtTqtCCvbNgbNTTDN -mhGzWhGzMGWGrRmbFLBHZRNHNvZvgB -hhGhShpnsSrqVCVSSj -HnlbmGnlHZHnlBcjgwfDVfwLsGLGLDgR -WhWMWTvQPWPLDMFRCDMsVD -QdzJQPSPZqJnJRnZ -TTjTjFBcRBGjwsDTBLmrCftfRVrrCftCVNRP -WnqbJWnnQJhSqVfVPfDnggfrVN -hSlDMllvhbQqllZlSWQdSQTBjsFHBjTwGdHBTBszLzcc -rNWqWDLZWcqFqLLLgQQJnndnQdNzzJVMzd -cPtsPvChtRsGswHPGbwcPcdVnpzvnmBmVvJBJdJVJdzn -PfRfRGtsHsSRftbbbbHhwCCsjZgSTgSZWDTcgDZjLqgqFWLq -BNzPnPJNNMwHJRhBGRWRdjFQddFlFjWd -npbZrgnLSCSrWFjjdlZGlcDF -gqtmmngSbmgHJqfqzNBHBJ -stgzttBPRRRdpSVVpdpS -WJFcLQmJZHcCFLJmcZLMfbpGSWMNpGftSSpMrb -mcvvQvHmtLCJmHZQHZHCDHJJnjqPjjPzwvwhnwPqTjPBzPnB -DDmbbPqgFSbSQPtPQJttrltJ -CRfcnZWmRRhJNVtsVnQlsp -fcBvWvWzcZWCzTTCTTvccFMBHGDdSwGFFbqwFSGSmF -tCRBPCPRjzsJszBmtjmCvSpHcppJpvZdHHHcHZJG -qbrlLnWlQDQDNvmHHHHcrZZvdm -nmnWnnWmgQsCFzFCRVCg -sHMHCDZfcwMcRcLMcZDCRCHMPdJqgjvVdvqgdgfdJbQgvWQb -FFhTzmzGrnmtjTBjBBprrmFtqGgQqvVdPbbgqQQWJvvWJQqV -TrNjrnFSlwNZNlNL -JQGdsdzSzsdFQFSdssnndNlZjNPTJZNljVjTPhVPhT -GgGLfRmHGLhNVjjNTLhV -HvGvwpbHHRwpBrvBgSSzSFndtzndCrsFMd -DptFshMrhDhDwmPPhwSNhmmS -RLdcdRvBjnvRVcvlcLbCcbCwwpGBwSmfZqqPPPPwzmfqZq -VlRLvVjCJLnlpvvRdllLcJJWDHgMMHDDHtWFFDDQgH -SsSdrndpDlCdLftd -VGPVJgmQrVGHHZfwLlfCTmfwlDlT -PcJHcGgcWWbJpjRrphRbFpRn -PdPSMHMLzPPSShBdffMMzMRHQQrpppcqTCQQpCccTGTRCnCQ -vsbWmFbmJmZFFsmsbfpGVrGnWrrpVpnnVcTV -JZslstfZNNSSPdlSMwlM -bLLzRzZLbRqJJrDGGVZdwssDvGQw -FCtNJlTFtmPfldSvDvQFVVsjSv -PmCPHBhhPpWLWgzgHJ -qwmwFHCgPgPPqPwMCrHHFBVVRBttVRRffVfmsjVNNB -WSvcSnvbSWbhcbjlQbvlSQhlfBGcspVVsVGfVscpzpNcpBtN -hJSLhlvlTjPFHMLCCq -bggDpTggncGVVWbQcG -sRvSwwwFBSpFzvRvMFZqmPmMVqmcmPPVqhqqWq -SRBBrFZZwrddBFRjlptnLgDnTggdtd -PPfMcZMflbMQcMllPVfTVMwjWWmZvpWWpWhhjjpdWWww -sDQNnzsnQgDNsFzFqtGjGmWWSpWrGhdpvphdSW -nNQNqLBHLqzDnHgnVJfPJPCRBbfCcJlT -fppppWsjcSDPjjDpGhgwbfTgHTCbHJwbHbTR -rLBdQnvMNMmFPbLqHqTqgLHCgL -nrFznvMNMQdttrBcScsDstWcPGtWSc -lclnRSDnGZtvSwnZDZzhLffqdsCNwTBCBBdNsd -mPjmjmrFFpmQjMJQjlNdlhCsCLsTlNLs -ggmrHHVVQVPJpWrgpWScRvzZzGGRnZvlgzZn -GjGJGQJGcMTVfFDQzNVQzP -mHqdbmmdnJqVzVhRVNzPbR -wStmHJsJsLZLjTvM -QssMbVGdMQjZPjwVwHVZPZClllvgSgvlTgwwSSCgSCtC -WmmFBmJrcFRBFrJJBFchzWCStgCTgvhvTlfsNqfTlvTv -sFzzssDLzrBPjDVVddHMQD -fztDZSGrNrlnbnPTgFFpln -jvvQMMcLcjJmQwHdJvjQJnnbTbRFRphnnpsWgmFRPR -vTLHHCQLHBBjJCSZrVCZtSfSfrft -gHfHffHLjwHrRjLrLRZVMnTdTBsNTBwTVBsBnN -DWPhqhhDhvSGvWPzSzMBQBQVMMBBmvssvQvQ -CDGbqCDbChSbWGrHcHRgbcVcfrLJ -frlTLmtllbbbdpJS -qFjhzjThjHTFGHTjqhhjMzBhVpVpdbBnSJQRpBnVVdbRRQJd -vjWPWjWPPPWgwmfCrNvTvZ diff --git a/src/AdventOfCode/Year2022/Day03.hs b/src/AdventOfCode/Year2022/Day03.hs index 09a82ec..62699b4 100644 --- a/src/AdventOfCode/Year2022/Day03.hs +++ b/src/AdventOfCode/Year2022/Day03.hs @@ -1,32 +1,33 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2022.Day03 where -import AdventOfCode.Input (parseInput, parseString) -import AdventOfCode.TH (defaultMain, inputFilePath) -import Control.Applicative ((<|>)) -import Data.Char (ord) -import Data.List (intersect, nub) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) +import Data.List (foldl1, intersect) import Data.List.Split (chunksOf) -import Data.Monoid (Sum (..), getSum) -import Text.Trifecta (Parser, lower, newline, sepEndBy, some, upper) +import Relude +import Text.Trifecta (Parser, lower, newline, sepEndBy, upper) main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -partOne :: [[Int]] -> Int -partOne = day03 (uncurry intersect . halve) +partOne :: SimplePuzzle [[Int]] Int +partOne = asks $ day03 (uncurry intersect . halve) where halve xs = splitAt (length xs `div` 2) xs -partTwo :: [[Int]] -> Int -partTwo = day03 (foldl1 intersect') . chunksOf 3 +partTwo :: SimplePuzzle [[Int]] Int +partTwo = asks $ day03 (foldl1 intersect') . chunksOf 3 where - intersect' xs ys = nub (xs `intersect` ys) + intersect' xs ys = ordNub (xs `intersect` ys) day03 :: (a -> [Int]) -> [a] -> Int day03 f = getSum . mconcat . foldMap (map Sum . take 1 . f) getInput :: IO [[Int]] -getInput = parseInput rucksacks $(inputFilePath) +getInput = parseInputAoC 2022 3 rucksacks rucksacks :: Parser [[Int]] rucksacks = some prioritizedItem `sepEndBy` newline @@ -35,13 +36,14 @@ rucksacks = some prioritizedItem `sepEndBy` newline lowerItem = subtract 96 . ord <$> lower upperItem = subtract 38 . ord <$> upper -example :: IO [[Int]] +getExample :: IO [[Int]] +getExample = parseString rucksacks example + +example :: String example = - parseString rucksacks . unlines $ - [ "vJrwpWtwJgWrhcsFMMfFFhFp", - "jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL", - "PmmdzqPrVvPwwTWBwg", - "wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn", - "ttgJtRGJQctTZtZT", - "CrZsJsPPZsGzwwsLwLmpwMDw" - ] + "vJrwpWtwJgWrhcsFMMfFFhFp\n\ + \jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL\n\ + \PmmdzqPrVvPwwTWBwg\n\ + \wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn\n\ + \ttgJtRGJQctTZtZT\n\ + \CrZsJsPPZsGzwwsLwLmpwMDw\n" From 3ee4a46c75902ab0059019588e0ba77847ac94ec Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 13 Nov 2025 22:55:48 -0600 Subject: [PATCH 21/91] refactor(2022.04-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2022/day04.txt | 1000 ---------------------------- src/AdventOfCode/Year2022/Day04.hs | 44 +- 3 files changed, 25 insertions(+), 1021 deletions(-) delete mode 100644 input/2022/day04.txt diff --git a/VERSION b/VERSION index 749db69..f690dd1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.43 \ No newline at end of file +2024.7.2.44 \ No newline at end of file diff --git a/input/2022/day04.txt b/input/2022/day04.txt deleted file mode 100644 index b52da37..0000000 --- a/input/2022/day04.txt +++ /dev/null @@ -1,1000 +0,0 @@ -75-76,18-75 -2-54,1-50 -82-83,78-82 -13-37,37-75 -79-80,2-80 -29-90,30-89 -13-16,12-15 -20-93,20-94 -90-95,33-90 -16-77,76-92 -42-52,15-52 -6-34,9-89 -13-77,12-76 -18-81,17-81 -2-34,2-33 -17-92,20-93 -24-89,7-11 -6-49,27-49 -17-69,16-69 -34-57,35-58 -71-76,73-87 -69-72,70-72 -30-70,29-69 -48-85,52-84 -14-69,13-15 -2-61,3-70 -17-86,17-85 -7-98,8-98 -8-93,12-94 -16-35,35-49 -13-59,13-79 -5-95,4-95 -2-40,2-39 -16-44,22-60 -8-26,9-27 -48-89,88-91 -19-97,18-20 -10-81,9-9 -3-40,58-73 -2-93,92-92 -77-83,73-84 -7-84,6-6 -35-45,38-59 -28-79,57-74 -52-82,55-83 -60-60,9-60 -63-86,40-64 -44-80,13-26 -17-67,19-75 -33-69,5-68 -5-31,4-54 -81-82,64-81 -55-92,55-95 -28-29,29-82 -34-93,33-33 -88-95,62-88 -64-81,65-81 -81-82,64-81 -28-94,28-94 -9-76,6-75 -34-36,35-58 -86-89,12-89 -29-31,30-31 -46-78,83-87 -11-77,1-11 -27-34,37-68 -3-4,4-93 -7-89,89-90 -18-94,14-16 -28-89,10-88 -89-91,33-89 -17-53,17-52 -70-87,70-86 -1-33,1-86 -67-68,33-67 -13-75,14-27 -26-73,26-72 -28-57,17-19 -65-65,3-65 -5-92,28-29 -2-19,19-81 -29-42,29-37 -16-70,47-87 -5-77,1-2 -28-40,28-41 -98-98,10-98 -11-21,3-74 -4-32,5-31 -5-98,4-4 -23-99,22-97 -77-99,82-94 -8-91,9-91 -1-60,59-93 -9-11,10-37 -88-88,11-89 -71-89,48-70 -6-77,6-76 -82-91,84-90 -7-97,47-96 -54-64,54-67 -7-34,16-35 -5-97,4-97 -1-1,3-18 -42-51,42-45 -69-70,69-80 -16-86,16-88 -58-59,58-58 -56-86,57-57 -11-35,10-35 -15-20,37-98 -4-97,96-98 -32-34,32-34 -53-66,12-33 -65-65,3-66 -82-83,9-82 -5-59,2-5 -74-90,43-91 -34-86,35-87 -65-91,5-92 -7-86,8-87 -46-48,47-56 -87-92,8-83 -21-21,22-54 -50-97,50-93 -8-74,8-96 -45-46,46-57 -82-98,34-79 -29-62,29-55 -15-68,16-69 -26-88,37-88 -45-78,46-46 -60-65,60-61 -3-36,36-37 -55-84,56-91 -7-99,7-97 -2-98,1-99 -51-89,63-90 -4-99,3-99 -6-50,6-51 -37-98,62-98 -38-86,38-39 -1-96,1-95 -88-90,78-84 -44-61,4-45 -6-89,89-90 -7-93,19-93 -56-94,93-97 -5-25,13-28 -28-35,29-63 -62-70,63-76 -20-20,21-48 -13-48,45-72 -13-50,50-89 -25-79,25-78 -44-74,33-73 -87-87,62-87 -30-57,54-56 -30-64,20-65 -4-95,5-96 -22-54,13-88 -11-11,8-9 -66-84,67-83 -6-95,7-74 -36-84,23-36 -18-35,18-35 -96-97,42-96 -10-11,11-91 -9-96,95-98 -8-68,8-8 -15-18,13-20 -37-50,8-98 -9-10,10-98 -12-93,13-13 -6-79,7-79 -18-59,18-41 -25-52,41-53 -6-82,6-80 -74-74,6-74 -1-98,1-99 -51-94,93-98 -84-98,5-85 -26-35,23-35 -45-89,34-88 -36-78,37-37 -2-11,17-59 -20-96,20-97 -30-46,13-47 -15-86,15-88 -30-60,12-29 -82-97,12-82 -2-2,3-87 -60-89,59-87 -5-85,6-86 -16-84,15-16 -10-29,18-73 -64-93,65-99 -37-60,37-67 -2-98,1-96 -7-14,8-14 -29-64,29-29 -34-58,33-58 -1-97,2-97 -13-20,23-59 -64-64,65-76 -16-48,6-47 -81-90,81-89 -76-91,23-40 -22-46,21-46 -13-74,74-74 -34-35,18-34 -38-90,37-37 -34-61,36-61 -41-52,42-42 -3-12,3-87 -96-97,43-96 -97-98,4-96 -24-67,40-68 -13-31,4-23 -27-57,26-26 -3-84,84-85 -16-94,93-99 -16-16,17-74 -34-60,2-34 -17-98,17-30 -45-61,34-40 -12-17,11-14 -95-95,3-94 -48-69,11-68 -8-51,50-99 -44-80,44-76 -4-4,5-94 -31-47,30-55 -27-35,36-36 -3-57,3-98 -2-90,3-90 -22-79,22-80 -28-46,27-46 -1-1,3-30 -36-81,36-50 -19-40,19-41 -22-93,11-22 -32-58,31-58 -35-44,24-43 -1-8,1-80 -7-27,9-19 -78-90,14-78 -1-37,36-51 -32-36,30-37 -43-45,30-44 -65-80,66-79 -96-97,43-96 -62-94,61-92 -4-96,96-97 -15-75,14-76 -39-82,38-82 -3-95,3-57 -22-98,32-96 -2-93,3-93 -25-62,62-63 -6-58,57-87 -3-25,2-80 -50-54,51-52 -2-91,1-86 -97-98,38-97 -54-74,3-96 -6-31,31-87 -37-39,38-97 -8-55,8-42 -6-33,7-33 -18-96,81-97 -9-95,94-99 -6-13,5-46 -14-73,34-73 -7-94,7-89 -56-86,57-86 -12-53,11-53 -25-60,24-59 -39-75,28-28 -52-53,52-54 -6-35,12-34 -57-88,38-58 -57-58,7-58 -45-64,4-63 -26-84,3-80 -15-84,15-85 -16-89,17-89 -34-91,33-90 -24-67,94-95 -43-45,44-73 -29-65,66-74 -23-83,22-84 -2-99,1-99 -24-52,25-52 -4-6,5-87 -5-96,1-5 -5-18,24-31 -49-93,55-94 -11-94,43-95 -18-41,17-40 -86-88,85-87 -12-56,16-57 -45-71,45-54 -65-73,62-73 -93-93,61-92 -33-94,34-93 -7-62,14-62 -4-99,1-2 -6-69,1-1 -5-84,83-87 -6-82,93-99 -81-81,1-81 -2-81,1-74 -23-93,22-93 -9-11,3-3 -13-40,12-40 -10-87,9-94 -53-63,54-54 -25-72,45-71 -1-2,5-98 -63-67,23-64 -98-98,63-97 -63-87,50-58 -9-80,10-75 -1-1,3-40 -11-75,76-99 -32-98,33-97 -44-44,34-43 -49-52,33-51 -1-97,2-97 -82-82,82-82 -84-97,4-96 -1-95,13-96 -31-87,4-30 -15-40,5-7 -87-91,40-79 -6-99,5-99 -6-67,55-84 -56-94,83-99 -5-48,49-49 -14-25,24-35 -21-66,22-66 -93-96,94-95 -64-65,18-64 -69-96,68-84 -3-98,2-99 -3-95,2-95 -35-98,94-98 -19-28,29-88 -48-94,49-94 -29-47,29-35 -3-50,1-3 -1-4,1-61 -20-63,19-89 -11-96,11-50 -2-2,5-94 -76-97,76-95 -14-33,47-75 -88-91,12-87 -12-64,12-89 -4-84,3-84 -13-98,6-13 -65-75,64-75 -30-30,19-30 -99-99,39-99 -18-70,18-44 -1-31,1-42 -49-84,83-90 -94-95,54-94 -9-94,95-95 -69-69,68-94 -10-82,10-81 -98-99,63-93 -82-82,75-81 -59-66,25-64 -28-88,88-88 -50-81,81-98 -80-80,27-81 -11-95,10-72 -23-96,22-95 -15-73,14-73 -13-13,3-13 -29-77,29-71 -52-89,78-96 -6-52,25-53 -16-87,15-87 -37-85,63-86 -2-26,11-27 -27-48,28-28 -17-29,9-17 -21-70,21-76 -85-99,85-86 -47-77,48-77 -4-35,36-36 -92-96,58-92 -48-80,47-79 -4-29,82-90 -26-88,27-89 -37-92,36-38 -10-93,11-94 -72-72,17-73 -58-66,60-67 -19-46,19-19 -39-78,30-39 -61-99,39-60 -8-92,8-91 -7-83,5-7 -3-80,1-1 -90-99,5-91 -5-92,92-93 -6-88,6-89 -57-95,19-94 -30-76,31-31 -12-94,93-93 -35-49,36-49 -15-67,16-66 -88-91,63-89 -56-79,55-55 -1-5,4-12 -31-87,30-88 -72-79,73-80 -69-81,70-91 -20-42,43-43 -3-65,15-66 -46-46,45-72 -16-21,15-22 -98-99,34-97 -10-28,48-80 -1-97,3-98 -14-99,15-99 -25-25,25-75 -12-91,12-92 -94-98,11-79 -9-90,9-92 -50-54,49-51 -64-82,64-83 -8-10,9-59 -9-96,96-96 -1-17,23-86 -66-91,66-98 -3-93,2-82 -7-8,8-83 -24-28,25-28 -94-95,7-94 -38-86,38-93 -4-50,32-49 -7-61,61-88 -86-86,9-85 -10-94,7-10 -96-96,10-96 -13-67,40-68 -21-53,22-53 -12-38,13-39 -4-7,21-63 -26-90,91-96 -56-99,56-98 -19-20,18-19 -86-90,7-85 -18-59,18-32 -73-75,69-75 -24-77,25-77 -28-94,25-26 -17-79,79-80 -55-57,54-80 -8-22,8-22 -96-96,7-96 -51-63,53-63 -14-99,15-99 -20-98,20-97 -93-95,9-66 -79-93,78-79 -20-48,20-53 -43-81,44-82 -28-93,29-94 -1-28,28-29 -81-86,56-86 -30-86,89-89 -79-79,78-90 -87-93,27-62 -37-87,37-87 -95-96,4-95 -40-72,38-41 -67-80,48-79 -63-63,19-63 -3-98,16-99 -64-93,37-43 -8-85,16-83 -66-69,50-68 -11-87,12-86 -77-92,5-92 -99-99,96-98 -3-94,2-4 -29-97,28-96 -57-76,65-76 -58-75,58-63 -67-88,66-88 -77-88,57-86 -5-84,84-97 -10-71,8-70 -7-17,3-18 -42-89,43-89 -30-31,3-30 -42-87,41-43 -68-93,67-94 -3-85,3-86 -26-81,27-27 -82-99,74-83 -50-88,51-89 -7-9,11-81 -17-53,25-53 -5-95,5-99 -34-73,74-90 -34-40,35-40 -10-68,46-69 -28-96,95-98 -58-59,5-58 -1-99,2-99 -4-98,5-87 -3-96,2-98 -84-88,83-85 -11-96,10-97 -19-88,2-87 -19-72,23-51 -6-96,2-96 -18-64,14-16 -96-99,3-97 -75-91,13-75 -18-57,32-58 -17-33,17-37 -43-64,63-63 -97-97,14-84 -89-99,9-89 -63-85,64-85 -77-78,47-77 -20-21,1-16 -23-33,23-28 -58-90,59-67 -39-80,20-40 -15-46,3-15 -13-82,81-89 -1-4,9-92 -15-45,3-15 -18-78,12-12 -3-3,2-61 -1-9,1-3 -7-7,6-99 -5-35,4-34 -5-74,6-74 -18-55,17-55 -92-94,11-68 -27-97,27-83 -14-57,57-58 -25-69,26-36 -72-94,72-95 -4-80,4-94 -7-77,7-99 -42-91,42-92 -38-67,22-37 -40-93,40-87 -31-65,5-64 -34-96,96-97 -1-28,27-27 -12-63,13-13 -97-99,71-91 -17-69,16-68 -56-67,56-65 -5-68,6-68 -17-93,23-99 -8-14,7-14 -18-89,18-18 -3-38,39-62 -4-4,5-39 -27-85,84-84 -32-95,96-99 -7-68,17-67 -20-69,19-70 -92-92,32-91 -3-18,4-46 -13-94,13-94 -52-80,52-81 -29-87,3-86 -79-80,35-79 -23-67,47-68 -22-96,24-95 -7-68,4-4 -5-98,3-5 -84-89,84-99 -18-21,1-15 -41-85,40-85 -38-63,60-60 -43-89,43-43 -11-83,10-84 -43-61,11-43 -25-91,26-26 -23-23,22-95 -2-2,1-92 -79-94,9-79 -6-96,34-96 -58-75,57-67 -11-14,14-15 -20-93,19-21 -7-85,7-85 -19-56,20-55 -87-89,6-87 -90-90,2-91 -23-50,22-49 -78-92,22-77 -75-77,74-76 -81-90,81-94 -26-81,81-81 -12-58,41-90 -14-84,13-84 -38-89,39-90 -66-73,65-73 -8-75,8-63 -6-67,3-4 -2-69,3-68 -15-61,15-69 -57-75,57-76 -9-98,98-99 -6-6,20-67 -47-91,46-90 -26-96,26-97 -25-56,24-56 -28-53,27-53 -26-55,25-55 -25-68,26-68 -6-11,11-37 -24-27,25-25 -44-56,8-57 -29-30,29-98 -28-33,27-67 -7-17,7-11 -4-5,25-77 -33-35,34-75 -1-72,73-73 -10-92,92-93 -2-22,83-94 -4-97,96-99 -38-50,18-51 -39-42,41-41 -55-57,55-58 -19-89,36-88 -47-67,48-68 -83-90,83-85 -3-80,46-81 -22-92,48-61 -19-93,33-94 -2-3,1-72 -98-99,30-97 -35-54,54-54 -4-97,5-98 -7-90,8-91 -31-61,4-29 -14-18,15-25 -26-27,26-63 -26-26,9-26 -25-60,60-60 -66-97,63-96 -70-91,6-71 -21-88,22-22 -18-92,14-18 -11-87,4-7 -57-88,58-88 -37-81,3-44 -67-89,55-98 -25-91,24-90 -68-82,67-67 -70-72,43-71 -4-74,74-75 -18-83,9-19 -16-80,81-81 -3-75,2-74 -3-71,11-72 -38-55,7-38 -19-65,20-49 -17-98,16-18 -45-95,24-94 -11-16,15-89 -28-68,29-43 -26-26,25-48 -4-98,3-30 -9-95,95-96 -31-54,31-58 -31-43,30-30 -8-10,10-89 -2-15,1-90 -26-76,46-77 -63-91,62-91 -4-62,19-63 -36-88,36-87 -19-98,19-97 -2-98,98-98 -11-84,11-85 -26-29,6-28 -22-61,26-72 -38-56,38-57 -9-73,1-72 -24-73,23-73 -80-80,9-79 -31-33,32-96 -3-94,4-93 -26-26,25-83 -1-99,1-97 -7-94,7-99 -10-52,3-51 -39-47,42-47 -44-96,43-44 -3-94,2-94 -30-44,29-43 -60-99,60-92 -18-69,69-69 -20-32,1-20 -2-81,13-82 -16-75,9-16 -69-79,80-91 -12-90,12-15 -55-67,56-93 -17-45,3-17 -3-3,2-78 -12-27,28-28 -42-90,59-90 -30-96,31-98 -47-68,63-64 -1-97,2-97 -28-81,22-81 -10-88,1-88 -15-84,15-81 -67-72,68-68 -1-72,1-72 -90-91,86-90 -89-94,79-93 -92-98,15-92 -2-99,1-99 -1-99,99-99 -16-99,17-99 -11-17,17-95 -38-87,39-87 -24-47,28-46 -38-94,38-99 -58-85,59-67 -20-22,21-21 -82-88,59-87 -90-99,89-98 -12-21,20-91 -64-99,61-64 -6-43,5-44 -23-23,24-76 -4-95,3-3 -23-71,24-71 -39-47,38-38 -73-91,92-92 -23-93,87-96 -46-76,27-77 -78-79,65-78 -27-46,26-46 -77-82,83-85 -2-54,54-55 -1-3,6-99 -42-42,22-43 -7-96,8-96 -28-33,28-87 -1-31,1-85 -2-93,3-94 -4-96,2-96 -30-30,29-99 -30-39,30-30 -4-18,34-88 -68-69,68-87 -30-95,30-76 -10-63,10-99 -2-98,98-98 -12-37,11-11 -9-80,9-81 -37-37,38-83 -95-99,7-95 -3-26,60-98 -3-99,4-28 -5-95,6-95 -41-86,42-85 -72-95,39-94 -1-51,1-62 -3-95,95-96 -73-83,74-79 -93-97,93-96 -33-93,32-93 -22-40,21-39 -11-14,18-79 -96-97,58-95 -16-40,40-89 -1-88,2-88 -5-51,5-29 -20-48,31-49 -3-95,95-96 -23-89,23-90 -55-80,56-79 -43-43,42-59 -55-84,54-83 -13-76,76-77 -22-94,9-35 -23-96,68-91 -1-85,60-84 -27-27,11-27 -33-35,33-64 -9-77,10-10 -69-81,90-91 -16-95,16-96 -21-94,21-22 -7-95,3-94 -47-79,1-57 -5-39,5-39 -12-82,13-82 -70-70,63-70 -64-64,26-63 -2-4,4-94 -80-80,79-97 -38-75,37-38 -54-91,92-92 -63-83,63-65 -8-56,8-55 -98-98,27-97 -26-91,28-92 -24-85,20-72 -13-18,30-84 -29-67,29-68 -87-95,8-87 -13-26,11-41 -16-99,17-99 -16-98,17-98 -18-54,18-83 -63-80,64-87 -63-63,58-63 -37-91,37-85 -6-12,4-7 -6-58,30-59 -18-52,53-96 -17-61,17-75 -49-72,71-97 -11-69,11-36 -22-84,22-83 -1-64,1-65 -27-39,38-38 -48-49,49-88 -1-1,3-74 -55-92,55-98 -51-51,8-52 -2-26,1-26 -23-64,64-64 -57-82,57-81 -91-91,26-91 -6-97,41-98 -1-94,1-95 -56-83,16-99 -8-8,10-88 -38-43,6-42 -22-84,2-89 -14-76,72-88 -31-93,30-93 -72-92,73-92 -57-58,21-57 -4-94,6-94 -11-85,86-86 -9-61,8-61 -69-91,69-69 -27-77,77-78 -10-52,10-51 -9-9,8-49 -66-67,65-78 -2-90,2-98 -42-42,41-79 -3-86,3-42 -15-93,25-73 -26-94,27-95 -16-99,15-99 -1-1,3-65 -97-98,4-96 -25-87,26-97 -3-20,20-96 -32-81,32-80 -22-85,22-95 -4-96,97-98 -97-99,62-75 -87-99,46-87 -98-99,44-76 -26-93,26-33 -56-87,34-63 -1-91,95-98 -12-97,11-80 -19-36,19-91 -19-25,25-98 -99-99,7-92 -37-46,38-43 -73-75,73-78 -18-97,97-97 -4-98,4-94 -88-88,25-88 -95-95,4-95 -3-70,9-71 -20-54,19-21 -34-40,24-39 -3-3,2-95 -5-37,4-37 -5-81,5-80 -2-95,9-95 -12-87,13-13 -2-3,2-96 -19-63,19-94 -64-84,35-35 -8-96,5-95 -37-69,38-52 -91-98,12-92 -66-87,66-83 -36-58,20-57 -8-82,82-83 -11-71,13-70 -40-43,39-43 -1-73,1-1 -12-91,12-92 -73-97,41-57 -6-83,7-7 -20-36,19-41 -15-91,14-90 -18-51,13-50 -12-97,97-97 -1-89,89-89 -13-34,12-34 -46-52,46-79 -34-36,34-35 -22-76,76-76 -3-93,4-76 -34-35,22-34 -7-20,20-20 -16-47,2-27 -59-60,2-59 -96-99,37-94 -4-92,4-94 -12-30,8-29 -22-32,22-22 -1-99,2-98 -61-70,53-70 -45-96,46-96 -84-99,2-85 -1-2,1-99 -19-99,20-94 -77-86,86-88 -25-83,3-82 -6-70,5-70 -38-85,85-86 -55-83,55-84 -87-98,86-97 -29-31,29-74 -5-42,5-41 -21-99,21-77 -47-71,46-51 -33-51,50-50 -52-60,5-40 -28-94,29-29 -6-23,11-14 -31-33,32-48 -74-75,44-74 -84-96,84-96 -38-38,37-45 -53-90,92-94 -12-32,2-8 -39-70,38-70 -93-96,17-93 -43-60,33-37 -4-22,3-95 -1-89,2-90 -27-76,26-77 -34-71,57-71 -49-62,20-62 -48-97,2-95 -11-72,2-5 -72-72,72-92 -22-65,64-78 -24-96,24-25 -38-93,32-94 -70-71,59-70 -38-76,38-76 -31-50,30-50 -22-97,21-69 -22-79,24-80 -69-88,88-88 -47-48,46-87 -27-29,28-42 -24-24,25-71 -11-94,20-95 -1-10,29-85 -32-52,32-86 -15-72,73-93 -15-28,15-47 -14-64,15-64 -88-88,25-89 -80-80,15-80 -3-58,58-59 -19-96,95-99 -39-74,40-87 -64-71,71-72 -49-80,36-80 -61-79,49-78 diff --git a/src/AdventOfCode/Year2022/Day04.hs b/src/AdventOfCode/Year2022/Day04.hs index 15321e0..a103b4f 100644 --- a/src/AdventOfCode/Year2022/Day04.hs +++ b/src/AdventOfCode/Year2022/Day04.hs @@ -1,29 +1,32 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2022.Day04 where -import AdventOfCode.Input (parseInput, parseString) -import AdventOfCode.TH (defaultMain, inputFilePath) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) import Data.Ix (inRange) -import Data.Tuple (swap) +import Relude import Text.Trifecta (Parser, char, comma, decimal, newline, sepEndBy) main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -partOne :: [((Integer, Integer), (Integer, Integer))] -> Int -partOne = day03 fullyContains +partOne :: SimplePuzzle [((Integer, Integer), (Integer, Integer))] Int +partOne = asks (solveWith fullyContains) where fullyContains (ab, (c, d)) = inRange ab c && inRange ab d -partTwo :: [((Integer, Integer), (Integer, Integer))] -> Int -partTwo = day03 overlaps +partTwo :: SimplePuzzle [((Integer, Integer), (Integer, Integer))] Int +partTwo = asks (solveWith overlaps) where overlaps (ab, (c, d)) = inRange ab c || inRange ab d -day03 :: ((a, a) -> Bool) -> [(a, a)] -> Int -day03 f = length . filter (liftA2 (||) f (f . swap)) +solveWith :: ((a, a) -> Bool) -> [(a, a)] -> Int +solveWith f = length . filter (liftA2 (||) f (f . swap)) getInput :: IO [((Integer, Integer), (Integer, Integer))] -getInput = parseInput assignmentPairs $(inputFilePath) +getInput = parseInputAoC 2022 4 assignmentPairs assignmentPairs :: Parser [((Integer, Integer), (Integer, Integer))] assignmentPairs = assignmentPair `sepEndBy` newline @@ -31,13 +34,14 @@ assignmentPairs = assignmentPair `sepEndBy` newline assignmentPair = (,) <$> (assignment <* comma) <*> assignment assignment = (,) <$> (decimal <* char '-') <*> decimal -example :: IO [((Integer, Integer), (Integer, Integer))] +getExample :: IO [((Integer, Integer), (Integer, Integer))] +getExample = parseString assignmentPairs example + +example :: String example = - parseString assignmentPairs . unlines $ - [ "2-4,6-8", - "2-3,4-5", - "5-7,7-9", - "2-8,3-7", - "6-6,4-6", - "2-6,4-8" - ] + "2-4,6-8\n\ + \2-3,4-5\n\ + \5-7,7-9\n\ + \2-8,3-7\n\ + \6-6,4-6\n\ + \2-6,4-8\n" From 6d80dd7a31b29d9d3628ec21a24d01f141c18f9c Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 13 Nov 2025 23:01:04 -0600 Subject: [PATCH 22/91] refactor(2022.05-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2022/day05.txt | 511 ----------------------------- src/AdventOfCode/Year2022/Day05.hs | 57 ++-- 3 files changed, 29 insertions(+), 541 deletions(-) delete mode 100644 input/2022/day05.txt diff --git a/VERSION b/VERSION index f690dd1..68f3135 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.44 \ No newline at end of file +2024.7.2.45 \ No newline at end of file diff --git a/input/2022/day05.txt b/input/2022/day05.txt deleted file mode 100644 index 19c1e04..0000000 --- a/input/2022/day05.txt +++ /dev/null @@ -1,511 +0,0 @@ - [C] [L] [T] - [V] [R] [M] [T] [B] - [F] [G] [H] [Q] [Q] [H] - [W] [L] [P] [V] [M] [V] [F] - [P] [C] [W] [S] [Z] [B] [S] [P] -[G] [R] [M] [B] [F] [J] [S] [Z] [D] -[J] [L] [P] [F] [C] [H] [F] [J] [C] -[Z] [Q] [F] [L] [G] [W] [H] [F] [M] - 1 2 3 4 5 6 7 8 9 - -move 1 from 5 to 6 -move 5 from 6 to 7 -move 10 from 7 to 3 -move 4 from 8 to 4 -move 2 from 5 to 4 -move 4 from 3 to 6 -move 6 from 2 to 4 -move 8 from 6 to 9 -move 5 from 9 to 2 -move 7 from 2 to 7 -move 2 from 1 to 4 -move 3 from 3 to 8 -move 1 from 5 to 9 -move 1 from 3 to 8 -move 1 from 1 to 2 -move 11 from 4 to 6 -move 2 from 5 to 6 -move 10 from 9 to 1 -move 4 from 8 to 3 -move 7 from 7 to 1 -move 9 from 1 to 2 -move 1 from 6 to 5 -move 1 from 5 to 9 -move 5 from 3 to 8 -move 2 from 9 to 1 -move 5 from 3 to 9 -move 3 from 6 to 8 -move 5 from 9 to 6 -move 6 from 6 to 3 -move 3 from 3 to 2 -move 1 from 9 to 8 -move 13 from 2 to 3 -move 3 from 8 to 1 -move 11 from 1 to 4 -move 3 from 4 to 1 -move 2 from 6 to 5 -move 4 from 6 to 8 -move 17 from 3 to 9 -move 1 from 1 to 8 -move 1 from 6 to 5 -move 1 from 3 to 7 -move 1 from 7 to 4 -move 3 from 4 to 1 -move 1 from 3 to 8 -move 4 from 8 to 1 -move 3 from 5 to 9 -move 1 from 6 to 4 -move 4 from 4 to 8 -move 2 from 8 to 4 -move 2 from 1 to 6 -move 4 from 8 to 6 -move 1 from 8 to 3 -move 6 from 6 to 3 -move 6 from 3 to 9 -move 6 from 1 to 4 -move 5 from 8 to 4 -move 1 from 3 to 6 -move 3 from 1 to 7 -move 1 from 6 to 7 -move 4 from 4 to 5 -move 24 from 9 to 5 -move 2 from 9 to 1 -move 27 from 5 to 7 -move 13 from 7 to 2 -move 1 from 5 to 9 -move 7 from 2 to 7 -move 1 from 9 to 8 -move 5 from 2 to 8 -move 1 from 2 to 5 -move 1 from 5 to 7 -move 21 from 4 to 1 -move 1 from 4 to 6 -move 1 from 6 to 5 -move 22 from 7 to 5 -move 2 from 7 to 8 -move 7 from 5 to 4 -move 1 from 4 to 5 -move 2 from 7 to 9 -move 5 from 5 to 2 -move 5 from 4 to 2 -move 3 from 5 to 1 -move 7 from 8 to 7 -move 1 from 4 to 1 -move 23 from 1 to 8 -move 2 from 9 to 4 -move 11 from 8 to 3 -move 3 from 1 to 3 -move 1 from 4 to 2 -move 12 from 3 to 2 -move 7 from 7 to 3 -move 3 from 2 to 1 -move 1 from 4 to 9 -move 1 from 1 to 3 -move 9 from 8 to 6 -move 2 from 5 to 4 -move 3 from 1 to 7 -move 3 from 2 to 4 -move 7 from 2 to 3 -move 9 from 3 to 4 -move 7 from 5 to 2 -move 2 from 7 to 2 -move 1 from 7 to 2 -move 13 from 4 to 6 -move 1 from 9 to 8 -move 2 from 8 to 2 -move 12 from 2 to 1 -move 3 from 3 to 1 -move 1 from 8 to 1 -move 5 from 3 to 7 -move 3 from 2 to 8 -move 7 from 2 to 5 -move 3 from 8 to 3 -move 1 from 4 to 8 -move 22 from 6 to 4 -move 1 from 3 to 6 -move 3 from 5 to 8 -move 4 from 5 to 8 -move 1 from 3 to 9 -move 8 from 4 to 2 -move 8 from 8 to 3 -move 1 from 6 to 3 -move 4 from 2 to 6 -move 1 from 9 to 4 -move 5 from 3 to 9 -move 2 from 8 to 1 -move 3 from 2 to 1 -move 10 from 4 to 8 -move 4 from 7 to 6 -move 10 from 1 to 3 -move 9 from 8 to 2 -move 1 from 7 to 1 -move 15 from 3 to 1 -move 1 from 8 to 9 -move 4 from 4 to 1 -move 17 from 1 to 3 -move 3 from 2 to 3 -move 3 from 6 to 8 -move 5 from 9 to 7 -move 11 from 1 to 8 -move 4 from 7 to 8 -move 6 from 2 to 5 -move 2 from 1 to 4 -move 4 from 6 to 8 -move 16 from 8 to 6 -move 2 from 6 to 1 -move 1 from 9 to 5 -move 1 from 7 to 5 -move 2 from 5 to 6 -move 5 from 6 to 3 -move 2 from 8 to 5 -move 1 from 2 to 1 -move 10 from 6 to 3 -move 6 from 5 to 9 -move 2 from 1 to 2 -move 2 from 4 to 2 -move 1 from 2 to 4 -move 5 from 9 to 2 -move 1 from 4 to 3 -move 1 from 9 to 7 -move 1 from 6 to 1 -move 1 from 1 to 7 -move 2 from 7 to 5 -move 7 from 2 to 5 -move 6 from 5 to 1 -move 1 from 2 to 3 -move 1 from 4 to 1 -move 2 from 8 to 9 -move 8 from 1 to 3 -move 2 from 5 to 3 -move 29 from 3 to 9 -move 5 from 3 to 8 -move 6 from 8 to 5 -move 1 from 6 to 5 -move 6 from 3 to 2 -move 2 from 2 to 4 -move 1 from 1 to 7 -move 18 from 9 to 6 -move 2 from 2 to 9 -move 2 from 2 to 8 -move 13 from 6 to 8 -move 1 from 7 to 4 -move 3 from 5 to 6 -move 1 from 5 to 7 -move 1 from 7 to 4 -move 14 from 9 to 3 -move 3 from 4 to 5 -move 1 from 9 to 7 -move 14 from 3 to 2 -move 1 from 7 to 3 -move 4 from 2 to 5 -move 16 from 8 to 6 -move 11 from 6 to 9 -move 13 from 6 to 4 -move 5 from 5 to 2 -move 12 from 2 to 4 -move 19 from 4 to 3 -move 7 from 4 to 5 -move 14 from 5 to 2 -move 2 from 3 to 6 -move 3 from 9 to 5 -move 2 from 6 to 2 -move 1 from 5 to 2 -move 3 from 5 to 4 -move 3 from 4 to 1 -move 7 from 9 to 6 -move 4 from 6 to 1 -move 1 from 1 to 8 -move 3 from 6 to 9 -move 1 from 8 to 7 -move 1 from 9 to 6 -move 4 from 1 to 2 -move 1 from 7 to 2 -move 2 from 9 to 8 -move 10 from 2 to 9 -move 2 from 2 to 9 -move 11 from 3 to 7 -move 1 from 8 to 9 -move 2 from 3 to 7 -move 1 from 1 to 7 -move 10 from 2 to 4 -move 3 from 4 to 1 -move 4 from 1 to 8 -move 1 from 6 to 5 -move 6 from 7 to 9 -move 3 from 9 to 1 -move 1 from 5 to 1 -move 4 from 4 to 2 -move 5 from 2 to 1 -move 1 from 2 to 7 -move 2 from 7 to 6 -move 1 from 2 to 1 -move 2 from 9 to 1 -move 3 from 4 to 7 -move 1 from 3 to 7 -move 2 from 8 to 3 -move 2 from 6 to 5 -move 2 from 5 to 8 -move 10 from 7 to 2 -move 6 from 9 to 1 -move 1 from 7 to 3 -move 2 from 8 to 9 -move 7 from 3 to 7 -move 7 from 3 to 9 -move 1 from 8 to 9 -move 6 from 2 to 8 -move 13 from 9 to 1 -move 6 from 9 to 8 -move 2 from 2 to 7 -move 3 from 7 to 1 -move 1 from 8 to 1 -move 1 from 1 to 6 -move 16 from 1 to 4 -move 2 from 7 to 5 -move 12 from 4 to 9 -move 4 from 8 to 6 -move 2 from 5 to 1 -move 8 from 8 to 4 -move 2 from 4 to 5 -move 1 from 8 to 6 -move 4 from 6 to 8 -move 19 from 1 to 9 -move 3 from 8 to 5 -move 1 from 6 to 9 -move 2 from 2 to 1 -move 10 from 4 to 9 -move 1 from 1 to 2 -move 2 from 1 to 5 -move 4 from 7 to 9 -move 1 from 8 to 2 -move 1 from 2 to 6 -move 7 from 5 to 4 -move 11 from 9 to 8 -move 1 from 4 to 3 -move 10 from 8 to 1 -move 1 from 2 to 3 -move 29 from 9 to 3 -move 2 from 6 to 5 -move 1 from 5 to 3 -move 5 from 9 to 3 -move 1 from 8 to 9 -move 1 from 9 to 3 -move 6 from 4 to 6 -move 1 from 5 to 1 -move 1 from 6 to 3 -move 2 from 1 to 5 -move 1 from 9 to 5 -move 37 from 3 to 2 -move 3 from 6 to 2 -move 1 from 6 to 2 -move 1 from 6 to 4 -move 3 from 1 to 3 -move 2 from 1 to 6 -move 35 from 2 to 1 -move 1 from 6 to 8 -move 5 from 1 to 8 -move 7 from 1 to 6 -move 5 from 3 to 7 -move 1 from 8 to 7 -move 3 from 7 to 5 -move 4 from 2 to 9 -move 1 from 2 to 1 -move 1 from 4 to 3 -move 3 from 7 to 1 -move 1 from 3 to 6 -move 1 from 1 to 9 -move 5 from 9 to 2 -move 18 from 1 to 3 -move 6 from 1 to 8 -move 6 from 3 to 7 -move 4 from 8 to 6 -move 4 from 6 to 7 -move 9 from 7 to 8 -move 3 from 2 to 7 -move 4 from 6 to 1 -move 3 from 5 to 3 -move 3 from 2 to 5 -move 3 from 6 to 1 -move 4 from 7 to 4 -move 6 from 5 to 9 -move 3 from 1 to 9 -move 1 from 6 to 1 -move 15 from 8 to 2 -move 1 from 8 to 5 -move 3 from 4 to 8 -move 1 from 5 to 1 -move 1 from 6 to 5 -move 11 from 3 to 9 -move 12 from 2 to 3 -move 3 from 8 to 1 -move 15 from 1 to 2 -move 8 from 9 to 4 -move 8 from 4 to 9 -move 4 from 2 to 5 -move 1 from 4 to 6 -move 1 from 2 to 8 -move 1 from 6 to 7 -move 4 from 3 to 1 -move 1 from 8 to 5 -move 5 from 3 to 9 -move 14 from 9 to 2 -move 1 from 7 to 4 -move 4 from 1 to 3 -move 1 from 4 to 7 -move 8 from 3 to 7 -move 8 from 7 to 5 -move 1 from 7 to 9 -move 3 from 3 to 2 -move 7 from 9 to 8 -move 1 from 9 to 5 -move 2 from 8 to 5 -move 7 from 5 to 4 -move 4 from 9 to 2 -move 6 from 4 to 3 -move 18 from 2 to 5 -move 1 from 4 to 7 -move 15 from 5 to 4 -move 1 from 4 to 6 -move 2 from 2 to 7 -move 3 from 8 to 5 -move 1 from 7 to 3 -move 8 from 2 to 6 -move 4 from 2 to 3 -move 1 from 7 to 5 -move 3 from 4 to 6 -move 5 from 6 to 9 -move 8 from 5 to 6 -move 2 from 4 to 3 -move 7 from 4 to 2 -move 2 from 8 to 5 -move 7 from 5 to 6 -move 3 from 5 to 8 -move 1 from 8 to 9 -move 13 from 3 to 8 -move 2 from 2 to 7 -move 9 from 8 to 9 -move 6 from 8 to 5 -move 5 from 5 to 2 -move 2 from 7 to 8 -move 9 from 2 to 5 -move 1 from 7 to 5 -move 1 from 5 to 7 -move 21 from 6 to 2 -move 1 from 7 to 8 -move 3 from 8 to 9 -move 1 from 4 to 2 -move 23 from 2 to 7 -move 8 from 9 to 8 -move 20 from 7 to 4 -move 3 from 7 to 2 -move 1 from 2 to 7 -move 1 from 6 to 7 -move 3 from 5 to 4 -move 8 from 5 to 9 -move 2 from 7 to 1 -move 1 from 8 to 7 -move 4 from 2 to 4 -move 2 from 8 to 7 -move 2 from 8 to 2 -move 1 from 7 to 6 -move 3 from 9 to 7 -move 2 from 2 to 7 -move 5 from 7 to 1 -move 8 from 9 to 6 -move 15 from 4 to 3 -move 4 from 4 to 7 -move 6 from 1 to 4 -move 11 from 3 to 4 -move 8 from 6 to 1 -move 24 from 4 to 7 -move 6 from 1 to 8 -move 27 from 7 to 3 -move 2 from 7 to 8 -move 5 from 8 to 3 -move 4 from 8 to 4 -move 1 from 8 to 6 -move 1 from 6 to 9 -move 1 from 6 to 5 -move 2 from 4 to 2 -move 1 from 8 to 1 -move 1 from 5 to 2 -move 4 from 1 to 6 -move 1 from 7 to 5 -move 1 from 5 to 8 -move 1 from 8 to 7 -move 1 from 7 to 8 -move 1 from 8 to 1 -move 1 from 2 to 3 -move 2 from 4 to 8 -move 7 from 9 to 6 -move 2 from 8 to 1 -move 3 from 3 to 8 -move 3 from 1 to 8 -move 2 from 2 to 3 -move 1 from 4 to 1 -move 1 from 1 to 8 -move 5 from 8 to 3 -move 8 from 6 to 2 -move 1 from 9 to 4 -move 2 from 4 to 8 -move 2 from 8 to 3 -move 2 from 6 to 2 -move 33 from 3 to 2 -move 2 from 8 to 7 -move 1 from 6 to 1 -move 1 from 1 to 7 -move 2 from 3 to 8 -move 2 from 8 to 4 -move 1 from 4 to 8 -move 2 from 7 to 2 -move 2 from 3 to 7 -move 12 from 2 to 1 -move 1 from 8 to 4 -move 1 from 4 to 8 -move 1 from 4 to 3 -move 1 from 8 to 2 -move 3 from 7 to 2 -move 37 from 2 to 7 -move 1 from 1 to 7 -move 12 from 7 to 1 -move 13 from 1 to 7 -move 1 from 3 to 4 -move 35 from 7 to 6 -move 1 from 4 to 5 -move 3 from 7 to 4 -move 1 from 5 to 7 -move 2 from 3 to 4 -move 23 from 6 to 9 -move 3 from 1 to 5 -move 3 from 3 to 7 -move 1 from 3 to 6 -move 2 from 5 to 3 -move 23 from 9 to 8 -move 2 from 4 to 9 -move 16 from 8 to 2 -move 2 from 7 to 3 -move 1 from 5 to 8 -move 3 from 7 to 6 -move 1 from 9 to 8 -move 3 from 8 to 1 -move 1 from 9 to 1 -move 11 from 6 to 5 -move 2 from 4 to 1 -move 4 from 8 to 6 -move 16 from 2 to 3 -move 9 from 1 to 9 -move 1 from 8 to 4 -move 3 from 9 to 3 -move 1 from 1 to 4 -move 1 from 9 to 4 -move 7 from 5 to 2 -move 6 from 2 to 5 -move 1 from 8 to 6 -move 22 from 3 to 7 -move 8 from 5 to 8 -move 4 from 4 to 9 -move 2 from 1 to 8 -move 16 from 7 to 2 -move 1 from 3 to 5 -move 14 from 2 to 7 -move 2 from 2 to 4 -move 6 from 9 to 3 diff --git a/src/AdventOfCode/Year2022/Day05.hs b/src/AdventOfCode/Year2022/Day05.hs index 521104b..3f1d222 100644 --- a/src/AdventOfCode/Year2022/Day05.hs +++ b/src/AdventOfCode/Year2022/Day05.hs @@ -1,13 +1,13 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2022.Day05 where -import AdventOfCode.Input (parseInput, parseString) -import AdventOfCode.TH (defaultMain, inputFilePath) -import Control.Applicative ((<|>)) -import Control.Monad (void) -import Data.IntMap (IntMap, (!)) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) +import Data.IntMap ((!)) import Data.IntMap qualified as IM -import Data.List (transpose) -import Data.Maybe (catMaybes, listToMaybe, mapMaybe) +import Relude import Text.Trifecta ( Parser, char, @@ -15,7 +15,6 @@ import Text.Trifecta decimal, newline, sepBy, - some, surroundedBy, symbol, token, @@ -24,19 +23,19 @@ import Text.Trifecta ) main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -partOne :: (IntMap [Char], [(Int, (Int, Int))]) -> String -partOne = day05 reverse +partOne :: SimplePuzzle (IntMap [Char], [(Int, (Int, Int))]) String +partOne = asks (solveWith reverse) -partTwo :: (IntMap [Char], [(Int, (Int, Int))]) -> String -partTwo = day05 id +partTwo :: SimplePuzzle (IntMap [Char], [(Int, (Int, Int))]) String +partTwo = asks (solveWith id) -day05 :: ([Char] -> [Char]) -> (IntMap [Char], [(Int, (Int, Int))]) -> String -day05 f = mapMaybe listToMaybe . IM.elems . uncurry (rearrange f) +solveWith :: ([Char] -> [Char]) -> (IntMap [Char], [(Int, (Int, Int))]) -> String +solveWith f = mapMaybe listToMaybe . IM.elems . uncurry (rearrange f) getInput :: IO (IntMap [Char], [(Int, (Int, Int))]) -getInput = parseInput drawing $(inputFilePath) +getInput = parseInputAoC 2022 5 drawing drawing :: Parser (IntMap [Char], [(Int, (Int, Int))]) drawing = (,) <$> (stacks <* labels <* newline) <*> some rearrangement @@ -71,17 +70,17 @@ rearrange f stacks ((howMany, (from, to)) : rearrangements) = where (xs, ys) = splitAt howMany (stacks ! from) -example :: IO (IntMap [Char], [(Int, (Int, Int))]) +getExample :: IO (IntMap [Char], [(Int, (Int, Int))]) +getExample = parseString drawing example + +example :: String example = - parseString drawing $ - unlines - [ " [D] ", - "[N] [C] ", - "[Z] [M] [P]", - " 1 2 3 ", - "", - "move 1 from 2 to 1", - "move 3 from 1 to 3", - "move 2 from 2 to 1", - "move 1 from 1 to 2" - ] + " [D] \n\ + \[N] [C] \n\ + \[Z] [M] [P]\n\ + \ 1 2 3 \n\ + \\n\ + \move 1 from 2 to 1\n\ + \move 3 from 1 to 3\n\ + \move 2 from 2 to 1\n\ + \move 1 from 1 to 2\n" From 4fa49be0a275d340d54570eb334f488c89d80d50 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 13 Nov 2025 23:10:45 -0600 Subject: [PATCH 23/91] refactor(2022.06-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2022/day06.txt | 1 - src/AdventOfCode/Util.hs | 5 +++++ src/AdventOfCode/Year2017/Day07.hs | 6 +----- src/AdventOfCode/Year2022/Day06.hs | 27 ++++++++++++++++----------- 5 files changed, 23 insertions(+), 18 deletions(-) delete mode 100644 input/2022/day06.txt diff --git a/VERSION b/VERSION index 68f3135..219c37a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.45 \ No newline at end of file +2024.7.2.46 \ No newline at end of file diff --git a/input/2022/day06.txt b/input/2022/day06.txt deleted file mode 100644 index 1e47e41..0000000 --- a/input/2022/day06.txt +++ /dev/null @@ -1 +0,0 @@ -pwjwljjjvqjqjzqjqvvpgvpggmdgdrrzmzfzmzffzbbjnbjnjddsdpsdsgsgvsgvgmmzvvpspvspsdsbsbffhwhlwwzllftfhhrfrsrrnnngqgtglgfgtffnssrspsqppdvdtdwwpfpzffnpnddvsswjswjjhdjdrjrwwfpwfpfjppzwzvzpzrznzgzcgzgpgfpffwggtbbhsslzztpplltdtqtctrrszrzszpsprptrtgrtrzrvzrvzrrsfsbswsvvbdbjjgljjwqwgqwwtmwwnbbzdbdwwsnntztstbssnjssjmmldmmrrnfrfgfbbszzzlrrwzwtwwbrwrlwrwzwmwqmwwtqwwtvvdqdtqqfnfjnjsnslltcllvmmdmttvsszrsrwssdmdttdmdrmrsrvrllrhlltmlmlzmlzzhvhbbflfsslclpcczmmcjmjccpgprrgnrrzqqmgqggfvgffbsfsbfbttrgtrtptgtjtnnfbfmmrrcmcwwbbmwmvvvtppslsvvlsvswwztwztzqqpggdccmlldlplggrgddlrddvwvsswllsffbllsbbslshslswsllnqlqrqqpmqmtmqtmqtmmbwmbbzdbzbttvptvpvgpvggblbsspgppvmvsswfssfdfrdffpbfpprmrssmbbmggszslzlslblsldsldssjjsrjjjdfdjdtdmdnnncddpfddrjdjvjfvjffftmfmqqqqqfjjhssbzbbfjjmmzgzllphlplhlplfpfnpnsppjjqsshpssjdjzzwvvjfvfnfttmtbbgtgbbdpbbjppzcpzzvcvpvvdcvvcfvvfsvsccmhhrwrjjsrjrvrfvfwvvtftzztlztlthlhrhnnlpnllnmnfmffzpffhlhbhqbhqhfhwwlglnndgdwdswwgtwgtgsttpbprpqpnnbsnbsnszzrszsqzqlqggvhghrrvprvvvqnnmmrwrbrrmttwrrlmrrrddmsddbhdhdjhdhrhffppphghvvtztptjjlppcqcscjscstsmsbspsgpgqgmmndmdvvpnpnrrjtrthhtzzjlzzrwzrrfsfflrrmffhlhglhhhhvwwttlcttbqqzzbzzzbhbsscqqjggqpggqffbttrfrjjjqmmpttlvvqlvqqqtgtrtcrcbcnbbhfbfhbhqbhqbqvbvqvrqvvgttqwqpwqwnnpgngpphjppztptnnrssjqqrplzrvmwmbrbgbnggvzpmphqsrjrdhtslpmmwrhgcndwtbsbrfmsplzqswsnmrwdwwhzmpbqcmjfsmnwqnjmvdczhgmtfjwnjfdllfzdwpwgclpbdqtqnqqqvpthltznfzshhgrwwqclpplmdwtpjszrdwwzfbljcjmqmhptfhvcbvgfjfftbsfglwqldphdzzgcmvtsbhlsdncfjcsqrqrtdhttcwzlbqhvgppbrjfzdzwzprwpfflmdspcmqcbdhsvwjswwbzwnqrshbqfnmtdzrsrjgqngntllcgwjnmjqvtgwvttfqrcjlhbpcrszlngfmdgzprcdttgbjpcdzbhtdghpltcbvcddnslhqthfvzjtspqlzhdprhgtrlqqgtsqwwjqthgdwfgdfzhrnrwlrpqmgqltgldpjqgjzvngrphclbfftnwfnfvsvhftthptqfnvlftdpdhcrjdhfwtpwwvsblgntdwcpnsprhnpjtjsprdrdjwlhnmnzmmjmcdfsctzgmlqwwrwztjndqgpqrvdgplcnntqhfjlzjszpdwnvlwdzzgpzvplglgrmsjgjpmsrdsgzlfblgbgszgdtgsggqvhzmnfcnvlnzrfpqphctlcqccqzslmlsbbztnpncqpgscgdmmsgfwqrzpmbqrmfqsnnggswhmgmtmgdmhwthbgbdsrtnsrvdfdhlhhczgdsdqnpsgjzpbnsmgrvsfdjlhgjfjjwqnrnrbzdzcjlstclpqfnrflgnzbdbzvbjcbgqrrrlfcpgptcghhqqfsvsgljvjhdgdgcjtnrqsctmwhzbmbrfrsvndhfrtwlfgvqcbjsvttrctfshrggdvgbhthnwbwqglrvfbsqnbhdwgzhbccjnlhtcbjlpgrvttthnwvvspnzvqhjvmtwshcstdjhfqhqcgvwqwwwwrfdmnjhldsrhgmtjddsghdmdrpczbcjflmbhszctmvdttfrrqqpwslhvqbjlsrjdjrcqjrhwgjlsqmvdpvvvlbzwtthptpsggddcbqbhrvrpdtncvgndclhpngzgfqdqgwwbrjltjtqbpbtbzjmfmnjnlqmtzvdqdwqhbgptplrgdsfpjzfrpdcdsznwffpnzsmpqjfbcpddqjgfqhqbwsfmzgstfdnzhphhvgbzvjrlmqmrznpctftcmbtdpbfbfpfpjtjhbcrrssnlvtrtnzvwtjwplclpqndpfstjmghmzsllhntprtjwlppjnjgjzlvlcbcwjvrjqjhfnnpmwlpngwtvvbcllmjzqfrwvtvsrvbcpfwcdfwmdwvztwtbrgvlvmfjmpzdzmfbcmrsqfwqjfjfrgmnblnzfzcvgwllvmqfmdlqqgvvjrptlrjcwphvchwhmtwhnlnjprqhlrhmdfptvpshjbzrhptvnqfvjfjcnglnbfhbwghqqjbqzdthjwqzznwfsmqmbsqnwrdrrwjgzjdmgtsqswlqcpshdmcfjttpszqmsjhgfsrvgchgwzbqgbdqhmbndmnmwjsnjjvmtpprbtlwzpvfdnbtjnzzvlwndgbhgwbpllvfghwvwjmlpnzfjzjwwmtvbbfndppbqwhjlwgtswmgffddbhnwqljvgcvfnqmzgvfmjwsbcrpgtcpchlblccgpgpmddsjsfwbnvnsfttnsqjshchdztvsbjwsfmszfwpwsmgzvvcfddtczvvmnhgjffrsfqzfmphpfblmwgcbbrjqzdztzzzjhqmjzrgmwgrqdfqdbjsgwfndqgnmdvjlwdtjpjtpcqlhtcfvnmzjswldrbqjpmrlqwhvnqjshbqqvzwwsdjmspgbvrgvpjjnwsvnvnppvlnqbdllfczjjftpnlrjfvcwgwbdmldtcnczqzcptjjrgglnnbgmrdffgmnnwvjzwbgcncnhzmthswrdsrhchprrrrnhjfnzmsgfjltqzmttvhslnsgcjfgqwcsddfstcstspcpdbznvdrnqhwqsfgqtdbtwspfswfjbzgtqjpvzfhfdblszblmgrmmlwvnwwdsdjjvrsfjfjltcsfccplftvpltqshgnpnqlqcglrhvzldptspnbvjcchnnvzvbbqnnnbnggrhpcgqtgnjdqplswtblgtwqzmltjjhpdttgbcvhfrsdcgjzswvtbbhrpnzmrjhgznbdpqgqdhwcnmgflpdtbzdbvzvslbvvwdpcnwjtvjhgncnljfwlrvqgdrjhdcprsqjrmwwlcrrvsjtlmqmjtcbqwcbmgnvfshdgmmfffzvwjphjfspvdzjsqdlgqfdjwwshdcssqvvgdcvvtmwlfjdvtfllrvltmrsgpdtdqsfjpcvjnqszpnbqqlnpdvhtswbgwnpcqpgzqwlgsmlnlngcdmqhchcdgfmrhfwwrgrrdrhcsbbcrhghdjrcsltchqghvmbvbbpqzqbgwmqrgwchhbvdsqbqrfcbzwjrlqtnmghtjbtjdpngcjzswfmjfphjnftbhdgvwjsvqfbsfgqhfbcrgrsppsvbnpwlhsdrffcmmgzpjfsvllcrbtwrwddthfjvjndzfzbcmglhbzpzwwbtzdpdlwrnbzqjbqwpbdlwfddbtzjhqshmcghqfcrzrmrtmqwpqhvqzbfwhbssgjcmzqcpvnntbpfqwhbmtjdtbtrrdhsvzqjltdshtlvwwmlbdzlvjhmtppnbqcjnncpslcggsjbrmzvdgqzclwszgzfqthndnjfjrznlmmtjwwhnzvhnjncccpczrftvhtdhjbzvwvlgqhdnfqdqrhctfffpcnqzdrgqqzcczdjvpzqfgfcpjzqhbwshsqhvqzpsb diff --git a/src/AdventOfCode/Util.hs b/src/AdventOfCode/Util.hs index 253e22b..af05cb0 100644 --- a/src/AdventOfCode/Util.hs +++ b/src/AdventOfCode/Util.hs @@ -13,6 +13,7 @@ module AdventOfCode.Util hammingDistance, hammingSimilar, iterateMaybe, + maybeFail, scan, count, snoc, @@ -82,6 +83,10 @@ hammingSimilar n xs = maybe False (<= n) . hammingDistance xs iterateMaybe :: (a -> Maybe a) -> a -> [a] iterateMaybe f x = x : unfoldr (fmap (join (,)) . f) x +-- | Lift a 'Maybe' to 'MonadFail' with a given failure reason. +maybeFail :: (MonadFail m) => String -> Maybe a -> m a +maybeFail reason = maybe (fail reason) return + findFirstDup :: (Ord a) => [a] -> Maybe a findFirstDup = go Set.empty where diff --git a/src/AdventOfCode/Year2017/Day07.hs b/src/AdventOfCode/Year2017/Day07.hs index 4a99b43..0ac68cf 100644 --- a/src/AdventOfCode/Year2017/Day07.hs +++ b/src/AdventOfCode/Year2017/Day07.hs @@ -11,7 +11,7 @@ where import AdventOfCode.Input (parseInput, parseString) import AdventOfCode.TH (inputFilePath) -import AdventOfCode.Util (iterateMaybe) +import AdventOfCode.Util (iterateMaybe, maybeFail) import Control.Arrow ((&&&), (>>>)) import Control.Foldl qualified as Foldl import Control.Monad (MonadPlus (mzero), ap, liftM2, (>=>)) @@ -163,9 +163,5 @@ uniqueMaximumOn f = Foldl.fold $ Foldl.Fold step (Nothing, True) finish finish (Just x, True) = Just x finish _ = Nothing --- | Lift a 'Maybe' to 'MonadFail' with a given failure reason. -maybeFail :: (MonadFail m) => String -> Maybe a -> m a -maybeFail reason = maybe (fail reason) return - dropThd3 :: (a, b, c) -> (a, b) dropThd3 (x, y, _) = (x, y) diff --git a/src/AdventOfCode/Year2022/Day06.hs b/src/AdventOfCode/Year2022/Day06.hs index cb85eb9..a28f542 100644 --- a/src/AdventOfCode/Year2022/Day06.hs +++ b/src/AdventOfCode/Year2022/Day06.hs @@ -1,25 +1,30 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2022.Day06 where -import AdventOfCode.Input (rawInput) -import AdventOfCode.TH (defaultMainMaybe, inputFilePath) -import Data.List (findIndex, tails) +import AdventOfCode.Input (rawInputAoC) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Util (maybeFail) +import Data.List (findIndex) import Data.Set qualified as Set +import Relude main :: IO () -main = $(defaultMainMaybe) +main = $(evalPuzzle) -partOne :: [Char] -> Maybe Int -partOne = day06 4 +partOne :: SimplePuzzle String Int +partOne = ask >>= maybeFail "no start-of-packet marker detected" . day06 4 -partTwo :: [Char] -> Maybe Int -partTwo = day06 14 +partTwo :: SimplePuzzle String Int +partTwo = ask >>= maybeFail "no start-of-message marker detected" . day06 14 -day06 :: Int -> [Char] -> Maybe Int +day06 :: Int -> String -> Maybe Int day06 n = fmap (n +) . findIndex ((n ==) . Set.size . Set.fromList) . map (take n) . tails -getInput :: IO [Char] -getInput = rawInput $(inputFilePath) +getInput :: IO String +getInput = rawInputAoC 2022 6 From d5352bb07733f08931b34e60be8fea49b1a04e16 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 13 Nov 2025 23:20:25 -0600 Subject: [PATCH 24/91] refactor(2018.01-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2018/day01.txt | 953 ----------------------------- src/AdventOfCode/Year2018/Day01.hs | 26 +- 3 files changed, 16 insertions(+), 965 deletions(-) delete mode 100644 input/2018/day01.txt diff --git a/VERSION b/VERSION index 219c37a..1e0726f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.46 \ No newline at end of file +2024.7.2.47 \ No newline at end of file diff --git a/input/2018/day01.txt b/input/2018/day01.txt deleted file mode 100644 index 50db33c..0000000 --- a/input/2018/day01.txt +++ /dev/null @@ -1,953 +0,0 @@ -+13 --7 --17 -+12 --11 -+19 -+18 -+19 --8 -+11 -+7 --3 -+7 --1 --16 -+11 --2 --2 -+20 -+1 -+17 -+15 -+4 --1 -+7 -+3 -+17 -+13 --8 -+15 -+18 --12 -+3 --4 --14 -+6 --7 -+8 --9 -+12 -+7 -+2 --8 --19 --12 -+11 -+13 -+4 -+13 -+11 -+19 -+14 --12 --19 -+1 --10 -+20 --8 --15 -+2 -+7 --5 -+10 -+7 -+19 --5 -+11 --4 -+15 -+18 -+13 -+10 -+1 -+2 -+6 -+20 -+5 --10 --2 --2 -+12 --11 --13 --13 -+16 -+17 -+17 --18 --13 --17 -+19 --3 --11 --19 -+1 --13 --6 --5 --19 -+9 -+1 -+18 --7 --13 -+3 --14 --10 -+18 -+17 -+16 -+9 -+3 -+7 --12 -+6 -+7 --19 --5 --8 --1 --13 -+8 --3 --22 --17 --16 --11 -+18 --14 --15 --17 --18 -+9 --10 -+14 -+14 -+4 -+6 -+2 -+23 -+18 -+1 -+20 --4 -+12 -+1 -+17 --3 -+4 -+13 -+7 -+11 --12 --21 --18 -+3 --27 --21 -+13 -+13 --1 --16 -+6 -+15 --7 --11 -+43 -+12 -+2 -+3 -+15 -+8 -+14 -+15 --16 --5 -+7 -+18 -+17 -+11 -+3 -+17 --14 -+13 -+16 -+3 -+19 --5 --7 --12 -+9 --5 --5 -+4 -+19 -+9 --6 -+19 -+1 -+5 -+15 --10 -+5 -+14 --4 --16 --1 --12 --12 -+13 --8 -+1 --14 --8 --6 --16 -+6 -+13 -+8 --12 -+8 --3 --16 -+13 --10 --14 --8 --12 --9 -+4 --1 -+10 -+15 --3 --15 -+14 -+3 --22 --17 --2 -+11 --1 --3 --10 -+11 --12 -+3 -+5 -+17 -+7 -+3 --18 --22 --7 --17 -+19 -+15 -+19 -+17 --12 -+9 --1 -+11 -+11 --6 --2 -+1 -+27 --15 -+22 -+10 -+16 -+10 -+18 --1 --4 -+9 -+19 -+15 -+13 --16 --7 -+18 -+7 --19 --1 --3 --11 --1 --1 -+14 -+6 --10 -+16 -+19 -+4 --18 --22 -+16 -+18 -+13 --1 --20 -+16 -+10 -+13 --2 --5 --15 --2 --4 -+14 --16 --7 --5 --8 -+6 -+9 -+2 --14 --8 --4 -+18 -+9 --4 -+19 -+30 -+1 --7 -+11 -+8 -+5 --8 -+9 --7 -+16 -+17 -+5 -+9 --19 -+14 -+17 --8 -+13 -+3 --12 -+10 -+4 --7 --18 -+12 -+14 -+16 -+11 -+8 --1 --8 --17 --6 -+4 -+10 -+3 --10 -+5 --9 --24 --4 -+13 --1 -+3 --14 -+5 -+4 --12 --6 --6 -+16 --20 --34 --1 --12 -+19 --18 --8 --13 --4 -+10 -+16 --4 --2 -+1 -+7 -+17 --13 -+6 -+16 -+14 -+18 -+21 -+29 --1 --3 --34 --16 --15 --27 --5 --8 -+19 -+7 -+10 -+15 -+2 --7 -+11 --12 --21 --20 -+19 -+11 -+3 -+6 --52 --13 -+3 --43 --19 --6 --4 --20 --6 -+9 --5 -+3 -+17 --11 --17 --15 --16 --7 -+12 -+5 -+11 -+4 --14 --12 -+10 -+20 -+7 -+17 --19 --10 -+6 --18 --9 -+10 -+24 -+20 --2 -+1 -+7 --11 -+10 -+8 --4 --15 --11 --20 --1 --18 --13 -+2 --25 --21 -+10 -+12 --49 -+13 --4 --7 -+17 -+14 -+17 --85 -+8 --5 -+16 -+5 -+17 --59 --4 --17 --28 --47 -+27 --7 -+16 --66 -+7 --16 --1 --134 -+22 -+2 --31 -+8 -+11 --54 -+7 --5 -+21 --31 --4 --14 -+12 -+31 --14 --218 --82 --71530 -+7 -+11 -+4 --10 --18 -+5 --19 --4 --11 -+4 -+9 -+1 --13 -+7 -+17 -+16 --8 --6 -+5 -+14 -+2 -+2 --1 --9 --19 --19 --4 -+18 -+14 -+6 --8 -+3 --8 --1 --3 -+19 -+17 -+11 -+14 -+17 -+6 -+14 --4 -+15 --7 -+18 -+10 -+15 --10 -+1 -+5 --19 -+7 --16 --18 -+2 --16 -+18 -+8 --6 -+10 --1 -+9 -+5 --19 -+9 -+13 --6 --18 --12 --14 --7 --15 -+7 --20 --5 -+11 -+12 -+3 --20 --18 -+10 -+17 --3 -+1 --9 -+15 -+3 --6 --20 -+13 -+5 --12 --13 --25 --2 --13 -+1 --16 --17 -+12 -+18 --11 -+15 -+19 -+11 -+2 -+4 -+16 -+14 -+26 -+2 --6 --12 -+2 -+1 -+5 -+1 -+1 -+14 -+4 --13 --21 -+7 -+3 -+25 -+19 -+11 --6 --2 -+19 -+4 -+6 -+2 --18 -+11 -+22 -+16 --10 --3 -+18 -+8 -+14 -+15 -+10 -+8 --3 -+12 --8 --7 --3 --12 -+2 -+7 -+16 -+13 --12 -+15 --18 -+4 --16 --4 --13 -+10 -+4 -+20 --4 -+13 --17 --3 --12 --14 --7 -+9 --3 -+9 --1 -+3 --24 -+4 -+2 --10 -+19 -+24 --10 --11 --6 -+21 --23 --22 --5 -+10 --7 -+8 --21 -+7 --13 -+10 -+13 --18 --6 -+12 -+1 --4 --5 -+15 --25 --1 --2 -+6 --2 -+3 -+27 --22 --4 --62 -+8 -+12 --29 -+21 --19 --44 --13 -+12 --68 -+2 -+12 -+1 --17 --5 --16 --11 --14 -+5 --8 --8 -+12 --9 --1 --11 --14 -+6 -+13 --12 -+14 -+15 --18 -+10 --4 --4 -+18 -+7 -+17 -+4 --13 -+11 -+9 --2 --6 --13 -+2 -+15 --13 --19 --8 -+13 -+1 --2 -+10 --2 --19 --3 --14 --17 -+14 --18 -+19 --10 --15 --2 -+6 --1 -+16 --18 --5 --11 -+4 -+13 --7 --15 --11 --14 -+6 -+17 -+3 --7 --16 --2 --7 --7 --1 -+18 -+20 -+13 --10 --19 --10 -+12 -+7 --15 -+7 -+6 -+3 -+13 -+1 --4 -+11 --17 --9 --20 --12 --15 -+10 --1 --5 --12 --15 -+18 --16 -+19 --17 --10 -+18 -+2 -+14 --2 --21 --16 --4 --4 --3 -+2 --9 -+1 -+5 --19 -+10 -+6 -+8 --7 --12 --9 -+11 -+18 -+18 --5 --20 -+19 --7 -+10 --5 --7 --17 --5 --4 --3 --5 -+21 -+18 -+8 --9 --6 -+3 --8 --17 --15 -+19 --5 --8 --2 --1 -+20 --38 -+5 -+12 --34 --17 --16 -+18 --10 -+7 -+17 --18 -+7 --16 -+7 -+10 --33 -+6 --27 -+1 -+6 --4 --4 --5 --2 --9 --5 --1 -+18 --6 --19 --18 --14 --29 --64 --25 --16 --11 --3 --11 --11 --23 -+17 --4 --18 -+3 --4 --14 -+12 -+18 --5 -+73044 diff --git a/src/AdventOfCode/Year2018/Day01.hs b/src/AdventOfCode/Year2018/Day01.hs index 1e2dd29..2effb11 100644 --- a/src/AdventOfCode/Year2018/Day01.hs +++ b/src/AdventOfCode/Year2018/Day01.hs @@ -1,12 +1,14 @@ {-# LANGUAGE DerivingVia #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2018.Day01 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMainMaybe, inputFilePath) -import AdventOfCode.Util (findFirstDup, scan) -import Data.Monoid (Sum (..)) -import Text.Trifecta (integer, some) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Util (findFirstDup, maybeFail, scan) +import Relude +import Text.Trifecta (integer) newtype FrequencyChange = FrequencyChange {unFrequencyChange :: Integer} @@ -17,17 +19,19 @@ newtype FrequencyChange = FrequencyChange via (Sum Integer) main :: IO () -main = $(defaultMainMaybe) +main = $(evalPuzzle) getInput :: IO [FrequencyChange] -getInput = parseInput (some (FrequencyChange <$> integer)) $(inputFilePath) +getInput = parseInputAoC 2018 1 (some (FrequencyChange <$> integer)) -partOne :: [FrequencyChange] -> Maybe Integer -partOne = Just . unFrequencyChange . mconcat +partOne :: SimplePuzzle [FrequencyChange] Integer +partOne = asks $ unFrequencyChange . mconcat -partTwo :: [FrequencyChange] -> Maybe Integer +partTwo :: SimplePuzzle [FrequencyChange] Integer partTwo = - fmap unFrequencyChange + ask + >>= maybeFail "ope!" + . fmap unFrequencyChange . findFirstDup . scan . cycle From 949b78794a5886d73aa0d304b7cf79cebf8dc2fc Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 13 Nov 2025 23:52:58 -0600 Subject: [PATCH 25/91] refactor(2018.02-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2018/day02.txt | 250 ----------------------------- src/AdventOfCode/Year2018/Day02.hs | 70 ++++++-- 3 files changed, 54 insertions(+), 268 deletions(-) delete mode 100644 input/2018/day02.txt diff --git a/VERSION b/VERSION index 1e0726f..9b86ef8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.47 \ No newline at end of file +2024.7.2.48 \ No newline at end of file diff --git a/input/2018/day02.txt b/input/2018/day02.txt deleted file mode 100644 index 50dbef6..0000000 --- a/input/2018/day02.txt +++ /dev/null @@ -1,250 +0,0 @@ -cnjxpritdzhubeseewfmqagkul -cwyxpgitdzhvbosyewfmqagkul -cnfxpritdzhebosywwfmqagkul -cnjxpritdzgvbosyawfiqagkul -cnkxpritdzhvbosyewfmgagkuh -gnjxprhtdzhebosyewfmqagkul -cnjxpriedzevbosyewfjqagkul -cnjxpritdzhpyosyewfsqagkul -cnjxprltdzhvbosyewfmhagkzl -cnjxfritdjhvbosyewfmiagkul -xnjxpritdzhvbosyewfmqagkgn -cnjxpritdzmvzosyewfhqagkul -cljxxritdzhvbosyewfmragkul -cnjxjritdzhvbovyewfmvagkul -cnjxprdtdzhpbosyewvmqagkul -cojxprdtdzhzbosyewfmqagkul -cnjxpritgzhvfgsyewfmqagkul -knjxprptdzhvbosyecfmqagkul -cnjxpritdzhvbvsyeyfmqagkuc -cnjxpritdzhvbosvewfmoagjul -cnjxpritdzhvbosyfwfmbagkjl -cnjxpjitazhvbosfewfmqagkul -cnjtpfitdzhvbosyewfmiagkul -ckjxpritdzhvbysyewfmqagoul -cnjxvritdzhvbfsyewfmqalkul -cnjipqitdzhvbosyewfeqagkul -cnjhpritdzhvbosyewymqjgkul -cnjxprrtdzhvbosyewfmlkgkul -cnjxnritdzhvbopyewfmqaskul -cxjxpritdzhvtosyewjmqagkul -cnjxpritdzhvbjsyewfrqagkwl -cnjxhritdzhubosyewfmqagvul -cnjxpritdzhvbosyyyfmeagkul -cnjxkritdzhvaoeyewfmqagkul -cnjxpritdzhvtotyewfmqazkul -cnjxoriadzhvbosyewfmqcgkul -cnjxpritdzhcbosyewfmkapkul -fnjxprtddzhvbosyewfmqagkul -cnjxmvitdzhvbosyewfmqagrul -cnjxpyitdzhibosyewfmqagktl -cyjxprxtdzhvbosyewbmqagkul -onjxpditdzhvbosyeofmqagkul -cnjxprixdzhvbosuewftqagkul -cnjxpritdrhvaosyewymqagkul -cnjxpritdzhhbokyewfvqagkul -cnjxpritczhvbosyewfmqwgxul -cnjxpribdzqvbnsyewfmqagkul -ynpxpritdzhvbvsyewfmqagkul -cnjxprirdzhvboerewfmqagkul -cnjxpritdxhvbosyewfmgavkul -cnwxprntdzhvbosyewfmqagkuk -cnjxpritzzhvbosyewfmcagktl -bbjxpritdzhvbosyetfmqagkul -cnjxpbitdzhvbosyewrmqagkui -cnjxwrildzcvbosyewfmqagkul -cnqxpoitdzhvbosnewfmqagkul -cnzxpritdzhvbosyewfmqazkfl -cnjxpriddzhvoosyewfmhagkul -znjxpritdzhvbosjewfmqagkur -cnjxpritdzhvbosyewcmfagkuk -cnjxpritdzhvbomyywnmqagkul -cnjxpgitjzhvbosyejfmqagkul -cnjxpkitdzjvbosyewfmqcgkul -cnjxpritduhvbosyewfmqfkkul -cnfxpritdzhvbgsyewfmqwgkul -cnjxpritdzhvbosywufmqaskul -cnjxprittzhvboryswfmqagkul -cndxpritpzrvbosyewfmqagkul -cnjxpritdzhvbosyewfwqazkum -cccxprmtdzhvbosyewfmqagkul -cnjxpzitdzhvlbsyewfmqagkul -cnjxdrigdzhvbosyewfmqagsul -fhjxpritdzhvbosyewfmqagkcl -cnjxpritdzhvdosyewffqagaul -cnjxprikdztvbosyekfmqagkul -cnjxpritdzhvbohiewfmqagkue -cnjxpritdzhvbowyetfmqegkul -cnuxpritdzhvbosyewmmqapkul -qnjxpritdzhvbosyewfmjakkul -cnjxpritdzlvbosyewiaqagkul -cnjxpritdzhpoosyewfmvagkul -cdjxpritdzhvboryewfbqagkul -cnjxppitxzhvbosyewymqagkul -cnjxpywtdzhvboiyewfmqagkul -cnjxpritdzpvbosyezfmqaqkul -cnjppritdghvbosyewfdqagkul -cmjxpritdzhvbosvewfmqagkup -cnjxoritdzhvbosylffmqagkul -cnjxfritdzhvbojyewfmqagkvl -cnjxpritdzhvbozyewgmqlgkul -cnjxlritdzhvbosyewfmqalkug -cnyxprittzhvbosyewfmsagkul -cnjxprytdzcvdosyewfmqagkul -ctjxpritdzhvbosyedfmqagkil -cnjxpvitdzhrbosyewfmqaekul -cnyxyritdzhvbospewfmqagkul -cnjxoritwzhvbosyewrmqhgkul -cnjxpritdzhjbosyqwsmqagkul -cnjzprindzhvbosyewfmqabkul -cnjspritdzhvbosysffmqagkul -cnxxpritdzhvbosyelfmqageul -bnjhpritdzhvbosyewfmzagkul -cnjxbhitdzhdbosyewfmqagkul -cnjxprktdzmvbosyewfmqagkuj -cnjxprixdzhvbqsyewfmqmgkul -cnjxpkitdzhvbosyewfmqagbum -cnjhpritdzhxbosyewfmqagjul -cnjxpritdzzvbosyewuqqagkul -cnjxprhtdzhvuopyewfmqagkul -cnjxpritdzhjqosyewfmqagkgl -cnzxpritdzhvbosyejfmuagkul -cnvxpritoohvbosyewfmqagkul -cnjxpmitdzwvbosyemfmqagkul -cnjoprittzzvbosyewfmqagkul -cnjxpgitdzhvbosytwfmqsgkul -cnjxprrtdehvbosyewfnqagkul -onjxpjitdzgvbosyewfmqagkul -cnjxpmitdzhvbopaewfmqagkul -cnjxpritqzhvbosoewfrqagkul -cnjxpnitdzhvbosyewfmqagkjy -cnsxpritdzhvbosyewfmqjykul -cnjxpriidzhvbosyewfmqxgkut -cnjxpyitdzhnbosyewfgqagkul -cnjxpritdzhbboyyewfmqagsul -cnjxpeitdzsvbosyewfmqabkul -cnjxpritdzhzvosyewfmragkul -cnjrpritdzhmbosyewfmqrgkul -cnjxpritdzhmbosyenfmqaglul -cnjxqrntdzhvboswewfmqagkul -cnjxprdtpzhvbosyewfmqagkcl -cnjxpritdzhvsdsyewfmqagkur -cnjxpritdzhvvosyewumqhgkul -cnzxpritdznvhosyewfmqagkul -ynjypritdzhvbosyewfmqagkuz -cnjxpnitdzhvbocyezfmqagkul -vnjxpritdzhvbfsyewfmjagkul -cnjfpritdzhvbosyewfmqagkzu -cnjxpritdzhbbosyewfmlegkul -cnjxpnitdzhvbosyesfmbagkul -cnjxpritezwvbosyewfmqagkgl -cujxpritdzhqbosyawfmqagkul -cnjxprindzhrbosyerfmqagkul -cntxpritdzhvbosyewfmqauxul -cnjxpvitdzhvbosyepfmqagkuy -cnjxdrqtdzhvbosdewfmqagkul -cnnxpritdzhvvosyenfmqagkul -lnjxphitdzhvbosyewfaqagkul -cngxpritdzhhbobyewfmqagkul -uncxphitdzhvbosyewfmqagkul -cnjxpribdehvbosfewfmqagkul -cnjxppitdqhvbmsyewfmqagkul -gnjxpritkzhvbosyewfbqagkul -znjxpritdzhvbowycwfmqagkul -cnjxpgitdzhvbosyewidqagkul -cnjxhritdzhvbowyswfmqagkul -injxkritdzhvbjsyewfmqagkul -cmjupritgzhvbosyewfmqagkul -cnjxpritdzbvjoeyewfmqagkul -cnjxpritdkhvbosyewlmuagkul -cnkxpritdzhebvsyewfmqagkul -cyjxptitdzhvbosyewfmqagkuv -cnjxpritdzhvbodrewflqagkul -cnjxpratdzhvbksyewfhqagkul -cnjxpoitdzhvbosjewxmqagkul -cnjxprhidzhvbasyewfmqagkul -cnjxpritdzhvbosqewvmqagmul -cnjxoritdzhvbosyzifmqagkul -mnjxpritdzhvbcsyeyfmqagkul -cnjhpritgzhvbosyewfmqngkul -cnjxprijdzevbesyewfmqagkul -cnexprqtdzhvbosyewvmqagkul -cnjxpxitdzhvbosyawfmqmgkul -cnjxpritdzhvbosyirfmqaxkul -cqjxpcitdzhvboslewfmqagkul -cmjxpqitdztvbosyewfmqagkul -cnbxpritdzhvfosyewfmuagkul -cnjxprrtdzhvbosumwfmqagkul -cnjxprttdvhvbossewfmqagkul -cnjxpritdzhvbcsuewfaqagkul -cbjxpritdzhvbosyewfhqalkul -cnjxprithzhvbosjcwfmqagkul -chjxpritdzhvbosyewftcagkul -cnjxprirdchvdosyewfmqagkul -cnjxpritdxhvbosyewfmqcgkal -cnjxpriidchvbosrewfmqagkul -cnjhprizdzhvbosyewfmqagvul -cnjwpritdzhpbosyewfmqaqkul -cnjxpgitfzhvbosyxwfmqagkul -cnjxpjiedzhvbosywwfmqagkul -cnjxpritdzhvbosyewfpqynkul -xnixlritdzhvbosyewfmqagkul -cnjxoritdznvbosyehfmqagkul -cnjxpritdzhvbjsyewsmqagcul -lnjxpritdzhvkosyewjmqagkul -cnjxpritdzhvbosyedfiqvgkul -cnjxpritdzhqbdsyerfmqagkul -cnjxpritdzavbosyywfmqagvul -dmjxprithzhvbosyewfmqagkul -cnjxpriqdzhvnosyeofmqagkul -cnjxpritdxhvboszewfmqkgkul -cnjxpritdzxvbosjewymqagkul -cnjxpritdzngbosyewfmqugkul -cajxpritdnhvbosyerfmqagkul -cnsxpritdzhvbosymwfmqagcul -cnjxoritdzhvbosyewrmqhgkul -cnjxpritdzhvposyewfmqagkwo -cnjxpriazzhvbosyeufmqagkul -cnjxrritdzhvbosymhfmqagkul -cnjxprztdzhvbosyewfmqtgkum -cnjxpritdzhvbmsyewfmqatkun -cnuxpritdzhvbosyewfmqagvur -ctjxxritdzhvbosyewfvqagkul -cnjxpritdzlvbosyevfmqagkll -cnjxpritdzhlbosyewfmqagasl -cnjxpritwzhvbosyewfcxagkul -cyjxpritdzhfbosyewfmqagcul -cnjxpritxghvkosyewfmqagkul -ctjxpritdjhvbosyewfmqkgkul -cnjxpritxzhvbosyewjmbagkul -unjxpritdzhkbosyewfmqaghul -cnjoprqtdzhvbosyewzmqagkul -rnjxprgtgzhvbosyewfmqagkul -cnjgpqitdzhvbosyewfaqagkul -cnjxpritdzuybosyewfmqagful -cnjxprqtdahvbosyewfnqagkul -cnjxpritdzhmkhsyewfmqagkul -wnjxpritdzhvbosiewfmqagkml -cnjmpritdzhvbosyjwfmqagkdl -cnjopritdzhvbksyewfmqrgkul -cnlxpritdzhvbosyewfmomgkul -cgjxpritdzhvbbsyewfmxagkul -cnaxpritdvhvnosyewfmqagkul -cnjxprijdzhvbkmyewfmqagkul -cnjxpritdzhvposyewzmqagkuz -cnuxpuitdzdvbosyewfmqagkul -cnjxprifdzjvbosyewfyqagkul -cnhspritdzhvbosyewfmqaghul -cnjxprcbdzfvbosyewfmqagkul -lnjapritdzhvbosyewfmqegkul -cnjxprisszhvbosyewqmqagkul -cnjxpritdzhvbosyeifmsagoul -cnjxpritrfhvbosyewfmqagkuz -cnjxkritdzmvboqyewfmqagkul -cnjxpritdzhvbosyedfmqzgkzl -cnjxprifdzhvbosyswfmqagksl -cnjxoritdzhvbosyxwfmhagkul -cnjhpritdzzvbosfewfmqagkul -cnjxprityjhvbomyewfmqagkul -cnjbpritdzhvbosyywfmqagkuf -cnjxprrtdzhvbosyewgmqagtul diff --git a/src/AdventOfCode/Year2018/Day02.hs b/src/AdventOfCode/Year2018/Day02.hs index 181ecff..ef0080c 100644 --- a/src/AdventOfCode/Year2018/Day02.hs +++ b/src/AdventOfCode/Year2018/Day02.hs @@ -1,37 +1,44 @@ {-# LANGUAGE TupleSections #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2018.Day02 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMainMaybe, inputFilePath) -import AdventOfCode.Util (frequencies, hammingSimilar) -import Control.Arrow ((&&&), (***), (>>>)) -import Data.List (find, intersect, tails) -import Data.Maybe (listToMaybe, mapMaybe) -import Text.Trifecta (letter, newline, sepEndBy, some) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Util (count, frequencies, hammingSimilar, maybeFail) +import Data.List (intersect) +import Relude +import Text.Trifecta (letter, newline, sepEndBy) type BoxID = String type Checksum = Integer main :: IO () -main = $(defaultMainMaybe) +main = $(evalPuzzle) getInput :: IO [BoxID] -getInput = parseInput (some letter `sepEndBy` newline) $(inputFilePath) +getInput = parseInputAoC 2018 2 (some letter `sepEndBy` newline) -partOne :: [BoxID] -> Maybe Checksum -partOne = Just . checksum +partOne :: SimplePuzzle [BoxID] Checksum +partOne = asks checksum -partTwo :: [BoxID] -> Maybe String -partTwo = fmap (uncurry intersect) . correctBoxIDs +partOneExample :: IO Checksum +partOneExample = flip evalPart partOne =<< getExampleOne + +partTwo :: SimplePuzzle [BoxID] String +partTwo = ask >>= maybeFail "ope!" . fmap (uncurry intersect) . correctBoxIDs + +partTwoExample :: IO String +partTwoExample = flip evalPart partTwo =<< getExampleTwo checksum :: [BoxID] -> Checksum checksum = - fmap frequencies - >>> filter (elem 2) &&& filter (elem 3) - >>> length *** length - >>> product + map frequencies + >>> count (elem 2) + &&& count (elem 3) + >>> uncurry (*) >>> fromIntegral correctBoxIDs :: [BoxID] -> Maybe (BoxID, BoxID) @@ -39,3 +46,32 @@ correctBoxIDs = listToMaybe . mapMaybe go . tails where go (x : xs@(_ : _)) = (x,) <$> find (hammingSimilar 1 x) xs go _ = Nothing + +getExample :: String -> IO [BoxID] +getExample = parseString (some letter `sepEndBy` newline) + +getExampleOne :: IO [BoxID] +getExampleOne = getExample exampleOne + +exampleOne :: String +exampleOne = + "abcdef\n\ + \bababc\n\ + \abbcde\n\ + \abcccd\n\ + \aabcdd\n\ + \abcdee\n\ + \ababab\n" + +getExampleTwo :: IO [BoxID] +getExampleTwo = getExample exampleTwo + +exampleTwo :: String +exampleTwo = + "abcde\n\ + \fghij\n\ + \klmno\n\ + \pqrst\n\ + \fguij\n\ + \axcye\n\ + \wvxyz\n" From 602b48a927e70b3adcaef39dc5e1b5fd27464ee5 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Fri, 14 Nov 2025 23:54:35 -0600 Subject: [PATCH 26/91] refactor(2018.03-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2018/day03.txt | 1237 ---------------------------- package.yaml | 2 + src/AdventOfCode/Year2018/Day03.hs | 122 ++- 4 files changed, 60 insertions(+), 1303 deletions(-) delete mode 100644 input/2018/day03.txt diff --git a/VERSION b/VERSION index 9b86ef8..9bbf386 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.48 \ No newline at end of file +2024.7.2.49 \ No newline at end of file diff --git a/input/2018/day03.txt b/input/2018/day03.txt deleted file mode 100644 index 53d4255..0000000 --- a/input/2018/day03.txt +++ /dev/null @@ -1,1237 +0,0 @@ -#1 @ 338,764: 20x24 -#2 @ 80,667: 12x26 -#3 @ 625,36: 17x22 -#4 @ 196,235: 25x13 -#5 @ 610,700: 25x21 -#6 @ 590,831: 20x13 -#7 @ 253,201: 29x22 -#8 @ 921,577: 15x13 -#9 @ 495,85: 20x19 -#10 @ 397,589: 17x22 -#11 @ 238,651: 13x17 -#12 @ 143,939: 28x19 -#13 @ 211,227: 26x12 -#14 @ 81,818: 22x19 -#15 @ 121,270: 18x10 -#16 @ 414,117: 16x25 -#17 @ 450,597: 11x13 -#18 @ 875,694: 25x13 -#19 @ 348,301: 19x14 -#20 @ 427,302: 20x28 -#21 @ 295,935: 29x22 -#22 @ 488,347: 21x10 -#23 @ 724,809: 24x24 -#24 @ 529,746: 23x22 -#25 @ 674,555: 29x17 -#26 @ 807,871: 29x19 -#27 @ 170,203: 11x13 -#28 @ 340,446: 21x11 -#29 @ 534,294: 28x17 -#30 @ 136,271: 22x22 -#31 @ 672,965: 29x10 -#32 @ 767,638: 22x10 -#33 @ 927,196: 11x23 -#34 @ 349,305: 22x12 -#35 @ 616,903: 27x22 -#36 @ 761,453: 16x15 -#37 @ 682,835: 26x20 -#38 @ 799,723: 27x17 -#39 @ 623,807: 21x20 -#40 @ 334,886: 16x27 -#41 @ 953,561: 15x28 -#42 @ 318,469: 23x16 -#43 @ 498,718: 16x12 -#44 @ 634,788: 22x26 -#45 @ 150,190: 13x28 -#46 @ 814,124: 22x24 -#47 @ 524,741: 20x26 -#48 @ 931,336: 19x20 -#49 @ 200,506: 14x20 -#50 @ 849,225: 16x11 -#51 @ 602,494: 19x20 -#52 @ 362,128: 14x13 -#53 @ 680,571: 19x19 -#54 @ 354,45: 29x27 -#55 @ 908,894: 10x27 -#56 @ 204,219: 10x18 -#57 @ 328,28: 11x28 -#58 @ 604,789: 11x25 -#59 @ 288,827: 29x15 -#60 @ 945,443: 14x12 -#61 @ 294,845: 8x8 -#62 @ 756,365: 20x23 -#63 @ 570,493: 17x14 -#64 @ 144,372: 23x12 -#65 @ 374,58: 13x19 -#66 @ 331,305: 12x11 -#67 @ 603,282: 19x19 -#68 @ 755,875: 12x13 -#69 @ 147,709: 26x10 -#70 @ 445,408: 13x17 -#71 @ 816,215: 24x13 -#72 @ 28,225: 15x29 -#73 @ 167,253: 10x25 -#74 @ 788,845: 18x10 -#75 @ 834,230: 26x24 -#76 @ 874,277: 17x24 -#77 @ 250,805: 11x24 -#78 @ 267,610: 13x11 -#79 @ 813,860: 24x20 -#80 @ 119,585: 10x18 -#81 @ 494,941: 12x25 -#82 @ 816,550: 12x28 -#83 @ 620,799: 17x12 -#84 @ 705,754: 24x21 -#85 @ 297,16: 15x21 -#86 @ 650,808: 19x20 -#87 @ 251,138: 20x15 -#88 @ 834,516: 19x20 -#89 @ 229,266: 24x13 -#90 @ 524,827: 20x25 -#91 @ 186,405: 20x28 -#92 @ 448,795: 13x18 -#93 @ 508,388: 25x27 -#94 @ 74,831: 19x19 -#95 @ 444,548: 12x22 -#96 @ 893,230: 17x24 -#97 @ 380,437: 14x25 -#98 @ 511,272: 10x13 -#99 @ 261,922: 12x23 -#100 @ 215,120: 27x27 -#101 @ 190,202: 23x29 -#102 @ 954,691: 11x24 -#103 @ 916,207: 17x29 -#104 @ 441,890: 23x16 -#105 @ 322,455: 11x22 -#106 @ 28,0: 22x19 -#107 @ 101,633: 19x24 -#108 @ 214,399: 20x11 -#109 @ 882,829: 25x11 -#110 @ 336,33: 21x26 -#111 @ 805,278: 13x21 -#112 @ 98,522: 12x29 -#113 @ 261,706: 25x26 -#114 @ 706,369: 21x13 -#115 @ 281,23: 23x12 -#116 @ 505,410: 25x13 -#117 @ 147,514: 12x12 -#118 @ 555,888: 11x13 -#119 @ 687,852: 22x25 -#120 @ 46,609: 5x12 -#121 @ 431,119: 24x13 -#122 @ 843,984: 24x15 -#123 @ 313,524: 25x12 -#124 @ 213,231: 17x18 -#125 @ 167,935: 21x11 -#126 @ 719,738: 22x23 -#127 @ 692,840: 29x13 -#128 @ 948,580: 19x21 -#129 @ 558,303: 14x14 -#130 @ 890,328: 10x23 -#131 @ 934,563: 23x12 -#132 @ 757,18: 22x22 -#133 @ 615,947: 21x20 -#134 @ 712,439: 26x18 -#135 @ 219,134: 28x28 -#136 @ 373,270: 26x23 -#137 @ 87,844: 29x13 -#138 @ 937,454: 23x27 -#139 @ 482,802: 23x14 -#140 @ 687,970: 29x13 -#141 @ 983,139: 12x20 -#142 @ 268,656: 21x17 -#143 @ 940,913: 18x20 -#144 @ 328,588: 10x17 -#145 @ 217,915: 23x21 -#146 @ 92,841: 17x17 -#147 @ 962,683: 24x17 -#148 @ 857,468: 12x17 -#149 @ 438,644: 20x10 -#150 @ 516,283: 21x17 -#151 @ 429,847: 24x29 -#152 @ 761,679: 10x5 -#153 @ 471,59: 26x12 -#154 @ 223,650: 21x19 -#155 @ 80,555: 25x18 -#156 @ 455,328: 26x28 -#157 @ 723,634: 27x11 -#158 @ 565,862: 14x25 -#159 @ 381,670: 23x16 -#160 @ 293,838: 12x23 -#161 @ 168,190: 25x24 -#162 @ 91,18: 28x29 -#163 @ 470,715: 29x24 -#164 @ 124,216: 13x14 -#165 @ 360,133: 25x10 -#166 @ 983,145: 10x10 -#167 @ 577,420: 15x10 -#168 @ 297,949: 17x23 -#169 @ 789,129: 29x27 -#170 @ 545,711: 16x20 -#171 @ 965,81: 20x23 -#172 @ 944,584: 26x23 -#173 @ 139,971: 16x12 -#174 @ 453,561: 26x16 -#175 @ 591,967: 11x24 -#176 @ 130,552: 22x24 -#177 @ 643,365: 18x10 -#178 @ 205,830: 29x11 -#179 @ 536,151: 12x28 -#180 @ 771,455: 14x18 -#181 @ 699,596: 13x23 -#182 @ 964,498: 19x24 -#183 @ 964,563: 17x26 -#184 @ 760,627: 10x14 -#185 @ 832,457: 18x25 -#186 @ 274,661: 12x25 -#187 @ 9,788: 26x15 -#188 @ 548,689: 16x25 -#189 @ 478,927: 19x21 -#190 @ 598,127: 21x17 -#191 @ 417,6: 19x15 -#192 @ 891,495: 26x28 -#193 @ 532,862: 23x16 -#194 @ 340,579: 10x15 -#195 @ 816,103: 10x17 -#196 @ 646,394: 21x20 -#197 @ 234,827: 22x12 -#198 @ 658,954: 28x17 -#199 @ 491,4: 24x27 -#200 @ 467,411: 11x11 -#201 @ 683,88: 16x26 -#202 @ 717,124: 22x16 -#203 @ 325,577: 13x16 -#204 @ 545,852: 19x10 -#205 @ 58,535: 13x20 -#206 @ 483,57: 21x28 -#207 @ 287,762: 27x14 -#208 @ 990,223: 6x12 -#209 @ 878,768: 17x21 -#210 @ 800,761: 24x12 -#211 @ 971,661: 16x15 -#212 @ 290,296: 10x13 -#213 @ 67,852: 11x16 -#214 @ 303,627: 27x18 -#215 @ 150,89: 22x27 -#216 @ 336,535: 29x21 -#217 @ 603,198: 26x21 -#218 @ 145,263: 27x19 -#219 @ 332,793: 29x19 -#220 @ 326,738: 19x22 -#221 @ 277,828: 12x25 -#222 @ 227,729: 14x20 -#223 @ 863,900: 10x21 -#224 @ 914,2: 15x11 -#225 @ 535,507: 14x14 -#226 @ 91,144: 21x21 -#227 @ 454,437: 29x19 -#228 @ 878,506: 26x20 -#229 @ 467,873: 23x25 -#230 @ 899,36: 17x14 -#231 @ 490,959: 25x20 -#232 @ 482,830: 22x18 -#233 @ 233,662: 19x19 -#234 @ 429,33: 28x21 -#235 @ 884,537: 25x22 -#236 @ 636,135: 11x10 -#237 @ 196,303: 27x27 -#238 @ 801,301: 12x24 -#239 @ 522,444: 29x13 -#240 @ 737,417: 18x29 -#241 @ 603,706: 19x17 -#242 @ 792,51: 17x18 -#243 @ 241,740: 15x27 -#244 @ 383,767: 23x20 -#245 @ 735,647: 25x25 -#246 @ 863,880: 22x23 -#247 @ 20,966: 29x16 -#248 @ 538,425: 14x28 -#249 @ 108,844: 19x15 -#250 @ 384,201: 28x25 -#251 @ 932,593: 13x14 -#252 @ 282,535: 29x23 -#253 @ 822,550: 14x15 -#254 @ 190,231: 29x23 -#255 @ 602,217: 12x24 -#256 @ 97,259: 18x21 -#257 @ 40,24: 11x12 -#258 @ 147,206: 14x10 -#259 @ 738,864: 29x23 -#260 @ 42,3: 10x23 -#261 @ 668,581: 25x17 -#262 @ 452,664: 25x12 -#263 @ 688,493: 13x11 -#264 @ 324,309: 27x19 -#265 @ 460,696: 17x13 -#266 @ 354,943: 20x11 -#267 @ 959,576: 22x14 -#268 @ 637,848: 12x29 -#269 @ 685,606: 16x11 -#270 @ 294,503: 20x13 -#271 @ 689,398: 19x10 -#272 @ 791,114: 13x16 -#273 @ 881,910: 24x12 -#274 @ 598,625: 11x16 -#275 @ 863,668: 28x25 -#276 @ 677,97: 25x21 -#277 @ 310,767: 12x10 -#278 @ 226,589: 11x17 -#279 @ 41,761: 18x12 -#280 @ 632,82: 14x21 -#281 @ 978,549: 14x10 -#282 @ 153,25: 26x22 -#283 @ 397,240: 14x18 -#284 @ 614,883: 20x23 -#285 @ 980,7: 13x27 -#286 @ 58,158: 22x21 -#287 @ 188,5: 14x26 -#288 @ 941,152: 19x15 -#289 @ 547,853: 12x28 -#290 @ 292,612: 16x23 -#291 @ 725,945: 13x10 -#292 @ 886,244: 15x27 -#293 @ 665,745: 25x20 -#294 @ 621,835: 20x21 -#295 @ 462,252: 19x20 -#296 @ 150,769: 20x11 -#297 @ 119,439: 10x11 -#298 @ 902,497: 14x20 -#299 @ 805,772: 20x15 -#300 @ 495,553: 19x24 -#301 @ 789,754: 12x22 -#302 @ 501,798: 28x12 -#303 @ 949,746: 21x17 -#304 @ 204,462: 24x14 -#305 @ 543,30: 21x25 -#306 @ 135,652: 21x22 -#307 @ 314,157: 26x15 -#308 @ 481,970: 12x19 -#309 @ 593,972: 6x6 -#310 @ 597,71: 22x24 -#311 @ 373,400: 13x19 -#312 @ 113,482: 23x16 -#313 @ 720,925: 17x13 -#314 @ 967,659: 16x23 -#315 @ 352,66: 26x20 -#316 @ 289,375: 14x13 -#317 @ 405,405: 14x10 -#318 @ 688,962: 16x29 -#319 @ 684,863: 25x14 -#320 @ 530,906: 17x25 -#321 @ 384,719: 12x26 -#322 @ 984,198: 10x22 -#323 @ 673,273: 11x18 -#324 @ 662,328: 22x14 -#325 @ 571,653: 25x22 -#326 @ 432,12: 10x27 -#327 @ 842,672: 22x14 -#328 @ 691,52: 16x17 -#329 @ 216,327: 22x10 -#330 @ 942,508: 11x11 -#331 @ 698,200: 27x14 -#332 @ 123,480: 27x24 -#333 @ 68,611: 27x21 -#334 @ 660,468: 15x22 -#335 @ 709,372: 5x6 -#336 @ 431,405: 19x17 -#337 @ 143,276: 29x15 -#338 @ 21,224: 27x28 -#339 @ 880,402: 17x29 -#340 @ 598,928: 21x28 -#341 @ 233,180: 17x14 -#342 @ 875,815: 14x19 -#343 @ 963,130: 24x24 -#344 @ 690,604: 17x18 -#345 @ 713,638: 14x22 -#346 @ 776,41: 27x29 -#347 @ 138,341: 13x28 -#348 @ 896,88: 29x24 -#349 @ 967,829: 12x25 -#350 @ 820,618: 29x10 -#351 @ 805,176: 18x14 -#352 @ 715,813: 16x29 -#353 @ 686,194: 26x23 -#354 @ 615,271: 29x12 -#355 @ 515,387: 16x12 -#356 @ 22,763: 12x13 -#357 @ 528,572: 26x12 -#358 @ 359,477: 18x18 -#359 @ 290,430: 26x23 -#360 @ 296,18: 24x11 -#361 @ 886,543: 18x5 -#362 @ 251,134: 25x14 -#363 @ 927,583: 22x15 -#364 @ 865,454: 22x28 -#365 @ 669,322: 11x21 -#366 @ 429,777: 25x22 -#367 @ 325,432: 21x21 -#368 @ 132,554: 24x15 -#369 @ 917,7: 20x25 -#370 @ 175,932: 25x10 -#371 @ 954,72: 15x19 -#372 @ 574,198: 25x15 -#373 @ 333,23: 14x10 -#374 @ 134,572: 14x17 -#375 @ 775,386: 21x26 -#376 @ 906,668: 19x12 -#377 @ 695,566: 19x15 -#378 @ 950,662: 25x28 -#379 @ 714,376: 18x18 -#380 @ 928,899: 29x19 -#381 @ 802,376: 24x22 -#382 @ 369,787: 13x25 -#383 @ 75,261: 29x26 -#384 @ 562,883: 10x16 -#385 @ 321,26: 11x14 -#386 @ 631,265: 26x27 -#387 @ 519,451: 17x28 -#388 @ 62,159: 12x18 -#389 @ 693,41: 28x28 -#390 @ 933,632: 10x11 -#391 @ 246,257: 14x11 -#392 @ 183,504: 22x26 -#393 @ 555,924: 17x26 -#394 @ 828,867: 21x28 -#395 @ 775,874: 27x17 -#396 @ 475,557: 17x24 -#397 @ 535,645: 16x16 -#398 @ 650,767: 23x29 -#399 @ 453,242: 25x16 -#400 @ 481,436: 24x15 -#401 @ 195,982: 22x10 -#402 @ 458,807: 12x13 -#403 @ 386,728: 4x7 -#404 @ 476,486: 22x11 -#405 @ 674,631: 11x21 -#406 @ 20,981: 10x19 -#407 @ 471,551: 14x15 -#408 @ 610,84: 13x10 -#409 @ 899,118: 25x23 -#410 @ 719,705: 27x22 -#411 @ 458,280: 14x15 -#412 @ 327,436: 14x25 -#413 @ 635,145: 19x12 -#414 @ 967,574: 12x13 -#415 @ 517,356: 21x10 -#416 @ 719,723: 16x24 -#417 @ 661,755: 11x17 -#418 @ 310,902: 19x24 -#419 @ 432,516: 12x25 -#420 @ 695,693: 26x28 -#421 @ 518,653: 28x28 -#422 @ 869,514: 28x22 -#423 @ 730,402: 24x13 -#424 @ 412,550: 11x27 -#425 @ 688,234: 25x11 -#426 @ 663,819: 10x20 -#427 @ 209,219: 10x21 -#428 @ 369,699: 24x22 -#429 @ 770,731: 15x29 -#430 @ 291,723: 19x16 -#431 @ 978,582: 20x27 -#432 @ 489,481: 15x12 -#433 @ 287,41: 15x25 -#434 @ 2,908: 10x26 -#435 @ 827,150: 23x25 -#436 @ 30,635: 28x19 -#437 @ 178,391: 14x29 -#438 @ 657,168: 23x13 -#439 @ 378,461: 10x15 -#440 @ 325,30: 10x25 -#441 @ 757,462: 21x12 -#442 @ 704,135: 17x28 -#443 @ 815,393: 25x11 -#444 @ 367,733: 17x23 -#445 @ 542,705: 12x13 -#446 @ 346,907: 17x13 -#447 @ 16,809: 28x24 -#448 @ 800,255: 21x16 -#449 @ 192,9: 4x17 -#450 @ 387,514: 13x12 -#451 @ 625,137: 24x13 -#452 @ 339,746: 25x17 -#453 @ 758,32: 10x20 -#454 @ 955,716: 19x15 -#455 @ 987,3: 10x12 -#456 @ 661,821: 23x25 -#457 @ 636,969: 11x14 -#458 @ 697,908: 13x20 -#459 @ 178,919: 20x14 -#460 @ 167,951: 22x20 -#461 @ 284,211: 5x11 -#462 @ 5,820: 20x24 -#463 @ 884,516: 18x28 -#464 @ 811,174: 19x21 -#465 @ 38,229: 11x28 -#466 @ 160,203: 29x28 -#467 @ 286,107: 16x17 -#468 @ 336,30: 20x28 -#469 @ 959,4: 15x10 -#470 @ 374,812: 11x10 -#471 @ 605,748: 13x27 -#472 @ 126,578: 19x20 -#473 @ 151,127: 26x20 -#474 @ 680,150: 28x25 -#475 @ 266,842: 14x26 -#476 @ 602,292: 21x12 -#477 @ 220,702: 24x22 -#478 @ 49,19: 21x20 -#479 @ 208,750: 23x14 -#480 @ 328,410: 23x15 -#481 @ 65,501: 25x16 -#482 @ 411,409: 17x28 -#483 @ 709,935: 16x10 -#484 @ 915,218: 28x22 -#485 @ 722,661: 11x16 -#486 @ 579,329: 25x14 -#487 @ 338,352: 21x22 -#488 @ 351,0: 13x12 -#489 @ 254,867: 13x29 -#490 @ 569,249: 24x11 -#491 @ 592,742: 11x18 -#492 @ 26,234: 11x23 -#493 @ 602,590: 16x13 -#494 @ 311,415: 20x22 -#495 @ 979,551: 13x25 -#496 @ 15,950: 17x10 -#497 @ 397,722: 10x10 -#498 @ 468,797: 18x13 -#499 @ 961,835: 15x26 -#500 @ 965,696: 23x23 -#501 @ 811,96: 19x10 -#502 @ 60,966: 12x20 -#503 @ 425,104: 27x20 -#504 @ 221,913: 18x29 -#505 @ 441,787: 10x12 -#506 @ 225,740: 20x11 -#507 @ 162,110: 13x14 -#508 @ 680,88: 26x21 -#509 @ 344,40: 28x17 -#510 @ 779,13: 27x28 -#511 @ 258,387: 28x26 -#512 @ 90,55: 12x23 -#513 @ 406,120: 15x26 -#514 @ 618,460: 13x12 -#515 @ 660,495: 14x20 -#516 @ 680,102: 11x16 -#517 @ 588,664: 17x26 -#518 @ 350,682: 25x24 -#519 @ 304,41: 11x18 -#520 @ 601,294: 14x15 -#521 @ 395,680: 10x27 -#522 @ 599,318: 17x27 -#523 @ 953,279: 10x24 -#524 @ 935,893: 11x18 -#525 @ 150,965: 13x11 -#526 @ 575,652: 12x22 -#527 @ 328,282: 26x27 -#528 @ 960,581: 10x16 -#529 @ 451,523: 28x29 -#530 @ 249,929: 14x13 -#531 @ 787,347: 10x18 -#532 @ 728,940: 21x16 -#533 @ 501,489: 15x27 -#534 @ 956,85: 15x15 -#535 @ 29,956: 28x13 -#536 @ 508,4: 12x16 -#537 @ 115,211: 20x19 -#538 @ 889,341: 15x10 -#539 @ 755,56: 25x16 -#540 @ 409,587: 12x12 -#541 @ 669,166: 20x10 -#542 @ 633,143: 21x19 -#543 @ 614,163: 12x14 -#544 @ 302,832: 16x23 -#545 @ 436,25: 11x23 -#546 @ 129,173: 16x22 -#547 @ 273,439: 29x11 -#548 @ 313,114: 15x15 -#549 @ 698,822: 12x18 -#550 @ 223,645: 27x25 -#551 @ 311,280: 10x21 -#552 @ 937,841: 16x18 -#553 @ 382,979: 16x12 -#554 @ 405,279: 17x23 -#555 @ 588,413: 14x20 -#556 @ 849,948: 21x24 -#557 @ 374,548: 22x16 -#558 @ 535,573: 12x15 -#559 @ 603,764: 10x29 -#560 @ 888,8: 13x26 -#561 @ 884,386: 22x16 -#562 @ 442,536: 11x6 -#563 @ 159,189: 26x12 -#564 @ 296,368: 26x29 -#565 @ 165,918: 11x23 -#566 @ 91,229: 26x24 -#567 @ 964,821: 17x12 -#568 @ 192,859: 19x12 -#569 @ 540,835: 28x10 -#570 @ 884,663: 17x25 -#571 @ 726,640: 12x29 -#572 @ 884,337: 23x10 -#573 @ 142,924: 16x22 -#574 @ 954,756: 13x12 -#575 @ 745,633: 29x15 -#576 @ 198,937: 29x11 -#577 @ 966,574: 14x26 -#578 @ 183,211: 27x22 -#579 @ 885,202: 23x11 -#580 @ 929,460: 23x28 -#581 @ 308,288: 10x25 -#582 @ 272,104: 15x20 -#583 @ 580,697: 28x23 -#584 @ 558,862: 11x12 -#585 @ 408,511: 28x21 -#586 @ 523,926: 13x27 -#587 @ 752,411: 26x17 -#588 @ 457,418: 21x24 -#589 @ 734,404: 4x8 -#590 @ 857,839: 29x16 -#591 @ 694,101: 11x15 -#592 @ 382,250: 21x19 -#593 @ 760,683: 4x4 -#594 @ 900,917: 11x22 -#595 @ 688,599: 11x21 -#596 @ 616,423: 23x27 -#597 @ 788,737: 23x27 -#598 @ 222,762: 22x25 -#599 @ 133,672: 29x17 -#600 @ 191,212: 10x23 -#601 @ 253,117: 26x16 -#602 @ 288,644: 12x21 -#603 @ 167,131: 20x24 -#604 @ 888,535: 10x29 -#605 @ 918,397: 20x11 -#606 @ 897,934: 15x18 -#607 @ 252,807: 6x17 -#608 @ 614,495: 25x13 -#609 @ 360,540: 24x26 -#610 @ 705,192: 16x19 -#611 @ 19,672: 15x19 -#612 @ 173,227: 16x29 -#613 @ 579,885: 23x15 -#614 @ 497,390: 28x29 -#615 @ 435,783: 24x20 -#616 @ 337,492: 21x29 -#617 @ 114,251: 16x22 -#618 @ 917,820: 28x10 -#619 @ 690,812: 25x18 -#620 @ 63,138: 23x26 -#621 @ 47,232: 20x11 -#622 @ 497,408: 21x29 -#623 @ 97,223: 26x10 -#624 @ 751,558: 26x16 -#625 @ 920,299: 13x26 -#626 @ 0,249: 16x20 -#627 @ 319,766: 14x19 -#628 @ 967,520: 24x18 -#629 @ 580,496: 11x28 -#630 @ 185,960: 16x11 -#631 @ 947,434: 13x23 -#632 @ 712,447: 11x16 -#633 @ 71,49: 15x15 -#634 @ 58,962: 11x27 -#635 @ 451,389: 19x27 -#636 @ 280,665: 25x20 -#637 @ 210,330: 28x14 -#638 @ 221,269: 20x22 -#639 @ 338,174: 11x10 -#640 @ 36,747: 17x18 -#641 @ 163,387: 24x19 -#642 @ 273,244: 10x19 -#643 @ 280,236: 15x23 -#644 @ 475,964: 13x11 -#645 @ 688,450: 11x26 -#646 @ 913,291: 27x20 -#647 @ 382,72: 13x12 -#648 @ 939,641: 28x24 -#649 @ 297,743: 11x23 -#650 @ 247,168: 26x14 -#651 @ 644,741: 22x26 -#652 @ 99,220: 28x12 -#653 @ 360,941: 17x21 -#654 @ 285,550: 28x26 -#655 @ 739,414: 21x14 -#656 @ 434,973: 23x14 -#657 @ 886,925: 11x28 -#658 @ 451,670: 16x16 -#659 @ 654,458: 24x18 -#660 @ 35,594: 11x10 -#661 @ 934,0: 15x26 -#662 @ 39,90: 5x15 -#663 @ 745,609: 25x22 -#664 @ 357,329: 12x22 -#665 @ 328,170: 27x19 -#666 @ 661,130: 28x29 -#667 @ 212,972: 20x12 -#668 @ 788,881: 19x22 -#669 @ 936,827: 14x13 -#670 @ 785,426: 29x19 -#671 @ 778,181: 28x14 -#672 @ 326,115: 19x14 -#673 @ 939,211: 19x24 -#674 @ 844,866: 26x24 -#675 @ 309,515: 15x25 -#676 @ 351,787: 15x10 -#677 @ 444,582: 22x11 -#678 @ 285,719: 28x25 -#679 @ 643,531: 26x21 -#680 @ 671,204: 21x20 -#681 @ 657,507: 17x28 -#682 @ 335,678: 23x25 -#683 @ 45,633: 16x13 -#684 @ 522,437: 19x13 -#685 @ 161,945: 28x15 -#686 @ 510,507: 21x23 -#687 @ 497,552: 18x22 -#688 @ 788,847: 25x29 -#689 @ 199,918: 19x13 -#690 @ 339,373: 24x10 -#691 @ 334,356: 3x7 -#692 @ 293,226: 19x17 -#693 @ 417,71: 28x12 -#694 @ 74,54: 22x19 -#695 @ 530,729: 25x17 -#696 @ 227,259: 25x24 -#697 @ 43,629: 12x16 -#698 @ 58,526: 10x17 -#699 @ 66,626: 23x21 -#700 @ 714,799: 18x23 -#701 @ 126,651: 10x10 -#702 @ 398,698: 27x20 -#703 @ 786,400: 15x16 -#704 @ 361,840: 15x20 -#705 @ 571,535: 18x29 -#706 @ 442,319: 11x27 -#707 @ 495,280: 19x21 -#708 @ 91,854: 20x28 -#709 @ 309,155: 17x17 -#710 @ 9,235: 23x22 -#711 @ 145,412: 20x19 -#712 @ 598,331: 19x10 -#713 @ 902,179: 25x28 -#714 @ 315,574: 22x11 -#715 @ 626,750: 18x27 -#716 @ 894,416: 24x20 -#717 @ 299,827: 23x20 -#718 @ 301,814: 16x26 -#719 @ 561,870: 25x24 -#720 @ 607,483: 15x26 -#721 @ 405,221: 25x20 -#722 @ 845,237: 27x28 -#723 @ 788,281: 28x10 -#724 @ 790,99: 13x24 -#725 @ 39,303: 27x13 -#726 @ 837,232: 28x23 -#727 @ 59,976: 27x22 -#728 @ 313,836: 11x24 -#729 @ 644,549: 11x19 -#730 @ 961,206: 10x21 -#731 @ 784,114: 28x14 -#732 @ 482,60: 19x21 -#733 @ 380,230: 19x12 -#734 @ 17,224: 15x19 -#735 @ 91,953: 29x13 -#736 @ 957,485: 22x14 -#737 @ 162,397: 27x19 -#738 @ 696,569: 14x27 -#739 @ 366,756: 15x18 -#740 @ 604,921: 25x23 -#741 @ 896,924: 27x25 -#742 @ 168,486: 15x28 -#743 @ 750,564: 13x18 -#744 @ 642,304: 24x27 -#745 @ 298,687: 10x26 -#746 @ 397,710: 12x17 -#747 @ 461,15: 26x24 -#748 @ 927,334: 14x17 -#749 @ 727,642: 17x12 -#750 @ 426,236: 16x18 -#751 @ 346,960: 29x27 -#752 @ 478,870: 13x27 -#753 @ 698,127: 24x28 -#754 @ 119,921: 28x18 -#755 @ 221,447: 24x17 -#756 @ 229,682: 25x21 -#757 @ 712,238: 21x26 -#758 @ 594,577: 19x17 -#759 @ 130,659: 28x18 -#760 @ 65,25: 16x17 -#761 @ 680,829: 12x17 -#762 @ 213,125: 19x14 -#763 @ 13,902: 12x26 -#764 @ 520,454: 12x13 -#765 @ 712,477: 23x27 -#766 @ 670,265: 24x27 -#767 @ 399,297: 17x23 -#768 @ 83,964: 29x11 -#769 @ 343,307: 14x26 -#770 @ 633,146: 25x24 -#771 @ 337,574: 26x15 -#772 @ 794,234: 17x18 -#773 @ 438,328: 24x26 -#774 @ 762,765: 26x21 -#775 @ 761,353: 25x19 -#776 @ 824,614: 13x15 -#777 @ 232,974: 12x19 -#778 @ 156,121: 22x24 -#779 @ 458,606: 21x23 -#780 @ 370,959: 29x21 -#781 @ 690,815: 25x27 -#782 @ 865,918: 12x27 -#783 @ 875,503: 13x17 -#784 @ 592,794: 28x16 -#785 @ 903,876: 19x23 -#786 @ 8,796: 18x16 -#787 @ 692,433: 11x21 -#788 @ 735,509: 16x25 -#789 @ 24,768: 26x26 -#790 @ 725,457: 21x15 -#791 @ 26,8: 21x18 -#792 @ 557,728: 12x13 -#793 @ 778,45: 10x23 -#794 @ 381,220: 12x13 -#795 @ 3,922: 29x25 -#796 @ 706,197: 13x12 -#797 @ 425,967: 17x29 -#798 @ 666,764: 16x20 -#799 @ 774,640: 10x14 -#800 @ 581,310: 21x13 -#801 @ 771,249: 24x16 -#802 @ 772,36: 24x20 -#803 @ 362,333: 17x19 -#804 @ 803,861: 27x20 -#805 @ 352,751: 25x28 -#806 @ 880,770: 12x14 -#807 @ 418,130: 25x27 -#808 @ 601,292: 20x24 -#809 @ 331,347: 10x25 -#810 @ 181,929: 29x20 -#811 @ 80,632: 27x23 -#812 @ 4,136: 15x13 -#813 @ 904,899: 13x24 -#814 @ 61,828: 14x28 -#815 @ 265,305: 28x18 -#816 @ 753,32: 27x22 -#817 @ 106,343: 26x20 -#818 @ 655,323: 20x25 -#819 @ 421,523: 16x15 -#820 @ 143,251: 15x13 -#821 @ 426,846: 15x26 -#822 @ 705,144: 11x14 -#823 @ 414,217: 16x22 -#824 @ 368,399: 10x21 -#825 @ 753,449: 24x10 -#826 @ 452,396: 11x20 -#827 @ 401,361: 11x25 -#828 @ 483,320: 22x12 -#829 @ 471,825: 17x28 -#830 @ 816,250: 15x17 -#831 @ 772,394: 29x17 -#832 @ 922,400: 11x4 -#833 @ 65,298: 18x11 -#834 @ 613,805: 22x22 -#835 @ 521,281: 29x12 -#836 @ 333,852: 19x22 -#837 @ 18,585: 26x17 -#838 @ 150,34: 22x20 -#839 @ 217,756: 27x21 -#840 @ 36,88: 22x20 -#841 @ 800,412: 12x27 -#842 @ 202,911: 23x27 -#843 @ 151,865: 16x25 -#844 @ 929,817: 19x27 -#845 @ 632,25: 14x29 -#846 @ 125,256: 17x20 -#847 @ 674,954: 20x29 -#848 @ 106,362: 20x28 -#849 @ 868,880: 27x29 -#850 @ 635,9: 17x24 -#851 @ 107,222: 17x27 -#852 @ 805,889: 16x24 -#853 @ 550,284: 14x18 -#854 @ 441,642: 23x18 -#855 @ 888,852: 24x25 -#856 @ 161,224: 22x13 -#857 @ 25,759: 11x17 -#858 @ 683,916: 26x24 -#859 @ 436,705: 28x22 -#860 @ 615,429: 25x10 -#861 @ 758,670: 16x21 -#862 @ 376,472: 16x10 -#863 @ 953,96: 17x20 -#864 @ 118,678: 11x21 -#865 @ 308,239: 17x19 -#866 @ 314,581: 20x16 -#867 @ 218,477: 24x11 -#868 @ 229,100: 23x26 -#869 @ 2,239: 15x23 -#870 @ 589,356: 27x18 -#871 @ 434,73: 7x7 -#872 @ 988,221: 11x21 -#873 @ 276,100: 19x27 -#874 @ 625,766: 10x27 -#875 @ 246,408: 17x26 -#876 @ 973,521: 14x26 -#877 @ 851,8: 27x22 -#878 @ 624,32: 12x11 -#879 @ 896,359: 26x28 -#880 @ 317,923: 11x24 -#881 @ 179,510: 21x14 -#882 @ 143,742: 16x29 -#883 @ 291,843: 27x13 -#884 @ 170,901: 18x20 -#885 @ 540,490: 17x12 -#886 @ 216,964: 17x17 -#887 @ 191,949: 19x15 -#888 @ 682,648: 10x11 -#889 @ 78,521: 24x12 -#890 @ 19,679: 12x14 -#891 @ 17,907: 20x11 -#892 @ 489,837: 29x11 -#893 @ 388,519: 27x10 -#894 @ 588,53: 19x24 -#895 @ 149,695: 28x27 -#896 @ 150,364: 16x15 -#897 @ 112,654: 20x21 -#898 @ 709,465: 20x23 -#899 @ 941,2: 26x10 -#900 @ 542,90: 24x19 -#901 @ 663,951: 18x29 -#902 @ 244,515: 16x16 -#903 @ 146,13: 25x25 -#904 @ 499,36: 28x25 -#905 @ 442,293: 20x14 -#906 @ 351,855: 13x16 -#907 @ 812,144: 27x28 -#908 @ 505,21: 13x13 -#909 @ 85,135: 14x14 -#910 @ 185,145: 21x29 -#911 @ 573,744: 29x24 -#912 @ 726,763: 17x13 -#913 @ 635,958: 10x14 -#914 @ 395,337: 20x26 -#915 @ 933,152: 14x26 -#916 @ 315,549: 14x25 -#917 @ 57,980: 28x13 -#918 @ 427,974: 11x13 -#919 @ 562,747: 25x25 -#920 @ 514,290: 28x26 -#921 @ 856,939: 25x18 -#922 @ 686,692: 22x19 -#923 @ 414,530: 27x22 -#924 @ 949,281: 10x18 -#925 @ 270,280: 20x22 -#926 @ 474,348: 23x23 -#927 @ 635,395: 20x19 -#928 @ 105,430: 23x10 -#929 @ 578,192: 26x12 -#930 @ 506,482: 18x29 -#931 @ 599,934: 22x11 -#932 @ 746,193: 29x14 -#933 @ 94,782: 18x27 -#934 @ 24,226: 18x26 -#935 @ 9,144: 16x24 -#936 @ 290,633: 13x21 -#937 @ 912,234: 17x24 -#938 @ 354,518: 14x22 -#939 @ 943,692: 29x27 -#940 @ 867,134: 11x23 -#941 @ 908,93: 10x15 -#942 @ 174,400: 15x24 -#943 @ 518,419: 29x17 -#944 @ 460,770: 19x16 -#945 @ 916,507: 22x29 -#946 @ 251,165: 19x19 -#947 @ 490,871: 10x29 -#948 @ 220,589: 18x13 -#949 @ 530,376: 10x15 -#950 @ 307,31: 11x27 -#951 @ 78,686: 11x27 -#952 @ 950,464: 29x24 -#953 @ 138,225: 29x27 -#954 @ 281,294: 17x15 -#955 @ 214,230: 16x22 -#956 @ 929,513: 21x14 -#957 @ 377,986: 12x11 -#958 @ 282,200: 26x28 -#959 @ 206,509: 23x28 -#960 @ 528,451: 16x16 -#961 @ 960,146: 13x12 -#962 @ 255,378: 14x12 -#963 @ 890,331: 29x11 -#964 @ 216,692: 29x11 -#965 @ 42,604: 20x24 -#966 @ 710,371: 12x21 -#967 @ 106,789: 27x21 -#968 @ 693,480: 15x20 -#969 @ 671,847: 16x11 -#970 @ 345,839: 18x26 -#971 @ 267,927: 27x17 -#972 @ 954,214: 14x10 -#973 @ 229,634: 10x27 -#974 @ 264,389: 15x10 -#975 @ 278,479: 19x26 -#976 @ 299,756: 18x10 -#977 @ 750,502: 18x29 -#978 @ 317,549: 17x14 -#979 @ 234,772: 18x16 -#980 @ 855,937: 10x28 -#981 @ 877,297: 20x11 -#982 @ 234,752: 14x24 -#983 @ 20,250: 27x11 -#984 @ 869,830: 21x11 -#985 @ 255,865: 15x20 -#986 @ 907,216: 24x13 -#987 @ 805,176: 27x14 -#988 @ 786,354: 22x24 -#989 @ 600,867: 22x26 -#990 @ 121,270: 14x21 -#991 @ 199,849: 19x25 -#992 @ 842,593: 22x24 -#993 @ 915,507: 27x20 -#994 @ 583,821: 27x29 -#995 @ 482,973: 14x26 -#996 @ 147,588: 11x14 -#997 @ 684,84: 21x25 -#998 @ 772,112: 19x19 -#999 @ 610,159: 22x22 -#1000 @ 458,443: 19x17 -#1001 @ 575,537: 8x20 -#1002 @ 970,820: 12x28 -#1003 @ 79,771: 20x28 -#1004 @ 64,160: 11x25 -#1005 @ 698,710: 23x14 -#1006 @ 866,823: 22x23 -#1007 @ 623,473: 26x26 -#1008 @ 660,952: 15x21 -#1009 @ 108,936: 12x14 -#1010 @ 312,76: 13x13 -#1011 @ 211,811: 22x27 -#1012 @ 895,306: 21x10 -#1013 @ 599,646: 12x24 -#1014 @ 152,580: 10x11 -#1015 @ 692,495: 19x28 -#1016 @ 636,543: 17x10 -#1017 @ 306,502: 25x28 -#1018 @ 432,529: 25x17 -#1019 @ 563,118: 27x23 -#1020 @ 705,386: 24x21 -#1021 @ 328,325: 22x29 -#1022 @ 468,861: 12x19 -#1023 @ 189,307: 13x15 -#1024 @ 193,185: 20x18 -#1025 @ 404,244: 29x18 -#1026 @ 682,821: 12x21 -#1027 @ 844,99: 27x29 -#1028 @ 972,860: 10x12 -#1029 @ 627,719: 15x14 -#1030 @ 287,476: 12x11 -#1031 @ 211,780: 15x28 -#1032 @ 892,688: 12x13 -#1033 @ 888,500: 12x17 -#1034 @ 890,9: 29x17 -#1035 @ 604,480: 23x17 -#1036 @ 284,20: 14x24 -#1037 @ 706,960: 24x18 -#1038 @ 221,823: 16x22 -#1039 @ 370,260: 19x17 -#1040 @ 221,146: 21x27 -#1041 @ 157,158: 22x19 -#1042 @ 215,742: 16x17 -#1043 @ 532,295: 27x20 -#1044 @ 643,535: 29x24 -#1045 @ 804,848: 28x12 -#1046 @ 867,4: 29x28 -#1047 @ 636,801: 10x27 -#1048 @ 935,579: 29x21 -#1049 @ 827,971: 27x19 -#1050 @ 638,132: 29x27 -#1051 @ 372,429: 17x17 -#1052 @ 889,7: 23x25 -#1053 @ 91,36: 19x24 -#1054 @ 472,850: 19x27 -#1055 @ 426,515: 14x19 -#1056 @ 170,498: 12x10 -#1057 @ 176,153: 10x18 -#1058 @ 695,382: 26x24 -#1059 @ 863,936: 10x16 -#1060 @ 358,815: 21x15 -#1061 @ 31,87: 25x29 -#1062 @ 344,541: 17x25 -#1063 @ 115,181: 17x17 -#1064 @ 541,760: 17x25 -#1065 @ 316,222: 14x24 -#1066 @ 284,499: 29x10 -#1067 @ 887,224: 17x20 -#1068 @ 233,902: 24x21 -#1069 @ 529,93: 19x10 -#1070 @ 378,743: 12x16 -#1071 @ 471,287: 28x26 -#1072 @ 885,582: 24x13 -#1073 @ 495,71: 27x25 -#1074 @ 923,134: 19x16 -#1075 @ 628,672: 13x27 -#1076 @ 303,503: 12x24 -#1077 @ 638,488: 26x12 -#1078 @ 351,617: 10x25 -#1079 @ 867,820: 15x18 -#1080 @ 802,552: 21x13 -#1081 @ 256,609: 17x15 -#1082 @ 214,154: 24x12 -#1083 @ 824,571: 19x13 -#1084 @ 518,510: 25x11 -#1085 @ 115,798: 23x27 -#1086 @ 298,462: 18x29 -#1087 @ 36,300: 16x24 -#1088 @ 49,101: 26x20 -#1089 @ 158,208: 23x15 -#1090 @ 490,47: 14x14 -#1091 @ 762,778: 12x16 -#1092 @ 858,147: 16x25 -#1093 @ 53,491: 19x22 -#1094 @ 848,101: 19x20 -#1095 @ 847,465: 11x21 -#1096 @ 376,682: 19x23 -#1097 @ 241,221: 13x19 -#1098 @ 545,922: 29x11 -#1099 @ 470,321: 25x12 -#1100 @ 381,397: 22x21 -#1101 @ 226,396: 12x15 -#1102 @ 79,10: 12x27 -#1103 @ 128,559: 18x11 -#1104 @ 165,149: 12x28 -#1105 @ 806,207: 16x21 -#1106 @ 289,928: 10x17 -#1107 @ 754,201: 22x21 -#1108 @ 318,401: 16x18 -#1109 @ 594,751: 15x29 -#1110 @ 307,57: 10x26 -#1111 @ 370,755: 14x19 -#1112 @ 927,295: 27x15 -#1113 @ 772,733: 29x29 -#1114 @ 889,916: 15x17 -#1115 @ 442,898: 10x19 -#1116 @ 856,613: 12x10 -#1117 @ 961,663: 24x29 -#1118 @ 512,500: 24x21 -#1119 @ 974,376: 14x24 -#1120 @ 907,221: 10x17 -#1121 @ 518,404: 23x15 -#1122 @ 880,256: 10x20 -#1123 @ 676,838: 17x10 -#1124 @ 528,515: 19x18 -#1125 @ 919,656: 19x29 -#1126 @ 734,172: 13x11 -#1127 @ 425,247: 29x12 -#1128 @ 281,20: 23x16 -#1129 @ 631,663: 14x17 -#1130 @ 908,28: 15x13 -#1131 @ 93,853: 11x24 -#1132 @ 423,971: 25x23 -#1133 @ 187,932: 14x25 -#1134 @ 431,575: 27x15 -#1135 @ 674,491: 27x16 -#1136 @ 546,861: 22x15 -#1137 @ 287,236: 17x15 -#1138 @ 270,653: 21x25 -#1139 @ 969,389: 25x20 -#1140 @ 156,32: 20x16 -#1141 @ 111,663: 27x16 -#1142 @ 654,747: 17x25 -#1143 @ 95,848: 22x11 -#1144 @ 771,589: 27x25 -#1145 @ 446,779: 15x13 -#1146 @ 329,786: 26x29 -#1147 @ 312,4: 17x15 -#1148 @ 785,297: 17x24 -#1149 @ 814,112: 20x18 -#1150 @ 621,450: 12x24 -#1151 @ 158,866: 19x10 -#1152 @ 890,85: 28x23 -#1153 @ 812,514: 27x13 -#1154 @ 48,297: 26x19 -#1155 @ 297,480: 18x27 -#1156 @ 60,629: 10x25 -#1157 @ 960,805: 14x20 -#1158 @ 606,923: 23x27 -#1159 @ 309,765: 19x18 -#1160 @ 345,5: 11x24 -#1161 @ 593,54: 26x19 -#1162 @ 591,128: 26x24 -#1163 @ 364,713: 19x17 -#1164 @ 351,618: 21x11 -#1165 @ 125,644: 15x14 -#1166 @ 531,498: 13x24 -#1167 @ 967,76: 28x19 -#1168 @ 975,79: 10x14 -#1169 @ 834,880: 14x20 -#1170 @ 567,224: 12x26 -#1171 @ 660,349: 10x20 -#1172 @ 314,4: 14x10 -#1173 @ 287,718: 16x14 -#1174 @ 776,773: 18x16 -#1175 @ 305,395: 19x23 -#1176 @ 29,227: 26x27 -#1177 @ 132,353: 20x25 -#1178 @ 85,559: 13x5 -#1179 @ 361,65: 16x16 -#1180 @ 492,3: 29x21 -#1181 @ 557,765: 23x14 -#1182 @ 796,45: 18x10 -#1183 @ 767,603: 26x27 -#1184 @ 961,466: 22x16 -#1185 @ 542,165: 21x23 -#1186 @ 688,218: 15x14 -#1187 @ 483,33: 17x22 -#1188 @ 903,219: 22x22 -#1189 @ 449,114: 11x28 -#1190 @ 846,528: 12x18 -#1191 @ 684,591: 19x17 -#1192 @ 559,128: 15x23 -#1193 @ 874,234: 22x18 -#1194 @ 226,185: 15x29 -#1195 @ 616,982: 25x15 -#1196 @ 508,441: 24x26 -#1197 @ 225,496: 27x25 -#1198 @ 425,553: 29x22 -#1199 @ 232,487: 21x13 -#1200 @ 213,826: 15x12 -#1201 @ 643,819: 13x24 -#1202 @ 515,485: 19x28 -#1203 @ 559,19: 22x14 -#1204 @ 367,478: 12x23 -#1205 @ 367,397: 28x22 -#1206 @ 192,930: 15x10 -#1207 @ 912,607: 28x29 -#1208 @ 637,92: 20x22 -#1209 @ 331,322: 21x29 -#1210 @ 869,680: 26x20 -#1211 @ 369,799: 10x11 -#1212 @ 708,382: 18x19 -#1213 @ 33,7: 26x28 -#1214 @ 751,669: 28x22 -#1215 @ 222,640: 21x24 -#1216 @ 322,400: 28x12 -#1217 @ 35,741: 20x11 -#1218 @ 587,371: 22x24 -#1219 @ 726,654: 22x14 -#1220 @ 589,629: 24x15 -#1221 @ 304,674: 20x22 -#1222 @ 197,153: 22x27 -#1223 @ 804,131: 26x24 -#1224 @ 547,894: 17x18 -#1225 @ 742,469: 20x17 -#1226 @ 860,592: 29x23 -#1227 @ 834,542: 18x26 -#1228 @ 739,174: 3x4 -#1229 @ 956,920: 24x16 -#1230 @ 191,787: 27x29 -#1231 @ 958,186: 10x27 -#1232 @ 113,19: 21x17 -#1233 @ 975,185: 10x17 -#1234 @ 488,19: 23x21 -#1235 @ 890,74: 13x29 -#1236 @ 145,523: 23x11 -#1237 @ 245,671: 18x23 diff --git a/package.yaml b/package.yaml index 0a90909..7f9cadc 100644 --- a/package.yaml +++ b/package.yaml @@ -271,6 +271,8 @@ executables: aoc-2018-day03: <<: *executable main: AdventOfCode.Year2018.Day03 + dependencies: + - linear aoc-2018-day04: <<: *executable main: AdventOfCode.Year2018.Day04 diff --git a/src/AdventOfCode/Year2018/Day03.hs b/src/AdventOfCode/Year2018/Day03.hs index 5876d63..fadad73 100644 --- a/src/AdventOfCode/Year2018/Day03.hs +++ b/src/AdventOfCode/Year2018/Day03.hs @@ -1,93 +1,85 @@ -module AdventOfCode.Year2018.Day03 - ( main, - partOne, - partTwo, - ) -where - -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (inputFilePath) -import AdventOfCode.Util (Frequencies, frequencies) -import Data.List (find) -import Data.Map qualified as Map -import Data.Maybe (fromMaybe) -import Text.Trifecta (Parser, comma, digit, many, natural, some, space, symbol) - --- ------------------------------------------------------------------ [ Types ] - -data Point = Point - { _left :: Integer, - _top :: Integer - } - deriving (Eq, Ord) +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE NoImplicitPrelude #-} -instance Show Point where - showsPrec _ (Point left top) = - showString $ "(" <> show left <> ", " <> show top <> ")" +module AdventOfCode.Year2018.Day03 where -data Size = Size - { _width :: Integer, - _height :: Integer - } - deriving (Eq) - -instance Show Size where - showsPrec _ (Size w h) = showString (show w <> "x" <> show h) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle +import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Util (Frequencies, frequencies, maybeFail) +import Control.Monad.Extra (findM) +import Data.Ix (range) +import Data.Map qualified as Map +import Linear.V2 (V2 (..)) +import Relude +import Text.Trifecta (Parser, comma, natural, symbol) -type ClaimID = String +-- ------------------------------------------------------------------ [ Types ] data Claim = Claim - { _id :: ClaimID, - _origin :: Point, - _size :: Size + { _id :: !Integer, + _origin :: !(V2 Integer), + _size :: !(V2 Integer) } deriving (Eq, Show) -- ----------------------------------------------------------------- [ Parsers ] -claim :: Parser Claim -claim = +parseClaim :: Parser Claim +parseClaim = Claim - <$> (symbol "#" *> some digit <* space) + <$> (symbol "#" *> natural) <*> (symbol "@" *> point) <*> (symbol ":" *> size) - -point :: Parser Point -point = Point <$> natural <*> (comma *> natural) - -size :: Parser Size -size = Size <$> natural <*> (symbol "x" *> natural) + where + point = V2 <$> natural <*> (comma *> natural) + size = V2 <$> natural <*> (symbol "x" *> natural) -- ----------------------------------------------------------------- [ Helpers ] -isClaimOverlapping :: Frequencies Point -> Claim -> Bool -isClaimOverlapping covered = any (isPointOverlapping covered) . squaresCovered +nonoverlappingClaim :: Claim -> Puzzle [Claim] (Frequencies (V2 Integer)) Bool +nonoverlappingClaim = + liftA2 all (gets nonoverlappingSquare) . pure . squaresCovered -isPointOverlapping :: Frequencies Point -> Point -> Bool -isPointOverlapping covered = maybe False (> 1) . flip Map.lookup covered +nonoverlappingSquare :: Frequencies (V2 Integer) -> V2 Integer -> Bool +nonoverlappingSquare covered square = + Map.lookup square covered == Just 1 -squaresCovered :: Claim -> [Point] -squaresCovered (Claim _ (Point x0 y0) (Size w h)) = - [Point x1 y1 | x1 <- [x0 .. x0 + w - 1], y1 <- [y0 .. y0 + h - 1]] +squaresCovered :: Claim -> [V2 Integer] +squaresCovered (Claim _ origin size) = range (origin, origin + size - 1) -- ------------------------------------------------------------------- [ Parts ] -partOne :: [Claim] -> Int +emptyPuzzleState :: Frequencies (V2 Integer) +emptyPuzzleState = Map.empty + +partOne :: Puzzle [Claim] (Frequencies (V2 Integer)) Int partOne = - Map.size + asks + $ Map.size . Map.filter (>= 2) . frequencies . concatMap squaresCovered -partTwo :: [Claim] -> Maybe ClaimID -partTwo claims = _id <$> find (not . isClaimOverlapping covered) claims - where - covered = frequencies (concatMap squaresCovered claims) +partTwo :: Puzzle [Claim] (Frequencies (V2 Integer)) Integer +partTwo = do + put =<< asks (frequencies . concatMap squaresCovered) + maybeFail "could not find nonoverlapping claim" + . fmap _id + =<< findM nonoverlappingClaim + =<< ask + +getInput :: IO [Claim] +getInput = parseInputAoC 2018 3 (many parseClaim) main :: IO () -main = do - input <- parseInput (many claim) $(inputFilePath) - putStr "Part One: " - print (partOne input) - putStr "Part Two: " - putStrLn $ fromMaybe "failed!" (partTwo input) +main = $(evalPuzzle) + +getExample :: IO [Claim] +getExample = parseString (many parseClaim) example + +example :: String +example = + "#1 @ 1,3: 4x4\n\ + \#2 @ 3,1: 4x4\n\ + \#3 @ 5,5: 2x2\n" From 469168b856712d24bb820ed56db3f1d5c3641e3f Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sat, 15 Nov 2025 21:45:56 -0600 Subject: [PATCH 27/91] refactor(2018.04-haskell): adopt advent-of-code-api and time --- VERSION | 2 +- input/2018/day04.txt | 1145 ---------------------------- package.yaml | 3 + src/AdventOfCode/Year2018/Day04.hs | 130 ++-- 4 files changed, 65 insertions(+), 1215 deletions(-) delete mode 100644 input/2018/day04.txt diff --git a/VERSION b/VERSION index 9bbf386..ba625cc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.49 \ No newline at end of file +2024.7.2.50 \ No newline at end of file diff --git a/input/2018/day04.txt b/input/2018/day04.txt deleted file mode 100644 index fe97770..0000000 --- a/input/2018/day04.txt +++ /dev/null @@ -1,1145 +0,0 @@ -[1518-05-31 00:27] falls asleep -[1518-04-15 00:54] wakes up -[1518-04-06 00:42] falls asleep -[1518-02-08 00:41] wakes up -[1518-11-11 00:59] wakes up -[1518-11-09 00:46] wakes up -[1518-06-15 00:29] falls asleep -[1518-05-25 00:44] wakes up -[1518-11-21 00:00] Guard #3203 begins shift -[1518-08-28 00:04] Guard #1163 begins shift -[1518-11-07 00:36] wakes up -[1518-04-22 00:16] falls asleep -[1518-07-19 00:31] falls asleep -[1518-05-04 23:48] Guard #1663 begins shift -[1518-10-31 00:24] falls asleep -[1518-11-07 00:54] wakes up -[1518-06-18 00:04] Guard #859 begins shift -[1518-06-26 00:38] falls asleep -[1518-07-12 00:46] wakes up -[1518-09-14 00:15] wakes up -[1518-09-03 00:47] wakes up -[1518-05-26 00:41] wakes up -[1518-03-17 00:56] wakes up -[1518-10-25 00:47] falls asleep -[1518-04-08 00:34] falls asleep -[1518-05-10 00:44] falls asleep -[1518-04-17 00:50] wakes up -[1518-06-29 00:39] falls asleep -[1518-04-19 00:59] wakes up -[1518-11-07 00:35] falls asleep -[1518-06-18 00:07] falls asleep -[1518-09-26 00:30] falls asleep -[1518-10-12 00:31] falls asleep -[1518-09-10 00:59] wakes up -[1518-07-27 00:53] wakes up -[1518-08-05 00:00] falls asleep -[1518-10-28 00:53] wakes up -[1518-05-19 00:00] Guard #997 begins shift -[1518-06-27 00:50] wakes up -[1518-10-17 00:28] falls asleep -[1518-05-11 00:45] wakes up -[1518-03-18 00:07] falls asleep -[1518-04-03 00:50] wakes up -[1518-04-21 00:04] Guard #113 begins shift -[1518-07-24 00:50] wakes up -[1518-09-13 00:41] falls asleep -[1518-06-19 00:30] wakes up -[1518-09-14 00:43] falls asleep -[1518-06-24 00:56] wakes up -[1518-07-12 00:28] falls asleep -[1518-04-21 00:33] wakes up -[1518-08-31 00:00] Guard #739 begins shift -[1518-05-15 00:55] wakes up -[1518-06-09 00:39] falls asleep -[1518-03-12 00:03] Guard #997 begins shift -[1518-04-15 00:16] falls asleep -[1518-09-07 00:26] falls asleep -[1518-03-26 00:21] wakes up -[1518-06-26 00:40] wakes up -[1518-02-05 00:02] Guard #1663 begins shift -[1518-04-13 00:06] falls asleep -[1518-04-24 23:59] Guard #733 begins shift -[1518-02-09 23:59] Guard #419 begins shift -[1518-08-28 00:58] wakes up -[1518-03-16 00:58] wakes up -[1518-11-13 00:19] falls asleep -[1518-03-13 00:54] wakes up -[1518-04-12 00:46] falls asleep -[1518-03-04 00:17] falls asleep -[1518-04-10 00:40] falls asleep -[1518-05-11 00:01] Guard #1367 begins shift -[1518-04-09 00:42] wakes up -[1518-03-29 00:53] wakes up -[1518-02-27 00:01] Guard #859 begins shift -[1518-08-13 00:52] falls asleep -[1518-09-22 00:43] falls asleep -[1518-05-13 00:19] falls asleep -[1518-05-14 00:06] falls asleep -[1518-08-05 00:18] wakes up -[1518-11-10 00:41] falls asleep -[1518-09-10 00:43] falls asleep -[1518-03-02 00:44] falls asleep -[1518-04-16 23:57] Guard #1163 begins shift -[1518-09-09 00:43] falls asleep -[1518-02-09 00:01] Guard #997 begins shift -[1518-09-13 00:35] falls asleep -[1518-09-08 00:04] Guard #3407 begins shift -[1518-08-02 00:14] falls asleep -[1518-11-07 00:02] Guard #2113 begins shift -[1518-06-13 23:57] Guard #661 begins shift -[1518-04-29 00:57] wakes up -[1518-11-04 00:56] falls asleep -[1518-08-03 00:54] wakes up -[1518-06-29 00:17] falls asleep -[1518-07-15 00:37] wakes up -[1518-06-14 23:58] Guard #2221 begins shift -[1518-02-11 00:41] falls asleep -[1518-10-24 23:56] Guard #739 begins shift -[1518-06-12 23:56] Guard #1663 begins shift -[1518-02-23 23:51] Guard #2113 begins shift -[1518-05-09 00:24] falls asleep -[1518-09-21 00:22] wakes up -[1518-02-11 00:38] wakes up -[1518-07-23 00:54] falls asleep -[1518-03-10 23:59] Guard #661 begins shift -[1518-03-03 00:03] falls asleep -[1518-06-08 00:41] wakes up -[1518-02-05 00:12] falls asleep -[1518-09-23 00:51] wakes up -[1518-05-02 00:39] wakes up -[1518-07-06 00:06] falls asleep -[1518-03-27 23:57] Guard #2221 begins shift -[1518-04-29 00:00] Guard #661 begins shift -[1518-05-05 00:22] wakes up -[1518-09-12 00:38] wakes up -[1518-04-28 00:48] falls asleep -[1518-10-08 00:58] wakes up -[1518-08-22 00:55] falls asleep -[1518-10-22 00:52] falls asleep -[1518-07-15 00:56] wakes up -[1518-08-15 23:57] Guard #859 begins shift -[1518-05-19 23:53] Guard #3407 begins shift -[1518-11-03 00:03] Guard #2713 begins shift -[1518-10-02 00:01] Guard #859 begins shift -[1518-03-08 00:13] falls asleep -[1518-03-15 00:02] Guard #859 begins shift -[1518-05-01 00:55] wakes up -[1518-07-25 00:41] falls asleep -[1518-05-24 00:24] falls asleep -[1518-05-03 00:58] wakes up -[1518-04-11 00:32] falls asleep -[1518-09-24 23:54] Guard #2383 begins shift -[1518-10-24 00:23] falls asleep -[1518-06-24 00:28] falls asleep -[1518-08-04 00:59] wakes up -[1518-10-21 00:19] wakes up -[1518-03-21 00:04] Guard #661 begins shift -[1518-06-18 00:15] wakes up -[1518-09-29 00:09] falls asleep -[1518-05-26 00:20] falls asleep -[1518-10-20 00:04] falls asleep -[1518-09-29 00:19] wakes up -[1518-08-10 00:03] falls asleep -[1518-08-03 00:03] falls asleep -[1518-07-14 00:41] falls asleep -[1518-09-26 00:13] wakes up -[1518-02-21 00:05] falls asleep -[1518-08-21 00:14] falls asleep -[1518-04-27 00:46] wakes up -[1518-06-11 23:57] Guard #3203 begins shift -[1518-04-26 00:18] wakes up -[1518-02-24 00:02] falls asleep -[1518-09-13 00:21] falls asleep -[1518-07-06 00:18] wakes up -[1518-08-08 00:38] falls asleep -[1518-03-23 00:37] falls asleep -[1518-08-05 00:32] falls asleep -[1518-05-12 00:51] falls asleep -[1518-05-28 00:58] wakes up -[1518-02-15 00:24] wakes up -[1518-02-17 00:30] falls asleep -[1518-08-11 00:58] wakes up -[1518-04-26 00:09] falls asleep -[1518-06-20 00:58] wakes up -[1518-08-09 00:36] falls asleep -[1518-04-25 00:19] wakes up -[1518-02-28 00:58] wakes up -[1518-04-18 00:06] falls asleep -[1518-03-08 00:53] wakes up -[1518-09-13 00:36] wakes up -[1518-04-10 00:01] Guard #3391 begins shift -[1518-11-15 00:48] wakes up -[1518-09-24 00:43] wakes up -[1518-05-15 00:14] wakes up -[1518-07-14 00:59] wakes up -[1518-06-28 23:57] Guard #733 begins shift -[1518-09-13 00:25] wakes up -[1518-07-26 23:56] Guard #3203 begins shift -[1518-05-28 00:47] wakes up -[1518-11-09 00:03] Guard #3391 begins shift -[1518-07-01 00:52] wakes up -[1518-10-07 00:04] Guard #661 begins shift -[1518-11-05 00:59] wakes up -[1518-06-15 00:45] wakes up -[1518-09-02 00:40] wakes up -[1518-06-05 00:00] Guard #419 begins shift -[1518-02-04 00:57] wakes up -[1518-07-10 00:30] falls asleep -[1518-05-14 00:04] Guard #61 begins shift -[1518-06-06 00:00] Guard #3203 begins shift -[1518-11-22 00:04] Guard #2713 begins shift -[1518-02-11 00:55] wakes up -[1518-08-15 00:47] wakes up -[1518-10-03 00:02] Guard #2383 begins shift -[1518-06-02 00:57] wakes up -[1518-04-01 00:37] wakes up -[1518-06-29 23:58] Guard #859 begins shift -[1518-11-22 00:38] falls asleep -[1518-04-13 00:00] Guard #2609 begins shift -[1518-07-07 00:48] wakes up -[1518-10-29 00:54] wakes up -[1518-02-26 00:59] wakes up -[1518-10-18 00:04] Guard #1367 begins shift -[1518-04-11 00:58] wakes up -[1518-10-27 23:59] Guard #1663 begins shift -[1518-09-12 00:11] falls asleep -[1518-06-21 00:55] wakes up -[1518-06-16 00:00] Guard #2113 begins shift -[1518-05-19 00:48] wakes up -[1518-08-31 00:23] wakes up -[1518-10-14 00:59] wakes up -[1518-02-17 00:04] Guard #2221 begins shift -[1518-11-16 00:58] wakes up -[1518-07-08 00:31] wakes up -[1518-05-04 00:46] falls asleep -[1518-08-02 00:57] wakes up -[1518-03-25 00:00] Guard #3407 begins shift -[1518-07-29 00:37] falls asleep -[1518-07-10 00:04] Guard #3203 begins shift -[1518-07-26 00:32] wakes up -[1518-10-19 00:57] falls asleep -[1518-10-22 23:50] Guard #113 begins shift -[1518-11-05 00:02] Guard #661 begins shift -[1518-03-20 00:38] falls asleep -[1518-05-24 00:51] wakes up -[1518-03-07 00:32] wakes up -[1518-10-03 00:45] falls asleep -[1518-08-15 00:01] Guard #859 begins shift -[1518-10-29 00:03] Guard #2221 begins shift -[1518-11-12 00:00] falls asleep -[1518-11-22 23:58] Guard #733 begins shift -[1518-06-18 00:42] falls asleep -[1518-10-18 00:58] wakes up -[1518-02-19 00:00] Guard #419 begins shift -[1518-03-26 00:19] falls asleep -[1518-03-14 00:49] falls asleep -[1518-09-05 23:47] Guard #419 begins shift -[1518-09-03 00:57] falls asleep -[1518-08-06 00:00] Guard #661 begins shift -[1518-09-24 00:41] falls asleep -[1518-09-15 00:55] wakes up -[1518-10-15 00:50] wakes up -[1518-05-28 00:35] falls asleep -[1518-02-11 00:32] falls asleep -[1518-06-19 00:36] falls asleep -[1518-02-25 00:06] falls asleep -[1518-04-20 00:50] wakes up -[1518-02-17 00:54] wakes up -[1518-05-29 00:00] Guard #2609 begins shift -[1518-07-26 00:00] Guard #2383 begins shift -[1518-08-14 00:11] falls asleep -[1518-08-01 00:00] Guard #2297 begins shift -[1518-04-04 00:41] wakes up -[1518-06-10 00:55] wakes up -[1518-03-19 00:05] falls asleep -[1518-06-11 00:30] falls asleep -[1518-03-31 00:20] falls asleep -[1518-07-13 00:52] wakes up -[1518-08-29 00:11] falls asleep -[1518-05-16 00:42] wakes up -[1518-11-05 00:36] wakes up -[1518-10-22 00:40] wakes up -[1518-09-06 00:01] falls asleep -[1518-09-20 00:42] falls asleep -[1518-11-07 00:48] falls asleep -[1518-07-31 00:59] wakes up -[1518-04-19 00:30] wakes up -[1518-05-12 23:56] Guard #997 begins shift -[1518-03-04 00:53] wakes up -[1518-10-07 00:06] falls asleep -[1518-08-28 00:27] falls asleep -[1518-05-16 00:17] falls asleep -[1518-10-23 00:04] falls asleep -[1518-07-08 00:57] wakes up -[1518-06-14 00:50] wakes up -[1518-04-13 00:46] wakes up -[1518-04-05 23:50] Guard #419 begins shift -[1518-10-25 00:43] wakes up -[1518-04-08 00:18] wakes up -[1518-05-12 00:29] wakes up -[1518-03-28 23:56] Guard #2609 begins shift -[1518-09-13 00:56] wakes up -[1518-03-08 00:48] falls asleep -[1518-02-12 00:32] falls asleep -[1518-10-15 00:02] Guard #2297 begins shift -[1518-07-26 00:38] falls asleep -[1518-04-06 23:47] Guard #2383 begins shift -[1518-10-03 00:40] wakes up -[1518-07-23 00:58] wakes up -[1518-03-17 00:02] Guard #1367 begins shift -[1518-06-30 00:47] falls asleep -[1518-09-06 00:24] falls asleep -[1518-05-04 00:54] wakes up -[1518-04-19 00:39] wakes up -[1518-07-15 00:10] falls asleep -[1518-07-26 00:28] falls asleep -[1518-07-21 00:24] falls asleep -[1518-08-09 23:54] Guard #739 begins shift -[1518-02-21 00:45] falls asleep -[1518-03-10 00:53] wakes up -[1518-06-13 00:09] falls asleep -[1518-08-06 00:47] falls asleep -[1518-10-31 00:53] wakes up -[1518-08-23 23:51] Guard #739 begins shift -[1518-03-13 00:03] Guard #3203 begins shift -[1518-06-02 00:14] falls asleep -[1518-10-20 00:38] falls asleep -[1518-08-25 00:43] falls asleep -[1518-08-31 23:53] Guard #733 begins shift -[1518-04-30 00:17] falls asleep -[1518-08-06 00:12] falls asleep -[1518-11-06 00:02] Guard #739 begins shift -[1518-07-02 00:56] wakes up -[1518-05-29 00:18] falls asleep -[1518-02-14 00:57] wakes up -[1518-03-13 00:52] falls asleep -[1518-09-26 23:49] Guard #2713 begins shift -[1518-05-19 00:37] falls asleep -[1518-08-30 00:26] falls asleep -[1518-05-30 00:08] falls asleep -[1518-09-01 00:54] wakes up -[1518-11-04 00:47] wakes up -[1518-06-04 00:26] wakes up -[1518-08-10 00:48] falls asleep -[1518-04-11 00:02] Guard #2221 begins shift -[1518-07-11 23:57] Guard #61 begins shift -[1518-07-20 00:45] wakes up -[1518-04-03 23:59] Guard #3391 begins shift -[1518-11-08 00:56] wakes up -[1518-08-04 00:56] falls asleep -[1518-09-19 00:43] wakes up -[1518-02-12 00:00] Guard #61 begins shift -[1518-07-06 23:50] Guard #661 begins shift -[1518-06-07 00:20] falls asleep -[1518-08-08 00:02] Guard #997 begins shift -[1518-07-21 00:47] wakes up -[1518-11-15 00:02] Guard #1163 begins shift -[1518-04-30 00:58] wakes up -[1518-08-06 00:19] wakes up -[1518-03-08 23:50] Guard #61 begins shift -[1518-07-08 23:59] Guard #2609 begins shift -[1518-08-22 00:01] Guard #2383 begins shift -[1518-06-30 00:55] wakes up -[1518-06-19 00:25] falls asleep -[1518-05-05 00:03] falls asleep -[1518-09-12 23:56] Guard #2609 begins shift -[1518-07-03 00:43] wakes up -[1518-07-18 00:25] wakes up -[1518-07-16 23:57] Guard #941 begins shift -[1518-11-21 00:20] falls asleep -[1518-11-04 00:59] wakes up -[1518-07-27 00:31] falls asleep -[1518-10-12 00:43] falls asleep -[1518-03-22 00:04] Guard #997 begins shift -[1518-03-05 00:03] Guard #1663 begins shift -[1518-06-27 00:53] falls asleep -[1518-08-22 00:45] falls asleep -[1518-07-08 00:00] Guard #1367 begins shift -[1518-06-01 00:14] falls asleep -[1518-02-25 00:01] Guard #1163 begins shift -[1518-09-22 00:15] falls asleep -[1518-05-03 00:03] falls asleep -[1518-09-22 00:02] falls asleep -[1518-09-21 00:54] wakes up -[1518-06-21 00:00] Guard #859 begins shift -[1518-06-28 00:59] wakes up -[1518-03-19 00:21] wakes up -[1518-08-31 00:38] wakes up -[1518-09-26 00:49] wakes up -[1518-11-19 00:36] wakes up -[1518-02-28 00:02] Guard #3391 begins shift -[1518-02-12 00:58] wakes up -[1518-11-08 00:31] falls asleep -[1518-04-17 00:41] falls asleep -[1518-10-11 00:02] Guard #2113 begins shift -[1518-08-03 00:41] falls asleep -[1518-06-13 00:43] falls asleep -[1518-03-28 00:50] falls asleep -[1518-10-21 00:53] wakes up -[1518-04-21 00:48] falls asleep -[1518-02-16 00:56] wakes up -[1518-03-09 00:27] falls asleep -[1518-08-04 00:13] falls asleep -[1518-02-17 00:47] falls asleep -[1518-06-10 23:57] Guard #1163 begins shift -[1518-10-11 00:49] falls asleep -[1518-08-01 00:17] wakes up -[1518-02-20 23:52] Guard #3407 begins shift -[1518-03-09 00:00] falls asleep -[1518-10-21 23:46] Guard #661 begins shift -[1518-02-19 00:29] falls asleep -[1518-08-23 00:36] falls asleep -[1518-06-16 00:11] falls asleep -[1518-08-26 00:52] wakes up -[1518-08-07 00:43] falls asleep -[1518-11-07 23:59] Guard #997 begins shift -[1518-11-18 00:10] falls asleep -[1518-07-23 00:34] falls asleep -[1518-03-30 00:59] wakes up -[1518-03-29 00:48] falls asleep -[1518-09-20 23:50] Guard #419 begins shift -[1518-06-06 23:57] Guard #1663 begins shift -[1518-08-13 00:00] Guard #2113 begins shift -[1518-04-28 00:04] Guard #739 begins shift -[1518-09-11 00:34] falls asleep -[1518-06-18 00:28] falls asleep -[1518-05-21 00:07] falls asleep -[1518-08-25 00:40] wakes up -[1518-08-20 00:48] falls asleep -[1518-09-30 00:00] Guard #3391 begins shift -[1518-08-02 00:56] falls asleep -[1518-08-13 00:57] wakes up -[1518-05-23 00:00] Guard #739 begins shift -[1518-05-04 00:38] wakes up -[1518-08-04 00:45] wakes up -[1518-02-15 00:00] Guard #3391 begins shift -[1518-08-13 23:58] Guard #1663 begins shift -[1518-06-04 00:55] wakes up -[1518-04-08 00:04] falls asleep -[1518-06-28 00:57] falls asleep -[1518-08-09 00:44] wakes up -[1518-06-25 00:38] wakes up -[1518-03-03 00:48] falls asleep -[1518-05-02 00:43] falls asleep -[1518-10-10 00:51] falls asleep -[1518-11-04 00:43] falls asleep -[1518-08-10 00:45] wakes up -[1518-09-27 00:58] wakes up -[1518-04-17 23:58] Guard #3203 begins shift -[1518-07-04 00:34] falls asleep -[1518-03-14 00:42] wakes up -[1518-10-12 00:39] wakes up -[1518-08-16 00:49] wakes up -[1518-10-19 23:54] Guard #997 begins shift -[1518-05-17 00:00] Guard #2383 begins shift -[1518-03-03 00:54] wakes up -[1518-09-27 00:57] falls asleep -[1518-03-30 00:41] falls asleep -[1518-11-06 00:57] wakes up -[1518-09-14 00:00] falls asleep -[1518-09-28 00:16] falls asleep -[1518-09-14 00:44] wakes up -[1518-05-08 23:58] Guard #1163 begins shift -[1518-09-12 00:02] Guard #859 begins shift -[1518-08-11 00:15] falls asleep -[1518-10-09 23:56] Guard #2221 begins shift -[1518-05-01 23:53] Guard #733 begins shift -[1518-07-19 00:52] wakes up -[1518-11-22 00:59] wakes up -[1518-11-23 00:28] falls asleep -[1518-08-15 00:37] falls asleep -[1518-05-02 00:52] wakes up -[1518-06-25 23:58] Guard #2609 begins shift -[1518-07-06 00:16] falls asleep -[1518-05-30 00:03] Guard #997 begins shift -[1518-03-06 00:20] falls asleep -[1518-09-22 00:51] wakes up -[1518-11-08 00:42] wakes up -[1518-07-24 23:56] Guard #739 begins shift -[1518-06-11 00:37] wakes up -[1518-04-15 00:49] falls asleep -[1518-07-26 00:57] wakes up -[1518-02-19 23:50] Guard #2221 begins shift -[1518-05-03 00:29] wakes up -[1518-04-15 00:36] wakes up -[1518-03-26 00:04] Guard #1163 begins shift -[1518-10-18 00:15] falls asleep -[1518-04-23 23:59] Guard #3391 begins shift -[1518-06-28 00:35] wakes up -[1518-05-04 00:37] falls asleep -[1518-10-14 00:00] Guard #997 begins shift -[1518-07-18 00:44] wakes up -[1518-04-03 00:04] falls asleep -[1518-04-13 00:36] wakes up -[1518-06-09 00:01] Guard #739 begins shift -[1518-03-13 00:38] falls asleep -[1518-06-08 00:57] falls asleep -[1518-04-21 00:10] falls asleep -[1518-08-04 00:04] Guard #859 begins shift -[1518-03-02 00:58] wakes up -[1518-06-15 00:34] wakes up -[1518-02-06 00:50] wakes up -[1518-11-20 00:43] wakes up -[1518-11-15 23:57] Guard #859 begins shift -[1518-07-26 00:23] wakes up -[1518-05-24 00:02] Guard #3391 begins shift -[1518-07-18 00:22] falls asleep -[1518-04-25 00:31] falls asleep -[1518-08-27 00:49] falls asleep -[1518-07-21 23:58] Guard #349 begins shift -[1518-06-10 00:54] falls asleep -[1518-09-17 00:04] Guard #733 begins shift -[1518-06-20 00:39] falls asleep -[1518-03-23 00:01] Guard #2297 begins shift -[1518-05-21 00:59] wakes up -[1518-09-24 00:17] falls asleep -[1518-06-23 00:12] falls asleep -[1518-05-20 00:03] falls asleep -[1518-09-26 00:03] falls asleep -[1518-05-31 00:37] falls asleep -[1518-06-30 23:59] Guard #739 begins shift -[1518-07-07 00:05] falls asleep -[1518-04-19 00:17] falls asleep -[1518-03-13 00:44] wakes up -[1518-09-03 00:00] Guard #661 begins shift -[1518-02-15 23:49] Guard #739 begins shift -[1518-04-07 00:05] falls asleep -[1518-02-26 00:01] Guard #661 begins shift -[1518-11-17 23:57] Guard #859 begins shift -[1518-08-22 00:47] wakes up -[1518-09-23 00:16] falls asleep -[1518-07-21 00:40] falls asleep -[1518-03-31 00:00] Guard #1663 begins shift -[1518-08-01 00:10] falls asleep -[1518-09-30 00:52] wakes up -[1518-04-14 00:08] falls asleep -[1518-02-06 23:56] Guard #859 begins shift -[1518-04-16 00:27] wakes up -[1518-05-22 00:29] falls asleep -[1518-11-01 00:31] falls asleep -[1518-09-28 00:39] wakes up -[1518-05-22 00:30] wakes up -[1518-10-03 00:55] wakes up -[1518-06-21 23:56] Guard #907 begins shift -[1518-05-28 00:57] falls asleep -[1518-06-06 00:40] falls asleep -[1518-08-23 00:59] wakes up -[1518-05-20 00:47] wakes up -[1518-03-12 00:31] falls asleep -[1518-07-12 00:56] wakes up -[1518-08-03 00:25] wakes up -[1518-05-08 00:04] Guard #419 begins shift -[1518-10-09 00:00] Guard #419 begins shift -[1518-10-30 00:04] Guard #733 begins shift -[1518-02-09 00:37] falls asleep -[1518-03-17 23:59] Guard #2297 begins shift -[1518-02-21 00:08] wakes up -[1518-05-10 00:47] wakes up -[1518-11-20 00:01] falls asleep -[1518-07-06 00:02] Guard #113 begins shift -[1518-06-14 00:34] falls asleep -[1518-09-11 00:39] wakes up -[1518-05-27 00:27] wakes up -[1518-04-07 00:36] wakes up -[1518-03-27 00:03] Guard #907 begins shift -[1518-07-18 00:42] falls asleep -[1518-11-17 00:00] Guard #3407 begins shift -[1518-04-11 00:06] falls asleep -[1518-06-07 00:59] wakes up -[1518-05-04 00:01] Guard #1663 begins shift -[1518-05-03 00:47] wakes up -[1518-10-06 00:51] wakes up -[1518-03-12 00:57] wakes up -[1518-03-23 00:23] falls asleep -[1518-03-02 23:48] Guard #3391 begins shift -[1518-05-14 23:52] Guard #733 begins shift -[1518-08-15 00:55] wakes up -[1518-08-14 00:54] wakes up -[1518-06-08 00:30] falls asleep -[1518-02-18 00:58] wakes up -[1518-11-03 00:58] wakes up -[1518-06-17 00:00] Guard #2221 begins shift -[1518-04-05 00:14] falls asleep -[1518-08-29 00:01] falls asleep -[1518-05-14 00:13] wakes up -[1518-10-25 00:50] wakes up -[1518-06-24 00:03] Guard #739 begins shift -[1518-10-26 00:54] wakes up -[1518-08-17 00:14] falls asleep -[1518-10-04 00:03] Guard #3407 begins shift -[1518-06-05 00:30] wakes up -[1518-06-09 23:59] Guard #2221 begins shift -[1518-09-19 00:59] wakes up -[1518-10-05 23:56] Guard #3203 begins shift -[1518-05-02 00:03] falls asleep -[1518-09-25 00:03] falls asleep -[1518-09-11 00:42] falls asleep -[1518-07-08 00:08] falls asleep -[1518-05-07 00:58] wakes up -[1518-07-24 00:58] wakes up -[1518-04-12 00:21] wakes up -[1518-10-29 00:29] falls asleep -[1518-07-28 23:56] Guard #3391 begins shift -[1518-07-16 00:23] falls asleep -[1518-06-04 00:00] Guard #2713 begins shift -[1518-08-29 00:07] wakes up -[1518-08-31 00:46] falls asleep -[1518-03-14 00:54] wakes up -[1518-09-29 00:04] Guard #2383 begins shift -[1518-08-07 00:56] wakes up -[1518-06-02 00:56] falls asleep -[1518-03-12 00:19] wakes up -[1518-04-28 00:52] wakes up -[1518-07-13 00:58] wakes up -[1518-04-08 23:57] Guard #3203 begins shift -[1518-04-05 00:49] wakes up -[1518-07-03 00:22] falls asleep -[1518-02-12 00:53] wakes up -[1518-09-24 00:03] Guard #733 begins shift -[1518-07-30 00:01] Guard #1163 begins shift -[1518-03-16 00:00] Guard #739 begins shift -[1518-08-18 00:50] wakes up -[1518-03-22 00:57] wakes up -[1518-06-02 00:04] Guard #3391 begins shift -[1518-09-01 00:02] falls asleep -[1518-09-11 00:49] wakes up -[1518-04-13 00:41] falls asleep -[1518-04-18 00:53] wakes up -[1518-03-21 00:38] wakes up -[1518-06-02 00:52] wakes up -[1518-07-18 23:59] Guard #733 begins shift -[1518-06-25 00:59] wakes up -[1518-04-07 23:54] Guard #2713 begins shift -[1518-06-28 00:14] falls asleep -[1518-03-04 00:04] Guard #1663 begins shift -[1518-05-27 00:04] falls asleep -[1518-10-08 00:31] falls asleep -[1518-11-05 00:16] falls asleep -[1518-05-14 00:53] falls asleep -[1518-10-04 00:47] wakes up -[1518-09-07 00:11] falls asleep -[1518-09-25 23:48] Guard #2297 begins shift -[1518-10-26 00:00] Guard #1663 begins shift -[1518-03-11 00:56] wakes up -[1518-08-28 23:49] Guard #1663 begins shift -[1518-08-31 00:47] wakes up -[1518-09-04 00:52] falls asleep -[1518-11-16 00:38] falls asleep -[1518-10-19 00:59] wakes up -[1518-10-19 00:23] falls asleep -[1518-05-01 00:23] falls asleep -[1518-05-15 23:56] Guard #3391 begins shift -[1518-07-01 00:07] falls asleep -[1518-07-30 00:52] falls asleep -[1518-05-12 00:27] falls asleep -[1518-04-04 00:07] falls asleep -[1518-06-09 00:58] wakes up -[1518-02-28 00:16] falls asleep -[1518-09-05 00:30] falls asleep -[1518-05-06 00:52] falls asleep -[1518-10-21 00:02] Guard #733 begins shift -[1518-07-30 00:56] wakes up -[1518-09-30 00:13] falls asleep -[1518-10-16 23:58] Guard #997 begins shift -[1518-05-26 00:03] Guard #61 begins shift -[1518-06-08 00:25] wakes up -[1518-07-11 00:01] Guard #1367 begins shift -[1518-07-15 00:02] Guard #61 begins shift -[1518-10-26 00:50] falls asleep -[1518-05-26 00:45] falls asleep -[1518-07-16 00:00] Guard #739 begins shift -[1518-09-18 00:04] Guard #3407 begins shift -[1518-03-22 00:53] falls asleep -[1518-06-25 00:16] falls asleep -[1518-06-27 23:59] Guard #2609 begins shift -[1518-09-16 00:41] falls asleep -[1518-08-20 00:58] wakes up -[1518-02-13 00:02] Guard #3407 begins shift -[1518-02-23 00:50] wakes up -[1518-05-28 00:00] Guard #61 begins shift -[1518-04-06 00:39] wakes up -[1518-11-21 00:42] wakes up -[1518-07-06 00:12] wakes up -[1518-08-11 00:00] Guard #2297 begins shift -[1518-06-04 00:18] falls asleep -[1518-09-07 00:49] wakes up -[1518-06-27 00:56] wakes up -[1518-09-25 00:38] wakes up -[1518-04-06 00:19] wakes up -[1518-09-21 00:02] falls asleep -[1518-03-15 00:38] wakes up -[1518-11-10 00:00] Guard #2297 begins shift -[1518-08-31 00:14] falls asleep -[1518-02-09 00:38] wakes up -[1518-10-22 00:01] falls asleep -[1518-06-11 00:52] wakes up -[1518-04-20 00:39] falls asleep -[1518-04-08 00:57] wakes up -[1518-05-17 23:50] Guard #733 begins shift -[1518-02-10 00:47] wakes up -[1518-09-23 00:00] Guard #1163 begins shift -[1518-10-04 00:22] falls asleep -[1518-02-08 00:09] falls asleep -[1518-10-16 00:44] falls asleep -[1518-07-01 23:59] Guard #1367 begins shift -[1518-10-16 00:50] wakes up -[1518-05-15 00:17] falls asleep -[1518-07-30 00:40] wakes up -[1518-10-16 00:28] falls asleep -[1518-04-06 00:37] falls asleep -[1518-03-08 00:23] wakes up -[1518-06-04 00:54] falls asleep -[1518-09-12 00:45] wakes up -[1518-03-15 00:12] falls asleep -[1518-05-23 00:22] falls asleep -[1518-07-28 00:00] Guard #907 begins shift -[1518-08-22 00:56] wakes up -[1518-08-24 00:33] falls asleep -[1518-04-22 00:00] Guard #739 begins shift -[1518-02-13 23:57] Guard #1367 begins shift -[1518-07-09 00:49] falls asleep -[1518-10-09 00:20] falls asleep -[1518-04-01 23:56] Guard #941 begins shift -[1518-10-16 00:00] Guard #113 begins shift -[1518-09-21 00:34] falls asleep -[1518-07-23 00:35] wakes up -[1518-03-01 00:12] falls asleep -[1518-02-03 23:50] Guard #661 begins shift -[1518-09-09 00:56] wakes up -[1518-03-07 00:22] falls asleep -[1518-08-21 00:53] wakes up -[1518-09-04 00:01] Guard #2297 begins shift -[1518-08-10 00:58] wakes up -[1518-07-03 23:56] Guard #3407 begins shift -[1518-08-26 00:42] falls asleep -[1518-11-13 23:56] Guard #907 begins shift -[1518-10-15 00:16] falls asleep -[1518-08-16 00:44] falls asleep -[1518-07-18 00:01] Guard #2609 begins shift -[1518-10-20 00:22] wakes up -[1518-10-24 00:01] Guard #2609 begins shift -[1518-04-28 00:55] falls asleep -[1518-02-11 00:00] Guard #1367 begins shift -[1518-06-19 00:39] wakes up -[1518-09-27 00:04] falls asleep -[1518-04-19 00:46] falls asleep -[1518-08-10 00:31] falls asleep -[1518-09-21 23:48] Guard #2713 begins shift -[1518-09-10 23:57] Guard #997 begins shift -[1518-10-13 00:55] falls asleep -[1518-08-20 23:59] Guard #3203 begins shift -[1518-06-27 00:33] falls asleep -[1518-05-10 00:00] Guard #739 begins shift -[1518-08-30 00:00] Guard #2609 begins shift -[1518-09-05 00:24] wakes up -[1518-09-11 00:58] wakes up -[1518-07-08 00:39] falls asleep -[1518-08-22 00:20] wakes up -[1518-07-29 00:43] wakes up -[1518-08-22 00:14] falls asleep -[1518-08-02 00:53] wakes up -[1518-11-17 00:24] falls asleep -[1518-03-25 00:11] falls asleep -[1518-03-06 00:48] wakes up -[1518-09-12 00:43] falls asleep -[1518-10-20 00:57] wakes up -[1518-04-04 23:57] Guard #733 begins shift -[1518-09-03 00:58] wakes up -[1518-09-16 00:59] wakes up -[1518-07-23 00:00] Guard #2113 begins shift -[1518-09-04 00:59] wakes up -[1518-09-11 00:53] falls asleep -[1518-04-08 00:54] falls asleep -[1518-08-07 00:03] Guard #859 begins shift -[1518-08-04 23:49] Guard #2297 begins shift -[1518-05-23 00:51] wakes up -[1518-11-01 23:58] Guard #907 begins shift -[1518-02-05 23:56] Guard #419 begins shift -[1518-08-17 00:01] Guard #3391 begins shift -[1518-09-27 23:58] Guard #3391 begins shift -[1518-03-16 00:35] falls asleep -[1518-08-17 23:57] Guard #113 begins shift -[1518-02-07 00:44] wakes up -[1518-08-18 00:24] falls asleep -[1518-11-01 00:00] Guard #661 begins shift -[1518-10-19 00:39] wakes up -[1518-08-24 23:59] Guard #997 begins shift -[1518-05-18 00:04] falls asleep -[1518-03-17 00:30] falls asleep -[1518-04-08 00:51] wakes up -[1518-08-24 00:53] wakes up -[1518-09-22 00:03] wakes up -[1518-06-08 00:59] wakes up -[1518-04-10 00:56] wakes up -[1518-05-22 00:01] Guard #2383 begins shift -[1518-06-01 00:00] Guard #661 begins shift -[1518-08-22 23:58] Guard #997 begins shift -[1518-03-22 00:42] wakes up -[1518-10-21 00:51] falls asleep -[1518-11-11 23:48] Guard #997 begins shift -[1518-05-01 00:00] Guard #1163 begins shift -[1518-05-20 23:56] Guard #3203 begins shift -[1518-10-04 00:37] falls asleep -[1518-08-24 00:00] falls asleep -[1518-09-18 00:25] falls asleep -[1518-10-13 00:49] wakes up -[1518-11-23 00:53] wakes up -[1518-04-20 00:00] falls asleep -[1518-10-06 00:12] falls asleep -[1518-08-27 00:42] wakes up -[1518-09-24 00:54] falls asleep -[1518-06-25 00:00] Guard #2713 begins shift -[1518-07-30 00:29] falls asleep -[1518-10-13 00:10] falls asleep -[1518-09-22 00:18] wakes up -[1518-03-06 00:00] Guard #2113 begins shift -[1518-05-17 00:22] falls asleep -[1518-02-17 23:50] Guard #2297 begins shift -[1518-04-24 00:26] falls asleep -[1518-07-26 00:21] falls asleep -[1518-03-25 00:27] wakes up -[1518-06-07 00:52] falls asleep -[1518-04-16 00:23] falls asleep -[1518-11-01 00:41] wakes up -[1518-06-29 00:23] wakes up -[1518-08-01 00:40] wakes up -[1518-07-06 00:42] wakes up -[1518-08-13 00:18] falls asleep -[1518-06-13 00:50] wakes up -[1518-09-15 00:38] falls asleep -[1518-10-05 00:46] falls asleep -[1518-10-05 00:00] Guard #3407 begins shift -[1518-06-01 00:55] wakes up -[1518-09-04 00:35] falls asleep -[1518-09-24 00:59] wakes up -[1518-09-24 00:33] wakes up -[1518-02-04 00:01] falls asleep -[1518-02-23 00:07] falls asleep -[1518-05-03 00:38] falls asleep -[1518-09-17 00:49] wakes up -[1518-03-20 00:52] wakes up -[1518-08-19 00:55] falls asleep -[1518-04-06 00:56] wakes up -[1518-05-30 00:56] wakes up -[1518-09-13 23:47] Guard #1663 begins shift -[1518-04-12 00:50] wakes up -[1518-06-08 00:04] Guard #1663 begins shift -[1518-04-12 00:09] falls asleep -[1518-05-31 00:34] wakes up -[1518-02-07 00:08] falls asleep -[1518-09-02 00:22] falls asleep -[1518-09-18 00:53] wakes up -[1518-07-11 00:13] falls asleep -[1518-04-25 00:56] wakes up -[1518-04-19 23:50] Guard #739 begins shift -[1518-03-12 00:18] falls asleep -[1518-08-07 00:45] wakes up -[1518-03-14 00:29] falls asleep -[1518-10-30 00:45] falls asleep -[1518-06-20 00:00] Guard #997 begins shift -[1518-06-21 00:07] falls asleep -[1518-03-05 00:13] falls asleep -[1518-04-15 23:58] Guard #2383 begins shift -[1518-10-27 00:25] falls asleep -[1518-06-23 00:51] wakes up -[1518-07-21 00:00] Guard #2221 begins shift -[1518-10-01 00:33] wakes up -[1518-04-24 00:44] wakes up -[1518-03-21 00:27] falls asleep -[1518-02-22 00:08] falls asleep -[1518-10-05 00:47] wakes up -[1518-03-23 00:40] wakes up -[1518-11-19 00:15] falls asleep -[1518-02-21 23:57] Guard #2297 begins shift -[1518-09-08 00:40] wakes up -[1518-11-05 00:47] falls asleep -[1518-02-24 00:59] wakes up -[1518-11-06 00:12] falls asleep -[1518-10-28 00:23] falls asleep -[1518-09-20 00:04] Guard #2713 begins shift -[1518-11-15 00:33] falls asleep -[1518-09-05 00:50] wakes up -[1518-06-17 00:59] wakes up -[1518-06-08 00:08] wakes up -[1518-02-18 00:04] falls asleep -[1518-08-13 00:41] wakes up -[1518-09-19 00:21] falls asleep -[1518-11-13 00:58] wakes up -[1518-08-31 00:36] falls asleep -[1518-07-02 00:53] falls asleep -[1518-08-23 00:41] wakes up -[1518-09-14 23:57] Guard #2713 begins shift -[1518-07-24 00:44] falls asleep -[1518-02-13 00:51] wakes up -[1518-06-18 23:59] Guard #61 begins shift -[1518-08-02 00:03] Guard #1367 begins shift -[1518-06-15 00:38] falls asleep -[1518-10-01 00:02] falls asleep -[1518-10-16 00:39] wakes up -[1518-10-11 00:50] wakes up -[1518-07-02 00:25] falls asleep -[1518-02-17 00:39] wakes up -[1518-07-11 00:20] wakes up -[1518-06-23 00:04] Guard #1367 begins shift -[1518-11-11 00:27] falls asleep -[1518-10-18 00:47] wakes up -[1518-03-10 00:01] Guard #997 begins shift -[1518-05-30 23:56] Guard #997 begins shift -[1518-07-09 00:24] falls asleep -[1518-02-28 23:57] Guard #859 begins shift -[1518-05-08 00:29] wakes up -[1518-03-08 00:41] wakes up -[1518-08-25 00:57] wakes up -[1518-11-03 00:56] falls asleep -[1518-05-06 00:01] Guard #733 begins shift -[1518-11-19 23:50] Guard #3203 begins shift -[1518-06-03 00:56] wakes up -[1518-10-18 00:57] falls asleep -[1518-11-15 00:16] wakes up -[1518-07-12 00:54] falls asleep -[1518-09-19 00:57] falls asleep -[1518-03-31 00:58] wakes up -[1518-05-18 00:57] wakes up -[1518-10-19 00:03] Guard #419 begins shift -[1518-04-25 00:42] falls asleep -[1518-11-10 00:59] wakes up -[1518-05-14 00:57] wakes up -[1518-07-31 00:16] falls asleep -[1518-11-04 00:02] Guard #1367 begins shift -[1518-07-02 23:59] Guard #661 begins shift -[1518-06-27 00:04] Guard #661 begins shift -[1518-02-06 00:18] falls asleep -[1518-04-29 00:37] falls asleep -[1518-05-29 00:40] wakes up -[1518-08-25 00:35] falls asleep -[1518-06-12 00:29] wakes up -[1518-08-09 00:02] Guard #2297 begins shift -[1518-06-25 00:53] falls asleep -[1518-03-29 00:42] wakes up -[1518-03-22 00:37] falls asleep -[1518-02-14 00:34] wakes up -[1518-02-12 00:52] falls asleep -[1518-08-06 00:53] wakes up -[1518-09-02 00:00] Guard #3407 begins shift -[1518-10-02 00:34] wakes up -[1518-10-27 00:01] Guard #1663 begins shift -[1518-09-16 00:01] Guard #859 begins shift -[1518-10-07 00:34] wakes up -[1518-03-05 00:48] wakes up -[1518-03-24 00:21] falls asleep -[1518-03-10 00:24] falls asleep -[1518-10-03 00:23] falls asleep -[1518-11-03 00:49] wakes up -[1518-07-15 00:53] falls asleep -[1518-10-09 00:35] wakes up -[1518-10-12 00:49] wakes up -[1518-03-01 23:57] Guard #3407 begins shift -[1518-06-05 00:46] falls asleep -[1518-05-02 23:50] Guard #1163 begins shift -[1518-04-06 00:01] falls asleep -[1518-07-05 00:40] wakes up -[1518-05-26 23:53] Guard #113 begins shift -[1518-10-24 00:51] wakes up -[1518-10-29 00:09] falls asleep -[1518-03-07 23:57] Guard #859 begins shift -[1518-06-07 00:45] wakes up -[1518-03-01 00:16] wakes up -[1518-06-16 00:41] falls asleep -[1518-04-19 00:37] falls asleep -[1518-04-25 00:11] falls asleep -[1518-03-19 23:57] Guard #733 begins shift -[1518-11-15 00:13] falls asleep -[1518-10-13 00:00] Guard #733 begins shift -[1518-02-20 00:03] falls asleep -[1518-09-08 00:26] falls asleep -[1518-07-25 00:58] wakes up -[1518-04-23 00:03] Guard #349 begins shift -[1518-06-11 00:51] falls asleep -[1518-05-11 00:53] falls asleep -[1518-02-20 00:11] wakes up -[1518-10-29 00:16] wakes up -[1518-08-17 00:55] wakes up -[1518-08-01 00:35] falls asleep -[1518-05-26 00:52] wakes up -[1518-11-18 00:55] wakes up -[1518-02-12 00:57] falls asleep -[1518-02-15 00:12] falls asleep -[1518-09-06 00:44] wakes up -[1518-03-18 23:48] Guard #1163 begins shift -[1518-10-01 00:42] falls asleep -[1518-02-26 00:12] falls asleep -[1518-03-28 00:56] wakes up -[1518-06-06 00:46] wakes up -[1518-10-10 00:54] wakes up -[1518-11-18 23:59] Guard #419 begins shift -[1518-10-21 00:07] falls asleep -[1518-03-13 00:34] wakes up -[1518-04-21 00:55] wakes up -[1518-09-07 00:23] wakes up -[1518-03-09 00:46] wakes up -[1518-03-29 00:08] falls asleep -[1518-05-11 00:42] falls asleep -[1518-08-12 00:41] wakes up -[1518-08-05 00:39] wakes up -[1518-07-19 23:56] Guard #3391 begins shift -[1518-10-08 00:03] Guard #1367 begins shift -[1518-05-08 00:26] falls asleep -[1518-02-05 00:53] wakes up -[1518-03-11 00:10] falls asleep -[1518-05-06 00:59] wakes up -[1518-03-23 00:32] wakes up -[1518-08-19 00:59] wakes up -[1518-07-02 00:35] wakes up -[1518-10-04 00:33] wakes up -[1518-04-26 00:26] falls asleep -[1518-04-27 00:45] falls asleep -[1518-02-19 00:37] wakes up -[1518-07-12 23:58] Guard #2297 begins shift -[1518-09-19 00:02] Guard #1663 begins shift -[1518-08-23 00:47] falls asleep -[1518-03-03 00:28] wakes up -[1518-05-13 00:43] wakes up -[1518-09-10 00:04] Guard #859 begins shift -[1518-09-27 00:28] wakes up -[1518-04-11 23:56] Guard #739 begins shift -[1518-04-11 00:11] wakes up -[1518-05-31 00:44] wakes up -[1518-06-08 00:07] falls asleep -[1518-09-06 00:19] wakes up -[1518-08-02 23:50] Guard #419 begins shift -[1518-08-08 00:54] wakes up -[1518-08-19 00:06] falls asleep -[1518-10-14 00:57] falls asleep -[1518-08-27 00:01] falls asleep -[1518-08-24 00:07] wakes up -[1518-04-26 00:03] Guard #419 begins shift -[1518-08-27 00:58] wakes up -[1518-07-09 00:45] wakes up -[1518-07-20 00:18] falls asleep -[1518-07-06 00:38] falls asleep -[1518-04-22 00:39] wakes up -[1518-05-11 00:58] wakes up -[1518-07-04 00:50] wakes up -[1518-09-09 00:01] Guard #733 begins shift -[1518-07-09 00:54] wakes up -[1518-10-30 23:56] Guard #733 begins shift -[1518-11-13 00:00] Guard #3407 begins shift -[1518-04-27 00:00] Guard #739 begins shift -[1518-08-29 00:59] wakes up -[1518-10-14 00:43] wakes up -[1518-03-24 00:41] wakes up -[1518-06-05 00:34] falls asleep -[1518-05-07 00:37] falls asleep -[1518-04-13 23:57] Guard #733 begins shift -[1518-04-30 00:03] Guard #733 begins shift -[1518-07-05 00:01] Guard #419 begins shift -[1518-10-26 00:31] falls asleep -[1518-08-12 00:15] falls asleep -[1518-11-08 00:54] falls asleep -[1518-03-06 23:59] Guard #997 begins shift -[1518-06-18 00:55] wakes up -[1518-11-09 00:21] falls asleep -[1518-04-02 23:51] Guard #2113 begins shift -[1518-06-05 00:57] wakes up -[1518-08-11 23:57] Guard #997 begins shift -[1518-06-18 00:39] wakes up -[1518-11-12 00:46] wakes up -[1518-06-03 00:46] falls asleep -[1518-08-30 00:48] wakes up -[1518-06-02 23:58] Guard #859 begins shift -[1518-07-13 00:56] falls asleep -[1518-11-03 00:36] falls asleep -[1518-02-12 00:39] wakes up -[1518-04-09 00:14] falls asleep -[1518-07-10 00:34] wakes up -[1518-06-08 00:18] falls asleep -[1518-09-04 23:58] Guard #1663 begins shift -[1518-05-12 00:52] wakes up -[1518-09-30 23:48] Guard #3407 begins shift -[1518-08-10 00:17] wakes up -[1518-03-29 23:56] Guard #2221 begins shift -[1518-06-29 00:55] wakes up -[1518-09-10 00:57] falls asleep -[1518-04-01 00:02] falls asleep -[1518-07-13 00:34] falls asleep -[1518-06-17 00:15] falls asleep -[1518-04-19 00:00] Guard #997 begins shift -[1518-10-13 00:59] wakes up -[1518-10-26 00:46] wakes up -[1518-02-21 00:56] wakes up -[1518-04-25 00:37] wakes up -[1518-03-24 00:02] Guard #113 begins shift -[1518-04-26 00:49] wakes up -[1518-03-18 00:50] wakes up -[1518-03-08 00:37] falls asleep -[1518-08-15 00:50] falls asleep -[1518-03-25 00:42] wakes up -[1518-02-14 00:37] falls asleep -[1518-11-10 23:58] Guard #2221 begins shift -[1518-06-05 00:40] wakes up -[1518-07-21 00:34] wakes up -[1518-10-01 00:51] wakes up -[1518-09-17 00:48] falls asleep -[1518-05-17 00:54] wakes up -[1518-02-27 00:47] wakes up -[1518-09-03 00:19] falls asleep -[1518-06-16 00:58] wakes up -[1518-02-10 00:16] falls asleep -[1518-05-09 00:55] wakes up -[1518-07-31 00:01] Guard #1367 begins shift -[1518-09-05 00:11] falls asleep -[1518-02-25 00:51] wakes up -[1518-06-16 00:20] wakes up -[1518-04-20 00:01] wakes up -[1518-07-16 00:59] wakes up -[1518-10-22 00:53] wakes up -[1518-07-05 00:21] falls asleep -[1518-08-26 23:47] Guard #3407 begins shift -[1518-09-06 23:59] Guard #2297 begins shift -[1518-05-12 00:00] Guard #113 begins shift -[1518-06-13 00:35] wakes up -[1518-07-24 00:04] Guard #2221 begins shift -[1518-02-16 00:04] falls asleep -[1518-09-20 00:57] wakes up -[1518-10-25 00:38] falls asleep -[1518-03-13 00:18] falls asleep -[1518-05-25 00:26] falls asleep -[1518-02-22 00:53] wakes up -[1518-03-28 00:42] wakes up -[1518-02-23 00:04] Guard #419 begins shift -[1518-03-13 23:59] Guard #3407 begins shift -[1518-10-02 00:32] falls asleep -[1518-05-03 00:50] falls asleep -[1518-10-27 00:54] wakes up -[1518-02-08 00:00] Guard #2383 begins shift -[1518-03-25 00:35] falls asleep -[1518-08-19 00:40] wakes up -[1518-08-07 00:53] falls asleep -[1518-02-14 00:31] falls asleep -[1518-08-26 00:04] Guard #2383 begins shift -[1518-04-15 00:03] Guard #661 begins shift -[1518-02-27 00:09] falls asleep -[1518-09-04 00:41] wakes up -[1518-08-20 00:00] Guard #739 begins shift -[1518-03-31 23:53] Guard #419 begins shift -[1518-10-17 00:58] wakes up -[1518-07-24 00:56] falls asleep -[1518-10-23 00:24] wakes up -[1518-08-18 23:56] Guard #1163 begins shift -[1518-06-05 00:12] falls asleep -[1518-04-14 00:56] wakes up -[1518-07-14 00:00] Guard #2713 begins shift -[1518-04-28 00:57] wakes up -[1518-05-07 00:02] Guard #1367 begins shift -[1518-05-15 00:01] falls asleep -[1518-10-11 23:59] Guard #3391 begins shift -[1518-10-14 00:38] falls asleep -[1518-06-12 00:17] falls asleep -[1518-05-24 23:59] Guard #997 begins shift -[1518-11-17 00:53] wakes up -[1518-03-09 00:10] wakes up -[1518-03-28 00:17] falls asleep -[1518-10-30 00:50] wakes up -[1518-02-13 00:35] falls asleep -[1518-09-10 00:54] wakes up diff --git a/package.yaml b/package.yaml index 7f9cadc..9f42d6a 100644 --- a/package.yaml +++ b/package.yaml @@ -70,6 +70,7 @@ library: - safe - scientific - semirings + - time - transformers - unordered-containers - utility-ht @@ -276,6 +277,8 @@ executables: aoc-2018-day04: <<: *executable main: AdventOfCode.Year2018.Day04 + dependencies: + - time aoc-2018-day05: <<: *executable main: AdventOfCode.Year2018.Day05 diff --git a/src/AdventOfCode/Year2018/Day04.hs b/src/AdventOfCode/Year2018/Day04.hs index 204d503..d6f675e 100644 --- a/src/AdventOfCode/Year2018/Day04.hs +++ b/src/AdventOfCode/Year2018/Day04.hs @@ -1,4 +1,5 @@ {-# LANGUAGE TupleSections #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2018.Day04 ( main, @@ -7,65 +8,60 @@ module AdventOfCode.Year2018.Day04 ) where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (inputFilePath) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) import AdventOfCode.Util (frequencies) -import Control.Applicative ((<|>)) -import Control.Arrow (first) -import Data.List (maximumBy, sort) -import Data.Map (Map) -import Data.Map qualified as Map -import Data.Ord (comparing) -import Text.Trifecta (Parser, brackets, char, colon, many, natural, symbol, ()) - --- ------------------------------------------------------------------- [ Types ] - -data Time = Time - { _tYear :: Integer, - _tMonth :: Integer, - _tDay :: Integer, - _tHour :: Integer, - _tMinute :: Integer - } - deriving (Eq, Ord, Show) +import Data.List.Extra (maximumOn) +import Data.Map.Strict qualified as Map +import Data.Time (Day, LocalTime (..), TimeOfDay (..), fromGregorian) +import Relude hiding (guard) +import Text.Trifecta (Parser, brackets, char, colon, natural, symbol, ()) + +-- ------------------------------------------------------- [ Types and Parsers ] -time :: Parser Time +time :: Parser LocalTime time = - brackets - ( Time - <$> ((natural <* char '-') "year") - <*> ((natural <* char '-') "month") - <*> (natural "day") - <*> ((natural <* colon) "hour") - <*> (natural "minute") - ) + brackets (LocalTime <$> day <*> timeOfDay) "time" -newtype Guard = Guard {unGuard :: Integer} +day :: Parser Day +day = + fromGregorian + <$> ((natural <* char '-') "year") + <*> ((posInt <* char '-') "month") + <*> (posInt "day") + +timeOfDay :: Parser TimeOfDay +timeOfDay = + TimeOfDay + <$> ((posInt <* colon) "hour") + <*> (posInt "minute") + <*> pure 0 + +posInt :: Parser Int +posInt = fromInteger <$> natural + +newtype Guard = Guard {unGuard :: Int} deriving (Eq, Ord, Show) data Event - = Shift Guard + = Shift !Guard | Asleep | Awake deriving (Eq, Ord, Show) -shift :: Parser Event -shift = - Shift . Guard - <$> ( symbol "Guard" - *> char '#' - *> natural - <* symbol "begins shift" - ) - event :: Parser Event -event = - shift - <|> (Asleep <$ symbol "falls asleep") - <|> (Awake <$ symbol "wakes up") +event = shift <|> asleep <|> awake + where + shift = + Shift + . Guard + <$> (symbol "Guard" *> char '#' *> posInt <* symbol "begins shift") + asleep = Asleep <$ symbol "falls asleep" + awake = Awake <$ symbol "wakes up" -type Entry = (Time, Event) +type Entry = (LocalTime, Event) entry :: Parser Entry entry = (,) <$> time <*> event @@ -78,12 +74,12 @@ isShiftChange :: Entry -> Bool isShiftChange (_, Shift _) = True isShiftChange (_, _) = False -napTimes :: [Entry] -> [Integer] -napTimes ((from, Asleep) : (to, Awake) : rest) = - [_tMinute from .. _tMinute to - 1] ++ napTimes rest +napTimes :: [Entry] -> [Int] +napTimes ((LocalTime _ from, Asleep) : (LocalTime _ to, Awake) : rest) = + [todMin from .. todMin to - 1] ++ napTimes rest napTimes _ = [] -napsByGuard :: [Entry] -> Map Guard [[Integer]] +napsByGuard :: [Entry] -> Map Guard [[Int]] napsByGuard = fmap (map napTimes) . shifts shifts :: [Entry] -> TimeCards @@ -94,7 +90,7 @@ shifts = go Map.empty . sort in go (Map.insertWith (++) who [events] acc) rest go acc _ = acc -sleepiestGuard :: [Entry] -> Maybe (Int, (Guard, [[Integer]])) +sleepiestGuard :: [Entry] -> Maybe (Int, (Guard, [[Int]])) sleepiestGuard = Map.foldrWithKey go Nothing . napsByGuard where go a xxs Nothing = Just (sum (length <$> xxs), (a, xxs)) @@ -102,14 +98,14 @@ sleepiestGuard = Map.foldrWithKey go Nothing . napsByGuard let n = sum (length <$> xxs) in if n > m then Just (n, (a, xxs)) else old -sleepiestMinute :: [[Integer]] -> (Integer, Int) +sleepiestMinute :: [[Int]] -> (Int, Int) sleepiestMinute = - maximumBy (comparing snd) + maximumOn snd . Map.toList . frequencies . concat -mostConsistentSleeper :: [Entry] -> Maybe ((Guard, Integer), Int) +mostConsistentSleeper :: [Entry] -> Maybe ((Guard, Int), Int) mostConsistentSleeper = Map.foldrWithKey go Nothing . fmap (filter (not . null)) @@ -125,22 +121,18 @@ mostConsistentSleeper = -- ------------------------------------------------------------------- [ Parts ] -partOne :: [Entry] -> Maybe Integer -partOne entries = - case sleepiestGuard entries of - Just (_, (Guard gid, naps)) -> Just (gid * fst (sleepiestMinute naps)) - _ -> Nothing +partOne :: SimplePuzzle [Entry] Int +partOne = do + Just (_, (Guard gid, naps)) <- asks sleepiestGuard + pure (gid * fst (sleepiestMinute naps)) + +partTwo :: SimplePuzzle [Entry] Int +partTwo = do + Just ((Guard gid, minute), _) <- asks mostConsistentSleeper + pure (gid * minute) -partTwo :: [Entry] -> Maybe Integer -partTwo entries = - case mostConsistentSleeper entries of - Just ((Guard gid, minute), _) -> Just (gid * minute) - _ -> Nothing +getInput :: IO [Entry] +getInput = parseInputAoC 2018 4 (many entry) main :: IO () -main = do - input <- parseInput (many entry) $(inputFilePath) - putStr "Part One: " - putStrLn $ maybe "failed!" show (partOne input) - putStr "Part Two: " - putStrLn $ maybe "failed!" show (partTwo input) +main = $(evalPuzzle) From af9e1dd0dd03f6139300392292464ecd2ae9534d Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sat, 15 Nov 2025 22:23:03 -0600 Subject: [PATCH 28/91] refactor(2018.05-haskell): adopt advent-of-code-api and time --- VERSION | 2 +- input/2018/day05.txt | 1 - src/AdventOfCode/Year2018/Day05.hs | 32 ++++++++++++++---------------- 3 files changed, 16 insertions(+), 19 deletions(-) delete mode 100644 input/2018/day05.txt diff --git a/VERSION b/VERSION index ba625cc..79f6991 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.50 \ No newline at end of file +2024.7.2.51 \ No newline at end of file diff --git a/input/2018/day05.txt b/input/2018/day05.txt deleted file mode 100644 index e07f8cf..0000000 --- a/input/2018/day05.txt +++ /dev/null @@ -1 +0,0 @@ -HhrbBNnJjMDPpQqdmRKfFklVvLQmMqCcIzZdDiTtTtdBbQqDEWqQwrRBbbBelLlTtfFBbGDdJeEjgLtTYyjZzKABbayYdrRDkAaJeSsEFtdDTfFfRrAaxXRvVPpzZORrylLlLYZzornNzijWwJvVeEmSsMmlLMBbIBbxxaADLlZzdyYTtEeXigGfFKMmdDZzKkPpkSIiaAsXIiMhHmJjWwkyYKiIxIINnCcCcpCcyYwNnnNFZzaAfWwWDdEEeePVxXqQTZztssSSvPpPqQiVvIpRrsSiAlLaoOgGAEeanNYEeEexXEesSIiBboVvhHyYOHYyiIhiPpIjJyXKtTkMRrmnNgwsSBbWoOIZziAlLzTtrRZaRmUuPpMOoEefcCfFQqFCcrzVvBbZDtTdTtprRsxVvXSLluUjJzZtTBbZTtzLlPGqrohHOFQqfkKuWwUxXRQJXxgGssSSJjjzZWZVvrRzxXfFfFwIXxyYNnKkiXxHhrRHhfFxXrRqLlZzQUuuvVUQqZxQqhHNnpIiOoGPpgPXuUzrvVbVvBfFKkTtjJiIpkKnKkNGbBdDTzSNnsVkBbKvbBZrRHmMaAhtgmMtTfLlKkFfCcXxqQFXfGgBfLlFbCbBRsSrXxsSaAdDxXkKGgkjJUuKccCNbBnFYwWqQRCcqQEpPeryUuYyrRbBNnZzYyRrCcuUVvTtcCoOLlNnoOXRCcrjJxXxJjyYWJzCcZjQqwmMWSsMnNmMmLlNnndDVvMmToOtYzZvVyNwpPUlyiCcIYbBLueECcYyVvAamMbBCcViImMIdDrRiZzkGgkKdDiIKOoZzDxgGKkkKnNbBBbIibHhBvjJoOCcVeEaAhPplLmUuMWwiIiIBbedDoPpmMxfFXpPtNTgGtnTMKkmAtdDTdYyXxxXUIiudDpPDsSsEhHfRnNrzZOoFVmMvAtTGgaQqeSTtOoeERpPhiIHJjaAtTBblLFpPcChTtEeHEehmMFffFiBbVjvVJvIibBmzZCcMIoOHDdpPMQqvObkKBouUVmgGgGtTFdDOwWwZzfLlFrRaAErReWKOokQBbqVvqQzUuFffyYmMFfFEkKeXuUxJxXjZofzZlpPLhHkKaWwbAbBaBAiFfgGIxXHfFHhWwFfhEedhHZzDzaAZZiZLlzIDdzwWoZkKzAaAVvaAevVbBrjJRGgXxEvVYYQqynFAafNnNRrmTtMyFfqQaEejJKkGggGLVvQqGLlgRrlBbpPOYELaAQqWwWwleUuzZrRFaAfynrkKpCNncDZzlLdFfPiIRlkDdKmMNnrRLsrgGRjJSNfnNTZeEzZxXfFEevVXxbBXHhowhHWOxYyZMmzVvGXWwWwLsqlLQGHhfFHhwWglLCcXxOoFfpAqQaCcPXxYkKyGwWgsoOSStygGKkYbBJjXxKkKkTtTrGEegRiIgGOoswZzWSOoneENNnQqJPpjjfDdFSSssMmoOiIGXmMxFzZTtfvVSXxsSsgJLLzZlwWOvVpUuWwdDrRPuUopPaASgGsmMvVmiWAaLlwIEeOoUXxHBbTthuMnNbQqBbBqQZntDdTtTNUuKkDdzaRHhGgrAkUuQqdlLzZDWwhHvRZzrVpYySsnNPpPKFMiImfHhEqQPcCIiHhvVpeRrizUiakeEKNnAIBlwWqQLZzcFfCtDdRrTYERreyjJHhkiFxXfNnIHAgZzGOoAaahRkKfFrAeWwEoOLlaAEevVniIanNnNJjeEAslLSNxXEXxeVAozZqQOoJjOvHhVDPpdavzUuZamMukQGgqKjJXXxxXxxXerPpRiIzZXxEcCVSsvTtkKkKhjJpPHUufFiIFVvKvVkGBSNnskKbgNnJjfYiYoOEejWwzZJyDMmaghHPpUTQqvVvVAaOolLtQquUuGdCqQcpPjhnNJjHJlvUumMIiVLldYyDhHLZUuzBjJOsSUuojJbzZeEDlLkKLYyUunGgcCNvVlEsSeZpANnaVviIPkKePpEtTavRGepmMPEglLNAkKaFfEenAaidDLlAuyYUaIrDeeEEqQdEfFeNnExXeRrwzdDZNmMEeSsvVAoOeELlalqQWQlLqwMmLnEeWpPCuUxXcVXkKxVvJjWIMmRsSriTtWGpPgwwqtLlTQWDMmdsuUVMmbBdDvuULlbBLlDdnNCgGciALrTtUuwWRlvVdDapkKjJawJjWlYyLAEnUuNeCcaAuUPPpIIiRrsSVvGgGzZgxsSLeEvCCccVbEeBrRJjlHhMmykKJGMmvVgFLlGgEezZfkLlKjxUVvkKuXjJrRGgZKkziIKklLlLxXiIYmMdpHdDhPDEWwfFAaaAxXruEeqFfQURBpuUPbBHhunEvVeNUbfFrLlQlLqnRrlJjLsvVSnaAIXxitThYyHVvUudSsDzQqoAaOZMmEekSsvVwWXxKvyYbBpALlVCRUuCclLCcrkHhKkKWwmCBbcDdZztTFfffFFLlNFSslqQUUuuQqLoOlLZeEzfFfDdnEeVvJfIiFjaAMdmMXxDdIiIWwVMmlLvlLSsPpOJjoBbvVrHhMmqQvlLYyVTjJUuKkKXxkulLUxcCCciIXegGhRrHiafFtXxTtKkTlLdzXhHxZVvDZhHiITthHoOAacCjbBJLOoOooLlRrOXxlyYWwWGYymMMmgVvjIiJzZPpXfFuUxZzzZGgDjJdWBbwyYiIeEVvrRwrCcDdmPpMfFrrRrRRRHhrrRqKTtQqkcxXHhCjmMJNJjrRtAaTtTPWwpvxXVSFKkpcPpXaWwHhRrNnKRrkAhHxqyYQsSiInxXQtTqMmMmEMmedLlDZzuUNUubiqQLIilIZzBpPYGgNnyCEemDdOoVpzZPdDWwsSvcCRrKknNLljIbRrSsBovVmMOAaYywWQqOojZzfFoOJiRrsfFFkKfSYyDdSrlYyLlXFfEJjeQqxCcuUwWLRhHwWIiRCcrAaTthwooOijFfTtfFyYluULBbxXkcIibBvVCKIiYDdIikKysShHCTNntcJVvCpPPuUprRvVERrKkesSSKkslLAYygGoVveEVvOaWxKFfgoIiOraARGdCcsSDSaAyYsbsSBZVvzQeDdGasaASUuAVvwBbgGyrnzYyZPptTNRnNogyYGBbOdDoOoiIDsSdbJjmoUuOwWMBTtaAuUHFfMeKkSsEOsSOoJjirDddxXJXxAajqQJKkpgGHsShJjTDdZztTtZnYFfyTtwWeLlsSSsJjPpEeEMmKDdkzpPyYZFSRrsAnoOvtTVNxXaEeVvogFfGOAbdBbDqQzZBNHhpOVvoPpTAaxXOCcoEekKtQqnEeLlOoNreXxEaJjAmMGIiHhFfIiVvgEdDejWwJkKuUiIcxXCsSEejjJBbhAabiFfWwIBqQVvWwXzZgGxKdTtDkbBqTtQXTttTxdHhtTfWwFyYBbDtTgGHJXxRQqpZzPbyYyBvoTpPZztBbUuOSWwfrYyRFasSsJjBSsbSYyVvaQqAyhHYsSaANnaFfiJjpPIyYBiIbiAaIlwWLSsqQAyyYTtYcCeWwxjJCzZcbJjBPrRpzZYGcbJjGkKgBiFqQfLEelsSjJSsIzVvHnQJvVjqYFfUuySsNQqAFcCJtgXxGpPgGPfSsFYyHbBhbBiIpnNnsSNSsTFfxXjfFlLaARrNbBnyjJYmMmMOyjJYoOBbAaofSqQsUuqUGguLlkeEKQHfzZMmFatTFfHspPSuUobrRbBBOZzoUqQukKOhgGWtTALvVlqQaIkKinjEeJqQLvVllKnaQwWyYSsWwqAdDkKhWwHLlHcChTtDrRdLlCcNUnNumMkYyWSswiEeikKIyYwxXwXxuUWhfMBbmHhlLCcgrNnHhZhHHhzKkeEyVvYwRQDdfHhesSKpPploOLJjXKkxPLXKkxWgUuYyZzSQVEevHhqQIiqraARshHgFfddSsDDKvVkKkEeyjBbJUqQyNnvyYvVzZVxXPpVFfKkvxbBMmXGgIuUwmMWHDdhicCZbBzXxwWKkVgGvklNnLzZaApPRYyrKiFvVwWfWKfFkPpwYOoyIEeYQYDdyqSspucCURroOVvffFFPDsSCWwVvcSslLeEiKkINuUvDdNdDnoOVQVvQqqJjwWnsSHhduUQqMmoOIuprjJLlLlNnRDdGtTrRxqQXVvMqQGcCLlrSpIVvfJjypPYGLyYlPcmMCpPphVRaAVvDdrYPHhpyAavVMZzmvoPXxpOcNnCbNnByYVcCvOsSVvBbQqBKkbNnbBOgkKGXoOHhIiQnNqsSQqxcCECcJjfeEFevVJJjjnNWwzZExevVYyxXhHaAvVJjXEeMDkKdfOohHwWbBtTSscaAKkrRrREGglXvTtVxtTVvLGgKNnRrDIidIDjJjJNnfFdjJilEnNeLruUROnNIQqAaiCcoVvkGgmpPUuydWwVvRryqQuUYxXgGDaZrTJjMmEenQqQTfFrWwYyVvqfmMaWwzrRZAJjFbBsSsJjSzZVvcpPDdpPgGAxXaVbUuqcCQygGYxXvpPJMmjdDVvJjvQqUuVVkKtMfFmTRrBRduUuUJjHhDFfPYyLlOoYvVVvyeEgGUOoAFfaulSsULHhlyrRYbBJAREeraLpPljSsWwJoOjPpuejEeEVveJPHhpzGmNnMpPqQwDdEeYEeZfFoOzytuoOUTMmVoqSspRrwTMGgdDeEoOCcGAaNngEPcvulLFeEtTtvRrVOlLxdYyDVvgGPpENneeEXoLlHhOouUxXxlLXyWAtSsTRoOqQefNnUPDdQxXrSstTXxcCYyrDMmdRnAaLlMmNaAcnNCJhHjnNoVvvVOhHlLbBMmgksSTteEKkkSsKfCcUugGnNCeEcLluUJKkjFKXBUXxuDCcjMmkKkYyQqKYwWywwiTtIGOoPaKkxUuXAMmparYyRXxTtscCShFfHtPpTgGrkKooOoODHhdOvVXxjKkJhHAasgvVGUgSscelLETtCJOTtowWQqLlaAKhHyasSAoMmMmqQpPOcZzCZzNzZcCsVsSfFvSuUNbBndTtDqQoNvVKkScFvVoOvCGgclLnBbuUPpEHTJjtheNIiQoOuUqjkrECcpPepnVvNgGyYhHvRrVPpYhHgGyPSseEmMPpvVYZzQeEqpPXUuzAUuaZsSVfxXoLlOiIIinNiIKkWqQpPRAarpPGgeEgTtbBGGgIQsZzoObBPZFdlLwWDnSsNqNnQeJzZzWwZCkxXqQICciIHhQqHpPHhSslSbUuBgGSseEdDsSYmMkKywWwWgGGaARrMPpgGwUubBDdZzdDMmVFDdfDqQLldMGgmDdIiHkKVvmMaAlLmWkKwWsSwMhmrKkAEeaBAaxhHKkwPpWpENncCeYDdynLlXEVvehdDnNHEeWwwWxmCzZcMsiiIIrRJYyjFgGyYgGUtTuCcqGgQmMaANnemAaMEfAROoRrrZTtzaSxXstTYrRqQDReCnNcRruFfUErCBbSsKBbkaAnGgNBbAFeEbBfCcnNFHhFfQWzZwifRrFjJTAatIqEeJjOoQqfRrjJSoOhHHyYrJjmRryYLlSHhQqmeEhHMsXEenNxRSsaAfjJDdRrFlUuLdPpLlZzqQDcTXIixbOoPpDtTlwIiWeELYjJyZzbBdPAapFzZnNcCHXHhxMFfzfDdFZiFvlNnNaAnEOoaABbeNnbBBbNPpjwWJnwWNhHMmcCBAQqaCcboBMmnctTjoOWwQIzZiuUAaqUugGkKJjeEJzZCgoOyaUuHhAEedDJfFRrpyYsSPVxDdXmMGgxgGUuXDPpFfhkKHkKiIOoTtyYdYyMnNdDGgnNtTGgmeiZFfNSsFzZLldDRrdsSpbBcCVvRrPKkDpHAaynNHhYUfFDdCakKAmWDdhHBnNbVvNGgZiIzZUulWWjJGgzEeCctoOTMwWmZuOosSvEeVRrChHqqQQfSsFcCkKcpPfFOoGpPsSgUsSoQOIiWeEwxsSGgXUuqMmzZQpPCTtclLJhfFbBCcVvVzZvnoObBHhaXxANGlkgGKwWXplLBbyYPyYxjkKlLZoWwaAJIzgGgOoBGoOsSwDIKAavLlTMmAayYtnNLEeEeaATtJTtkJjuUOoKlLcEewLOWwxEenwWWtTpPwSsiIERyYGgFffFFSsdooOxXTtqQGMmaAJosSJjOjnNbBJNnjDgpPxXLlGPYyPItTLKkFflaAWzZpBbsfGgFQsfFcCOcIiCoyYFfcXNnxpPFfTtCCIPpxXiwWGgVvYyeoOSdDszZEhHhHHhtHhTIiBblLPpcHUuVvrRGgenNBZoOoXkOsqQSonHhNGWAsSaRrJjwhbBRBbpPrvVHmJwWpPjJjMQrbBAaJjrRRfFqBXxNzZnbJjrRwHhHhGNRiIrcCkLwWhHAaKdDtkFeQqEfcCvlLQkKvVRSWCQpVeUJYpPYyhIBbqQWwreEqKtEeTkQkVvQqKbnNSsIiBTtsyYQqmhpsSsSzZhHPHlLvXuJCcjDdBbKgGAaklLbBhHdDFfgBKkbiaAIvjJJjrRsYaARrySHARraVvAaSxdDxXXSyYTtsZiIDdGgTnNsSPpnwoYlLmMlwWLmMJjjJxdDBbXPpmvMmMmVaAtNnJjTMqEHMmJaAjNnziIjuzZUwWpMmpBbhoOjJHrkKjJXxuFKkpVvPMmQqMmtHVvRrhKkFLlAoOZzeSsEaWJZzjwfHhjQNnhHnzZkKLWwlNzIyTuaiIgGlLJjAUTtZVvQEkLLzZllKeNZEthHTepPuUdDGgRreEeEIyYinNCctTrZAaiIfFvjJelDdTtjJQqySQqxXsWwnNjJTtwWZzNnyYTSNnuUEexXjJCcxXjDdJKkscyeEdFfDYHhEenNCcOwWoWwKkrYyYDdJjgGlznkKvVtGgvWwVTYmMqFfQhUUJjVcIidDRzoOZRyYrAGVvzqQFfrRZudYwWyVDRrOodvrRYPPppyDFfBbUMmdDKkpPWscCSjJwWwjJFYyEeZzJCcjOoHyYhKkxmaAMgGOozGghvvyYVPpbBvVPpXjJjaAJVvSPtTZlLzpTDoOPdaADLlqHhQCuLlAgGrSsmMRaUoDdOeZzXRFfrxpVveEPjJBbNnMJjzZmGgFpPIQqijJQsSqfqQoOQqxXTtTAgHhlLGovVWEpaAPBpfFSsINIiLXxlFJhHjffFtEeTqQWiIUBbugGWwlcCPpLIUuEeegCkKcXgGmHxOcCowRrvOtOsSoaATwKkWoduUDrXxsSRTUuycLOxaAxWjuUVvJnJjNwXxydDYxUuLlaAXAmmMMBsSbeEagGGGgnpPLlfiIFmfCcYzbBULNnYcDlLdCxwWwWrRXKSpPmJjLlCfFcMKkPpAqQaoOrCccXxWwYymkRrKkxXNnKMuUhWUVvVvPWwLlpQqgRrgQYyyYqIixXZzKPpCcVvkeEeEaAUuanNaAkKNneEAaaoOGgAAddDDKkmMIVvicIiOoXacCopPlLOoOnNQqQqzZPrRpNnPpijEeJceEUjJuSwrSsRszZoOGBbGgcChHgSXxmMWQqvWwVwtTqQWwxXsSEqyeqQEmMYeSoOsWwEQqhNLSslnHLlGpQqPKluULjJlLxMQqIPTtwWppPubJXZzcCtPpTrHYCRVNnTZztvBfbJaAdqeEQjMmUuALlaguUBJXcCxjboOHhTdtIiPMmpaJjAFfTOIiogYyRrXbBfFqQyOoBCcbsISsPplLQpzZPSsqikKyLlYgeEuUOobnNYAaFfakKEIiEHrDdRFrcCRDPpGwWxXDdgRrdEEeQqxTDzRNnLlnNAeEaNnJvVwWFfjrNntrRMmKkTAEeuIiUkKzzwWZjFfJwzZdPpLGDLldYGGAVOaEeAzfFtTytTvoIiONEenLLluztTrRfFnKkzZDlLgGdAadcCLcUuiIGgviWObBubBkrnUFfMmASEesdDNnauNRkzZKsSKjvVJVOHhOooMmUudDRhHTtrWxYmoOFfSsMsKkGgSSsncCqQAAOomnogGONaAiRrHiiIIhFfLWzGgZczmKkpPMGgdHhXoOSsxoOrrMmRbByYNnDsLlJwqqQkKhSzAaZJjGqeEQgXxRULXSzoOEWrRFfpPRrweQDBuUkKPpcCJhHjlSsYyPpLruIySsYiohHWOYydDBnBboOdgGTfFtPprpPHhQqRQqOoYyuZzUiRrUwWkaAGCcpXxPsGgLlSgGQqHhhVvHzZUuWwGOozZdDeEgyeJjquUvzZHhlrnNIiuURivGgKwTtQvVMmqDdWKGgBgKDdvQqVtIiTsSHhgGjcCtlZacOonOoNCVvMFfjJVvPpmOoNnvVAOOhzZnNDdsStTmMORroqCcpPMjJdDnNDdOovykKujJUuUfQqFVvVNngFfkKGJRPprjJeQsSdDIidVvRBSxXPSlLiIfoOoOfxXYyBtTiIbSWwsRrDdeENnaAjBbbBgGyYFfcCPLXHfYqQyNlLXxnJjPbBiImMpqQdpPAaDPADbKkDboOSsSsiIUuBdlbSstoOTjJnNgGVOodDoacCmuUdDMAMmOOxhHdfFsSQpPFkkKHAOpbBPosSQqxZzrRpPxXWNcCmMnBtTbKktRrtaAYxecSsCrYcCJjyrybBYWwDzbBYyDdZzZPpzCsSsHZFgLNELYyleYqQsKprRPpGgPpmcKkCjJqQyGAagsStpfFtWwpPTPRrKnNOoKkkvVnNiCHPphcZkKzbBQUGgCsSlLdDrJSsuNnpPzhHLlEenNQEeqlLuUglLGxrRXfFQqmMQJnjJNjBgGbnnNFfjkLlgGlLKbSnuiIUNIisanMjfFJeETYAhHlLaBRrFfatiIKiIkFfpPavqQVmMdDgGAqQjaFaAfAFUuLwTtTtWJoOeEFffGCGZTtpPyYrkdBXxbDOueEIOovMmUpPulLKuUkoOzZRlLypPNnMmzZLlpEVvRgGrepZVvyYzkfFKPTtJkKjPAEiEeIuUZzeaBIyeEYoOibByJjsHhgGSYziebBEBbKksPpdDAdDUfwWYyCRgGrIiyYiIUumMDIixXiIMmrdDLlRdDxgGxXBYLljJFLlDWwdSsdDfVcRrRuUrmMCwWlgTtGBUuhLlUMmIiOoqwWjJjJeEHUuHmkQqBCcbOoKzZkKqjJqQWwCcOoQJOAaoIQApfxMmwgGtxcCgGzPpPaefFJlLdZzlfFLSYGguUycCsDjRuUAarRrEhHOoNoOnfFqpSTtPBbTtpmwYyWMmmcCNeEnMjJNfFlKLlUxXIaCchHlsSLTOosSnwWzdKkDZFMfFGgmbBLlqQbvVbBICTZJjiIaoOAzOobBLlvtjUuJiPpgIdPpDiyYBbGhHInwlbHhZzlJjLuNuRrgGIiyyDdYQqiIQqQDdxmMXUuokGgyYhHUuOoyGgpCGgbBczZhHWSLsQqFqDfFMmiZWwWwOoXIixUuXNnAyZzYCcuGgrROAxWaOFfoAaGgAUdDBqQDdwWHhPlQqDdcCYyYyCaGgeerRNhHJynuYygGUNYkdyYYpPyrRfFDdiIIiphHbBFnNBbrbswXxtTWpPmEeUwMQKfUuPJbBKkuUQqUtjJTkAaKrRiDdIwusBbUuJBoOAFfVdDQqGgvZgrRwWNnsXxSaPpdsSlLDAcdiIvjJVDYEyYevOoVPpyoOozzBerxXZztmMXxIQqHhisEeSSsYIskKSEiwWIhHXhHxmxnbbBBMmnNaAnzpPRrRFoOpxXbBRUuFfcZdKkVvbBDFBblLbxXjJJjJjlLXTtiIzZxXYyazsSJjZxXAGgRhHsSuPpUTDdxXBoIiZoiILlAarjJRekKEOzZzvFfVOvTpDdnKFdaAxXDUwWtsSeETUuTtXxQdeeEEqcCQqQHhajaVvAUdIisSDuYyJYstTMWFBdDEebrXxZzvVhWwHFfRfcYxXyCwdDOoSstbBTLmvCcVMmwJEejBbWMGnNKkikXxXKeEkxKqQIUugaACcGiIzZQfVNnzZMgGRTQFxkKbBYyuUoDdWaAwZzgVvLjJgWwlVjJfDdlLdKkDDHhdtTFUCrHEAaiCXxcIDqOoWWwwRWwrRcPpCeKDYydkEpevZjJzVNoOnRlLLZuVNYAayYgGyJIxLOoZzlqETteMMmmZqPpQDuUdOyCcYdDlYSsyoYgGwdGgDTttcCTWvtTAajJWwnNvaAOiIeozZGBDdXxSsfhHFsefFCcYyKkNnajJiIvVqDtTGgaoBdGSsYZKIikSzddjfFfFZzJoPOomcQQqquGgUFfkBqJjQmRrpPtTVvcCaAeeEEcCgiuUMQAMmaqWwJjMMKkwpPPpKRCQqhoOfFYhJVEgGeRpPrbhtTHSXxYysCcpyvVEPpeumMUYAPpMmaPGtTgBLlDdvGgRrzZmMVvjnNjJACcagGBJtOgGuYmMnNNgGnHhFfKkVzZdQqnRyCcUuwWlLiPsSZDdTtzyYIiTgGzhHZipPIuUrNnRjuUKkeEeEmMJVNFEekKTttbBYycfWUuRrRBUubfdDFrxQqXxXwXOmMhHZzprpoAaruUKkDdlwWLlyqQVjJaAGUzZnaAJjpBbYyzZUufoOFbBJjnUuDZzdDtvsSPpVmZMRrcCcCIiJaArbBRcrNSsSsyxpPfFMxXmuXTtfrwWVvIiZvVtTzlLdDMjJeEmjnjQqJDXZTtpTtPpPFfCjJcRWwrTAWwOoPpHHpnNWwduDdmMHYXxWShHeEQLlCcrRgNnxcCXeElLSnvVuUdDVPeOoEKyYkPUupFfqPIzZqQKkiizaSsXxjxiIMeErhfFSLltiqQoOeEIAaBMmbWcCwdSsDWbBxXiIwIXxiIkKVVIpPOomNhLlUuHhHeEtTnZZVvzpjJyszxXfFZOoCcCKkEecCchHqQzZhHhNngGHSRrmNVvmMnmMCcUuCLJjlWwcGgpPnNrRmMAXxJjKkJRoOtpQqRrkXxKookvZzmInHnNzGIigTtZRXxdfDpifFOoIGQqBxoOXOTqQbEeaWwAgGpFfHhPcxXtdDrRPlLpTPptTCQmMtTPptTLnzZTtoOSsNlFfUuYyFSsEqmMQlLgxXvVVvDvFflLTtEMmeKkVpPMmeEQqdYytEeTgGUuBbVjwZLlHFGhPpHxQhmMwWwjJdDWHqgGffFSDdsUPpSsRSLhHlsGFaAfMORrsHhScCOoYEedRrDyaANncoOSsiXxTtIbIilrRLmMAIJwTtWZRrNBsSzRrsSkaAkpPcCFBbiCNdDniahHuUCcAMSEzGgmUupwWPjwWJeqQxdDpPSvVsDOPpomSqQsugsqdnNuUDOMIlZzLmMfFFEdMBbmYyLIFfilCsSoBYyvVbOdYcCyDHcZzWwCHgPpXxODiIBmHquUQbBhOoPtsSTZzpAatTneuUkBbKeEMJARrapPjCSVvUegGEudDOkNowDlFfLAmSsLlnDycCYcClNbBZzdDPpSYyBcjsSqQgiTwsSQdDqlJqNxvNSiIsnjzZHyWwZzEeHOoKzaFfgGjbBQIiKkJjjJFfqLeEuQqoOrROovViIlLLYyGvZzVgCcWwWwCcrRXxFfFfrRTtllLfFIilLJjlLPljNZrOeEPyYhHrayrRrZirKkCBUuwWbNnGTrUuwYiIBpXxGgFiIfEWmcoOuUCbBMwNnYyqHaAhsSQHxXsShfFfFwPVzWMmzXZgzxXZRrWwTsueEqQOohHWwNnqxCCcPpVLlvbBmDdLlPeEvfoOFiIdDOXxGgoUuHuKWwESsEeCFXvARlLrRJoTHhiQDHXxcCLiIpPlfFiwWrRLsQqEemyYVtkKnJxXtYymMTPeEanNYyiIKXxKkOZzqqQoOoMaoOAWlLQvenNEHLlhbiWwIBwWZzoOcCuUSspwfLlsQOQOUuurcCPyXxYpgOQlLhoOABbajfVvOoDsSdRrDpkKPJTtjWbBOKkoRrqYyEepdEeTFfQqQzQqZtTYDIcCiPpJUKkusoHhVvjWNnmMmgGZFfEEeoNnOcmuPPZzqQNsVvgyYbiIBGYgGRTUvVWNBzZTzSsZXCyymMGRLzMqbwUuZtTzMSMBbmMBbBiaAyYSRrsIyYsSdDbcuQqGgUpPRrCjJDdrRcRreEELlenPoLIYysPYvVmMkKyrRHhsSKkOpPWwiImMCutSOosTrePrsfFSAauUcCYSsDsSdyoOzdDZuUtNnnNoIiORYyYyrmMdDLrVaADdvGJVLPpKHQBGgNnNzZsTRrfFtSTyxWwXyYAkzfBbtRpPtIdDaAqKbSXxdAabBrbBsSRgGADdYzZyCcDdauUQqPUGgucCrOoNicCHhiIUKkuVvVvDQqYbByBbEemMXpPtjJTxuLlUXzOoeEKRrnNkoOdCWrRSsmMlWNiILlmjJMQqgGBbdOoqQlLgGwrIFfzZoOfxXsSFcaACaKkWuUXxaAqQFKsSUuVWwTZzgkKPpGRTtJjrNrCcRnhtXxTrRHYyJymIYyiMnNYchIJaAkKQqTtgMzrIGgCPqQPjcCSfFuUhHIGgCcibBTXHhsSxGgzsSZvmUuZzMbkVGgzZsStCoEhHiIeauUifwQugMmUuKksZyjOGgobMWBRrKkUuXxkKzCYyxkqIiNWwkxCPIiCcpgyYxXLbBsKvvVFfvfUyYsSuolYYTPptMmyVvJCQJIijcCqQqcVyBbiIYvIiwpPQqWVvjhZzGgHtUuToOdDQqlUufFichwWPppPjtTJjHhJYXVpPeXxEnQqlOwWoLHhsSmxXMJebQqBgKcCqpOoPbBYygDduUzgXxVvGqQJxfkQSsnYyCcgPcufbBHhziIWwfFPfXxzVvXxZBbjiYDaAqQDdDTjyYIiIeHxgGLjJNnaAXJxXjxDbCcxwWOoJJVUjYqyiIYFnWCcrXtyYTufzssbPppPjNnGgUuJfFnNgEyYaAijJuoOykKkKsSkFfvLllLdDXtaATdLUurRgsEyarlJsShbBRgGrGFfFMmcDdloYyQBbqbfFZueEUGgkKjJzynwTtRrWLlGEemCgyYPDazJfQqpPzZMmNngCcrLqQlRcfuUdDSmIStSbBcIFfUuLVESsJjiufFAfckKMmJjuoOwWdhDVbdDBxWwQaIILDtOoCbNnBIMDXxfFuUAaqXxQomMpPOdReKdDoLlzWwNTtZcCGrRhfFuUYMmMmIiyvVBSsqSsCcDdsoKkOiIBdDuUWwjJDdwWJqdhkLCcyYlgGKqQqHdDhkKOoOCcoiSsIqQvVvkKXxJjVkKRrbIiMmMnNmAalAaLLlVFfGezsSEeSsqufFUufFTtHPpPpdnNmRrpPMCLlTtPxzDbcOkFfsSWDdBlPNCcssrGgRSeicCoSZzsoGgOuZrsfsSJjFSQvNbBLeVCZzqoOtQSsqkcCWwoOxXwEeWTtBbKeCcbFUgGMmuLlfhXWwUMoOXxmWiPDLfNnFldZziwWOiQqqXGnNgvVnEeOoNTtxfFQXxCTtcCuKsSDGgdlLxzZFoWwlCcjJGBLlbDdRrKXxwyxdIiDcqQPAcCsoiIuMmHjJMmhjNBbnJuSOosUtlLxXQXgCFrRggGGuUSsMmgZafMFLUoOFftTTtEektTfFRFfHsnxXPpoMmHhOJkKCKkdDWwHgAwgyYKkeEwDdVPFtTqkatHqjJQEetTLCDlLdaBbdZzAaLlDmiIMqsyYbzZwWBiIFfFfPpoOBLlWwyBXExGqVvmMpPTAaVDdvkGvVgGgKTtsqUuQyYStwbJBLjJYyASssVrmDhlLHbpOzZoJjAsSVLlvycwqlHPcYyDRjdZlLhDdMleEaDPpMmsSdTpuegrmHUuyYzZhKkTMjmsSMxXJoqdDaWPsSpVtOoEeJSbBmMDdZaAgGGiIpHpmSPpszkCcRrKRnDdnTtNYFWwXDmvxXtJjThLeEwQLlaAXlUtFfPrRpkKTtHhnNXxQqQcyYCqTtoOtdyyYYvVvWgGsOmZzAaMwslLDoOGgXxcgcQNnZzAaubIrdMfFOTtoKJMmjkmNmorIixeECFfccCvVnqbBQVvCnNWsSiecBbSsCxyYwWXuINVHlWPpwLwYPlLVcsSgujcHhCJLyYQqwWlNnVvJjJjltTLqTpjjjWRrFfKkRrWwEebVvCcBTAiIXjJAwNBbpetTEcCmqLlwmrRMWNeBVvcCbrRywlLcCHQUDEejJvVeYYynRKWwkhHMTHlLkKhFJhHjhHfYTHhinKkeEYhHidBbZDdZYnjyyYBbaWwkLlCgGuAaJISsUuqQKkzswqQQOFfDdFfCcpPQqRXxMMUuVsSGpPgCHhDdiuUIhRLlkGgCvVNdRuUQqCcVvUVvuKkYgGyFAjjhzCcZrRWwWZzYyLlwRrXxFmOoxXeEjYCCctYGQqEyYegycwxiIDnCnNcNNDtBVvbFflsSJMIOvXEvVvVkkoOeEKSXxGgwlLHhbBNnNvOpUOipnGQnzaAZoOpQqbBeaASsQqZDdEFZzYynYyNrqFhXzZOqQvVHDdQqbVjrxXaAEJHEeWwfXcRNnrKkGbAaNjJOOoVvmMfFXwWxGuUmSOoCDJQqVvLlLMmeEaUJMmEYDrEeHiRrXqQxeEkLlIiBnNNnbLlVvUqQRrXxFaAfCcvAaXiIuMmUlLxyRUuOeEfFnNzJwKkkKQBUsLlHhoOCcnYgGptTiiPdDvXxlwWAnNaEKkGzZjJhHfFfMmFagGNlukkKKUuKqkMmKsSzZWZzNmqQMKknKYWwvNYynPEepMmAaFaAvVEefvsWwSUgUjJnCVmMveEGQgsSGQqpPyYqKksSdmzsZzUbHhHhNnhHlUPpCcuLkKsYyVUMceFPpfWQXoGnwWNgWdmOoMMmMgGwWlLzORrxXkrzoIiOlLWYygFUAaZzSsvVufFoOCPiIpkKcfGgklUuDTtdsSLTtyYPUANniGgIhHTAZzaxXBZYylLpLWwMuJjUnjknNKujQUFfkKuqWHeErnNSsNnwVGgUIOLDdbpqQLxhKFIifAHhlLFxIiuPpnEeNUMGiGlLtTMmpPuUmMkKbBSsWKWyYQZzKSXxIqMmQMjyoOvVRrYYwWItTRVQqGgAcCKrRkYSfcCeEVvFgGoOLrlLRnfLyXncqKkAaQjJCNbdDhHBeEyRSsgGGgrYlLwmMuHZQuUUvVuMmqIyGgAaROAaYJjHhZOwWbBSiaFfNnWOcCEetAwdDWaHFfyeEnNvtTVYqLugGUlQjJrSnmTteEevVIibWhKMmeEkmMigPpxYuUyMRxwGVvEMmUuBHhCZiTytTdLxXAvtTvVZzoSsfkuUKzqQZLlKkAdDHaAWweEzZKGmeEKkUNQCvVcpjJsOsrRSqJjuwWsSwqwWfBHurRFfUaqdDIiHpTtsGgSsiIQqSzZGYpPyvsaASNnfnDdgHhgAaGXgMmyzZyYsuUSYGHKVuYyKkUCFjJfcSCiIcsBDdaAZRDDrRjshHryYdqcCQDRfFBNnWjJwEhHvVehHJjLNnmMYyYkKYznieeEilLEDnKDXzAkKaSjJOolLbBZzFjJiItwWePRrpzZARYxXzZzRwTjPEXnNPuPpVKkvzSsPzLlZtTgOoqQGZzpZHhEuUUYyusNQqnPpObBObtoUuqyYyYFDdBbffAuUJyYyeLYbuvVUIqOshcoZIglQqYyeEVvLGwWeEtMmErSEMPTdDaQWwJFfjWwyTCmzGgZrbkllijJnVIivNQiIRHhdiYiItTtiIxXEeKkTDdsfvVDguCKAvVBzgwWjJpuUbvHhVvVLvVWYfFywljJZpKkyYWUuwPgeTtEkKQDLEeZztKFeEULLllkKNaqQfBFRBofjJjJRkKrIIiiZzHdDhjOoqDdIBPWvVPmMnNNnOgGojzGIzRgGFnNkYZzxYKksSyiIEeZZzSXqQYdDywcCjkhSBkbxXulLUBGgdsSpexsTkKtulXdyIPBGggNnBtTcpPSwbBeWwEeEygDouUAoOlKkPbBFLlEefJoEgGYmMMwWoDlAnNqDNnqgUwLltepPRrFAMmyYIlLnBZtXxyJLljWwhuUiIRrnmsLPplpPozTtDdwWxVdTUubZqHhQVyYLyYzZoOlggoMmRACFgGfceEdDahHkKxggdDZBZzsVvSbGgzqQyYBRbBRrWLeEmanNmrrRRknVvqQRrSOcCoTtKFfcWwCTtqVvQzZrnNqQROUYycOoUtSsdDeZbVvBeEBbmSuyJjTGggrvlLHrRWYyDdgGLlKkwvfFEeVoiIveEJQPmiIMXaAIFfiMdKkBJqBvVvFbyzWlNNnRXdbBDKerRwWNtJjkjJKTJRHtThfFqmWEexXCcnoOdrigpMcCfylLYjJrRztkKuxAaIwMMmgFgkkCcDcCTeEtARfGgFHtsUaADxXdxCzRIuUsSaMXxmmMTrRtTthHbBeEuGIjJZTtziGeSdyYxTtAaWgTqtTtpIiZvSsjgbOoBkKGpaRtTCcbBbjJBrIiAYyKkPJVpPrRvbzZXQVQqWwtFWwfTbQqMmBHdDGgdIGaAuUnNNNnINXxMmerRDbltKkpaAmiJXxChMmHIiHhpNRrlCcLiIfEeAaKqjJnNcCJiIGgGtSsTIiDdpLnNDPDPBbqffFFqRrQpPXxfgGHhnRATjJtHbBhuUHnygeEYyjJTZlLnNEelLztZXHQqhxoflLJJdDkKHPphBALtPMuUVvVvGgmBbiInVvgGtCfMOocCkiIiPJjfFfFpoWBadDVvLsSrjktdAaHhDCUucwgGDdFfbMsTUjAaJjTtyzZbBMmlZBntlLrROFfoUAItsSOHFVvfSsSTtSsSdxXGVAawQqLhHAsjJFiISSssfFCYcOocnUuNUjJpPBbugzZGoOuUaaDdAZdFfdDDpwWPalCXkmFlTtJcNOjoOJzZMAgGHhkrvCcrCcMmUuyYJjyYoAaBbLhHUpPuJDdGhaAHgGJOXWSrEtrehxXiSXxhHeToOXtLlZzyYfXxBbkmiubowWLNnlVvcVvPpcMNnmMoOdwxXMSTrEPpIiVfbBRxXhJjHrkTtOTtKRUurEbBhHnlLGgbpXxhHQqiyYsSzyYJyYLpFsImhHMjfrRVhHfeTnvEecCRHtTthHmvnCJveExpNTFSsvDdWGgwVMDvVdmxAaMpTtJjdDdmBbCNnvVsKpPiHMTIiFzZftmciSRrcKhHkCpPlOoggLvKkIiGgVlGojcWXxzYMmorROFyYTXGgYhDdBbHmdoCcODVwFZzRrJEeNxlLsSsSHKkTtKfwGGezZEgNwEFaATIsSithHZaAUuzBFfbaDozkPpKFfElLeofFfFYALlgGakKwWSOkHhuGPppCsMmjJaqQEeGLlgzwwXaSswrpPwTeEtWaAcCRaAOeEYyhFJjVvCdsWwSDsSXCZzuUPeGtnNmMHLlhQqaeFfaWwTWHZCcFISsqnNMmhuUYzZrRKupnNPFuGtSsTgaTtTyGgFBPJvXxhjWUdVvrRbGgBeErRvoGWPpxEKkAmNnTQNnvuUVeEQHKZgYdpFnQqtMqQmMzCcYbFvcCuHhlMmuQkKPUupsfFZnrHHwWSsnNsSbBbBbdvwWaTUutJNZTtQeEJVCdDoFfuzOjXlaALlKkLNnAgHFXxFRbBtVvxXxXxXcEeADTQZvvmMccRrwtuUTthHfCcYyQEeIiFZkjOFtTEeEbzZYylLrRVgIfsLlwqQWCqQcsSbxXtfUZnNcSteHhEmKbBOTkLlycCorCqEeAaEeAsMRrnHGHnPpQUucjTZztEehHJBNnbDyshTmJjaAMKkqJxRrvVjVvFfpLEsSaAeeEebiBbNnIBEkKBbQYbDxOoXOwBYOoyxMmaAnTaycCVvHhatQMGNVvJhtTZzsWwTIiteEeEHhkjJcpnHJatMWYSNepPEywgaosdkzZKWMmRrsgGBbSCuUEUuLvfFFLEGDbBIXCDkYGveEVXVzqQHmMbaABSiaAJjTwWPpXxIrZAQwfcCjJoIiBfgGNnFlBFjJcCyYffVvWCTIibBsSdWIWJqhAaZvQqVdNKeENvhDXxowkKAVXYPnZKLlzZjCwIOoiHhwHhWdEUoOulLslLqaAGgXxQUuYnNzDYsxFYyfeVDUzAaNHhgxXGRQWwqHhCzgcMmcCXvMQIilndoOSzZskKmNmMQqrRQWwJpPUuTtcZzCKXAGghHayJCcaiEYLlGgVvmbBZzhHBbbxawYyWAGktFfTKpHhPclJryXHhwceAakULcCjcCONnxZzIyYjzPAHhVbCnfAaFPjJpEiEWwEnLlrRoVikoLlOzvTTtqVbygGGIceArbBLfFnHmMClCpPTteQlLfbDGqSsQgbVKgGPbBUoOubzacCAUBQMmZYqozZDHbBvBIiJjaAdsYmMyPJTtwcCWlNKknLrROLzgGgGgtTGnoOqKHmaULlcAMmKhhEebHhBQITjJBbJypFgGTgGhghNkKYPCDNGFoAaQwwjpPcCJYIxJcObBjSfaeEGgwWBMhNNnKnpPNGuUMpnNbByGeEgxnNuUchidQqDIPEgtTMjTtCqkiIAkKLQLlqtsphnaRbgfFWdDpPqZWauJjBoXxGgOSsLbqgFsSYMzZnNkWwKnpJjRTJjJEAfFaQJkKQeEGXxgSXtsSTxSUqCqQfMTvuEPIiZZIGAaaiIWwIPfFWwFEeTrtRTtrTRYGhHJJnNvVmSskKXxTSmMsZzhAXFLlscoOoOCSWtUkLWwXXjVzwwEhNnolvVxCnNLBbRzGgkcCZawStfFTtxcoIMmjJiAsBvYQqtTLCnNsLNHhMVlLVvOoGjRquQqUKkSotMZzmdqQkbBsSyYrReKkEKOlLTQuZzTEetqQOoSsTtQEWIkKjKeEKkNpPnqESsEvbGgPpIAoFDdiPGLxgGXlDuBbUIMTkKtJkWTHAKkaBbANQMOoRUBfFbuEcTvVtXTtcCxrfxWRroiIxXJjUuWccCbBtiFfXmCcMtaZsccwLBOkxHXxrGVvrRiIQshkKnNHPJJZnNMmqQfFWwEmMHrZzptzIEeuONKDddSyYssDfhrrRIiRPqQKlLhHaAyYJjnTtSbvoOnNVkKEojxRcrTZlDLBPpAFHETtpPjJAUuMmiRruUsSuUdcjJCnSCsREettTgMhHADdYyyXcbBuHgvVHntTZzpPoAQqaOBbNnbBhZzIUpCcPsSuWXXvOQqJbmmNnMYdRSdDHhBbfFbOoiVtTznAaNnNScmMgCEelEQmthyVzvgOoZSmOofYyoOFAYPpeEdprRdoHSsANIodljJgGBPpIibLcCDNTqQJMmiiRkKPcCZrRzwWakadjHhzGUGgtTYyuJjlLRrevcCQOoPXxpqVvsKkarRUHhRqMWUucCWwlAgGzOFfoWSGgwVRBbdDVvwWrpaclLCNzxXVIvckKyFfKkUuypEdhqdAEdBOoLSfFhLlpSqbRXibBIJgcUunNSsuSWYcCuXJjCJjDHhdoSvNnWwDhHvVwvDbGLOofFiNnmMIhWwqCcIitlZfCcIijJFhHcTtFeEkWwAqQMmEXxjUuEepciyYVVluUvlLsCcTdDtczgrRGAaIimEUvVIOgOoGOjIipjLHbIiqQeEzWwcCwWQqZBhtKksBshQGlyYLGaSxhZsSNnzjJjIyhYBSxGSiIVvzZVvhNFDfhqYnSUlFpOokiJVvyYRuUhZPthsGgTbpPCeEvCckPQqJSsiDhHGwUeEIisSQqiXCalJjtveEZAaUBbtxYdvwWoOJezZzFsSDdrReoOzwjJWZlKaYdDyOmuUMoDbVvvVRgVvGlmoODDqdLlDcrvVbJEjJAqtWoZAazpoYQiNwWpPtTnnNxjxAaTypPCcYvViItXZzFfAoOhnNHOwKiTtLgYpPETtBfCcZzuLlaNxXntuNRgGGgrHhHhnCNDJWjJmWwMcCkKCUunNcAOLlkKtQGqdJZpVsNdSslxYRqSsxPpXfjJFDJhHCjxXuRCxpPkjLlKkzLlZurHPlLHtcCmpPmYqIJrxXeZbBKOojunNVvgGSsOEkKbptSsVKoOIiivVIFlMyVFpHwmFldfFHhnrfFTKcCkVvLlTthHtQXxqeNDZzWPWgWemfFaAMxXvVDvKKLiYQoOsSGmujeNUuxXnqcaAWwChkKHuTgMmlZgGnNUpPuNhEezZoOUualLoOSEeisqQSFlKkLfNnljjwhPQCyPIiSdDThHuVzeYiIpwAatTfxxksSixHhldDysspPGgYymiJwmvMIfFgwFfTtdtWwbBuwvBRAQoiIOTMLBYIeqQtmXxYDekzZVdDLluiIUcWSsxKkVvryYcVtNvRkujcCvVGbgiJrRBjdRiqzZnBNyYlYySsWDdBbqCLocCORrVWWpPxXsboOZunvVEeedDluUfsSCzWwZGgccCrlEYBPprvVvsSMmkfFMfnKkzKKkQwqnNkKQeWwIwWbKkXxguUGBLlindvVnTmMcCHKkgGsBNjSQsFfRHhvVraMmnFfLlrRcYyDNMmFfVplmtdDTQUFOpsSPBKkZYmMOoywRAmMfjJFzgGtTCceEqTtFhHfQHWZVQhHaAqvpPzbBmMZiQkOoZCtLLbtTGDdRXpmiJxquUsbBSdqzXmMxqRSJsAvVVNGAgClQqLgVvzVIiveOOKHPhJmCyDtTlLDddoRUBbayYeEbBApwWmtTMoIFQnIiNzrDFwGwsOCcePCBbKkjJBPuPpAYrTIDmMkKcWIWwcQcCHdzOyYoSnNwWiyYIsyYzZqczVFfxqZNYySggVxkKpEMoZnuyYhHYvVxXyEezOoZmJjiDiIluqQfjBbJFzZULywWYdIjJKkbplXbHhBxiWwIRlLefeEnzZbJeEiIsSjWdDTtvVhHmKRmRboVLlFfQOPplWwkKDbUayCcYPSSXpoZoOXwWdccCkzdPppxxTkIcYYnOKkPTsyxXTryUsSPuyWxXmfjoOJagbBxXHhXxGrnNRwOxdEhHXGSGrwoxjmMgGJALUuljJUMjJmujTTtskAaiIfmyYuUMRLOMtTJjyYTqMvCcJxmMaSsYjuQnuUVabBxJjXJqYpQBbROoEjrRwczAagGDKkfJjhFjCSlUQwGgmoOIvUSvUuMmtflkzloOOXxjWjyYLlHhndmyPmZznrRNEeGSsabLXxlBAtGLvVlyswHIVBMmvVNjOgzifFYiInlAOOZPFVHhvSSsrCIiIRrczZPpkKxXCMLlmyOTWwaAMNnpsZQZQqfbEPEavVAwhAsSrRNnSLwWlGyKfMPUqLHpWkkufFIJjiVDdvzZvVVuvGkIodAWwaQqWoJjPprRRtTKKHzZbpPQqZBVfFcWOTXxhSyeHNHDbBdLlOrOYyTtilvVGKojJudDUlLvYZzRmMMBbjOiWqQCuUzBQZROoemLHhlMBVvBIisDdGgqQSLfCcPphhprcYyCdaRrAZzSwkqoZzgfFUulLGqwuwWSsUqQBtZxWeEKkZTjJtbBFfTLloKKMUWNGFxXYAaEevLJidcGQqpnGgmYuKwWrfBTtKkLUuGgdWTnnxSsXAaxfEenNFNnXsSISYipXiIGcCuUVIcIPKcCbFoGWvVjJyYIVcCRQqrvmVQGfAaDdxXJNpqUuJQqjOJLlNtTvpPkiliIkidTkKIdDzZBbGVvgikXnNtcLRZqaMESVxXJnvmjJTtczZCMACkXecCXxroORMgVJPHtmMeEriZzEenswBqDzrzZAfdFyDmMdZBbExHxZXxzmaQVOotTOgGyYoggJpxppjvPQqwWpwQqndGgFfNtTXGCWeEZOopgBbGauUKUuulLzZLKXMmBZzkkoZIuNDdLlIiLlJtRrWxsnGUaTtQlWwZfQqFWazkNnBqkxXKxyIiyXmgGqbmBIoGwMmWEWUugtTwnrRFqvWbJaagSsnNfdDDYyVvAadCaTpKkvMmOoVPbBMGgyAoOaDHEEfjJjfvIisrRCcOLlLlMaUDwzEexgmQjojJOJqprRJdUuXpRQqMlLmrgDmLPzkKZAaPnOoVBCSsByYVvfCcFVnYHhyZQtTqigMmGPpowTGdDgtHhHpPBKkNWMtenNRaZRbTtunymgGlLaJjAVZJIuULlSZKkzHzZasNnKJiZDjMtcSsCgGQKAakqTeEmVvbghHsSfFIcPdsNAapKQwXaYYyazofWfvVPdyYrPSbccagIiZIpPmMizaTWBRgzzagDYnkKnNLeElzwPYvzZbBFKDdMmKMIiWzZDqtOAafFlLdtTzIaAYQqywbVviIjYvVyHXeAFAasSfdaAvVuuUUwWWVrReDtmMRzwymiIdDKsPPIlLKkirkKRwWUCctTqQDdUikxXhOoXoOuCxvFfMCcvVmSsVxQjzZsSTwVUekJjuUNVvLPpGwpPMOZoASiDdEnuIiUVcpuUPYqRXtcdDgpmeEQqrRIiHhdgGRKkWwrzrRAtqQCcTwWXeExyYVkbvaZbPDvXOoxVFfttGgffVvFPpSRrXBhHbxcCjpZxREtQqGKkconNlawWaJFfQqueLJMVTqMKkmFmMOkvptShHzMmaUuLjJxYyHNVvVktdDTqQCchQhHqHucNsMeEmaSssCcSBbRNcWbtoOTapPDtakhHmMRrjmMRrcFUGtTZzsJECcTtUuJjJEDdejepboUuOYUuVOKnAjhxxXXaunLlXxcsSvVpuLosSzWiKCzQHxPNsBRcQJYIiIDduSszGLUvsSVulHqQnDGgdrErQqRYUuhtZBSWFMIiEwRwiMVFNJSTTttufjQwcCGvJvVkXcDdeEzJalLlliIZzaOoONZLUuUCzBZGlLsdDSENnBlZiIWPpwzZGcIWAalLZaAMmQYyxdrRCmMtBEbkCKRJdhHWhkHEeYBbNnyhjmLirJANnPcCEaAwxZzFsIJjivKGjZzATGgtLlNxiOKkowXjStTmCcFcTylptTPXzbytCcsUOmMoQqMUuSJjagqQNDrbBBsGfFgSbNVrNnptTxInutjrzyidDYoOyjKVvTKkFynNYfCRrwIIogcCxhWjJjowWtXxWBbBHGgmMhWWwbBSOOoyYontkaPTtpAwOKIpdDPiDiPkKpQqpRQZEeWGCPNgGHjEeJuHhkvdDVGgXofkZaAzoONQqzZBdHtlUpgcOoQqOdkeEXbUuBjJxTXxuNngEINrrqQREeSSADdsVUbYFRqwMsLlSlLAsaAuWbBChHLjNaXXxeWwjbBKCckxzBrLlOXxLulLUUuvxXCCiIcfTfFHhNpbBPpBbPnFFPBlslMmMrRmOcCGoOaAlOduWmjJXTOotonNOBbtEnxXVcZLPfcrRvVCFRrCSxHMhPyYyYyNcHilrMuGgXxZyYTofsYyuUpBsnrdfVvRTjaNnzIbsuAjcyhHJPUumMEWufXmoHhOhzltREQgOmMmTebmzRsvUlDNDdbaAUuxbaABXhsShHETnlcoSjUuxdyUODGKijcaIWwhRJhTtmCFYySsfTtcMHejJAbKhuoOMzwOoWujpPSsYbnNvjJjgGWwZzfBgiWwxXIPTtpcYyVvXxUjJuLHhApBCcHhlLbPpoViNWGjrPmSogLUDdeEujxsSJXjElXJWMsFADJfmgxXsSUiUdeUukZzZzJTiIQqruOrZLloUKOcCoxXBFfcaSsAJVvrRjhtTuWQqSswrbBPpbUhxoOFhGYCcWVJMipRKEesPntOoKXsnNfFSIZzFfzZYxXBmMOodjJJjEeUuPTOWwoKkgzIjrRtZnqxgGXIBbIuUkqaAqbBjmMGtTgYyPHKkzZCchHhjJOoEEevgmUbBuThBoOaZclLztTXYyPpxZvOIkSeFfJpPKkjXIijHoOhJxhHEnFTGAlHSDdVgPVvSswZzVNETfZpOotGZpPjasSKpfzkXGoIiOKXxbiIrRrHhRdMTfVFtwWTffqWmMwQFNMmsAIHqQhHEhnNQoYYWwzdQYyZprRDUitDrolsrHLkeQbBYzIwdVjOAJjakKoIEreZzufgNDqDoAaFfhHOoOSsozZOdUYPKAVxXvuoZgtWNlLnFfyYsRbQNnwOvuGgGgnNeyZzfEetTJPpCcGmMgYLPlLOZahEnysSeQiIJjvGgYyyYryTSsSdWlxECctTRDNpdghCbjJBNqtZjSbddDDBszplLMmMmHhfImcCmZbuUftTGWVvcLaACmqQqQIinJWVvbBIpPZzOHOuXPtxbYMmyzTfXKVuKAaAePpGbBgZzFsSQqnwYyPzNofFTXDRrFfJiITwYrTtsqnhCceeEozomAaCiIcCdDIlaCcADeARrHhaElNuIiaTQwEoLlOrWwUWwusSOoRWCZzTjzkccChHlBKpIidXtTxDJjtPZzcCMqMYmCiuiIJjgDiiFsZKxXkzUuXpOogHhGbOelPiWRrwVpPUdDdDBZBlkxAITHsNgGXxQJhgGHVvzZFfaxOLzZDRwvVLXxlqQWOPiXnGgavtGbLImMHhiEecpPaADdEcCyYJdLKZfbCcjpRrZbBKkLlMmPwyJLVujAdQqDqODdiWaIiJjAweSAaXVvpyQhCFfPpchTpeSsYyKTtWwgpjJjhqQFpymJjbBHtqQTAkjLlRILliuUdDrSLuUeowWOElkKDQyYqkKfFWwNrUexClLZzpPYczhfVvwgliVDsYiIydjJGJoOFFfqJjQXjRJAcCdvfFeLLDdcCPPxPQqpXxLGUGkaANNmMRyYNWbBwjJehjzZkKXoONcMDFkYdxenLlTvVRiIrRjcCKscCSVYyvzcLIFfIFmbRrxXNxXxjJoHJdBzZbRrScUuiswWpPZjknNaMJAanOoyFVvQsYVYelJHVvePAwlMQMUvSsMmhHKkHhQqOwUuWoiuqnOoZzNSUVvHVyYvkKhaAxXSLaADHibBtTupPRYQqJfFfFxXEeMmWZTtSsFuUfPAJgXuUjZeKrabkKBAOcNsNnNqtVvJOotEenEeNjUuyjGgoOEWsxXBMgGczzZYyykHPbBYLRrHhjNesIZVHhvEZETyPpRruOoSstyqbURHhAAIzZCcrpPnqxXwEUZgUujCcoiUueNuUvVHRmMmBbMEHhuUzokfoMZtgGTzDhHNfyFzVhsSHqsfFiyhflLFuUtaoOAMmTGmMgVygRrGYXxhcMnNwaUKrckfjJFeEKCmMxXRxPpXuAWmCLlHLlvHYISQvZfYFndBbRrXxpPmOFvOxXwWoVxXKOZerhnEIOZzJmCcTcCkKcCtMjOwWoMmJzZdDGzuegGGgWVvQwWNRCcOoiaaXxruBKkQYTUYtvEFfeVezeztVvTiSEnJlSsylLBbphWsSQqwiIKYoOZCmbSweJOozZYpPJhHTjTQnSnCoRkFfEzJxUuGjapNnWwzOowjyrpPUIhdDoOdlsOousQbBUrRIqUuSsyYdDQVumqmqQLdDMmWapEhFfjLOPpuUDdRroEyvySqjJLlGgRrfYNRmMrjmAMmKkXxpPKJzSIdDaAhHZzPMmpCCcsoODhHjTthOXLlnNnrRrRBMfiilCZkJrpzZPPptNEXDCcyKfdmCnhHxJHEWwnIBZzbiOornnKJSsjgYyMmuggGloOXxXpuyYUpKkOolOolTtFfEVHhDgGzZBbanNjrJpPxgGfrRkKjgDSdvmMILGWFHZCycfFwWXEugGRnPpdFflLsXxOoJKAIQqiaanNVvAahMjJYPfDdHJPGkEPtHHhHMmqVOovYPxVvsEIcCTtoqQQSsaJwTVvtWUvljYWpVvzPkKJCqQcBFzklpPDjeCiIiIldDBgTKkVANxIpocCaArhHFfRrdIiloXrRcCAjdvVDJjqOonShtiYyaXKLbzbuvIpLEyYoBPxSfIIdGUIcMymQjJmiIpTJjJjgGPdDkbLWwhHCKZJHdDiIhtcweEeWEeqtFfAyYIiJjEPpeUnLIiMmdLicLjSsJlMYyOZOEJVvjHNQJjSRyJjWsStjlLLldxSstOnZsSpWNfEsSTtakbBUvkxFtZBXThDdHJjpxUohoidDGgwjNJjMclCwxaAdDKkXgFBzZzNnjJEeMMiFPZJTtzTQncHGDPndrVveXLwDeEkKstYXxRhHRrYyFdoODfVqEYNeHAzopNnlyRrjFlLCcVvYEUVoWqPplFaAfdDRrLBrSwTGzMmOUakKkWwpyutTrRTUuNntQduUnGFUEgGtTRelLiJvDWEerRihFfofFOHZyqYyErRhuMmUHKlhRSdDLORdTIAuUaukKdPzqDZyyoLlOOqHehiazZSnvFtmOFfaAoNnDBkgxKZFPkAqQEeNnJrRjzZJNnzgcCZzTPCcjJzFtuUenvjJWZzYyiIQPpSsAabBqpYyGvtTshLagjJtfNsKioVhHCzAoYyOAabHtMGVephCcHNnJRrQQKiEeKkEeiQNzYNnyTJiZGoOkKtpDrRbLlyIiRzZWdDwFfrtTXxiqmMsSQpYHhyPxkTXxNpSkkKqXnzZNxltFfTLQrPImMmjRrXxGgvwQqygHRrfXHuBHhRUHSDdxXMmsJjCcCbdDkuOzRwWGgoURtjKEgFfGWIiwDuIvVuxXGMJjFTtjdafSmwjxLeJlLxjXtTfFLlAaJSslGOsbBrRIiMpEeRJgwncCIvOPaWwlpPoOCIZOzZoNgGnziGbFJVJjtTBlLyDdSMmDUudsUuTtJMmUWGpPgHhwZJjmUHkBjJaJjEUujEerHiACJIkgdobBuUXxuzFBbfZYDXJsEeOCLGgsSNteHLlPXxpBYyndLuVSrZSsMBcCEFftLBtTblMoGqyYerTLeEhHZYgGyHMwWKkxVvFUlLweXxpjYCJaUSfPpFCceEqoOQBiZAJiItpPrbBFaADRNSBbbPVlLvSFdDOtMmzCcBbUSsUuWwmRLIhCnYtpPEeTpVvPpqQwWquUQHnNmhXscaAZzVvplGgqQmMzHhCvNeQqTxMSswWwWwUDopuUPgGLEegmMWwoLSLbpffFfXxtnNFcVlqQoWwRdDbnnNNZrrRRXKJjkJaAExAnJKklcCsScJjJjPpcCwUSQyYqamWQrfyBuoOvSCcrRassRnieGUukKUdoODtBbKUBbuDwWoCGPuoOLcCThDbzZnKFOxKjJtbZzBTUhnxXpcgOowzqrJBpSsPbjNlLnIiyYPIDdOoWwQqCcdkoWjJGYXxygKTNsaAwZzrRrRNnbVvwTOJwIiHXGWwkKOiAaiWcvVOotwWkJmMuNnUIYZRJTUNPpiXPRvnRkKdgGnGAsWwUumuSTYBZbzZBxLYtCfMsJxJjvVWImMiIXgGnznVvNZxXabBJgJjkVSfpsSPXWepajRIXeExlxXMJYuUynBbNKFfHXzZxoOwKkDjrvVkcKkjJKBebwWNnaATWwchRrHVvDkKXHhqzdDCkKcCcwJjivVCgzLbNnegzZzbZculznoAJjLLAFfsSjZCxKjVgGgWqoOJFUsjnfvmTtIWrWemfwsuUrRoOFsSfbzTVvHyeRDqQdkKBbOoNhfaArRFgZUmMrRgGkKnNiytTjyYqCrTYytbSnpXhqpPxiIXZckIwZdDOGgllLsyaAYSTteEhHgGUPrmMRCNUAHJaNkKkYPpyoTtWwJjNnvWwyBPEpPejvVSgNnufCltTLJDdfFKATWwdJjjpPJBbABwCnnNCcrASnCUKvnhHyYhXAalXgGlLWwxAhHZLlsTPVKNnofQtHhveEmjlwWEUrMmRjuuUUAAOoaAqWwQLBaAbJjOCQqgnNeETEeerpzZPHhkKXzPJnNcCsFTTdpewWEQzZqBqQcCzAbEeBVBKvrzZRaZxXDXxqQMncCNvpPVPGCTsSxrQyeECvdDusSxQqoOXUZzEqQPpehHNeIsaOzoWwmWgTtlXxnYIiyFfcCKETtQqNnuvWKktJqXXcUVFfvxHiIKIuJjdDoupPRrfoOFUOupPppAaEeSkMYBbWZrTdEUuOKhHkovwDaJduUDjExhJTtBWiuRXxrUZkRrKIhEeHiKLlkDtToTsSQdzZwZzmdDkkmMfVOopPyzZpWjJZNyQqdGZzAZZGrWwbwtAOoGACCBHQqhspRDpFwFUuOZAyNnAEexFCcfWqkPnMmSDpXSJLljFeEfsSPpsxqQCifFGBNnfFxXJdzIdDjkSSsAhsijzvfFlLMYNcCUByYrzAriIETmwnxiIXbhGMmghHWOIzNviKkIbcoObvXxHhLlNAapplMdGEeLlPdDxTtDjtaATPMtTGXZWdnNuYyLlAmBboPpSVFJFaAOJjUuoeehdYHhxXmtAcTtiIxHhXFGiYyIAAdDjBwVHrREehQfQuUqNWGnNEXxJjewegOibMtTnsSNBiIQcNnCOyYoMdDxYGgYXQbKxXEeZnNfFAwQqzLBbqXxAueEgQqNSXlLwTjVvYSsyOoUunUizOKKbxkgGlUkAPzDdfFwcgqQxnDNvVeRrEWVJPPXPjgGnVvNGGvgGqAMiBbKkBbINaAnXhXbBezYfDFtTaRZiIGgdQbWSNaAIfFnNRfLleEFThpjBbvPpAaGmjJSsExKBxXbcuUaVNjvSssemjJqpPQAQnNzrlCTGEegDdxKtDIKdDLWwIKVVBbpPOovnKELlSsekTtKFfkjoQPnjFgqgGLlvMzZuUiQPpqGgmrRMkKSswpPMmjJgOfBkpgGiCiviIgAaxPIysiTtNNiItwDkKlbFRkUyMoZzONPgUuCDIjlVFfyflLSsgnwumkkOwWsStzwXzTbvVWQOQQqKnNWsDJjRPHHFlYybbEXxrzqbMmjJZcwzZyiIYIqQoJmrybBVOkgLIogsSGRohnUuhcCEYsHtKkowCvbzBhkkrPXxpODdJjwDOpPiKgVUvUheEiIHBbKKkKwGgPhlQupmFkYFfdcLlCDgBbUuWwsaHWHhgGetEeKkTpeBFzZQqzqUulxWwXLzSPmWTtUuwLlHhrZFhHfRrzRtoYvAaVhHEeibCJjcBcRrKkRwZzWsRrfpzooaLGhHgNWwyIZlLGoJnbviTtwWhWSYgTgKDdkMpXxQbUTYytuBuUqYMzZKkAazWumMUwZDNJgGwJoLZKLFTVsuViMklLKWquwWiILscJfHFqQdZCWsSJeUurqPlLyvjJVQnIiIiNjAjJvDdVvRrNqUKlLkJykKAqQXjVmQvVtrRKkmoAalHhZlLzrFKSGgbYygHhGBtJXIeEixVuUvPpVpPTDdgGtSsEevaXOWqQRCcjJgeEskKgxerTtcCRDXoWrmMRAFMEewYUpuYRiItYStCgGcpuUoNyyGgCiKtXXPDZTPptKCDxoOWaAwzOPxssQqpHhyfFYAuUcCzZuBZzVvdxXVvjJLoqvJjOBJYyjrMrkGgMBbbBwTtVvBbJuUvOoVjWwBNFExXqfFQLJjlrLPBEqQeMZzUNIizOTtmePXvGGsnSmGgMszQXvZCeEQZDhqCiwCIiditxXROooORrOonJRrjLlNRryaUweECcWXxxFfXpbuUcpEoSCcWgZzaAWfYyCcdRPpZqfiFfOYHhyPuwWpafSsFnNAcCPrOWwYcGgMpbBPxXjHphkooOoEfFZGgGIicGoOagnvaSjsSsrCcHKkhVvQfFZJjDRrdCctTQDhHpPoOWRbBrmMwQdDXzZjINnqQUSWwOgGosuoOTtMSsPxrgBlldDiITcvVCczKqIzCcFzZfwhKWwOokZarWzbopPfuqExZuUVvzEeXeMHhLHhPvdDnZzVvdKkCbBNJjAJjJjSqsJnLlCcbiISIihoOJjtNDSsNEWqkZaANFmKsSVRNnbyLlmMeZzLRCcAaFWwLEcClLxXlLNUOXxozdDBSwAYyawvaAlzjJbBiIZVEMmevcQwhHLnbNQZzIrDJbJjuXWwxUjIGBsSgJUKrVPplLnTvCuURgGXwHhYyCAavnFfNnNKEddDanNAdDySFfsZzaAJjMTSsEiyKkblmtTtcCqarbVTuUtvEdDeVWUTYyDIUpZOozPrRuiFfZzWZzGimVMWjIMFfSVdDvhHSYNnUuDvVdwWLXIKXXFEDdDdevVaAWPyEZvUtspYcqpHWJJwmMWLIsHhMmAHWwQqnzLGtKcCkUjxXJhHQBbEHnqQNhPpJJjxXUMgBbRwWrqfFyadDAIlkmMkVdEaAwGwhTYjJytHlLpwdnNnEtTRNDSsLfxXMvVWhPNnfvkLlZzfFiIKWwYUumtTkKLfNnkvnkKuUNTPBXxeMmoOoNnUJkzERYMmymMQqjiQyNnMfDdFMThphUuRUJKrRXcNnrUJUuctPpTjqQwWdDJVvjdKkQWwuUryXLDnSTNntvPSszjDIiQHhgqTorRaMmwjFfGgdIsSincNjzZJnyYUTUuMmAUFbeHhyGCcqQlITtkWoUuQqRraJBbnzZNXEsSgkvVKGeIqyOPOTtwTiILlQaUuejBRCkyYKQiOoGgIddMLxXrBdAkLcCzZEuUBbfZERrjJjqBbQHExXzZnNehVDyXTbBuzVEXxeTLAcxIwWuWVqtTQJjvgQqdDOofZqQzFaAMmdIbBjpKoOVcBtGgSakKkKAHDDddTpEezdDHrjIaZzSsAxCcXKjJPfLutTsNyQHUubBFdPpfpPnHVviyYRqQrIsgXsbEeGgyHnNYiJHwWWwXsAPNnFfpgcQMmqCgXUzZulLKmMkxxOoXqxXHSbFfhHgGSTljJJPIiJooUKkuidDueEAhHaeMZxXCzZUuSrRRrcCnNVuLlUwWLvvArBblLRaICPJeFKkfMmalLKfDdNnCpLlfNpPWwjJbBnFPzLTtTeEbBQrRCcHJjHhiIlgsSdDBIidViIiIWdVAasOcSsXxoOxXxUywsUZzhHCiIGmMarRAaLlAjvVhHxMmrBQsPHkKslUuwWWCcwtTbDeaDQHDeSsPYYCdDBbViiHhIvZnFfBbAaAPeEFftTvEeWswxXZaLwmQWYyiIwRrzZruUGguASTtVEGgpVXxvPgHhZJKkUuXprRPJfFjxDAjzbBZJKAoOpwimiIMIWdDbBLlGQqgSsnNrMmIIjtndfFaAlLDOinahODPvVDyaMAJjSsaszHhGVZfFrRaAvHhYvVHlLtTfFRHhrIiTMSsqJjHhDdoOezZLcGCsOoSsnNZGgmRrnXxNbFfBMvIBsrDyMBjfFoVxxwrRiHNnoOvVNhGhUfFCtTxYamvVGTmMqQQqrScRIaAirbBBbUusUoOuNmMDAaIfDdYyFaehHhfabBbldLztRCrXqLlQJOeOhHoZzBLlsNXxLllLkpHbBFdmTtMSDknoUiZZzTSsPRhlLyYezxvVZzCcXjWEeweEjpSkKqNnNbBngNnRhXKrOoRokKEebuUlWXxdDPpCLlIiCSTtzATTtxITCwOgGwXFzZRCOoerTtUumMmqERrenaYaAOoyhtfFXCcxHhwWwJjvVKjXxKkmikKdgpIuUfOaiBVeOzZolXWwxLNnxiIXeQkBbJiwerSsRqSsiIUqtHhoDTOsQrTnNtJTtRuUrgzZvmkKXxmflLFeEMHQqhmMnlSclyVbSaBbIiTuURrWwQqjJfIiFYytuUORrCaAXWwqQGgOoTsxXhHfFWAzKZrmMFflYycXCcQQkCcKpPfFBbqqeGgvVEZzgZOoztTGXxvVfFqQLOHeuUWWZOogGjkKJvJxxlKuSsTwfnNxhHBMZSszmbatTHtMlLuUjjgyteENlLnwUuWfpitTAxXgizzpeUVtmFtTRBbrcQJjusFfszZqjwOomMWOMmoqQwWSsqAaeGJjghHjFfyYtFpZzPfrPlvVLJiIjKkNUumyfPVvpRrGQBlOiIoKkBsSbbUAwzQwGlLBrhHANHPSTlaKQJjcfLlFJmCcGepHCGgNnUuXYAaPoOmgkyYkoOKsSOopPnHmbAFspMmPSsJbtTBoaACjXiDdYyKkIASsaqQUuoOiTtyYyWWqbBWwOfgnEedUunNcpzZynHTtGbfFmMBrhHRHtzZTtSsfFfyRrYOoqQqRrQwgGWPYjKHhkZzeEtiqHiIHkaCuEeAjCcJMsSGghYUuykQmMlLNuUZlojpnkKaANZtTzSFQqfDlLbPpVhVBbvMmdOQyaAzqbtTdDRyeEYrtTZzueEZJjBAapjXxJkUugGvEeBYydBFqxXEcLchNlRaiIEySsIiCcYCfPpFigYnNBXxvUuQteoOqyYWTtmMwDtFfFfTdQEVZVvKIvBbONOoemMsSNneIlLeNchHBvXxapZJeEiKkXoJlJjuKECWxYRBFfbjuUFRJaAtTFfjrfqQlLWwLCtTQqVvgYeEyXfFBFfFiICcfbBRrMyeIqQAjpAaPYZzxkjqnKkHhMlLVvDwWNLqmrRVfFxCqQGZcrnZusOoSwWTtdvEXSAaydlgGLZyWwcCSeDwWWcJBbkzNtTpwWyOoxvaEepPWeEOWwdvVkrRRrKoOcCzKkzZZWQqwMmMmHVnknTtDyEeYzJjHrRQjJjwiwDYytcVveEwFCcbiIUuLbPrRGgXxpfFlLvVOfFFtTWqanNzRitIEehHsiIkKhZvxgaAybBKVvdcxidgelfVVvlaAeaAevVENmMncKkwDSOAGXxWYFfnsIiKAakaAywmTAjhNPGqQgLlCKsSaqQuUANnSHjfFnbfFKkmuUJjMaQqAJjBSsOogMmmVveEqTAYATttNXbWoLlvVxXdDdUkKuByqhHlJjKkDdPJXjQrRtHSrRYdCuUUuQqqNhvVlLghNeEZzmSsSqQahNnHVvvVnNQcROYKiUuPxXxXpNwWniILUuRjJrlItqQomMkvVdDMMmVXxvUuTUusCcCCcCcMmcCnNzuEeXxFIiTBeECcSFiNnGwWkKvRyYrebBdDEYfPpFyBefHhoJKzfGgqgGFLlTWjJCCVVzqtOGgokKlLdYNnyaeEfxXbBFkKwWChHVLlZzvSSssbBTrffhFfBbjJGanNxJosSZUnNOcbBvazZAjqznjJoOjWwEEeeqgGQDdaAXxAVDBgGtThhRLlBbNzSQqqUpPLUVfByZCcmTNfiICcFfPDSsiIUuyGzkXxhqOoQqsxXmYnuQqUNyMrRyYUuQrRuUqSwWqtmMMaKBbkescCSQqXwwWgNbBnOVDeEuwJHmMVjJjpbrRfYtgGEeqQAUuIxXiUfUJjrRFfkyKkHQifyYRLlrzqQIitTAakKhSswwWtAEAWbBwTeEPpgEpcxQqlLcwWSsDdnNftTHoKpPkWAxWWZNnCcoVdhHDvOfFkKAKkScTtPPpuRVvaArUNnvVvDxMmXpPddDYyHhbBuUVgULlQUuNnKbBQqwCcWosyXxOZOLldAfMmwWeWiInZDdzAaVvgWFGgfLlFQqkSshXqtTQdDnjfWoOCcvQuVvUqjJPpMyvVxtDdfyZGgwWwuLlUCJAaOGLcCwWKksrRIOoChIkSWweEBbhHcdDMDPvVmWwMSsVfFvRreEmXfFsMMmmSWwfoMqQFfmONepPSsLlmMEnNHhntnPXVjclCcLNVRrMkKThyYrVNtEFeEvFrRJdDAwKkWgZIizjJGaiWWwJjwSfPljZIPBSsNekTGgtoKNnesSEHhFveAaRteiIEsCcRsSrDdxXyYmWDOomCCOGrRgBKkUIAaxXKkMKFTxtEsDdHdDAIiaPpwaAWhEeIHkKptTPEnNRTeaARssSwxojwWgIijlsSzZYyXxOGgRVvZzajJARaAcCrYyVRKbqbBkKbBQPDdpBamNnonBbBbCjXxVvJjJjLfLlMKxcLHhAYyzASsCCXxycwfFVvxXUuWfdDBlLbgGSaAzZaQqlWvJjgXxdDDsKkUubDdBDLldshoTwWZziaWLlLlwOoKkuTNbfFzLvVsSYJuLltSvVmBkKWTcIiCKJrRRMmlkDdgcCGEeKpPAbwOIKmFxXXxFVQLlEeLlqvXCcyYxfcTVvNnNpTFfAoOaUCculabAakKKkjjgGFZhHzrRmKkMOZzgCcGzoOGYNvVhmMDkzZKdGgqmMTtQarNqQJjyYfFFQpdUuhHpdlPgjQubBUfFkFfFUunPcjIDJjdMoONdAaSsDnPRiIrTLDdBeERFoOfrTtdmuUMEnVviZzgGwWngiDMmhsSvqxBVpPtTzPvVTwWTtQNSsnGgtnNQqGweKkEXwWGPpDBbdWIiwgkKsSDsdDEggUAuJjUirGgZPpcXSsDduSThhHiIAarvVJjapPdKKGfGuUmWiXUPpTNnhHWwZnNGgVvjJPpdDFwWjJzeEZmPGIRDdYyDgGNUuTtwKkMQbBfFrTtjUnNuzKkKkZuUnERrkxrnIlLiFfNnpPLwZYBMmjJfEefFVTREertbQkKjbdqQDDmnNxoLlOpqjrRVxXOhVRFfoOGEetYUYyuUsMzpPVvdDEJfFMmjTBbuCuoyYkKoOksXxNKnNMnNAdDMrRKklwrbGrRGXrOGGZzfQqFvzRnNdDQAaqTtrXxBfFtwWDdDvXZOShHoOMNvVKkHYTfFzbNiHhyYafETksSKWmeEMZzfBbCcFFnvVNDdoOfmMunNGlLIiyYQiIqhHQdQsSwWaAawWLdLlNnOmyMmSseIiOjtTpNlLnxKLlkCcXLaOdGiIMmhHYzZqAUuabBQLlgEtTeGWnNsChHbGbpDdiYDxeELtTNnUSAaXHhcCEyYPDKbtTsnNgGqQIiHnZzNKRrJjhHJjJfFmMWxszYyXqQyKfrpxpPpPXPUuBZzbBbZcnNoOCijJgZJIeEirwWRTncCNtaEeAOopwpbiQRrJYyFObrfDdbFAPpieEInVvufkJjTVvldqQqGzNnBAaPGZbqQaKkkcUvVRrPpGdFSyIDrqMmIsSLAaLwWKBNnvVRtTiIBbMctYqAXxFftmMLlJiIjptTmjJesReTfFcCiqQDdEehHrRzOgGCeEqaAFfQHVvStTzZDdoQMmiBylEYHhjaFrRaAQdDvVOTBEeooLlGlLVvgSXxjPpJeUprRryYRKkxJjetTWwGgpJbBtJkKUutgHhCcGKkTJjjGoOgWrzZZdVvDpPzZkKeEyraEZznNaAThHfsZxvCcVXxdkNEedeIGgEupPUINnNZywbBWyoOlJjJMhHpPnNfFmjbvVfFhkKRrLlHStrcCRTJRrfFddrzUuPpbvkyYhoOxGNFpuUPVqQBbgjyYJIiPDdcBfFbfFCIirHhkKJjROohEeQAhWwsSbFQdDzZtTWtTUZzJjQBjJboSesLlSEkKPqnZzmMuOiIomMMgkXxhaQqFqQOVpPGgAaeEalDYtIzcbeoKkOgWXrgGmmMMmXGIHwxXBEGgMrRjJJjjJUlLuUAQqHhauRrDdNaAsZzRHWwhYyYEeyhToBbwJjZzxsSyYxXdDcCskKSXEejJJjAIaTzZtAsaRruUAozyorYyBNnbYiUuAazhUWrRHhTDNndPZzptCcXxiIujRrRrmMJUxYlFNlsyapVvPTtvpPrisSywWEerQqRJmBbiyYEeWwskFfvVvVCcMmqiIJHhjCcLkKOorRlFfwkwVkKvEetViIvTgIgwHhWmXNoOnfZzakHFfXlKcCkPnNBJjcQqCVvloiuGuUgFOoVvfpPvWKkYyvVRuUhiIRrwJZbBTtSszUJOofFNmlPzmtTMPUupbxXttTaUuupQqsPpAaNAanSXxUusSZzyewWEbBGiIgkkKbBKbByYmMYKGwZRKoZmKkDEewOxMmXxFfqwyYEnNpPfFXxUQqDKkduQqlLCmuvxhMmTtHVvXAYybBaSTtBsScCZBbzuUuSZMjJDIiKkgCccZzNuoOGuVYyPGYygphHuULlhHyMmYgwWGhHVaAQqyiIklLwQksSCcULSsnATtVvgKkeLVpIFsUuSAafIPyiINjJSubMmqaAWjZYyornNYVvVuEhHtTTIiAatIieKeEIhRdyejJjJjJNnjuArRFCcNnfTtmMlqQjXxPpYydcFfsAaMfFDdHhgOoonBgEYyeeEdDFPpfTtCxFhjemMeERJcfFCZZNnzzNnvBhoOoIixHfiISsQtLgrRnNGlTkKyDdTtYXzZxkKAaRfKkcCezEPsSsSNqYygaAQqNVaAvPIoucCPoVnWnXxNsKexVopPitTmzZxXPpjLTiIdoKkOndzZyYXWuUTEeWwtCyYPsSpTcAaAyYayJKkFfcCMfRrxXHQjJqAaeEJbBJmMafFfOotTjJuuUUrDnyYmhHMUuoOcdDUuFyYfWwKYyrHaAHhuUcvptTPzZmmroeEqWSUuZuUXxvViHhjUsgGVvSWlLwcMmpPKAAaYaSsSpBXsSyYxbPqQsAuUJNqQylFBbfLzzDIyNITttaAwWyqQkKHhthHmMmruUfFjJeEYyNUnkKoONuyEdWwuURrulLqcChWYEDdNnnLRrlQMPVvnWasSxatXmMxvVKuSsVvhSsAaHUkZzwJJJPVvpPtQUGCsSvURruOopAayXxCccCbBWhvwSsWQqniUETtIwOocsSNCcXOoROMVvnDPpxXcCTtRiJjBRJjrUPpqXxCGCFfkKdSWWwWwpPtTYtTyoSpPyxXLlPpYGgGgwCcVmMxXvVDlLToOEZzefFAaEcCvVGgeihXxHlLITtEeTuLxqCXxcTtnNWlryYJRwWrLljGgRHVDdsdDSLlMkKBZYhHxXyzbdtTxMmfgPpzCcZKkTteWwEGnNcbBcCQqCyNriIZMPhxXPrRgKkzsaAnNjTpPUuvQqwAQOmuUtQqMRGEUPtAAaLmHgpHhPOoGzDJrdCpPphinNIGgLQWCUpPueEPpYaPBGgdMyYRvdDSvjJValLRrCcllLbjJjBGbBCcgMmXuUuUDdDdgPpGxwWZzmMWQqQPpgXIiexsSyYoObBtTFfXxbYyYbFfdDXxRrRaArSQAKOokDdclhTAKQfpEejcCVvJvoOZzWDdGjxXJWLlLlHhaGhQqcjWwNSbBrRhrjDcCdLYysSDdlMDdmJUuNnKuBblJkKjwWHhfmcCFAOozVvGfcGxrRWwfcCFqIzZAaiTUGjJCcHhgwWOcCSatTpCrRXFfYWFfkgPpKkLvVKoOwWqaAQkOubBKkUpPfcCXoOfFkzZUcIfFlLoItToUufFOpQqxXIkKAawupPeELlWxXCcoOwxHzCcZBMMmSsmpPObBMmoAaETQwWcrRvElnVqhHVCcjJvRjJtTziIGgUOFfIlvVmMLzZEYySPpsShtzZTuUHnNwWkKnpMmLbwKuOoMmzZUoOoCMtTmBdZXvVpcBbDiDdIQgGqFOoRfqqQQcCdDFrRrfHNnhbBsAaBbSAahNnUKkhHTtkKmMQZvVLlDfFdBbEciICgEevBrRcCllLLBsSIibQgFfGHyYdFfHHhhGgfFDgGaAKKkkDQQqjbbBbPpBSQbvVYypPLlHLlSsgoVvOznZOfFkErcCRrmicTdliiALCclqXfFLlhHmMvnDdNEenNdHtTzmIiMgBbGHTttYyThgGeceECEvVZPpDdDTtUCcCNnaAFcCaxXUIbgGBEGgeWwevliCsTsiMtTsFTtCxXyYEqEeQsSeGlLFfvOzZaFfAoVFjZrRTtRiIrcCaAVvrEeRAdiIIipGcMIigNYvaFfAVwWBuUOLdDCGgfguUJJjjqQmMHjaAIiLRAYfHhFeIiVvmPpMSzZukKcCUGtTlhHDvVQqxEeVdDmAamMMKPpTtsSkKzZQMmqYSLeElvVsUIdDJjVvelLtTGBSSYyZcCeEFUxRwNfFfQnNyMKkmJgDdGnNuvjjnoDcCdOrRyYpPNXBRrdiIsSlYFfcCjJBbyXhiIECcimMvVsSJTttdAaQqXXxLlWwfFxdybBiIWwkTtcCWwKIJbBfFNnvVPpFpvVNnJFfjZSsRrFxXUpHhPCpGNqfFXcCQqxYyxZzXdDjGgJAaAaKFXjZjJcCnlLNGqQMmQkGEjtTAaNvxXxyHRrCxXZeEzhXxTtRrHUpPuzZRruUIUwWrRuLnkKNIiVFfvIIiqQKkpPiyNnHhLHhOTlpPLtNtTSsQqPpGgnFVVknNeESOoRrRrlWwGEeSjJsxXcXQqKnQKXYycZzZuUbwmBJfFYzFrRfSGUqWEeRrHhFIAOcTvZzoOKBAaqiIQiIVthHeEQqsLlJWwppciRJjZRrmGvVtDdTjiVvHCjIiWwtFFfbPphHBdDfvyTtLlNnYWwkmMfwAMmonNTtEeRsSrOVvwlLezZbBELnNrRKklWchHKkvVLmMlCAWwaPSspiRfFWqcCQDnwsbBSvVwWYyLKkwctTDykKYZiIxdInRpAxlLhHXaDgIiGbjmXtTxMXxJKkMmBbBsBWwlLkLlXxQiTriIjzZVvJDdXxrRTtvVTrRFZIipPKaZVvzYaAtCctTFfnNKknbqtThjJklbBvjjJKqQkLlRKkzZryYgvVKkRKHhklPpgGTuUaAVXxeSsEPpvZGgzTMmtRpERmMpmMPUcVsSvnNDYYyHQjJqhhkKHydosSLlpSiHhwWltEeTjJfFmMRrOmkKMpTtNeMXxmCxzNnZXiItTcyYEgGCyAaGggGYsSDdBOobmgGxWwXbBsuYyEeUmTtqQRrWZzBQvVmZlMmrsFfSgYYcxtbfFnwlLuIhHiTthHtRrrySnpSspUMCXxjSpPsvVJfFHuDdQqUtThNneqaAQKRrksSzreEdDRMoXxOwJpPjJOSkKjPpdydDqtDPXSsgGxUAauQAawMmdFgGUuJgkKGnNrRHqoGrRIMudDUnxjJXNmiVBbgGvRUoUuqoOfFogGqjJSgGFDrRdWnNPVsSqAakCxXcKGgwNnZzUucCFfbBDHIiiIhdZzmOQokSsAzKkZIiDdKkGgmMUuyYpjNTQqVUuvvMfFnNSVvlIqQhdQqzZqbaABIuUtOjvVyYraVnNXxDdFfxfceLlhHkUhzZfFVpMiINncuUXQUwWWwyYSOeEosStfFGgvqQViICwWQDdqvVcygGAaYGpcCPzxZPpwMmZvpBuUeERrbIizMmZPVvpWhHeLuUlPpfFPAaBbWwbKkyOoWiIZsCcSzfFQqiIRAatrRfFgDdjJMmcRAaIzReEIiYsSARyCcYXxlLbkKBxXpozZRznJLivVIxXpltTYyiHhJjBbkKIDdLUlJAIiPpZkhiIYhJVsSGgAadDXnLlMmpPQjLWtbvVIisScCnNBIPpGJpPCDdzgGTtZbKksuUJvVxXjnLtTdNWwWsSlLwMadmIiMWPpgGOpPFfhhHHfFOoFfnpPOoKoyYUulLdDsMdDOomcmqQkKENXxHeEhMbdoGheEdDhZzsSczZDuUNnfRriVvcCIFJjIhHiefQqPpiNnPpXueEUgWwGcCMwWmxJjsSmlLsSoMmSRrsQSDdGUqkKQlLMDdTtdhHpPXEvVMoOZXCjvVRrJcGgEeNlLnqQqQxesEemIjbBxNnXJcIIifKoOKZbnYrRvVysSEemMzjIidIiDvVnEeNnNqOoWwUuQixXlLGgapPeEBCbBuUqAaQomrBbRgeEruFgGjJXMfFmgYvVnNyfhjJzWJvHzZtRrTcChyYynNIpPiYVvEeGefqxZwWzXcaAXxCBtRrkKoOobzZgiVWoOSQqhHswvHyYhIPlLdFDdPpDrhNigGMcCVKIRzZriOOPFfGFfyYgTrjuxXSsUamMMqQEeiIYlxXLPKkSspPlLyYzNqQlLnrRMivvXoOxgGTtYyiJjUuJjQqTdtTDsyYJjnNEeHiIOcCKkodDRYyGgSsZqQzJlLXxjYyGgmdDXJAZjJwWIpQMmpvUfFuNmMsGqswyrREehvdDVyYUDPCclLhhcWwmohHhDdzZHNnrROMaVvAslLSdhHNnvgGHhDdrRBbhHVlLGgDjJSsSsiIyYCatmMuUzFfSsxWJjJjrRwdNuUFfbBOoJcCaAiIRFxUcCcDdCXYnRSsCkkKgGKNnjAvwkKWCcpPVtIiTnNgGVeEDQBBbbqdTbBEetvamsSzizXxPWwtTpZgGPzwWWwBbZpaMmArmUuMRIMeEXxtGrRgQqTTdlLNcCVvnNuUPNHhugkKvzZSsuUwWuUcCYLROPBbRPRxTtXjpPWwXxSsNnJroDdbBNnxFigGIoOCzZTyYSstTxXfnqQMmvtkyYKpLltqTOvVoIYrtTNDvWYywyUoqQTjbRruUmdDMMmkKXzZxHBbUuyCaAlqQLcAYyaBDdwWbHhjJVvHcOorkWlLmoOmmIGdLlDZVvhjJmQqMHaAzyLlYMboOCcKbBCUuhHwCcvVscCSWMpgGODDZszCcIizZGgJDdjVvyqQRrgDbhHwWOAAavSdDsvVVdxMmRrXzZbBKOokQAuiIUdHTSsthDkKPKkMfFcUuCBqQbmoOsSpxXpPtTGgHhYyESLgsSUdDuGllLbgcCuUUuULqlLQaATtIYyiluOHSshhHEWRrSswWwoVSsLFfZqQzbBlVyOLTtozQXiKkjnvUzMmlrEJprRPjPrQdJjeGghRwuUWeEcINXxnisSTtuLlwWvLGWwcClIiKbhHBkfFaAGOcCtTXMTtmyYfoOvVqdDtbBqQrDxXdmPpwOoWhHvcCFcXxCeEqxXSsgldoODXxmSVvyAWFfweQvVquiIUIQqzZigGnNEPpDNnzYLlyxXZqukKfvYyVOokNPttTVbtrxBRrwWmMfCcaAaAzlsSLCMHhmrPfriIZNcCNXqQMeqGgQijDdcCCcJJjleEZzZzsoNnnNwSsWDdHhQsSqZzOiISLyTRJXxjEbwWybBYZZOzVdkKDvZGgNnBdDVvbCGzASsaabjSyYEeUWwkzZKGgWnNrRuJjcCjtToOeEpFkUyYuqwCcWmUuWvVEegGwWuMxXSzZsSBbDdWwQiIqIiBRflLPDKaAtTVvyIiYyYAaaAacCSsxXAwWjOomewWEMKkCcnXxPUupDdZzPHhpECcyJFfLlEejYEdDzZuUAstTSlLcLpXxUubQqBbUuuhHzZFfwXaNBSsbnoXfFxUabBxapPGEegFqQNzZWwnfADdIPpiNnaAzHhImMtTdQfSlsdDwPYKIiZzOqlLFfYfFUnUzZswMmtTWSbBBbBiPpIcXxCLqdDLlQWeENiITchVvHwWyYzZrRKkCPpPpGgowWOYyUfFuVrUAzZaFwWBbvVfuUuqQRWwtciBBrRbfQzZqKkBbirRInNUZzujJNtZzAiyYYymMukERreBbLnsYySMsPxaAQqbBXQVvKkbBADdpZXMCciFfImTgEAaelLyvVYPpYtTyaAQqsXxiISGfuUqQFvVWXmOoMccCCCcFPLlAaaqBbijMhxXRFfarRATtrhQulPpLHbLTtMmvytTEebXLlyYdiIcBbFuafxXFUuSIkKdDZwnMmNtTiIWbdDYrwWtrRTxXPpVrgGRiUomMaAoOlLKrbBSXxsRCcoMtToOmCRrVvcNnFyeEYfEeqQNnOoOaGgfFqArRaQWCcwnNAiIRzgcgFVvjlfRTOocCtrJTAbKkyvVtAjJpPQqamkKUuNAoEeOtqQTiIBEeJfFvEdDerRKAlLapPkrRLlVTtNuUqHMmgGhZUjRcaAuaAqITYasSvVAwWMwWkKEeQqoOHhoOaeDdEAwhHWPkeESjJqeEQGgSsynlGWwfzhSYycaAZdRSfFPSsWwCKkcpMmshHIiRERraAIiXyTcCTAwWauSsUwXXxGjAaJgahbBKrRfEkPpKeqkKDXuUbBooMmBbCaAQQqqctTOvBLBOHhodgkrRKGXxaKkaBEegGbONnoAyLlmMmAaGgMtsSTYNCcBbnpcCRroOYyFYyhyYxmzZMgzZGlpYyEeJSPpsKiqQILlPpPpkWwFyYFEWzZwevVBbfzZQcCqFfFcCspsbrDhHdDqbBEMmIiMmjvYkKVTxXtmQkKPpUcCuLLllWwHcCVcCvTtQqoqQoEeEVvezLHhaOZzoAaRraAcCyYUuATJWLlwkGbkkKkAacCVIvVPpXVvxLVbLlBuvVsxqQXSUqQQAaERrmMwWuDdUYgKBbuUuIoODNwWoOobBObySsYoSswOFTUutlzZkKLfURGgjGXxgJdDdDdVhAVwWIQqiEeWwvaUuGgZzXxHNnoOvdDUukXbBxFEefKtTDbmMeGgNnEJjGgdDdqqeXxEeEBbyTYyKktFfYQFWBbjBbJwDdmJjAaMfCktTKKkcAacJjCZsnVvAaNHhxbBBbqkKQluraAistTgGmMLlSeEIUucSsCsEeCchpyYPHHhHQWMmjSdXxQqRTTttfFDXxZCGbBgEJjVvegGbBbBqQaTtAwLlwWlnNOomMtTIlLDdnRrdDNJjMMaAmnNaaRrNbBaMmAhHoOyYyMmsSXwvuAGgadDRrbBxaAXuYyUUcCFfSstTHhpPOoioXAaxTtPphHuqRrQUPtTpRPprNnHhOmOCqQcoMIUolxXLcCDrFflLRdwGgIwWrRhlLHevVJKkjEgeEZzjJkKGVCoUWwuOcCHlLZzYyhGglDRkKrVviiIkKINIiZxXiIbBUSZzSssalCcLAlYykKVZezZErRuUPpRTtyDdYDdNnYyrUUuuzYjetTBbEBsUuSbJZovhHagoBbOgTtCcylRrDhHKkGnNgdLKwWkNngvVPpfFlDYykKvjJJjozZOTtaASsgGvVToOtvEeVVzZEeJPKkpjWWLlwZpPaZdtUuXePcCpDdaAwoOWfhaAcCFHhfejBbJFfehHAyszZSEAaeUuBqQYQRGgxXrKkqHhyZyYzlLxXEFfqFLlfJlLnNjPpPfFaApAaOoQosSOCcdDNOonecCGSANnaYxUuSQqOonNsgGcGgXxChHCctTOomMBbBbwWGDhHtGxXJPpcCPpDQNrRnqiIjBVvxXFbaAPprZWwRrYCcybwAaWtQqCcTBQhHqzAaTtfFCccyuUYyhqQRRrYypPkKIiuFfYyUaAxjhtTwWujJUHBUiyYmKuUkyYXEuUeoOkMmgqQQeWwWLleEvVJjscCJMmBbrRjSsPjJnNzWwZpCpPZzIAxCpPPdfFDpGtTEerdDRGhHwWEeGgxJjXtTgGFfAaXxuvVwAZzaHhoOOoHLBbjJEelCJjDdRtjJLJAkKajkKkDOodImMiKLlLJjllTkKHhskqdDQqQewWEbBlpDSsNkKnJjKkGgddDPLWwJjzZcCylGguCcZyfFoOFhPpfFZzCcHMNgMmDdGgZnNzeEnOoNXXTtYrRyjXdDxJpPlLEeodDDXxdNqQnxxXXCclDdCqQbBYEeHuUoOlLhtGgVGgWqQaFfAXqQhMxgGVvRrTeEtGGgtXJbBFFDdAaYyTtfvVfjxTHhCcEiQqMmfDdFlQqLVhHvwEeVWwvFfAXxdDayLZzlwWYqQniPCjxXJcZzpPTtbJjcCqQewKkUuOatTYytEsSJjqQAaRrsScxXeELgkKGZzpPllLzEeZUfSsFuTtpeuUEYgHhkKGydtTtBbftTEeFsOoRriIKksVvSsSAaxVUuHtTZXmMfIGqQgigGpPaFpPnNWwfFfYyAOoXxPpfFKkPpCUucEfuVvUFnNKknthHBbTNEeehHgarCvuSsulLHqQyNaATtHpPhCcZjJOKkXUuxoLysSAadIipllLLPXxDNGHvVhgnjJZzbAaSsEIieBRCSaAIispPGgGgGgGgRrKkDdVGgJjZzvkKnNlUWwdDuOgGJjoJHhkKjLtPIipEeJjHSsifFeEIhYTXxoOaAAyYaAatLEVPNnOopNuZMmZzzUiIAmManzaARqQVvzJEeEejnjJmMqoOzcCtLlRrpeEFfPYizpPZkKOWwozWsSwdduUDDEejJZfnBbNFZcCLzZlOodDZzqCcilUuLHhITtJdDzZTAafFZHhzhMmHfeEGgUNLlaAvVnonTtNVvOCcvvVVjJRPiIpxxXXkKPwWPuUJZAakKheOCcoQmMUDmMAaduCcgdDGCcyiuUITtOWHWwWwhsShHNtzHLlaAhUujfFJIbaABiIiHDPpSssSdhsAFfaiIYyhTaJJjjvVAtIieEGvVNnxsSXpPOoUxgGWwVoOlThHtWwLMmMAaSFfbBRiGgJjHyjuEEevPqcKkmMcCwsrqVKUuTGgkDCcdGSsgpWwMmPRrlxXnNKlLlEeNnFfLwGdDgWngWEeWwkTtBbKbBDAvVIijJtTgGIitThHxXqQbtTBezZJoOVvuUzZjaAtOotuUTTPpEsSqQdDadmMPpMmgvVKxOkKvVAatTUMmuzbETtWwwWhEeHdDvVWpPwhSsSqYyeESPwBbiwWppbcCFfBlLtTdfFgNzZjJnNnODOHhokKxXfrRXTtqQxIiykKjJYpPJiIjrerRHnNhmMfFaANqDdQhHAMmvVuUzZaXoJoCcRrOjlWhHuUhHmMVvCKkYytTvVjCcBbEeKkluMmUZaAzVkKVvkilLIXoOxiNXxnJjdrUuRJjNWwuUrRnOoCNneEJjcAaWEerRgGgqqQQbGduUKkDZxoWwbBOGLlsSgXMmoOjJizZjOBbzDgGaAdJLgpGgPGAGRrhHgOoNnagPkKpHQoOqwQqxXWtTjWwgZzGXxosAUuaSJjqDdOgGcCxXvcZoOqQzCVvVjJbBjmMrdDRJWtTJaAjwweEWySsrRLtTlYwwLIcCtTjJMmizLldkGgoAtJjTalLnNOJUujSsFfEeKyYDzZnwbBTQqtCcMcJjBbFfuHIGgihhPFfgHhGYypPgGfnoZzOHSOopPYyTtsjJaAhJjzIVvEvjYGQqNzbBVvGUuoSRrkKsOTtwWCcgZbOnLkKCcwWrRVEefpPSYysaACcCcHhInoONmhfFfTtVoRrOouUpqQPOvcCuUxMmvVXIiBtdDgGEyYeCJjAoOaiZzIeUawWAnNuEbuUBXxrMRZzhPlLpOoGgZsSiImMzsYyozGgZBbKkIiOaQHPpnNwWhtTqVmMviIcHAxSsXahYFfydyNjJUunxXTcJjmMCtFZzQqoOfmMkKSkKNPnVvpPrRRkqUTtuVuUIivcCQjJKGgkcCKsSrhHNLlXSsvVbMmeJXxjEAaRMlLGHUbBukKpPhyYgKBbOoIifFkvWmgUusSsNLlfFYPpyTtnuUUuFfoOFfNnLhiKvfFVfFcnjJzZNjHFfZzhHjhHFfJhEJrRMmjXxfzraARwKkxvVTtbaCcATtbBzVvZzuUrpPRZBXWphHSqtTBbNnIMmiBbPpiwtTFxgsVvRrVvSGTtjPpJyHhiIpPEeRpPKrXxzZqMmkKHhQRsSJKkSYysVfCXxDdAAaMmftTFaZmMzFfuUNnbxXXxBbBeEDdNntTtTTttxXtTEeTtTsyYnnNOMmoiIdDeEbBOUuSJYyjsykIizZTzZtEyYeKYMmnFfYkNnjqQINnTtiFfGgGScCDdqQUMmlPpfFvVMmoOLwWIiGguIiszZutTbtTyYsSBTtSqkKQRUvVuAgFtwWTfxXEeWHpPhWmMRbBnNXxrchHCwGgWIiuUJaAdbDdxbBFfEGgeToJjOERmMreCchHtNnhBbHGGgRWgGwqaApyMmYuoOFErqQacCRrwoOYtTTOtTodnNDmMfUQqVLlcCULlmMLluqQCpyYxkKHhDMmvVQxXQqqdwWpoOPXesSGgRrcCmBbtYygGWWwqQPQOOowWSsspPSvzsSZsSMmWgZypPsSxXGgwWecCoOfFQqEPpYEmFfoWwTtJjsSwWOMnNVVPpvvcCLcCpysyYSCcDdYDdiIEerLlvmSsMYyCeEUCWwcuJjsfLgGlFSBbcHhClVvaALbBFfbSssSBeVvjRrjJJEQhFbBxXaAKkmMhTtQpPcfFLlCqKkhHlLHcCfXxYyuFsNnSfAaUXxvSshHVHDdTtRtTtaoOFfAJjqamVvMiIANvhKkHVtTqQtTzZdDNVGgvnXxtRDdzMmAXzOoZxYqoOQYyTtMBbOotTeCFmIzZixEIAaiDmMoOdRrXemqQgCcGMDdXxdDmbBLlMCcqUujJQaCwWcBpPbwpPWACcCcWZzDdoeuUEOwaSyYsAooHgSsqmMtvgUeEuiIGmMVRrlkKbBLTyYGgQqFfQFJjCfFXSNhHAansfXxFlLxjJqQZzaAWwsoOSqQjzpPZJsSciwWHhqrRQEUuePsBbvVRdaAakKOoDstTSdAXKkxMmfFTtXxbjkKJdDtTBNnKAakSeEWzZJjwtTsIixXRrIiUZzuDbHlLKkhWFfwRrTtQqRHhrBgnNEemQrRqXxcCPpbBglqKkQLMmaAPUJjZzCVkKvcfZzFirrkyYKRRMmVvPpufFQEeqQUuqLlyYYJjGTZzRraAtkKGiIwidDIWiIWwwRrqVvQxTQqWwtWVvUuwXlzZBbBkKkKbkmMEPtTplLzZFrFfRxKkXqrWRmSscMmCMahHAQqcCvDdpPVDdHhGFfFKKkxmxXbBYnNYYywWnkKNjJycCWwYIFaAcCoOHhFfBbfOKkoiZzyvPkKpVZgGEekKzMmjBbIiNnTbBtJgGcCyQqmMoOQKkqkKRFQCcqKnNkdDbBUufrxXgGMXfxXFWwavvVzZVSsAcCWsSZzwLlXYyxBbLtiIaAiSsITWwluUklLiIHhqAaQiCcIuUHWEFfiIiHhfFIeIqbwWAaBQLNwSnNtTslLkJjjJKjJAlLjJCkKDDdWwdchndDNLEeGgeCcElahcCHhQqNgGoOgGnZusSUuUCLzZlKkcKktTCgZzOoyLlqQkKoOoODgGdKkkoOKFSsBbZzwWfcBbCqQgGkKlRrLGguUdDXKAqQajJTtkfFvVzZaAEoOGTtgAseyYSsECcwWeWwGgEVSsbYuUVcCBbWwvmMVvDdXxgGDAadwhHWaAfFccCZzuUCNnNncCKkBIikVlLvSsKeERcCrEaAesBbTvVEetDdxoOXBtTeEbOosSCeEcUUaHhAZzNGgnuiIhAaHuSzZsSGgWDeEdMmwnSsNzZvVVvPyaAYvVuUoOnTcCtAaaAafNrROozCcfGOogFEeMsSjdDJmgkXxUuKGtqQThmMHiIPsSxXQGgxaAXqjYyDwJjJeLlRrNnEjVBbSsvWOoeERyEeYIlLoEemXyYxWfFwWwhxXuDORroHzZhdjMmJUlLIiEeaAsSOCuUcYjiIqQOBboJbBlLWSsLlgEZzNnGWwtTMmgJDNnBbdjnNNnMmqwWLRIirjcCxcCXOoJjJUusrOoRqQtpPoOJjLlTSDQqCcdlmMoOskKSkaAXnNXxwxXKamMAIMmiQqyyYYojJOkcJVvvVryYVNnvRjAuUrRarqaAZziIQyYDuUdKkSWwsRIOWCcHfkKHhFRrsaQqAJRpPrMrhXxNOonCcHIXdDxEeiqQRFLmMliISGgsOofHhPGgAafcCSsjeEfFiSsIJsPpTRFfHhGgrClLcmMtUuVvnAaHIaAYyvVbBihFyYfEeRGgrqlLfFQmMvVMmtTvVPpQIiRuNnUzHhAjJsSMmJhHjwWjJLSspPlGgUFuMmoOUiIfTtkSsZJjzfnNFKNeQqdMmjJDlLeEEnMIimUuuEeSsUWTyYtwuIXEexEkKmzZgGquUQMdhHJjDtRiDSscAaYyeiOvVAaoXxIEFfVvvWwKkUuaAfFvVwTtLlqQWxXaaAzZXyALlaFfJjzhHZmMGgYxsSYyPpPSsSsgSsCciIAasSsSGxBbXVzJjZTtKivmMVIkSFfQqsWwNkKRPpgiKkIxtTXwWyYGroONDdRZVvzZzCLltTQOVVvvoqdDYqQyrRlLcLSslDcCdhHNnZLlGgmMzrRBbeXxqQvVMDdmaAXfFjDdJUuSsAaAacuUzuuUUZYKDdkyaACbBwfFWSwAzudDVvDdTAatrRhHoOwWQqxXaAUAoOadTtDUuGfFmMzmMZgogGOPXxpcCbBAwWLlwWaTWRrRrQqwjoOJtlLSyYsTvVmyYMtbaAoOyYBIXxiAgGnWwRrbBAaNUxeAxXaEJjXjJuFXxzZQqfkKDlSsSaAVvsLEeAahHdKSskWoOuUwBbBQqbQqMmHFfOohdIrxXuURRbBryYCeEwWsScyfFPkpXxFvEQrRqeKkVfjmMEeJjyYEkKgGeLWwVvHBbhlpnsSNPUuzZceECBbiQXxqOAaPpXxuiIadDAXxXDdbOoBkKaAxTtUoGFfNnBwpPpPWwWWwHNnhIibopPsShHEeOxeEXgXpPxrRrRwWjsSJIotTUuOkKsSeEOozlLOowpPcCfFfFWqQDzYyZHnNhdBbgGZCcSyWxXwYsZzBbIWwiXxIrhIiHRZmMhHziAaKqQcrRCnXNnIiHhxNQmNnrRMmgGbjJBIDdiGpPCcgImMAaNnEeELleiYDdyPpxXAabBuLlUMLlsSaWXxwgGkCSscKJjNnLloOhHStTszZJjAqDdHhKkbBgGkNncCzWZzwrLlRZsaASNnIiHhGLlUuwWwWrRuUxXrYyQOYyoqnNRVQqvkgGlLeECsScKIiJjqkKoOQgJavVrRvWkeEKwYkoOCDOodpPcKyjJNnQqVYrRyLljmMJceECArSsRJLljsSoOPSfFwWRNnrdSPpsDspeQqEUuyYLlPsScCWwqLluUQdDfFpiiaAuUMfFmIpElLCcRreGgPgGkKATtcCJEetTWwEhdDHeYyeEjaIfFGLlgiYyIGPpDdgIjJiUUwWuqmMREerQOQqoANnaHhUudnNlwrRLlUuTtWLCcDnCcNIqQixXKHhbotbBTVpPvOuZZzKPpvVoOkIigeLlEMmGaAfkKrRAaFIDnNUKkvVudRrUulQyYiIpPwWhEeHtwWTNnhHWWwXxwuEaAegGUjJxXrddDZzDRiLlwJjWRryYIpvVPqMmLxXQqkKllLaAlbBaALOoyYmoOfFmMMKklaWwAVvTtxBWsSwbsSgiIjmMQqpPalUuLAJzZSZJBnnNzZCcPpNUPpwWyYuUubjzXxPpFfawqQWfTtFAVLlqQvYkKyIisovVxXOsCcFfSpPkKBbGPpPpgcCsNqQIicyYrRCXxtmMTnWwyaAYZIizLlSvVzZDdyfFlLYAaEelLFSsCcfOoztwWhHkkKKFiInNyYfWwUuXQrZzRqCcXJjxQJjqlFpPfNIinLlLccwWCdDnRrNZzmMKkNnzxXXuhHUxAfsSFcfFCaSsimMIZIUuiYJjsSJjyWwTtNzuUWwgGBHhfLlFbvVFfjbBJgGZzZtTWCcwTtyYygGYZzKknlLtTEbYHhyuURrBeTtiQoOqpPIexXEOoCflHhLPpoOZuUzFMfFzvVZmolLOJjwWKAnNAaMIJjiNnmaIGgeEeEikXRZzryYKQqEekxOsSOojNnJJdifFIBVvbhHFfZzDYyYZzytTLqQNnHXxaUGguAhwgGWljQqiIdDeEnBbWGgwNYynNAaPryNnYZzIivVRaAbBpuUrRPpGgmNnMobBxraOopPVvkKZzuUtTaANNnLrReEskKSlZzHhdLlvUuVZzTWwtDmVvwWMWgwWGwrQqRzZnGEeyYVvgOLjJlEyYheEzpPZQqNnBbOHhoDdwWIjJixkKTtXRrHyYHYyeBbjJGgENoOfFFfnXFfKOofFkoOjAamGgWwMYyYaAyopmMMmPjJOMKuUkFfXxxXZzmMmJhHdXxuUGghHvpPiTEetIDAadBbviIVBbpMxXfhHHhFSsvVYySsmPpPSsxdDTGgYYyJjyFfIiCcrRIgGixuUTtCcYyKkzZgGJjuwWTwWtoOnNUXfFQqaZzAEeXxqHbBRrOoOtTopnNipPIAkKXNnVcCOowWaAvxSsbBaPhQhHrszZSRpPtMKkiGgEeiIICgtTtTfFGcLlOdDohHXxCsLLtTllxXSoOcxXmMAamrBbEeRvVYKkLzZVvlAaHhxXheERrTvVwWyYMcizZdDICmtAJjlLaHGgwWyydDUuvDdexXXxEVUPpNnmBbMTtuUZrRzumaAMrQqSaAsRIiwOoWDdDZzlLAadeIiRmMrEkKYHUhHHhuhYyeqQExXbDdBEegsSGwWZzQqORGgroGgwWmTtMmMfFIuUzPpZNjJfFnQqiIiPxXjYyJysuUSovVBfFbdDTtIikFfPpcTtmAaBbMBOobCuUcCKtTPrxXRfdDWwpuUDuUdPFpJjOYMmFQqDdIipwWBlXRrxLbzZuUKjLlGgJkFvzCcZxiIXGgTtVrReNnECYyOoHhcWwvVpvVyYPHhfPRNntTrfUmMpgGPFgrrRRGZzYyfueaApPPpAauUJjCcRjJrEIKkiZzwWIiMmRZlqMmQqKyoOYkpPLlRrQwWJLljRMmoKkOrL diff --git a/src/AdventOfCode/Year2018/Day05.hs b/src/AdventOfCode/Year2018/Day05.hs index a50657e..bebbc09 100644 --- a/src/AdventOfCode/Year2018/Day05.hs +++ b/src/AdventOfCode/Year2018/Day05.hs @@ -1,15 +1,19 @@ {-# LANGUAGE DataKinds #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2018.Day05 where -import AdventOfCode.TH (defaultMain, inputFilePath) +import AdventOfCode.Input (rawInputAoC) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) import Data.Algebra.Free (foldMapFree, returnFree) -import Data.Char (isLower, isUpper, ord, toLower) +import Data.Char (isLower, isUpper, toLower) import Data.Finite (Finite, finite, finites) -import Data.Function (on) import Data.Group (invert) import Data.Group.Free (FreeGroupL) import Data.Group.Free qualified as FG +import Data.List (minimum) +import Relude -- | Units' types are represented by letters, modelled by a finite number type -- inhabited by exactly 26 values. @@ -19,26 +23,20 @@ type Unit = Finite 26 type Polymer = FreeGroupL Unit main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -- | Solve Part One. --- --- >>> partOne <$> getInput --- 11894 -partOne :: String -> Int -partOne = order . foldMap inject +partOne :: SimplePuzzle String Int +partOne = asks (order . foldMap inject) -- | Solve Part Two. --- --- >>> partTwo <$> getInput --- 5310 -partTwo :: String -> Int -partTwo = minimum . cleanings . foldMap inject - where - cleanings polymer = [order (clean unit polymer) | unit <- finites] +partTwo :: SimplePuzzle String Int +partTwo = + asks $ foldMap inject >>> \polymer -> + minimum (map (order . flip clean polymer) finites) getInput :: IO String -getInput = readFile $(inputFilePath) +getInput = rawInputAoC 2018 5 -- $setup -- From 361abb0ff3ab72fd6158f645566bb3a23beb13d9 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sun, 16 Nov 2025 21:54:10 -0600 Subject: [PATCH 29/91] refactor(2017.08-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2017/day08.txt | 1000 ---------------------------- src/AdventOfCode/Year2017/Day08.hs | 174 +++-- 3 files changed, 123 insertions(+), 1053 deletions(-) delete mode 100644 input/2017/day08.txt diff --git a/VERSION b/VERSION index 79f6991..3ae7cd9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.51 \ No newline at end of file +2024.7.2.52 \ No newline at end of file diff --git a/input/2017/day08.txt b/input/2017/day08.txt deleted file mode 100644 index 45b612f..0000000 --- a/input/2017/day08.txt +++ /dev/null @@ -1,1000 +0,0 @@ -a dec -511 if x >= -4 -pq inc -45 if cfa == 7 -vby dec 69 if tl < 1 -yg dec 844 if v > -6 -tl inc -756 if u != 9 -l inc -267 if f == 0 -hnd dec 74 if qcg < 9 -pq inc 4 if f >= 0 -pq dec -168 if u < 2 -vby inc -778 if jus == 0 -yg inc 676 if pq < 179 -f dec 12 if u == 0 -zo dec 347 if e == 0 -q inc -934 if u >= -5 -jus dec 40 if ewg > -2 -f inc 8 if t != -7 -u inc 610 if pq > 170 -pq dec 565 if pq >= 176 -ss dec 948 if x != -6 -a dec 387 if ewg == 0 -qcg inc -513 if v < 7 -f dec -289 if uwm != -7 -ewg dec 269 if u == 610 -t dec 614 if ewg <= -263 -f dec 411 if cfa <= 9 -yg inc -62 if l != -271 -x dec 210 if ss == -948 -e dec 376 if l >= -259 -jus dec 709 if v < 9 -ewg inc -787 if l <= -266 -tl inc -643 if vby == -847 -zo inc 201 if e == 0 -f dec -379 if t == -614 -jus inc -963 if zo <= -147 -v inc 653 if tl == -1399 -ss dec 238 if v > 652 -jus inc 551 if u <= 614 -qcg inc 731 if ss > -1190 -a inc 503 if x < -200 -vby inc 209 if x != -204 -f dec 434 if f > 260 -t dec -364 if uwm > -6 -vpd dec 616 if vpd < 8 -v inc 100 if ss <= -1182 -f dec -825 if a != 623 -vby dec -51 if vpd > -620 -v dec 861 if ss < -1184 -hnd inc 270 if u >= 607 -vpd dec -111 if a >= 637 -a dec -720 if vpd < -615 -l dec 882 if qcg < 215 -zo inc -720 if ewg != -1062 -q inc 109 if yg <= -229 -a dec -599 if vby <= -586 -vpd inc -111 if q != -827 -cfa dec -775 if pq == 172 -hnd dec -402 if txc == 0 -t dec -886 if txc > -9 -t dec -805 if ewg >= -1057 -e dec -483 if yg < -224 -pq dec 400 if pq == 172 -t dec 125 if vby < -583 -qos dec 318 if q <= -821 -q dec 882 if qos <= -313 -pq inc 333 if pq >= -232 -v dec -378 if u <= 611 -txc dec 863 if l != -260 -vby dec 60 if x <= -218 -u dec 386 if u != 610 -q dec 876 if l == -267 -l dec -884 if e == 483 -u dec -445 if qos != -318 -cfa dec -412 if v > 260 -hnd dec -376 if q == -2580 -yg dec -458 if a >= 1942 -tl dec 783 if l <= 614 -qos inc -864 if f <= 1081 -uwm dec 872 if x > -211 -t dec 988 if qos < -1187 -jus dec -489 if x >= -212 -ewg inc 410 if cfa < 1181 -x inc 694 if vby == -587 -q dec -185 if f <= 1084 -txc dec -801 if v >= 263 -uwm inc -52 if ewg > -1065 -tl dec 535 if u <= 607 -v dec 252 if yg == 228 -jus dec 671 if t == 1319 -yg inc 386 if l != 609 -f dec 914 if cfa > 1185 -yg inc -365 if zo > -870 -ewg dec -439 if tl > -1393 -qcg dec -325 if pq < 110 -pq inc 303 if v >= 18 -u inc -85 if vpd != -727 -pq inc 41 if qos >= -1182 -uwm inc -824 if cfa < 1178 -txc inc 85 if hnd >= 591 -hnd inc -107 if vpd == -727 -x inc -73 if uwm < -917 -e inc -257 if pq <= 458 -v dec 122 if jus == 291 -v inc 886 if qcg > 538 -hnd inc -348 if cfa == 1187 -yg dec 350 if u == 610 -a dec 516 if ewg != -1051 -qos dec 68 if f > 158 -t dec 277 if qcg != 538 -txc inc 594 if f == 164 -ewg dec 873 if uwm == -932 -yg dec 152 if l < 621 -ewg inc 930 if v > 774 -ss dec -229 if zo != -858 -e inc 275 if ss >= -963 -e inc -649 if tl != -1409 -zo inc 976 if uwm >= -928 -v dec -812 if e == -150 -hnd inc -207 if v > 789 -pq inc -614 if uwm >= -927 -ss dec 16 if txc > 608 -qos dec 312 if ss == -973 -yg inc 615 if u <= 619 -e inc -842 if ewg < -125 -txc inc 109 if f <= 171 -f dec 179 if t > 1045 -pq dec 806 if ss <= -969 -a inc -665 if hnd == 143 -qos dec 31 if yg > 361 -q dec -924 if uwm == -924 -a dec 590 if pq > -975 -cfa inc -56 if qos > -1597 -vpd inc 318 if qcg != 548 -cfa dec 755 if t > 1030 -u inc -853 if vpd >= -414 -uwm dec 247 if v != 789 -qcg inc -746 if v < 784 -vby dec -290 if u >= -247 -v inc 474 if t != 1049 -u dec -681 if q < -1464 -uwm inc 290 if e < -983 -f dec 220 if tl > -1393 -ss inc 241 if l >= 615 -ewg inc -502 if tl <= -1390 -vby inc -960 if zo <= 113 -a dec -112 if tl <= -1397 -qos dec 787 if q <= -1470 -x dec 836 if ewg > -631 -ewg inc -665 if f <= 166 -qcg inc 56 if pq >= -978 -qcg dec -441 if vby >= -1257 -l inc 176 if l != 615 -jus dec -403 if cfa > 383 -vpd dec 428 if qos <= -2371 -u dec 232 if t < 1048 -v dec 254 if f >= 158 -txc inc 590 if vpd != -829 -a dec -882 if txc > 1314 -v inc -610 if v < 1007 -e inc -388 if yg >= 357 -qcg inc 229 if x != -419 -hnd dec 873 if cfa <= 377 -f dec -699 if vby > -1265 -txc inc 38 if yg != 360 -v dec -794 if jus == 291 -txc inc -382 if jus <= 294 -f inc 4 if uwm == -881 -vpd inc -853 if hnd == -730 -a inc 872 if cfa < 383 -ss inc -131 if f > 858 -jus dec -389 if txc > 978 -vpd inc -61 if hnd >= -735 -uwm dec -961 if cfa <= 384 -f dec -264 if q <= -1481 -f dec 946 if cfa >= 371 -uwm dec 376 if pq > -978 -qcg dec 652 if x == -425 -vpd dec 285 if qcg <= -128 -t dec -750 if l <= 799 -cfa inc 638 if yg < 367 -e inc -139 if hnd != -738 -f inc 510 if qcg <= -128 -v dec 114 if zo >= 107 -zo inc -783 if uwm != -302 -pq dec 116 if tl < -1397 -tl inc 83 if uwm > -297 -l inc 400 if qos >= -2383 -l dec 0 if ss != -872 -qcg inc -62 if tl != -1312 -vby dec -417 if uwm == -303 -ewg inc 356 if uwm == -296 -zo dec 138 if hnd == -730 -qcg inc 58 if cfa <= 1014 -txc inc 283 if qos < -2379 -qcg dec 572 if cfa <= 1017 -x dec 213 if qos <= -2374 -zo dec -884 if yg > 367 -uwm dec 868 if q != -1483 -zo dec -983 if ss == -863 -ss inc -635 if tl == -1316 -zo dec 383 if ewg == -931 -ss inc -911 if q != -1469 -txc inc -569 if v < 1079 -v inc 372 if ewg > -947 -v dec 936 if yg != 353 -x dec -972 if a == 2041 -yg dec 756 if q != -1467 -vpd dec -696 if vpd >= -2034 -txc dec -822 if cfa != 1021 -l inc -211 if pq >= -1088 -qcg dec -770 if e > -1520 -qcg inc -787 if hnd != -725 -vpd dec -689 if uwm <= -1161 -l dec -219 if vpd >= -1347 -l dec -344 if uwm <= -1163 -f inc -545 if e > -1526 -hnd dec 856 if e > -1518 -cfa dec 993 if jus == 291 -e dec -559 if txc > 1505 -e inc -179 if txc < 1510 -yg inc -230 if tl <= -1324 -ss inc 117 if vby == -1257 -f inc -398 if a >= 2035 -x inc 302 if zo == 181 -vpd dec 739 if vpd != -1355 -t inc -165 if hnd <= -1585 -pq inc 948 if ewg <= -930 -ss dec -489 if cfa >= 15 -ewg dec -937 if qos < -2377 -q dec 209 if pq == -139 -f dec -911 if v <= 515 -zo dec -437 if x > 336 -vpd inc 907 if jus < 300 -e dec 957 if q == -1683 -jus inc 153 if tl <= -1320 -v inc 752 if qcg <= -717 -tl inc -884 if q != -1688 -a inc 363 if txc >= 1502 -qos inc 469 if vpd > -1183 -tl inc -524 if l > 1540 -cfa dec -632 if e > -2102 -f dec -31 if e < -2091 -hnd inc 602 if hnd > -1594 -e dec -373 if v == 1260 -qcg dec 61 if t <= 1630 -v inc -982 if vpd == -1183 -uwm dec -308 if a != 2408 -l dec 996 if qos > -1912 -yg dec 977 if qcg != -775 -tl inc 56 if t == 1624 -pq dec -106 if l != 554 -hnd dec 770 if ewg == 0 -qos inc 553 if zo <= 180 -f inc -879 if hnd < -1749 -e dec -556 if f > -450 -zo inc 564 if e >= -1166 -qcg dec 937 if f <= -449 -v inc -552 if q > -1693 -a dec 450 if uwm != -854 -a inc 18 if e <= -1162 -ewg dec 754 if v <= 698 -ewg dec -47 if uwm != -847 -cfa inc 374 if vby < -1251 -e dec 369 if e > -1162 -hnd dec -203 if yg != -1371 -ss dec -919 if q < -1677 -txc dec 937 if qcg >= -1729 -vby inc -105 if a >= 1972 -ss inc -204 if txc <= 573 -jus inc 626 if a >= 1968 -ss dec 783 if v != 708 -t inc -734 if cfa >= 1021 -vby inc 899 if qcg == -1720 -jus inc -5 if pq > -32 -uwm dec -717 if zo <= 733 -hnd inc -613 if x > 332 -l inc -854 if pq <= -28 -e inc 615 if u != 206 -ss dec 944 if uwm > -862 -a inc -491 if f > -451 -yg inc 595 if txc < 580 -cfa dec -628 if uwm < -849 -uwm dec 171 if uwm <= -848 -e dec 397 if vpd != -1171 -tl dec -491 if l != -297 -t dec 610 if q >= -1692 -v inc 634 if vby < -456 -jus dec 401 if vby != -471 -ss inc 576 if a != 1481 -f inc 885 if pq > -36 -hnd dec 102 if x == 334 -x dec -578 if e != -1567 -txc inc -122 if cfa != 1660 -e inc -915 if txc <= 451 -uwm dec 683 if v >= 1336 -a dec -523 if yg <= -771 -jus dec 72 if cfa != 1650 -u dec 524 if vpd != -1171 -e inc 786 if qcg <= -1711 -e inc -254 if q <= -1687 -tl dec 992 if ewg > 50 -vby dec 157 if u != -309 -x dec -774 if cfa == 1655 -v inc 842 if vby <= -612 -t inc 64 if uwm < -1703 -e inc 928 if f < 440 -a dec -150 if hnd <= -2463 -vpd inc -685 if yg == -776 -tl inc -963 if a == 2154 -ewg inc -804 if qos != -1363 -tl dec -363 if ewg > -762 -tl inc -769 if zo < 730 -yg inc 635 if zo <= 732 -tl inc -283 if jus < 447 -uwm dec -918 if tl >= -3069 -q dec -216 if jus != 452 -a dec 727 if e == -763 -q dec 467 if hnd > -2470 -qos dec -420 if u <= -316 -cfa dec 686 if q < -1930 -tl dec 953 if v > 2182 -f dec 473 if a != 1427 -a inc 110 if uwm < -784 -u inc -543 if qos == -938 -x inc 591 if qcg != -1721 -x dec 58 if f > 435 -a dec -670 if yg < -774 -pq inc -119 if hnd < -2468 -ewg dec -254 if ss == -2031 -cfa dec 279 if pq < -151 -pq inc 274 if uwm > -801 -tl inc -361 if cfa != 697 -ss inc 797 if v > 2174 -uwm inc -8 if x >= 2218 -l dec -769 if u != -861 -ewg inc -899 if vby >= -610 -hnd inc -950 if qcg < -1712 -jus inc 905 if e != -757 -v dec 825 if vby >= -610 -uwm dec -905 if a <= 2214 -vpd inc -154 if l <= -301 -vpd dec -345 if pq == 122 -yg inc 75 if ss >= -1240 -pq inc 208 if ewg <= -761 -u dec -569 if qos >= -942 -vby inc -840 if l >= -297 -uwm inc 219 if u != -285 -tl dec 956 if vby >= -625 -zo inc -885 if vpd != -1673 -ewg inc 536 if a < 2212 -u inc -628 if ss > -1244 -q inc 94 if ewg >= -216 -cfa dec 212 if uwm >= 316 -pq inc 776 if q != -1943 -x dec 244 if zo < 745 -vby inc 267 if pq <= 899 -jus inc 512 if vby < -352 -v inc 942 if jus < 1852 -qos dec 364 if t > 341 -qcg inc -695 if cfa <= 483 -zo dec 221 if e < -758 -u inc 218 if vby == -353 -e inc -423 if hnd != -3419 -f inc 631 if ss >= -1244 -ss inc -487 if t < 352 -txc dec 351 if l == -308 -pq inc 581 if qos > -1305 -q inc -740 if uwm != 324 -v dec -929 if x <= 1981 -jus dec -782 if u == -702 -yg inc 197 if vpd < -1663 -ewg inc 604 if ss != -1721 -tl dec -426 if qos == -1308 -zo inc 627 if q < -1941 -f inc 815 if ewg == 383 -f dec -567 if x != 1981 -u inc 836 if tl > -5332 -ewg inc -787 if ss >= -1715 -uwm dec -513 if qcg <= -2423 -l dec 396 if zo != 511 -f dec 928 if u <= 139 -txc inc -2 if cfa == 478 -vpd dec -936 if t != 352 -zo inc -269 if q <= -1931 -zo inc -600 if zo != 246 -f dec 723 if hnd > -3416 -v inc -707 if vby < -348 -a dec -205 if l <= -710 -qos dec -396 if jus < 2651 -cfa dec 107 if qos > -913 -a inc 861 if txc >= 456 -uwm inc -700 if hnd == -3420 -x dec -347 if uwm >= 331 -t dec -857 if qcg < -2408 -a dec -876 if a >= 2204 -qos inc 563 if pq < 1487 -x dec -11 if cfa >= 363 -yg inc -114 if e <= -759 -vby inc 439 if pq < 1485 -a inc 394 if x < 1989 -zo inc -996 if zo <= 246 -jus dec -685 if hnd != -3426 -t dec 465 if q != -1929 -txc inc 728 if vpd >= -742 -vby dec -134 if hnd < -3412 -jus inc -485 if e >= -765 -v inc 220 if l == -697 -f inc 470 if txc <= 1175 -e dec 783 if uwm == 324 -jus dec -697 if cfa >= 369 -qos dec 790 if vpd >= -737 -jus inc 654 if l < -693 -tl dec -803 if a >= 3470 -txc dec -738 if vpd <= -745 -uwm inc 67 if cfa != 371 -f dec -702 if l < -692 -x dec -280 if qos == -1133 -jus inc 917 if ewg == 383 -e inc -198 if yg <= -610 -v dec -387 if hnd <= -3415 -u inc 751 if uwm >= 318 -a dec -432 if pq >= 1485 -t inc -946 if vby >= 218 -pq dec -76 if f >= 2690 -txc dec 16 if qcg >= -2415 -t dec 302 if txc != 1158 -pq dec -818 if uwm <= 316 -q dec -404 if zo < -748 -f inc -563 if yg != -625 -x inc -686 if e != -1750 -txc dec -413 if vby >= 214 -uwm dec 968 if vpd != -730 -e dec 908 if txc <= 1575 -cfa dec -787 if a >= 3470 -yg inc -393 if qcg >= -2417 -cfa inc -874 if uwm == -644 -ss inc 466 if ewg < 387 -zo dec -858 if vpd < -731 -ss dec 566 if txc <= 1562 -vpd dec -237 if tl != -4529 -yg inc -486 if vpd < -494 -cfa dec 635 if qos >= -1131 -jus dec -62 if x > 1572 -cfa dec 76 if e >= -2643 -a inc -207 if ewg == 383 -pq inc -674 if yg < -1497 -zo inc -952 if jus != 5182 -tl inc -258 if yg <= -1488 -cfa dec -818 if txc <= 1580 -tl inc 695 if pq >= 1548 -e inc 919 if q == -1530 -t inc -340 if u >= 881 -e dec -449 if vby >= 218 -ewg dec -468 if cfa == 1102 -yg inc 617 if pq != 1548 -zo dec 809 if pq <= 1563 -vby dec -685 if uwm == -644 -cfa inc -157 if e < -1283 -zo inc 65 if uwm <= -640 -f dec 729 if e != -1278 -l inc -313 if hnd > -3423 -jus dec 180 if x >= 1574 -jus inc -520 if ss < -1255 -hnd dec -493 if f >= 1403 -jus inc -783 if qos < -1136 -e dec -486 if t <= -848 -u dec 248 if q >= -1530 -u inc -379 if vby != 901 -pq inc 590 if qcg > -2408 -l inc 757 if uwm <= -644 -q dec 283 if uwm >= -644 -t inc 681 if tl > -4097 -uwm inc 359 if ss < -1248 -v dec -725 if ss > -1260 -x dec 584 if txc != 1573 -ss dec 938 if x < 1002 -cfa dec -19 if ewg <= 851 -f dec 909 if u == 258 -v dec -295 if f < 498 -l inc -132 if uwm >= -291 -u inc 921 if l >= -390 -pq inc -253 if u == 1189 -l inc -431 if jus != 4473 -qos dec -855 if qos <= -1132 -qos dec 691 if yg >= -882 -jus inc 117 if cfa >= 955 -qcg dec 438 if yg < -875 -tl dec -922 if tl <= -4088 -ewg dec -424 if qcg == -2862 -l dec 249 if x < 1004 -tl inc 388 if e >= -800 -ss inc -962 if q > -1820 -zo inc -141 if ss <= -3147 -pq inc -508 if vby < 908 -t inc -64 if l == -638 -cfa dec 534 if qos <= -968 -v inc 906 if tl == -2780 -hnd inc -830 if f != 497 -qcg dec -186 if vby >= 907 -uwm dec -155 if t < -242 -ss dec -312 if hnd <= -4251 -tl inc -619 if x == 996 -txc inc -620 if e == -798 -uwm dec 861 if l == -638 -t inc 715 if t > -233 -cfa dec 603 if zo > -1726 -cfa inc -523 if pq > 1042 -a dec 547 if uwm == -1151 -l dec -8 if jus < 4593 -e inc -601 if t <= -230 -qcg dec -637 if yg >= -879 -l dec 814 if qos != -969 -jus inc 204 if tl < -3399 -yg dec 111 if pq > 1050 -qcg inc -188 if qos >= -971 -a dec 760 if vpd > -504 -jus dec -523 if hnd != -4247 -q dec 664 if e <= -1398 -txc inc -8 if q >= -2477 -e inc -333 if yg >= -888 -txc inc -222 if u >= 1173 -jus dec 304 if x < 987 -a inc -766 if vby < 912 -qos inc 464 if pq > 1037 -cfa inc 500 if q >= -2479 -jus dec 49 if u < 1187 -hnd inc -440 if cfa >= 403 -txc inc -741 if yg <= -873 -ewg inc 836 if hnd > -4696 -v dec -890 if vpd != -500 -q dec 954 if vpd != -509 -t inc 846 if e > -1739 -ewg dec -458 if vpd == -500 -t inc -995 if e <= -1732 -u dec -987 if q < -3427 -l dec -303 if pq < 1054 -t dec 527 if qos <= -498 -ewg inc 607 if hnd >= -4689 -l dec 203 if e >= -1733 -zo dec -961 if qcg != -3032 -t dec 880 if a >= 1741 -x dec -447 if t != -1787 -pq inc 735 if pq > 1043 -f inc 386 if u > 2167 -t dec 886 if hnd != -4689 -e inc 395 if yg < -889 -a dec -361 if txc != -24 -q inc 837 if e >= -1732 -uwm inc 779 if qcg >= -3050 -ewg dec -506 if ewg <= 2761 -e inc 367 if v >= 4717 -jus dec 710 if vby <= 908 -v inc 956 if l != -531 -e inc -724 if cfa != 417 -a dec -54 if v < 5685 -qos inc -463 if tl >= -3405 -a inc 634 if hnd < -4695 -txc dec -613 if x <= 1450 -t inc -595 if txc > 602 -zo inc 807 if yg < -870 -uwm dec -253 if x != 1444 -v dec 249 if u != 2173 -cfa dec 286 if pq != 1791 -jus dec 340 if ewg < 3261 -e inc 391 if yg <= -879 -v inc -554 if qos >= -961 -u inc 118 if a < 2168 -ss dec -898 if txc == 590 -ewg inc 757 if l > -525 -tl dec -250 if u != 2284 -f inc -51 if l > -525 -f inc 574 if x >= 1437 -e inc -55 if yg >= -881 -yg dec -832 if tl == -3391 -yg dec 176 if vby <= 899 -u dec 215 if a <= 2155 -x inc -411 if ewg <= 3264 -u inc -76 if vby <= 912 -q dec -479 if ss > -3163 -qos dec -136 if tl < -3398 -ss inc -631 if qos <= -839 -cfa dec 561 if pq < 1786 -ss inc -817 if uwm > -119 -qos dec -544 if l >= -522 -qos dec -82 if u != 2205 -vpd dec 427 if qcg >= -3049 -u dec 296 if uwm > -115 -x inc -533 if tl >= -3405 -ss inc -529 if q > -2125 -e inc 745 if uwm < -109 -cfa inc -488 if l == -530 -vpd inc 778 if txc > 593 -jus dec -399 if l < -526 -u inc 144 if x < 500 -t dec -554 if u < 2066 -txc inc -200 if u > 2055 -zo inc 382 if qos != -750 -pq inc -191 if jus != 4409 -vby dec 602 if a >= 2150 -qcg dec -517 if tl < -3397 -jus dec -416 if jus == 4413 -uwm inc 157 if f != 1066 -vpd dec -888 if yg == -880 -tl dec 79 if qcg > -2533 -pq dec 604 if e < -1006 -hnd dec -901 if l != -522 -qcg dec 328 if qos != -744 -yg inc -412 if cfa != -938 -ewg dec -571 if vpd < 744 -cfa inc -925 if qos == -750 -qcg dec -605 if yg < -1284 -x inc 470 if pq >= 987 -hnd dec 82 if yg < -1286 -qcg dec -874 if pq != 987 -x dec 457 if hnd <= -3862 -ewg dec -591 if qos > -752 -ss dec -820 if zo >= 39 -v inc -967 if tl != -3482 -v inc 742 if jus > 4825 -f dec -381 if cfa != -1862 -qcg inc -868 if cfa <= -1850 -qcg dec -358 if x < 518 -txc inc -23 if x != 503 -l dec -239 if jus <= 4830 -qcg inc -771 if pq == 996 -hnd dec -724 if vby <= 310 -cfa inc -823 if hnd > -3140 -v dec -558 if x > 504 -t inc -89 if uwm > -118 -jus inc 432 if ss <= -3678 -jus inc -343 if zo >= 31 -yg dec 474 if ewg == 4420 -q dec 330 if jus >= 4915 -qos dec 805 if zo == 46 -qcg inc 670 if t >= -1326 -f dec 945 if vby > 310 -jus inc -68 if q <= -2440 -tl dec -424 if a == 2159 -tl inc 460 if u <= 2063 -f dec -759 if uwm != -120 -v inc 507 if qcg == -2078 -zo inc 881 if pq <= 990 -qcg inc -792 if yg <= -1769 -qos dec -730 if ewg <= 4420 -f inc 968 if pq <= 989 -tl dec -539 if txc < 376 -vpd dec 823 if ewg >= 4429 -qos dec -476 if ss <= -3692 -qos dec 609 if vby > 303 -u inc -266 if x == 506 -v inc -99 if pq < 990 -q dec -627 if ss <= -3680 -qos dec 372 if t >= -1334 -cfa inc 959 if qcg >= -2086 -x dec -893 if hnd > -3156 -x inc 69 if vby > 300 -qcg inc 333 if ss <= -3673 -e dec 525 if u < 2064 -yg inc 402 if tl == -2055 -ewg dec 938 if u > 2050 -tl dec 989 if e != -1526 -f inc 894 if cfa != -1854 -t inc -834 if txc >= 370 -yg dec 197 if ss != -3682 -f inc -741 if zo >= 926 -l dec -257 if v != 5659 -a dec -713 if a > 2158 -jus inc -279 if ewg <= 3487 -v dec -910 if ss < -3673 -e dec -601 if cfa >= -1854 -tl dec -106 if ewg > 3477 -x inc -144 if yg < -1361 -zo dec -454 if ss != -3678 -a inc -887 if l > -43 -ss inc 184 if ewg >= 3490 -jus dec 865 if txc == 371 -q dec 156 if cfa == -1853 -ss inc 435 if a != 1989 -l inc -121 if a < 1995 -qos dec 846 if f < 4076 -jus inc -580 if q == -1974 -vby inc 11 if e != -938 -q dec -355 if hnd >= -3146 -vpd dec -49 if jus <= 3132 -cfa inc -311 if uwm != -123 -vby inc -541 if a >= 1990 -f dec -11 if ss < -3238 -e inc 964 if zo == 1374 -pq inc -380 if yg > -1369 -q dec -140 if x > 1320 -jus inc -605 if yg < -1362 -ss inc -520 if pq > 616 -uwm inc -686 if jus != 2528 -jus inc 523 if e <= 32 -pq inc 658 if x >= 1329 -pq inc -513 if vby >= 320 -q dec 161 if x != 1330 -u dec 943 if a == 1985 -yg inc 785 if cfa < -2156 -hnd dec -969 if txc > 362 -ss inc 74 if l < -146 -ss dec 63 if cfa >= -2171 -txc inc 331 if ss > -3246 -qcg dec 229 if uwm <= -792 -u inc -497 if v == 6570 -uwm dec -725 if cfa >= -2163 -f dec -439 if u != 616 -a dec 11 if v >= 6563 -e dec 176 if u != 618 -v inc 921 if e < -138 -e dec 656 if a == 1974 -hnd dec 64 if qcg == -1983 -hnd inc 779 if v > 7481 -tl inc 421 if cfa == -2157 -ewg dec -732 if uwm == -800 -x dec 223 if q <= -1473 -zo inc 74 if ss == -3242 -ss dec -594 if uwm <= -793 -x inc -507 if ss < -2639 -f dec -68 if e == -800 -cfa dec -763 if jus == 3044 -t inc 931 if a <= 1978 -pq inc -602 if ewg <= 4217 -ss dec 512 if l <= -154 -t dec 145 if qcg > -1989 -cfa inc -621 if f == 4147 -e inc 430 if f > 4145 -f dec -800 if ss > -3157 -a dec 496 if v > 7482 -qcg dec 289 if t <= -1369 -yg inc -634 if vpd >= 783 -e dec 722 if ewg <= 4214 -ewg dec 506 if qcg != -2272 -q dec 911 if f == 4947 -f inc -515 if tl < -2932 -x dec 788 if qcg >= -2280 -a dec -542 if yg != -1218 -yg inc -124 if ss != -3155 -v dec 510 if vpd != 795 -l inc 920 if vpd == 783 -u dec 314 if tl != -2940 -tl dec 375 if pq == 663 -tl inc 358 if jus != 3049 -x dec 41 if uwm <= -805 -zo inc 844 if yg != -1343 -v inc -463 if ss <= -3148 -hnd dec 99 if hnd >= -1462 -v dec 357 if pq > 670 -v dec 974 if u < 294 -e inc -375 if e < -1090 -u inc -501 if yg <= -1336 -zo inc -563 if a <= 2018 -t inc -602 if v == 6518 -qos inc 366 if vby >= 316 -jus inc -366 if t >= -1985 -f inc -218 if u > -202 -zo inc 932 if jus >= 2676 -l inc -50 if qcg > -2268 -ewg inc 170 if pq == 670 -hnd dec 605 if f < 4221 -pq inc 746 if u <= -205 -f inc 582 if uwm == -800 -x dec -43 if tl != -2955 -ss dec -420 if q >= -2395 -jus dec -493 if ss > -2736 -x dec 977 if ss >= -2736 -uwm inc 956 if e < -1461 -l dec -397 if vpd <= 791 -vpd inc 548 if pq > 655 -vby dec -958 if t != -1976 -pq dec -565 if jus >= 3163 -q dec -667 if yg >= -1345 -cfa dec -6 if jus < 3179 -e inc 842 if tl <= -2953 -q inc 680 if jus > 3166 -txc dec -618 if l > 238 -cfa dec -494 if l >= 242 -t dec -969 if uwm <= 163 -ss dec 421 if ss != -2734 -t inc -548 if tl <= -2949 -uwm dec -835 if t >= -1546 -tl inc -393 if f == 4796 -vpd dec 643 if cfa == -1530 -x inc 768 if vby == 314 -a inc -252 if jus == 3171 -f inc 177 if f >= 4797 -v dec -352 if e >= -615 -yg inc -913 if jus < 3181 -qos dec -893 if l == 242 -a inc -627 if vby <= 321 -txc dec -351 if tl != -3343 -cfa dec -913 if zo < 3150 -txc dec -750 if txc < 1672 -a inc 803 if hnd == -2176 -jus dec 188 if jus < 3178 -zo dec -350 if ewg > 4206 -f dec -941 if ewg >= 4206 -pq inc -603 if hnd > -2175 -q inc 360 if t <= -1547 -pq dec 475 if pq >= 630 -yg inc 931 if l >= 235 -t dec 361 if x > -399 -a dec -383 if yg <= -1313 -f dec -777 if t != -1914 -yg inc 169 if uwm > 149 -qos inc 239 if t >= -1920 -vby dec -903 if txc < 2424 -jus dec 889 if jus >= 2983 -v inc -172 if cfa <= -1514 -v inc -278 if e >= -633 -t dec -929 if hnd != -2164 -a inc 918 if t >= -996 -x inc -690 if vby == 1217 -zo dec 268 if txc >= 2420 -v dec -591 if t >= -989 -x inc -620 if vpd != 1332 -l inc 51 if ewg < 4220 -f inc -518 if qcg != -2267 -vby dec 898 if uwm == 156 -jus dec -53 if l == 293 -hnd dec -127 if qos == -105 -uwm dec -99 if q >= -692 -q inc 340 if hnd >= -2175 -vpd dec 740 if vby <= 321 -a inc -931 if qos > -105 -hnd inc -25 if qos < -100 -pq dec 366 if tl >= -3353 -f dec -126 if a <= 2449 -yg dec 642 if ss >= -2739 -ss inc 735 if jus > 2156 -t dec -329 if qos <= -104 -q inc -292 if x > -1714 -vpd inc -406 if hnd != -2183 -e dec -367 if tl != -3343 -yg inc 891 if x == -1707 -uwm dec -520 if vpd >= 184 -yg inc -180 if jus == 2147 -uwm inc -767 if l >= 300 -txc inc -728 if jus == 2147 -q dec -876 if zo == 3232 -ss dec -255 if vpd > 187 -qcg inc -360 if t > -667 -jus dec 357 if v != 6658 -ss dec 239 if t > -652 -cfa inc 349 if txc < 1701 -cfa inc 185 if hnd <= -2188 -q dec 858 if vby <= 323 -ss dec 290 if yg == -1081 -cfa dec -473 if yg > -1073 -qcg inc -333 if ss < -2766 -l dec 539 if hnd > -2200 -v inc -210 if hnd <= -2190 -e inc 531 if a < 2447 -yg dec -156 if e != 265 -t dec -188 if q < -610 -vpd inc 757 if qos == -106 -zo dec 801 if x > -1713 -u dec -49 if a < 2445 -qos inc -451 if tl >= -3352 -q dec -531 if x >= -1712 -a inc 32 if jus > 1784 -ss inc -258 if pq != 261 -cfa dec 445 if l >= -251 -t inc 897 if l <= -256 -e dec -199 if hnd < -2182 -vby inc 309 if v == 6449 -ewg dec 839 if qos == -565 -hnd inc 961 if hnd >= -2199 -cfa inc -780 if qcg == -2974 -ewg dec 443 if qcg == -2965 -hnd inc -901 if uwm < 780 -ss inc 597 if vpd == 947 -txc inc 453 if yg > -930 -u dec -871 if a < 2468 -x dec -789 if u > -160 -jus dec 702 if f >= 6127 -v inc -298 if u < -141 -uwm dec 424 if uwm == 775 -cfa dec -497 if pq == 259 -ewg dec 984 if t == -470 -vpd dec -287 if t > -478 -q dec -288 if zo == 2431 -a dec -402 if l < -240 -cfa dec 560 if cfa == -926 -u inc -127 if jus == 1790 -yg dec -832 if yg > -930 -uwm inc 366 if hnd < -2128 -tl dec 18 if l > -252 -vby dec -423 if vpd < 1239 -u dec -879 if ewg == 2780 -uwm inc 204 if uwm >= 711 -l inc 545 if ewg > 2794 -t dec 383 if uwm == 921 -t inc 464 if vby != 1054 -jus inc -997 if vby < 1060 -u inc 347 if uwm <= 926 -v inc 468 if tl >= -3372 -v dec 797 if v <= 6626 -u inc 971 if l >= -252 -ewg dec -319 if vpd < 1239 -hnd dec 893 if x < -913 -tl inc -593 if txc <= 2148 -qcg inc 382 if q >= 193 -pq dec -987 if tl >= -3951 -yg inc -111 if jus == 793 -tl dec -780 if uwm != 919 -pq inc -914 if tl < -3176 -t dec 677 if jus >= 789 -ewg dec -842 if cfa <= -944 -uwm inc 736 if pq >= -648 -ewg inc 106 if jus > 784 -f dec -472 if jus != 785 -e inc 382 if qos != -549 -vpd inc 955 if yg < -197 -txc dec -976 if pq == -660 -a inc 453 if x != -908 -q inc 287 if t >= -1072 -uwm inc 422 if l > -255 -hnd dec -230 if qcg <= -2580 -v dec 868 if ewg == 3212 -x dec -567 if l < -238 -tl dec 595 if jus != 788 -u dec -860 if pq != -662 -e inc -541 if cfa >= -940 -f dec 330 if vby < 1059 -tl dec -41 if qcg == -2583 -f inc -394 if u != 1899 -a dec -962 if x < -353 -a dec 303 if vpd != 2189 -u inc -371 if q < 493 -yg inc 0 if tl < -3734 -hnd dec -273 if e >= 311 -t dec -138 if qcg > -2588 -e dec 644 if f == 5877 -qcg dec 968 if yg < -202 -x dec 208 if tl <= -3730 -u dec -776 if txc < 2153 -q inc -432 if vpd == 2189 -cfa dec -325 if uwm != 1344 -e dec -384 if zo >= 2429 -ss dec -879 if a < 3332 -u inc -571 if t != -925 -t dec 970 if l >= -244 -ewg dec 713 if uwm > 1333 -a dec 527 if uwm < 1348 -f inc -962 if u == 1737 -cfa dec -790 if e < 704 -cfa inc 516 if yg > -210 -uwm dec 654 if zo == 2428 -qcg inc -176 if ewg != 2507 -u inc -92 if e >= 696 -a inc -14 if yg == -204 -vby inc -72 if v < 4956 -a dec -983 if q <= 62 -yg inc 422 if cfa > 696 -jus inc 685 if t > -938 -e inc 449 if jus < 1483 -v dec 593 if t >= -932 -v dec 595 if q >= 55 -e inc 332 if e <= 1154 -tl dec -34 if ewg == 2499 -ewg inc 24 if f < 5872 -ewg dec -129 if txc == 2146 -pq dec 815 if hnd != -2531 -tl inc 456 if a == 3764 -tl dec 942 if a <= 3773 -x inc 610 if x >= -558 -u inc -68 if txc < 2150 -ewg dec -897 if jus == 1474 -vpd inc -158 if jus != 1475 -e inc 852 if v != 3775 -pq inc 169 if zo >= 2427 -zo dec -82 if v >= 3765 -qcg inc 221 if u < 1584 -ss dec 958 if tl > -4640 -a inc -545 if f >= 5868 -ss dec -864 if qcg != -3515 -t inc 980 if cfa < 698 -zo dec 58 if f > 5867 -q dec 43 if u == 1575 -qos dec -992 if vpd == 2031 -t dec -823 if x >= -564 -x inc 647 if qos != 445 -l inc 231 if l == -246 -ewg inc -776 if zo < 2464 -q dec 367 if q > 13 -jus dec 956 if v != 3770 -txc dec 952 if v != 3766 -x inc 145 if qcg >= -3507 -e dec 597 if x <= 236 -cfa inc -860 if f <= 5878 -f inc -649 if jus != 512 -tl inc -885 if f != 5227 -qcg inc -610 if q == -353 -ewg dec 342 if txc <= 2137 -hnd dec 495 if yg >= -207 -vby dec -713 if q < -345 -ewg dec 72 if cfa > -174 -jus inc 897 if zo == 2455 -v dec -582 if zo > 2452 -x dec 368 if f >= 5212 diff --git a/src/AdventOfCode/Year2017/Day08.hs b/src/AdventOfCode/Year2017/Day08.hs index 11b90ff..56284bf 100644 --- a/src/AdventOfCode/Year2017/Day08.hs +++ b/src/AdventOfCode/Year2017/Day08.hs @@ -1,56 +1,104 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2017.Day08 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) -import Control.Applicative ((<|>)) -import Data.Map.Strict (Map) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle +import AdventOfCode.TH (evalPuzzle) +import Control.Applicative.Combinators.NonEmpty qualified as NE +import Data.Foldable (maximum) import Data.Map.Strict qualified as Map -import Data.Maybe (fromMaybe) -import Data.Text (Text) -import Data.Text qualified as Text -import Text.Trifecta (Parser, choice, integer, letter, some, symbol, whiteSpace) +import Relude +import Text.Show qualified +import Text.Trifecta (Parser, choice, integer, letter, symbol, whiteSpace) + +data Modification + = Modify !BinOp !String !Int + deriving (Eq) + +instance Show Modification where + show (Modify op reg val) = + reg <> " " <> show op <> " " <> show val -data Op = Dec | Inc - deriving (Eq, Show) +evalModification :: (MonadState (Map String Int) m) => Modification -> m () +evalModification (Modify op regAlter delta) = + modify (Map.alter (Just . flip (evalBinOp op) delta . fromMaybe 0) regAlter) -data Comparison +data BinOp = Dec | Inc + deriving (Eq) + +instance Show BinOp where + show = \case + Dec -> "dec" + Inc -> "inc" + +data CondOp = CLT | CLE | CEQ | CNE | CGE | CGT + deriving (Eq) + +instance Show CondOp where + show = \case + CLT -> "<" + CLE -> "<=" + CEQ -> "==" + CNE -> "/=" + CGE -> ">=" + CGT -> ">" + +data Conditional + = Cond !CondOp !String !Int + deriving (Eq) + +instance Show Conditional where + show (Cond cmp reg val) = reg <> " " <> show cmp <> " " <> show val + +evalConditional :: (MonadState (Map String Int) m) => Conditional -> m Bool +evalConditional (Cond cmp reg n) = + flip (condOp cmp) n <$> gets (fromMaybe 0 . Map.lookup reg) + +data Instruction + = Ins !Modification !Conditional + deriving (Eq) + +instance Show Instruction where + show (Ins change cond) = show change <> " if " <> show cond -data Instruction = Ins Op Text Int Comparison Text Int +evalInstruction :: (MonadState (Map String Int) m) => Instruction -> m () +evalInstruction (Ins change cond) = + evalConditional cond + >>= flip when (evalModification change) main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -partOne :: [Instruction] -> Int -partOne = maximum . Map.elems . foldl' go Map.empty - where - go mem (Ins op regAlter delta cmp regCompare comparate) = - if compareReg mem cmp regCompare comparate - then Map.alter (Just . flip (binOp op) delta . fromMaybe 0) regAlter mem - else mem +emptyPuzzleState :: Map String Int +emptyPuzzleState = Map.empty + +partOne :: Puzzle (NonEmpty Instruction) (Map String Int) Int +partOne = do + ask >>= mapM_ evalInstruction + gets maximum -partTwo :: [Instruction] -> Int -partTwo = maximum . map (maximum . Map.elems) . init . foldl' go [Map.empty] +partTwo :: Puzzle (NonEmpty Instruction) (Map String Int) Int +partTwo = + maximum + . fmap maximum + . init + <$> asks (foldl' go (Map.empty :| [])) where - go (mem : history) (Ins op regAlter delta cmp regCompare comparate) = - mem' : mem : history - where - mem' = - if compareReg mem cmp regCompare comparate - then Map.alter (Just . flip (binOp op) delta . fromMaybe 0) regAlter mem - else mem - go [] _ = [] - -getInput :: IO [Instruction] -getInput = parseInput (some instruction) $(inputFilePath) - -kompare :: Comparison -> (Int -> Int -> Bool) -kompare cmp = case cmp of + go (mem :| history) ins = + execState (evalInstruction ins) mem :| mem : history + +getInput :: IO (NonEmpty Instruction) +getInput = parseInputAoC 2017 8 (NE.some instruction) + +condOp :: CondOp -> (Int -> Int -> Bool) +condOp = \case CLT -> (<) CLE -> (<=) CEQ -> (==) @@ -58,25 +106,37 @@ kompare cmp = case cmp of CGE -> (>=) CGT -> (>) -binOp :: Op -> Int -> Int -> Int -binOp Dec = (-) -binOp Inc = (+) +binOp :: Parser BinOp +binOp = + (Dec <$ symbol "dec") + <|> (Inc <$ symbol "inc") + +evalBinOp :: BinOp -> Int -> Int -> Int +evalBinOp = \case + Dec -> (-) + Inc -> (+) -compareReg :: Map Text Int -> Comparison -> Text -> Int -> Bool -compareReg mem cmp = kompare cmp . fromMaybe 0 . flip Map.lookup mem +modification :: Parser Modification +modification = + flip Modify + <$> (some letter <* whiteSpace) + <*> binOp + <*> (fromInteger <$> integer) + +compareReg :: Map String Int -> CondOp -> String -> Int -> Bool +compareReg mem cmp = condOp cmp . fromMaybe 0 . flip Map.lookup mem + +conditional :: Parser Conditional +conditional = + flip Cond + <$> (symbol "if" *> some letter <* whiteSpace) + <*> comparison + <*> (fromInteger <$> integer) instruction :: Parser Instruction -instruction = - do - regAlter <- Text.pack <$> some letter <* whiteSpace - op <- (Dec <$ symbol "dec") <|> (Inc <$ symbol "inc") - delta <- fromInteger <$> integer - regCompare <- symbol "if" *> (Text.pack <$> some letter) <* whiteSpace - cmp <- comparison - comparate <- fromInteger <$> integer - pure (Ins op regAlter delta cmp regCompare comparate) - -comparison :: Parser Comparison +instruction = Ins <$> modification <*> conditional + +comparison :: Parser CondOp comparison = choice [ CLE <$ symbol "<=", @@ -86,3 +146,13 @@ comparison = CGE <$ symbol ">=", CGT <$ symbol ">" ] + +getExample :: IO (NonEmpty Instruction) +getExample = parseString (NE.some instruction) example + +example :: String +example = + "b inc 5 if a > 1\n\ + \a inc 1 if b < 5\n\ + \c dec -10 if a >= 1\n\ + \c inc -20 if c == 10\n" From cd2fc58f95f048cc97cb714e543aa15d52346fd1 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Mon, 17 Nov 2025 23:23:33 -0600 Subject: [PATCH 30/91] refactor(2017.07-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2017/day07.txt | 1238 ---------------------------- src/AdventOfCode/Year2017/Day07.hs | 169 ++-- 3 files changed, 81 insertions(+), 1328 deletions(-) delete mode 100644 input/2017/day07.txt diff --git a/VERSION b/VERSION index 3ae7cd9..d44c3f5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.52 \ No newline at end of file +2024.7.2.53 \ No newline at end of file diff --git a/input/2017/day07.txt b/input/2017/day07.txt deleted file mode 100644 index a05a886..0000000 --- a/input/2017/day07.txt +++ /dev/null @@ -1,1238 +0,0 @@ -dihjv (2158) -> gausx, ncdmp, hozgrub -qhvca (428) -> odttvb, ymehff, ymyzbqc, jtdtmsi, wciuyuh -kuvqhnm (77) -eauol (56) -nwtkz (304) -> eykks, rxivjye -kmyvaog (440) -> jrvona, cdoyc, vgbwb, lbttqhl, qizznfs, bftdz, xqhvz -dcqofo (74) -qnhthgm (63) -fgkok (189) -> vjgjzbc, vjfllmr, drbqty -tvfwp (74) -jtwqgg (28) -igogak (57) -edaidjk (60) -jxhqld (75) -jbhxihl (79) -fbrdpr (28) -yjtudlp (60) -wgbdxsx (98) -ecpuvq (84) -emzlv (5) -isahru (26) -oamyk (69) -xxxcdbv (29) -rogwn (357) -jpovtel (31) -gkvko (24) -aqlfh (87) -cbvzgp (24) -> weotr, pgofcu, czswzal -vaqxfkm (43) -fwraw (64) -rqtlp (13) -> tmoib, pidha, yaqiuq, zprfu, ssjau, duhaz, qzaecfk -qisdg (15) -oryhdxc (12) -lywem (78) -ulrqrc (38) -sszuwps (86) -qanswmb (89) -keubv (101) -> yhfkwn, toqhzbx, rokeyia, vpspcd -lkpdlq (36) -ddvbfi (75) -nsfjyfr (79) -> pavvcsj, thidj, yvjkb, udkcxo, zehou -yorihlo (5983) -> eihhef, iayesbs, nduld, darnez -xfkhu (208) -> izjecb, edqurgi -onnmq (24) -zmbxthx (2453) -> tfjhcnn, uifjku, kgtcv -turomx (35) -pgofcu (82) -yveziks (55) -cbmcpho (20) -cosmq (70) -xvnqny (3179) -> dpmqmbp, pddgbo, mszglrh -juqsjg (47) -zfhup (56) -agvvr (45) -pkdqgo (84) -yupciox (47) -wplhnmi (689) -> qnmiv, esemf, qiftt -qujsvg (58) -bdnqwvw (10384) -> mqyvpvw, kfaib, rpgxh, kjudskk, gknpczm, mtukvee, xwbzev -lfjwzpr (80) -rpdiks (56) -kveyw (87) -eiwvcil (276) -> kmquncz, bsqltzs -lflpbjx (28) -nnoiyn (218) -> qthns, nhpvo -togvh (177) -> qcsal, totymbv, wdrdfsy -fmpkks (88) -> kbseli, tukvj, hygejev -hoocyf (77) -bbhffib (11) -> orrno, uaeuig, yjicxmr, yhmqg -bjaferd (58) -pjsevmq (112) -> sxnfkj, jyaztbk -zsksm (26) -> nghpciz, pboxau, nykhzm, edteba, bbhffib -mngpa (189) -> wevea, cjkpmpb -clqlpi (96) -> jgvmp, ikfnuu, dqfeapy -uppsb (10) -thafg (61) -dgmbzo (157) -> sjitmwi, krmoek -xtcoefd (13) -vnlbdhq (75) -rfowcu (46) -znpcapb (13) -gnrgy (839) -> zuqew, prnpyu, payeaey, mxiqn, qmkod, rgovzj -glmvo (1473) -> slilxt, fikmr -kiwzzsi (26) -lqrleq (114) -> xljwrd, lrymzqx, kszzcjg, ajxjsi -xdvxnd (82) -> alxuwj, ynfamq, oymcuyi, iesan, urqvtwz -oyort (96) -nmzkhig (11) -> jponcak, vyyvfme, amzzkz -cwgspa (10) -fahjx (47) -hckss (31) -eflhrzc (210) -> jnswdp, hrhky -gzgmcg (53) -ctvqg (32) -hmaslr (146) -> bvyiw, qeeyslp -xsxpz (46) -ztdib (46) -xhsokp (60) -gtadjbm (86) -qrrzkla (54) -zsmex (16) -wmiuyq (55) -mqovh (297) -tfejm (26) -hozgrub (96) -plgyftr (130) -> daomuol, lynvr -fjbxbui (57) -rnxpn (84) -jrrcr (22) -dxujggm (73) -gnows (81) -ilziw (54) -drbqty (15) -bgfjxde (292) -> cwgspa, uppsb -omcvezl (74) -cejrzz (88) -zbrant (83) -rxnyoaf (59) -vbobjo (98) -ofydl (110) -> ssmijv, uxytt -uwweklj (20) -iodjrt (60) -wdaxi (67) -> jxhqld, xxtds, udeyv -jivcmug (241) -rgovzj (147) -> cdmqq, iwvgsqj -gsspm (506) -> wakslhh, wjjov, fwjvl -cssxuh (85) -bdbhdz (22) -kjsimg (45) -mfaiso (99) -pzgihig (152) -> lggutbs, qrrzkla -xzrts (87) -alxuwj (241) -> sguelmy, wwibd -socdh (28) -tnezwo (65) -tonetb (74) -budlgt (226) -> edmdyyf, oulbft -wgkylta (318) -> tozgnf, nybvxpl -sddte (99) -> ywgsoss, pjgpn, unzqb -ijlnjse (45) -knkect (83) -nftvm (40) -> hepgwl, xsnvuhk, awuntf -nhpvo (56) -khfehu (76) -slnoou (74) -qkmsfo (220) -wciuyuh (184) -> waand, zutluof -prnpyu (29) -> pkdqgo, gprqd -illog (99) -pxijfx (35) -alcjel (83) -owjae (264) -> jxawhq, mgxmj -xsjmrv (178) -> husfjac, zsmex -kgjnta (24) -bfmatc (6) -whnmg (1178) -> fajwz, fjbxbui -ulsjdhh (44) -todve (10) -mgomqm (35) -okvspp (63) -kgtcv (41) -> mhbvu, wycrhq -vzyknp (26) -agmrdd (49) -ilqgy (57) -lhomu (99) -ixknb (57) -gffatn (656) -> rogwn, ralyx, xhnem -rbgidcj (1416) -> bgczgya, xgbxcgw, shzcz, qonlajs, naxbp -ikamn (24) -qzaecfk (253) -> ctvqg, yunmx -gknpczm (155) -> eiukshg, bomwsw, zsuhred -kulazu (78) -jgvmp (78) -wxhex (24) -tvdihgf (85) -xwbzev (254) -ankqb (83) -zehou (270) -yehoudc (237) -> tdvdbhx, rlzldzq, cchwxl -gvktxip (74) -kwbbdg (9) -fnuem (788) -> sgxaa, wkqbmut, wkqtgn -xljwrd (20) -xsnvuhk (90) -> ibjay, tonetb, uowuztv, hdvwu -pidha (77) -> iodjrt, wltkgyg, nipcsis, yjtudlp -gausx (96) -cbtfaaq (140) -> ochqzjy, oogoc -onurc (93) -oahfm (823) -> gxzkef, zujfczp, tmakc -jujcekp (87) -ochqzjy (32) -wvihi (36) -> rhdngzm, udeckgc, aooskui -eosnpun (42) -vnivx (24) -iziyeah (53) -wrrjvv (138) -> kktnr, nduasyx -rncwlve (45) -ohvsnc (16) -kuwksy (81) -epmklw (24) -bnhmicm (49) -kamhkoi (154) -> bndye, wjxgvh -sqvgekz (156) -> ogelzn, smueqkc -fikmr (87) -nipcsis (60) -fevoc (49) -itihxls (53) -hygejev (63) -xuwzr (289) -zzbpjiq (80) -aakqco (77) -mhtrp (80) -ftwjsi (5) -slilxt (87) -bgqxrj (98) -gpaljor (160) -> kuzskeg, qloih -vmrfkpj (97) -extedk (63) -wlswfp (38) -fphae (82) -> yhjmn, ylkotm, zmfcp -jlxseu (12) -waaszgs (95) -cdoyc (208) -> ikamn, ywfwlug -xqlcwdq (82) -iqsxq (61) -iegfxt (84) -lnbkylg (58) -qcsal (55) -onyvo (98) -hrfldlv (61) -pqccx (49) -zkpvqfo (24) -svpplpy (364) -> znpcapb, ervfo -ksbkavj (145) -> cypwd, rxnlgc -ucuojn (95) -fmszt (23) -sqoqld (5) -ymtwg (89) -> oqhdqg, qwfzkh, qrbhvs, phkvd, ytkgrpj, ylfkshq, drwjl -nxwsaq (59) -skcbz (98) -ygnrm (40) -asfjop (15) -doqmfx (152) -> ahsdq, gnows -jfrda (3994) -> lnpuarm, oahfm, nsfjyfr -kssoys (63) -syqthpz (70) -> zyfrk, nhlvwm, lfjwzpr, zzbpjiq -pxbyvn (98) -goulcd (164) -> wdngppj, vmrfkpj -keeet (281) -> wdpyn, hqyej -pscda (342) -edqurgi (91) -phkvd (37) -> vmbhr, zppzac, euaulyx, cabffwx -cpvefk (15) -jyyeena (51) -naxbp (17) -> ofgvb, ytvmvhy -cabffwx (71) -pvnch (61) -omvoojd (20) -edteba (305) -> qjdbq, yupciox -gkmrz (29) -qwfzkh (321) -eatpn (88) -ptfev (215) -> iemffhw, snzqh -kuzskeg (30) -acvbzia (390) -zbuqlk (52) -icbztci (67) -awebzjn (46) -hxwrnx (7) -yvjkb (9) -> pttqho, jujcekp, sabsqv -qdrqm (182) -> cssxuh, lpfrtfw -pynygd (99) -tthcan (67) -vzlomr (127) -> rztel, fscztrk -hljxim (70) -wputsbp (91) -> zdrfc, iqsxq -qsqxc (69) -jzztae (158) -> wqrxb, yjqyh -qloih (30) -nsmsgmk (93) -awuntf (276) -> kunyye, yveziks -ibjay (74) -ssszfaj (24) -wildi (97) -kunyye (55) -hvporje (17) -> xfuimef, pscda, pklufv, vejgx, togvh -ekcfvm (58) -wkqtgn (96) -> brqztvl, rbjzgxt, jciigs -dqfeapy (78) -gsjkku (24) -uxytt (92) -qnrlrm (57) -gvtcjha (98) -kygnpb (75) -yjqyh (78) -pixawh (64) -xwwdp (53) -yjijem (124) -> jyyeena, frpagb -uihqn (52) -hdvwu (74) -sijptix (87) -> ojatorf, wxlxyq, lkfttr, xfesea, ytatg, keeet, ghycpf -nzylp (26) -zcoqx (164) -> xxykvzq, slnoou -vlrgx (88) -> bmntp, eatpn, yvoyt -hqwqd (97) -ybsouxh (24) -wurmarr (46) -bmejz (97) -rfmtzl (9) -lclhy (36) -qyharq (92) -ixtmdxo (24) -nlrtoa (57) -bnqinhv (440) -> hgwpks, wputsbp, mngpa, dasoy -gndaa (12) -syzkg (1697) -> qzdatks, buekex -wevea (12) -bcefufj (22) -larhlj (152) -> tidour, qfxuh -npvrbd (896) -> fmpkks, vpmnutl, uvsgv -pjgpn (65) -mzjypeq (90) -> ihhmv, jckrdlz, kylpt -lfkfd (97) -wysgri (142) -> gnutx, vbqxz -zqhans (87) -lqsdtq (43) -zutluof (6) -wqxbp (34139) -> bdnqwvw, bdlqru, ysgrizu -mrdoeb (87) -xuprtp (93) -vgbwb (130) -> wesqml, ssinas -zoibb (46) -> ctosb, pskrkrn -qmoxv (42) -bdfns (29) -qqokzne (954) -> jscxo, fhcrsce, jscvn, amheqov, wvihi, wsxkjcu -mxiqn (107) -> kjsimg, agvvr -klyfish (1069) -> xxeoneh, kibotum, hmaslr, zuywf -lzjvenf (21) -> tjfib, jgjgxgb, ibyqrv -yeomv (42) -qdyjn (78) -kdvzyz (6) -ncdmp (96) -hdkeesr (56) -dcbquim (48) -ksjmqsc (529) -> oakpkr, ndsbbnm, fphae, extnd -sczsl (64) -akvfgdi (57) -njldiph (83) -dasoy (155) -> qppyecj, gkmrz -jlhdq (52) -ltwrzdl (16) -fenxwbi (42) -vhnpij (78) -frpagb (51) -hqxulc (5) -tretx (11) -jorvuw (83) -vwyrjd (31) -zpanms (59) -qjdbq (47) -qagqi (83) -> xqlcwdq, ezbdihm -nydgtu (73) -bndye (39) -wlnpbx (83) -vbqxz (85) -levsigy (43) -cdmqq (25) -ekrwiea (91) -rxnlgc (14) -mtflqcm (68) -kylpt (72) -arwyg (238) -> ngsgolg, qephec -gprqd (84) -qawlwzi (45782) -> jfrda, jwebvqn, ujwqlf -qjqqkjo (300) -> vwyrjd, ocddu -azjdyr (89) -xjgoko (622) -> larhlj, lrvaz, memnafg -thidj (116) -> xzllgwq, vcfxh -sguelmy (36) -tjfib (59) -rdnxsro (84) -sdvzbk (262) -> atvztnt, zkpvqfo, gavzpv, rjmjlq -ssvcrjn (26) -rilzcsz (186) -> epmklw, sczuqy -hkosdxh (79) -iodtwit (30) -lvlux (92) -udkcxo (84) -> xuprtp, simsfkz -acatw (69) -> tlpzsi, hakss, naiivve, pphbkn -tflqwyl (51) -zjlckg (9455) -> jvjdgph, sijptix, zmbxthx -adqqjrz (81) -> ebjind, odhurs -yceabkj (46) -tomfuoi (6) -vejgx (272) -> lzvpll, pxijfx -qmpazxn (37) -pskrkrn (90) -eigivg (43) -cvioak (68) -> qnhthgm, wboesxc -dwfxj (76) -kjudskk (206) -> vostn, ixtmdxo -xltuf (66) -rnjyw (55) -uowuztv (74) -zkmhy (220) -> rnjyw, tbswgx -cfxrv (83) -hrbse (124) -> lnwyra, xuzfgha -urqvtwz (81) -> qcayjn, lnbkylg, yfrcx, bjaferd -lzvpll (35) -dngizd (81) -sjitmwi (55) -tqruh (31) -tukvj (63) -mvncpt (21) -hzfarz (51) -ujqoks (20) -wezrgqw (210) -hopsivz (387) -> tufywu, zhmevu -cacfqur (9) -udeckgc (59) -lkimdg (10) -nulkw (61) -porcbbb (227) -> midrlp, cacfqur -lmjpuv (296) -> kxaxt, fahjx -wimpns (22) -oymcuyi (280) -> tretx, njarebf, svezft -qfxuh (20) -fxjkoqn (202) -> fwraw, pixawh -vcfxh (77) -jtdtmsi (90) -> gzgmcg, nrkdwvs -vkuusw (92) -apjkf (22) -ovdogi (165) -> shepkcs, npxgl, wxyrdp -ewbuve (88) -dqxfl (90) -xnmtop (83) -> ckugbl, yeomv, fyktlox -piewts (22) -gcvxpm (64) -> kveyw, kchjfpg, mrdoeb -tufywu (32) -xfesea (243) -> tthcan, wljomq -ysyfwqs (211) -ozdrm (76) -> lclhy, zggsrug, zvhtk, lkpdlq -oqhdqg (201) -> dunqe, fqhdf, ygnrm -gmmxg (29) -rokeyia (27) -gavzpv (24) -mifxlz (171) -> didfetj, rncwlve -cqjoftq (63) -fhcrsce (213) -ssjau (253) -> askmldt, kojat -wdsunq (58) -tcqkzp (208) -> udzokmu, lzlvrqk -eimcci (43) -xwxof (55) -spprj (68) -> jorvuw, cfxrv -ivkvrj (81) -xbabgu (155) -> lypml, zxvhoy -osnyi (50) -cdynw (89) -ldswpyl (30) -> jkjnsj, lpxekhm -rdbcued (24) -zunuwi (208) -> iziyeah, wdafwyi -pzjiiy (20) -xqhvz (192) -> liearc, ohvsnc, ltwrzdl, ypyuum -vtzay (74) -> vonbixj, qawlwzi, wqxbp, tcsrpxb, xlieqz, yghqsa, asexwc -ralyx (357) -rlpvqn (9) -yjngab (1573) -> yiigm, kntzn, rilzcsz, eqoick -vtnex (28) -ctosb (90) -zmicnlj (76) -hbcjzma (149) -> bbmvgyu, rxnyoaf -lmekort (6) -jkjnsj (87) -pyjymxj (59) -pjczjl (20) -wxmwf (29) -othvtfq (49) -atvztnt (24) -ehzatio (57) -ekdczsz (63) -njarebf (11) -qsjhc (59) -ridrtgx (9) -kamrqhv (57) -wgjbas (15) -ldtbli (78) -cniapi (15) -ulssbyo (62) -ashohg (12) -mtkliz (96) -> bxkicdp, pmlzll, ycqghs -extnd (178) -> piewts, rpiyqq, bdbhdz -wvdnc (77) -iyalpvz (13) -> uohcpp, xcyfp, ypbgol -smkeec (87) -ezbdihm (82) -amheqov (177) -> isnebf, rlpvqn, bllths, rfmtzl -bmqggm (108) -> hkamx, extedk -ajnnoo (99) -> ywpmdg, drsvx -wgwucvi (26) -xbwbjfa (46) -omlxdye (56) -> tdstj, gnktgh -esbswlu (246) -> kuvqhnm, aakqco -wljomq (67) -yowef (55) -> umhji, ucpgr, dpimy, nwxad -qzdatks (15) -ncuksjv (84) -> plcqel, mtflqcm -mrssfl (26) -uqjnlv (122) -> rqtgag, awebzjn, wurmarr, osbdc -xxykvzq (74) -ynfamq (187) -> fenxwbi, eosnpun, kybtr -jscxo (99) -> dathq, ixknb -ohpeic (695) -> cbvzgp, mjrxbh, aaibd -bnuozu (107) -> rstvy, kovebn, zwsjm -kxaxt (47) -rztel (62) -xubkl (102) -> bhzgqav, wftxaby -owsebz (26) -glqezpx (245) -> omvoojd, pzjiiy, oiuppwr -ssmijv (92) -mgdjgzf (573) -> fnsxlna, qjqqkjo, pgfhmr, tvtxqpd -rnzzm (246) -> uwweklj, ujqoks, cbmcpho -npxgl (13) -lzlvrqk (42) -xgbxcgw (97) -> ashohg, gndaa -ibffwi (21) -> zfxdqi, yxqmz, dvnvwgj, xnhlg -wzmrtpw (40) -lcggft (139) -> qzuyecq, sslulx -vlwmaxi (46) -fnsxlna (110) -> cqjoftq, kssoys, fwyreea, wkgzwhi -zlwnppb (491) -> uqjnlv, huidcr, rnzzm, mzjypeq, inycp -jyaztbk (61) -ipljy (79) -wdpyn (48) -pgfhmr (50) -> kulazu, lgmdhjw, qdyjn, lywem -vjgjzbc (15) -egtscru (9) -plcqel (68) -wbsul (175) -> ynqji, qcbubp -fajwz (57) -bftdz (24) -> fdpjo, ekcfvm, qujsvg, wdsunq -wkhsng (24) -nhrka (23) -njkscdv (10) -vihoep (161) -> qolkd, itihxls -wesqml (63) -xgsbu (19) -iayesbs (2129) -> zhzwir, zoibb, kyvysg -noutnp (202) -> kdvzyz, tomfuoi, bfmatc, lmekort -whnnb (66) -> yceabkj, vlwmaxi, xsxpz -ucpgr (38) -qzuyecq (34) -nwxad (38) -ljmkw (53) -> imdmnn, hkosdxh -vakhjoj (1289) -> reflh, himyfxm, hrbse -mwzhn (75) -otzqal (667) -> qagqi, vpdlxtj, fiilaqx -kktnr (30) -tmoib (303) -> hxwrnx, ukbfn -bkuqfi (8) -> gvtcjha, pxbyvn, miwvcdi, wgbdxsx -ifroqmy (4870) -> ksjmqsc, ohpeic, djomjuh -ghycpf (199) -> azjdyr, qanswmb -fecze (694) -> jzztae, doqmfx, givqy, zfrgif, budlgt, zunuwi -derxp (22) -siyudl (46) -eqcpltg (79) -sslulx (34) -ibvmb (49) -> njldiph, zerai, ankqb -lbnjp (122) -> ojcaeht, sszuwps -vwzfjcq (241) -ytatg (116) -> mldtcbl, jgsgm, aqlfh -tdvdbhx (19) -bomwsw (33) -aonteu (15) -ndsbbnm (76) -> mxdij, nmqoxw, eauol -rpgxh (140) -> eetdzon, igogak -ynqji (40) -obhlzp (56) -jscvn (169) -> twdnswr, bcefufj -empkyy (61) -peopfnu (17) -> etyhx, rpfhcus, yvyttr -wycrhq (25) -isnebf (9) -naiivve (43) -cchwxl (19) -swtbqxz (266) -hbcto (51) -husfjac (16) -uohcpp (63) -yozose (88) -ylfkshq (193) -> sczsl, ibdyuge -ergcql (46) -ebjind (65) -tohprmh (2242) -> tflqwyl, mdjhnv, tamautu, qxxkyr -bqbmy (49) -urbqmk (52) -zdrfc (61) -wwibd (36) -lawgz (35) -lkfttr (320) -> luzwzm, mqebpw, eodubb -ezxlkm (37) -eihhef (1752) -> adqqjrz, ysyfwqs, ljmkw, synynkd, imrqsxa -nduld (1449) -> lgkhn, cikijr, ijmrhsf, cvioak, lqrleq, ifncxs, bnuozu -cdsjzoz (1888) -> yowef, wdsari, lcggft -djxpma (93) -rstvy (29) -yvyttr (1210) -> qslmjtg, wrmovs, ibvmb, xmfrzwa -vnhsudk (60) -qrshe (43) -flovshu (15) -bwgjpdg (97) -bgczgya (107) -> cvgdzag, qdextxi -zfrgif (168) -> dxujggm, nydgtu -vpdlxtj (151) -> wxhex, gsjkku, wkhsng, ssszfaj -kwztfbl (88) -nduasyx (30) -jnswdp (60) -rbjzgxt (24) -cvgdzag (7) -cbxomli (91) -qmkod (57) -> hlauw, mgomqm, pmzvdb, lawgz -weotr (82) -ifncxs (54) -> fglgibd, hljxim -ogelzn (35) -pkdwpbh (15) -mdjhnv (31) -> njkscdv, hincte -hxxupnf (43) -> cjztdo, uvgvi -imrqsxa (115) -> drwlyvx, ybsouxh, xfmyvg, oibng -gnutx (85) -iloykn (81) -heudq (6) -lggutbs (54) -bllths (9) -edmdyyf (44) -wrmovs (132) -> alcjel, knkect -nfwzt (69) -esemf (99) -> iqeqpuv, seruan -omspdwl (245) -> ggmpihl, emzlv, kjyhry -uillw (1744) -> zfswb, wbsul, dumykdj -ijmrhsf (102) -> ztdib, rfowcu -xgllgu (62) -> illog, mfaiso -ofgvb (52) -fscztrk (62) -iwfjou (31) -egqaydx (814) -> ofydl, sddte, nqpyzt, yehoudc, szpoqm, lbnjp -vvemxld (63) -> xoavai, subauko -jkukq (9) -tmakc (44) -> tqxmke, ipljy -veefoj (99) -cmopifq (234) -> zpanms, nxwsaq -jkzwu (70) -> zhphopf, pcljlai, uillw, qamvl, cdsjzoz, yjngab, vqhriyt -xkrxt (81) -fgltnc (22) -wdrbtqg (8) -> wezrgqw, eubxp, wmmmcdw, eealm, xsjmrv -wspzdb (60) -wzcttac (85) -wqlzmvc (87) -ervfo (13) -bxkicdp (57) -seruan (12) -wqocyox (99) -wdafwyi (53) -drsvx (71) -yntroh (82) -> rvakt, hoocyf, fgrvof, ccjmduk -uaeuig (97) -wspnoa (291) -> hqvtn, iodtwit -bhzgqav (18) -ycpxqjz (55) -szpoqm (98) -> qqedfa, qeovb, agmrdd, othvtfq -zxvhoy (85) -waand (6) -brqztvl (24) -jatwhbu (93) -tbswgx (55) -nghpciz (205) -> lfkfd, hqwqd -oulbft (44) -pcljlai (949) -> fxmiw, gmawv, pzgihig, ipqct, xgllgu, omspdwl -ggmpihl (5) -qonlajs (73) -> smuzxf, trxfjv -twijj (54) -> qrmgjdu, avyif, veefoj -owiryv (54) -yhfkwn (27) -eprlek (42) -xlieqz (18992) -> byytwu, yorihlo, vrpupk -geznv (32) -> tvdihgf, fccyl -smueqkc (35) -wdngppj (97) -vzits (78) -bdavc (79) -luzwzm (19) -lrvaz (96) -> qflimon, dcbquim -bvyiw (46) -esvca (90) -nylrq (400) -tezto (34) -qqedfa (49) -nulkvu (29) -xuzfgha (60) -vsivyn (38) -qzhemjq (91) -> cejrzz, yozose -bmntp (88) -pwotv (26) -vonbixj (42470) -> orssb, ewqui, ifroqmy -eleeg (82) -ylpapdi (15) -dpmqmbp (292) -> cmopifq, vlrgx, qdrqm -ciiqis (295) -> cqxfbv, socdh -lnwyra (60) -vyyvfme (35) -> jqomxi, hwljl, onyvo, bvykqm -jxawhq (47) -kntzn (78) -> vhnpij, tqnucz -fvbopgf (302) -> bnhmicm, pqccx -mgxmj (47) -dodbb (53) -smlvcc (1242) -> lzjvenf, plgyftr, wrrjvv, dlrpc, nevkxz -amzzkz (323) -> kiwzzsi, wgwucvi, mdyce, pwotv -jzmezwj (40) -yjicxmr (97) -ssinas (63) -ojcaeht (86) -tfjhcnn (91) -udeyv (75) -rlxoojp (446) -> cbtfaaq, whnnb, srbtea -ymehff (28) -> iegfxt, rdnxsro -wxyrdp (13) -hbncq (91) -> hwvxsq, dqxfl, hhoxisa, fuorh -drlkvy (190) -> nixbq, fqcxo, itggp, egtscru -scmwcz (20) -lpxekhm (87) -nevkxz (138) -> flovshu, iivqj, clikxp, wgjbas -mqyvpvw (254) -tdstj (88) -lyfyg (1272) -> whzdf, qlgbx, pfzcu, swtbqxz -bdejd (93) -tamautu (15) -> jlxseu, oryhdxc, fbedmnf -wdrdfsy (55) -bvtwq (47) -kjyhry (5) -unzqb (65) -jofsg (64) -> mwzhn, oumcdij, vnlbdhq -ouadkun (43) -byytwu (89) -> tohprmh, timjt, ncapjgu, yblxjc, wmhkk, dihjv, yxjeaj -wsxkjcu (97) -> pdkxh, ahklb, bdfns, xxxcdbv -ywthj (79) -ehofuzh (26) -ywpmdg (71) -duhaz (93) -> rpdiks, zfhup, hdkeesr, zsrdtht -mzozh (77) -> hiiqxv, qnrlrm, ehzatio, nlrtoa -hzuprgn (665) -> xnmtop, keubv, yhkrp -ltwvide (890) -> ajnnoo, acatw, qeyzth, jivcmug, aqzbepp, vwzfjcq -hkamx (63) -nrkdwvs (53) -cjkpmpb (12) -ojnmrwc (213) -> xbwbjfa, ergcql -hrhky (60) -xoavai (55) -totymbv (55) -aqzbepp (49) -> peaud, oyort -zsuhred (33) -aooskui (59) -shepkcs (13) -qggwp (87) -tidour (20) -avyif (99) -pdkxh (29) -kybtr (42) -qizznfs (100) -> vykcb, ldtbli -ykxrxbb (19) -liearc (16) -atkpc (43) -oumcdij (75) -knfad (87) -hincte (10) -nfwof (32) -oxwbxc (10) -bgnuk (65) -iivqj (15) -rlzldzq (19) -qolkd (53) -yxhfz (38) -qeeyslp (46) -qrmgjdu (99) -vbtznz (6) -> vovinsx, vkzka, adkvr -etcbg (54) -> eigivg, atkpc, tyzcg, jlhnkk -adkvr (97) -miwvcdi (98) -jwiwydu (667) -> ihgiq, hxxupnf, hlgydhq -kmquncz (57) -vrpupk (9477) -> kktud, egqaydx, fecze -kekabeg (17) -bovla (327) -> arbcqfz, mvncpt, xhypb -omfahxa (99) -gvwkbp (300) -> wxmwf, qiwsut -twgdnl (74) -dumykdj (71) -> lvlux, rebxtnk -zvhtk (36) -pmlzll (57) -fccyl (85) -zfxdqi (76) -fdpjo (58) -lpfrtfw (85) -tcsrpxb (48956) -> peopfnu, rajmc, xvnqny -svezft (11) -vqcjj (22) -nqpyzt (294) -subvci (97) -askmldt (32) -qeyzth (143) -> vlgwzi, bqbmy -zxqrm (232) -> fevoc, kritjfi -umhji (38) -xifubdw (15) -snxbszd (20) -pfzcu (266) -zhphopf (52) -> wspnoa, kaxrm, vmobtbb, ciiqis, threc, ysvmncq, twijj -ysvmncq (173) -> cdynw, kzchhz -paofxz (140) -> hckss, jpovtel -qflimon (48) -vovinsx (97) -qchmzht (79) -wkgzwhi (63) -wxlxyq (272) -> turomx, zpekki, rfbnete -drwlyvx (24) -kfaib (206) -> rdbcued, kgjnta -baovbha (65) -odhurs (65) -rpiyqq (22) -twdnswr (22) -ypbgol (63) -xhpzhpq (292) -ywgsoss (65) -yrepvc (34) -ocddu (31) -zfswb (155) -> osnyi, ofrfo -sxnfkj (61) -tvtxqpd (322) -> lkimdg, yqmse, todve, oxwbxc -qephec (76) -swhlcvm (47) -ahklb (29) -ydibgyz (27) -himyfxm (37) -> qsqxc, retzg, nfwzt -lcfycgg (1529) -> lhomu, omfahxa -zqozw (59) -hwljl (98) -zvlftj (53) -inycp (78) -> dwfxj, rnyyal, ilcoe -lynvr (34) -hhjspt (241) -> jtwqgg, bdjgtz, bynxcni -gkvojlo (87) -xzllgwq (77) -pboxau (399) -oazcn (45) -buekex (15) -odttvb (162) -> kekabeg, momoy -rfedd (74) -ymyzbqc (144) -> vzyknp, mrssfl -ftfvpmy (193) -> klmcwy, xltuf -utqtp (87) -> zqhans, knfad -ktnynk (23) -jlhnkk (43) -jponcak (339) -> ytgxvzv, derxp, cukeme, vqcjj -subauko (55) -bgkst (257) -> pjczjl, scmwcz -uifjku (91) -ujwqlf (46) -> xdvxnd, sbjvkrb, glilvcd, glmvo, eiennk -vjfllmr (15) -nhlvwm (80) -dpslcf (82) -tqnucz (78) -yhmqg (97) -bqqwwcn (1031) -> kamhkoi, omlxdye, ismqdcu -ismqdcu (178) -> lfrwzbb, ydibgyz -rebxtnk (92) -lcpfw (296) -> vrjes, bvtwq -drwjl (265) -> vtnex, qxzjhg -nykhzm (11) -> bmejz, wildi, qoyub, epdfbvu -rvakt (77) -hakss (43) -noqrlh (60) -epdfbvu (97) -iqeqpuv (12) -ywfwlug (24) -weywe (57) -kchjfpg (87) -fbedmnf (12) -uvsgv (237) -> eyotuoe, slhfj -fqcxo (9) -vsfjq (56) -whumv (84) -sczuqy (24) -hqyej (48) -fglidf (9) -yfrcx (58) -ytvmvhy (52) -vykcb (78) -cukeme (22) -pqiqied (93) -cikijr (32) -> xkrxt, zspsh -mtukvee (59) -> baovbha, tnezwo, bgnuk -vlgwzi (49) -wdsari (41) -> wlnpbx, zbrant -shzcz (52) -> ztlsw, ktnynk, fmszt -kaxrm (261) -> oazcn, ijlnjse -eubxp (81) -> vaqxfkm, levsigy, lqsdtq -vmobtbb (237) -> kamrqhv, weywe -zzacgi (90) -oogoc (32) -dlrpc (40) -> jbhxihl, kdjcqk -eealm (88) -> nulkw, pvnch -jciigs (24) -fpezemw (67) -lgkhn (134) -> wzzjnrl, snxbszd, vexft -ldyrkdm (40) -zezecwh (53) -pavvcsj (218) -> ssvcrjn, nzylp -kwelmvo (46) -> siyudl, wxiks -mszglrh (472) -> tcqkzp, xhpzhpq, wdaxi -fmsgmoq (135) -> xgsbu, ykxrxbb -ahsdq (81) -lypml (85) -simsfkz (93) -bdjgtz (28) -aaibd (174) -> vnivx, fcjoefo, gkvko, onnmq -mgihcl (354) -> gwcwh, nhrka -udzokmu (42) -qactli (85) -eqoick (176) -> nulkvu, gmmxg -synynkd (167) -> jrrcr, apjkf -darnez (77) -> syqthpz, lmjpuv, lcpfw, bovla, wgkylta, xfkhu, acvbzia -vrjes (47) -zemwgsa (130) -> isahru, cltdxy, tfejm, obzcog -hlauw (35) -pttqho (87) -zhmevu (32) -mhbvu (25) -autys (32) -qeovb (49) -brhvbt (93) -jrkohk (98) -yiigm (122) -> qqwda, vsfjq -gdfxr (1002) -> jrkohk, bgqxrj -yqmse (10) -bdbzuf (539) -> ztpizq, gbyiobd, vzlomr -toqhzbx (27) -obzcog (26) -whzdf (140) -> vznyiu, eprlek, iovtj -yytai (13) -nwsjspa (18) -> noqrlh, edaidjk -djomjuh (20) -> bgkst, skrnzrc, mqovh, vbtznz, druym -pklufv (152) -> ucuojn, waaszgs -vmbhr (71) -jrvona (88) -> mowgm, whumv -hepgwl (226) -> ufjxj, mhtrp -oakpkr (132) -> obhlzp, qijjq -wopxs (74) -wltkgyg (60) -gnktgh (88) -yhjmn (54) -klmcwy (66) -bbmvgyu (59) -eifws (205) -> bfvol, qmoxv -xinyjeu (44) -bfvol (42) -mowgm (84) -orssb (41) -> lyfyg, ymtwg, ltwvide, zuccp -lnpuarm (918) -> ksbkavj, fmsgmoq, biumgl -bvykqm (98) -xnhlg (76) -mxwdp (81) -jowykql (63) -atnmou (54) -bdlqru (3118) -> gsspm, bdbzuf, whnmg, bnqinhv, hzuprgn, fnuem, nmzkhig -ddcgqm (10) -> smkeec, wqlzmvc, tcifkj, xzrts -gjkplw (85) -gsbypm (52) -> msnnza, drlkvy, etcbg, sqvgekz, noutnp, yjijem -jwebvqn (7762) -> iwudd, fvwwm, vvemxld -eiennk (912) -> porcbbb, bqdtmvh, txoqtpz -mqebpw (19) -ztpizq (65) -> qwwur, xdwcgk, ulssbyo -dunqe (40) -ccjmduk (77) -kzchhz (89) -wkqbmut (34) -> icbztci, fpezemw -txoqtpz (49) -> vbobjo, skcbz -vpmnutl (232) -> cniapi, xifubdw, asfjop -asexwc (93) -> tmclxe, aiuyg, jkzwu, zjlckg -yvoyt (88) -midrlp (9) -qlgbx (98) -> ecpuvq, rnxpn -bvczy (60) -qnmiv (79) -> gxvlomg, wimpns -qthns (56) -kibotum (68) -> gjkplw, wzcttac -nixbq (9) -ckugbl (42) -iveta (147) -> ywthj, oqahna -rnyyal (76) -vostn (24) -fcjoefo (24) -ibyqrv (59) -tcifkj (87) -jgjgxgb (59) -yduyn (40) -jnurmw (860) -> xuwzr, eifws, jofsg -wboesxc (63) -ibdyuge (64) -ypyuum (16) -yxjeaj (1226) -> mzozh, iveta, ojnmrwc, glqezpx -kyvysg (158) -> yrepvc, tezto -clikxp (15) -ojatorf (98) -> nsmsgmk, djxpma, onurc -eetdzon (57) -pqzsukm (40) -fgrvof (77) -iovtj (42) -zsrdtht (56) -wnvzf (37) -czswzal (82) -zmfcp (54) -hgwpks (213) -bqdtmvh (141) -> jlhdq, zbuqlk -qiftt (78) -> pkdwpbh, qisdg, cpvefk -vqhriyt (1903) -> paofxz, iyalpvz, geznv -udptfka (79) -> brhvbt, bdejd, pqiqied, jatwhbu -yxqmz (76) -zerai (83) -kmpjivb (175) -> hrfldlv, empkyy, thafg -kktud (72) -> sdvzbk, ddcgqm, goulcd, kmpjivb, awqjs, owjae, gvwkbp -lrymzqx (20) -fiilaqx (247) -aiuyg (12841) -> xjgoko, gdfxr, nftvm, jwiwydu -kojat (32) -wmmmcdw (36) -> gkvojlo, qggwp -gwcwh (23) -eykks (13) -qwwur (62) -hodlob (312) -iwudd (85) -> ulsjdhh, xinyjeu -wxiks (46) -zuccp (1166) -> zemwgsa, pjsevmq, bmqggm, spprj, fgkok -qppyecj (29) -uvgvi (67) -upmft (70) -ncmenyx (74) -vznyiu (42) -oiuppwr (20) -zujfczp (122) -> yduyn, ldyrkdm -sabsqv (87) -tmclxe (8705) -> rqtlp, kmyvaog, qqokzne, smlvcc -hqvtn (30) -qcayjn (58) -vexft (20) -ihgiq (39) -> oamyk, fhyimvw -qxxkyr (25) -> qmzef, xtcoefd -ycqghs (57) -rajmc (1933) -> rlxoojp, vtgfsqt, wdrbtqg, leytj, wplhnmi -iesan (151) -> owiryv, ilziw, atnmou -qslmjtg (283) -> hqxulc, ftwjsi, sqoqld -rxivjye (13) -qqwda (56) -hhoxisa (90) -yblxjc (2420) -> viqnxm, yytai -rhdngzm (59) -tlpzsi (43) -glilvcd (423) -> bzsupo, ptynfu, ldswpyl, pwaypt, ovdogi, vomul -ptynfu (110) -> swhlcvm, juqsjg -qrbhvs (285) -> ridrtgx, kwbbdg, fglidf, jkukq -hlgydhq (15) -> mxwdp, pwwtnz -ilcoe (76) -imdmnn (79) -gxvlomg (22) -djsyo (43) -bzsupo (32) -> gtadjbm, hmsbly -rjmjlq (24) -yhkrp (165) -> fgltnc, kfqykbd -kszzcjg (20) -gxzkef (116) -> qrshe, djsyo -jvjdgph (1373) -> hopsivz, hbncq, udptfka -wjxgvh (39) -ysgrizu (73) -> jnurmw, hvporje, syzkg, lcfycgg, bqqwwcn, gffatn, npvrbd -jqomxi (98) -vpspcd (27) -rpfhcus (452) -> svpplpy, arwyg, nlzfsx, yntroh, eiwvcil -eodubb (19) -givqy (18) -> tvfwp, rfedd, wopxs, omcvezl -kafnt (15) -ytgxvzv (22) -eyotuoe (20) -zyfrk (80) -bynxcni (28) -kfqykbd (22) -pphbkn (43) -biumgl (97) -> ulrqrc, wlswfp -viqnxm (13) -hwvxsq (90) -pwaypt (102) -> hzfarz, hbcto -lbttqhl (130) -> ekdczsz, jowykql -hmsbly (86) -ewqui (3753) -> gsbypm, enurd, otzqal, qhvca -krmoek (55) -mldtcbl (87) -sezloa (63) -zggsrug (36) -daomuol (34) -nlzfsx (240) -> kygnpb, ddvbfi -cltdxy (26) -oqahna (79) -orrno (97) -fhyimvw (69) -tqxmke (79) -mdyce (26) -zprfu (317) -ytkgrpj (265) -> lflpbjx, fbrdpr -iwvgsqj (25) -yghqsa (56478) -> vakhjoj, klyfish, rbgidcj, zsksm, mgdjgzf, gnrgy, zlwnppb -nedixbk (6) -kbseli (63) -zppzac (71) -sgxaa (64) -> urbqmk, uihqn -pddgbo (13) -> hbcjzma, vihoep, mtkliz, qzhemjq, dgmbzo -memnafg (15) -> zqozw, pyjymxj, qsjhc -mxdij (56) -qxzjhg (28) -xhnem (93) -> wrnejq, ewbuve, kwztfbl -oibng (24) -fxmiw (248) -> heudq, nedixbk -qamvl (949) -> wysgri, wfuwg, bgfjxde, zcoqx, hodlob -cuwpd (77) -itggp (9) -fvwwm (121) -> ehofuzh, owsebz -qijjq (56) -bsqltzs (57) -trxfjv (24) -zuqew (135) -> iwfjou, tqruh -wfuwg (57) -> yscbbtq, qactli, znxntbo -srbtea (204) -cqxfbv (28) -ufjxj (80) -wmhkk (2150) -> gvktxip, ncmenyx, dcqofo, twgdnl -ipqct (108) -> khfehu, zmicnlj -fwjvl (82) -> zzacgi, esvca -didfetj (45) -pmzvdb (35) -izjecb (91) -ztlsw (23) -lgmdhjw (78) -momoy (17) -payeaey (197) -etyhx (92) -> nwtkz, zkmhy, fxjkoqn, zxqrm, eflhrzc, clqlpi, nnoiyn -xcyfp (63) -xxtds (75) -gmawv (104) -> vzits, gvlbzp -qmzef (13) -skrnzrc (103) -> bwgjpdg, subvci -wrnejq (88) -ajxjsi (20) -tyzcg (43) -zuywf (118) -> pqzsukm, wzmrtpw, jzmezwj -huidcr (66) -> vnhsudk, wspzdb, bvczy, xhsokp -vtgfsqt (275) -> ptfev, mifxlz, utqtp -wftxaby (18) -snzqh (23) -ylkotm (54) -smuzxf (24) -wqrxb (78) -nmqoxw (56) -lfrwzbb (27) -hiiqxv (57) -wakslhh (156) -> xwwdp, dodbb -xdwcgk (62) -jgsgm (87) -fuorh (90) -reflh (180) -> nfwof, autys -mjrxbh (194) -> vsivyn, yxhfz -xfmyvg (24) -vomul (6) -> wqocyox, pynygd -qoyub (97) -tozgnf (36) -pwwtnz (81) -sbjvkrb (22) -> gcvxpm, ftfvpmy, xbabgu, ibffwi, hhjspt -druym (60) -> eqcpltg, qchmzht, bdavc -fyktlox (42) -kritjfi (49) -xmfrzwa (187) -> ezxlkm, wnvzf, qmpazxn -dvnvwgj (76) -euaulyx (71) -rqtgag (46) -threc (211) -> cosmq, upmft -dathq (57) -jckrdlz (72) -osbdc (46) -leytj (506) -> ngppbum, kwelmvo, nwsjspa, xubkl -fglgibd (70) -yscbbtq (85) -cjztdo (67) -slhfj (20) -enurd (528) -> gpaljor, ncuksjv, ozdrm, qkmsfo -yunmx (32) -awqjs (204) -> cuwpd, wvdnc -arbcqfz (21) -qdextxi (7) -rfbnete (35) -wzzjnrl (20) -xxeoneh (54) -> vkuusw, qyharq -kovebn (29) -kdjcqk (79) -zpekki (35) -zwsjm (29) -ofrfo (50) -fqhdf (40) -iemffhw (23) -timjt (2360) -> ouadkun, eimcci -nybvxpl (36) -ukbfn (7) -ngsgolg (76) -peaud (96) -ldyke (294) -> zezecwh, zvlftj -qcbubp (40) -gbyiobd (87) -> dpslcf, eleeg -wjjov (97) -> wmiuyq, xwxof, ycpxqjz -xhypb (21) -ncapjgu (46) -> esbswlu, bkuqfi, nylrq, fvbopgf, mgihcl, ldyke -ngppbum (12) -> okvspp, sezloa -dpimy (38) -fwyreea (63) -vkzka (97) -zhzwir (112) -> akvfgdi, ilqgy -znxntbo (85) -xfuimef (18) -> kuwksy, ivkvrj, dngizd, iloykn -msnnza (44) -> cbxomli, ekrwiea -retzg (69) -qiwsut (29) -eiukshg (33) -ikfnuu (78) -zspsh (81) -gvlbzp (78) -yaqiuq (272) -> aonteu, kafnt, ylpapdi -cypwd (14) -ihhmv (72) diff --git a/src/AdventOfCode/Year2017/Day07.hs b/src/AdventOfCode/Year2017/Day07.hs index 0ac68cf..2782cc7 100644 --- a/src/AdventOfCode/Year2017/Day07.hs +++ b/src/AdventOfCode/Year2017/Day07.hs @@ -1,119 +1,106 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2017.Day07 ( main, getInput, - example, + getExample, partOne, partTwo, ) where -import AdventOfCode.Input (parseInput, parseString) -import AdventOfCode.TH (inputFilePath) -import AdventOfCode.Util (iterateMaybe, maybeFail) -import Control.Arrow ((&&&), (>>>)) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Util (iterateMaybe, maybeFail, (<.>)) import Control.Foldl qualified as Foldl -import Control.Monad (MonadPlus (mzero), ap, liftM2, (>=>)) +import Control.Monad (liftM2) import Data.Bifoldable (bisum) -import Data.Bifunctor (bimap) -import Data.Bitraversable (bisequence, bitraverse) import Data.Function.Pointless ((.:)) import Data.Graph (Graph, Vertex) import Data.Graph qualified as Graph -import Data.List qualified as List -import Data.Maybe (fromMaybe, listToMaybe) -import Data.Ord (comparing) -import Data.Text (Text) import Data.Text qualified as Text -import Data.Text.IO qualified as TextIO import Data.Tuple.Extra (fst3, snd3, thd3) +import Relude import Text.Trifecta ( Parser, commaSep, letter, natural, newline, - optional, parens, - some, space, symbol, ) type GraphTuple = (Graph, Vertex -> ProgramNode, ProgramName -> Maybe Vertex) -type ProgramNode = (Weight, ProgramName, [ProgramName]) - type Weight = Integer type ProgramName = Text +type ProgramNode = (Weight, ProgramName, [ProgramName]) + main :: IO () -main = do - input <- getInput - putStr "Part One: " - TextIO.putStrLn =<< partOne input - putStr "Part Two: " - print =<< partTwo input +main = $(evalPuzzle) getInput :: IO GraphTuple -getInput = parseInput parseGraph $(inputFilePath) +getInput = parseInputAoC 2017 7 parseGraph -example :: IO GraphTuple +getExample :: IO GraphTuple +getExample = parseString parseGraph example + +example :: String example = - parseString parseGraph . unlines $ - [ "pbga (66)", - "xhth (57)", - "ebii (61)", - "havc (66)", - "ktlj (57)", - "fwft (72) -> ktlj, cntj, xhth", - "qoyq (66)", - "padx (45) -> pbga, havc, qoyq", - "tknk (41) -> ugml, padx, fwft", - "jptl (61)", - "ugml (68) -> gyxo, ebii, jptl", - "gyxo (61)", - "cntj (57)" - ] - -partOne :: (MonadFail m, MonadPlus m) => GraphTuple -> m ProgramName -partOne = - dropThd3 - >>> bimap bottomVertex return - >>> uncurry (flip ap) - >>> fmap snd3 - -partTwo :: (MonadFail m, MonadPlus m) => GraphTuple -> m Weight -partTwo (graph, getProgram, programVertex) = do - bottomVertex graph - >>= (getProgram >>> subTower >>> last2 >=> excessWeight) - where - excessWeight = - bitraverse - (stack >>> mapM weightAbove >=> range) - (return . programWeight) - >=> (return . uncurry subtract) - - subTower = - iterateMaybe $ - stack - >>> uniqueMaximumOn weightAbove - >=> lookupProgram - - weightAbove :: (MonadFail m) => ProgramName -> m Weight - weightAbove = - lookupProgram - >=> sumOnM weightAbove . stack &&& return . programWeight - >>> bisequence - >>> fmap bisum - - lookupProgram :: (MonadFail m) => ProgramName -> m ProgramNode - lookupProgram = - programVertex - >>> fmap getProgram - >>> maybeFail "Unknown program!" + "pbga (66)\n\ + \xhth (57)\n\ + \ebii (61)\n\ + \havc (66)\n\ + \ktlj (57)\n\ + \fwft (72) -> ktlj, cntj, xhth\n\ + \qoyq (66)\n\ + \padx (45) -> pbga, havc, qoyq\n\ + \tknk (41) -> ugml, padx, fwft\n\ + \jptl (61)\n\ + \ugml (68) -> gyxo, ebii, jptl\n\ + \gyxo (61)\n\ + \cntj (57)\n" + +partOne :: SimplePuzzle GraphTuple ProgramName +partOne = do + (graph, getProgram, _) <- ask + programName . getProgram <$> bottomVertex graph + +partTwo :: SimplePuzzle GraphTuple Weight +partTwo = + ask >>= \(graph, getProgram, programVertex) -> + let lookupProgram = getProgram <.> programVertex + + weightAbove = + lookupProgram + >=> sumOnM weightAbove + . stack + &&& programWeight + >>> bisequence + >>> fmap bisum + + subTower = + iterateMaybe + $ stack + >>> uniqueMaximumOn weightAbove + >=> lookupProgram + + excessWeight = + uncurry subtract + <.> bitraverse + (stack >>> mapM weightAbove >=> range) + programWeight + in maybeFail "cannot determine program with wrong or its correct weight" + $ bottomVertex graph + <&> subTower + . getProgram + >>= last2 + >>= excessWeight parseGraph :: Parser GraphTuple parseGraph = fmap Graph.graphFromEdges . some $ do @@ -123,28 +110,35 @@ parseGraph = fmap Graph.graphFromEdges . some $ do symbol "->" *> commaSep parseName <* newline pure (weight, name, above) -parseName :: Parser Text +parseName :: Parser ProgramName parseName = Text.pack <$> some letter bottomVertex :: (MonadFail m) => Graph -> m Vertex bottomVertex = maybeFail "Empty graph!" . listToMaybe . Graph.topSort -programWeight :: ProgramNode -> Weight -programWeight = fst3 +programName :: ProgramNode -> ProgramName +programName = snd3 -stack :: ProgramNode -> [Text] +programWeight :: (MonadFail m) => ProgramNode -> m Weight +programWeight = return . fst3 + +stack :: ProgramNode -> [ProgramName] stack = thd3 -- | The last two elements of a list: @(penultimate, ultimate)@. -last2 :: (MonadPlus m) => [a] -> m (a, a) -last2 = uncurry (liftA2 (,)) . List.foldl' (curry (bimap snd return)) (mzero, mzero) +last2 :: (MonadFail m) => [a] -> m (a, a) +last2 = + maybeFail "ope!" + . bisequence + . foldl' (curry (bimap snd return)) (Nothing, Nothing) {-# INLINE last2 #-} -- | The difference between the maximum and minimum elements. range :: (Foldable t, Ord a, Num a, MonadFail m) => t a -> m a range = - maybeFail "Empty structure!" .: Foldl.fold $ do - liftM2 (-) <$> Foldl.maximum <*> Foldl.minimum + maybeFail "Empty structure!" + .: Foldl.fold $ do + liftM2 (-) <$> Foldl.maximum <*> Foldl.minimum -- | Compute the sum of all elements using a given monadic valuation function. sumOnM :: (Foldable f, Monad m, Num b) => (a -> m b) -> f a -> m b @@ -162,6 +156,3 @@ uniqueMaximumOn f = Foldl.fold $ Foldl.Fold step (Nothing, True) finish LT -> (Just x, unique) finish (Just x, True) = Just x finish _ = Nothing - -dropThd3 :: (a, b, c) -> (a, b) -dropThd3 (x, y, _) = (x, y) From 18f561972a25e38c521767a8c6c94760ffdd89e7 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 19 Nov 2025 01:16:23 -0600 Subject: [PATCH 31/91] refactor(2017.06-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2017/day06.txt | 1 - src/AdventOfCode/Year2017/Day06.hs | 79 ++++++++++++++++-------------- 3 files changed, 44 insertions(+), 38 deletions(-) delete mode 100644 input/2017/day06.txt diff --git a/VERSION b/VERSION index d44c3f5..1bf626f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.53 \ No newline at end of file +2024.7.2.54 \ No newline at end of file diff --git a/input/2017/day06.txt b/input/2017/day06.txt deleted file mode 100644 index d369702..0000000 --- a/input/2017/day06.txt +++ /dev/null @@ -1 +0,0 @@ -2 8 8 5 4 2 3 1 5 5 1 2 15 13 5 14 diff --git a/src/AdventOfCode/Year2017/Day06.hs b/src/AdventOfCode/Year2017/Day06.hs index 41cc577..2372a06 100644 --- a/src/AdventOfCode/Year2017/Day06.hs +++ b/src/AdventOfCode/Year2017/Day06.hs @@ -1,54 +1,61 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2017.Day06 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMainMaybe, inputFilePath) -import Control.Monad ((<=<)) -import Data.Foldable (maximumBy) -import Data.IntMap.Strict (IntMap) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Util (maybeFail) import Data.IntMap.Strict qualified as IntMap -import Data.List (elemIndex, uncons) -import Data.Set (Set) +import Data.List (elemIndex) +import Data.Semigroup (Max (..)) import Data.Set qualified as Set -import Text.Trifecta (natural, some) +import Relude +import Text.Trifecta (natural) main :: IO () -main = $(defaultMainMaybe) +main = $(evalPuzzle) -partOne :: IntMap Int -> Maybe Int -partOne = Just . Set.size . fst . reallocate +partOne :: SimplePuzzle (IntMap Int) Int +partOne = asks (Set.size . fst . reallocate) -partTwo :: IntMap Int -> Maybe Int -partTwo = fmap (1 +) . uncurry elemIndex <=< (uncons . snd . reallocate) +partTwo :: SimplePuzzle (IntMap Int) Int +partTwo = + asks (snd . reallocate) + >>= (uncons >>> maybeFail "empty list") + >>= (uncurry elemIndex >>> maybeFail "not found") + <&> (+ 1) -getInput :: IO (IntMap Int) -getInput = parseInput parser $(inputFilePath) - where - parser = IntMap.fromList . zip [0 ..] <$> some (fromInteger <$> natural) +getExample :: IO (IntMap Int) +getExample = pure $ IntMap.fromList (zip [0 ..] [0, 2, 7, 0]) -example :: IntMap Int -example = IntMap.fromList (zip [0 ..] [0, 2, 7, 0]) +getInput :: IO (IntMap Int) +getInput = + parseInputAoC 2017 6 + $ IntMap.fromList + . zip [0 ..] + <$> some (fromInteger <$> natural) reallocate :: IntMap Int -> (Set (IntMap Int), [IntMap Int]) -reallocate im = go (Set.singleton im) [im] im +reallocate = join (liftA2 go Set.singleton return) where go seen history before | Set.member after seen = (seen, after : history) | otherwise = go (Set.insert after seen) (after : history) after where - after = step before - -step :: IntMap Int -> IntMap Int -step im = - foldl' go (IntMap.insert k 0 im) $ - take v (drop (k + 1) (cycle [0 .. IntMap.size im - 1])) - where - go im' i = IntMap.update (Just . (+ 1)) i im' - (k, v) = next im - -next :: IntMap Int -> (Int, Int) -next = maximumBy comparingValue . IntMap.assocs + after = next before + +next :: IntMap Int -> IntMap Int +next before = + maxValMinKey before & \(k, v) -> + take v (drop (k + 1) (cycle (IntMap.keys before))) + & foldl' (flip (IntMap.alter (fmap (+ 1)))) (IntMap.insert k 0 before) + +maxValMinKey :: IntMap Int -> (Int, Int) +maxValMinKey = + IntMap.foldMapWithKey go + >>> getMax + >>> second getDown + >>> swap where - comparingValue (k, v) (k', v') = - case compare v v' of - EQ -> compare k' k - ordering -> ordering + go k v = Max (v, Down k) From 5d7e6a48ab79fb6555ac6856e156bc85b2daec6f Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 19 Nov 2025 02:07:28 -0600 Subject: [PATCH 32/91] refactor(2017.05-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2017/day05.txt | 1090 ---------------------------- src/AdventOfCode/Year2017/Day05.hs | 34 +- 3 files changed, 19 insertions(+), 1107 deletions(-) delete mode 100644 input/2017/day05.txt diff --git a/VERSION b/VERSION index 1bf626f..e26ccbd 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.54 \ No newline at end of file +2024.7.2.55 \ No newline at end of file diff --git a/input/2017/day05.txt b/input/2017/day05.txt deleted file mode 100644 index 6e940c9..0000000 --- a/input/2017/day05.txt +++ /dev/null @@ -1,1090 +0,0 @@ -0 -0 -0 -1 -2 --1 -0 --5 --6 --5 --3 --3 --8 --3 --7 --8 --4 --9 -1 --3 --17 -0 --18 --14 -1 --13 --4 --22 --7 --8 --25 --23 --11 --3 --9 --3 --26 --7 --24 --15 --17 -2 --18 --39 --6 --28 --27 --38 --47 --17 --16 --36 --34 --3 --40 --11 --45 --11 --34 -2 --27 --38 --7 --48 --14 --35 --37 --31 --42 --8 -0 --39 --20 --50 --9 --7 --18 --6 --65 --44 --68 --67 --61 --19 --3 -0 --66 --63 --29 --4 --29 --77 --51 --72 --91 --84 --38 --93 -0 --7 --15 --78 --68 --59 --68 --47 --60 --101 --30 --69 --4 --52 --4 --60 --30 --65 --44 --108 --70 --43 --80 --102 --25 --58 --60 --13 --81 --17 --51 --32 --93 --38 --2 --16 --8 --1 --94 --55 --122 --77 --75 --25 --30 --55 --60 --23 --49 -0 --119 --90 --129 --35 --8 --18 --79 --65 --16 --100 --143 --148 --39 --106 --140 --102 --126 --36 --41 --20 --23 --140 --138 --112 --49 --60 --7 --152 --162 --142 --1 --38 --15 --4 --7 --65 -0 --114 --150 --160 --162 --29 --164 --32 --60 --60 --97 --130 --97 --172 --25 --185 --35 --77 --138 --188 --182 --137 --122 --133 --6 --37 --199 --108 --53 --188 --60 --30 --160 --160 --23 --176 --10 --23 --6 --116 --216 --155 --107 --66 --55 --107 --132 --91 --152 --127 --142 --90 --54 --40 --86 --151 --123 --120 --37 --84 --86 --205 --117 --179 --32 --26 --228 --232 --116 --67 --122 --125 --61 --2 -2 --216 --63 --31 --147 --84 --113 --122 --39 --5 --47 --200 --129 --224 --246 --8 --112 --140 --65 --259 --110 --164 --85 --97 --129 --90 --124 --6 --228 --143 --78 --166 --150 --165 --262 --178 --6 --44 --44 -2 --57 --43 --116 --197 --93 --221 --160 --96 --121 --127 --162 --181 --45 --40 --139 --194 --311 --291 --104 --217 --103 --28 --207 --21 --97 --91 --224 --257 --278 --176 --8 --93 --103 --35 --33 --320 --70 --254 --115 --59 --171 --45 --143 --250 --187 --181 --146 --210 --66 --297 --188 --79 --78 --309 --186 --272 --62 --41 --274 --323 --174 --344 --45 --146 --110 --283 --135 --24 --262 --39 --41 --112 --190 --214 --314 --224 --338 --167 --240 --95 --231 --154 --281 --52 --282 --274 --332 --311 --9 --159 --191 --80 --299 --354 --250 --232 --98 --132 --72 --61 --318 --255 --194 --282 --289 --114 --131 --267 --276 --65 --238 --335 --124 --7 --339 --295 --111 --260 --76 --82 --206 --383 --251 --230 --139 --109 --273 --222 --302 --359 --23 --326 --283 --75 --186 --270 --38 --208 --127 --63 --265 --215 --308 --350 --175 --358 --2 --166 --343 --421 --253 --34 --177 --426 --173 --127 --108 --93 --412 --102 --216 --35 --254 --85 --238 --401 --268 --212 --393 --332 --30 --374 --301 --39 --449 --59 --453 --63 --301 --251 --396 --78 --79 --279 --171 --471 --236 --56 --101 --129 --50 -2 --213 --127 --107 --90 --472 --473 --435 --17 --490 --354 --122 --65 --181 --303 --319 --133 --350 --380 --60 --200 --55 --44 --482 --501 --82 --51 --361 --167 --7 --493 --68 --488 --18 --487 --250 --179 --143 --307 --85 --494 --178 --477 --453 --519 --143 --104 --523 --282 --16 --497 --358 --209 --292 --337 --500 --255 --167 --527 --184 --451 --305 --277 --453 --296 --441 --410 --521 --431 --215 --23 --53 --88 --296 --28 --454 --285 --259 --513 --526 --164 --4 --90 --22 --274 --432 --487 --372 --130 --162 --317 --401 --390 --16 --162 --409 --509 --256 --274 --371 --331 --430 --10 --562 --516 --246 --399 --122 --328 --134 --211 --443 --321 --290 --579 --101 --48 --208 --503 --138 --43 --33 --278 --8 --278 --515 --111 --164 --503 --69 --538 --450 --290 --434 --194 --477 --284 --324 --292 --582 --267 --38 --217 --489 --102 --142 --50 --511 --606 --254 --404 --319 --261 --191 --26 --376 --13 --355 --483 --133 --573 --136 --508 --70 --249 --86 --353 --280 --418 --582 --371 --652 --643 --369 --522 --33 --456 --226 --600 --621 --394 --516 --52 --542 --548 --524 --4 --202 --102 --405 --203 --101 --76 --160 --30 --314 --45 --211 --223 --35 --672 --640 --576 --198 --131 --478 --334 --44 --489 --351 --180 --242 --473 --462 --519 --651 --608 --360 --626 --262 --403 --50 --535 --284 --387 --227 --523 --152 --454 --687 --331 --201 --246 --533 --667 --71 --34 --24 --190 --227 --528 --413 --302 --687 --719 --714 --466 --432 --460 --83 --703 --401 --642 --146 --350 --128 --549 --579 --83 --747 --219 --612 --410 --694 --643 --268 --323 --684 --677 --290 --6 --78 --627 --751 --360 --76 --249 --724 --154 --106 --290 --669 --51 --290 --634 --740 --605 --645 --713 --214 --767 --752 --689 --174 --487 --386 --561 --394 --605 --4 --7 --180 --781 --75 --462 --471 --723 --709 --30 --434 --771 --652 --8 --796 --748 --87 --463 --276 --436 --477 --116 --86 --600 --476 --499 --173 --219 --85 --458 --225 --144 --405 --688 --570 --45 --65 --741 --184 --504 --265 --336 --130 --361 --95 --528 --532 --186 --461 --189 --682 --306 --223 --75 --11 --640 --313 --539 --548 --594 --203 --605 --277 --356 --822 --242 --282 --219 --441 --72 --558 --832 --322 --572 --44 --660 --736 --754 --99 --192 --482 --248 --296 --799 --418 --759 --114 --507 --10 --717 --778 --279 --775 --787 --864 --554 --525 --632 --312 --183 --267 --735 --342 --453 --152 --882 --95 --538 --227 --336 --719 --254 --481 --481 --591 --739 --783 --409 --468 --328 --429 --271 --425 --246 --476 --822 --757 --771 --2 --41 --676 --821 --288 --386 --749 --528 --777 --916 --312 --648 --699 --26 --258 --722 --513 --706 --111 --631 --745 --148 --710 --147 --470 --312 --314 --448 --530 --674 --283 --657 --404 --483 --712 --278 --154 --841 --152 --506 --537 --226 --649 --711 --808 --331 --196 --877 --432 --847 --745 --669 --71 --692 --175 --438 --83 --826 --64 --611 --528 --553 --664 --754 --678 --503 --362 --365 --710 --339 --805 --47 --298 --274 --551 --901 --581 --562 --368 --6 --559 --964 --994 --404 --148 --383 --154 --518 --350 --309 --669 --689 --780 --457 --88 --142 --522 --177 --115 --935 --893 --306 --481 --912 --745 --691 --763 --674 --246 --994 --497 --686 --474 --661 --385 --9 --310 --710 --991 --51 --361 --314 --346 --355 --872 --622 --998 --586 --631 --1023 --798 --789 --55 --166 --658 --818 --850 --590 --1035 --274 --524 --913 --183 --383 --297 --378 --186 --858 --369 --191 --815 --648 --367 --460 --879 --1052 --476 --382 --455 --892 --57 --54 --523 --824 --1030 --675 --980 --818 --629 --201 --939 --586 --913 --858 diff --git a/src/AdventOfCode/Year2017/Day05.hs b/src/AdventOfCode/Year2017/Day05.hs index fd42876..4cf7fb7 100644 --- a/src/AdventOfCode/Year2017/Day05.hs +++ b/src/AdventOfCode/Year2017/Day05.hs @@ -1,41 +1,43 @@ -{-# LANGUAGE TypeOperators #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2017.Day05 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) import AdventOfCode.Util (iterateMaybe) -import Control.Lens (over, view) +import Control.Lens (over, views) import Control.Monad (ap) import Control.Zipper -import Text.Trifecta (integer, some) +import Relude +import Text.Trifecta (integer) type CPU = Top :>> [Int] :>> Int main :: IO () -main = $(defaultMain) +main = $(evalPuzzle) -getInput :: IO [Int] -getInput = parseInput (some (fromInteger <$> integer)) $(inputFilePath) +getExample :: IO [Int] +getExample = pure [0, 3, 0, 1, -3] -example :: [Int] -example = [0, 3, 0, 1, -3] +getInput :: IO [Int] +getInput = parseInputAoC 2017 5 (some (fromInteger <$> integer)) -partOne :: [Int] -> Int -partOne = solve (+ 1) +partOne :: SimplePuzzle [Int] Int +partOne = asks (solve (+ 1)) -partTwo :: [Int] -> Int -partTwo = solve updateOffset +partTwo :: SimplePuzzle [Int] Int +partTwo = asks (solve updateOffset) where updateOffset offset | offset >= 3 = offset - 1 | otherwise = offset + 1 solve :: (Int -> Int) -> [Int] -> Int -solve f = length . iterateMaybe (step f) . (fromWithin traverse . zipper) +solve f = length . iterateMaybe (step f) . fromWithin traverse . zipper step :: (Int -> Int) -> CPU -> Maybe CPU -step = ap (move . view focus) . over focus +step f = views focus move `ap` over focus f move :: Int -> CPU -> Maybe CPU move n = case compare n 0 of From 20981601727f4ee1109531219a13ccb08a4806e9 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 19 Nov 2025 02:21:24 -0600 Subject: [PATCH 33/91] refactor(2017.04-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2017/day04.txt | 512 ----------------------------- src/AdventOfCode/Year2017/Day04.hs | 18 +- 3 files changed, 11 insertions(+), 521 deletions(-) delete mode 100644 input/2017/day04.txt diff --git a/VERSION b/VERSION index e26ccbd..60b816f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.55 \ No newline at end of file +2024.7.2.56 \ No newline at end of file diff --git a/input/2017/day04.txt b/input/2017/day04.txt deleted file mode 100644 index bf3fffb..0000000 --- a/input/2017/day04.txt +++ /dev/null @@ -1,512 +0,0 @@ -pphsv ojtou brvhsj cer ntfhlra udeh ccgtyzc zoyzmh jum lugbnk -vxjnf fzqitnj uyfck blnl impo kxoow nngd worcm bdesehw -caibh nfuk kfnu llfdbz uxjty yxjut jcea -qiho qif eupwww avyglnj nxzotsu hio lws -xjty usocjsh pivk qnknunc yjcgh bwya djw zpyr -ycfmfe mgq sjiomg nfzjul bjwkmgu yvsnvgj dcjupu wzz blmn -rdowgbt vpwfdoi blzl laghnk gsa vhnpo cztxzlb rtz hvwonhb eciju pfjtbo -bqs bqs dbutvgf mmzb izpyud rap izpyud xlzeb mnj hjncs -xpu vwp nujcos piu irindir tpmfd umtvlm gznu -sfpuxar qcnbte omouazv cnh uaxspfr sepolf rusafpx -xbmaf iceyqqq sabpt gliexel muubepe qqiyqce fmrcc eazk obkeonl fmccr kgk -apg gbycwe gap pag -gagv saqbk lwtllc wnhzz khxsjc -lgc alen rlmsp anel gcbvg -bujlaz rks rlqf deknmee yrp -scqvl weusbc bgvaz vgg cjwsfno vqy zbq aqy tvf bgzav -hbki vei fxdwljs myjuba elbsib pvy xxjxgi dtgv -linzaeu qbwdke fdg pykw -qvtdd aco aav bpu mvkcuc kjfj japgfki jfdl gem hog bdzsiea -wpbigkb lzhwba jssjkn qvb kmwu qddv -iny osyvqnt tumunzb torq bdeneg wywank poza ipp iggorw -tuko mhdbsf vmjdop jomaqpj rcdsud hmgspr lsas nzmwc -cirkjq nmjuu xtgejv gtexvj vjcmtqq unjmu -xsdmezq xvqjvqp exhygy qahju hvd qadmdh lok -wvvys kax rohrrar rwhnvi lhnmefp lsktouy bxilosp -wayf diobnl zvu obnidl oibnld -cewil ygsf ffzp ruxhu vah lnvwt aef lnnjc kgkb gxtlx feko -uti epphrin pywths cpzzh csjei nczhamy gayxmb bdcytq xkx fgmt -qvzyuwi dwo swkw bwjdrn dasgd ijgw vzabaop yefyhmc wgij -dyg sugrf vid etz weyqg nyntx dwfgwm khon hnzzzn xfyra -ofbh bdrsk rdrjj elaxvk jrjdr -msxau rsocvx zxdda mxz lknl -qktaywx dirpdbf unqnd wbrwkuu fvmqwl emxr big -xwz kvsydc ayokjyy qiah omw neo htltxx fxhwqwj colqvbb sxmo ephfkex -ncjxoaf fwjkc czmhv ylg axcjofn dvj bzqjku opvcr jiwzucg vmhzc -gmmnrt zqar twdwrg qiwwki fcbr lixm hjdwwe moiva -roinlxg cxeezve whannk cxeezve pyoj boweioy cpkgxsz -qkct qso xlb xyy aellfet rzt cbboow devfb nih fhbfxzi -qyc ltxia alixt atilx xtgrv -svruz ufvo rvesnxv dik vzurs jjg idk -xeudhrg hudn cilo ljplosb -kpb oyzvywx vldko qhfkwod bkeutk zqcqug pbriu wqocos -qkngzfy whobyri aze jvipdty ocirbep icqwc -kzxxlab sjr zhymws xkbx -nnxs gkwtld dwhkry snuibq dtdl aicug bhtlfzp qzk jctos -regvro mxcq hqof yraucxi jhkol iuxineo pbtnk rfjwc szgjpr ndqqj vfgm -yqrfox xoqrfy utbryu utubyr -jdubjt wqrl wnk rlqw nwiq pnbn qinw uaff ftdo htfrav -rum mur umr tij ovbahl losao imawwpb wadhww tbteyqc -napxd kzeiqcp ppgqucm xkityt frq hugrp gjgtt gmuqppc zwqme -xyuzs ysch howlzgu dkqppbs nvbiz mks mtxv vivouex uvawq -ffe lfsn nlq mpulheq ikcfo wdtz cnwsbph zkib muu -bqkxav wtecb lxwdhr kqbavx aqxvbk -czwswqx ldkxapd pfwd bdkkj iqohla cwosw ihqpd pcc ckhabbn -foiip hau rbqiyhh htm omeubgh symh evfcqg -lqx xlq rsgf izu esetis -npsrkdj fvulgkw eovw mzr uobcze azb tij ihoer ehori jit wknsqhm -gnrksh xwggt oosi bpnmhx qqaa mpmryu jhzyz -yad gbexqcr gbexqcr gbexqcr -ldca xxhznn twyy ytwy zhxnnx xfmpi -floioot kfyh dhibv ezyznar sfg sfg ezyznar -cinioim iiocmin ypla aypl -mhwcjbz dftuqsy wswop eizbf ptsd -ehx mlh nfxgfkz uuw xftmn ptlkbo vsnyo ttwce -oexvf orcg cncnkfk comvhl -lqewsj lyulrcl efixd qvd fhznqnz yvrkwyi xmhgc vzbp -dmr wrxqh thcm giomp rtvl ssc gwq rbklw hcmt fjvud -teozhb dmzwfv qkq pvcqfqq -hvlebc qqmg repxk zwrjdx ztruwb such tyligs ybg -psa rqznokd lgc jstqres yiqt mbiody xazb xjuk dtb -lea ncm rnh myzqzwm -wjml eums ueflvbr cjpgnl qduunu zfxaai jwlm lprzzg vrn ttetyr sume -uwkgeu uiahd plyewgi vveo nwhsitz mcitc uvk zsxehgs sewl -lnbdrka sgtivn sozzq mgd vhxfnlr twrfpk -gadphmk mbx lmlbrf tsnehnr lawdpm fnima gxgl -umty vrn dpow fsnnpjv fsnvnjp nnsvpjf cioaio -euu uue zeskmtk hob stekkzm -ypqpri qwdju ypriqp iprqyp jnoxqa -lkppi ingfxw wlulvp yhwrli nxwigf oyuhq ggfslx -kdd ypvr pyvr waw vyrp khqq mamxca bapq gobfm -iuq upvdpv zxef bfwns lmq lxswr kpsqo pwde iaaou nsw udy -lgzo nil ovgrmt omgtrv jrqp pqrj lit -uumyu iiakfj gvdtzz qbux yxn ejs dvlts -hcm ghutxq zswi tmyhqef hgxtuq -shkhkdk kad seubeax kdl mzu -cpykgr skx rfhpor xsk moyhlai ogv ophfrr dxipuuh -beyw jvrre opodn zdoajhx fhg ijs drczy drczy hjungq -jrzieja gfg yzdn yxm wshibsn fgg -xtylh vxscmvp rfymq uzhpyea spxcmvv dlni msj yxhlt -eov awql miv miv eov -mmvrfbg fjiyf hvqz zpuqmbf fszyuz ldfgni wemfjl fjjpl rbnpy rfb -ppzpeh nam ntv xnchtyk hja hpepzp foj bibvx nmmdlff bsrkp -qiy qiy umhlnh qiy -tyds oepk wae tdsy sdty -ukawr rkwau ghtjhm axy -wtbjiv btjivw ewaf hwk ttq -kdpun myve sqv rhvpy fnjwt puw ujhf thsp nkdadqr -vyw wkkpdpy xlgz lmmcuve ncuq lmotk -pmsfw vxd jpe qxlyasx ejp gwuv -pmgyndm ezofbvx nicbwrw kwnlj yjvnas fdpkfo mqcsyhn pyjpf fbexvzo vkftm erl -trmwvk rywuzoz hbidea kicohfz heidab deaibh -sogf govd dknpk vxrvk rlm vwhjk -xnxbfmw wguzrhd zbmkz piwppa mkbzz xvwrdgy flusfqb -cgduq hbnwr xfx mrejb ckw zkbaihf cloow cwk wuvthv iwqctx -vugx qbucd gxuv ocb cob -ilmet fbelxxz qratdfn unoj hbc duv srmikz -vnzuw zgpbqgf uzm thysyxd dinfh bgvr olungg ksd dsetwqz hpg -omagsf zpr coa kknx bzithq pewp flvoz xiiq weojqr wpep -aagj gcglqt gqcglt xbfx dhdx lbx -pljq plxuscw ilh wfk lhi hli fouieyw -hvnh zvm aqy dzitirm veq ctux -lglhs aqibdii hjbn cfgc qrg pnbntcx owoks ebz -jozngde lwne mbo omb fnyzvvj gndozje -bbdgc igtdj uhahgp sqduko -uuspedu fgnspm ewc slly jbs chl heanm abqijx kadvgxu -akfsft skna kusjqr rkqujs -erc vrljpu lruvjp lpvjur -iors hcdr fsqtcj vop vmn dtqnz tov oscjlw cdrh ctfjsq lrnts -fxp mczo sjlcxa mzoc jmsq hcxybow dmrr bcoxhyw -aac ewraerq odmxpz aac aac -zzio zebmxa szeej poordr gmi owwnnh xfx rzrab lfey jesze -akc yyoj vqod drtne -joxhvyf ymasnbr omouvq isxdrr -qyi ayrkzu jsk vqvvno jkkuxi zufnnwu mrsszdf -ocqi htfb tzjna cdt wkzhynm eergf -yokzugl usyuqu qvotq uweqyow lygkzuo kpmqmb uglyzok -glvshl imqv jrv xlpnsy gcg psj irtiamg wkl -bjcpc nvyloa dkkan efj okubpc cxlowm eone kmpny -cyxqys nmuaftv gqxj gtvsc -beouh dioxiah kizdy hyi cozrray rave fqxmxmj gdm -frjz amrsat lxvhzj azhevtu vxlzhj -zwmnrk sbk txzrcsj sbk oosgfej cvh zuthibi onvwd sbk nhwpzq -gzamt vraw kuk ugayl lyaug bww rwav ijah -bdjirxg vifjr rhbxpa oao yrhjxoi pbn -navb umesiys yhix phuhu aekkciu nlnsiq wjf idqdwp -cmhw rsu urs ziprlfe -kyhxitv cgty bnwjyq cygt sgjn pdab imarvhg yjbnqw -axaa ejancv yau njpc jvwy bpft kwjvg qzrbvtm diu njpc bpft -ambj upe rmqr yudbiqf krudp pqyf -tnb mobnpv vep ohxoc cyip wxyccfo jrbi rwsws kls zlv oohxc -fjh dmb hlbq bqc jhf kax suz fjjg rkpc -wjnn byfirm goeyh xtjmdka -tgyfxx hefpxln mveobqr yeo ftfn srt vim vlcu hevoi xtaaff -imyql xotcl poql rlueapq bkwykm hlalk bkwykm -gkec zff hbmtq rjxjbcf arerlu pvz cdaqi nijmhv uodwjh -mpctof mopftc ksfbat sbkatf -nvdd jub bvi kyggdbx nwtiok gjt mgsm dbhsn rzibgjm dvdn eqi -ysd iirp dfgzza wiyeoou ysd ispkv bcqg wwzqgq xphse -ntq ivposb gsd ezl tlkztp lez qyurp vxsmg dgs -wijs rydbj onm usiyqzb hwrol giusanb kewukl yziuqbs doojam nom -lfacyy xwwast truqtt tzneimn uxsydc ktu eqyaj ndszak -ffleooc kikif fohgop aucy moubqxu -iaxc pnwexdl ncy vmwm xrqoi wpgftq rofx utyzjuf stdxq twpgfq -ppmlp etsvi cjdx poly ynx vfxpslg mqjo qnpsage flpsxvg jwsxiqt -lbyhnb kflrpeq ssoti webxr embbjd kbnx ubzqco -khhc vwuqzb ebocbko rwmonkz edfqn hzh qhncoq gbwdi wjeg ocwow -ghzhd kcxblp lzwkkr gzhdh umk pblcxk -wyajtw jiff ouylv sni lwhlrg avqjiis igzx wbl lhrwgl -glhh kaxha tqii hwzx rgic kaxha rgyidmt qdgxfl ynjc oibfij -bapj bix rjniw ynbql idlvnmt wynpzbl zlpuoix kvn kakwys -aldpxxu iojxp rif xbyqtr jffdvy qnrq tqwsdiu -ulssco ktbymjw bfj zhkg zgc ctyri -ilrmq wfahcgk mrlqi bguad inj -cjzc rekuy ifr wfkg sple -cvjkp qbmumnp mprg ltmwxxh zpemtyb ozzssfd ksu mgrp -nvc sxp mpkxz bhlctq hguaa yrdkm iwsgfg qjssh gobbies hucdh -jdxrjw qmo qmo vobhnu -dnjib wtjp rfdjqdj skpvrb vkwevb kxxovp -fzi kicta zkuvr rfaawv ehklq cfdjsyb tukahwr zkuvr kicta ouq -aba ytdguk gqmpn hvxabff hvxabff dckj -fna wxyqhxd hvy khsu yypoyy lvvue medheua gim slf drdbeh ikihf -jquz wwo wwo ghlz jrbvb jrbvb -jwzvkl yjw ouwla yjw ouwla -zsvlgyf rzqbtj qygynem ukdgjm lbsyh tmdzp fbcaim eymzr -pvw sbs dvsa plmepl pwv ayxk vpw dwt -inayadn pnti yzhxk azga gxq aznbciu gjnmyqm -isgf ndqmk beyqq ebyqq srtzxo aiiw oqfuwp uoqwfp buejctv pxbk -pzl irv tzvzdb wcy eszm ybwiw ycw riizifd iybww -btpu cua azzqffy owcr -ofwq sqlpzat lozdxlc aevjmpc lcolzxd wbbysn qwfo vcrx gdzgi -dbpfmxu ydsxwl ijn svxtop csep ldqeog ffye zcrl soh aclw -wyiyyhv vyhiywy obgi hiyywvy -ddvaoc lhv spurn rgxyy onjw illvn yryxg xyyrg -vid wdttqq kajr myip -wolqlue phlunpt dcmmkfm sgxk dmmckmf sfng jlbsntq dxp -zmneyho fswj xdgsjc oefwjdi htgxvbd tgqrq xodoa -ynw bygqdnh hhmnkuw cojqrke qszzdjo orskwq mdfae asabn -vvpm vkj pcxghao caoxphg axhblxb vvmp -txox nzy eqn zgir dytsi girz ffa ugjjbzj brob fll -kbz pukqbd fiwmuh umwihf bkz dvz -vgs vejs vejs vejs mbkyjjy -viqmnmu bitkyw nddnk dknnd cldnpp hipub plcdpn fdzzpb mmyomn -ndylnfx gozlrx ngptk rnpteb wtacx xmtcjy xldha -fey doyxis ampmtr ycqh syw cqhlj hnngx -dijf nac tvkq ayo akbj lzmngdm wfxpn bpyvrf cvdqpa -zsofz lhho hgat wqskga mnt -mylwm zxsd omzpa waz hcrr lxmpq jsw sqtwak pzoma -rwhgsgt ysdq ztihici mpwcawv alkqg wsxiwx -snldn bcb anjdv cbb awsscc cqxult hjmjew mcycb fdpdg sesrh -kukrqm fawafz qdim wyobtqx bnvjnqg dcvqxta yptr nnpu ughldqp duo zafwaf -knb yjqb bscpnt nzg sqeu zkahna ttuf nsbtpc ixwit vucwj idix -bfqyx xlnpc ijrxu zkqi kjxtahr fgag orusms adi bfqyx bfqyx -dqddc ncbv bvfk hefikb dqddc hqjl otpx zfiu -ntkv qunrzx eztzure ctt rjo bkdt znvd jwdf gqhf mmhrzgt -zeavm hkbf rawqwuf pis dojlkt vnjhmi uvk cufmn qginezd xyut -hnidzk chlctc yst pepd dxntbxg vqk daxfpmu wshyddl -jgd vesqgo bdyqy igl ahstdm wjtd lrtkjsv tjsj sccxbih esn gkkzj -iisiswh jll rhlaf jqwwgfa wmhyo izva vrg zjkak nlxxfer rvhx -mkrkd jlqtpy ukstro ktuors wsj ynqpbp kpiyxzv nxeiwg xpzvkiy -jbr gnct fwklekg cmfqnm ctn gqobrs kwht -pztmjs yiffc kfhsblx yiffc yiffc -biezil iiezbl bzeiil smocoju -viiigm gmmmk yeiv dxzogro qsmzsur hukzwjn lcle syo mdj uruf rxfseu -extchsd adeff ouikoj fyaclr rwwvqsd dooe tcxheds zrdqqhm fdoxv kbxi tlcj -aycnydq qlxhka zoi shplo qll -bfry lbwckm ltq rbfy gpn vojp ruj dpxcve geq -svtvfwh lca lac qia vhwsftv nookdfz xgjiaf yvcdlt -aspgqym fryuzhx bbydf tbn bwutsc fqgi zij lmxhog qnmse -rbb gsys volnas onvlas lonasv vwjdso lnteapy -got iauk kficn jvfuy yvoe jcxwui hyamqx mke mwh jcxwui hyamqx -avutfi ggmha dkopc kothnnb syoi xsd wjedywy -oziejyz yzeijoz hnthyn knj juuq qujtp kgq bymlnlf yicf -zsejuy dybeap hvowmvn okxb yoi epadby cnzjk xfwprzc -lacg iiix fblhxvf nrkkol lnafzw qspzsn gvdy ipj zub uouseo -evukwkh ycjxxc lptwmf pmd izxdsos zrkavf pgjoy zwokg mpjiej -vqw ijwoy eaw wvq svmcq ccxi nyub ynlq eqornax uprt pygfe -plue okbbm btvm gba kutn jacjx ysqt lvx pcxxu qcf -pyw ffjfudq bvk hsdwdva fjnivhf odbmw krpgrj -hziesm bxa dceiwt tmvivjk snl fkh dahsxyx kqlhak lurtk -xss sswyxrg yqff dbkx kbxd mpzbmnl bzplnmm -uvz pjm ilrol pmj uzct ztcu brhkv -heiz jcn syjt zfvlvaq aflvqvz amcjh rxnitw -cxl nxvrn vjnz aewtr cxtko nnvcp ltptd adpxt zvjn fntklj -aymmm tuirj hzngq zhbh paqs kvpfo aqsp kmo acprw sabrso kdqmp -ndqjspv mmhp pndjsvq rti usm -ije oad mvelyg jadz ekm dao zdcmv -qwww tmwmdbb oxxfoza rgmf eonku brh gcgiuoi ojscn -fjedeek ohlax fiydku rbnxpg wfivg cdgs -axwbni hojye mwfe oyqknxp whdgfy ihku mbhr gagnz hehagxj -hibautd blnayq lnayqb gepml mgpel qunw -ircx oeb kujtip zbu ebo cmmn -upyqvot wbponp hnn vav avv tvrky omm -yzqsnf agbfsw dbxoya sfnqzy hqrxek qsnyzf oagyerm xxhukm -xzvk mvcwz oujr hell hoe xexa dqlpqt xdqz ucola hsvv tcmybhl -skldxr mzyol ybzyzd jnnxb rxncdy nkpwy fwlnsw omylz oiwieu fshv ngvha -jkwqf yxrox hejfoq orxyx -rijken xiwf mawqcfu erinjk jsi yyg mmu mdkfqb -ornjes krp eornjs enjros pyqp nnwwjl -wzd uqqo kyeli tikdle aykdjog uiz rbpnw mjxezf ihiz rlgyg -cjm ajqgvkz kfgyy dmczlc mjc kxcm zctyqgh ymsk jwhqfd czpqgan -vxkzvco owo qogj uyictoj kfr pyoo ejrru npluynx bvv jhhzu kuciwc -eqk pcsly kelu arzgoe trfo fotr cuaax -lagonw qvcssqz sdoklh uvovi sfrkmd hnvafj ltg wfjj -viwbkm hpwe kzzwrbr axjtlq mznin wwpjg unlwur -nuzorgo qfoz ydisca qxdfutv hzg -nqgge tobtt hjocx ntyqyi rxzkynw wrnxzyk ciscy trjt ottbt -yuii srawx gljxe eteogz kcu jlgxe tjik ktsnp agudqok jwol vfnyv -vgicg dhnrmxz sjhozy hlalx rutwq -nyoyoje kco hoyam hoyam tta iflud amh gdxcsj vqr fvsqcgv -xdmbtph ueen cskerl rxjvpdc -nricn addljzg obq rikez igq bxygkmv qmgojou uheubk qor -snzd ztusvr vrstzu mceddga hgu -vvrbfjg mcdhmsf ldtwl otuna gmjurrx jgrurxm rxmurjg yrioq -iotkvo sftfvn vvoit lllju xvlg rdsb ywmdf mzxigu kzq -sgqw gqsw lqfu wgqs xpiwou jurgucd azq wgaqpm -ijntzi chlnfj yjqatz hjflcn vys ofq oqf oadthe jrfw -mmc motjo vcwmod rpaszfk zgkkua bpja vjb htrk -bpfvvka kmger mnvvfl hakudy yfprdoo mvnlfv rgmek evnwg -mykpu juavkn cecdvi aszbi lxm hmps oaqoif -fshizd fsdzhi lvcq hhpb eavwno auqlwz rpv owcdojx amsmf qgnddd -pohmcn hlcxk qsesxh rncr -fgyrsis ldem avxmnh frpodq oefzn -plfpu qdyojz xdrzrjy kpv abkh fge bbnotvp liikmcu czvwl oyh -ovha muitw pzy edfjoo fhsxuh dliyruc dikcd cqem ywfy -exyry jtzqn tscr qbtxno cikk poqgr tnjzq eofe sxea anlikep kick -zcie purpw dmhhms bcdo prwup uprpw wfejgjd -kwtjc cmixp dodfwj hcgmmat pkeyspo ubnl ajxvj ffkh xvw -nvlgq oduus psufiqg lrwpn dleftn xtllqvf usgz -liarf sczsf sczsf wky qtzq qvve qvve -cit vtjsh jrhkyvi txj urmq hppx -rhblmxn rhblmxn lkgow dylurwc beyk gfcewxj ehpl disoe tjbjy lkgow -nbkrm jvk ffux ars agns bebic jzjfm kmnbr gptvtsa ufxf -hrlvup jaz tafyr qcgq wkd fiz bgsrx jmtcvo qkbvj -eontk djf tiafrng mtwat puainel nyjoh meynxbf eqdw -aspvmbx tgzuszm fpj xkl nzpr fjp vnomk byx sbtov tnu utn -ldyww gwmiddv hwyh gcgsdit gtgdisc suufl xsw dlwyw -sye dgbd wyf ixqzthx dgdb esy -nsdgera fqz xwbdgui ngdgbcd bcn qrdxml cwcmxws tncm mqsodj cqgk -estayas cocmbpv cdcf vygtswo aplwa estayas -ndc ndc wntr sfls sfls -gse svv esmi lcdii lnr kemrk gnk ildic blnqy wvn -mwlpm awkr sxsudub yauwww hnktbog fpnqc nmxoq yoparu tqjpkug nbipft -czwnkk hrodtmx yyzpil ooqjb cvxzfh -kwa wak gipak gsgrw -jyy fja jjk kuvoqdy urqx -doyu chgn gvtxi qjdigvy kxr dizwrjc sll zenl yyblj -epxeqih kfi hlog pakk kkiidrh hiufw wuhif baqzxzi bgcd phi jzjdxjp -hllhyad sodc nyrtfe kygof hyyqi txddqg wcwxvnt ewqmj wwv -vxymuoe caat diqwbo vfruxdf sqniefn hetcbl nvtttu ouesb -yvoez pvthzc tdowuci wjijicn fhpmq kfobag yctdwj -xaugkb rprkg tidpx pjk tpwwm pbcfhr wmwpt sfynrl iouaw zbnyu -auakc culuxg bffg rodyhea ixlmtfb jdurl szoa -xgona fjzho buh khbvti ddh mgj ptgaqps -dqldupd udpldqd poku gfgpcg zsvk grvk kntx jih uwvxdvq sivk -mwdnq wmqdn uzto mdqnw -alvfm qxqo thwru xqqo jilnsgs rnonk fwntuby ogbha -gvxlxyf cdpv khvpka kgt gshlaa tenb -mtgvvxh mrjrsd truk rrerzx tujweaz -ozepw gsqkr rtmmc cmrtm -spnthg xhlzuu xwcrxz aqqejhh bpzh -ectdftk rgp mkp vxp pevriz wkgfkaw vfygj peg gep wjn -bksbu ywsszf tsbrps vxicr hfustju ynnlbo -sio urbvf ujezjk vkyc ukjezj bvrfu qwwgqmw uqfekvx bzipxus qfumwh -druru kycweog ycmef rjyy fkgp -rmf ifbip rsztco coju wlr bfbmsug lwr bsufbgm nwmp -jjuxtyd yif rkldsvu binq spepa mfg aszm -ghilaau ncm sgbavz omzeotz azukf bgjw zqzo gjbw pld -gtog iqheik budeu guvljmi -qqlj jqql ttk xcxu -cfq cfq kpagib dxfxufw hhksbjh gpcp -xkeax acnia jjubfc mhot uxlhh gnkj pavta rciondm rkquh xudqian -wqhqzg psqh rnnc uujlgq -hpjpaoa maa rdndl xewqj nmagwx xewqj hxuyvou xziv rdndl fbxmbz hmfwghy -dtwnrca hbfcptw qrmvat sdatx les zwizogq -bodiwzg sgoas fsf wgkrn zgbdowi wfkz -ngcsg grtao wcfxpyl gngcs fxwycpl fkpt -txvngo vxngot tkoap zqjc qzcj oeruix myh ihgdfik qtt -rxeh fcbnoo rxeh lve wvoc pmnxej dlcbrh rztt noibg -zyvq lwxqu oyjv bvidmf wxuql -wzc zcw czw dnhkvrg nzslrf -cfgl uwhxu qnsfmt tgyabes mqnq nkitq hmcvxlt qqmn yzmb uomqp -lwziur hgmdmv zuvipkp vir apr gfaq zeo dunat mqgafzg -prq pqkr xlrw njf ncqni kgpoma cmtklv -jwfuc poz opz fuple -fgleub lcgnifu lkwo kftbc onvwvdx lukpod xgmh rnj -rwqvv ezjmoni llq ekd cdvv kzcci gzsj vuipv fnw -rtnua gbnzg kqtogns iozzwc kjpzz kiiurey yzlvzx cpy xrue -fexcjmw ebwssx ewbcgwd uwolou nfdhic vupiykn jss djoo xftbkgo -idf ipvmez qyevwd wfsjxja dif dig -szpbtsa bssaztp sptzasb qppgz odur cpmn wpmg -pxn zjmq rbnr azwstzm mln upaqyty nxp oge nlm -bfaryqv hag phtvh ypi -epeeog lip zqio wuehlnb bau sbd dsb -xbrrp sej agrqnpa aarpnqg bnwyi jbn -uqmsvd asmuyy czxviw pznnmvc -sddwmek wnaea iwphupk sabo -cingdks ksh mtyip zltgafm dflkcd wbdnqup uokm gmxpyd libz svv akce -qge ewv dkabkmb xcpi nrkmsu mkmb djvamg mhhrwjh -krjt etfhm bxzatw zdkvz ehov seyxbw mkiirs plzoplu sogmwb wodfcle -qwea adibdp emo homrd pjcrhlc eqaw kqsrp rphjlcc -gajzo nwjg qxjra jztcnir ijvjwez avxb afz zyywqz kcszgh elmlkfh -lbz ozia bctf bumoji anhil rta xvit -ejybire ypjl qevak fzalx mlh qxlei zib -xmzas kwojjz ntrnrw nbmxlv mdgxs xjhxg suo zdcrxl qkujisz pxmu -eezyd unrtm wyu vhufvto rpb isfcy ygh hgy -nszvbzv ebtt memrsva ebtt qwcaq bhbas pvzfbov ppjbdy nszvbzv jabvrp -rlo zbmi lugvu yeby -tfcd tvl faaq mnural nyarh xnxk ctdf bodz -vwdrhc gub bgu fpcovx rcvwhd jukwsue -aekrhi lpknnrh bett tkib ioqrap igwnst aekrhi lhha -acg mknhazp pcgjuk tajplv -masq fyjkn agq qhxbbl qga npzj fme xtihic rntisg iqv aqg -ipagh fjth mswztpi iexd cocojy vhqrla joe wrsrmw -njztu tsh auqrxca zpp -jctn webxi haq irrr qox irrr webxi -reaw axmnvd voakf lnz ftbxfh zjyxzl pryfjpv sistgb pov mshs -gsy ctsngl ptmnyx vpjx zpvtori pfu ioycdrq -aobdtlj osdnrth sgqe geqs qegs -oamrlxk ygbb rkamoxl nztl sarbmtj yqupjt plu sbtarmj vpa rxea -yvhgp yznko epwpza gqrsod rilukp cglhomj wnaplu ugvdko qdr -cggztg ajw gggzct ubmiefj kpa -rel lvasbh kobm mdnzla pwnyj ehep gzx nhjdnsg rxa -qaz gook rplqwh vsht -dhe aneq ivrn awekad ckcbt zsqca ehd rvni oulwfuu -oxgzzow wntz tkqaoi oxgzzow lwkdpgy lhd aekjasp tkqaoi dnhaw -alxghco cpanoa onjh hyeyebe whxn zfu zozbll gojn -zdqulsa dlqsazu zqudals sfedw -rydtrsv rrtvysd fvyza drdgh lsfzt blnxr cnxe tslzf iijyds ylcxn -cczea nxx kwol kopaza wuvr cyvoo whlicv -zbmrwdq tlzbevx jwzpsc uvkwpd bmss rbzblj -jogx jgi gji hypmtkg ijg oscjv -flkoqja kwmrqv wzehel fvmcfap mkwqvr ivwxg jqfwdvo hweezl -vgjg nzucho nuohcz ggvj tmxci -fqaqx zeybhtg bxeic lftuqp wzuerz sww qfltxk -keiy myrvp blkxcg lncqmsu diittlg fqrf digrel cpwrk ipan dkxb bymlzo -owm irygdz pyhj mow wmo -noul pbvvt zcv ueqyjl zhetlw lpjfhli -felvwb wdykz kyibdz haq qkouj vuav oztyqh -dyxo njcr hcuk ysrr pucw qbajztc -ooyaz pmt hqwu gjx tmp tpm pwz -lyhzajz dfot avyifo kdwka pwypcep kyyw tirlku zdpjmft -aexle hfxo dacwvcy xsiotyg cifq ibupshj aktt rzvf pgafj -pxubhw ibpm jxtxg iwnssf osbpj -exmtfyx blbfg emrunru zkuhoi lfzn zrj unmcece phuppi -icomb rmy mvsqqkh zwjubz lumq wekx -cmdgs gsr pfhqx pfhqx cmdgs pga -rpyf jejc adaiou dutv imbenyu dqw zhebjhu pryf vtxs yprf -cxj roprjn rqoh qacagru snxd -rczvi hfpl luc yowgj nvavlhw vjudkmv dwu teq -klwc cktzh ksnvswl nsgeu xyohp mhs fxnjhm fwrcg rdeadkx cim -ounvb vzqje ujctzzk iyy vxck ebtvbqr uswsmcr jveqz qejzv jmi pboq -lwffygh mqsh vnnj ufz qhms gqfuxo lurzmu -buf psdluck gapwoo wgll sbfavbc lljfvzx cdgo rpt sfvabcb -svefr kubbri fervs nboi zkvq -jwr vtc zkcpzb kczbzp cdned pzbzkc wigjuak fszgweu odflfek -vwdqm khnnj plokjg vnce venc vecn yzxtgb -tawl yrhoz tawl yrhoz -vvehsl kdhzgme rix rcs btm pxnlsps vlhesv sxpnslp yqjtool -eqpyw kpmkcyw wqhglxg ajfzo hbd qvmhy nhokah iisqvad kxuyd fxek -jsz txhwhah hxt djnvl srylveu pxp dzmmn epek tzs -joyzql jqczueb rtdyw fyc fjirfyn tjcalz joyzql fyc -pjrmiz xwnmwns kcqjuut zfgxhdr octwn kqppg zhfgxrd wmwnnxs -ema yqxqs aljjo ajloj wozb -urgmhiz epqj vhhaxdm ptlsvig qzbmm cumbho lkg gyzmg eaopyzf ncfy mqe -ijvwvo oszkees ugvyk hjdj ftip itfp -ylfw qutzdj mgqp cyjss yzsdqqi iykvs fyor sthyqp mrjtzee hgo zwqbtgk -bkfkns gco bykzc mje dwmkrwt ljegqor yxjxp oaleuu -xeltq ggyqis aud frtyxhx iwz wiz fwoxz fozxw -zdu nwduqsa nced iphaaxo -bqjj oah ezd brhgxrc pmkz kdog exw -ihatt hck iepn egemprp wrz wzcuo xjzeaa wku ivjvihh -cwkuof bmj qmxd qbtms zgdei bsqmt ssndhw eeenku lcsqy bvvodr -tek zsgytci vgoun kwwu -jcxvp ijxc buqgix uil zfoku -ggndshq bmjeo yqaxtik blspz yofh edaroy -ipvtxh ouye elln dllvx iqza nhwf zyfw pvlky -iydcx gvarm gvarm wegmiy -sfjd liiflle mulboe qywzs tzbns trojl pad mnfcrhb sltb -gthqj jvpsof jwlfyeg jwhlfj -qckv umzrge gnzc mnr xde -gvgxmhv txnait taxint ius iboqdj -vsfex kbpvsby qembkb efxvs vhflzvm eaazg dyg bbmekq -wxpfk xwfpk xwkpf cjsyi -knzg eefq feqe seppop ttxz qnqfn atgsy cch mkjlbwt uyhct -quzw jbiw miqehe qvf jyipqh kzcjxyh -teuvzf tdtwoi pcuafa cwgjk ccur lgmqv jpjdkk efrnw uloqn dpkjkj lwloeph -yaffjy xntstsv gygq sxttvsn tvnstxs -cvbmdf pfrfkna wupv van iocb hsiyke obspj ytyfkl hbsqtij hkcw -oeddmnu koso mdodeun ybe mhjbmwy ubejz soko yxvuv -nylhy ylnyh olb vcdik -gsp ilba llnu jjk urbvuma qzypf bkceotg ezxq hyvjngf -tfnegyq rue waeif tfnegyq mvqm -wvgnsk cpd oib wrdfaz kohwgkc kzzig hogkwck gkizz -fecuuyp yfq bvanvxb cjeqwf unw dccr qzh zqu voakj -utoazh bjuq kmhcre izmny mirorsy twnl jyoc -fnnpd dmr ccgu eqgewc zuqivf -kkxiba qdabuen oikaz dnuywmm -aogud adugo uzcglpj lucv dgoua mdsqa mvrg -lymhv sof hvyml mlvhy nit -chu bwxp xpbw ghaix seklnc ola zofnrwt uch -wtt abob vblijtd oabb qjws -uozrpw kgf gxidxm uehdr fta pqakkrq atf fat woaolk -gaee voshd ghlyy emvzlkg cmcgk tuwlsj jwtsul znrta mjieqph glker -qiugxas gkg cbzmoz kahs obzzcm -puz omcokz gjc heuqb -dgndhb wid wdi scwnrjf juaisgo eivaw hgdndb -mgcrd hnqg pkpeb vprxcp -atlcnzp fyp cpkivxi bzj ypf cqpt bysu -pnd jiitmzs csw mxnpck vxutdrs ivipzy cws xiegsy qut -txlk avcvbuu hnq yyriq ajyswd urgiwc -qgiqut gvblizs giqnfrk tty mvoj wpikl giqnfrk bkdpndu xztmxn hsmqxf -llthg zjslki wilj rcyfois bavz hrqxn -ytbw hlkl vip skycogy ejiirhx -ndmtg bthlbw lsoq cvlvo sqol sqlo bppl sdkbls dtpyzrq vgm -psm xpj xjp lqi spm gqirw aglpj -htg fcchvyt xffev szdu lieadft -nbjo qohgzu vofg vvild dbtyi pdolxn plnoao jxze xlpbxj brajzg -urpp jjv lihmvp ivkwdqr sesyp ypbry qok sesyp ivkwdqr was -yinepzv qvnzdtf apv ucxo bdioo juga hjfsyl hmowo avc -dmiv tplae iiuiaxx tpale pyzkc -giwhst mpexd byfyc swuzkc -yydkwp xuu vjya kav ujmcxy qrtp zvlk -lsvdyn tkw qxu omvlc wwmfvov mrgcoov dhpu tfair hupd zbx njzgwtw -zuz rsxc xsrc gdwwf nycsv zzu kcu -unlvzv jerqqgm nozma ykbflj qihqkx -pctffo begf ivrvy ezru mvqt waocq -tubtuk gxkc ikgw bjrird kxjebbh sbjyc yafkd khqajmt aclpmf gqfo yrpf -rdt vrxa fyudo myeosb ursflwk -wbjras edlbwdp ctobtw jbvtvcd xjgoo cmunxm mjtbpi klovx bypmsab unc -xckml uztr htublq vilabvr jdiwus qejxur evfw qqm -tzqq tzqq wkb wkb -dgmg ljzc dgmg mbmco cgze qsap jccvot uors iiq -rwvac woylk dmn teorprx nyuvz hcwwxlj lvej drbjo asjgq -ljen tpfl vixcivr guaf lnje waim jlen -djgaa janhi adudm yzv zkcb xqw fgvrz -kpkjoon ggzx skp rqcsw xgzg zgxg jtf ghc -rtnyxo qixfd nphekk mouzk gny fpzquw qgywx rpr gqydze -gawdlv vrivoof rte iyp gaih sfzplm -csojx wzojode uzy qulr lylmb guvtkwv -ovxj aamms ftxo ebckdqw wqvsdci jwfqxks jafrcrn yyomrot -qnu jqwr ywudxk qpsez rdc kiyfz iiecf dthxjjb bown -typ zxcvjo rip acjhl paaab qhqipg xkguye sbxy pomkvn -ofvaegv hgak oafevgv hkemar rqkha grklnsp msvkkku rekahm bxmjnw -ahoihju sdyn phi uhz lupbx -lavt jef klmq oqyfpf kis nazul ymezxek xpla fxyrfnt -nwnagwy hvpjqfg sgm ungfstr gso owqqxjh -hey hye ipyrt qxmthg jth wpbr hxgmtq cvfkfux qykdzhk movcfnl vxyoc -zsras abnrj fgaczuk ssazr xzf cnxu gns wnqqy dwjh szars -uhb zanlvh lvdotkb xekl kcofo -lhx iccy ibkjw ciykxaj imsx ehamqlz iwzapxc rhaltv -pofit owmpqej vwrobh jvox gdqehss yyxd styu tfkm fiotp -ecz mdpoqsv mdpoqsv yxx rexok hcfll yvury hdhcfu juhkvpt rspnfj hxvgdir -ohed mtigaoe eodh agmiteo -vjvv hfco cppbxtw hawsjxz ovlsq qgs risgwhg auhj -togivgg czrtvw ccz wzvtrc bse lsk -ndc ndc lrfi iyleol nchx jxpv xdcsfmp nnx wtvq pih tgc -hzpf sur zhfp klfmhx lbuidp xiqimnf -qddpdk trfxpip pnsowj hidgvnf prur rsrautp aamykfm fysqjmq xwzjane mbmtxhf oqctt -lfd eops govslp ultbye vrqai hcjkcf snpape -cbok koumkad otpozb pqcs emilpe wpcyvxd bock -spjb xkkak anuvk ejoklh nyerw bsjp zxuq vcwitnd xxtjmjg zfgq xkpf -juo pmiyoh xxk myphio ogfyf dovlmwm moevao qqxidn diff --git a/src/AdventOfCode/Year2017/Day04.hs b/src/AdventOfCode/Year2017/Day04.hs index cb3f57d..a94725f 100644 --- a/src/AdventOfCode/Year2017/Day04.hs +++ b/src/AdventOfCode/Year2017/Day04.hs @@ -1,11 +1,13 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2017.Day04 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.TH (defaultMain) import AdventOfCode.Util (count) -import Data.Function (on) -import Data.List (nub, sort) -import Text.Trifecta (char, letter, newline, sepBy, some) +import Data.List (nub) +import Relude +import Text.Trifecta (char, letter, newline, sepBy) type Passphrase = [String] @@ -13,12 +15,12 @@ main :: IO () main = $(defaultMain) getInput :: IO [Passphrase] -getInput = parseInput (some (passphrase <* newline)) $(inputFilePath) +getInput = parseInputAoC 2017 4 (some passphrase) where - passphrase = some letter `sepBy` char ' ' + passphrase = some letter `sepBy` char ' ' <* newline partOne :: [Passphrase] -> Int -partOne = count isValid +partOne = asks (count isValid) where isValid passphrase = ((==) `on` length) passphrase (nub passphrase) From 47689372ce466bca9dbbc2976503189181d03830 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 19 Nov 2025 04:24:40 -0600 Subject: [PATCH 34/91] refactor(2017.03-haskell): adopt advent-of-code-api --- VERSION | 2 +- package.yaml | 3 +- src/AdventOfCode/Year2017/Day03.hs | 86 ++++++++++++------------------ 3 files changed, 36 insertions(+), 55 deletions(-) diff --git a/VERSION b/VERSION index 60b816f..b9692c0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.56 \ No newline at end of file +2024.7.2.57 \ No newline at end of file diff --git a/package.yaml b/package.yaml index 9f42d6a..acb09fe 100644 --- a/package.yaml +++ b/package.yaml @@ -238,8 +238,7 @@ executables: <<: *executable main: AdventOfCode.Year2017.Day03 dependencies: - - containers - - extra + - infinite-list - linear aoc-2017-day04: <<: *executable diff --git a/src/AdventOfCode/Year2017/Day03.hs b/src/AdventOfCode/Year2017/Day03.hs index 2dac417..ad308f2 100644 --- a/src/AdventOfCode/Year2017/Day03.hs +++ b/src/AdventOfCode/Year2017/Day03.hs @@ -1,3 +1,6 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2017.Day03 ( main, getInput, @@ -5,64 +8,43 @@ module AdventOfCode.Year2017.Day03 ) where +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) import AdventOfCode.Util (neighborsOf) -import Control.Arrow ((&&&), (>>>)) -import Control.Lens (view) -import Data.Function (on) -import Data.List (intersect) -import Data.List.Extra (sumOn') -import Data.Map ((!)) +import Data.List.Infinite (Infinite (..), (!!), (...)) +import Data.List.Infinite qualified as Infinite import Data.Map qualified as Map -import Data.Set qualified as Set -import Linear (V2 (..), _x, _y) +import Linear (V2 (..)) +import Relude +import Text.Trifecta (integer) main :: IO () -main = - do - input <- getInput - putStr "Part One: " *> print (partOne input) - putStr "Part Two: " *> print (partTwo input) +main = $(evalPuzzle) -getInput :: IO Int -getInput = pure 265149 +getInput :: IO Word +getInput = parseInputAoC 2017 3 (fromInteger <$> integer) -partOne :: Int -> Int -partOne = manhattanDistance (pure 0) . (coords !!) . pred +partOne :: SimplePuzzle Word Int +partOne = asks (sum . abs . (spiral !!) . pred) -- https://oeis.org/A141481 -partTwo :: Int -> Int -partTwo input = go (Map.singleton (pure 0) 1) (next (pure 0)) - where - go seen here = - if nextValue > input - then nextValue - else go (Map.insert here nextValue seen) (next here) - where - nextValue = - sumOn' (seen !) $ - Map.keys seen `intersect` Set.toList (neighborsOf here) - -coords :: [V2 Int] -coords = iterate next (pure 0) - -next :: V2 Int -> V2 Int -next (V2 0 0) = V2 1 0 -next (V2 x y) = - case (compare x y, signum x, signum y) of - (GT, _, -1) -> - if 1 <= x - abs y - then V2 x (succ y) - else V2 (succ x) y - (GT, _, _) -> V2 x (succ y) - (EQ, -1, _) -> V2 (succ x) y - (EQ, _, _) -> V2 (pred x) y - (LT, -1, _) -> - if 1 <= y - abs x - then V2 (pred x) y - else V2 x (pred y) - (LT, _, _) -> V2 (pred x) y - -manhattanDistance :: V2 Int -> V2 Int -> Int -manhattanDistance = curry $ (distanceOn _x &&& distanceOn _y) >>> uncurry (+) +partTwo :: SimplePuzzle Word Word +partTwo = go (Map.singleton 0 1) (Infinite.tail spiral) where - distanceOn l = abs . uncurry (subtract `on` view l) + go seen (here :< there) = do + let nextValue = sum $ Map.restrictKeys seen (neighborsOf here) + asks (< nextValue) + >>= bool (go (Map.insert here nextValue seen) there) (pure nextValue) + +spiral :: Infinite (V2 Int) +spiral = + Infinite.scanl' (+) 0 + $ Infinite.concat + $ Infinite.zipWith replicateNE (Infinite.concatMap (replicateNE 2) (1 ...)) + $ Infinite.cycle (V2 1 0 :| [V2 0 1, V2 (-1) 0, V2 0 (-1)]) + +replicateNE :: (HasCallStack) => Int -> a -> NonEmpty a +replicateNE n x + | n > 0 = x :| replicate (n - 1) x + | otherwise = error "must be positive" From 5ac6ff40136dc35f6f8ec893042455a31e915fb2 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 19 Nov 2025 05:10:36 -0600 Subject: [PATCH 35/91] refactor(2017.02-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2017/day02.txt | 16 --------- src/AdventOfCode/Year2017/Day02.hs | 54 ++++++++++++++---------------- 3 files changed, 27 insertions(+), 45 deletions(-) delete mode 100644 input/2017/day02.txt diff --git a/VERSION b/VERSION index b9692c0..83b99b3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.57 \ No newline at end of file +2024.7.2.58 \ No newline at end of file diff --git a/input/2017/day02.txt b/input/2017/day02.txt deleted file mode 100644 index 6a233fe..0000000 --- a/input/2017/day02.txt +++ /dev/null @@ -1,16 +0,0 @@ -116 1259 1045 679 1334 157 277 1217 218 641 1089 136 247 1195 239 834 -269 1751 732 3016 260 6440 5773 4677 306 230 6928 7182 231 2942 2738 3617 -644 128 89 361 530 97 35 604 535 297 599 121 567 106 114 480 -105 408 120 363 430 102 137 283 123 258 19 101 181 477 463 279 -873 116 840 105 285 238 540 22 117 125 699 953 920 106 113 259 -3695 161 186 2188 3611 2802 157 2154 3394 145 2725 1327 3741 2493 3607 4041 -140 1401 110 119 112 1586 125 937 1469 1015 879 1798 122 1151 100 926 -2401 191 219 607 267 2362 932 2283 889 2567 2171 2409 1078 2247 2441 245 -928 1142 957 1155 922 1039 452 285 467 305 506 221 281 59 667 232 -3882 1698 170 5796 2557 173 1228 4630 174 3508 5629 4395 180 5100 2814 2247 -396 311 223 227 340 313 355 469 229 162 107 76 363 132 453 161 -627 1331 1143 1572 966 388 198 2068 201 239 176 1805 1506 1890 1980 1887 -3390 5336 1730 4072 5342 216 3823 85 5408 5774 247 5308 232 256 5214 787 -176 1694 1787 1586 3798 4243 157 4224 3603 2121 3733 851 2493 4136 148 153 -2432 4030 3397 4032 3952 2727 157 3284 3450 3229 4169 3471 4255 155 127 186 -919 615 335 816 138 97 881 790 855 89 451 789 423 108 95 116 diff --git a/src/AdventOfCode/Year2017/Day02.hs b/src/AdventOfCode/Year2017/Day02.hs index 2a0749b..64267e0 100644 --- a/src/AdventOfCode/Year2017/Day02.hs +++ b/src/AdventOfCode/Year2017/Day02.hs @@ -1,38 +1,36 @@ +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2017.Day02 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (inputFilePath) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) import AdventOfCode.Util (holes) -import Control.Arrow ((&&&)) -import Data.Maybe (catMaybes, listToMaybe, mapMaybe) -import Text.Trifecta (digit, newline, sepBy, some, tab) +import Data.List.Extra (maximum, minimum, sumOn') +import Relude +import Text.Trifecta (decimal, newline, sepBy1, sepEndBy1, tab) main :: IO () -main = - do - input <- getInput - putStr "Part One: " *> print (partOne input) - putStr "Part Two: " *> print (partTwo input) +main = $(evalPuzzle) getInput :: IO [[Int]] -getInput = parseInput (some (row <* newline)) $(inputFilePath) +getInput = parseInputAoC 2017 2 (row `sepEndBy1` newline) where - row = int `sepBy` tab - int = read <$> some digit + row = int `sepBy1` tab + int = fromInteger <$> decimal -partOne :: [[Int]] -> Int -partOne = sum . map (uncurry (-) . (maximum &&& minimum)) +partOne :: SimplePuzzle [[Int]] Int +partOne = asks (sumOn' (uncurry (-) . (maximum &&& minimum))) -partTwo :: [[Int]] -> Int -partTwo = sum . mapMaybe handleRow - where - handleRow :: [Int] -> Maybe Int - handleRow xs = - listToMaybe . catMaybes $ - do - (x, ys) <- holes xs - y <- ys - case (quotRem x y, quotRem y x) of - ((q, 0), _) -> pure $ Just q - (_, (q, 0)) -> pure $ Just q - _ -> pure Nothing +partTwo :: SimplePuzzle [[Int]] Int +partTwo = + asks $ sum . mapMaybe \row -> + listToMaybe do + (x, ys) <- holes row + y <- ys + if + | (q, 0) <- quotRem x y -> pure q + | (q, 0) <- quotRem y x -> pure q + | otherwise -> mzero From a3554c5e7717a5e755fc99e33c05c9588f3ee64e Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 19 Nov 2025 05:19:55 -0600 Subject: [PATCH 36/91] refactor(2017.01-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2017/day01.txt | 1 - src/AdventOfCode/Year2017/Day01.hs | 27 +++++++++++++-------------- 3 files changed, 14 insertions(+), 16 deletions(-) delete mode 100644 input/2017/day01.txt diff --git a/VERSION b/VERSION index 83b99b3..9a09ebd 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.58 \ No newline at end of file +2024.7.2.59 \ No newline at end of file diff --git a/input/2017/day01.txt b/input/2017/day01.txt deleted file mode 100644 index 68c731b..0000000 --- a/input/2017/day01.txt +++ /dev/null @@ -1 +0,0 @@ -428122498997587283996116951397957933569136949848379417125362532269869461185743113733992331379856446362482129646556286611543756564275715359874924898113424472782974789464348626278532936228881786273586278886575828239366794429223317476722337424399239986153675275924113322561873814364451339186918813451685263192891627186769818128715595715444565444581514677521874935942913547121751851631373316122491471564697731298951989511917272684335463436218283261962158671266625299188764589814518793576375629163896349665312991285776595142146261792244475721782941364787968924537841698538288459355159783985638187254653851864874544584878999193242641611859756728634623853475638478923744471563845635468173824196684361934269459459124269196811512927442662761563824323621758785866391424778683599179447845595931928589255935953295111937431266815352781399967295389339626178664148415561175386725992469782888757942558362117938629369129439717427474416851628121191639355646394276451847131182652486561415942815818785884559193483878139351841633366398788657844396925423217662517356486193821341454889283266691224778723833397914224396722559593959125317175899594685524852419495793389481831354787287452367145661829287518771631939314683137722493531318181315216342994141683484111969476952946378314883421677952397588613562958741328987734565492378977396431481215983656814486518865642645612413945129485464979535991675776338786758997128124651311153182816188924935186361813797251997643992686294724699281969473142721116432968216434977684138184481963845141486793996476793954226225885432422654394439882842163295458549755137247614338991879966665925466545111899714943716571113326479432925939227996799951279485722836754457737668191845914566732285928453781818792236447816127492445993945894435692799839217467253986218213131249786833333936332257795191937942688668182629489191693154184177398186462481316834678733713614889439352976144726162214648922159719979143735815478633912633185334529484779322818611438194522292278787653763328944421516569181178517915745625295158611636365253948455727653672922299582352766484 diff --git a/src/AdventOfCode/Year2017/Day01.hs b/src/AdventOfCode/Year2017/Day01.hs index 4a26917..0c11e21 100644 --- a/src/AdventOfCode/Year2017/Day01.hs +++ b/src/AdventOfCode/Year2017/Day01.hs @@ -1,3 +1,5 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2017.Day01 ( main, getInput, @@ -7,32 +9,29 @@ module AdventOfCode.Year2017.Day01 ) where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (inputFilePath) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.SimplePuzzle +import AdventOfCode.TH (evalPuzzle) import Data.Char (digitToInt) -import Data.Monoid (Sum (..)) import Data.Vector (Vector) import Data.Vector qualified as V -import Text.Trifecta (Parser, digit, some) +import Relude +import Text.Trifecta (Parser, digit) main :: IO () -main = - do - input <- getInput - putStr "Part One: " *> print (partOne input) - putStr "Part Two: " *> print (partTwo input) +main = $(evalPuzzle) getInput :: IO (Vector (Sum Int)) -getInput = parseInput digits $(inputFilePath) +getInput = parseInputAoC 2017 1 digits digits :: Parser (Vector (Sum Int)) digits = V.fromList <$> some (Sum . digitToInt <$> digit) -partOne :: Vector (Sum Int) -> Int -partOne = day01 1 +partOne :: SimplePuzzle (Vector (Sum Int)) Int +partOne = asks (day01 1) -partTwo :: Vector (Sum Int) -> Int -partTwo = day01 =<< (`div` 2) . V.length +partTwo :: SimplePuzzle (Vector (Sum Int)) Int +partTwo = asks (day01 =<< (`div` 2) . V.length) day01 :: (Eq a, Num a) => Int -> Vector (Sum a) -> a day01 k v = getSum $ V.ifoldl' go mempty v From 8579422f7506af756f16c12103406b14cd84e32c Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 20 Nov 2025 03:07:15 -0600 Subject: [PATCH 37/91] refactor(haskell): mess around with types --- VERSION | 2 +- package.yaml | 4 ++- src/AdventOfCode/Puzzle.hs | 26 +++++++++++++++-- src/AdventOfCode/SimplePuzzle.hs | 25 ---------------- src/AdventOfCode/TH.hs | 12 +++----- src/AdventOfCode/Year2015/Day01.hs | 6 ++-- src/AdventOfCode/Year2015/Day02.hs | 6 ++-- src/AdventOfCode/Year2016/Day14.hs | 24 ++++++++++------ src/AdventOfCode/Year2017/Day01.hs | 6 ++-- src/AdventOfCode/Year2017/Day02.hs | 6 ++-- src/AdventOfCode/Year2017/Day03.hs | 6 ++-- src/AdventOfCode/Year2017/Day05.hs | 6 ++-- src/AdventOfCode/Year2017/Day06.hs | 6 ++-- src/AdventOfCode/Year2017/Day07.hs | 6 ++-- src/AdventOfCode/Year2017/Day08.hs | 4 +-- src/AdventOfCode/Year2018/Day01.hs | 6 ++-- src/AdventOfCode/Year2018/Day02.hs | 10 +++---- src/AdventOfCode/Year2018/Day03.hs | 16 ++++------- src/AdventOfCode/Year2018/Day04.hs | 6 ++-- src/AdventOfCode/Year2018/Day05.hs | 6 ++-- src/AdventOfCode/Year2020/Day09.hs | 46 ++++++++++++++---------------- src/AdventOfCode/Year2022/Day01.hs | 6 ++-- src/AdventOfCode/Year2022/Day02.hs | 6 ++-- src/AdventOfCode/Year2022/Day03.hs | 6 ++-- src/AdventOfCode/Year2022/Day04.hs | 6 ++-- src/AdventOfCode/Year2022/Day05.hs | 6 ++-- src/AdventOfCode/Year2022/Day06.hs | 6 ++-- src/AdventOfCode/Year2023/Day01.hs | 6 ++-- src/AdventOfCode/Year2023/Day02.hs | 6 ++-- src/AdventOfCode/Year2023/Day03.hs | 8 +++--- src/AdventOfCode/Year2023/Day04.hs | 10 +++---- src/AdventOfCode/Year2023/Day05.hs | 6 ++-- src/AdventOfCode/Year2023/Day06.hs | 6 ++-- src/AdventOfCode/Year2024/Day01.hs | 20 ++++--------- src/AdventOfCode/Year2024/Day02.hs | 20 ++++--------- src/AdventOfCode/Year2024/Day03.hs | 20 ++++--------- src/AdventOfCode/Year2024/Day04.hs | 20 ++++--------- src/AdventOfCode/Year2024/Day05.hs | 20 ++++--------- src/AdventOfCode/Year2024/Day06.hs | 19 +++--------- src/AdventOfCode/Year2024/Day07.hs | 20 ++++--------- 40 files changed, 186 insertions(+), 266 deletions(-) delete mode 100644 src/AdventOfCode/SimplePuzzle.hs diff --git a/VERSION b/VERSION index 9a09ebd..9d024b1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.59 \ No newline at end of file +2024.7.2.60 \ No newline at end of file diff --git a/package.yaml b/package.yaml index acb09fe..e4dba3f 100644 --- a/package.yaml +++ b/package.yaml @@ -20,6 +20,7 @@ dependencies: - containers - extra - foldl + - generic-data - lens - monad-logger - parsers @@ -84,7 +85,6 @@ _executable: &executable other-modules: - AdventOfCode.Input - AdventOfCode.Puzzle - - AdventOfCode.SimplePuzzle - AdventOfCode.TH - AdventOfCode.Util - Paths_advent_of_code @@ -262,6 +262,8 @@ executables: aoc-2017-day08: <<: *executable main: AdventOfCode.Year2017.Day08 + dependencies: + - parser-combinators aoc-2018-day01: <<: *executable main: AdventOfCode.Year2018.Day01 diff --git a/src/AdventOfCode/Puzzle.hs b/src/AdventOfCode/Puzzle.hs index 225737a..15f43ed 100644 --- a/src/AdventOfCode/Puzzle.hs +++ b/src/AdventOfCode/Puzzle.hs @@ -1,8 +1,11 @@ +{-# LANGUAGE DerivingVia #-} {-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Puzzle where +import Control.Lens (makeLenses) import Control.Monad.Logger (LoggingT, MonadLogger, runStderrLoggingT) +import Generic.Data (GenericProduct (..)) import Relude newtype Puzzle r s a = Puzzle @@ -18,10 +21,29 @@ newtype Puzzle r s a = Puzzle MonadFail ) -evalPart :: (MonadIO m) => r -> s -> Puzzle r s a -> m a -evalPart input initialState = +type SimplePuzzle r a = Puzzle r () a + +data GPuzzleState a b + = GPuzzleState + { _answerOne :: !a, + _answerTwo :: !b + } + deriving (Eq, Generic, Show) + deriving + (Semigroup, Monoid) + via (GenericProduct (GPuzzleState (Sum a) (Sum b))) + +makeLenses ''GPuzzleState + +type GPuzzleState1 a = GPuzzleState a a + +evalPuzzle :: (MonadIO m) => r -> s -> Puzzle r s a -> m a +evalPuzzle input initialState = liftIO . runStderrLoggingT . evaluatingStateT initialState . usingReaderT input . runPuzzle + +evaluatingPuzzle :: (MonadIO m, Monoid s) => Puzzle r s a -> r -> m a +evaluatingPuzzle puzzle input = evalPuzzle input mempty puzzle diff --git a/src/AdventOfCode/SimplePuzzle.hs b/src/AdventOfCode/SimplePuzzle.hs deleted file mode 100644 index 0bf91c2..0000000 --- a/src/AdventOfCode/SimplePuzzle.hs +++ /dev/null @@ -1,25 +0,0 @@ -{-# LANGUAGE NoImplicitPrelude #-} - -module AdventOfCode.SimplePuzzle - ( runPuzzle, - SimplePuzzle, - emptyPuzzleState, - evalPart, - ) -where - -import AdventOfCode.Puzzle (Puzzle (..)) -import Control.Monad.Logger (runStderrLoggingT) -import Relude - -type SimplePuzzle r a = Puzzle r () a - -emptyPuzzleState :: () -emptyPuzzleState = () - -evalPart :: r -> SimplePuzzle r a -> IO a -evalPart input = - runStderrLoggingT - . evaluatingStateT emptyPuzzleState - . usingReaderT input - . runPuzzle diff --git a/src/AdventOfCode/TH.hs b/src/AdventOfCode/TH.hs index dd8b00d..6f12eea 100644 --- a/src/AdventOfCode/TH.hs +++ b/src/AdventOfCode/TH.hs @@ -2,8 +2,7 @@ module AdventOfCode.TH where -import AdventOfCode.Puzzle (runPuzzle) -import Control.Monad.Logger qualified as Logger +import AdventOfCode.Puzzle (evalPuzzle) import Data.List.Split (splitOn) import Language.Haskell.TH import Relude @@ -55,15 +54,12 @@ doPartOne = [|putStr "Part One: " *> print (partOne input)|] doPartTwo :: Q Exp doPartTwo = [|putStr "Part Two: " *> print (partTwo input)|] -evalPuzzle :: Q Exp -evalPuzzle = +defaultMainPuzzle :: Q Exp +defaultMainPuzzle = [| do input <- getInput - $(varE 'Logger.runStderrLoggingT) - $ evaluatingStateT emptyPuzzleState - $ usingReaderT input - $ $(varE 'AdventOfCode.Puzzle.runPuzzle) + $(varE 'AdventOfCode.Puzzle.evalPuzzle) input mempty $ do putStr "Part One: " print =<< partOne diff --git a/src/AdventOfCode/Year2015/Day01.hs b/src/AdventOfCode/Year2015/Day01.hs index bac440b..ff6a9d0 100644 --- a/src/AdventOfCode/Year2015/Day01.hs +++ b/src/AdventOfCode/Year2015/Day01.hs @@ -3,14 +3,14 @@ module AdventOfCode.Year2015.Day01 where import AdventOfCode.Input (parseInputAoC) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import Data.List (elemIndex) import Relude import Text.Trifecta (char) main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) partOne :: SimplePuzzle [Int] Int partOne = asks sum diff --git a/src/AdventOfCode/Year2015/Day02.hs b/src/AdventOfCode/Year2015/Day02.hs index 25c9354..4915362 100644 --- a/src/AdventOfCode/Year2015/Day02.hs +++ b/src/AdventOfCode/Year2015/Day02.hs @@ -11,8 +11,8 @@ module AdventOfCode.Year2015.Day02 where import AdventOfCode.Input (parseInputAoC) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import Control.Foldl qualified as Foldl import Control.Lens (view) import Control.Monad (ap) @@ -21,7 +21,7 @@ import Relude import Text.Trifecta (char, natural) main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) partOne :: SimplePuzzle [V3 Integer] (Maybe Integer) partOne = asks (fmap getSum . foldMap paperNeededFor) diff --git a/src/AdventOfCode/Year2016/Day14.hs b/src/AdventOfCode/Year2016/Day14.hs index e339696..efc7d0e 100644 --- a/src/AdventOfCode/Year2016/Day14.hs +++ b/src/AdventOfCode/Year2016/Day14.hs @@ -1,11 +1,13 @@ {-# LANGUAGE BlockArguments #-} +{-# LANGUAGE DerivingVia #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2016.Day14 where +import AdventOfCode.Input (parseInputAoC) import AdventOfCode.Puzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.TH (defaultMainPuzzle) import Control.Lens (makeLenses, use, uses, (%=)) import Control.Monad.Extra (notM) import Control.Monad.Logger (logDebug) @@ -17,26 +19,30 @@ import Data.ByteString.Builder qualified as Builder import Data.ByteString.Lazy qualified as BSL import Data.IntMap ((!)) import Data.IntMap qualified as IntMap +import Generic.Data (GenericProduct (..)) import Relude import Relude.Unsafe ((!!)) import Text.Printf (printf) +import Text.Trifecta (letter) -data PuzzleState = PuzzleState - { _index :: !Int, +data PuzzleState' a = PuzzleState + { _index :: !a, _digests :: !(IntMap ByteString) } - deriving (Generic, Show) + deriving (Eq, Generic, Show) + deriving + (Semigroup, Monoid) + via (GenericProduct (PuzzleState' (Sum a))) -makeLenses ''PuzzleState +makeLenses ''PuzzleState' -emptyPuzzleState :: PuzzleState -emptyPuzzleState = PuzzleState 0 IntMap.empty +type PuzzleState = PuzzleState' Int main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) getInput :: IO Builder -getInput = pure "yjdafjpo" +getInput = parseInputAoC 2016 14 (fromString <$> some letter) partOne :: Puzzle Builder PuzzleState Int partOne = partOne' 64 diff --git a/src/AdventOfCode/Year2017/Day01.hs b/src/AdventOfCode/Year2017/Day01.hs index 0c11e21..8ce4d2b 100644 --- a/src/AdventOfCode/Year2017/Day01.hs +++ b/src/AdventOfCode/Year2017/Day01.hs @@ -10,8 +10,8 @@ module AdventOfCode.Year2017.Day01 where import AdventOfCode.Input (parseInputAoC) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import Data.Char (digitToInt) import Data.Vector (Vector) import Data.Vector qualified as V @@ -19,7 +19,7 @@ import Relude import Text.Trifecta (Parser, digit) main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) getInput :: IO (Vector (Sum Int)) getInput = parseInputAoC 2017 1 digits diff --git a/src/AdventOfCode/Year2017/Day02.hs b/src/AdventOfCode/Year2017/Day02.hs index 64267e0..754e7a5 100644 --- a/src/AdventOfCode/Year2017/Day02.hs +++ b/src/AdventOfCode/Year2017/Day02.hs @@ -5,15 +5,15 @@ module AdventOfCode.Year2017.Day02 where import AdventOfCode.Input (parseInputAoC) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (holes) import Data.List.Extra (maximum, minimum, sumOn') import Relude import Text.Trifecta (decimal, newline, sepBy1, sepEndBy1, tab) main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) getInput :: IO [[Int]] getInput = parseInputAoC 2017 2 (row `sepEndBy1` newline) diff --git a/src/AdventOfCode/Year2017/Day03.hs b/src/AdventOfCode/Year2017/Day03.hs index ad308f2..e3856d5 100644 --- a/src/AdventOfCode/Year2017/Day03.hs +++ b/src/AdventOfCode/Year2017/Day03.hs @@ -9,8 +9,8 @@ module AdventOfCode.Year2017.Day03 where import AdventOfCode.Input (parseInputAoC) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (neighborsOf) import Data.List.Infinite (Infinite (..), (!!), (...)) import Data.List.Infinite qualified as Infinite @@ -20,7 +20,7 @@ import Relude import Text.Trifecta (integer) main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) getInput :: IO Word getInput = parseInputAoC 2017 3 (fromInteger <$> integer) diff --git a/src/AdventOfCode/Year2017/Day05.hs b/src/AdventOfCode/Year2017/Day05.hs index 4cf7fb7..1301790 100644 --- a/src/AdventOfCode/Year2017/Day05.hs +++ b/src/AdventOfCode/Year2017/Day05.hs @@ -3,8 +3,8 @@ module AdventOfCode.Year2017.Day05 where import AdventOfCode.Input (parseInputAoC) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (iterateMaybe) import Control.Lens (over, views) import Control.Monad (ap) @@ -15,7 +15,7 @@ import Text.Trifecta (integer) type CPU = Top :>> [Int] :>> Int main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) getExample :: IO [Int] getExample = pure [0, 3, 0, 1, -3] diff --git a/src/AdventOfCode/Year2017/Day06.hs b/src/AdventOfCode/Year2017/Day06.hs index 2372a06..b9faadc 100644 --- a/src/AdventOfCode/Year2017/Day06.hs +++ b/src/AdventOfCode/Year2017/Day06.hs @@ -3,8 +3,8 @@ module AdventOfCode.Year2017.Day06 where import AdventOfCode.Input (parseInputAoC) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (maybeFail) import Data.IntMap.Strict qualified as IntMap import Data.List (elemIndex) @@ -14,7 +14,7 @@ import Relude import Text.Trifecta (natural) main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) partOne :: SimplePuzzle (IntMap Int) Int partOne = asks (Set.size . fst . reallocate) diff --git a/src/AdventOfCode/Year2017/Day07.hs b/src/AdventOfCode/Year2017/Day07.hs index 2782cc7..1283673 100644 --- a/src/AdventOfCode/Year2017/Day07.hs +++ b/src/AdventOfCode/Year2017/Day07.hs @@ -10,8 +10,8 @@ module AdventOfCode.Year2017.Day07 where import AdventOfCode.Input (parseInputAoC, parseString) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (iterateMaybe, maybeFail, (<.>)) import Control.Foldl qualified as Foldl import Control.Monad (liftM2) @@ -42,7 +42,7 @@ type ProgramName = Text type ProgramNode = (Weight, ProgramName, [ProgramName]) main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) getInput :: IO GraphTuple getInput = parseInputAoC 2017 7 parseGraph diff --git a/src/AdventOfCode/Year2017/Day08.hs b/src/AdventOfCode/Year2017/Day08.hs index 56284bf..7ae5d1f 100644 --- a/src/AdventOfCode/Year2017/Day08.hs +++ b/src/AdventOfCode/Year2017/Day08.hs @@ -4,7 +4,7 @@ module AdventOfCode.Year2017.Day08 where import AdventOfCode.Input (parseInputAoC, parseString) import AdventOfCode.Puzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.TH (defaultMainPuzzle) import Control.Applicative.Combinators.NonEmpty qualified as NE import Data.Foldable (maximum) import Data.Map.Strict qualified as Map @@ -74,7 +74,7 @@ evalInstruction (Ins change cond) = >>= flip when (evalModification change) main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) emptyPuzzleState :: Map String Int emptyPuzzleState = Map.empty diff --git a/src/AdventOfCode/Year2018/Day01.hs b/src/AdventOfCode/Year2018/Day01.hs index 2effb11..38d306f 100644 --- a/src/AdventOfCode/Year2018/Day01.hs +++ b/src/AdventOfCode/Year2018/Day01.hs @@ -4,8 +4,8 @@ module AdventOfCode.Year2018.Day01 where import AdventOfCode.Input (parseInputAoC) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (findFirstDup, maybeFail, scan) import Relude import Text.Trifecta (integer) @@ -19,7 +19,7 @@ newtype FrequencyChange = FrequencyChange via (Sum Integer) main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) getInput :: IO [FrequencyChange] getInput = parseInputAoC 2018 1 (some (FrequencyChange <$> integer)) diff --git a/src/AdventOfCode/Year2018/Day02.hs b/src/AdventOfCode/Year2018/Day02.hs index ef0080c..9c4745b 100644 --- a/src/AdventOfCode/Year2018/Day02.hs +++ b/src/AdventOfCode/Year2018/Day02.hs @@ -4,8 +4,8 @@ module AdventOfCode.Year2018.Day02 where import AdventOfCode.Input (parseInputAoC, parseString) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (count, frequencies, hammingSimilar, maybeFail) import Data.List (intersect) import Relude @@ -16,7 +16,7 @@ type BoxID = String type Checksum = Integer main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) getInput :: IO [BoxID] getInput = parseInputAoC 2018 2 (some letter `sepEndBy` newline) @@ -25,13 +25,13 @@ partOne :: SimplePuzzle [BoxID] Checksum partOne = asks checksum partOneExample :: IO Checksum -partOneExample = flip evalPart partOne =<< getExampleOne +partOneExample = evaluatingPuzzle partOne =<< getExampleOne partTwo :: SimplePuzzle [BoxID] String partTwo = ask >>= maybeFail "ope!" . fmap (uncurry intersect) . correctBoxIDs partTwoExample :: IO String -partTwoExample = flip evalPart partTwo =<< getExampleTwo +partTwoExample = evaluatingPuzzle partTwo =<< getExampleTwo checksum :: [BoxID] -> Checksum checksum = diff --git a/src/AdventOfCode/Year2018/Day03.hs b/src/AdventOfCode/Year2018/Day03.hs index fadad73..8e12953 100644 --- a/src/AdventOfCode/Year2018/Day03.hs +++ b/src/AdventOfCode/Year2018/Day03.hs @@ -5,7 +5,7 @@ module AdventOfCode.Year2018.Day03 where import AdventOfCode.Input (parseInputAoC, parseString) import AdventOfCode.Puzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (Frequencies, frequencies, maybeFail) import Control.Monad.Extra (findM) import Data.Ix (range) @@ -50,16 +50,10 @@ squaresCovered (Claim _ origin size) = range (origin, origin + size - 1) -- ------------------------------------------------------------------- [ Parts ] -emptyPuzzleState :: Frequencies (V2 Integer) -emptyPuzzleState = Map.empty - partOne :: Puzzle [Claim] (Frequencies (V2 Integer)) Int -partOne = - asks - $ Map.size - . Map.filter (>= 2) - . frequencies - . concatMap squaresCovered +partOne = do + put =<< asks (frequencies . concatMap squaresCovered) + gets (Map.size . Map.filter (>= 2)) partTwo :: Puzzle [Claim] (Frequencies (V2 Integer)) Integer partTwo = do @@ -73,7 +67,7 @@ getInput :: IO [Claim] getInput = parseInputAoC 2018 3 (many parseClaim) main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) getExample :: IO [Claim] getExample = parseString (many parseClaim) example diff --git a/src/AdventOfCode/Year2018/Day04.hs b/src/AdventOfCode/Year2018/Day04.hs index d6f675e..2371778 100644 --- a/src/AdventOfCode/Year2018/Day04.hs +++ b/src/AdventOfCode/Year2018/Day04.hs @@ -9,8 +9,8 @@ module AdventOfCode.Year2018.Day04 where import AdventOfCode.Input (parseInputAoC) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (frequencies) import Data.List.Extra (maximumOn) import Data.Map.Strict qualified as Map @@ -135,4 +135,4 @@ getInput :: IO [Entry] getInput = parseInputAoC 2018 4 (many entry) main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) diff --git a/src/AdventOfCode/Year2018/Day05.hs b/src/AdventOfCode/Year2018/Day05.hs index bebbc09..3a7ce70 100644 --- a/src/AdventOfCode/Year2018/Day05.hs +++ b/src/AdventOfCode/Year2018/Day05.hs @@ -4,8 +4,8 @@ module AdventOfCode.Year2018.Day05 where import AdventOfCode.Input (rawInputAoC) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import Data.Algebra.Free (foldMapFree, returnFree) import Data.Char (isLower, isUpper, toLower) import Data.Finite (Finite, finite, finites) @@ -23,7 +23,7 @@ type Unit = Finite 26 type Polymer = FreeGroupL Unit main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) -- | Solve Part One. partOne :: SimplePuzzle String Int diff --git a/src/AdventOfCode/Year2020/Day09.hs b/src/AdventOfCode/Year2020/Day09.hs index 3c2fd7d..9bef4a5 100644 --- a/src/AdventOfCode/Year2020/Day09.hs +++ b/src/AdventOfCode/Year2020/Day09.hs @@ -10,36 +10,31 @@ where import AdventOfCode.Input (parseInput) import AdventOfCode.Puzzle -import AdventOfCode.TH (evalPuzzle, inputFilePath) +import AdventOfCode.TH (defaultMainPuzzle, inputFilePath) +import AdventOfCode.Util (maybeFail) import Control.Foldl qualified as Foldl -import Control.Lens (makeLenses, use, (<.=)) +import Control.Lens (use, (<.=)) import Data.Bifoldable (bisum) import Relude import Text.Trifecta (natural) -data PuzzleState - = PuzzleState - { _answerOne :: !(Maybe Int), - _answerTwo :: !(Maybe Int) - } - deriving (Eq, Generic, Show) - -makeLenses ''PuzzleState - -emptyPuzzleState :: PuzzleState -emptyPuzzleState = PuzzleState Nothing Nothing +type PuzzleState = GPuzzleState1 Int main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) getInput :: IO [Int] getInput = parseInput (some (fromInteger <$> natural)) $(inputFilePath) -partOne :: Puzzle [Int] PuzzleState (Maybe Int) +partOne :: Puzzle [Int] PuzzleState Int partOne = do numbers <- ask - answerOne - <.= (listToMaybe . snd =<< find (null . go) (splitAt 25 <$> tails numbers)) + answer <- + maybeFail "ope!" + $ listToMaybe + . snd + =<< find (null . go) (splitAt 25 <$> tails numbers) + answerOne <.= answer where go (preamble, z : _) = [ (z, x, y) @@ -52,13 +47,14 @@ partOne = do ] go _ = [] -partTwo :: Puzzle [Int] PuzzleState (Maybe Int) +partTwo :: Puzzle [Int] PuzzleState Int partTwo = do - Just n <- use answerOne + n <- use answerOne numbers <- ask - answerTwo - <.= ( fmap bisum - . bisequence - . Foldl.fold ((,) <$> Foldl.minimum <*> Foldl.maximum) - =<< find ((n ==) . sum) (concatMap inits (tails numbers)) - ) + answer <- + maybeFail "ope!" + $ fmap bisum + . bisequence + . Foldl.fold ((,) <$> Foldl.minimum <*> Foldl.maximum) + =<< find ((n ==) . sum) (concatMap inits (tails numbers)) + answerTwo <.= answer diff --git a/src/AdventOfCode/Year2022/Day01.hs b/src/AdventOfCode/Year2022/Day01.hs index 15f7ab1..0655edb 100644 --- a/src/AdventOfCode/Year2022/Day01.hs +++ b/src/AdventOfCode/Year2022/Day01.hs @@ -3,8 +3,8 @@ module AdventOfCode.Year2022.Day01 where import AdventOfCode.Input (parseInputAoC) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import Control.Monad.Combinators.NonEmpty (sepBy1) import Data.Foldable1 (maximum) import Data.List.NonEmpty qualified as NE @@ -12,7 +12,7 @@ import Relude import Text.Trifecta (Parser, decimal, newline) main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) getInput :: IO (NonEmpty Integer) getInput = parseInputAoC 2022 1 inventory diff --git a/src/AdventOfCode/Year2022/Day02.hs b/src/AdventOfCode/Year2022/Day02.hs index 1f44323..5ddd520 100644 --- a/src/AdventOfCode/Year2022/Day02.hs +++ b/src/AdventOfCode/Year2022/Day02.hs @@ -4,8 +4,8 @@ module AdventOfCode.Year2022.Day02 where import AdventOfCode.Input (parseInputAoC) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import Data.Finite (Finite, getFinite) import Relude import Text.Trifecta (Parser, char, choice, newline, sepEndBy, space) @@ -13,7 +13,7 @@ import Text.Trifecta (Parser, char, choice, newline, sepEndBy, space) type Z3 = Finite 3 main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) getInput :: IO [(Z3, Z3)] getInput = parseInputAoC 2022 2 strategyGuide diff --git a/src/AdventOfCode/Year2022/Day03.hs b/src/AdventOfCode/Year2022/Day03.hs index 62699b4..6fc7a8d 100644 --- a/src/AdventOfCode/Year2022/Day03.hs +++ b/src/AdventOfCode/Year2022/Day03.hs @@ -3,15 +3,15 @@ module AdventOfCode.Year2022.Day03 where import AdventOfCode.Input (parseInputAoC, parseString) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import Data.List (foldl1, intersect) import Data.List.Split (chunksOf) import Relude import Text.Trifecta (Parser, lower, newline, sepEndBy, upper) main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) partOne :: SimplePuzzle [[Int]] Int partOne = asks $ day03 (uncurry intersect . halve) diff --git a/src/AdventOfCode/Year2022/Day04.hs b/src/AdventOfCode/Year2022/Day04.hs index a103b4f..0dd5791 100644 --- a/src/AdventOfCode/Year2022/Day04.hs +++ b/src/AdventOfCode/Year2022/Day04.hs @@ -3,14 +3,14 @@ module AdventOfCode.Year2022.Day04 where import AdventOfCode.Input (parseInputAoC, parseString) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import Data.Ix (inRange) import Relude import Text.Trifecta (Parser, char, comma, decimal, newline, sepEndBy) main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) partOne :: SimplePuzzle [((Integer, Integer), (Integer, Integer))] Int partOne = asks (solveWith fullyContains) diff --git a/src/AdventOfCode/Year2022/Day05.hs b/src/AdventOfCode/Year2022/Day05.hs index 3f1d222..fdb460c 100644 --- a/src/AdventOfCode/Year2022/Day05.hs +++ b/src/AdventOfCode/Year2022/Day05.hs @@ -3,8 +3,8 @@ module AdventOfCode.Year2022.Day05 where import AdventOfCode.Input (parseInputAoC, parseString) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import Data.IntMap ((!)) import Data.IntMap qualified as IM import Relude @@ -23,7 +23,7 @@ import Text.Trifecta ) main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) partOne :: SimplePuzzle (IntMap [Char], [(Int, (Int, Int))]) String partOne = asks (solveWith reverse) diff --git a/src/AdventOfCode/Year2022/Day06.hs b/src/AdventOfCode/Year2022/Day06.hs index a28f542..6b678ed 100644 --- a/src/AdventOfCode/Year2022/Day06.hs +++ b/src/AdventOfCode/Year2022/Day06.hs @@ -3,15 +3,15 @@ module AdventOfCode.Year2022.Day06 where import AdventOfCode.Input (rawInputAoC) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (maybeFail) import Data.List (findIndex) import Data.Set qualified as Set import Relude main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) partOne :: SimplePuzzle String Int partOne = ask >>= maybeFail "no start-of-packet marker detected" . day06 4 diff --git a/src/AdventOfCode/Year2023/Day01.hs b/src/AdventOfCode/Year2023/Day01.hs index ff458d3..f6521b4 100644 --- a/src/AdventOfCode/Year2023/Day01.hs +++ b/src/AdventOfCode/Year2023/Day01.hs @@ -11,8 +11,8 @@ module AdventOfCode.Year2023.Day01 where import AdventOfCode.Input (parseString, rawInputAoC) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import Data.Char (digitToInt) import Data.List.NonEmpty qualified as NE import Relude @@ -21,7 +21,7 @@ import Text.Trifecta hiding (digit, parseString) import Text.Trifecta qualified as Trifecta main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) getInput :: IO String getInput = rawInputAoC 2023 1 diff --git a/src/AdventOfCode/Year2023/Day02.hs b/src/AdventOfCode/Year2023/Day02.hs index 7038ed3..f57e1eb 100644 --- a/src/AdventOfCode/Year2023/Day02.hs +++ b/src/AdventOfCode/Year2023/Day02.hs @@ -11,8 +11,8 @@ module AdventOfCode.Year2023.Day02 where import AdventOfCode.Input (parseInputAoC) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import Data.List.Extra (sumOn') import Data.Traversable (for) import Linear (V3 (..)) @@ -27,7 +27,7 @@ data Game deriving (Eq, Generic, Show) main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) partOne :: SimplePuzzle [Game] Integer partOne = asks (sumOn' idNumber . filter (isPossible . revelations)) diff --git a/src/AdventOfCode/Year2023/Day03.hs b/src/AdventOfCode/Year2023/Day03.hs index 56baf78..fa4dc65 100644 --- a/src/AdventOfCode/Year2023/Day03.hs +++ b/src/AdventOfCode/Year2023/Day03.hs @@ -4,8 +4,8 @@ module AdventOfCode.Year2023.Day03 where import AdventOfCode.Input (parseInputAoC, parseString) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (neighborsOf) import Control.Lens (ifoldl') import Data.Char (digitToInt) @@ -47,7 +47,7 @@ withNumber f = \case type Schematic = HashMap (V2 Int) Datum main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) partOne :: SimplePuzzle Schematic Int partOne = do @@ -74,7 +74,7 @@ allNeighborsOf (V2 x y) n = points = flip V2 y <$> [x .. x + length (show @String n) - 1] partOneExample :: IO Int -partOneExample = flip evalPart partOne =<< getExample +partOneExample = evaluatingPuzzle partOne =<< getExample partTwo :: SimplePuzzle Schematic Int partTwo = fail "Not yet implemented" diff --git a/src/AdventOfCode/Year2023/Day04.hs b/src/AdventOfCode/Year2023/Day04.hs index d0e6de1..c654a4c 100644 --- a/src/AdventOfCode/Year2023/Day04.hs +++ b/src/AdventOfCode/Year2023/Day04.hs @@ -5,8 +5,8 @@ module AdventOfCode.Year2023.Day04 where import AdventOfCode.Input (parseInputAoC, parseString) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import Data.IntMap.Strict ((!)) import Data.IntMap.Strict qualified as IntMap import Data.List.Extra (sumOn') @@ -18,7 +18,7 @@ newtype Scratchcard = Scratchcard {unScratchcard :: (Int, (Set Int, Set Int))} deriving (Eq, Ord, Show) main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) partOne :: SimplePuzzle [Scratchcard] Int partOne = @@ -58,10 +58,10 @@ posInt :: Parser Int posInt = fromInteger <$> natural partOneExample :: IO Int -partOneExample = flip evalPart partOne =<< getExample +partOneExample = evaluatingPuzzle partOne =<< getExample partTwoExample :: IO Int -partTwoExample = flip evalPart partTwo =<< getExample +partTwoExample = evaluatingPuzzle partTwo =<< getExample getExample :: IO [Scratchcard] getExample = parseString (some scratchcard) example diff --git a/src/AdventOfCode/Year2023/Day05.hs b/src/AdventOfCode/Year2023/Day05.hs index db5c959..127735d 100644 --- a/src/AdventOfCode/Year2023/Day05.hs +++ b/src/AdventOfCode/Year2023/Day05.hs @@ -5,8 +5,8 @@ module AdventOfCode.Year2023.Day05 where import AdventOfCode.Input (parseInputAoC, parseString) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import Control.Foldl qualified as Foldl import Data.Interval (Extended (..), Interval, (<=..<)) import Data.Interval qualified as Interval @@ -18,7 +18,7 @@ import Relude import Text.Trifecta hiding (parseString) main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) partOne :: SimplePuzzle Almanac (Maybe Int) partOne = asks \(Almanac (seeds, mappings)) -> diff --git a/src/AdventOfCode/Year2023/Day06.hs b/src/AdventOfCode/Year2023/Day06.hs index 7626906..6a4c39f 100644 --- a/src/AdventOfCode/Year2023/Day06.hs +++ b/src/AdventOfCode/Year2023/Day06.hs @@ -3,8 +3,8 @@ module AdventOfCode.Year2023.Day06 where import AdventOfCode.Input (parseInputAoC, parseString) -import AdventOfCode.SimplePuzzle -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (bitraverseBoth, (<.>)) import Data.List.Extra (productOn') import Relude @@ -12,7 +12,7 @@ import Relude.Extra.Bifunctor (bimapBoth) import Text.Trifecta (Parser, natural, symbol) main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) partOne :: SimplePuzzle [(Int, Int)] Int partOne = asks (productOn' waysToWin) diff --git a/src/AdventOfCode/Year2024/Day01.hs b/src/AdventOfCode/Year2024/Day01.hs index e5f0cd9..827bcc3 100644 --- a/src/AdventOfCode/Year2024/Day01.hs +++ b/src/AdventOfCode/Year2024/Day01.hs @@ -4,29 +4,19 @@ module AdventOfCode.Year2024.Day01 where import AdventOfCode.Input (parseInputAoC) -import AdventOfCode.Puzzle (Puzzle) -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (frequencies) import Control.Foldl qualified as Foldl -import Control.Lens (makeLenses, (<.=)) +import Control.Lens ((<.=)) import Data.Map qualified as Map import Relude import Text.Trifecta (count, natural) -data PuzzleState - = PuzzleState - { _answerOne :: !Integer, - _answerTwo :: !Integer - } - deriving (Eq, Generic, Show) - -makeLenses ''PuzzleState - -emptyPuzzleState :: PuzzleState -emptyPuzzleState = PuzzleState 0 0 +type PuzzleState = GPuzzleState1 Integer main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) partOne :: Puzzle ([Integer], [Integer]) PuzzleState Integer partOne = do diff --git a/src/AdventOfCode/Year2024/Day02.hs b/src/AdventOfCode/Year2024/Day02.hs index e2f704d..22ca5fd 100644 --- a/src/AdventOfCode/Year2024/Day02.hs +++ b/src/AdventOfCode/Year2024/Day02.hs @@ -4,29 +4,19 @@ module AdventOfCode.Year2024.Day02 where import AdventOfCode.Input (parseInputAoC) -import AdventOfCode.Puzzle (Puzzle) -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (count, holes) -import Control.Lens (makeLenses, (<.=)) +import Control.Lens ((<.=)) import Data.Ix (inRange) import Relude import Relude.Extra.Bifunctor (bimapBoth) import Text.Trifecta (char, decimal, newline, sepBy1, sepEndBy) -data PuzzleState - = PuzzleState - { _answerOne :: !Int, - _answerTwo :: !Int - } - deriving (Eq, Generic, Show) - -makeLenses ''PuzzleState - -emptyPuzzleState :: PuzzleState -emptyPuzzleState = PuzzleState 0 0 +type PuzzleState = GPuzzleState1 Int main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) partOne :: Puzzle [[Integer]] PuzzleState Int partOne = do diff --git a/src/AdventOfCode/Year2024/Day03.hs b/src/AdventOfCode/Year2024/Day03.hs index 5486250..31e1948 100644 --- a/src/AdventOfCode/Year2024/Day03.hs +++ b/src/AdventOfCode/Year2024/Day03.hs @@ -3,28 +3,18 @@ module AdventOfCode.Year2024.Day03 where import AdventOfCode.Input (parseInputAoC) -import AdventOfCode.Puzzle (Puzzle) -import AdventOfCode.TH (evalPuzzle) -import Control.Lens (makeLenses, (<.=)) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import Control.Lens ((<.=)) import Data.List.Extra (sumOn') import Relude import Text.Parser.LookAhead (lookAhead) import Text.Trifecta (anyChar, comma, decimal, eof, manyTill, parens, string, try) -data PuzzleState - = PuzzleState - { _answerOne :: !Integer, - _answerTwo :: !Integer - } - deriving (Eq, Generic, Show) - -makeLenses ''PuzzleState - -emptyPuzzleState :: PuzzleState -emptyPuzzleState = PuzzleState 0 0 +type PuzzleState = GPuzzleState1 Integer main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) partOne :: Puzzle [Either Bool (Integer, Integer)] PuzzleState Integer partOne = do diff --git a/src/AdventOfCode/Year2024/Day04.hs b/src/AdventOfCode/Year2024/Day04.hs index 3c2bfb8..9b302e5 100644 --- a/src/AdventOfCode/Year2024/Day04.hs +++ b/src/AdventOfCode/Year2024/Day04.hs @@ -3,30 +3,20 @@ module AdventOfCode.Year2024.Day04 where import AdventOfCode.Input (parseInputAoC, parseString) -import AdventOfCode.Puzzle (Puzzle) -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (count) -import Control.Lens (makeLenses, (<.=)) +import Control.Lens ((<.=)) import Data.List.Extra (dropEnd, sumOn') import Data.Universe.Helpers (diagonals) import Linear (V2 (..)) import Relude import Text.Trifecta (Parser, manyTill, newline, oneOf) -data PuzzleState - = PuzzleState - { _answerOne :: !Int, - _answerTwo :: !Int - } - deriving (Eq, Generic, Show) - -makeLenses ''PuzzleState - -emptyPuzzleState :: PuzzleState -emptyPuzzleState = PuzzleState 0 0 +type PuzzleState = GPuzzleState1 Int main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) partOne :: Puzzle [[Char]] PuzzleState Int partOne = do diff --git a/src/AdventOfCode/Year2024/Day05.hs b/src/AdventOfCode/Year2024/Day05.hs index 4f3c15d..a79411d 100644 --- a/src/AdventOfCode/Year2024/Day05.hs +++ b/src/AdventOfCode/Year2024/Day05.hs @@ -3,28 +3,18 @@ module AdventOfCode.Year2024.Day05 where import AdventOfCode.Input (parseInputAoC, parseString) -import AdventOfCode.Puzzle (Puzzle) -import AdventOfCode.TH (evalPuzzle) -import Control.Lens (makeLenses, (<.=)) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import Control.Lens ((<.=)) import Data.Graph qualified as Graph import Data.Semigroup (Max (..), Min (..)) import Relude import Text.Trifecta hiding (parseString) -data PuzzleState - = PuzzleState - { _answerOne :: !Int, - _answerTwo :: !Int - } - deriving (Eq, Generic, Show) - -makeLenses ''PuzzleState - -emptyPuzzleState :: PuzzleState -emptyPuzzleState = PuzzleState 0 0 +type PuzzleState = GPuzzleState1 Int main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) partOne :: Puzzle ([(Int, Int)], [[Int]]) PuzzleState Int partOne = do diff --git a/src/AdventOfCode/Year2024/Day06.hs b/src/AdventOfCode/Year2024/Day06.hs index 7b299ef..912d015 100644 --- a/src/AdventOfCode/Year2024/Day06.hs +++ b/src/AdventOfCode/Year2024/Day06.hs @@ -9,8 +9,8 @@ module AdventOfCode.Year2024.Day06 where import AdventOfCode.Input (parseInputAoC, parseString) -import AdventOfCode.Puzzle (Puzzle) -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (CyclicEnum (..), count) import Control.Lens (ifoldl', makeLenses, to, (%=), (%~), (&~), (+~), (.=), (.~), (<.=), (^.)) import Data.Ix (inRange) @@ -71,20 +71,10 @@ instance Show SituationMap where | y <- [0 .. situation ^. mapBounds . _y] ] -data PuzzleState - = PuzzleState - { _answerOne :: !Int, - _answerTwo :: !Int - } - deriving (Eq, Generic, Show) - -makeLenses ''PuzzleState - -emptyPuzzleState :: PuzzleState -emptyPuzzleState = PuzzleState 0 0 +type PuzzleState = GPuzzleState1 Int main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) partOne :: Puzzle SituationMap PuzzleState Int partOne = do @@ -108,7 +98,6 @@ partTwo = do coords /= situation ^. mapGuard . position, situation ^. mapObstacles . to (Set.notMember coords) ] - answerTwo <.= count (not . causesParadox situation) candidates causesParadox :: SituationMap -> Coordinates -> Bool diff --git a/src/AdventOfCode/Year2024/Day07.hs b/src/AdventOfCode/Year2024/Day07.hs index 8eff47a..899a0d4 100644 --- a/src/AdventOfCode/Year2024/Day07.hs +++ b/src/AdventOfCode/Year2024/Day07.hs @@ -33,10 +33,10 @@ module AdventOfCode.Year2024.Day07 where import AdventOfCode.Input (parseInputAoC, parseString) -import AdventOfCode.Puzzle (Puzzle) -import AdventOfCode.TH (evalPuzzle) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (numDigits) -import Control.Lens (makeLenses, (<.=)) +import Control.Lens ((<.=)) import Data.Foldable (foldrM) import Relude import Text.Trifecta (Parser, char, decimal, newline, sepEndBy, sepEndByNonEmpty, string) @@ -84,21 +84,11 @@ execInverseOperation operator x y = (d, m) = y `divMod` (10 ^ pow) in [d | m == x] -data PuzzleState - = PuzzleState - { _answerOne :: !Int, - _answerTwo :: !Int - } - deriving (Eq, Generic, Show) - -makeLenses ''PuzzleState - -emptyPuzzleState :: PuzzleState -emptyPuzzleState = PuzzleState 0 0 +type PuzzleState = GPuzzleState1 Int -- | Solve the puzzle and print the results. main :: IO () -main = $(evalPuzzle) +main = $(defaultMainPuzzle) -- | Calibrate the equations using addition and multiplication. -- From 3ed7035453102fbea31a608b0b749d9e5ad09111 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Fri, 21 Nov 2025 02:19:45 -0600 Subject: [PATCH 38/91] feat(2021.11-haskell): solve --- VERSION | 2 +- input/2021/day11.txt | 10 -- package.yaml | 1 + src/AdventOfCode/Year2021/Day11.hs | 172 +++++++++++++++++------------ 4 files changed, 103 insertions(+), 82 deletions(-) delete mode 100644 input/2021/day11.txt diff --git a/VERSION b/VERSION index 9d024b1..2675c6e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.60 \ No newline at end of file +2024.7.2.61 \ No newline at end of file diff --git a/input/2021/day11.txt b/input/2021/day11.txt deleted file mode 100644 index a769718..0000000 --- a/input/2021/day11.txt +++ /dev/null @@ -1,10 +0,0 @@ -4438624262 -6263251864 -2618812434 -2134264565 -1815131247 -2612457325 -8585767584 -7217134556 -2825456563 -8248473584 diff --git a/package.yaml b/package.yaml index e4dba3f..4919da7 100644 --- a/package.yaml +++ b/package.yaml @@ -504,6 +504,7 @@ executables: <<: *executable main: AdventOfCode.Year2021.Day11 dependencies: + - finite-typelits - linear aoc-2022-day01: <<: *executable diff --git a/src/AdventOfCode/Year2021/Day11.hs b/src/AdventOfCode/Year2021/Day11.hs index 9119c53..0472cac 100644 --- a/src/AdventOfCode/Year2021/Day11.hs +++ b/src/AdventOfCode/Year2021/Day11.hs @@ -1,88 +1,118 @@ -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE TupleSections #-} -{-# LANGUAGE TypeApplications #-} -{-# LANGUAGE TypeOperators #-} +{-# LANGUAGE DerivingVia #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2021.Day11 where -import AdventOfCode.Input (parseInput, parseString) -import AdventOfCode.TH (defaultMain, inputFilePath) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (neighborsOf) -import Control.Lens (ifoldl') +import Control.Lens (ifoldl', makeLenses, use, uses, (%=), (+=), (.=), (<~)) +import Control.Monad.Extra (whileM) import Data.Char (digitToInt) -import Data.Foldable (forM_) +import Data.Finite (Finite, finites, getFinite, modulo) import Data.Ix (Ix, inRange) -import Data.Map (Map) -import Data.Map qualified as M -import Data.Set (Set) -import Data.Set qualified as S +import Data.Map qualified as Map +import Data.Set qualified as Set +import Generic.Data (GenericProduct (..)) import Linear (V2 (..)) -import Text.Trifecta (Parser, digit, newline, sepEndBy, some) +import Relude +import Text.Trifecta (Parser, digit, newline, sepEndBy) + +type EnergyLevel = Finite 10 + +type Grid = Map (V2 Int) EnergyLevel + +grid :: Parser Grid +grid = mkGrid <$> some (fromIntegral . digitToInt <$> digit) `sepEndBy` newline + +mkGrid :: [[EnergyLevel]] -> Grid +mkGrid = ifoldl' (ifoldl' . f) Map.empty + where + f y x = flip (Map.insert (V2 x y)) + +printGrid :: Grid -> IO () +printGrid m = forM_ (finites @10) $ \y -> do + forM_ (finites @10) $ \x -> + putStr (show (getFinite (m Map.! (fromIntegral <$> V2 x y)))) + putStrLn "" + +data PuzzleState' a + = PuzzleState + { _theCount :: !a, + _theGrid :: !Grid + } + deriving (Eq, Generic, Show) + deriving + (Semigroup, Monoid) + via (GenericProduct (PuzzleState' (Sum a))) + +makeLenses ''PuzzleState' + +type PuzzleState = PuzzleState' Int main :: IO () -main = $(defaultMain) +main = $(defaultMainPuzzle) + +getInput :: IO Grid +getInput = parseInputAoC 2021 11 grid -getInput :: IO (Map (V2 Int) Int) -getInput = parseInput grid $(inputFilePath) +getExample :: IO Grid +getExample = parseString grid example -example :: IO (Map (V2 Int) Int) +example :: String example = - parseString grid . unlines $ - [ "5483143223", - "2745854711", - "5264556173", - "6141336146", - "6357385478", - "4167524645", - "2176841721", - "6882881134", - "4846848554", - "5283751526" - ] - -partOne :: Map (V2 Int) Int -> Int -partOne = fst . (!! 100) . iterate step . (0,) - -step :: (Int, Map (V2 Int) Int) -> (Int, Map (V2 Int) Int) -step (n, octopuses) = - ( \(flashes, octopuses') -> - (n + S.size flashes, foldl (\m coords -> M.insert coords 0 m) octopuses' flashes) - ) - $ go (S.empty, fmap succ octopuses) - -go :: (Set (V2 Int), Map (V2 Int) Int) -> (Set (V2 Int), Map (V2 Int) Int) -go (flashes, octopuses) = - if any (> 9) octopuses - then M.foldlWithKey flash (flashes, octopuses) octopuses - else (flashes, octopuses) - -flash :: (Set (V2 Int), Map (V2 Int) Int) -> V2 Int -> Int -> (Set (V2 Int), Map (V2 Int) Int) -flash (flashes, octopuses) coords octopus - | octopus > 9 = - let neighbors = neighborsInRange (pure 0, pure 9) coords - flashes' = S.insert coords flashes - octopuses' = M.delete coords octopuses - in go (flashes', foldl (flip (M.alter (fmap succ))) octopuses' neighbors) - | otherwise = (flashes, octopuses) + "5483143223\n\ + \2745854711\n\ + \5264556173\n\ + \6141336146\n\ + \6357385478\n\ + \4167524645\n\ + \2176841721\n\ + \6882881134\n\ + \4846848554\n\ + \5283751526\n" -partTwo :: Map (V2 Int) Int -> Int -partTwo = undefined +partOne :: Puzzle Grid PuzzleState Int +partOne = do + theGrid <~ ask + runSteps 100 -grid :: Parser (Map (V2 Int) Int) -grid = mkGrid <$> some (digitToInt <$> digit) `sepEndBy` newline +partTwo :: Puzzle Grid PuzzleState Int +partTwo = do + theGrid <~ ask + theCount .= 0 + whileM + $ stepM (const 1) + *> uses theGrid (any (/= 0)) + use theCount -mkGrid :: [[a]] -> Map (V2 Int) a -mkGrid = ifoldl' (ifoldl' . f) M.empty - where - f y x = flip (M.insert (V2 x y)) +runSteps :: Int -> Puzzle Grid PuzzleState Int +runSteps 0 = use theCount +runSteps k = stepM Set.size *> runSteps (k - 1) + +stepM :: (MonadState PuzzleState m) => (Set (V2 Int) -> Int) -> m () +stepM f = do + theGrid %= fmap increase + (flashes, steppedGrid) <- uses theGrid (handleFlashes Set.empty) + theGrid .= steppedGrid + theCount += f flashes + +increase :: EnergyLevel -> EnergyLevel +increase = modulo . succ . getFinite + +handleFlashes :: Set (V2 Int) -> Grid -> (Set (V2 Int), Grid) +handleFlashes seen current = + Map.foldlWithKey flash (seen, current) current & \(flashes, next) -> + (flashes, foldl' (\m coords -> Map.insert coords 0 m) next flashes) + +flash :: (Set (V2 Int), Grid) -> V2 Int -> EnergyLevel -> (Set (V2 Int), Grid) +flash (flashes, octopuses) coords octopus + | octopus == 0 && coords `Set.notMember` flashes = + handleFlashes (Set.insert coords flashes) + $ foldl' (flip (Map.alter (fmap increase))) octopuses + $ neighborsInRange (0, 9) coords + | otherwise = (flashes, octopuses) --- FIXME: generalize neighborsInRange :: (Ix a, Num a) => (V2 a, V2 a) -> V2 a -> Set (V2 a) -neighborsInRange range point = S.filter (inRange range) (neighborsOf point) - -printGrid :: Map (V2 Int) Int -> IO () -printGrid m = forM_ [0 .. 9] $ \y -> - do - forM_ [0 .. 9] $ \x -> - putStr (show (m M.! V2 x y)) - putStrLn "" +neighborsInRange range point = Set.filter (inRange range) (neighborsOf point) From de7a2d03a768889299a2a104afa4023703fc8c28 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sat, 22 Nov 2025 02:24:47 -0600 Subject: [PATCH 39/91] refactor(2021.10-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2021/day10.txt | 102 ---------------------- package.yaml | 3 + src/AdventOfCode/Year2021/Day10.hs | 135 +++++++++++++++-------------- 4 files changed, 72 insertions(+), 170 deletions(-) delete mode 100644 input/2021/day10.txt diff --git a/VERSION b/VERSION index 2675c6e..e2b0ea2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.61 \ No newline at end of file +2024.7.2.62 \ No newline at end of file diff --git a/input/2021/day10.txt b/input/2021/day10.txt deleted file mode 100644 index 27355e5..0000000 --- a/input/2021/day10.txt +++ /dev/null @@ -1,102 +0,0 @@ -[<[{<[(([<[[{[()()]}]{<<<>[]>[()[]]>{(<>[]){<>[]}}}]<{(<()<>>{()<>})(<()>)}([{()[]}](<()<>> -<[(<({[<(<<({({}[])[<>]}[<<>{}>[()()]])>>)>]})>{[([({[{{<[[]{}]{{}}><{()[]}[{}]>}}{{[<<>()>((){}) -{<({([<([[<<[(<>())({}{})](<()()>{{}})>(([[]{}]<[][]>){<{}>{<>{}}})>]][[((<[<>()]<<>[]>>{{()[]}{[]{} -([{({<<{<<<{([{}[]]([]())){[(){}]}}{[<{}()>(<>[])]}][({[()<>][<><>]}{{{}[]}})<<<{}()>>>]>([[<[{}<>] -{([{({(<{[<(<(()()){{}()}>[(<><>)<<>[]>])[{{{}()}[(){}]}[<()[]>[{}[])]]>{([{{}{}}{[]}][{{}<>}{<><>}]){[[[]() -[{(([[{([(({(<{}()>({}<>))((()())(<>[]))}{<{{}[]}[{}()]>{{()()})})<{{([]{})[<>[]]}[{<>[]}{ -<<([{{({{{[(<[<>()][()<>]>)]}<(<<<<>()><{}()>>><({{}<>}{()[]}){<(){}>}>)>>})<[{[<([[{}{}]{{}()}] -<[{{[<[{(<<([([]{})]<[[]{}]{<>()}>)(<<<>{}>{{}[]]>(<[]()>(()[])))><<[{[][]}{[]}](([])([]))><({{}{}}{[][]}) -{{{({{{([<<<{[()]({}{})}((()[])<()<>>)>{{<{}<>><{}()>}}>(<<(())({}())>{{{}}({}())}>{<[{}<>]<{}{}>>[{<>()} -{<({<[{[<<{{[[[][]][<><>]](([]{})<()[]>)}<<((){})><[[][]](<><>)>>}{(<<{}<>><<>>><((){})([]<>)>)<(([]))( -({{{([({<((<<<()>[[]<>]>(<<><>>(()()))>))>})]){({[<[<<[[{}{}]][([]<>)]><{<{}()><()<>>}(<[][]>[{}()])]>{({{ -(<{<<[[[(<{<({<>()}{{}<>})<<()()>(<>[])>>(({{}()}([])))}>([[<({}())({}())]((<>{})<<><>>)][[<( -[([({{{[<([<[(<>[])[{}[]]]<[[]{}][<>]>>])<(((<()<>>(<>{}])({<>{}}[{}<>]))<([()()]{[]<>})({<>()}[{} -<(<<([{{[<((({<><>}<<>>)[[[]<>]({}())]){(<<>()>{[]()})[<()>{[][]}]})>]<[[[{(<>{})<(){}>}[{<>{}}]]]][ -{[[[{[(((<{[{([]{})[[][]]}(<{}()><<>[]>)][<[<>{}]>]}>({([(()())<[]{}>](([]{})[<>{}])][[{[]{}}<<>{}>]({{}}[<> -{{{([[<[({<<<({}{})<[]()>>[[<>[]>{<>[]}]>[({<>[]}({}<>))[[[]()][()<>]]]>})]>]<(<<<<[<((){})<{}{}>><{()()}(( -[{<<<[((<{{{[<{}{}>[{}{}]]([{}<>]{{}<>})}{{[{}{}][{}]}({[]<>}{<><>})}][([<[]<>><{}<>>][<(){}>(() -[{<(<[{(<(<((((){})<[]<>>)[{()<>}{[]<>}])><(((<>)(<>[]))(<[]<>>))([<<><>>[[]<>]]{<[]()>{()[]}})>){<({{[][ -<(<<<[([[<{{(({}[])[<>{}])<(()<>)({}{})>}}>{{([(<>())<()[]>]{{[]<>}})<[[<>()]](<()[]>)>}<{[<{}<>><{}[]>]( -{((<[<[<(<[({{{}<>}(()<>)}{(<>{})[[]{}]})(((()[])))]>)[{([([<><>][{}[]])[<()[]>(<>[])]]({[ -[({([<([({<(<<(){}><{}<>>>{{<>[]}[()[]]})[[[{}[]](()())]]]({[{(){}}{()}]<{{}()}{{}()}>}[([[][]][()[ -({[[{[[({{[[(<<><>>{()}){[()()]}]<{{<><>}({}())}{{[][]}{()()>}>]<[{<<>[]>[[]<>]}]<[<()[]><( -(<[{[(<{(<{{[{<><>}{[][]}](<(){}><[]()>)}}><{<(<<>()>([]<>))<({}<>){{}()}>>}{([(()[]}[<>[]]])<{{[]{}} -<{{(<([(<<<<[{{}<>}(()[])][<{}[]>[<>[]]]><<{[]()}(()<>)>({()<>}({}[]))>><[(([]{}))[{<><>}([][])]]{{(<>())}( -{<[(<{[[(<<[{<(){}>{<><>}}((()<>){<>()})]<[[{}<>]{{}[]}]{([])([]{})}>><{(<{}[]><()<>>)}<(({}()]{[ -[{[([([{{{{([(()[])[()()]])[[(<>{})[{}[]]]]}}}{<({[<()[]><{}()]]}{[[[]()]{()()}]})<<<[{}<>](<>[])>[(()<>)([] -{(<{([<<<((({[{}<>]({}())}))[{{((){})[()()]}<{{}<>}<()[]>>}{{{[]()}}}]){((((()())(())){(<>{}){{ -{<<{{{([[<{<<[{}<>][<>[]]>>(([()()](<>[])){([]{})})}>{<((<<>()><[]<>>)({[][]}[[]{}])){(<(){}><{}>)( -[[[{[{{{{[<{((<>())((){}))(([]{}){()()})}>([[[{}{}]{[]()}]{(()())<{}[]>}][{((){})<{}[]>}<<[]>< -(<[[<[{[<(<[<<{}[]>[[]<>]>((()<>)[<>[]])]{[[{}<>]({}{})](<[][]><[]{}>)}>([{(<>[])<{}{}>}({(){}}[()<>])] -{{<[{({([[(([[{}<>][{}<>]][[<><>]]))<([({}()){[]()}](({}())<{}<>>))>]<{<(({}{})[[]<>])[<{}{ -[[({(<[<<{<{<({}())(()[])><((){})[()<>]>}{{<()>(<>[])}}><[([[][]]<()<>>)][<(<>())[()()]>{(<>())}]>)>((<<[ -[([{<<[(([((<<()[]><{}[]>>[{<>()}<()[])]){[{()[]}{<>[]}]{{<>}(()())}})<[(({}{})(()[]))(<[] -((<<{{{<<[{[<<[][]>[<><>]>(({}<>)(<><>))](<<[]<>>(<>[])>[<<>{}>((){})])}]>>(({{([<<><>>{{} -([<(([[[((<(([<>()]<()<>>)<[[]()][{}()]>){<(()<>){()()}>}>{(<(()()){{}<>}><<[]<>>[(){}]>)[<<{}{}>{[] -({[<<[{<{<<<[<{}[]>]{[[][]]{[]()}}][{<<><>>(()())}({{}[]}<{}[]>)]>>((([<{}{}>({}())]({{}() -{{[<<<[{(([<[<(){}><<>[]>]({<>[]}[<>{}])>]([<[[][]][[]{}]>({[]<>}[()<>])]))(([({{}()}{<><>})[[()()](<>[] -[([{(<[<([[(<(()[]){(){}}>)[[<[]()>([]())]({[]<>}<{}()>)]]([<{[][]}(()<>)><[{}[]][()[]]>]<[<{ -(<[([<<<(<[({(())(()[])}<{<>()}{{}()}>)[[{()[]}<<>[]}]{[<>()][{}{}]}]]>{{[({<>[]})][([[]()]<{}< -[[[<<{({[{{<[[[]()]<(){}>]{([])<()[]>}>[[({}[])[[]<>]][<(){}>[()<>>]]}{<(<[]()>{{}<>})<(<>[])({} -<{[[<[[{[[(<<{(){}}({}<>)>({{}()}([][]))}([<[]{}>(<><>)]))<{{<[]<>>(()<>)}([[]()]({}[]))}({[<>{} -(<[<[{{([{(<[[()()]]{{<>()}{<><>}}>(<[()[]]{[][]]>({<><>}<<>[]>)))((<<()[]>>)[[<{}[]>]<[{}()]<{}<>>>])}[ -{{{[<{[((<([<{(){}}{{}[]}>{[(){}][{}{}]}])<<[<<>[])(()())][((){})]>{({()[]}[[]{}])}>>){[({ -{(((<(<{(<<((<[]()>))({({}<>)({}<>)})>>)}>)><[[<[<[[{(<><>)({}())}(({}<>){()[]})]]{{[{<>{}} -{{(<<(<([({(({[]{}}{{}[]})<(()())[()()]>)}<{{[{}<>](<>{})}{{{}()}{<>{}}})(({{}{}})(<[][]>{{}()}))>){[<[{<>()} -[(<{<([[[<({[{<><>}{<>{}}][{()<>}{<>()}]}<(<()[]><()<>>)>)><<([[{}{}]]([<>[]][[]<>]))(<<<>()>[()<>]> -({<{(<{[(<<(<([][])[(){}]>{({}<>)[{}[]]}){(({}[])[()()))(<[][]>(()<>))}>>)((<(<({}[]){[]()}>){({<>()}[{} -{<[([<<[(<{((<{}<>>)(<{}[]>{{}[]}))}(<[<[]()>([]())]{[{}]<<>[]>}><[{{}<>}[{}[]]](([]<>)<{}{}>)>)>){ -[(({<([(<<[<<[[]<>]<()()>>{({})([]{})}>]<[{[<>()]{[]<>}}{{{}<>}<<>()>}]>>>((<{(<<><>>{[]{}})({<>[]}((){ -{[[([[{<<[[[<[<>{}]{<>()}>({{}()}[()<>])]]({{<{}[]><<><>>}{<()<>>}}{{{[]()}<()<>>}<(<>[])(()[])>} -{<{<{{{{[[[((<{}{}>{{}{}})<{{}{}}{(){}}>)[[(()<>)]]]({{([]())[<>[]]}}[{<[]<>>((){})}([[]<>])])] -<[({({[[<(<({([]<>)[<>]}[[()[]]([])])<(<(){}>(()[]))[<<>()>[[]{}]]>>>><{[{<[{}{}][{}()]>{([]())[<><>]}}<{<< -[{<([<[(<({[<[<>]<{}[]>>{({}<>)[[]<>]}]{{{[]<>}(()[])}<(())>}}[({{[]()}{{}{}}}{{[]{}}[()[]]})])<{({{(){}} -{{([(([{{{((<[()[]][<>{}]>[<<>()>[[][]]])<{<{}>[(){}]}{({}())[()()]}>)({({<>[]}<[]()})<({}{})<< -(<(<{([<((<{<<{}<>>[()()]>({[]<>})}([[<>()]([]())])>{([{{}[]}(<>[])]{[[][]]{[][]}})}))>(<[{ -[({{{(<[{{{<(<{}>)<{<>()}<(){}>>>[[{()()}(()<>)][[[][]]([][])]]}}}((({((<>{}){{}{}))[{{}<> -[<(([(<[{[<<({(){}})([<>[]){[]()})>>([[<()[]><{}>]])]<({[{()<>}<[]<>>][[<>()]]})>}]>)]{<{<( -([(({({{{[[{(<[][]><{}<>>)}[((<><>)(()<>))<{<><>}{<><>}>]]{(([{}<>][[]()])<<[][]>([]())>){<[(){}]>}}][(<< -({(<{<({{{<(<<[][]}>[{[]<>}{[]{}}])><(<(<>[])([][])>{({}<>)}){{<[]()>(()<>)}}>}(<<<<{}{}>[(){}]>[[()[]]( -<[<((<{{{<<{({<>[]}){<[][]><[]<>>}}{[{[]()}[{}[]]][({}())]}>[{<[()<>]>[{()[]}((){})]}(({[]()} -[<({{[([([<{<[[]]<{}{}>>{([][])[()<>]]}[[<(){}><(){}>]]>((((<>{})[<>{}]){(()[])}){<[<>](()<>)>([[]< -<[[([[[(({{<(({}){[][]})[[<>[]]([]())]><[<{}{}><{}()>]>}<(<{<><>}{()[]}>([{}()]((){})))>}{{([{{}}{<>[ -([[{<<<<(({(<([]{})<{}[]>>)}([[<{}()>)([[]{}]<<>()>)]{{{(){}}}[<()<>>{<><>}]}))<[{{<()()><{}{}>}}][{{<(){}>< -{[{{(<{{{<([[{{}()}{{}{}}]]({<[][]>(<>[])}[[[][]]{<>[]}]))>}}}>)}}{<[<{[{[<[({[]}<[]{}>){(<>{})(<><>) -<{{([<{{{{<{{{()[]}{[]()}}{(())((){})}}{{(()[])[{}<>]}(<()<>>([][]))}>}}<[{({<()[]>({}[])} -{(<([(([{{{({[()()]<()>}[([]()}<<><>>])[{[<>[]]<<>>}{{[]<>}(<>())}]}}<{{[[{}[]]]}(<<<>()>>({[]()}<<>[]>) -<[{{{[{(<<(({<<>[]>{[]}}<{{}[]}<{}[]>>)[[([]())(<><>)][[[]()]([]{})]])[<{(()[])<()>}>([{{}{}}]{<(){}>(()()) -[(<[({<{[[{<{[{}[]]{[]<>}}[<()<>>[[][]]]>(<[{}<>]({}())><[{}{}]{()()}>)}((<<<>[]>(<>{})>[(<>())[{}{ -[[<{{<<[<<<<({{}<>}<{}[]>)((()[])[[]<>])><([<>[]]([]<>)){(<><>)}>>[({{()}{<>[]}}[([][])[{}[]]]){([{}()][<>{ -{{{<({[([({<[[{}<>](()())]([<><>]({}[]))>}(({<<>()>[[]]}[<()>{<>{}}])))]<{({{(()())<<>>}}[({[]{}}[ -(<<{(({{(<{{[<{}{}><<>()>]{{()[]}<<>{}>}}(<<{}<>><()>>{<()<>>([]{})})}<[{([]<>)<<>[]>}[<{}()><{}>]]>> -{<[[<{[{(<{<<(<>)<{}{}>>>[<<{}()>({}{})>]}<<[({}[]](()[])]{<[]<>>(())}>{<{()<>}({}<>)>{<() -[{((<<{<{[{[([()<>](()())){(<>())}}([[()<>][{}()]][({}[]){[]()}])}([<[()<>]([][])>[[[]{}]{()[ -[<[<[<<[([<{[{()<>}({}())]<{{}<>}([]())>}(<<<>{}>[{}{}]>[[[]()]])>]<({({(){}}<[]{}>)([()<>](()))}[({[ -[<[<[(((<(({{([][])}}<[[[][]]{(){}}>(<()[]>[[][]])>){([(()<>)<()()>]<[{}()]([]())>)<<{<>()}>([<>[]]{[] -{{<{<[{[{[(<([{}()]{[]<>})({<>})>(({{}{}}([]{}))))<[[({}{})<()[]>][{[]{}}{(){}}]]{([()<>])(<()[]><<>()>)}>]} -((({([{(<{<[[{{}<>}<{}()>]{([]<>)[{}[]]}]>(<([[]<>])((<>[]))>{<{[][]}(<>())>{{{}()}(()[])}})}>{[ -<{(([(<<<(<({{[]<>}{<>[]}}{[[]{}][[]{}]})>[<<[{}<>](()<>)><(()<>)[{}()]>>(<{<>[]]({}[])>{(<>)<[]{}>})]){[<<[( -<{<{{<<<{((<([()()])(<(){}>{<>()})>)<([([]()){{}[]}]{{{}}<{}[]>})(<{()<>)>[<{}()>])>)(<(([()()]( -(<[{(<(<[<<[((<>[]){<>[]})<(<>[]]({}{})>][[{[]{}}{()[]}]]>>[<{(<[][]>{{}{}})}<([()[]]<[]<>>)[{<><>}<{}{ -({{<<({<<[<[<(<><>)<()<>>><[()<>]([][])>]>[{{<()<>><()<>>}}(<{{}()}><{{}{}}<{}{}>>)]]([[[{[ -([[<<([[<([{([()[]](<>[]))<<<>[])({}[])>}[{[[][]]}]])[<[[({}{})<{}<>>]]([{{}<>}({}[])](([]())({}{})))>[[ -<{<(<{({[({[[[()[]]{{}[]}][[<>[]>{<>[]}]]})]<{[{<[{}[]]{<>()}><([]<>){<>{}}>}{(<(){}>{<>{}}) -<<<[<{(<{(({({<><>}{{}<>}){([][])([][])}}[<{(){}}<<>{}>>{([]<>)[()[]]}>)<{{{<><>}{<>{}}}{( -<[<<(({<<[<([<{}()><<><>]])<[[{}<>][<>{}]]<[{}<>](<>{})>>>](<(<[[]<>][(){}]>(<<>()>{<>})){[({}[] -<[[{<[([[[[{([()<>])<[[][]]{[]{}}>}](<[(<><>)]>({{(){}}<[]()>}))]]]{<({{(<<>()><(){}>){<[]<>>}}}[[ -<{[[[(({{[{(([{}()][<>()]))[([[]{}]<{}[]>)([<>[]]{{}{}})]}[{[(()[])]((<>{}){()()})}<<{(){}}[[]<> -(<((<[[{((({((()<>)){{{}<>}(<><>)}}<((()[]))>)([{(<>[])([]<>)}[([][])(<>[])]]<<<<>{}>>[([][])[{}<>]>>))([< -[(((<[<{[([{(<<>[]>((){}))[[[]()][<>{}]])]<({<{}>{[][]}}{{{}<>}[<>[]]})<<{{}()}{(){}}>({<>{}}{{}[] -{((<[{[<<<[{<[(){}]({}{})>}<[<[]{}>({}<>)][{(){}}<<>{}>)>][<[[{}]({}[])]>]><[{{{{}[]}}({[]{}}(<> -[[<[(((({[[[({<>{}}{{}()})[<(){}>{<>}]]{(<<>{}>(()<>))([[]<>]<()<>>)}](<([[]{}]<()()>)>{<[() -[<<<[{[<{[(({([][]){<>}}))(<{([]())[{}()]}[[{}[]]{[]<>}]><{(<>())<[][]>}[([][]){{}()}]>)]( -<(<{<<[([[<{[[<>()]<{}{}>][[(){}]<<><>>]}>]{(([[<>[]](<>{})>{<()[]><[][]>})[<[(){}]{[][]}><[<>()]([][] -<[([<<[{{[<<<{<>()}[<>()]>[<{}{}>[{}{}]]>[{[(){}]}([[]{}])]>]}}]>>{<([<(({({[][]}){([]()){{}{}}}} -[({{{((<{<{[<<{}{}>><<[]{}><<>{}>>][<{{}()}>]}[(<[[]]<<>[]>>[([]())<<>{}>]){<[{}[]]>((()<>)[[]{} -{[<[[(({([[<[(<>{})<<>{}>]{<()<>><{}[]>}>[[{{}<>}([]<>)][({}())([]())]]]])[[({{[[]<>][<>{}]}[[<> -(((<[[<<{{[[[([]{})<{}<>>]]{{[<>[]]<{}{}>}({<><>}{()()})}][[<<[]()>{<>[]}><(()())<()[]>>]{{([]( -[<{<[[[<<{[{<({})([][])>[{[]()}]}<[{{}()}[<><>]]>][((<[]{}><{}()>)(<<>()>))([<<>()>((){})>)]}{[({(<>())<( -{([<[{{{<[{[({<>()}(<>{})}[{()()}[<><>]]]}<{{{<>[]}[{}[]]}({[]()}[{}()])}<({()()}<<><>>){{{}{}} -{{<[[<({([{(([[]<>][{}<>])){{({}{})<<>()>}}}[[{[<><>][{}{}]}<{[][]}([]())>]<<[()[]]{()<>}>{<{}[]}(()())}>] -<({<[([{[[<{<{[]{}}[<>]>}>([(<()[]>[[]<>])<{<>[]}>]{[(()())[{}]][<{}<>><{}>]})]]([{{{([]{})[(){}]}[< -[<<[{[{{[[{[[[()<>][()[]]](({}<>)[()<>])]<<(()[])>([<>[]]{()<>})>}([<[{}{}]>{({}<>){[][]}}][{[<>[]][<>]}])]]} diff --git a/package.yaml b/package.yaml index 4919da7..acd5d5f 100644 --- a/package.yaml +++ b/package.yaml @@ -57,6 +57,7 @@ library: - data-ordlist - dlist - fast-digits + - finitary - finite-typelits - free-algebras - groups @@ -500,6 +501,8 @@ executables: aoc-2021-day10: <<: *executable main: AdventOfCode.Year2021.Day10 + dependencies: + - finitary aoc-2021-day11: <<: *executable main: AdventOfCode.Year2021.Day11 diff --git a/src/AdventOfCode/Year2021/Day10.hs b/src/AdventOfCode/Year2021/Day10.hs index 8df9ce8..a393472 100644 --- a/src/AdventOfCode/Year2021/Day10.hs +++ b/src/AdventOfCode/Year2021/Day10.hs @@ -1,91 +1,92 @@ -{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE DeriveAnyClass #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2021.Day10 where -import AdventOfCode.Input (parseInput, parseString) -import AdventOfCode.TH (defaultMain, inputFilePath) -import Control.Applicative ((<|>)) -import Data.Either (fromLeft) -import Data.Foldable (foldlM) -import Data.Functor (($>)) -import Data.List (sort) -import Data.Maybe (mapMaybe) -import Text.Trifecta (Parser, char, newline, sepEndBy, some) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import Data.Either.Extra (eitherToMaybe) +import Data.Finitary (Finitary (toFinite)) +import Data.List ((!!)) +import Data.List.Extra (sumOn') +import Relude +import Text.Show qualified +import Text.Trifecta (Parser, char, choice, newline, sepEndBy) data Bracket = Paren | Square | Curly | Angle - deriving (Eq, Show) + deriving (Eq, Generic) + deriving anyclass (Finitary) + +type Line = [Either Bracket Bracket] + +instance {-# OVERLAPPING #-} Show Line where + show = concatMap (either open close) + where + open = pure . ("([{<" !!) . fromIntegral . toFinite + close = pure . (")]}>" !!) . fromIntegral . toFinite main :: IO () -main = $(defaultMain) +main = $(defaultMainPuzzle) + +getInput :: IO [Line] +getInput = parseInputAoC 2021 10 (some bracket `sepEndBy` newline) -getInput :: IO [[Either Bracket Bracket]] -getInput = parseInput (some bracket `sepEndBy` newline) $(inputFilePath) +getExample :: IO [Line] +getExample = parseString (some bracket `sepEndBy` newline) example -example :: IO [[Either Bracket Bracket]] +example :: String example = - parseString (some bracket `sepEndBy` newline) . unlines $ - [ "[({(<(())[]>[[{[]{<()<>>", - "[(()[<>])]({[<{<<[]>>(", - "{([(<{}[<>[]}>{[]{[(<()>", - "(((({<>}<{<{<>}{[]{[]{}", - "[[<[([]))<([[{}[[()]]]", - "[{[{({}]{}}([{[{{{}}([]", - "{<[[]]>}<{[{[{[]{()[[[]", - "[<(<(<(<{}))><([]([]()", - "<{([([[(<>()){}]>(<<{{", - "<{([{{}}[<[[[<>{}]]]>[]]" - ] + "[({(<(())[]>[[{[]{<()<>>\n\ + \[(()[<>])]({[<{<<[]>>(\n\ + \{([(<{}[<>[]}>{[]{[(<()>\n\ + \(((({<>}<{<{<>}{[]{[]{}\n\ + \[[<[([]))<([[{}[[()]]]\n\ + \[{[{({}]{}}([{[{{{}}([]\n\ + \{<[[]]>}<{[{[{[]{()[[[]\n\ + \[<(<(<(<{}))><([]([]()\n\ + \<{([([[(<>()){}]>(<<{{\n\ + \<{([{{}}[<[[[<>{}]]]>[]]\n" + +partOne :: SimplePuzzle [Line] Int +partOne = asks (sumOn' (fromLeft 0 . scoreLine)) -partOne :: [[Either Bracket Bracket]] -> Int -partOne = sum . map (fromLeft 0 . foldlM go []) +partTwo :: SimplePuzzle [Line] Int +partTwo = asks (middle . mapMaybe (eitherToMaybe . scoreLine)) + +scoreLine :: Line -> Either Int Int +scoreLine = foldlM scoreIncomplete [] >>> second (foldl' scoreCorrupt 0) where - go [] next = Right [next] - go (Left lhs : rest) (Right rhs) + scoreIncomplete [] next = Right [next] + scoreIncomplete (Left lhs : rest) ket@(Right rhs) | lhs == rhs = Right rest - | otherwise = Left (scoreBracket (Right rhs)) - go stack next = Right (next : stack) - -partTwo :: [[Either Bracket Bracket]] -> Int -partTwo = - medianOdd - . map (foldl ((+) . (5 *)) 0 . map scoreBracket) - . mapMaybe (foldlM go []) - where - go [] next = Just [next] - go (Left lhs : rest) (Right rhs) - | lhs == rhs = Just rest - | otherwise = Nothing - go stack next = Just (next : stack) + | otherwise = Left (scoreBracket ket) + scoreIncomplete stack next = Right (next : stack) + + scoreCorrupt total ket = total * 5 + scoreBracket ket bracket :: Parser (Either Bracket Bracket) bracket = - char '(' $> Left Paren - <|> char ')' $> Right Paren - <|> char '[' $> Left Square - <|> char ']' $> Right Square - <|> char '{' $> Left Curly - <|> char '}' $> Right Curly - <|> char '<' $> Left Angle - <|> char '>' $> Right Angle + choice + [ char '(' $> Left Paren, + char ')' $> Right Paren, + char '[' $> Left Square, + char ']' $> Right Square, + char '{' $> Left Curly, + char '}' $> Right Curly, + char '<' $> Left Angle, + char '>' $> Right Angle + ] scoreBracket :: Either Bracket Bracket -> Int scoreBracket = either autocomplete illegal where - autocomplete = \case - Paren -> 1 - Square -> 2 - Curly -> 3 - Angle -> 4 - illegal = \case - Paren -> 3 - Square -> 57 - Curly -> 1197 - Angle -> 25137 - --- length must be odd -medianOdd :: (Ord a) => [a] -> a -medianOdd xs = sort xs !! (length xs `div` 2) + autocomplete = (1 +) . fromIntegral . toFinite + illegal = ([3, 57, 1197, 25137] !!) . fromIntegral . toFinite + +middle :: (Ord a) => [a] -> a +middle xs = sort xs !! (length xs `div` 2) From f2ecd688e87c225c7732b1a86a40ae7adb9d0940 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sat, 22 Nov 2025 23:57:27 -0600 Subject: [PATCH 40/91] refactor(2021.09-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2021/day09.txt | 100 ----------------------------- src/AdventOfCode/Year2021/Day09.hs | 46 +++++++------ 3 files changed, 26 insertions(+), 122 deletions(-) delete mode 100644 input/2021/day09.txt diff --git a/VERSION b/VERSION index e2b0ea2..197215e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.62 \ No newline at end of file +2024.7.2.63 \ No newline at end of file diff --git a/input/2021/day09.txt b/input/2021/day09.txt deleted file mode 100644 index d42f8b3..0000000 --- a/input/2021/day09.txt +++ /dev/null @@ -1,100 +0,0 @@ -5457889101989999876543210123598932197856889569898943293299789965432998765467954321986569876545679101 -4345678919879898989874322234567894396545679698767899989987678899549899878357895210975498765434589213 -3234589998764767998765433795688975985432798999545678978976567678998789989456976329864329886545678924 -2123459987653459899887654689789899876521287789637889767895434567897699896567899439643212987656789545 -4012348998432398776998765799898779765430345678923999858954323458924598798679978998768103499967899656 -2123456799210987655349889892976569864321239789414896545995512388912987679789467897654215679878998769 -3234767989629876544236999901965456975432398996325789234789623567899876569894356798785676789989999878 -5349879876536965432125478919873201989865467895459896545678934878998987456965267889876787892196789989 -6657989989545988541012367899954332399977578976567987876789656789987654349872123678989898943235678999 -7789197898656987652143456998765443478998989999878998987898767991299543234983234589999999654345899989 -8893256798767898763234589769976954567899899988989999898909898989398954123495665799899899985456798678 -9999345679878939876345678954989865779976789977899988789212999878987892034976786989798799876569987569 -2398959789989321965498789543596989893565679856798767678924598767976793156799899878587678987698765467 -3987899999898999876569996432345699921434798743987657567895679854865789967893998765436569998989876567 -9876789898787989987689876541236789210123987632399543458976798543234597899932398654323478909876987678 -6545698766545679998789998742345678921234596543988432357997987652123456978921239973212348919765499889 -9656987657324788999992129853456799534999987784976721236789999761012878967892398765343456898754343996 -8997898543213767893459012994967899649887898899885830245899989875434589658789999876774567999843212345 -7889909654104456932998923989898998998656569998764321346789876976545697545567897988965778987659101256 -5678919798412367899887899878789987899643456789965475457898765989676789432459976599876789499798932387 -4559899987323456789756998768678976789432345899876876568999876798987894321298995432987893298987943598 -3446789876535567897545698654567895678910196789987898879999989897898976410987989943698954987896894789 -2135678987676698976523987643789954578922989998998949989989994946789654329896778894569769876685789991 -4576799598989789765435698755678943458939878887899656997678943235998785498765456789999898765434567890 -5689895409499899876546798767789656567898766776789769874589432129899896599854345676789999984323456789 -6799974312347999987656899878998798678987655575899998765696541098785987987943234545689998543012347895 -7898765423456789898967945989439899889876543454689899876789652987654598996432101235678987652125456954 -8929876567867896789878939896323920998765442123456789987898543998767679999545237897789876543434587893 -9213987678879975698989498765434591239754321012367890198987659899978789987656346789896987656568998932 -2102798999989454987692349976596789998765672123478989999998798789989893498768458999995498897789679321 -3215699989994343598543568989987899879876543234679678899999987678999932349879569328789349998894598762 -4324989878943232349694567895698910965987654345789556789899976545989321278998678915678998769923459853 -5439876767893101298989678934999329877998765459994345698799875439878932567899989434589897543214598767 -7598765656964567987978989129878934989899887598943235987679876798767893459902496545698789654323459898 -8987654349895879896867899998769895798789999987899102398589987987656789567893987667987678965456967989 -9876543234789998765456789899658789989676899876778993459456798998987897678954598989876567896567899877 -8987894123678987654347896789745679877565789995467889569323459999698998999997699998765457899678998766 -7998963234589998743212345678934599965434678984345678998909567894589989889989789989874356788989987655 -6987654345678999854323489789125987654323459876289789987698978923679879779878999876543249867899876534 -5498775456789999765435678999939876543212598765178999876567899219798765665769899995454123456789764323 -4309886578996789986545789579899987654101987654068999985458965498999854523456789876321012347997653213 -3212997689345996797656895498789876543212398743256789876578976987987643212345999865432134469998754324 -4323498793239895698787976987678988665425459754345896997699989876798932101256895976654346567899765436 -5634599892109789999898997896567999776434769865456794598789998765679893212367914987765457878999896597 -6545987989997679896969898995458999889556878976567893499899987674398765324578923599876768989989987698 -7659876567896598765456789884367899998667999987878912987999896543219898545689894999989889595678998999 -8767985456789459876345798765456789098788998698989893976789789654102987676798789878999995434578999999 -9879894348992345987212349878567892199999769439396789765345698765233498987897678767898765323467899989 -5998763238943456992101299989678999989898954321245899854236789654344579398978569656789875412567999878 -3349654367894569894323989993989998776787895410123989969499999875696989299965456345698983101278987767 -2198767456987698765459878932199989545476789321234568998988921999987892987874321245897893294389876553 -9099876567899789986598767891019878234345679632345678997877890987998921976543210767896894989499965432 -8986987678998990297987758989997967101234789543489989876466789876789890987654321459965989878999874321 -7855698789987894379876545879876543242945678964568998694355699765776789998765432368979978767999976430 -6543239899876789567965434567989854356856789978789998543234988654565678999986543459998767656789984321 -7684102998775698979854323658998765678967899989895987654349876543334567899898654567899656345678965432 -9873213987654567898783012349999976789998999994954598765656988432125678998789765679998543234569876545 -8764329896543456789652123456894399898999598995963699876767899563234889687678976789987654347678987676 -9965498765432347896543234599943201967895497789892987987898987654345796444569997998798987656789798987 -9876789887654556987754345988956912356789345698790976599939698765456789323458998987659198767897679998 -8987898998765677898965459767999895457891234987689865432123569976887893212357899896541019878955567999 -7698997999987898949996569856989789769910149876545954321012397987998984623768956789432199989543456789 -6549656891299999234989679879878678978921298765434595932124986698999876544878949896593989995432345698 -5432345993345692129878989998666569989432987655423989893239975549998989656889238789989878954321239987 -9940137789456789998767899986543458997545698543210978789398754234976599867990145699768767995634398876 -8893235678967899876656789997632567997656987654599865698999543145895445978921956798654356789785977645 -7789545789878997985545679876541245689767898785987654986987658656789329989439898998543267899899864524 -6678996799989876544234567989710355789978989876798765975498868787898998798998789987654378912998753212 -4569989989993989734146456797651234567899878987899978994309989898957987657895678998767459901979865301 -3656978878921298921012367898732345778998767898934989983212397999345799546234569999878567899869875412 -2349865467932987432156778929843656989987656799323999876723456789239987632128998989987678987656996523 -1098954359899876545245899219974768999876545678909898765436567890198997654267997878998989298543498434 -2987643234767987656345998998765689998965434567898769986747698999987789795459886767899299129432599545 -3499632127656798965456987899896795987654323689998656987656799998765678987598765656789198998921987656 -4598532012345689876567896543987894599865464567896545799798899987654569898929854348899987987939999777 -5987647123498991987789997674698923459876587678965434599899999878543234789439765249999996876898998989 -6987656734567890298892398789789212355997898789534123989912398765432123678998764345678975575947896597 -8998987845678979999901239899899201234798919894321019878901498754321044589989875476789864433236795456 -9349598956789567899919348987978929395679323989535199769899598765432123799877986789897653210145689346 -2102349767893456998898967896567898989798939978945988956798999876543434569766797899999754323234896556 -3212459879912349887767898923458997678997898767899877546587998989754545678944698989998765434345789967 -4343457989101249786656789912349876569876798954098765323456987899987678989433569678999887865456799878 -5454599995212998655545679893998765478965987543129876454677896789398789894322454569899999976587898989 -6569988994329877544434598799899876567894987675434987565789965689239898765410123698789898987679987695 -7898877889934965432123987688789987678923498786645698976897654578999979876321245987698767898789876534 -8997666578895696544019876577678998789012569897896789987976543467989763987443456798597656789899954323 -9987543467789987652129765456567899892123478998998893498989432345678954597556567989432347998989965912 -3696542576689998543298654325458999943234569879679912349998651234567899998667679878521238987678899893 -4597321234579987656987543212347898659349698965569101299876543345678988898778798764210349878569789799 -5696510123467898799875432101236789898998997973468993989987854697789876789899899875321459765437677678 -6989423236567989989999543212345678987897876791569989876598965789899975698976945976732998754326534567 -9876534345678978878898765423556789256986745989878978987679876789999864587895434989549876543210123456 -5997845656789769867789876534667896347894331878989568998899997891298783475689923597678987656921434587 -4398659867896546745678987865778965459973210168995467899998798920197652323457895989989499869896545698 -3209897979987631236789998989889976569865322347894349902987679921987541013456789379892345998789676789 -4399965989999746345678969890997987678976454456789278919996567892986432124567895266791259997679787898 -5989654598899975458789656791976598989989876767890167898765456789196543235678954345890198786568998967 -9878943656789876567896545689765429998795989979921256789876367899297654346789865676789987676467899456 -9767892545678987678967434578965312989654393989432345678987245678998765457899876797899876543344568968 -7659901234567899789654323489986329876543212396545456789994346789019876567901987898998765432123679879 diff --git a/src/AdventOfCode/Year2021/Day09.hs b/src/AdventOfCode/Year2021/Day09.hs index 1a9cb1b..71dee61 100644 --- a/src/AdventOfCode/Year2021/Day09.hs +++ b/src/AdventOfCode/Year2021/Day09.hs @@ -1,18 +1,20 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2021.Day09 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import Control.Lens (ifoldl') import Data.Char (digitToInt) import Data.Ix (Ix, inRange) -import Data.List (sortOn) -import Data.Map.Strict (Map) import Data.Map.Strict qualified as M -import Data.Ord (Down (Down)) -import Data.Set (Set, (\\)) +import Data.Set ((\\)) import Data.Set qualified as S import Linear (V2 (..)) -import Text.Trifecta (Parser, digit, newline, sepEndBy, some) +import Relude +import Relude.Extra.Bifunctor (bimapBoth) +import Text.Trifecta (Parser, digit, newline, sepEndBy) type Model = (HeightMap, (Point, Point)) @@ -23,10 +25,10 @@ type Point = V2 Int type Height = Int main :: IO () -main = $(defaultMain) +main = $(defaultMainPuzzle) getInput :: IO Model -getInput = parseInput model $(inputFilePath) +getInput = parseInputAoC 2021 9 model example :: Model example = @@ -38,14 +40,15 @@ example = [9, 8, 9, 9, 9, 6, 5, 6, 7, 8] ] -partOne :: Model -> Int -partOne = sum . fmap succ . findLowPoints +partOne :: SimplePuzzle Model Int +partOne = asks (sum . fmap (+ 1) . findLowPoints) -partTwo :: Model -> Int -partTwo modell = - product . take 3 . sortOn Down $ - map (length . findBasin modell) $ - M.keys (findLowPoints modell) +partTwo :: SimplePuzzle Model Int +partTwo = + product + . take 3 + . S.toDescList + <$> asks (liftA2 S.map findBasinSize (M.keysSet . findLowPoints)) model :: Parser Model model = mkModel <$> some (digitToInt <$> digit) `sepEndBy` newline @@ -55,7 +58,7 @@ mkModel heightses = (kart, bounds) where kart = ifoldl' (ifoldl' . go) M.empty heightses go y x kartet height = M.insert (V2 x y) height kartet - bounds = (fst (M.findMin kart), fst (M.findMax kart)) + bounds = bimapBoth fst $ (M.findMin &&& M.findMax) kart findLowPoints :: Model -> HeightMap findLowPoints (kart, bounds) = M.filterWithKey (isLowPoint (kart, bounds)) kart @@ -63,11 +66,12 @@ findLowPoints (kart, bounds) = M.filterWithKey (isLowPoint (kart, bounds)) kart isLowPoint :: Model -> Point -> Height -> Bool isLowPoint _ _ 9 = False isLowPoint (kart, bounds) point height = - all ((height <) . (kart M.!)) $ - neighborsInRange bounds point + all ((height <) . (kart M.!)) + $ neighborsInRange bounds point -findBasin :: Model -> Point -> Set Point -findBasin (kart, bounds) lowPoint = S.foldl' go (S.singleton lowPoint) (S.singleton lowPoint) +findBasinSize :: Model -> Point -> Int +findBasinSize (kart, bounds) lowPoint = + S.size $ S.foldl' go (S.singleton lowPoint) (S.singleton lowPoint) where go seen point = let neighbors = S.filter ((< 9) . (kart M.!)) (neighborsInRange bounds point) \\ seen From 43137d275d0d619e131a8821c3c7880248544d53 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sun, 23 Nov 2025 00:16:38 -0600 Subject: [PATCH 41/91] refactor(2021.08-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2021/day08.txt | 200 ----------------------------- src/AdventOfCode/Year2021/Day08.hs | 80 ++++++------ 3 files changed, 41 insertions(+), 241 deletions(-) delete mode 100644 input/2021/day08.txt diff --git a/VERSION b/VERSION index 197215e..1c21a50 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.63 \ No newline at end of file +2024.7.2.64 \ No newline at end of file diff --git a/input/2021/day08.txt b/input/2021/day08.txt deleted file mode 100644 index ed991d9..0000000 --- a/input/2021/day08.txt +++ /dev/null @@ -1,200 +0,0 @@ -daegb gadbcf cgefda edcfagb dfg acefbd fdgab fg bdcfa fcgb | cdfgba fgbc dbfac gfadbc -bdfc dcbegf bf egfbcda gebad cfgaed bfe edfgc aegfcb gebdf | fb fb bcdfaeg fcgdeb -cebdgaf bfcd gceab bf bfcea gceafd ecdfa fegdab bfcade fba | dfcb dagfbe fbaged bfa -efabcg aegcdb fgaed fac dgafbc becf eadcgbf aegfc fc cagbe | ecgfa agdef eagfc gdceab -fcdae cdeabf fga gf gabfde cgadb gadebfc cgfe aegcdf afgcd | fbgadce gadefb fag bafegd -gecadbf bgc dacgf gaecbf cbeda dbfg bgdca bg bafcgd gdacef | cdgfa fceabg dgfb dgabc -fbecdga gcdbea cegab fc cafe cfg ebgdf cbgfe afbgec bagcdf | feac acegb bfagce gcafbe -defgca fbdcga dbcfeg ag dabg cfagb dbcfg afcbe cga abgedcf | ag gefcbda afecdg ga -gfecd cabgde bdfgcea ca cdfbag egadb bgfaed cga egcda acbe | ac ac egfbacd cdage -adefg aecgd bfgae gfd dcgfea fd fcde dcfbag cdbega ecadbfg | gdfea df fd egafb -eafbg bcefad abfcge bdga ad fgade bdafeg agefdcb fecgd dfa | cgbdeaf ad fdgec da -fea fbadgc bagfc bgeafdc aegbd gbafe gcfe fagecb fe fbdcae | gefc dbfaceg feabg ef -febda bacfd bagedc eadgfb dcb deacbgf abedcf fcabg fdce dc | bfcda cd dcfgbea efbda -ab fbcea abc fedgac debfgca cfdea afbcdg ebad bfaced gefcb | abc abde adbe acefdgb -afbedcg fcbegd aecbfg dfgab cdae cd dcf adbcf fabdec feabc | begfcda dc bfgda debgfac -abdfge bef cgedfb eagfc bf geacdb aecdbfg gdbec dcfb gbfec | fbcged bf fgabed dfbc -gfacbe fegcdba fa acdf cgebfd fag gbaed acdfge fdega gdecf | cfda adcbgfe cfegd af -edc bgecad gfaced deacb de gdfcbae aecfb gabdc acdbfg egbd | gbdac edc cefdag afegdc -bagdf cagfb acgbef dbfcag egbad bgecafd bdecaf daf df gcfd | bdfag bfgad fd cfadebg -egd dcbgfe gecfd agfbdc egfb ge gcbeadf deafc bgcdf cbegad | edgcf ge efbg ge -geadcf bfcda ab abd dagfc dbcfe eabdgc agfb bfegacd gbcadf | gcbfead bad dab abgf -ecbgda gfc gfbe bafceg gf ecbfagd cbfda gbaec daefcg cfbag | afdbc fgc fg dcaefgb -degbf aecfdb aced adbef gabcdf ea aef beafcg fbedcag dfabc | fae fae fdegb eaf -fbeacd bfe bgfadc ef eafc fdcegb eacfgbd fadeb edagb cfbda | fdegbac ef dbfcge fdacegb -eadgfb ae egcfb cdfab geca cdefbg bcafe eba bcefag abdefgc | gcae bea abe afbce -fgace bef dcbfa eb dfcbeg efcab deab efdabgc bdfcae dbcgfa | be feb becfda aebfdc -abfd da gad egbfd dbgeac adgef gecfa daebgf cfdbge abecgfd | ebcgfad gad gefca bfda -gbaefc geabd gbfeadc ebgadf feb abcfd fe dacbge bfdea dgfe | ebfdgca fbe feb gcdbea -ac edacf debacg acbf gcfed fbade cea afbdce edcbfga gfdbae | aedbfg abecfgd dfabecg dcabeg -fabeg dcfgba deacbg bcagf adbgc caf gefcabd fc dfgc edcfab | afbge cdfg bcedfa cgfd -fgdbae dbfeca gcbef egfdac edgfa cd cde dgaebfc cgad fcdeg | cde ecd cd eadgfc -ga cfdea egfdbc gefad acbegfd geba abfgdc adg gebfd dafgbe | dga dfega egbdcfa gdbfe -efcda dfgbea egf fdgab fbedcg ge bdcfga aebg edafg acgfdeb | fbcadg eg eg ge -defcg gdcbae gfcbde ace afcg ca abfed cfebgad gacfde faedc | ca ac ace bcafegd -egfdab bedac dbecaf cefd fbdac fagbc dbcgea fd adf bdgcaef | agbcf efdc cfadb dfce -becdag eagd cgbed gdefbac agbcd bcdefg cfbeda acd ad gabcf | gdebfc ecadbg cgdfeb cbgad -cdabg bedgac daec afbcgde cabgf dcb dc bagde ecgdfb febdga | debga dace bdgfeac cdagb -bcgeafd gfb ebdcfa cbeagf bfcea fg afebg dagbe gfec bgdafc | cfge fegc gabef dgeacbf -fdagecb fed dfabgc fe gabed bdecfg cgfe ebdfca cfbdg egfbd | gcef fgec dfe fde -bfedc ac cfdbae gfbae acb bgfcde agdcbe facbe gfaecdb dcfa | bcfea bgdfeca efcbgda dcaf -aecbdf eabgcd cb geacb ecb dcbg fabeg adegc fdcgae gbadfec | cafdeb efgba bc bc -cfebag gcfbd bgadc fcegda dag beacg adbe ecgdab afbcedg ad | deab bacedgf gcefad fgcbd -befdac gbdfca adebf dafcb edcafbg def edagb bcfe fe dgfcae | efd fcadb dgfbac ef -bfcage dcbg edcbag gcadbef bc ebfda agcde deabc bca gdacef | fagbedc cb cbefdga dbgc -eagfbd ebgafc abdcfe ed efgdb gabef fde geda degfabc gdfcb | gead feabg aedg dfe -bcfdaeg cbedaf fgc gacfed eacfd gc bgfde aceg cedgf cdbgaf | cgf adefc cgfde dgfbe -cadgbef gbaedf acebf efdgcb bdcgf fcbeg bcadgf eg gef cdge | fge efbdacg faedbg gef -agdec gadbce ac cae acgb dfegab ebcdfa agebd fegcd gcebadf | aec bgaed ac ac -beadgfc ea bceag fgbaec gbcaf cedbg ecaf dbeagf gea bacfdg | ceaf ae caebgf cbfdeag -dfa fgadc cgefd cdfebga cebdfa gdabc af agfe gcbfed acefgd | fa egaf fbecdg fa -fecbd fcgbd fdegbc deb abcfdg aegbdf cged ed aebfc bdefcag | gdcbf cedbf bed dcfgeb -gfdec afbgedc bedga bafe gbfed bdf gfbaed bf gdcfab cbagde | bfae gdfeab bagcdf fgeabd -cabe be efb decfgb agfbe edfgbac badfg deafcg cgfabe gaecf | be efabg dbafecg eb -fbce agcdebf dcaefg dcgbaf dfb beadf cadfe bf fcbdae bgdea | faced dfceba adebg bf -cagdbe agfdec dfega dgcf fabed gafec debfcag dg adg fgaceb | acbdge fdgc bfacge ecabgfd -afce gebdcfa cbdage gfadec ecdgf fdbagc cf fgc bgefd adegc | bdfgac cf gabcfd cbaegfd -edfacb cdaeg adgf gaebc agbdcef ead dfcage da degcbf egdcf | dgaf da fegcdba acedg -ab bfacgd agdeb ebadfg adb defgcb gaedc dagebfc gfdbe eabf | beaf baedg ab dba -fcag gdcfeab gebdfa af bgdfc abf acbfd cdfegb baced abgdfc | fa gafc fab gfca -gf cdeabfg dcbfe edgba bcgfde ecfg gebdf fgb fdcabg cebadf | edbacf dfgeb gbead fbg -gfbade da afdbg dag gbdef fade beadgc fdbgec cfbga cfeabdg | ad adg fbagd fegbd -fdcbea dafbecg ebcfg eca aefcb fcadb ae cdefag dgacbf daeb | ae aedb ace eca -ba dbga gbacf cab aebcdfg fgcad caedfg febcda adfcbg egcbf | agbd ba afebdc badg -bgcef adfg dfegbca dacge abdfec gadebc af ecgaf gfaedc eaf | efa gdaf eacfdg cfgadbe -bfa gcebaf gbfdaec ebga efgcb acbdef gcafd ab dfbgec gfbca | ba fgebdc bcfegd dcafebg -befagd fbgadc cebdgf acegd bdc cb bfgda gdabc bagecfd cbfa | dfgebc cb fcab cgaed -gadef dfgbac cfeabd abdge gab dcgaeb adceb cbge edbgacf gb | aebdfc gab efdag agb -gfcde fgead ag agf gacd debfa gafcbe facedg gdbfec cegafdb | fga ga fga cbefag -gfaed abedgf edbac cfabge egc bfdaegc cfgd fegadc dcgae cg | gacedf cebfga cafgbe ecgdbfa -adefgc dg deg cegbad eadbfc abcefgd gdbc daecb eagfb adgbe | ecbda acbfed dg ebdga -ebfda bdgcaf cbfeag gbdefca ecgfa fdc dgce egcadf cd cafde | bcfeagd aedfc gacebf fcd -bdcgf bgecfad deaf feabgc ebgfad adfgb gadeb fa afb bgdeac | fa bfa dgafebc fa -dagfcb fcbgdae adb cbea cbdgfe dfega dabgce agdbe ab gdecb | caeb dbcagef cgbde gcdfba -fcaebg fdbgeac bcg bg efcgb ecbfa fdbace abgced fbga edgcf | bagf afbg gb befadc -bdfc cdegb fgecb eabcfg db egdfcb aegbfd deb dgace gfcabed | fdaebcg ebd bd bd -ba ecbfd fcebgad cdaeg adbce fbda fecbag bca cfedab cdbegf | dbfa febgdc cab bac -dgbcfea cea ebgad cgef gdeafc ec agdcf dcgea dbagcf bcaefd | ec aec eac dbage -dbcfeg ba abedfc fba dcgfa bafdc efbgac afcdgeb ebcdf daeb | ebadfc bdea ab baf -gcdefab gd fbdag aefgb gade dgb cfbgde cfbda febgca bgefad | gd dg cfbedg dage -ebdg cfedg gebcfa eb ceb bdgaecf edfcag dfbec gfedbc fbdca | be bec gbde cdfega -dgecfa dab adbce ecgbd gcbfdea fcbgda ab aefb decaf ceabdf | ecdbafg ba adfcbge dgafcb -acdbgf baefcg dcea dfegb edbcg cd dcg abcge dbcegfa gcbdae | abdgefc ceda cdg deca -gabef fda afgcbe gabd ebafd gacedf ad eadgfb decbf bgcefda | edcfag adf cagdfe bdefc -be cafdbe gcbaefd ebf dgabcf baedf debc fdbac eafgd agecbf | cadfeb dbce dfcbae efb -gedf gadbc ed fbaegc efacdb feagb degfacb gaebfd ade dbaeg | fgabed cbgda gfeabdc ed -agde dgcebfa fdbce badcgf dgfaec feg ge fgedc gefbac dafgc | ge geda aegd fedcb -dcagb gfdbc egcdfba fedbca cfge fedcb dfbceg gfabed bgf fg | febacd edcfb gf abgecdf -dabfecg dgefb bafgdc aedg efabg gd fbegda aefbgc dgf efdbc | fdecb cebdf gfd geda -bfacg cgbaef cf gcf fdegbc adefbg feac gbcda abegf gdebafc | dgafceb efdabg ecgfbd gcf -gdbcaf dcabgfe becg cb gebfa bca gfdbea efadc bfecag fbeca | gbce dcfbage ebcg bcge -dgbaf faedbg abdgfce gabcd dbf gefd eacdfb faebg bcegaf df | dbf febadgc dfb fdb -fcaegd db dcbe gcdbfe bfdeg efbga cadefbg dgb fedcg acdbgf | db efgbdca fcbdgae gdafbc -gbacdf gafcbe dagcb dace ea dbgea cbdgae aeb debgf cfedbga | gbedac dacbge gaedbc afgdcbe -fgceb abg badcfg dbaec feag ga cebagdf bdcfge agbce cefabg | feag degfcb acbgfd cagbe -dbfgae fgade cgefba aecdbgf bfg bf befgd dbfa bcgde cedgfa | bdgec fbgcea dafb gfcabe -ecgbf afgce gcbdfea ag fcadge dacfe bfacde eag dcga dgafeb | feadc acgd cdaefb cefbg -cdabf gbdcaf fgceabd efa ae aecd fagebd ecfba cbgef eadcbf | eadc ea bgcef ea -ega efadg eg bgef dbagec cbafde ebgafd dfebgca adefb afgdc | adegbfc ge eg fcdga -ecadgf egdcf fdcbga fda afec fgaed eagbd dcgefb fa fbeagcd | daf fda gfabcd adbcgf -gabef cbefa egabfd gbe badecfg agedf ecdafg gb gbda ebgdfc | gdba aebgf egb fecdga -afcbe dcbae db efbd egcad bafcge gcbadfe dgcfab bcd dcabef | acbfe bd dbc cadbgfe -dfcgabe bcafgd cafbed dgabe gbacd dae de egcd bgdeac gfbea | aed efbdgca de cdabge -abd adcgfe bcdg bcdaeg adbec cegafdb agcde fceab adfebg db | deabc gedca db bad -bdf efbagcd cgfde bfeg dfgeca bdfceg cgdfb agbcd bf dbfcae | fb gefb cefgd bf -cga bgdcf ac bcgfa agbdfce gdabfe gcdabe bfcaeg gafbe eafc | ceaf ca bcfag faebg -gdfb bd dbc adfcbg facbeg eadfbcg abgcf dbcga fecdab gceda | bd bagcf caged gbcfeda -gabe fcdeab gbdfc fbgadec ebadf edg ge bfegd dfaebg dafgce | fbdage feadb bfagdec bgcdeaf -aegdfb bcf cfbed ebcdgf cb cbdg defgb gcadefb fcgeab afced | fcedb cb bc cabefg -cef fecag fdgbec agefb ce geafdb dbgceaf egcfba beca gdcfa | agfce aebgf beac fec -bafdc dgbc bgcfad egafc dg fdg cafgd fbgdea cfgbeda cbdeaf | gfd fcage gd dfg -aegf gbeac fg gdfcab agfecb bgefc bdgace bgf bfcde dcabfeg | dcgabfe caedbg gefcba gefa -dcgab acfbed acfdgb gefbdca cbgae cfbgd ad gdfa bda bfedcg | da bafdec da acebg -caf dafg cagfde fa efgac abcfged bcfdae fcegd gdefbc ecbag | af acbeg cabge fadg -gfade gaefdc bagecfd dbfeg eacdfb ecfda fgdbac aceg ga gad | bcaegdf cgae bdfaec gda -cbe edcbag ecfad dbeacfg abedc gcdbef eb agbfcd bega bgacd | bcdag gbdefc ecadbg geab -fdcbega gaed fdbag fdbgea ag bag gbdfc fcegba edfba dcbefa | gab bafecgd bdagfe fbeadc -daf ebcgaf edfb gdeca afdgbc dfega bgafe gcdaebf dbfage df | fd fdbe gbafce edfga -gebfd eadbg bdcagef befcag df fde fbcd cgefbd gcdaef cfgeb | bgcef abedg afbcegd dbega -gdcbe cbadgfe egafd agbc abe ecabfd cdbfge egbda ab cdebag | bdgace egfdcb aebgd fgade -dbc efbad dgeca becda ecgb ecadfg cb gbdacef cdbfag egcdab | bc dcbafg dacgbe faebd -gbafe dgbefca gdbfe fa ebgcdf bcgae bdaegf fga fead bdfcga | befacdg fa af efad -feb gedbaf beafcgd fged bacgfd gbdfa dcbae caefgb efdab fe | fbdea gfabd bceda bef -efg ef fagdceb fbagde dabfg gadef cadgfb defb gdeca afecgb | bceadfg fe cfaedgb abfdegc -bafdc gabfd facgbd cbgd bfeadgc eadfbc acfegd gdf fbeag dg | bgcdfae faegb cedbaf dcgaef -cadeg cdgafe cabge cbaefdg cgdb bfeca bag cbaegd gb dagbef | afebc cefdbag gba bga -bce gdbcef fcebd dfegba cagbef bc fcdgabe dbgef dbcg ecdaf | bdgc cdafbge cbe bgdcfae -afdcbge fcgdb gabf dabgfc dfcab bgd bg fedcba bedagc gdfce | bgfedac gb gb bg -fgacbd bedgfa dfgbec ebgda adbce adfbg gfae eg bcfdgea ebg | ebgdcaf beg acbgfde edcba -fdgb bdaec befda bf cbefag dcebafg dagef bafedg bef fgdcae | fb dgfb bdfg efgbadc -cfebga fce beac gcafb egcbf gcebafd bedfg ce adbfgc fedacg | ec beacfg egcadbf bgefd -begfda bfcg ecabdgf fb gdfbca cbeadg dbf acfde bgcad abcdf | eagdcb fb bdgca dcafb -cadgb abd bgdfc gadf ad dfcgbea bagdcf gceab febadc cfgbed | acbge bcfgad cgbea bgcdaf -cbdfga bdecf fgca gbc gcbdea cgdbaef abfdge dfcgb bafdg cg | fadebcg fcga cfga cbeagdf -dbefagc fadbe gdbca cgfa fg bgafd bfdcga bgf gadecb dgcfbe | cgfa gbfedc gf dgfebac -ecfgba fbeadc bagfe bgac ac gfabced bdeagf ecgaf dfgce caf | gcab ca cebafgd adfgebc -gba gdbace gcea gabcd cbegadf abdefg gbcdf bfcdea acbed ag | bga ag gba gfbdc -gfdce gcf aecgfb fegda fcdagbe dfbceg cg acefdb edfcb dbgc | gdbc adcbfge gc deabfc -dcba bed cedfga fdeab bcfdge dbfagec cdebaf fabge db eadcf | edb bdac bd edb -dcgb cfgae cdeba cedfab ged aecdg gd acbfedg acdgeb afgdbe | dcabef gd debac dg -fecag bfedcg egf ef edfa geadbc dfbagec dcfeag acgfb caedg | dfae cfgab fe aecgfd -degbca ebadg gafd af gfcbe bfagde fea cgfbade bdeacf gfbea | gdaf fcbge gfabedc fbegc -dgcfa abcedf bcegad bedg cge fagbce caegd ge dfgacbe bdeca | gedb afbgdce aebdc ge -befad afdcb fcbdga bacfged cfb gafc cf dbagc cdbage ebfdgc | efbda cadbefg dgaebcf bfc -afgecd fgaec bf begfca bgacfd efab gcbed fbc bgecfda bgfec | fcb bfae ebaf edfbagc -be afbced agcde cfabd bed dceba cefb gafbcd agedcfb degfab | ecbf fcbe deb cfgdaeb -ecgadb cebfdg face egdfac gfe gdeaf fe egfcdab aedgc fagdb | acfgbde afec fe acegdb -fead adbegc cdgefb adcgef gbcaf bgfeacd gedcf da dgafc adc | bgfdec facgb adef cgefd -baedfcg gd gfcae efgbda bagd bgdefc fdg ecafdb gfaed edfba | gefbdac gbda fdg ebdfga -cbdafg bgfec efcdbag ed gdcef cafdg fde dfaecg aced efagdb | def ed aecd adfcg -fae cfeba gabe dcbfa ae fcaedg gebafdc dfcbge gcebf acfebg | fbcda egacdbf eaf afe -cgaf dbgfa cdg gc bacgd bdfacg aedcfgb bdfgce aedbgf badec | dcgbef bdcfag agebdf fdagb -bdf acgedf dgcfa gafb adecb fadcbg fcdba cfaegbd gdbecf fb | fb abedc fbadc gafb -cdbegaf dcf afgdbc agbdef cefbd dbefa afce baedcf debgc fc | cf fc ecfa acef -db fgcbde dfcb bfged dbgcea dgbecaf bdg afdceg gafeb fgedc | db ecfgd cgadbe gdfacbe -caedgbf cgd gcfbe cfdeg fdcbag dc bedgfc dfega ebcfag bced | cadebgf ebcd cgbefa fegabdc -ed adfbcge bfgdac edac dcefgb abcgd gadeb dceagb aegfb dge | feagb baefdgc egabf aegbd -efdcab gfbead cf begdc fcbde acfe afbed dgbecaf dagcfb fbc | cgaefdb cadgfb bfecd cgbed -agbfcd bdfcaeg acdbg cdebg bed bgcef de geabcd bacfed gdae | geda gcfeb gade cbdefa -bcaegd bcd cbfge afbd gfcbd gabfcde db gecdaf dgafcb cdgaf | gfadc afcbgde dfacge gdbceaf -acfdeb fgabd dfb gdcf gcbaf bgfcad aegbfc fd gbecafd bgade | fbd cfgd bdaefc gafebc -bedgc dgceba gdacb aebg ebd bdcafg cadfbe ecdfg eb dgecafb | dbe geba be decfg -cebg geafcbd ecfag gfcda dabefg cfgaeb ce efc bedcfa abefg | ec ce bgec agcef -fbgde bgfec cb cfaeg adbecg ecfdgb bfdega bcfd bgdacfe ebc | ceb gabedfc dcfb eagfc -degfa fceag aegbc gefcad dcgfabe cfad fc fgaebd dgbcfe fce | agecb cf cf dafc -febdga gabec abgdc aegdfc adgcf cgbdaf bcfd bd beacgdf gbd | cfdga dfabecg dbcf bcfd -gabce dacbge ebg eacgd fegdba baecdgf cdbg fbaec gb edfcga | ebg degcfa fdeacbg geb -agecb begda bfdae deafbg adgcef fcdageb dg dbfg edg fecbad | dbeafc dbfg gd fbgdace -cgfdab efabgdc eagbdf ed bgdace dcegb dgcab befgc deca dge | ecad ed dcea agbdc -bdfce dbfeg fc egfbad fbgc dcf fdgbec ecgafdb cfegad edcab | fbcg gefbd fc cdf -gdb gbead cgbdaef cabd aegcdf geadc bdaceg fagbe dfbgce bd | aedgb cbfgade geadc cegdfb -bgefdca aefc gdafb bgdcae ac dfegc gfdbce dgaecf fagcd dca | ac cda adc gebcafd -gdbcea fadcebg cebfad af cedfg abfcgd daf fbae debca efcad | faeb gbcaefd facde adf -daebcg fgbeacd dfegcb cbfagd acbde ecbfa gade ed bdcag cde | bcdae bagcdfe cegafdb gcdfab -bgcedf dfbec efagcd adfbg afdceb ebagcfd dbgfe bgce eg gde | gceb gaecdbf dbfge bcdeaf -edbca cbdfega fceg dcf fc dfbge fdabeg fdbgec bdgcaf fdebc | dfecbg fc cbaed fc -fgdc fdaeg cdegfa dga cgaef bgcaef ecfbadg abdef cgeadb dg | adg gda aecbdg gda -gbce edgbfac dcgfa bg adecfb bcefgd debgfa gdb dcfbe cfbgd | gceb gecb gb gb -fcgebda deafb dgb gdefb bcgf cdefg bdefcg gafced bg ebcdga | bg cgfdeb gedfb bg -deabc cfgbe bfa gaedbc afdc dcegbaf eafdbg fa afcbe daecfb | dacbef fa fa abf -feg degcba gbade gdfcea gacebdf fbgdc bafged beaf ef dfgbe | ebfa fe fegbad ef -ebagf abegdc befgca dg bdefc gdbefa dgebf agebfdc dbg dfga | dgaf gd afcbdge adfg -defbgc gbd degfab cfbge fbcdg fegcadb fcdag cdbe bd fegabc | db gdb cfebg gdb -cbedfga gefac bfa ba abdg efgbd afecdb efgab gfbdea bcegdf | debacfg ab ab ba -gfbdeca cebfg abg gdea fcdgba ga eabfg ebadfg fedab ebcafd | cgdefba ga dfcagb gebfda -caegdfb bcdgfa ecadg bagefc cebga edcb dac gcebad fdgae cd | cedb bcfgda cad adegc -egdcaf ged gd fdeac gdfc efadg dbafec becdfag cgdaeb gabfe | edagf dgfc gfcd gd -cbeafg baedcg bedcgfa gdebf abgfd dbcegf edg ed cdfe febgc | de cbgafe gde acgfebd -fcd bdacg fd ebdgfc ecagbf gafcde cagdf fecga eadf gebcafd | fd ecgdabf df bfcdeag -cb agefbc aegfbd dgbc eacbd ecdgba degab cab fdgceba eafcd | fdabgec cgeabf cb cdeaf -ebacdg cbd badf bdcfe db efbadgc abfec aebfdc faecgb efgcd | db dfab dcefg ecafbd -daefgc bdcafe fcbega bfcda bgfcdea dcabg fbed bafce fdc df | dbef df acfgdbe cgdab -caefd fcaebg bdcfe afdge geafcdb caf ac dagc edgafb agdfce | edcgfa cfa dcga fac -gcfedb daegbc bcfad gedcf fgecda ae eda agef gadcebf afdce | abgced fgecd adecfg ae -gf aebfgc cabef cbdge aegfbd acfg gfb ecdbfa fdcegab bfecg | gcfbe bfgeca gf fgdaeb -baegf cebaf bfcade bga bfacedg bg egbacd bcfg fcbeag gafed | cefba befcga fedbgca geafd -fgcd fg adebfcg daebg gdfba fdacbe cbadf gfa gcafeb gdabfc | ebdag fcgd afcbd gf -bdfegca ae aed ebfgdc gbdae cdaefg gedbf gbfdea ebfa bcdga | dea dcbegf dfebag cdegbf -eagfdc bdfe geafcdb bf afegdb fdega agebf bgcae baf gcdbaf | baf edcgfa bf cabfgd -fagbcd bfdac bedacg fgcb bc cba acfde gfabd afbdge fdacbge | cbgf bc bcfgeda bcgf -bgafcde dgc adfgcb bceadg fecda bcage ebgcaf gdeca gd gbed | bdeg cdg agecb acbeg diff --git a/src/AdventOfCode/Year2021/Day08.hs b/src/AdventOfCode/Year2021/Day08.hs index ba26196..06a3a92 100644 --- a/src/AdventOfCode/Year2021/Day08.hs +++ b/src/AdventOfCode/Year2021/Day08.hs @@ -1,72 +1,72 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2021.Day08 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import Data.FastDigits (undigits) -import Data.IntMap (IntMap) import Data.IntMap qualified as IM -import Data.List (permutations) -import Data.Map (Map) +import Data.List.Extra (sumOn') import Data.Map qualified as M -import Data.Set (Set) import Data.Set qualified as S -import Text.Trifecta (count, oneOf, some, space, symbol, try) +import Relude +import Text.Trifecta (count, oneOf, symbol, token) main :: IO () -main = $(defaultMain) +main = $(defaultMainPuzzle) -partOne :: [(Set (Set Char), [Set Char])] -> Int -partOne = sum . map go +partOne :: SimplePuzzle [(Set (Set Char), [Set Char])] Int +partOne = asks (sumOn' go) where go = length . filter (`elem` [2, 3, 4, 7]) . map length . snd -partTwo :: [(Set (Set Char), [Set Char])] -> Int -partTwo = sum . map go +partTwo :: SimplePuzzle [(Set (Set Char), [Set Char])] Integer +partTwo = asks (sumOn' go) where go (patterns, outputs) = - let displays = problemSpace M.! patterns - in fromInteger . undigits (10 :: Int) . reverse $ - map (displays M.!) outputs + undigits @Int 10 + . reverse + $ map ((problemSpace M.! patterns) M.!) outputs getInput :: IO [(Set (Set Char), [Set Char])] -getInput = parseInput (some display) $(inputFilePath) +getInput = parseInputAoC 2021 8 (some display) where display = - do - connections <- S.fromList <$> count 10 segment - _ <- symbol "|" - output <- count 4 segment - pure (connections, output) - segment = S.fromList <$> some (oneOf "abcdefg") <* try space + (,) + <$> (S.fromList <$> count 10 segment <* symbol "|") + <*> count 4 segment + segment = S.fromList <$> token (some (oneOf "abcdefg")) -- | A map from a set of ten signal patterns to a map from signal pattern to digit. problemSpace :: Map (Set (Set Char)) (Map (Set Char) Int) problemSpace = M.fromList - [ ( S.fromList $ - (map . S.map) (segmentTranslations M.!) $ - IM.elems referenceDigits, + [ ( S.fromList + $ (map . S.map) (segmentTranslations M.!) + $ IM.elems referenceDigits, M.fromList [ (S.map (segmentTranslations M.!) signalPattern, digit) - | (digit, signalPattern) <- IM.toList referenceDigits + | (digit, signalPattern) <- IM.toList referenceDigits ] ) - | permutation <- permutations "abcdefg", - let segmentTranslations = M.fromList (zip "abcdefg" permutation) + | permutation <- permutations "abcdefg", + let segmentTranslations = M.fromList (zip "abcdefg" permutation) ] -- | A map from digit to canonical signal pattern. referenceDigits :: IntMap (Set Char) referenceDigits = - IM.map S.fromList . IM.fromList $ - [ (0, "abcefg"), - (1, "cf"), - (2, "acdeg"), - (3, "acdfg"), - (4, "bcdf"), - (5, "abdfg"), - (6, "abdefg"), - (7, "acf"), - (8, "abcdefg"), - (9, "abcdfg") - ] + IM.map S.fromList + . IM.fromList + $ [ (0, "abcefg"), + (1, "cf"), + (2, "acdeg"), + (3, "acdfg"), + (4, "bcdf"), + (5, "abdfg"), + (6, "abdefg"), + (7, "acf"), + (8, "abcdefg"), + (9, "abcdfg") + ] From 70b86581b62dad2ac6c51e79cd74faefea2c819a Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sun, 23 Nov 2025 00:47:55 -0600 Subject: [PATCH 42/91] refactor(2021.07-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2021/day07.txt | 1 - src/AdventOfCode/Util.hs | 9 +++++ src/AdventOfCode/Year2021/Day07.hs | 53 +++++++++++++----------------- src/AdventOfCode/Year2021/Day10.hs | 6 ++-- src/AdventOfCode/Year2024/Day05.hs | 4 +-- 6 files changed, 36 insertions(+), 39 deletions(-) delete mode 100644 input/2021/day07.txt diff --git a/VERSION b/VERSION index 1c21a50..b5be053 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.64 \ No newline at end of file +2024.7.2.65 \ No newline at end of file diff --git a/input/2021/day07.txt b/input/2021/day07.txt deleted file mode 100644 index 41f1bf2..0000000 --- a/input/2021/day07.txt +++ /dev/null @@ -1 +0,0 @@ -1101,1,29,67,1102,0,1,65,1008,65,35,66,1005,66,28,1,67,65,20,4,0,1001,65,1,65,1106,0,8,99,35,67,101,99,105,32,110,39,101,115,116,32,112,97,115,32,117,110,101,32,105,110,116,99,111,100,101,32,112,114,111,103,114,97,109,10,859,34,1186,541,484,1318,263,74,1188,164,802,924,48,851,107,20,437,163,482,1334,457,405,487,1951,141,89,722,359,51,926,750,97,779,1153,338,131,192,120,319,432,305,1202,59,671,144,236,165,1235,666,5,603,1421,428,295,1089,1464,194,661,188,359,65,270,486,21,164,403,857,4,311,222,676,665,658,452,205,693,113,8,667,1357,1401,251,659,775,48,872,610,974,900,1289,836,0,32,8,102,437,827,100,107,390,574,311,1283,973,12,944,836,21,759,151,94,2,391,24,515,21,832,1027,90,281,348,291,188,61,63,1056,676,45,537,497,80,1394,466,431,18,197,1315,1149,651,1329,205,504,984,73,567,367,229,486,11,1206,499,304,609,657,276,1126,612,51,615,638,22,49,572,66,686,658,944,275,197,713,1257,393,144,234,910,396,412,637,1077,22,286,128,713,1489,38,57,215,252,285,33,245,735,411,1,911,858,252,796,501,346,813,94,147,1201,731,1197,124,506,400,767,98,622,460,151,1342,30,204,187,399,489,1253,452,508,55,56,994,4,488,342,247,1037,246,31,3,10,1442,616,1015,658,896,675,165,53,172,5,595,802,118,1194,114,1100,635,87,385,44,117,3,867,950,1581,304,527,349,340,960,947,100,56,605,699,206,320,1127,199,1012,1775,893,582,16,318,130,339,171,179,311,1926,1124,52,460,278,887,754,533,9,1551,307,506,1217,158,55,657,93,1,307,368,251,35,756,1817,0,1329,284,235,193,1188,1182,126,17,1010,142,1108,348,40,762,516,201,51,1400,185,829,3,120,95,92,166,112,624,1648,52,20,24,113,1262,1322,2,36,762,983,305,72,774,527,325,1304,816,486,197,1584,280,302,425,814,73,124,835,21,717,394,631,784,1633,743,504,1308,1149,7,691,580,192,400,4,1241,29,1290,170,4,123,92,255,201,332,129,92,18,213,682,1022,904,0,922,370,258,1240,126,3,716,59,210,946,512,209,24,60,474,100,227,851,1096,65,343,551,176,442,1164,1133,493,1,197,122,80,1761,731,32,674,136,1234,956,690,1132,396,540,392,7,274,1252,25,238,185,791,1461,392,1467,169,343,806,615,577,384,475,181,9,209,560,905,919,422,56,158,28,659,690,157,124,328,228,134,328,282,51,361,405,490,168,31,1103,481,550,9,816,986,1591,320,1007,688,103,700,240,811,80,682,189,126,108,542,1267,27,1420,121,594,493,188,560,710,1192,315,619,490,191,1296,849,1154,331,831,103,177,983,36,107,439,139,18,1357,511,245,135,260,90,15,130,90,610,73,1530,200,46,16,1220,787,465,72,879,553,465,530,751,1062,377,1,1202,344,1006,70,316,5,142,80,109,28,455,248,292,780,727,387,18,314,432,101,127,855,41,1189,658,928,384,244,426,521,160,8,195,1778,1492,1027,1338,370,8,331,75,91,147,1122,672,54,186,171,6,186,592,150,746,457,141,338,52,32,589,290,1020,1237,101,964,348,108,15,86,470,1789,159,181,1111,759,548,76,816,98,537,757,267,581,715,220,24,833,516,231,49,975,422,501,14,4,583,25,1571,1359,1295,600,519,1128,21,399,172,682,64,295,1041,1051,25,111,60,518,902,31,619,112,782,72,272,75,516,204,385,1852,1041,683,56,856,410,296,596,1269,76,653,733,654,291,1042,12,860,124,1043,444,43,241,18,1062,1048,869,552,585,400,1665,481,159,1099,1102,28,644,44,382,1798,280,218,585,1434,690,840,571,213,510,145,57,250,702,1794,514,237,128,947,587,272,1472,109,8,44,13,131,206,242,824,1578,1466,693,696,27,37,987,525,47,88,800,407,203,544,145,25,1426,388,359,91,100,147,1076,139,243,278,33,801,1739,1,1602,45,124,1501,1585,909,381,318,133,579,143,918,47,31,193,923,645,1687,1173,19,535,91,165,618,790,91,570,893,250,483,361,166,1206,236,551,203,1060,1065,180,727,136,644,94,580,110,1689,88,185,67,540,850,230,838,1171,729,849,795,169,157,80,156,626,1203,595,794,64,369,161,464,364,1081,857,227,128,711,1542,242,704,1298,343,130,1195,145,470,247,646,493,1194,607,94,148,153,20,92,831,1011,114,139,1097,19,113,452,170,1109,1280,162,1193,230,76,37,306,251,183,145,312,573,1272,1480,1606,6,1826,1114,588,960,784,967,107,272,321,358,761,622,11,99,579,80,511,111,2,1338,151,166,1050,111,79,229,307,74,429,343,464,187,426,272 diff --git a/src/AdventOfCode/Util.hs b/src/AdventOfCode/Util.hs index af05cb0..b838b5b 100644 --- a/src/AdventOfCode/Util.hs +++ b/src/AdventOfCode/Util.hs @@ -22,6 +22,8 @@ module AdventOfCode.Util adjacencies, neighborsOf, holes, + middle, + medianUnsafe, numDigits, bitraverseBoth, (<&&>), @@ -33,6 +35,7 @@ where import Control.Comonad.Store (experiment) import Control.Lens (holesOf) import Data.IntMap qualified as IM +import Data.List ((!!)) import Data.Map qualified as Map import Data.Set qualified as Set import Relude @@ -123,6 +126,12 @@ holes :: [a] -> [(a, [a])] holes [] = [] holes (x : xs) = (x, xs) : map (second (x :)) (holes xs) +medianUnsafe :: (Ord a) => [a] -> a +medianUnsafe xs = sort xs !! (length xs `div` 2) + +middle :: [a] -> Maybe a +middle xs = xs !!? (length xs `div` 2) + numDigits :: (Integral a) => a -> Int numDigits n = truncate @Double (logBase 10 (fromIntegral n) + 1) diff --git a/src/AdventOfCode/Year2021/Day07.hs b/src/AdventOfCode/Year2021/Day07.hs index f05318d..c66c069 100644 --- a/src/AdventOfCode/Year2021/Day07.hs +++ b/src/AdventOfCode/Year2021/Day07.hs @@ -1,38 +1,37 @@ +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2021.Day07 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) -import AdventOfCode.Util (frequenciesInt) -import Control.Arrow ((&&&)) -import Data.IntMap qualified as IM -import Data.List (maximumBy, sort) -import Data.Ord (comparing) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import AdventOfCode.Util (medianUnsafe) +import Relude import Text.Trifecta (commaSep, natural) main :: IO () -main = $(defaultMain) +main = $(defaultMainPuzzle) getInput :: IO [Int] -getInput = parseInput (map fromInteger <$> commaSep natural) $(inputFilePath) +getInput = parseInputAoC 2021 7 (map fromInteger <$> commaSep natural) example :: [Int] example = [16, 1, 2, 0, 4, 2, 7, 1, 2, 14] -partOne :: [Int] -> Int -partOne xs = sum (map (partOneCost (medianInt xs)) xs) - -partTwo :: [Int] -> Int -partTwo xs = go (meanInt xs) - where - go x - | predCost < xCost = go predX - | succCost < xCost = go succX - | otherwise = xCost - where - xCost = cost x - (predCost, succCost) = (cost predX, cost succX) - (predX, succX) = (pred &&& succ) x - cost = sum . flip map xs . partTwoCost +partOne :: SimplePuzzle [Int] Int +partOne = asks (\xs -> sum (map (partOneCost (medianUnsafe xs)) xs)) + +partTwo :: SimplePuzzle [Int] Int +partTwo = asks $ \xs -> + let cost = sum . flip map xs . partTwoCost + go x = + if + | cost (x - 1) < cost x -> go (x - 1) + | cost (x + 1) < cost x -> go (x + 1) + | otherwise -> cost x + in go (medianUnsafe xs) partOneCost :: Int -> Int -> Int partOneCost x y = abs (x - y) @@ -40,11 +39,5 @@ partOneCost x y = abs (x - y) partTwoCost :: Int -> Int -> Int partTwoCost x y = sumOneToN (partOneCost x y) -medianInt :: [Int] -> Int -medianInt xs = sort xs !! round (fromIntegral (length xs) / (2 :: Double)) - -meanInt :: [Int] -> Int -meanInt = fst . maximumBy (comparing snd) . IM.toList . frequenciesInt - sumOneToN :: Int -> Int sumOneToN n = (n * (n + 1)) `div` 2 diff --git a/src/AdventOfCode/Year2021/Day10.hs b/src/AdventOfCode/Year2021/Day10.hs index a393472..6a1d4c2 100644 --- a/src/AdventOfCode/Year2021/Day10.hs +++ b/src/AdventOfCode/Year2021/Day10.hs @@ -6,6 +6,7 @@ module AdventOfCode.Year2021.Day10 where import AdventOfCode.Input (parseInputAoC, parseString) import AdventOfCode.Puzzle import AdventOfCode.TH (defaultMainPuzzle) +import AdventOfCode.Util (medianUnsafe) import Data.Either.Extra (eitherToMaybe) import Data.Finitary (Finitary (toFinite)) import Data.List ((!!)) @@ -56,7 +57,7 @@ partOne :: SimplePuzzle [Line] Int partOne = asks (sumOn' (fromLeft 0 . scoreLine)) partTwo :: SimplePuzzle [Line] Int -partTwo = asks (middle . mapMaybe (eitherToMaybe . scoreLine)) +partTwo = asks (medianUnsafe . mapMaybe (eitherToMaybe . scoreLine)) scoreLine :: Line -> Either Int Int scoreLine = foldlM scoreIncomplete [] >>> second (foldl' scoreCorrupt 0) @@ -87,6 +88,3 @@ scoreBracket = either autocomplete illegal where autocomplete = (1 +) . fromIntegral . toFinite illegal = ([3, 57, 1197, 25137] !!) . fromIntegral . toFinite - -middle :: (Ord a) => [a] -> a -middle xs = sort xs !! (length xs `div` 2) diff --git a/src/AdventOfCode/Year2024/Day05.hs b/src/AdventOfCode/Year2024/Day05.hs index a79411d..528cf59 100644 --- a/src/AdventOfCode/Year2024/Day05.hs +++ b/src/AdventOfCode/Year2024/Day05.hs @@ -5,6 +5,7 @@ module AdventOfCode.Year2024.Day05 where import AdventOfCode.Input (parseInputAoC, parseString) import AdventOfCode.Puzzle import AdventOfCode.TH (defaultMainPuzzle) +import AdventOfCode.Util (middle) import Control.Lens ((<.=)) import Data.Graph qualified as Graph import Data.Semigroup (Max (..), Min (..)) @@ -97,6 +98,3 @@ example = \75,97,47,61,53\n\ \61,13,29\n\ \97,13,75,29,47\n" - -middle :: [a] -> Maybe a -middle xs = xs !!? (length xs `div` 2) From 23cdb2176025585196f054ba60553eafa4f0575a Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sun, 23 Nov 2025 02:15:18 -0600 Subject: [PATCH 43/91] refactor(2021.06-haskell): adopt advent-of-code-api and matrix --- input/2021/day06.txt | 1 - package.yaml | 3 +- src/AdventOfCode/Year2021/Day06.hs | 92 ++++++++++-------------------- 3 files changed, 33 insertions(+), 63 deletions(-) delete mode 100644 input/2021/day06.txt diff --git a/input/2021/day06.txt b/input/2021/day06.txt deleted file mode 100644 index 13eab94..0000000 --- a/input/2021/day06.txt +++ /dev/null @@ -1 +0,0 @@ -5,1,4,1,5,1,1,5,4,4,4,4,5,1,2,2,1,3,4,1,1,5,1,5,2,2,2,2,1,4,2,4,3,3,3,3,1,1,1,4,3,4,3,1,2,1,5,1,1,4,3,3,1,5,3,4,1,1,3,5,2,4,1,5,3,3,5,4,2,2,3,2,1,1,4,1,2,4,4,2,1,4,3,3,4,4,5,3,4,5,1,1,3,2,5,1,5,1,1,5,2,1,1,4,3,2,5,2,1,1,4,1,5,5,3,4,1,5,4,5,3,1,1,1,4,5,3,1,1,1,5,3,3,5,1,4,1,1,3,2,4,1,3,1,4,5,5,1,4,4,4,2,2,5,5,5,5,5,1,2,3,1,1,2,2,2,2,4,4,1,5,4,5,2,1,2,5,4,4,3,2,1,5,1,4,5,1,4,3,4,1,3,1,5,5,3,1,1,5,1,1,1,2,1,2,2,1,4,3,2,4,4,4,3,1,1,1,5,5,5,3,2,5,2,1,1,5,4,1,2,1,1,1,1,1,2,1,1,4,2,1,3,4,2,3,1,2,2,3,3,4,3,5,4,1,3,1,1,1,2,5,2,4,5,2,3,3,2,1,2,1,1,2,5,3,1,5,2,2,5,1,3,3,2,5,1,3,1,1,3,1,1,2,2,2,3,1,1,4,2 diff --git a/package.yaml b/package.yaml index acd5d5f..cf995ea 100644 --- a/package.yaml +++ b/package.yaml @@ -64,6 +64,7 @@ library: - hashable - infinite-list - linear + - matrix - monoid-extras - mtl - parser-combinators @@ -483,7 +484,7 @@ executables: dependencies: - finite-typelits - linear - - vector + - matrix - vector-sized aoc-2021-day07: <<: *executable diff --git a/src/AdventOfCode/Year2021/Day06.hs b/src/AdventOfCode/Year2021/Day06.hs index 02e347d..3421b0c 100644 --- a/src/AdventOfCode/Year2021/Day06.hs +++ b/src/AdventOfCode/Year2021/Day06.hs @@ -1,83 +1,53 @@ -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE QuantifiedConstraints #-} -{-# OPTIONS_GHC -Wno-orphans #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2021.Day06 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) -import Control.Lens ((%~)) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import Control.Lens (over) import Data.Finite (Finite) -import Data.Maybe (fromJust, mapMaybe) -import Data.Semigroup (stimes) -import Data.Vector.Generic qualified as VG -import Data.Vector.Generic.Sized qualified as VGS +import Data.Matrix (Matrix (..), colVector, matrix) import Data.Vector.Sized qualified as VS -import GHC.TypeNats (KnownNat) -import Linear (Additive (..), negated, scaled, (!*), (!*!)) +import Foreign.Marshal.Utils (fromBool) +import Relude import Text.Trifecta (commaSep, natural) type Lanternfish = Finite 9 -type State = VS.Vector 9 Int - -newtype STM n = STM {unSTM :: VS.Vector n (VS.Vector n Int)} - deriving (Eq, Show) - -instance (Functor v, KnownNat n, forall a. VG.Vector v a) => Additive (VGS.Vector v n) where - zero = VGS.replicate 0 - liftU2 = VGS.zipWith - liftI2 = VGS.zipWith - -instance (KnownNat n) => Num (STM n) where - STM x + STM y = STM (x ^+^ y) - STM x - STM y = STM (x ^-^ y) - STM x * STM y = STM (x !*! y) - negate = STM . negated . unSTM - abs = undefined - signum = undefined - fromInteger = STM . scaled . fromInteger - -instance (KnownNat n) => Semigroup (STM n) where - STM x <> STM y = STM (x !*! y) - main :: IO () -main = $(defaultMain) +main = $(defaultMainPuzzle) + +getInput :: IO (Matrix Int) +getInput = mkColumn <$> parseInputAoC 2021 6 (commaSep (fromInteger <$> natural)) -getInput :: IO [Lanternfish] -getInput = parseInput (commaSep (fromInteger <$> natural)) $(inputFilePath) +getExample :: IO (Matrix Int) +getExample = pure (mkColumn example) example :: [Lanternfish] example = [3, 4, 3, 1, 2] -partOne :: [Lanternfish] -> Int +partOne :: SimplePuzzle (Matrix Int) Int partOne = simulate 80 -partTwo :: [Lanternfish] -> Int +partTwo :: SimplePuzzle (Matrix Int) Int partTwo = simulate 256 -simulate :: Int -> [Lanternfish] -> Int -simulate n = sum . (unSTM (stm ^ n) !*) . mkState +simulate :: Int -> SimplePuzzle (Matrix Int) Int +simulate n = asks (sum . ((day ^ n) *)) -ssimulate :: Int -> [Lanternfish] -> Int -ssimulate n = sum . (unSTM (stimes n stm) !*) . mkState +mkColumn :: (Foldable t) => t Lanternfish -> Matrix Int +mkColumn = + colVector + . VS.fromSized + . foldr ((`over` (+ 1)) . VS.ix) (pure 0) -mkState :: [Lanternfish] -> State -mkState = foldr ((%~ succ) . VS.ix) (pure 0) +simulateDay :: Matrix Int -> Matrix Int +simulateDay timers = day * timers -stm :: STM 9 -stm = - STM - . fromJust - . VS.fromListN - . mapMaybe VS.fromListN - $ [ [0, 1, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 1, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 1, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 1, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 1, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 1, 0, 0], - [1, 0, 0, 0, 0, 0, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 1], - [1, 0, 0, 0, 0, 0, 0, 0, 0] - ] +day :: Matrix Int +day = matrix 9 9 $ \case + (6, 7) -> 1 + (7, 1) -> 1 + (9, 1) -> 1 + (y, x) -> fromBool (x == y + 1) From facbe69e478e0a1d741c33ab687e5b2996490b16 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sun, 23 Nov 2025 23:56:04 -0600 Subject: [PATCH 44/91] refactor(2021.05-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2021/day05.txt | 500 ----------------------------- src/AdventOfCode/Year2021/Day05.hs | 146 ++++----- 3 files changed, 72 insertions(+), 576 deletions(-) delete mode 100644 input/2021/day05.txt diff --git a/VERSION b/VERSION index b5be053..f67d102 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.65 \ No newline at end of file +2024.7.2.66 \ No newline at end of file diff --git a/input/2021/day05.txt b/input/2021/day05.txt deleted file mode 100644 index 884067a..0000000 --- a/input/2021/day05.txt +++ /dev/null @@ -1,500 +0,0 @@ -88,177 -> 566,655 -346,264 -> 872,264 -409,631 -> 506,534 -300,216 -> 300,507 -80,370 -> 193,483 -85,283 -> 85,483 -589,528 -> 968,528 -936,83 -> 936,909 -21,41 -> 907,927 -868,624 -> 868,490 -954,972 -> 51,69 -95,223 -> 851,979 -681,222 -> 681,32 -596,557 -> 384,557 -830,945 -> 830,210 -146,17 -> 582,17 -923,864 -> 923,854 -698,289 -> 893,94 -521,860 -> 521,658 -602,699 -> 602,626 -115,537 -> 12,434 -872,264 -> 239,897 -820,674 -> 820,752 -885,292 -> 519,658 -88,193 -> 88,618 -371,681 -> 556,681 -222,894 -> 741,894 -81,790 -> 277,790 -973,328 -> 973,42 -517,548 -> 491,522 -75,417 -> 260,417 -920,334 -> 920,416 -923,110 -> 44,989 -736,333 -> 714,333 -697,850 -> 345,850 -404,746 -> 770,380 -156,166 -> 156,857 -579,571 -> 796,788 -94,929 -> 277,746 -929,313 -> 929,633 -337,951 -> 337,651 -751,841 -> 119,209 -648,705 -> 775,578 -496,362 -> 84,362 -22,19 -> 981,978 -463,111 -> 877,111 -857,378 -> 299,936 -973,527 -> 967,527 -951,266 -> 96,266 -902,624 -> 925,647 -972,380 -> 167,380 -161,622 -> 161,733 -673,240 -> 763,330 -58,767 -> 776,767 -124,948 -> 721,351 -834,777 -> 304,247 -371,78 -> 237,212 -183,652 -> 183,422 -632,228 -> 632,445 -235,629 -> 151,629 -588,225 -> 588,388 -454,954 -> 454,513 -58,550 -> 58,359 -622,857 -> 95,857 -45,315 -> 672,942 -505,574 -> 670,409 -354,176 -> 276,176 -43,75 -> 948,980 -36,210 -> 36,93 -847,84 -> 268,84 -834,935 -> 798,971 -190,709 -> 190,407 -735,216 -> 478,473 -227,492 -> 59,492 -584,77 -> 584,789 -501,681 -> 299,681 -275,598 -> 932,598 -646,338 -> 646,484 -676,366 -> 543,366 -746,840 -> 305,399 -48,284 -> 48,336 -146,892 -> 299,739 -338,724 -> 338,969 -959,245 -> 384,245 -890,359 -> 554,23 -636,580 -> 181,580 -881,770 -> 244,133 -191,43 -> 950,802 -317,290 -> 317,671 -884,452 -> 884,981 -798,127 -> 798,892 -160,387 -> 160,173 -76,925 -> 977,24 -123,475 -> 593,475 -122,626 -> 472,976 -549,683 -> 549,456 -140,87 -> 475,87 -815,461 -> 815,156 -49,866 -> 866,49 -934,580 -> 880,580 -622,100 -> 622,402 -247,125 -> 35,337 -551,490 -> 551,115 -139,247 -> 713,247 -907,923 -> 907,788 -78,184 -> 111,184 -593,278 -> 593,385 -354,925 -> 916,363 -104,535 -> 104,958 -15,973 -> 967,21 -735,653 -> 609,653 -460,81 -> 80,81 -797,781 -> 942,781 -178,847 -> 968,57 -916,651 -> 916,347 -695,74 -> 51,718 -371,239 -> 479,239 -743,453 -> 377,819 -725,261 -> 633,169 -598,724 -> 598,339 -519,432 -> 455,496 -368,510 -> 10,868 -179,810 -> 909,80 -521,58 -> 521,438 -453,728 -> 453,149 -54,980 -> 961,73 -307,592 -> 307,116 -837,367 -> 837,101 -796,309 -> 796,125 -281,732 -> 743,732 -367,905 -> 367,653 -151,253 -> 100,253 -486,380 -> 486,653 -483,335 -> 401,253 -915,971 -> 218,274 -844,126 -> 901,183 -661,136 -> 875,136 -953,636 -> 953,355 -216,895 -> 830,895 -781,153 -> 214,720 -591,534 -> 923,866 -36,504 -> 558,504 -239,822 -> 57,822 -363,451 -> 363,482 -39,422 -> 332,422 -103,797 -> 103,663 -525,243 -> 525,177 -330,916 -> 528,916 -594,136 -> 343,387 -817,457 -> 817,306 -573,788 -> 525,788 -796,162 -> 574,162 -911,260 -> 143,260 -271,741 -> 18,741 -304,833 -> 980,157 -166,261 -> 848,943 -958,941 -> 41,24 -551,834 -> 551,213 -531,203 -> 356,28 -655,676 -> 481,676 -622,86 -> 10,698 -160,858 -> 823,858 -145,86 -> 857,798 -37,315 -> 359,315 -316,578 -> 316,220 -405,410 -> 405,501 -649,715 -> 903,461 -965,772 -> 965,578 -722,111 -> 330,111 -204,426 -> 204,674 -234,591 -> 234,80 -151,684 -> 453,382 -523,492 -> 523,599 -694,569 -> 637,626 -961,80 -> 85,956 -278,986 -> 163,986 -771,766 -> 23,18 -278,834 -> 278,81 -605,151 -> 605,312 -594,593 -> 16,593 -307,512 -> 307,306 -69,106 -> 69,270 -899,517 -> 899,90 -960,988 -> 11,39 -304,398 -> 293,398 -204,412 -> 572,780 -142,400 -> 142,16 -686,353 -> 556,223 -554,886 -> 946,886 -591,451 -> 591,283 -485,119 -> 416,119 -320,319 -> 797,319 -647,534 -> 152,39 -898,78 -> 35,78 -168,436 -> 710,436 -966,959 -> 23,16 -913,650 -> 879,650 -397,252 -> 459,314 -298,821 -> 454,821 -399,846 -> 443,846 -57,121 -> 683,747 -727,694 -> 85,52 -475,492 -> 475,710 -33,818 -> 550,301 -980,76 -> 81,975 -928,921 -> 928,476 -731,719 -> 731,494 -614,334 -> 976,334 -716,932 -> 100,316 -525,984 -> 909,600 -967,663 -> 967,460 -740,459 -> 740,954 -454,757 -> 305,906 -259,594 -> 344,509 -77,885 -> 233,885 -606,680 -> 232,680 -212,181 -> 82,181 -70,554 -> 70,635 -443,831 -> 164,831 -280,538 -> 280,504 -297,328 -> 297,348 -982,855 -> 920,793 -789,374 -> 747,332 -12,14 -> 975,977 -978,523 -> 978,552 -226,600 -> 798,600 -335,566 -> 881,20 -431,93 -> 431,725 -61,223 -> 61,912 -967,24 -> 16,975 -858,695 -> 310,147 -448,295 -> 866,295 -436,273 -> 641,273 -446,20 -> 654,20 -36,841 -> 36,287 -814,854 -> 839,829 -567,952 -> 674,952 -31,627 -> 31,852 -410,589 -> 322,677 -812,686 -> 467,341 -493,403 -> 787,403 -694,857 -> 927,857 -795,986 -> 795,225 -117,477 -> 117,619 -808,196 -> 808,587 -884,541 -> 894,531 -527,641 -> 527,337 -144,394 -> 346,394 -99,348 -> 598,348 -67,918 -> 944,41 -219,76 -> 420,76 -370,847 -> 416,847 -16,156 -> 743,156 -896,131 -> 896,402 -405,561 -> 405,773 -910,329 -> 24,329 -293,389 -> 792,888 -159,805 -> 159,769 -905,974 -> 905,767 -187,849 -> 927,109 -779,315 -> 779,823 -942,763 -> 299,763 -33,122 -> 120,122 -985,951 -> 61,27 -739,650 -> 332,650 -558,296 -> 100,754 -481,301 -> 454,301 -69,582 -> 69,874 -40,566 -> 69,566 -589,619 -> 589,336 -446,701 -> 76,701 -949,308 -> 949,339 -931,65 -> 931,571 -31,851 -> 31,317 -70,985 -> 961,94 -570,467 -> 570,666 -380,644 -> 380,739 -763,829 -> 749,829 -410,545 -> 780,915 -460,579 -> 460,88 -331,643 -> 560,872 -249,492 -> 844,492 -714,388 -> 714,61 -441,470 -> 537,470 -174,796 -> 256,796 -589,710 -> 369,490 -791,943 -> 425,943 -584,578 -> 114,578 -237,427 -> 851,427 -874,575 -> 235,575 -356,108 -> 204,260 -880,816 -> 754,816 -646,382 -> 646,156 -757,454 -> 337,34 -486,633 -> 694,633 -718,450 -> 647,450 -353,583 -> 605,331 -761,770 -> 563,770 -178,720 -> 928,720 -162,733 -> 717,178 -539,968 -> 207,968 -161,38 -> 161,403 -602,922 -> 496,816 -483,291 -> 483,743 -252,480 -> 543,480 -498,493 -> 498,132 -89,146 -> 562,619 -236,883 -> 555,564 -379,865 -> 389,865 -486,791 -> 688,791 -672,387 -> 672,660 -867,131 -> 838,131 -570,848 -> 850,848 -526,560 -> 966,560 -15,11 -> 983,979 -933,979 -> 888,979 -241,96 -> 985,840 -812,816 -> 812,524 -130,255 -> 130,140 -248,927 -> 628,927 -99,841 -> 874,66 -501,938 -> 77,938 -647,527 -> 983,527 -601,25 -> 601,577 -459,196 -> 662,196 -205,551 -> 639,117 -449,215 -> 147,215 -162,529 -> 624,529 -297,203 -> 297,11 -669,636 -> 948,357 -203,286 -> 53,436 -602,836 -> 602,850 -747,802 -> 747,685 -127,592 -> 448,913 -443,689 -> 826,689 -739,198 -> 739,169 -211,264 -> 211,541 -866,302 -> 45,302 -782,787 -> 86,91 -560,285 -> 560,254 -828,131 -> 645,131 -95,953 -> 95,17 -866,338 -> 866,165 -699,981 -> 357,981 -720,721 -> 111,112 -504,179 -> 77,179 -505,490 -> 732,717 -923,930 -> 22,29 -261,988 -> 518,988 -619,512 -> 475,512 -968,301 -> 714,555 -821,483 -> 821,50 -566,608 -> 566,119 -395,355 -> 519,355 -933,535 -> 618,535 -344,925 -> 344,596 -959,107 -> 959,96 -86,177 -> 686,777 -912,153 -> 910,155 -231,12 -> 977,758 -775,774 -> 775,486 -209,29 -> 209,338 -936,228 -> 970,262 -489,758 -> 309,758 -680,493 -> 222,493 -39,477 -> 416,854 -137,149 -> 838,850 -879,801 -> 879,710 -968,797 -> 765,797 -475,206 -> 679,206 -905,447 -> 440,912 -866,42 -> 243,665 -14,234 -> 437,234 -944,703 -> 280,39 -191,987 -> 191,357 -569,394 -> 898,394 -730,965 -> 390,965 -590,544 -> 893,544 -776,860 -> 711,795 -912,59 -> 58,913 -582,791 -> 45,254 -146,881 -> 915,881 -65,579 -> 65,26 -172,809 -> 172,714 -723,14 -> 308,429 -161,270 -> 804,270 -141,371 -> 522,371 -810,598 -> 869,598 -616,99 -> 929,412 -85,771 -> 85,88 -607,70 -> 272,70 -579,509 -> 615,473 -757,45 -> 176,45 -801,789 -> 801,527 -64,546 -> 64,963 -889,219 -> 727,219 -199,740 -> 199,360 -468,315 -> 317,164 -481,213 -> 481,342 -105,694 -> 105,915 -165,908 -> 983,90 -226,524 -> 886,524 -891,358 -> 891,812 -94,29 -> 728,663 -289,789 -> 289,954 -842,923 -> 204,285 -213,45 -> 784,45 -446,529 -> 856,939 -535,450 -> 941,450 -22,984 -> 985,21 -76,247 -> 76,760 -400,772 -> 955,772 -437,101 -> 437,105 -962,892 -> 499,892 -744,75 -> 171,648 -943,389 -> 348,389 -908,943 -> 14,49 -226,427 -> 226,65 -902,86 -> 902,655 -615,541 -> 615,825 -178,842 -> 829,842 -13,774 -> 659,128 -746,174 -> 807,174 -308,64 -> 248,64 -452,384 -> 452,403 -852,516 -> 692,356 -224,878 -> 224,642 -134,17 -> 809,692 -488,872 -> 488,906 -140,823 -> 883,823 -602,934 -> 487,934 -307,31 -> 307,102 -272,568 -> 414,568 -593,425 -> 110,425 -542,184 -> 542,381 -695,425 -> 691,425 -962,982 -> 50,70 -32,252 -> 32,425 -980,961 -> 35,16 -689,626 -> 689,458 -653,440 -> 867,440 -229,290 -> 229,573 -957,545 -> 957,343 -431,481 -> 108,481 -839,433 -> 126,433 -47,806 -> 598,255 -696,447 -> 283,447 -164,150 -> 164,836 -394,248 -> 394,100 -641,790 -> 300,790 -537,592 -> 537,272 -861,698 -> 861,307 -226,965 -> 365,965 -815,958 -> 815,38 -732,289 -> 732,808 -936,527 -> 936,741 -228,155 -> 484,155 -125,503 -> 125,262 -951,882 -> 951,182 -170,244 -> 170,241 -413,133 -> 942,662 -396,179 -> 396,261 -522,105 -> 522,729 -958,171 -> 643,171 -333,823 -> 921,235 -639,887 -> 656,904 -411,254 -> 243,254 -987,771 -> 975,771 -982,433 -> 982,456 -537,19 -> 537,784 -731,370 -> 731,872 -917,950 -> 32,65 -369,332 -> 981,944 -387,448 -> 102,733 -325,269 -> 833,269 -256,830 -> 256,428 -566,227 -> 945,606 -219,737 -> 916,40 -404,842 -> 404,155 -77,281 -> 586,790 -980,254 -> 980,675 -312,417 -> 90,417 -937,584 -> 288,584 -14,595 -> 609,595 -788,579 -> 908,699 -576,625 -> 576,430 -250,752 -> 366,868 -949,924 -> 67,42 -854,418 -> 854,294 -215,774 -> 287,774 -651,511 -> 651,523 -974,16 -> 518,472 -98,27 -> 679,27 -727,896 -> 20,896 -953,557 -> 845,449 -219,60 -> 755,596 -34,868 -> 358,868 -900,908 -> 61,69 -56,108 -> 391,108 -661,661 -> 613,661 diff --git a/src/AdventOfCode/Year2021/Day05.hs b/src/AdventOfCode/Year2021/Day05.hs index 173ca64..abd5203 100644 --- a/src/AdventOfCode/Year2021/Day05.hs +++ b/src/AdventOfCode/Year2021/Day05.hs @@ -1,98 +1,94 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2021.Day05 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (frequencies) -import Control.Applicative (Alternative (..)) -import Control.Lens ((^.)) +import Control.Lens (views) import Data.Map qualified as M -import Linear (V2 (..), (*^), _x, _y) -import Text.Trifecta (comma, natural, symbol) +import Linear (R2 (..), V2 (..), (*^), _x, _y) +import Relude +import Text.Printf (printf) +import Text.Show qualified +import Text.Trifecta (Parser, comma, natural, symbol) + +data Vent + = Vent + { _from :: !(V2 Int), + _to :: !(V2 Int) + } + deriving (Eq, Generic) + +instance Show Vent where + show (Vent (V2 x1 y1) (V2 x2 y2)) = + printf "%d,%d -> %d,%d" x1 y1 x2 y2 -type Field = [Vent] +newtype Field + = Field {unField :: [Vent]} + deriving (Eq, Generic) -type Vent = V2 (V2 Int) +instance Show Field where + show (Field vents) = + toString + $ unlines + [ foldMap (\x -> maybe "." show (M.lookup (V2 x y) freqs)) [0 .. 9] + | y <- [0 .. 9] + ] + where + freqs = frequencies (concatMap line vents) main :: IO () -main = $(defaultMain) +main = $(defaultMainPuzzle) + +getInput :: IO Field +getInput = parseInputAoC 2021 5 field -getInput :: IO [Vent] -getInput = parseInput (some vent) $(inputFilePath) +field :: Parser Field +field = Field <$> some vent where - vent = V2 <$> point <* arrow <*> point + vent = Vent <$> point <* arrow <*> point arrow = symbol "->" point = V2 <$> int <* comma <*> int int = fromInteger <$> natural -example :: [Vent] +getExample :: IO Field +getExample = parseString field example + +example :: String example = - [ V2 (V2 0 9) (V2 5 9), - V2 (V2 8 0) (V2 0 8), - V2 (V2 9 4) (V2 3 4), - V2 (V2 2 2) (V2 2 1), - V2 (V2 7 0) (V2 7 4), - V2 (V2 6 4) (V2 2 0), - V2 (V2 0 9) (V2 2 9), - V2 (V2 3 4) (V2 1 4), - V2 (V2 0 0) (V2 8 8), - V2 (V2 5 5) (V2 8 2) - ] - -partOne :: [Vent] -> Int -partOne = partTwo . filter (liftA2 (||) isHorizontal isVertical) - -partTwo :: [Vent] -> Int -partTwo = M.size . M.filter (>= 2) . frequencies . concatMap line + "0,9 -> 5,9\n\ + \8,0 -> 0,8\n\ + \9,4 -> 3,4\n\ + \2,2 -> 2,1\n\ + \7,0 -> 7,4\n\ + \6,4 -> 2,0\n\ + \0,9 -> 2,9\n\ + \3,4 -> 1,4\n\ + \0,0 -> 8,8\n\ + \5,5 -> 8,2\n" + +partOne :: SimplePuzzle Field Int +partOne = + asks (filter (liftA2 (||) isHorizontal isVertical) . unField) >>= \vents -> + evalPuzzle (Field vents) mempty partTwo + +partTwo :: SimplePuzzle Field Int +partTwo = + asks (M.size . M.filter (>= 2) . frequencies . concatMap line . unField) isHorizontal :: Vent -> Bool -isHorizontal (V2 from to) = from ^. _y == to ^. _y +isHorizontal (Vent from to) = to - from & views _y (== 0) isVertical :: Vent -> Bool -isVertical (V2 from to) = from ^. _x == to ^. _x +isVertical (Vent from to) = to - from & views _x (== 0) -line :: V2 (V2 Int) -> [V2 Int] -line (V2 from to) = [from + t *^ step | t <- [0 .. gcf]] +-- Bresenham seems like overkill. +line :: Vent -> [V2 Int] +line (Vent from to) = [from + t *^ step | t <- [0 .. gcf]] where - step = (`div` gcf) <$> diff + step = diff <&> (`div` gcf) diff@(V2 dx dy) = to - from gcf = gcd dx dy - -{- -bresenham :: V2 (V2 Int) -> [V2 Int] -bresenham (V2 (V2 x1 y1) to@(V2 x2 y2)) = to : unfoldr go (V3 x1 y1 (dx + dy)) - where - dx = abs (x2 - x1) - dy = negate (abs (y2 - y1)) - sx = if x1 < x2 then 1 else -1 - sy = if y1 < y2 then 1 else -1 - go st@(V3 x y err) - | x == x2 && y == y2 = Nothing - | otherwise = Just (V2 x y, f st) - where - e2 = 2 * err - f = - bool id ((_y +~ sy) . (_z +~ dx)) (e2 <= dx) - . bool id ((_x +~ sx) . (_z +~ dy)) (e2 >= dy) --} - -showField :: [Vent] -> String -showField vents = - unlines - [ concat - [ maybe "." show (M.lookup (V2 x y) freqs) - | x <- [0 .. 9] - ] - | y <- [0 .. 9] - ] - where - freqs = frequencies (concatMap line vents) - -showVent :: Vent -> String -showVent (V2 (V2 x1 y1) (V2 x2 y2)) = - show x1 - <> "," - <> show y1 - <> " -> " - <> show x2 - <> "," - <> show y2 From f8cbc7d94a3b1e3954bd3e12bbb19715b992cfc5 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Mon, 24 Nov 2025 02:59:14 -0600 Subject: [PATCH 45/91] refactor(2021.04-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2021/day04.txt | 601 ----------------------------- src/AdventOfCode/Year2021/Day04.hs | 158 ++++---- 3 files changed, 90 insertions(+), 671 deletions(-) delete mode 100644 input/2021/day04.txt diff --git a/VERSION b/VERSION index f67d102..fa300cb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.66 \ No newline at end of file +2024.7.2.67 \ No newline at end of file diff --git a/input/2021/day04.txt b/input/2021/day04.txt deleted file mode 100644 index e94aedb..0000000 --- a/input/2021/day04.txt +++ /dev/null @@ -1,601 +0,0 @@ -85,84,30,15,46,71,64,45,13,90,63,89,62,25,87,68,73,47,65,78,2,27,67,95,88,99,96,17,42,31,91,98,57,28,38,93,43,0,55,49,22,24,82,54,59,52,3,26,9,32,4,48,39,50,80,21,5,1,23,10,58,34,12,35,74,8,6,79,40,76,86,69,81,61,14,92,97,19,7,51,33,11,77,75,20,70,29,36,60,18,56,37,72,41,94,44,83,66,16,53 - -78 13 8 62 67 -42 89 97 16 65 - 5 12 73 50 56 -45 10 63 41 64 -49 1 95 71 17 - -60 25 66 82 22 -94 45 68 5 12 -46 44 48 31 34 -10 56 37 96 81 -99 39 84 32 6 - -11 86 77 36 2 -57 68 27 74 4 -81 92 49 37 51 -78 43 94 46 63 -13 52 72 17 44 - -88 13 81 21 20 -80 99 23 37 53 -44 68 15 38 55 -84 48 82 97 6 - 4 43 52 72 31 - -39 62 45 86 44 -12 17 16 7 6 -84 42 82 34 85 -19 77 9 48 98 -21 99 67 26 69 - - 1 75 50 5 44 - 3 28 62 17 43 -14 52 64 77 81 -32 89 7 11 70 -38 36 71 45 58 - -53 32 35 69 63 - 6 21 75 64 96 -10 89 15 48 26 -23 20 43 57 33 -18 49 51 47 74 - -20 79 9 74 13 -52 28 77 26 43 -57 83 4 25 70 -90 1 30 53 38 -56 66 82 35 51 - -12 3 31 93 8 -20 27 51 78 9 -29 46 82 85 75 -15 76 91 70 63 -59 39 13 43 79 - -46 35 15 13 2 -65 69 97 77 87 -64 59 94 88 40 -34 79 92 93 58 -47 28 74 82 29 - -32 38 24 68 12 - 8 78 79 89 43 -67 54 6 98 48 - 1 14 83 15 37 -44 10 97 74 33 - - 9 95 2 99 1 - 8 42 60 56 40 -32 11 71 14 80 -77 6 68 46 48 -98 70 39 44 62 - -43 94 41 13 15 -96 99 35 27 8 -22 75 73 17 90 -62 23 5 88 3 -10 52 61 60 57 - -31 62 74 3 79 -15 49 60 28 71 -66 2 11 36 41 -34 80 33 94 75 -64 56 84 70 16 - -98 94 68 32 26 -61 7 52 66 18 -40 20 82 81 74 -28 36 89 14 35 -71 11 44 13 72 - -81 30 6 86 37 -46 45 64 83 62 - 7 70 38 51 15 -91 41 26 40 4 -87 0 82 74 60 - -83 99 26 69 1 - 6 98 53 31 43 -82 64 42 90 34 -87 62 11 40 39 -77 51 2 30 97 - -96 5 24 44 32 -48 92 78 74 76 -99 33 93 97 49 -45 8 88 66 59 -52 64 29 60 82 - -69 23 59 96 71 -14 93 21 44 62 -65 84 2 39 1 - 0 68 38 81 4 -48 31 26 60 34 - -24 46 44 52 98 -65 23 31 89 5 -34 79 75 96 41 -76 28 90 12 11 -68 29 38 70 50 - -51 0 45 23 20 -44 49 12 31 7 -41 26 46 75 92 -90 30 72 95 55 -87 57 10 99 40 - -25 67 80 74 44 - 3 82 27 81 11 -33 42 97 57 70 -19 94 0 2 49 - 6 90 60 29 58 - -79 59 96 68 14 -38 70 65 66 69 -36 75 20 18 29 -64 88 35 61 43 -57 76 62 23 25 - -60 9 81 94 62 -73 20 87 72 14 -95 63 42 51 13 -75 83 32 30 66 -97 6 80 82 17 - - 3 88 31 43 68 -20 78 47 10 91 -14 42 40 74 39 - 5 32 16 97 1 - 9 33 49 70 36 - -77 31 65 27 52 -49 74 57 25 66 -24 4 39 33 1 -23 14 19 2 21 -80 71 29 81 91 - -32 68 47 3 88 - 1 97 99 28 80 - 2 25 18 31 51 -26 10 73 34 40 - 8 55 45 36 37 - -79 81 33 94 51 -84 4 91 0 69 -49 80 35 67 20 -98 48 64 38 30 -25 83 45 97 42 - -18 5 84 94 50 -36 47 2 52 65 -39 77 83 37 80 -51 88 15 12 31 -87 17 68 48 67 - -39 95 30 8 86 -45 57 40 51 60 -85 88 33 93 25 -76 52 37 68 6 -11 80 69 19 71 - - 6 71 25 66 54 -33 17 98 63 20 -27 14 44 43 18 -68 10 50 35 65 -61 3 83 12 13 - -46 21 43 15 19 -99 82 8 95 80 - 1 10 45 58 53 -23 94 50 66 52 -57 98 26 77 90 - -11 50 55 28 79 - 4 3 26 57 56 -68 86 10 87 69 -32 35 89 63 29 -66 27 33 8 30 - -23 34 94 93 47 - 7 71 9 52 50 -45 79 13 43 86 - 0 51 17 6 26 - 4 82 44 38 37 - -49 24 16 64 32 -46 84 3 29 51 -71 82 33 61 26 -15 5 94 86 41 -63 36 10 67 43 - -94 17 3 71 91 -93 50 88 36 27 -54 68 7 8 34 - 9 92 37 45 52 -47 29 70 10 69 - -79 27 30 0 12 -51 70 19 89 20 - 2 42 64 21 49 -48 39 1 3 56 -98 35 95 82 72 - -91 71 65 95 44 -26 72 92 59 43 -61 93 6 4 90 -76 31 8 1 29 -82 64 89 22 45 - -55 4 1 42 87 -88 34 67 83 45 -22 23 98 24 12 -74 72 49 32 25 -73 7 19 26 3 - - 0 43 50 57 80 -68 21 87 1 91 -60 6 81 78 99 -35 98 72 49 16 -36 25 13 48 22 - -59 1 26 3 71 -43 55 50 7 16 - 5 64 29 38 84 -41 23 60 19 24 -85 58 49 98 33 - -80 48 3 65 38 -30 97 96 45 7 - 6 85 8 90 40 -37 78 84 16 24 -69 11 43 64 63 - -28 14 19 1 97 -37 39 86 23 64 -20 67 85 65 90 -54 51 59 91 43 -17 30 11 24 7 - -22 88 27 43 10 -35 3 72 52 57 -61 54 28 69 37 -71 78 96 82 81 -33 39 32 40 7 - -50 60 69 33 57 -84 22 95 74 6 -90 94 71 45 68 -72 86 77 9 24 -73 12 89 13 1 - -66 35 36 87 73 -77 96 52 47 68 -63 4 83 20 95 -17 70 9 18 50 -98 40 25 60 26 - -31 37 81 34 56 - 3 15 43 51 35 -67 70 1 20 12 -80 54 69 17 88 -65 91 60 8 53 - -76 23 87 41 18 -49 58 92 98 25 -77 53 44 17 27 -67 28 37 66 95 -59 39 33 4 34 - - 0 25 2 5 22 -26 85 90 51 21 -31 79 10 41 45 -69 56 1 67 40 -59 98 99 89 6 - -95 67 72 52 78 -88 61 96 11 43 -34 73 53 54 8 -71 3 70 42 58 -12 82 97 68 98 - -20 10 13 74 89 -82 25 45 92 61 -58 62 0 22 57 -68 90 36 18 75 -48 39 69 4 52 - -40 3 86 33 98 -30 67 39 7 69 -80 64 77 54 51 -24 49 6 68 61 -62 94 1 26 50 - -89 88 7 21 87 -83 10 78 27 97 -35 62 86 13 38 -28 80 19 36 75 -98 93 47 33 57 - -22 88 35 79 85 -98 96 89 69 17 -37 62 57 39 1 -99 10 55 50 71 -65 94 67 4 63 - - 7 83 51 95 98 -56 93 62 85 9 -72 14 44 70 67 -42 4 65 37 54 -47 82 1 60 55 - - 0 73 60 25 64 -90 11 93 85 89 -80 97 86 76 96 -43 92 88 72 44 -62 87 81 34 49 - -47 27 89 98 68 -86 76 14 96 17 -21 4 41 74 29 -18 82 33 34 20 -30 62 95 42 51 - -45 4 70 20 53 -66 39 43 82 1 -54 30 68 77 42 -61 41 65 94 35 -25 78 22 26 46 - -70 73 44 48 61 -69 7 85 47 89 -91 22 12 98 11 -25 60 58 46 54 - 5 37 83 62 65 - -47 62 30 70 40 -86 9 64 61 0 -27 63 90 88 17 -18 71 42 33 93 -91 14 81 4 31 - -81 7 22 94 55 -99 90 60 9 46 -65 2 47 1 73 -78 76 75 19 88 -63 51 86 56 49 - -25 27 12 22 30 -87 75 16 4 32 -19 73 5 20 52 -18 6 34 94 31 -23 96 84 26 66 - -23 69 51 35 5 -13 76 99 89 82 -88 3 50 54 33 -19 59 92 84 34 -64 80 42 40 60 - -15 91 92 60 36 -46 40 53 34 27 -13 35 96 16 42 - 4 61 81 56 24 -85 21 7 99 20 - -32 37 19 21 28 -66 7 96 46 88 -23 52 25 50 22 -53 62 34 81 27 -98 31 14 40 49 - -23 43 71 61 12 - 8 94 91 74 7 -67 2 59 77 4 -39 18 97 41 21 -55 15 31 9 38 - -29 69 52 16 75 -71 15 34 79 86 -62 57 48 44 54 -11 32 96 13 60 -56 77 26 68 82 - -93 57 21 94 31 -29 4 59 24 40 -13 99 34 96 91 -70 55 47 62 51 -33 32 19 69 71 - -76 80 1 57 20 -13 28 72 27 79 -40 21 71 37 85 -26 12 67 33 99 -11 41 62 18 64 - -23 22 92 69 86 -38 79 47 56 83 -74 46 1 95 24 -93 71 28 54 52 -94 51 33 57 73 - -17 96 4 81 76 -67 20 24 21 70 -28 77 3 74 10 -45 78 18 7 15 - 8 48 27 58 13 - -51 58 59 73 35 -13 7 92 15 98 -75 26 1 49 24 -91 85 44 34 74 -64 2 20 72 90 - -46 89 50 54 79 - 9 60 98 36 78 -91 16 80 92 20 -77 69 13 76 75 -95 41 45 3 40 - -86 7 67 20 99 -14 18 97 70 0 -81 27 89 30 3 -39 37 56 42 32 -35 71 49 8 73 - -60 67 61 6 86 -25 41 24 29 88 -98 3 90 56 87 -45 22 84 70 99 -53 59 27 26 57 - -17 4 11 41 66 -28 39 27 54 89 - 3 78 37 93 29 -95 23 86 51 40 -75 67 71 57 92 - -60 41 91 89 52 -68 46 83 62 1 -18 21 72 19 35 -55 34 11 16 75 -32 71 61 78 50 - -27 38 70 48 93 -16 2 80 17 63 -97 89 55 86 85 -54 5 41 33 60 -51 95 12 67 37 - -72 17 74 6 41 -53 19 8 12 92 -39 84 82 63 48 -22 21 87 13 32 -40 34 64 15 31 - -75 2 46 64 99 -26 72 79 90 76 -85 68 10 28 67 -20 34 81 12 83 -92 1 65 43 71 - -49 80 85 54 9 -31 40 22 94 51 -12 73 43 68 98 -78 91 70 3 28 -47 59 69 99 62 - -46 56 28 73 20 - 5 29 69 68 22 -64 12 8 52 92 -36 44 90 72 0 -76 48 33 86 66 - -99 61 97 17 74 -32 52 44 42 9 -57 67 36 41 31 -68 1 50 22 11 -73 12 21 48 62 - -44 53 77 88 87 -27 99 59 98 74 -33 66 51 14 34 -29 30 60 49 80 -47 84 36 12 71 - -29 89 54 59 70 -87 65 77 38 25 -40 17 41 9 30 -45 27 0 5 24 -52 8 35 68 10 - -16 41 66 87 76 -94 70 51 48 96 -90 73 98 89 91 - 4 46 30 28 63 -68 45 37 80 57 - -19 11 46 41 14 -94 48 66 86 9 -42 90 56 70 21 -95 54 74 30 87 -81 89 49 60 34 - -18 90 79 64 98 -27 74 59 53 11 -96 45 17 14 23 - 9 60 30 42 12 -97 21 31 5 41 - -98 63 51 92 64 -55 30 46 22 91 - 8 73 61 57 67 -37 60 49 31 10 -80 99 77 11 82 - -52 69 77 41 8 -94 11 78 62 28 -91 39 96 79 3 -44 88 37 0 47 - 6 80 49 98 48 - -93 2 70 26 4 -47 8 94 12 3 -10 7 24 40 23 -49 84 50 56 44 -41 53 96 1 85 - -76 78 70 24 75 -71 19 85 77 25 -21 44 58 45 64 -40 38 9 50 61 -79 42 86 37 6 - -34 39 94 84 0 -90 80 78 54 49 -13 81 87 60 56 -74 59 75 41 28 -29 67 66 44 20 - -50 66 43 39 16 -88 94 60 70 64 -63 80 56 69 36 -53 48 32 22 79 -59 77 20 30 67 - -70 56 80 12 11 -35 55 40 71 87 -84 27 96 46 85 -20 23 26 29 14 -58 37 21 75 68 - -78 23 13 37 94 -65 44 54 43 38 -29 60 83 1 57 -98 2 75 12 14 -92 25 48 9 52 - -64 37 93 48 34 -22 81 58 5 13 -63 80 2 67 53 -62 52 79 41 44 -83 75 96 91 88 - - 1 54 88 45 90 -81 78 19 8 40 -17 74 69 87 33 - 9 64 85 50 71 -92 38 65 82 41 - - 2 62 96 60 81 -51 1 34 48 25 -78 13 74 65 42 -46 64 57 19 72 -85 88 53 68 76 - -57 95 40 92 27 -65 37 42 90 9 -17 72 78 43 45 -87 28 48 81 79 - 7 4 24 67 70 diff --git a/src/AdventOfCode/Year2021/Day04.hs b/src/AdventOfCode/Year2021/Day04.hs index e6e2ed8..5fdd7c5 100644 --- a/src/AdventOfCode/Year2021/Day04.hs +++ b/src/AdventOfCode/Year2021/Day04.hs @@ -1,23 +1,20 @@ -{-# LANGUAGE DeriveTraversable #-} -{-# LANGUAGE LambdaCase #-} {-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2021.Day04 where -import AdventOfCode.Input (parseInput, parseString) -import AdventOfCode.TH (defaultMainMaybe, inputFilePath) -import Control.Arrow (first) -import Control.Lens (ifoldl') +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import AdventOfCode.Util (maybeFail) +import Control.Lens (ifoldl', makeLenses, views) import Data.Functor.Foldable (ana, hylo) import Data.Functor.Foldable.TH (makeBaseFunctor) -import Data.IntMap (IntMap) import Data.IntMap qualified as IM -import Data.IntSet (IntSet) import Data.IntSet qualified as IS -import Data.Maybe (mapMaybe) -import Data.Ord (comparing) +import Relude import Safe.Foldable (maximumByMay) -import Text.Trifecta (Parser, commaSep, count, natural, some) +import Text.Trifecta (Parser, commaSep, count, natural) -- | A 'Board' is map from callable number to square. -- Squares are numbered left to right and top to bottom. @@ -26,61 +23,107 @@ type Board = IntMap Int -- | A Bingo game has three potential states. data Bingo = -- | Ready to call a number. - Call Bingo + Call !Bingo | -- | Won with a score. - Won Int + Won !Int | -- | Lost. Lost - deriving (Eq, Ord, Show) + deriving (Eq, Generic, Ord, Show) makeBaseFunctor ''Bingo +data BingoState + = BingoState + { _calls :: ![Int], + _boards :: ![Board] + } + deriving (Eq, Generic, Show) + +makeLenses ''BingoState + +type CallState = ([Int], IntSet) + main :: IO () -main = $(defaultMainMaybe) +main = $(defaultMainPuzzle) -- | The input is a list of numbers to call and list of bingo boards. -getInput :: IO ([Int], [Board]) -getInput = parseInput callsAndBoards $(inputFilePath) +getInput :: IO BingoState +getInput = parseInputAoC 2021 4 callsAndBoards -callsAndBoards :: Parser ([Int], [Board]) -callsAndBoards = (,) <$> calls <*> some (board 5) +callsAndBoards :: Parser BingoState +callsAndBoards = BingoState <$> commaSep int <*> some (board 5) where - calls = commaSep (fromInteger <$> natural) - board k = mkBoard <$> count k (count k (fromInteger <$> natural)) + int = fromInteger <$> natural + board k = mkBoard <$> count k (count k int) where mkBoard = ifoldl' go IM.empty . concat go i m n = IM.insert n i m +getExample :: IO BingoState +getExample = parseString callsAndBoards example + +example :: String +example = + "7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1\n\ + \\n\ + \22 13 17 11 0\n\ + \ 8 2 23 4 24\n\ + \21 9 14 16 7\n\ + \ 6 10 3 18 5\n\ + \ 1 12 20 15 19\n\ + \\n\ + \ 3 15 0 2 22\n\ + \ 9 18 13 17 5\n\ + \19 8 7 25 23\n\ + \20 11 10 24 4\n\ + \14 21 16 12 6\n\ + \\n\ + \14 21 17 24 4\n\ + \10 16 15 9 19\n\ + \18 8 23 26 20\n\ + \22 11 13 6 5\n\ + \ 2 0 12 3 7\n" + -- | Given a list of called numbers and a list of boards, compute the score of -- the 'Board' that wins first. -partOne :: ([Int], [Board]) -> Maybe Int -partOne (_, []) = Nothing -partOne (calls, boards) = - trampoline (traverse runGame) - . map (flip ana (calls, IS.empty) . bingoCoalg 5) - $ boards +partOne :: SimplePuzzle BingoState Int +partOne = + solve ana + $ trampoline + $ traverse runGame -- | Given a list of called numbers and a list of boards, compute the score of -- the 'Board' that wins last. -partTwo :: ([Int], [Board]) -> Maybe Int -partTwo (calls, boards) = - fmap snd - . maximumByMay (comparing fst) - . mapMaybe (flip (hylo bingoAlg . bingoCoalg 5) (calls, IS.empty)) - $ boards +partTwo :: SimplePuzzle BingoState Int +partTwo = + solve (hylo bingoAlg) + $ catMaybes + >>> maximumByMay (comparing fst) + >>> fmap snd + +solve :: + ((CallState -> BingoF CallState) -> CallState -> a) -> + ([a] -> Maybe b) -> + SimplePuzzle BingoState b +solve process findScore = do + views calls (,IS.empty) >>= \callState -> + findScore + . map (flip process callState . bingoCoalg 5) + & views boards + >>= maybeFail "no winners" -- | A bingo coalgebra with a carrier type that tracks the numbers remaining to -- be called and the set of marked numbers. -bingoCoalg :: Int -> Board -> ([Int], IntSet) -> BingoF ([Int], IntSet) +bingoCoalg :: Int -> Board -> CallState -> BingoF CallState bingoCoalg _ _ ([], _) = LostF -bingoCoalg k board (call : calls, alreadyMarked) = - maybe callNext (checkIfWon . mark) (IM.lookup call board) +bingoCoalg k board (number : numbers, alreadyMarked) = + maybe callNext (checkIfWon . mark) (IM.lookup number board) where mark square = IS.insert square alreadyMarked checkIfWon marked - | isWinner k marked = WonF (calculateScore call marked board) - | otherwise = CallF (calls, marked) - callNext = CallF (calls, alreadyMarked) + | isWinner k marked = WonF (calculateScore number marked board) + | otherwise = CallF (numbers, marked) + callNext = CallF (numbers, alreadyMarked) runGame :: Bingo -> Either (Maybe Int) Bingo runGame = \case @@ -92,7 +135,7 @@ runGame = \case -- numbers and returns the final score in case of a winning game. bingoAlg :: BingoF (Maybe (Int, Int)) -> Maybe (Int, Int) bingoAlg = \case - CallF state -> first succ <$> state + CallF carrier -> first (+ 1) <$> carrier WonF score -> Just (1, score) LostF -> Nothing @@ -115,39 +158,16 @@ isWinner k marked = any (`IS.isSubsetOf` marked) (runs k) -- 'Board'. runs :: Int -> [IntSet] runs k = - map IS.fromList . concat $ - [ [ [n * k .. n * k + (k - 1)], - [n, n + k .. k * k - 1] - ] + map IS.fromList + . concat + $ [ [ [n * k .. n * k + (k - 1)], + [n, n + k .. k * k - 1] + ] | n <- [0 .. k - 1] - ] + ] -- Agda.Utils.Function.trampoline trampoline :: (a -> Either b a) -> a -> b trampoline f = loop where loop a = either id loop (f a) - -example :: IO ([Int], [Board]) -example = - parseString callsAndBoards . unlines $ - [ "7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1", - "", - "22 13 17 11 0", - " 8 2 23 4 24", - "21 9 14 16 7", - " 6 10 3 18 5", - " 1 12 20 15 19", - "", - " 3 15 0 2 22", - " 9 18 13 17 5", - "19 8 7 25 23", - "20 11 10 24 4", - "14 21 16 12 6", - "", - "14 21 17 24 4", - "10 16 15 9 19", - "18 8 23 26 20", - "22 11 13 6 5", - " 2 0 12 3 7" - ] From cece135c39e4679c87d2bc53e0734d4a41b4b4f3 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Mon, 24 Nov 2025 03:28:03 -0600 Subject: [PATCH 46/91] refactor(2021.03-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2021/day03.txt | 1000 ---------------------------- src/AdventOfCode/Year2021/Day03.hs | 51 +- 3 files changed, 26 insertions(+), 1027 deletions(-) delete mode 100644 input/2021/day03.txt diff --git a/VERSION b/VERSION index fa300cb..8fd4f75 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.67 \ No newline at end of file +2024.7.2.68 \ No newline at end of file diff --git a/input/2021/day03.txt b/input/2021/day03.txt deleted file mode 100644 index 4b7be93..0000000 --- a/input/2021/day03.txt +++ /dev/null @@ -1,1000 +0,0 @@ -101001100010 -010100001011 -010010010101 -110100011010 -001100100001 -111111110110 -000000101100 -001111000011 -101100100111 -001101110000 -001010010111 -001001001110 -111010110111 -100010111010 -111100110001 -000001011100 -001001010100 -010011011001 -101111010110 -111111101110 -101100111011 -100011010000 -011000100111 -010000111011 -100000011111 -000001010110 -101010011000 -010110001001 -000001011000 -000010001001 -111011011000 -101000001000 -101000001110 -110100101101 -100100010000 -100000111010 -000001111000 -011111010111 -000101011000 -101100100000 -110001111001 -100011111110 -101001101001 -010110011010 -010010100011 -100111110001 -011001111010 -000001111111 -110110000001 -110010011011 -011100001110 -000011010110 -000001101100 -110111110010 -010101100011 -010011000100 -100000111101 -100111001001 -110011110110 -000000100010 -111100110010 -101111001100 -110001111111 -100111101101 -100111010100 -101010001100 -010110110110 -110111110100 -111011101001 -010101000101 -101011010101 -110000110001 -111001100000 -010110011000 -011010100101 -000101111111 -001010000110 -110001000000 -100000110100 -110110111000 -100110010111 -000010111111 -101010000010 -010010000110 -001111101011 -100100011110 -000100110010 -001111010100 -111011010110 -110011000111 -000000001111 -010000111001 -011111100111 -000001011001 -011110100011 -010111000010 -000101000101 -010000011000 -001100011100 -100010111001 -011010100100 -110100000000 -000101011100 -000010100010 -001001101111 -001000011000 -111001011100 -001101111001 -100000100110 -100100101001 -011011010000 -110111011111 -101001010110 -101111000001 -000101110010 -011101111000 -100011100111 -110101110110 -111101011111 -010100111001 -011001100010 -101110011100 -011100110110 -110000010001 -100001101100 -001011010110 -111101011010 -101011101111 -101010010000 -101010111101 -110011100010 -010010101011 -101110000110 -001010100010 -010001001111 -000011111000 -011110100110 -110010011101 -101001101101 -100010101110 -011000111000 -011010110101 -010000011111 -110100110100 -001111001010 -101001001000 -001000000100 -010001100011 -010100000000 -011100100010 -011000000110 -101011111111 -010111010100 -001111110111 -110011111100 -010110100011 -101101011111 -100000001000 -011110101101 -001101011010 -100100010101 -111110100111 -010101100110 -100010011010 -100000101111 -101111000011 -010001110001 -101011110001 -100101011011 -110001111110 -101111010101 -100011001010 -000010101100 -111011100011 -010101110101 -011000100000 -000110100011 -001101011110 -000100011010 -001001000000 -111101111110 -001011010101 -010100001001 -000110011100 -110111100010 -110011100100 -101100001110 -011000101010 -101110010100 -001110111101 -111001110101 -100011101110 -011101000011 -100010100011 -000110010110 -111010011111 -011001101111 -110101000010 -110011000110 -111110101000 -001111111101 -101000100000 -011010001110 -001110101100 -111110111101 -001001000111 -111010110010 -111001010001 -001110001001 -111011011001 -110011010000 -100110101000 -000000010101 -101011001001 -001111111001 -111011101000 -100000011110 -001000111101 -000001110011 -000001111001 -110110001000 -000100011000 -111000111110 -010000101001 -110010110011 -101011011101 -110010101101 -010001111010 -100010101010 -011000111101 -010101001000 -001000010110 -100000000101 -010111110011 -011101101001 -100010011001 -000111011011 -100000100001 -000000110001 -100110000101 -100100111001 -001110111010 -110001001111 -000001110100 -010111111001 -011010001010 -001111011110 -101110100101 -111001111000 -000000111110 -011111101010 -001010010001 -101000000000 -011000111001 -000100000000 -110010000101 -001011011100 -100001010111 -101001001010 -001100010110 -110110111100 -011100100011 -100110101001 -000110110011 -110000101001 -110010110110 -001101111100 -001010111110 -000100010110 -111011001011 -011001110011 -101111110011 -100000000000 -011000010100 -010101000001 -111011000100 -010111101011 -001010111011 -001100111001 -101010100011 -000100000010 -101010010011 -101111100000 -100101010010 -001101101000 -010101100010 -010010011100 -001001100001 -101110110101 -011111011010 -101011011010 -001011110100 -110110011101 -111110110100 -100011010100 -000101011101 -111011111100 -110101000100 -111100100111 -110010100000 -100001010001 -111010010111 -010100101111 -010101110000 -000110010011 -111010001100 -000100110110 -011011000101 -001110100011 -011101111100 -000110111011 -110100110010 -000110010101 -000000000110 -010110000011 -110001011111 -010010001110 -100101111100 -110100101000 -010101000111 -100101011100 -110011111011 -011010111101 -111100111110 -100101000001 -110100101111 -110111100110 -010000000100 -010111000111 -011110010011 -111000010011 -111111100110 -001100000011 -000011110010 -111110010000 -010100010011 -001111111111 -000011101000 -101001011100 -111111100011 -110011101000 -101110111001 -111010111101 -001011101001 -110101011001 -111111010110 -011111011101 -111110011100 -100001010100 -001000011101 -011010011111 -100001101000 -010101100000 -111001010100 -001000100011 -001011010100 -011011111110 -000111000110 -011110011000 -111011111010 -111000110011 -101100001101 -111000100011 -001001110011 -011111100110 -100010100000 -000000100001 -010111001001 -001111110101 -100010111101 -011111110000 -100100100011 -011000111100 -000100101000 -110000001010 -001000110010 -101110000101 -100111111110 -011011111101 -110010111010 -100011001110 -110101101110 -011110000111 -101110100001 -101010011111 -101100101100 -010000000111 -101101000011 -100010001011 -010100110111 -111011001110 -110001001110 -111111110010 -010111100111 -000000100101 -000101110101 -011001011000 -000011000110 -000111011001 -001100101001 -110100101011 -011111100000 -101110010111 -010101001011 -011110110101 -101100101010 -100011111100 -101010000101 -000110111000 -111000110110 -101101010101 -110011101010 -001100110110 -010010011110 -110101010101 -101100110100 -111000011111 -001110101101 -010111011111 -110000001111 -000101101011 -101100111100 -000100001110 -011011011111 -001101101101 -000111001111 -011001100100 -011110101111 -100110001100 -111100101111 -001100011011 -110011010101 -000011000100 -001111100011 -111000001011 -000001010011 -011001000110 -101110110010 -100100110000 -001101110010 -000101100111 -000100101101 -110000000100 -010110001011 -001111010111 -001010101100 -011010110001 -100111001110 -111011010100 -110000001100 -000001011101 -010010110000 -111101101000 -000100011110 -011110111010 -111110111011 -000101100011 -001010100111 -100000001001 -110001011101 -111101010101 -100010010000 -011010011101 -111100010111 -111100100010 -101111010100 -010001110010 -001000111111 -101110111110 -000010111110 -100001001000 -100101000101 -010011111000 -110100000011 -011000001100 -010100010000 -010011010101 -111110001100 -000011011111 -110110011010 -111001011000 -011101101111 -001110110100 -110001101110 -000100111010 -101000111001 -010110110100 -011101001101 -101110111111 -000011011000 -011100101001 -111110011110 -101001001111 -001100010100 -110101001010 -000111111010 -000111000101 -001011111101 -001110001000 -001001000100 -100001100100 -110100010111 -010101001110 -110110111010 -011111110001 -000100001001 -110001010100 -101011100110 -011111101111 -000001110110 -000101101100 -110100001001 -001000110111 -000101111100 -101111101010 -011001101010 -100010010100 -101000110011 -101100010010 -110111000011 -111101100111 -111110011101 -011111111110 -110111110111 -001001101101 -010010111001 -010101000010 -100110101010 -111000110101 -101101110111 -010000101100 -111111101000 -111101110100 -000110000100 -101001110001 -011011111111 -001010110011 -101000000110 -000001100101 -000111001110 -001010111001 -110111001100 -010101101111 -110101111110 -001010110110 -011000000000 -011110100100 -000111011111 -101100110000 -001010010101 -111101101111 -100000100100 -110010110000 -101011110100 -110100110001 -110010010100 -011100001011 -001010001101 -111110010110 -001101111011 -011011101011 -001101100100 -001000110101 -010111100000 -110111110110 -110110010001 -101010110100 -101000111010 -100010100001 -111101001001 -110100010101 -110110100010 -101000000001 -010001010101 -010101100111 -101100001001 -000000101011 -000000100110 -111110100000 -010111101000 -011000011010 -101011000110 -000101001001 -010110010100 -011001001101 -011000011111 -101111101101 -001001001010 -010011011110 -100101100111 -110111000000 -001010000011 -101101110110 -110000001110 -010101100101 -101111001111 -111111011100 -001001001001 -110000000011 -110101010100 -100110111010 -000010100110 -111101100011 -100001000111 -010101110011 -001100001101 -110111111101 -011010110111 -101000101101 -011111001010 -000111001000 -001110100001 -000100010001 -010010111101 -111010110101 -101111010000 -101011110011 -001111111100 -111101010110 -111111000101 -001101011001 -000110111100 -111001110100 -011001110100 -101101101010 -110101000111 -011111110101 -000111101001 -000100010111 -000001101101 -101011000011 -010011000111 -010111010011 -101011001000 -100011011011 -101000110110 -000100111111 -010011101101 -110111111000 -010010000100 -010011000011 -111010000000 -111011101011 -010000100101 -101101001111 -011101100111 -100110100010 -000110000011 -110100011011 -000110101011 -111000011000 -111001010000 -001100101100 -100010010011 -001111011010 -100000110000 -010010000010 -111111000000 -011110110110 -001101001000 -010110011111 -011000000010 -010010100111 -000110100111 -101010001010 -101010110101 -010111110111 -000011101110 -100010000100 -110011000010 -011000101111 -111010001111 -000011001101 -001000101100 -000000001110 -000111110010 -100000010010 -100001110010 -111001111100 -001001111000 -000100101011 -011011100000 -001011101011 -100001111111 -111001111101 -110100001110 -011011101001 -000110011111 -010011011100 -001000101011 -101110001110 -111010000011 -110000111110 -110000011011 -100100110111 -101000011111 -101000011101 -110110001010 -011010101101 -100111111001 -001000000000 -100010101000 -101011101010 -001110010100 -011110011110 -000111100011 -001011101010 -100111100011 -111000101110 -000100000110 -101101111110 -101001110010 -000111110100 -100011011000 -010110011101 -011000010110 -111100001001 -110111001110 -010000010111 -000000010110 -010110011110 -011001000111 -101001100111 -000100100010 -101111010010 -110010101010 -100011101011 -001100100101 -011000011001 -101100111010 -110110110111 -101001011001 -101011001010 -110011011101 -101010111000 -010100100001 -011111100011 -111000010110 -001000100001 -111110000010 -111110111110 -000101101000 -010011001000 -000001101001 -101010101110 -011001010000 -001101001001 -111001010010 -110111110000 -000100111001 -010101111111 -101100011001 -000111010110 -000110000001 -001001000010 -000101101001 -111011010010 -000000000011 -001011110001 -111100110000 -000111010011 -100110111110 -101010000000 -001011110111 -111101100000 -011010000000 -110111001010 -010100000101 -110110100111 -011000101001 -101001001001 -100001010010 -101110000011 -111011110010 -101001100110 -001000100010 -101111110010 -010101101100 -000101111101 -011110100000 -010010100000 -111100010001 -100110100110 -111000010111 -011011101101 -010000011010 -001000111110 -010000010011 -011010100010 -110010101000 -011110000001 -101100110101 -001001010000 -101011010110 -100111011011 -100001111010 -100001000001 -101001010011 -001000010100 -001011011000 -010010101110 -010011010111 -110010001010 -111101110110 -110101000001 -010100010110 -001001101000 -010011000000 -001100001001 -011111011001 -110110101001 -011001000101 -000110101100 -110010111101 -010011011011 -111000001010 -101110111010 -101100101110 -000000101010 -111100011011 -111100010100 -011110010100 -000011011110 -101101111101 -110101011100 -110011001100 -111011010000 -011100000001 -110100110111 -010110011011 -100010000001 -010110000101 -111111010000 -011010111110 -010011001111 -000011110001 -100000101100 -011000101110 -000110110111 -000011110110 -101111011100 -101101111010 -100110111001 -101010001111 -100001100001 -100111100010 -101110010101 -100000010100 -100100000001 -011000010101 -000011001100 -110101100110 -101011111110 -010001101001 -010101110111 -111001000110 -000101001101 -101101010111 -011000001111 -001100110100 -111010000101 -010111111011 -010110001101 -010011101011 -010110110000 -111000101000 -000110100100 -111100101011 -110000100110 -110111010100 -101001111111 -111000001110 -011100000000 -100000110001 -101010001101 -001000010010 -111110001110 -001001011010 -101110010010 -100001000110 -001101111111 -110110011110 -100100010001 -000001001011 -110001111010 -111101000110 -010110111001 -101010001011 -111011010111 -110100100110 -100111111101 -111110011001 -110111001101 -000011100111 -000010100011 -000101100001 -100011100100 -011100001001 -000100111000 -101100011000 -000101000100 -011000001000 -011011101110 -100110110101 -001111001111 -011000011110 -100001100110 -101110010001 -110000111001 -011100011111 -101001010000 -111010010011 -011011001100 -100111101110 -010001111110 -110110000101 -100111110011 -010010010110 -111110100100 -100000011100 -101101100001 -110000101011 -000111100000 -100000101011 -000010000000 -010110100100 -111010011001 -000101110100 -111111001011 -000111000010 -110000000101 -100111000010 -101101101001 -011000110110 -010000101110 -111100100110 -111001110001 -000001100111 -001110101010 -110000101101 -100111000111 -100101010111 -100101111010 -011001001010 -000110011010 -010111011000 -011010010100 -011101101011 -101010111011 -110001101001 -010010100010 -111000001000 -000100101111 -011110111011 -001010101110 -011101111101 -101010111110 -100001000010 -111011000011 -001001100000 -110111100111 -110000010111 -111111111011 -011000101101 -001111000010 -010010001100 -111010010101 -001001100111 -101100010000 -000101110110 -000100000111 -011000000111 -001001111010 -011011010011 -001011100101 -011010111100 -100010011011 -100101111101 -000110010111 -101000101110 -100000110110 -111011110011 -110110001011 -100111011010 -100100011000 -100000111011 -010100100110 -100011100000 -111001011111 -101011111100 -111011001000 -011110010101 -010011000110 -001110010110 -010010011010 -010011100111 -101001101100 -110100000111 -110001101111 -010100000111 diff --git a/src/AdventOfCode/Year2021/Day03.hs b/src/AdventOfCode/Year2021/Day03.hs index 47b53df..b06f03a 100644 --- a/src/AdventOfCode/Year2021/Day03.hs +++ b/src/AdventOfCode/Year2021/Day03.hs @@ -1,30 +1,30 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2021.Day03 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) -import Control.Applicative ((<|>)) -import Control.Arrow ((&&&)) -import Control.Category ((>>>)) -import Data.Bool (bool) -import Data.Char (digitToInt) -import Data.Functor (($>)) -import Data.List (foldl1') -import Text.Trifecta (char, newline, sepEndBy, some) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import Data.List (foldl1', (!!)) +import Relude +import Text.Trifecta (char, newline, sepEndBy) main :: IO () -main = $(defaultMain) +main = $(defaultMainPuzzle) getInput :: IO [[Bool]] -getInput = parseInput (some bit `sepEndBy` newline) $(inputFilePath) +getInput = parseInputAoC 2021 3 (some bit `sepEndBy` newline) where bit = - char '0' $> False - <|> char '1' $> True + char '0' + $> False + <|> char '1' + $> True example :: [[Bool]] example = map - (map (toEnum . digitToInt)) + (map (== '1')) [ "00100", "11110", "10110", @@ -39,18 +39,17 @@ example = "01010" ] -partOne :: [[Bool]] -> Int -partOne diagnostics = gammaRate * epsilonRate +partOne :: SimplePuzzle [[Bool]] Int +partOne = + asks + $ (mkPivot &&& mkSums) + >>> (mkRate (>) &&& mkRate (<)) + >>> uncurry (*) where - gammaRate = mkRate (>) - epsilonRate = mkRate (<) - - mkRate cmp = binToDec ((`cmp` pivot) <$> sums) - pivot = mkPivot diagnostics - sums = mkSums diagnostics + mkRate cmp (pivot, sums) = binToDec ((`cmp` pivot) <$> sums) -partTwo :: [[Bool]] -> Int -partTwo = (generatorRating 0 &&& scrubberRating 0) >>> uncurry (*) +partTwo :: SimplePuzzle [[Bool]] Int +partTwo = asks $ (generatorRating 0 &&& scrubberRating 0) >>> uncurry (*) where generatorRating = keepBit (>=) scrubberRating = keepBit (<) @@ -58,7 +57,7 @@ partTwo = (generatorRating 0 &&& scrubberRating 0) >>> uncurry (*) keepBit cmp n diagnostics = case filter p diagnostics of [rating] -> binToDec rating - diagnostics' -> keepBit cmp (succ n) diagnostics' + diagnostics' -> keepBit cmp (n + 1) diagnostics' where p = bool not id (sums !! n `cmp` pivot) . (!! n) pivot = mkPivot diagnostics From 13c11d64a7d1d56979982b4781d6c6c80a4fe087 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Mon, 24 Nov 2025 22:42:23 -0600 Subject: [PATCH 47/91] refactor(2021.02-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2021/day02.txt | 1000 ---------------------------- src/AdventOfCode/Year2021/Day02.hs | 68 +- 3 files changed, 37 insertions(+), 1033 deletions(-) delete mode 100644 input/2021/day02.txt diff --git a/VERSION b/VERSION index 8fd4f75..38f8aab 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.68 \ No newline at end of file +2024.7.2.69 \ No newline at end of file diff --git a/input/2021/day02.txt b/input/2021/day02.txt deleted file mode 100644 index ba22f2f..0000000 --- a/input/2021/day02.txt +++ /dev/null @@ -1,1000 +0,0 @@ -forward 9 -forward 7 -down 7 -down 3 -forward 2 -forward 3 -forward 7 -down 6 -forward 7 -down 7 -forward 9 -down 9 -up 2 -down 5 -up 1 -forward 5 -forward 6 -up 4 -down 3 -down 4 -down 5 -up 6 -down 3 -forward 6 -forward 4 -down 4 -forward 5 -down 2 -up 1 -up 8 -down 1 -down 6 -forward 8 -down 4 -forward 8 -forward 6 -forward 2 -forward 2 -forward 3 -forward 8 -up 9 -up 2 -down 3 -up 3 -forward 5 -forward 2 -up 5 -forward 9 -down 7 -down 2 -up 7 -down 4 -down 6 -up 2 -down 9 -forward 7 -down 8 -forward 6 -up 1 -forward 6 -forward 4 -down 5 -forward 6 -down 8 -down 3 -forward 7 -down 8 -up 7 -down 1 -up 1 -forward 9 -down 7 -up 3 -down 6 -down 6 -down 6 -down 7 -down 9 -down 6 -down 9 -down 8 -down 3 -down 7 -down 3 -up 8 -down 5 -down 9 -up 4 -forward 5 -forward 5 -forward 2 -up 1 -forward 6 -down 6 -down 2 -forward 1 -forward 8 -down 4 -down 1 -down 8 -down 7 -forward 6 -forward 8 -down 8 -up 1 -up 1 -forward 1 -forward 3 -up 8 -down 1 -forward 4 -down 3 -forward 3 -forward 4 -forward 3 -down 3 -down 9 -down 3 -up 6 -forward 6 -forward 8 -forward 2 -up 1 -up 4 -up 4 -down 2 -down 2 -down 2 -forward 7 -up 9 -down 9 -up 1 -down 5 -forward 4 -down 2 -down 4 -forward 3 -down 7 -down 9 -forward 1 -up 5 -down 5 -down 5 -forward 2 -down 6 -forward 8 -up 4 -forward 6 -up 1 -down 4 -forward 2 -down 9 -forward 5 -down 7 -down 8 -down 9 -forward 6 -up 6 -forward 9 -forward 9 -down 7 -forward 7 -forward 5 -up 9 -forward 3 -down 9 -down 1 -down 8 -down 4 -forward 5 -forward 6 -forward 8 -forward 8 -down 4 -down 3 -down 8 -forward 3 -down 6 -down 8 -down 2 -up 8 -up 9 -down 6 -forward 3 -down 4 -down 6 -forward 9 -forward 6 -up 2 -down 8 -forward 2 -down 7 -forward 9 -up 9 -down 9 -down 2 -forward 9 -down 4 -down 9 -up 4 -forward 6 -down 2 -down 9 -forward 8 -forward 2 -up 8 -forward 9 -forward 2 -forward 3 -down 2 -up 3 -forward 9 -down 6 -down 3 -down 1 -forward 9 -forward 8 -down 9 -up 7 -down 8 -up 7 -forward 1 -forward 1 -forward 7 -down 2 -down 1 -up 1 -up 6 -down 5 -up 9 -up 7 -forward 1 -forward 6 -forward 1 -up 4 -down 6 -forward 2 -up 7 -down 2 -up 8 -forward 9 -forward 6 -forward 3 -forward 8 -down 1 -forward 8 -up 3 -forward 1 -forward 1 -up 9 -down 1 -down 8 -down 2 -forward 8 -down 8 -forward 7 -down 5 -forward 8 -forward 3 -forward 6 -forward 7 -up 5 -down 5 -forward 8 -down 2 -forward 3 -down 4 -down 9 -forward 6 -forward 5 -up 4 -forward 7 -down 3 -forward 9 -forward 5 -down 3 -up 5 -forward 4 -forward 8 -down 7 -up 2 -forward 7 -down 5 -up 2 -down 9 -forward 4 -down 3 -forward 5 -forward 4 -down 3 -forward 6 -up 1 -forward 8 -down 1 -up 7 -forward 8 -up 1 -up 1 -forward 2 -down 8 -forward 4 -forward 8 -up 6 -forward 5 -forward 7 -up 6 -up 4 -up 6 -down 1 -forward 3 -down 1 -down 1 -down 8 -forward 8 -down 5 -down 5 -forward 5 -forward 9 -down 9 -forward 7 -down 3 -down 5 -forward 6 -down 1 -down 5 -up 8 -down 9 -forward 3 -down 6 -up 2 -down 2 -forward 2 -up 2 -forward 8 -down 2 -forward 9 -forward 2 -down 7 -down 5 -forward 1 -forward 7 -up 6 -up 8 -forward 8 -forward 8 -up 3 -forward 8 -down 6 -down 6 -forward 4 -down 8 -down 5 -down 7 -forward 1 -forward 9 -forward 9 -up 5 -down 9 -down 1 -forward 4 -forward 1 -up 9 -forward 6 -down 6 -forward 2 -up 6 -forward 9 -up 1 -down 2 -up 3 -forward 2 -forward 1 -forward 6 -down 9 -up 1 -forward 7 -up 3 -forward 6 -forward 6 -up 2 -down 8 -forward 4 -down 4 -forward 2 -forward 2 -down 4 -down 7 -down 4 -down 5 -forward 3 -down 1 -forward 1 -forward 8 -down 7 -up 1 -forward 7 -forward 2 -down 9 -down 2 -up 2 -forward 3 -down 4 -down 7 -down 8 -forward 4 -forward 5 -forward 3 -up 3 -down 6 -forward 4 -forward 4 -forward 8 -forward 1 -up 2 -up 3 -down 4 -up 9 -forward 1 -forward 1 -forward 9 -down 2 -down 5 -up 9 -down 7 -down 9 -down 2 -down 4 -forward 1 -forward 1 -forward 8 -down 9 -down 6 -forward 2 -up 3 -down 8 -forward 1 -forward 8 -forward 4 -up 7 -forward 5 -forward 2 -forward 2 -up 8 -down 5 -forward 6 -down 3 -up 5 -forward 8 -forward 3 -forward 9 -down 1 -down 3 -forward 8 -down 2 -forward 6 -forward 2 -down 3 -down 3 -forward 6 -forward 4 -forward 7 -forward 2 -up 7 -up 4 -up 6 -forward 9 -down 3 -down 3 -up 7 -down 4 -up 3 -up 3 -down 5 -forward 1 -up 3 -down 1 -forward 2 -up 9 -forward 7 -down 6 -forward 4 -forward 8 -up 1 -forward 6 -down 7 -down 4 -up 9 -forward 4 -down 7 -up 1 -forward 9 -down 4 -down 7 -forward 1 -down 6 -down 6 -forward 3 -up 8 -forward 3 -down 1 -down 5 -down 8 -forward 2 -up 5 -forward 2 -up 7 -forward 5 -forward 1 -forward 3 -forward 4 -forward 5 -up 1 -forward 9 -down 5 -down 7 -up 9 -down 9 -forward 7 -up 6 -up 7 -forward 2 -forward 1 -up 4 -forward 6 -forward 9 -down 1 -forward 4 -down 5 -forward 4 -down 3 -down 5 -forward 6 -forward 3 -down 3 -down 8 -down 2 -down 4 -down 6 -down 4 -forward 2 -up 9 -down 3 -forward 1 -forward 9 -forward 5 -forward 5 -forward 9 -up 1 -down 4 -down 4 -up 7 -down 3 -up 3 -up 4 -forward 3 -forward 1 -forward 8 -up 6 -down 8 -down 4 -forward 7 -forward 9 -forward 2 -forward 8 -up 2 -down 4 -down 5 -forward 9 -down 6 -down 7 -down 8 -up 8 -forward 3 -forward 7 -forward 8 -up 2 -down 9 -down 6 -forward 3 -forward 4 -down 4 -forward 2 -up 6 -forward 1 -forward 7 -down 2 -down 1 -forward 2 -forward 2 -down 2 -forward 2 -forward 7 -up 4 -down 3 -forward 9 -down 7 -down 7 -down 6 -forward 3 -forward 9 -down 9 -forward 2 -down 5 -down 4 -down 9 -up 9 -down 6 -down 8 -down 1 -forward 8 -up 4 -up 4 -down 8 -forward 6 -down 2 -forward 4 -forward 3 -forward 2 -forward 4 -down 4 -forward 6 -down 9 -up 7 -up 5 -down 7 -down 4 -up 3 -forward 4 -down 9 -forward 6 -forward 4 -forward 4 -down 9 -forward 3 -forward 2 -up 7 -forward 3 -down 1 -down 3 -up 5 -down 8 -down 3 -down 4 -forward 7 -forward 9 -up 2 -forward 3 -up 4 -down 5 -up 3 -up 9 -down 6 -down 2 -down 5 -up 4 -up 6 -forward 4 -forward 6 -up 5 -up 5 -forward 8 -down 6 -forward 6 -down 7 -down 5 -down 3 -down 8 -forward 6 -forward 9 -forward 9 -up 9 -down 3 -up 5 -forward 4 -down 7 -forward 5 -down 7 -down 4 -forward 2 -forward 9 -down 8 -up 3 -up 7 -down 7 -up 7 -forward 3 -down 2 -forward 7 -down 4 -forward 1 -down 6 -forward 1 -up 4 -down 7 -up 3 -forward 7 -forward 5 -forward 7 -forward 6 -up 2 -down 4 -down 8 -down 4 -up 3 -forward 3 -up 3 -up 3 -down 7 -down 2 -down 3 -forward 7 -down 6 -down 9 -up 1 -down 8 -down 6 -down 3 -up 2 -up 6 -forward 9 -forward 5 -forward 4 -forward 9 -down 9 -forward 2 -up 7 -down 4 -down 8 -up 2 -forward 6 -up 6 -up 4 -down 2 -forward 6 -forward 4 -up 3 -down 6 -forward 5 -forward 3 -up 4 -down 7 -down 2 -down 6 -up 7 -forward 2 -forward 1 -forward 3 -down 2 -forward 1 -forward 2 -forward 4 -down 2 -down 5 -down 7 -down 8 -down 1 -up 1 -up 1 -forward 9 -down 3 -down 1 -forward 4 -up 6 -up 8 -forward 7 -forward 9 -down 3 -forward 9 -down 9 -forward 6 -down 1 -forward 7 -down 9 -forward 1 -down 8 -forward 8 -up 7 -forward 4 -up 5 -up 9 -forward 1 -forward 4 -forward 3 -down 3 -down 8 -up 3 -forward 1 -up 5 -forward 5 -up 6 -forward 8 -forward 1 -down 7 -forward 2 -down 9 -forward 3 -forward 7 -forward 2 -down 4 -forward 2 -up 6 -down 7 -up 3 -forward 7 -down 8 -down 3 -forward 2 -up 7 -down 2 -down 8 -up 6 -forward 7 -forward 1 -down 3 -forward 2 -forward 8 -down 8 -forward 1 -down 7 -down 1 -up 5 -up 3 -forward 5 -down 5 -up 9 -up 9 -down 3 -up 3 -down 4 -down 6 -up 7 -forward 3 -up 5 -down 3 -forward 4 -down 1 -up 1 -up 6 -down 8 -forward 5 -up 2 -down 5 -forward 6 -forward 4 -forward 9 -down 9 -down 5 -forward 5 -down 7 -down 7 -down 8 -forward 3 -down 6 -forward 5 -forward 5 -down 6 -forward 3 -down 7 -up 4 -up 3 -down 5 -forward 9 -forward 9 -up 9 -down 1 -up 2 -up 3 -down 7 -forward 3 -down 7 -down 4 -down 5 -down 1 -down 4 -up 9 -forward 1 -up 8 -forward 7 -up 6 -down 1 -up 2 -forward 2 -up 9 -down 6 -forward 4 -down 2 -up 5 -forward 1 -forward 4 -down 6 -down 2 -up 8 -forward 2 -forward 8 -forward 4 -down 9 -up 3 -forward 5 -forward 9 -forward 4 -down 2 -up 4 -up 9 -down 5 -up 2 -forward 6 -up 2 -down 6 -up 5 -up 3 -up 9 -forward 8 -down 2 -forward 7 -up 8 -down 9 -forward 2 -forward 2 -down 6 -forward 9 -forward 2 -forward 8 -up 3 -forward 5 -down 4 -forward 2 -down 7 -up 6 -forward 7 -down 6 -down 8 -down 3 -up 4 -up 5 -down 2 -down 9 -forward 2 -down 7 -forward 2 -forward 3 -forward 9 -down 6 -down 1 -forward 6 -down 5 -forward 2 -down 5 -down 1 -forward 5 -down 4 -down 6 -down 5 -forward 9 -up 6 -up 5 -up 2 -down 1 -down 8 -forward 4 -down 2 -forward 5 -down 1 -forward 7 -down 8 -down 9 -down 7 -up 1 -forward 2 -up 8 -down 9 -down 2 -down 1 -down 9 -down 2 -down 5 -forward 9 -forward 1 -down 1 -forward 9 -forward 7 -down 6 -down 1 -down 7 -forward 4 -forward 1 -forward 4 -forward 5 -forward 5 -down 2 -forward 7 -forward 6 -forward 3 -forward 9 -up 1 -down 5 -down 4 -down 2 -forward 1 -up 7 -forward 2 diff --git a/src/AdventOfCode/Year2021/Day02.hs b/src/AdventOfCode/Year2021/Day02.hs index f35397d..b74e742 100644 --- a/src/AdventOfCode/Year2021/Day02.hs +++ b/src/AdventOfCode/Year2021/Day02.hs @@ -1,17 +1,18 @@ +{-# LANGUAGE BlockArguments #-} {-# LANGUAGE DerivingVia #-} -{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2021.Day02 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) -import Control.Applicative ((<|>)) -import Data.Functor (($>)) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import AdventOfCode.Util ((<.>)) import Data.Monoid.Action (Action (..)) -import Data.Monoid.SemiDirectProduct.Strict (Semi, embed, inject, untag) -import Data.Semigroup (Sum (..)) +import Data.Monoid.SemiDirectProduct.Strict (embed, inject, untag) import Linear (V2 (..)) -import Text.Trifecta (Parser, natural, some, symbol) +import Relude +import Text.Trifecta (Parser, choice, natural, symbol) newtype Direction = Direction {unDirection :: V2 Int} deriving stock (Eq, Show) @@ -26,34 +27,35 @@ newtype Aim = Aim Int via (Sum Int) instance Action Aim Direction where - act (Aim a) (Direction (V2 x y)) = Direction (V2 x (y + a * x)) + act (Aim a) (Direction (V2 x y)) = + Direction (V2 x (y + a * x)) main :: IO () -main = $(defaultMain) +main = $(defaultMainPuzzle) getInput :: IO [Direction] -getInput = parseInput (some direction) $(inputFilePath) +getInput = parseInputAoC 2021 2 (some direction) -example :: [Direction] -example = - [ forward 5, - down 5, - forward 8, - up 3, - down 8, - forward 2 - ] +getExample :: IO [Direction] +getExample = + pure + [ forward 5, + down 5, + forward 8, + up 3, + down 8, + forward 2 + ] -partOne :: [Direction] -> Int -partOne = solve unDirection +partOne :: SimplePuzzle [Direction] Int +partOne = asks (solve unDirection) -partTwo :: [Direction] -> Int -partTwo = solve (unDirection . untag) . map lift - where - lift :: Direction -> Semi Direction Aim - lift dir@(Direction (V2 _ 0)) = inject dir - lift (Direction (V2 0 y)) = embed (Aim y) - lift _ = error "Invalid direction" +partTwo :: SimplePuzzle [Direction] Int +partTwo = + ask >>= solve (unDirection . untag) <.> traverse \case + dir@(Direction (V2 _ 0)) -> pure (inject dir) + Direction (V2 0 y) -> pure (embed (Aim y)) + _invalid -> fail "Invalid direction" solve :: (Monoid m) => (m -> V2 Int) -> [m] -> Int solve extract = product . extract . mconcat @@ -62,9 +64,11 @@ direction :: Parser Direction direction = dir <*> (fromInteger <$> natural) where dir = - symbol "forward" $> forward - <|> symbol "down" $> down - <|> symbol "up" $> up + choice + [ symbol "forward" $> forward, + symbol "down" $> down, + symbol "up" $> up + ] forward, down, up :: Int -> Direction forward = Direction . flip V2 0 From 1782b9cf9988843affed0469cff6ef0b5fb62ef8 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Mon, 24 Nov 2025 23:11:36 -0600 Subject: [PATCH 48/91] refactor(2021.01-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2021/day01.txt | 2000 ---------------------------- src/AdventOfCode/Year2021/Day01.hs | 27 +- 3 files changed, 16 insertions(+), 2013 deletions(-) delete mode 100644 input/2021/day01.txt diff --git a/VERSION b/VERSION index 38f8aab..06c319b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.69 \ No newline at end of file +2024.7.2.70 \ No newline at end of file diff --git a/input/2021/day01.txt b/input/2021/day01.txt deleted file mode 100644 index 6af96b4..0000000 --- a/input/2021/day01.txt +++ /dev/null @@ -1,2000 +0,0 @@ -162 -164 -165 -166 -175 -185 -182 -191 -205 -204 -198 -196 -197 -213 -216 -217 -218 -219 -213 -219 -221 -222 -227 -231 -221 -211 -230 -232 -241 -243 -256 -272 -274 -273 -279 -287 -288 -287 -286 -288 -289 -291 -292 -294 -292 -296 -307 -314 -326 -332 -337 -347 -330 -333 -346 -344 -357 -362 -365 -366 -328 -323 -350 -362 -336 -346 -348 -325 -329 -330 -329 -333 -365 -363 -376 -377 -369 -343 -365 -360 -362 -377 -376 -379 -374 -376 -377 -369 -371 -374 -375 -377 -384 -401 -372 -374 -363 -372 -363 -377 -342 -340 -342 -344 -345 -351 -352 -353 -354 -330 -332 -324 -326 -335 -327 -324 -316 -324 -308 -311 -302 -314 -328 -340 -341 -338 -336 -337 -335 -323 -327 -321 -322 -302 -315 -289 -288 -287 -300 -294 -298 -297 -288 -289 -290 -288 -287 -283 -292 -306 -304 -306 -326 -336 -337 -340 -343 -352 -374 -373 -377 -357 -352 -357 -360 -373 -375 -377 -380 -384 -407 -409 -402 -405 -403 -426 -429 -428 -431 -399 -393 -399 -401 -418 -420 -421 -440 -446 -447 -450 -448 -463 -456 -458 -421 -409 -407 -394 -414 -412 -417 -418 -413 -414 -417 -418 -427 -426 -425 -426 -424 -431 -450 -448 -470 -484 -489 -466 -477 -479 -488 -489 -494 -501 -502 -505 -509 -514 -516 -522 -533 -537 -536 -546 -549 -539 -522 -523 -537 -536 -555 -556 -554 -541 -555 -557 -558 -573 -574 -571 -572 -573 -581 -580 -572 -586 -579 -581 -589 -597 -593 -598 -599 -600 -614 -622 -623 -646 -642 -652 -653 -655 -657 -663 -665 -667 -669 -655 -642 -643 -645 -660 -661 -658 -656 -661 -673 -672 -673 -680 -690 -691 -699 -698 -702 -716 -757 -758 -759 -778 -792 -789 -790 -791 -797 -806 -809 -801 -800 -802 -805 -814 -811 -836 -827 -836 -848 -855 -856 -857 -859 -855 -858 -864 -866 -875 -877 -865 -871 -879 -862 -869 -872 -879 -881 -883 -872 -861 -869 -867 -871 -888 -889 -893 -894 -897 -885 -891 -890 -910 -907 -909 -915 -940 -941 -944 -947 -938 -935 -927 -922 -932 -933 -895 -896 -897 -922 -931 -927 -936 -938 -962 -972 -973 -1010 -1003 -1004 -1003 -1004 -1007 -1000 -1015 -1017 -1006 -1008 -1021 -1019 -1018 -1003 -1010 -1011 -1016 -1017 -1025 -1008 -1001 -1007 -1015 -1001 -1004 -1010 -993 -994 -992 -994 -997 -990 -991 -1018 -1033 -1047 -1038 -1037 -1043 -1047 -1056 -1042 -1048 -1059 -1063 -1045 -1053 -1051 -1071 -1060 -1069 -1074 -1076 -1082 -1085 -1081 -1084 -1089 -1091 -1079 -1101 -1100 -1109 -1108 -1109 -1100 -1098 -1100 -1098 -1099 -1095 -1097 -1119 -1115 -1116 -1117 -1121 -1126 -1167 -1168 -1178 -1180 -1169 -1170 -1168 -1169 -1176 -1178 -1167 -1169 -1163 -1184 -1174 -1175 -1202 -1206 -1212 -1213 -1222 -1233 -1234 -1216 -1218 -1219 -1223 -1222 -1205 -1208 -1206 -1207 -1208 -1209 -1222 -1223 -1219 -1220 -1223 -1228 -1260 -1275 -1278 -1263 -1281 -1293 -1292 -1307 -1299 -1297 -1298 -1295 -1297 -1299 -1300 -1301 -1299 -1313 -1314 -1319 -1316 -1294 -1299 -1315 -1316 -1327 -1331 -1332 -1333 -1342 -1340 -1327 -1332 -1335 -1333 -1353 -1357 -1347 -1350 -1351 -1352 -1353 -1360 -1361 -1372 -1373 -1389 -1404 -1409 -1403 -1407 -1412 -1409 -1413 -1414 -1416 -1422 -1426 -1418 -1436 -1441 -1437 -1431 -1407 -1437 -1430 -1447 -1453 -1456 -1475 -1484 -1486 -1507 -1498 -1500 -1496 -1513 -1499 -1505 -1506 -1500 -1502 -1504 -1506 -1513 -1514 -1516 -1508 -1514 -1518 -1514 -1510 -1501 -1495 -1512 -1513 -1510 -1513 -1521 -1520 -1527 -1536 -1525 -1534 -1535 -1512 -1514 -1520 -1521 -1525 -1526 -1527 -1546 -1550 -1560 -1564 -1572 -1570 -1576 -1584 -1586 -1588 -1592 -1588 -1602 -1592 -1615 -1589 -1592 -1594 -1591 -1595 -1601 -1613 -1618 -1623 -1630 -1631 -1645 -1602 -1606 -1608 -1609 -1610 -1604 -1606 -1605 -1621 -1630 -1635 -1646 -1648 -1646 -1648 -1657 -1687 -1676 -1679 -1680 -1683 -1681 -1682 -1681 -1682 -1680 -1679 -1680 -1682 -1695 -1704 -1711 -1714 -1720 -1746 -1750 -1748 -1753 -1754 -1763 -1765 -1783 -1792 -1793 -1798 -1801 -1800 -1803 -1784 -1785 -1784 -1787 -1790 -1784 -1788 -1783 -1785 -1787 -1794 -1795 -1798 -1799 -1803 -1805 -1806 -1786 -1787 -1816 -1812 -1813 -1816 -1818 -1812 -1838 -1837 -1839 -1832 -1834 -1838 -1840 -1855 -1856 -1842 -1841 -1850 -1852 -1851 -1853 -1859 -1853 -1881 -1882 -1886 -1899 -1897 -1910 -1906 -1907 -1906 -1901 -1896 -1897 -1883 -1889 -1890 -1896 -1877 -1888 -1889 -1895 -1896 -1893 -1858 -1855 -1863 -1871 -1878 -1879 -1877 -1878 -1874 -1906 -1921 -1927 -1924 -1925 -1929 -1928 -1933 -1923 -1926 -1904 -1892 -1889 -1906 -1908 -1909 -1924 -1926 -1948 -1949 -1951 -1991 -1990 -1996 -1997 -2009 -2007 -2006 -2012 -2029 -2036 -2039 -2040 -2049 -2051 -2052 -2065 -2063 -2065 -2064 -2065 -2067 -2072 -2069 -2051 -2049 -2046 -2045 -2047 -2039 -2037 -2041 -2044 -2043 -2033 -2034 -2024 -2026 -2023 -2013 -2014 -2015 -2017 -2019 -2018 -2019 -2018 -2020 -2021 -2024 -2029 -2017 -2048 -2049 -2027 -2028 -2023 -2040 -2033 -2037 -2056 -2096 -2097 -2093 -2110 -2111 -2110 -2120 -2122 -2106 -2122 -2124 -2118 -2120 -2128 -2127 -2134 -2135 -2149 -2151 -2178 -2179 -2180 -2179 -2188 -2198 -2196 -2204 -2214 -2222 -2223 -2222 -2221 -2247 -2249 -2257 -2267 -2266 -2265 -2268 -2261 -2266 -2268 -2269 -2275 -2274 -2275 -2289 -2283 -2284 -2276 -2278 -2274 -2275 -2279 -2280 -2264 -2260 -2270 -2274 -2282 -2273 -2274 -2270 -2269 -2268 -2274 -2280 -2300 -2301 -2303 -2301 -2306 -2316 -2337 -2349 -2363 -2373 -2377 -2381 -2380 -2402 -2408 -2407 -2406 -2404 -2405 -2409 -2411 -2421 -2420 -2419 -2422 -2415 -2418 -2426 -2396 -2399 -2398 -2411 -2413 -2414 -2393 -2400 -2393 -2389 -2400 -2404 -2405 -2408 -2405 -2409 -2411 -2423 -2427 -2428 -2429 -2418 -2419 -2426 -2428 -2443 -2451 -2464 -2465 -2483 -2476 -2479 -2480 -2481 -2482 -2476 -2464 -2506 -2499 -2500 -2490 -2486 -2480 -2481 -2482 -2507 -2515 -2519 -2526 -2516 -2523 -2530 -2536 -2537 -2538 -2555 -2564 -2553 -2565 -2548 -2537 -2538 -2533 -2537 -2550 -2553 -2541 -2543 -2546 -2550 -2554 -2555 -2573 -2578 -2575 -2595 -2601 -2600 -2582 -2583 -2585 -2579 -2581 -2582 -2590 -2588 -2589 -2595 -2584 -2585 -2584 -2592 -2602 -2607 -2611 -2627 -2636 -2646 -2643 -2648 -2654 -2648 -2649 -2654 -2652 -2653 -2656 -2657 -2658 -2687 -2699 -2702 -2679 -2681 -2684 -2683 -2681 -2683 -2684 -2701 -2709 -2711 -2715 -2716 -2725 -2715 -2719 -2720 -2716 -2717 -2704 -2707 -2705 -2695 -2697 -2696 -2699 -2697 -2698 -2718 -2722 -2726 -2727 -2728 -2724 -2722 -2731 -2732 -2728 -2725 -2722 -2728 -2735 -2729 -2731 -2733 -2739 -2734 -2757 -2763 -2765 -2772 -2771 -2772 -2768 -2765 -2759 -2772 -2775 -2767 -2771 -2774 -2770 -2758 -2772 -2775 -2789 -2791 -2793 -2800 -2780 -2791 -2777 -2778 -2774 -2779 -2780 -2779 -2780 -2781 -2783 -2788 -2796 -2800 -2799 -2807 -2811 -2825 -2826 -2831 -2842 -2843 -2852 -2854 -2858 -2841 -2842 -2837 -2838 -2839 -2843 -2861 -2888 -2892 -2886 -2885 -2904 -2905 -2927 -2928 -2929 -2915 -2917 -2895 -2901 -2923 -2932 -2934 -2936 -2938 -2944 -2947 -2951 -2959 -2958 -2956 -2944 -2942 -2941 -2942 -2929 -2946 -2954 -2948 -2949 -2973 -2980 -2981 -2994 -2997 -3021 -3038 -3047 -3060 -3058 -3061 -3057 -3073 -3074 -3094 -3126 -3125 -3126 -3122 -3123 -3122 -3120 -3115 -3114 -3113 -3117 -3122 -3121 -3123 -3133 -3134 -3138 -3152 -3153 -3155 -3154 -3159 -3156 -3153 -3159 -3160 -3161 -3157 -3158 -3160 -3161 -3170 -3202 -3204 -3225 -3211 -3207 -3209 -3211 -3206 -3207 -3214 -3213 -3206 -3199 -3198 -3208 -3225 -3226 -3227 -3238 -3208 -3209 -3210 -3211 -3214 -3209 -3210 -3233 -3232 -3233 -3234 -3237 -3240 -3246 -3252 -3239 -3246 -3248 -3246 -3248 -3250 -3258 -3259 -3260 -3271 -3272 -3280 -3288 -3279 -3272 -3274 -3280 -3288 -3292 -3313 -3307 -3302 -3303 -3304 -3302 -3304 -3307 -3320 -3306 -3303 -3304 -3303 -3292 -3293 -3282 -3285 -3286 -3281 -3276 -3283 -3246 -3247 -3254 -3268 -3267 -3274 -3276 -3288 -3289 -3288 -3275 -3274 -3276 -3271 -3273 -3271 -3270 -3265 -3271 -3266 -3258 -3259 -3256 -3255 -3250 -3261 -3265 -3263 -3264 -3265 -3279 -3280 -3285 -3301 -3304 -3291 -3283 -3300 -3301 -3295 -3298 -3297 -3296 -3291 -3294 -3297 -3301 -3298 -3299 -3265 -3266 -3270 -3265 -3282 -3289 -3288 -3290 -3289 -3291 -3293 -3295 -3296 -3297 -3269 -3280 -3281 -3282 -3291 -3306 -3304 -3305 -3306 -3329 -3327 -3331 -3332 -3334 -3338 -3318 -3315 -3323 -3324 -3325 -3327 -3328 -3326 -3329 -3342 -3343 -3344 -3345 -3346 -3345 -3321 -3320 -3318 -3315 -3318 -3344 -3349 -3354 -3353 -3351 -3362 -3379 -3395 -3421 -3423 -3411 -3406 -3403 -3407 -3408 -3406 -3408 -3413 -3407 -3423 -3435 -3437 -3438 -3441 -3452 -3453 -3452 -3453 -3457 -3463 -3456 -3439 -3437 -3441 -3439 -3442 -3443 -3445 -3452 -3459 -3474 -3466 -3456 -3480 -3479 -3481 -3497 -3500 -3494 -3496 -3502 -3486 -3489 -3496 -3505 -3526 -3543 -3549 -3550 -3552 -3555 -3559 -3558 -3566 -3568 -3567 -3568 -3569 -3555 -3576 -3567 -3566 -3563 -3590 -3597 -3622 -3623 -3610 -3611 -3615 -3616 -3620 -3653 -3662 -3649 -3661 -3664 -3656 -3672 -3680 -3681 -3687 -3693 -3692 -3706 -3686 -3685 -3675 -3669 -3672 -3673 -3667 -3674 -3677 -3663 -3685 -3681 -3682 -3695 -3688 -3702 -3708 -3709 -3708 -3711 -3707 -3729 -3730 -3748 -3775 -3779 -3780 -3784 -3797 -3803 -3822 -3843 -3860 -3888 -3875 -3866 -3869 -3878 -3877 -3886 -3888 -3889 -3894 -3905 -3919 -3921 -3922 -3964 -3965 -3967 -3960 -3978 -3977 -3983 -3989 -3997 -3999 -4010 -3998 -3999 -4013 -4025 -4033 -4050 -4051 -4053 -4052 -4050 -4051 -4052 -4053 -4069 -4071 -4079 -4082 -4083 -4085 -4081 -4076 -4090 -4091 -4098 -4105 -4121 -4119 -4124 -4130 -4132 -4131 -4130 -4094 -4106 -4105 -4100 -4098 -4092 -4091 -4093 -4091 -4101 -4102 -4104 -4105 -4100 -4111 -4133 -4134 -4140 -4136 -4121 -4120 -4139 -4140 -4141 -4140 -4144 -4152 -4133 -4136 -4148 -4149 -4148 -4166 -4171 -4162 -4179 -4175 -4185 -4186 -4201 -4218 -4226 -4224 -4214 -4212 -4187 -4191 -4194 -4193 -4196 -4199 -4195 -4196 -4178 -4177 -4180 -4172 -4173 -4166 -4172 -4175 -4180 -4185 -4186 -4189 -4190 -4191 -4193 -4195 -4209 -4218 -4221 -4223 -4215 -4182 -4181 -4194 -4202 -4203 -4204 -4208 -4210 -4218 -4217 -4216 -4224 -4238 -4239 -4246 -4249 -4250 -4222 -4219 -4246 -4261 -4263 -4272 -4277 -4276 -4277 -4279 -4292 -4281 -4282 -4261 -4268 -4264 -4265 -4272 -4277 -4278 -4281 -4282 -4304 -4296 -4288 -4305 -4306 -4304 -4306 -4307 -4310 -4290 -4280 -4281 -4282 -4283 -4299 -4298 -4299 -4300 -4284 -4292 -4303 -4306 -4304 -4288 -4291 -4288 -4285 -4297 -4296 -4297 -4298 -4291 -4275 -4269 -4270 -4269 -4268 -4285 -4287 -4288 -4287 -4288 -4289 -4280 -4279 -4286 -4289 -4285 -4286 -4287 -4297 -4294 -4319 -4306 -4333 -4338 -4339 -4332 -4337 -4338 -4325 -4320 -4318 -4308 -4317 -4337 -4336 -4338 -4340 -4343 -4324 -4325 -4326 -4323 -4322 -4327 -4329 -4333 -4341 -4347 -4372 -4375 -4378 -4371 -4374 -4373 -4369 -4371 -4389 -4392 -4372 -4382 -4383 -4384 -4381 -4390 -4391 -4394 -4416 -4430 -4398 -4403 -4394 -4383 -4399 -4387 -4418 -4431 -4434 -4417 -4418 -4417 -4420 -4430 -4426 -4429 -4430 -4429 -4430 -4440 -4449 -4450 -4434 -4452 -4444 -4446 -4439 -4440 -4414 -4407 -4408 -4410 -4411 -4420 -4445 -4454 -4455 -4451 -4456 -4455 -4449 -4470 -4469 -4473 -4470 -4488 -4470 -4466 -4463 -4477 -4481 -4494 -4493 -4491 -4486 -4475 -4479 -4484 -4485 -4497 -4472 -4473 -4490 -4499 -4507 -4515 -4521 -4554 -4555 -4538 -4526 -4539 -4543 -4537 -4541 -4543 -4527 -4538 -4537 -4536 -4550 -4554 -4567 -4585 -4603 -4623 -4624 -4626 -4629 -4627 -4629 -4628 -4636 -4640 -4647 -4649 -4651 -4655 -4626 -4631 -4632 -4630 -4622 -4625 -4632 -4652 -4657 -4661 -4650 -4654 -4656 -4658 -4659 -4676 -4675 -4681 -4694 -4714 -4723 -4706 -4707 -4741 -4743 -4718 -4714 -4715 -4697 -4699 -4698 -4696 -4703 -4702 -4704 -4709 -4726 -4725 -4743 -4747 -4765 -4766 -4768 -4764 -4768 -4770 -4777 -4778 -4779 -4786 -4804 -4806 -4790 -4797 -4808 -4809 -4806 -4808 -4818 -4822 -4823 -4854 -4855 -4885 -4902 -4903 -4905 -4906 -4908 -4907 -4909 -4915 -4916 -4906 -4935 -4949 -4948 -4952 -4964 -4960 -4962 -4975 -4976 -4987 -4996 -4994 -4996 -4997 -5000 -5001 -4986 -4988 -4999 -4997 -4998 -4997 -5004 -5005 -5006 -5004 -5005 -5018 -5019 -5021 -5022 -5028 -5057 -5058 -5063 -5067 -5068 diff --git a/src/AdventOfCode/Year2021/Day01.hs b/src/AdventOfCode/Year2021/Day01.hs index 77f47b6..119b784 100644 --- a/src/AdventOfCode/Year2021/Day01.hs +++ b/src/AdventOfCode/Year2021/Day01.hs @@ -1,25 +1,28 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2021.Day01 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (count) -import Control.Arrow ((&&&)) -import Text.Trifecta (natural, some) +import Relude +import Text.Trifecta (natural) main :: IO () -main = $(defaultMain) +main = $(defaultMainPuzzle) getInput :: IO [Integer] -getInput = parseInput (some natural) $(inputFilePath) +getInput = parseInputAoC 2021 1 (some natural) -example :: [Integer] -example = [199, 200, 208, 210, 200, 207, 240, 269, 260, 263] +getExample :: IO [Integer] +getExample = pure [199, 200, 208, 210, 200, 207, 240, 269, 260, 263] -partOne :: [Integer] -> Int -partOne = countPairwiseIncreases 1 +partOne :: SimplePuzzle [Integer] Int +partOne = asks (countPairwiseIncreases 1) -partTwo :: [Integer] -> Int -partTwo = countPairwiseIncreases 3 +partTwo :: SimplePuzzle [Integer] Int +partTwo = asks (countPairwiseIncreases 3) countPairwiseIncreases :: (Ord a) => Int -> [a] -> Int countPairwiseIncreases n = From 2f2283fde04cea9d003f052559361d20e85bb24c Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Mon, 24 Nov 2025 23:16:49 -0600 Subject: [PATCH 49/91] refactor(2019.09-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2019/day09.txt | 1 - src/AdventOfCode/Year2019/Day09.hs | 5 ++--- 3 files changed, 3 insertions(+), 5 deletions(-) delete mode 100644 input/2019/day09.txt diff --git a/VERSION b/VERSION index 06c319b..1207833 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.70 \ No newline at end of file +2024.7.2.71 \ No newline at end of file diff --git a/input/2019/day09.txt b/input/2019/day09.txt deleted file mode 100644 index cb704b9..0000000 --- a/input/2019/day09.txt +++ /dev/null @@ -1 +0,0 @@ -1102,34463338,34463338,63,1007,63,34463338,63,1005,63,53,1102,3,1,1000,109,988,209,12,9,1000,209,6,209,3,203,0,1008,1000,1,63,1005,63,65,1008,1000,2,63,1005,63,904,1008,1000,0,63,1005,63,58,4,25,104,0,99,4,0,104,0,99,4,17,104,0,99,0,0,1101,0,31,1019,1101,25,0,1008,1102,35,1,1009,1102,422,1,1029,1102,1,21,1005,1102,1,734,1027,1102,29,1,1000,1101,32,0,1018,1102,28,1,1016,1101,0,38,1015,1101,0,378,1023,1101,30,0,1017,1102,1,381,1022,1101,0,37,1006,1102,1,1,1021,1101,0,24,1011,1102,1,23,1002,1101,0,0,1020,1101,0,20,1007,1101,427,0,1028,1101,26,0,1014,1101,27,0,1010,1101,0,39,1001,1101,34,0,1012,1102,1,36,1013,1101,0,33,1003,1101,804,0,1025,1101,737,0,1026,1102,1,809,1024,1102,1,22,1004,109,9,1201,-7,0,63,1008,63,20,63,1005,63,205,1001,64,1,64,1106,0,207,4,187,1002,64,2,64,109,2,21102,40,1,1,1008,1012,40,63,1005,63,233,4,213,1001,64,1,64,1106,0,233,1002,64,2,64,109,4,1208,-7,25,63,1005,63,255,4,239,1001,64,1,64,1106,0,255,1002,64,2,64,109,-24,1207,10,38,63,1005,63,271,1105,1,277,4,261,1001,64,1,64,1002,64,2,64,109,25,21107,41,40,-3,1005,1013,293,1105,1,299,4,283,1001,64,1,64,1002,64,2,64,109,5,1205,-1,311,1106,0,317,4,305,1001,64,1,64,1002,64,2,64,109,-23,1202,6,1,63,1008,63,22,63,1005,63,339,4,323,1105,1,343,1001,64,1,64,1002,64,2,64,109,1,2101,0,2,63,1008,63,37,63,1005,63,367,1001,64,1,64,1106,0,369,4,349,1002,64,2,64,109,29,2105,1,-5,1106,0,387,4,375,1001,64,1,64,1002,64,2,64,109,-26,2101,0,0,63,1008,63,23,63,1005,63,409,4,393,1106,0,413,1001,64,1,64,1002,64,2,64,109,26,2106,0,0,4,419,1106,0,431,1001,64,1,64,1002,64,2,64,109,-17,21108,42,42,6,1005,1017,453,4,437,1001,64,1,64,1106,0,453,1002,64,2,64,109,7,21101,43,0,-8,1008,1010,44,63,1005,63,477,1001,64,1,64,1105,1,479,4,459,1002,64,2,64,109,-7,1206,10,495,1001,64,1,64,1106,0,497,4,485,1002,64,2,64,109,-5,2108,36,0,63,1005,63,513,1106,0,519,4,503,1001,64,1,64,1002,64,2,64,109,3,2102,1,-5,63,1008,63,22,63,1005,63,541,4,525,1105,1,545,1001,64,1,64,1002,64,2,64,109,3,1207,-6,38,63,1005,63,567,4,551,1001,64,1,64,1105,1,567,1002,64,2,64,109,-15,2107,20,8,63,1005,63,585,4,573,1106,0,589,1001,64,1,64,1002,64,2,64,109,-1,1208,5,36,63,1005,63,609,1001,64,1,64,1106,0,611,4,595,1002,64,2,64,109,30,21101,44,0,-7,1008,1019,44,63,1005,63,633,4,617,1106,0,637,1001,64,1,64,1002,64,2,64,109,-25,1201,0,0,63,1008,63,39,63,1005,63,659,4,643,1105,1,663,1001,64,1,64,1002,64,2,64,109,27,1206,-8,677,4,669,1106,0,681,1001,64,1,64,1002,64,2,64,109,-28,2108,29,0,63,1005,63,703,4,687,1001,64,1,64,1106,0,703,1002,64,2,64,109,5,21107,45,46,7,1005,1012,725,4,709,1001,64,1,64,1106,0,725,1002,64,2,64,109,30,2106,0,-8,1105,1,743,4,731,1001,64,1,64,1002,64,2,64,109,-22,21102,46,1,4,1008,1017,44,63,1005,63,767,1001,64,1,64,1105,1,769,4,749,1002,64,2,64,109,-15,1202,10,1,63,1008,63,23,63,1005,63,793,1001,64,1,64,1106,0,795,4,775,1002,64,2,64,109,19,2105,1,7,4,801,1105,1,813,1001,64,1,64,1002,64,2,64,109,6,1205,-2,827,4,819,1106,0,831,1001,64,1,64,1002,64,2,64,109,-20,2107,22,2,63,1005,63,851,1001,64,1,64,1106,0,853,4,837,1002,64,2,64,109,20,21108,47,44,-8,1005,1015,869,1105,1,875,4,859,1001,64,1,64,1002,64,2,64,109,-22,2102,1,4,63,1008,63,23,63,1005,63,899,1001,64,1,64,1106,0,901,4,881,4,64,99,21101,0,27,1,21102,915,1,0,1106,0,922,21201,1,28703,1,204,1,99,109,3,1207,-2,3,63,1005,63,964,21201,-2,-1,1,21101,0,942,0,1106,0,922,22101,0,1,-1,21201,-2,-3,1,21101,957,0,0,1105,1,922,22201,1,-1,-2,1105,1,968,21201,-2,0,-2,109,-3,2105,1,0 diff --git a/src/AdventOfCode/Year2019/Day09.hs b/src/AdventOfCode/Year2019/Day09.hs index 42a138e..9f5dd06 100644 --- a/src/AdventOfCode/Year2019/Day09.hs +++ b/src/AdventOfCode/Year2019/Day09.hs @@ -7,8 +7,7 @@ module AdventOfCode.Year2019.Day09 ) where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (inputFilePath) +import AdventOfCode.Input (parseInputAoC) import Conduit import Control.Monad (liftM2, when) import Control.Monad.State (get, gets, put) @@ -29,7 +28,7 @@ import Text.Trifecta (Parser, comma, integer, sepBy) main :: IO () main = do - input <- parseInput stack $(inputFilePath) + input <- parseInputAoC 2019 9 stack putStr "Part One: " print =<< partOne input From fc13dcd614a5d22265a3dae972aca265bbc8aa11 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 25 Nov 2025 00:15:31 -0600 Subject: [PATCH 50/91] refactor(2019.08-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2019/day08.txt | 1 - src/AdventOfCode/Year2019/Day08.hs | 80 ++++++++++++++++++------------ 3 files changed, 48 insertions(+), 35 deletions(-) delete mode 100644 input/2019/day08.txt diff --git a/VERSION b/VERSION index 1207833..8adb39b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.71 \ No newline at end of file +2024.7.2.72 \ No newline at end of file diff --git a/input/2019/day08.txt b/input/2019/day08.txt deleted file mode 100644 index b45e772..0000000 --- a/input/2019/day08.txt +++ /dev/null @@ -1 +0,0 @@ -222222022022222222222022222222122122222212222122222022212222202222222221222122221022222222202022220222222222222020222222002222222222222200222222202220222222222022222222222122222222022022222202222222222122212222202222222200222122222022222222222222222222222222222222222222222222222222222201222222222222022222222022222212222122222022122222222212222122222222212222202222222220222122221222222222222022222222222222222110222222022222222222222221222222222220222222022122222202222222222222022122222212222122222122202222202222222200222222220022222222222122222222222222222010222222212222222222222210222222212221122222222122222212222222222222022222222202222120222222212222212222222200222222220122222222222222221222222222222212222222022222222222222202222222222222122222122022222212222222222122122122222212222222222222212222222222222212222222222222222222222122221222222222222102222222112222222222222211222222202220122222022222222222222222222222222022222212222021222122202222202222222200222222220222222222202122220222222222222202222222222222222222222220222222212220222222022222222212222022222022122222222202222022222222222222202222222202222122222122222222222022222222222222222022222222212222022222222201122222212220122222222122222212222222222122222122222202222022222122212222212222222221222022222222222222212222222222222222222201222222202222222222222211122222222220222202122022222222222022222022222122222212222020222222222222212222222220222122220122222222202122221222222222222212222222222222022222222211122222212220022212022122222212222222212022122022222222222120222022212222202222222211212222221222222222212222220222222222222120222222002222022222222201022222212200222202022222222222222222222022022122222202222022222022202222212222222210212022221022222222202222221222222222222210222222022222122022222200022222212201222202222022222212222102202022122222222222222221222022202222202222222211202022222222222222202222221222222222222101222222212222122022222221122222202222022212122022222222222002212022022222222222222022222222202222202122222022222122221222212222202122222222222222222000222022002222222022222202122222212222122202222122222222222212202022022122202212222000222122222222212022222002222022220022202222202022221222222222222021222122222222222022202222122222212210222202222222222212222002202022022122212212222001222122222222222222222121202222222122202222222122222222222222222212222022102222022222222222022222202222222222022022222202222212222122022122222222222011222021212222222222222212212122221122212222202022222222222222222120222222002222122122222200222222222221022212022222222202222022222022222222212212222212222222212222212222222021222122221122202222222022220222212222222221222222122222222222212212222222212211022222222122222202222202222122122122202212222001222122202222212222222120202022220222212222222122221222202222222011222122102222122222212210222222212212122222222222222202222222202122122222222212220220222022222212222022222022222122221222202222222222222222212222222122222022112222222022222222222222222222222222222222222202222222212222122022202222221122212020212212222122222101222022221222212222202022220222212222222022222122112222222222212210122222212222222222122222222212222222212022022122212212220101222220220212212022222001222022222022222222222122222222212222222001222222122222222222202210022222202211122222022222222202222212202222022022222202220012212120222202222122222222212122221122202222222222222222222222222101222222212222022022222221222222202221122202022222222212222212202022022222212222220212212121220212212022222200202122221022222222202022222222202222222201222022102222022122222202022212212222022222122122222222222212222022122022212222222222202122222222222022222022202022220122212222202222221220212222222200222222212222222022222200022210212212122202122122222212222012202122022022212212221211202222202222202122222221222022222022212222222022220222212222222120222222122222222122202200122220212221222202222022222212222222212122022122222202220221202120210202222022222000222222222122212222212022221222212222222010222222002222022022212200222200222200122212122222222222222002222022222022212202220022212221201202222122222121222022220022212222202022220220222222222012222222202222222122212212122212212210022222122022222212222002222022022022212222221021212220221222202022222112222222221022222222212122212221222222222021222020202222222222222201022211212212022222022022222212222102222022222222222212221000222021212202202222222200222022221022202222222022221220222222222110022122212222022222202222222221212222022202222022222202222102222022022122202222221200212122212222222022222210202022220222202222222122221221212222222022022121122222222222212211022210202200222212022222222212222102222122122222222222221111222022201202212222222211222222222222222222212122222220212222222000222022202222222222202220122211202201222202122122222202222222202222022022222212221022202020222202222022222011212122221122212222202122201221202222222121022020102222122022212221122222202211122222022022222222222002222222022022202222221221212002211222222022222022212222222022222222202022212221202222222201122122022222222022212201122220202202022202022122222222222112222022022122212222222102222000211212202122222111202222220122212222222122221221202222222010222120212222022222212211122211212201022212122122222222222112222222022122212202222000222002201202222022220002212222221222222222222022211221212222202202122022212222222122212212122222222202222212022212222222222202222122022122202222222010212002220212222022220211222122222022202222222122212221222222222121122222102222122022202222022202202201222212222122222212222212222022022122222212221221202021212212202022221000222222221122212222212022220220222222212211222022012222122222212210122201222200022222122102222222222002212122222022212202222022202220221202212121221022212122221022202222212022220222202222212021022122112222022122220212122202222210022221222212222212222212202022222122222212222021212011212202212020220110222222222122212222212222212222202222212221222121012222022222220212222211212221122222222222222222222002222222122122222212220120222020201212222121221121202022222122222222202222210221202220222012222021022222022122201200222201222212022212022102222202222022202022022221212202220122222220210202212021221002222222221122222222212222222222222222202212122222112222022122202200022210212202222200122122222212222002212122122020222202210210212002211222222021221022212022222022202222212222202220222221222001222120212222022222221210222222222222222210022112222212222002212022022121222222222100212110202212212121222022202022221122202222202022210220202221212021122220222222022222211200022202202222022201122202222222222202212222022122222202202122212102210202202121222200202022220122202222212222222221222221212112122122212222022122212220222210222212122200222122220202222222202222122022202222200110222020212212212121222022212222220102222222212222201220222221222020022021022222222222210212122210212122222222022202222212222002202222022222202222200010202000220202222121220122202022221022212222222222211222212222222201022221112222022122222212222212212122122220022212221202222102112222122221212222200111212012212202202221220110212122220002212222202122202221212222212002022222222222222222222220122101202020022200122222221202222212222222022120222222222001212012211202222021222001222222221112222222202222222221212220202101122020012222022122221222222210202100022220222112222222222112102122022121212202220001212002221202222221220220212122222212212222212122212221222222222002122220002222122222222210122000202211022220122222221212222212202022122022222202201210202000212222212220221211212122222212222222222122012221202220222210022220122222022222200201122110222020022210022122221222222022212122122020212222200000222201220202202121221121202112222122212222202222102021202220212212222021102222222222211220022121222002022211222222221222222222122222122220212222210121222200202212202020220202222012220202222222202022012120212220222221222220212222122122210221222211222111122212122112220202222102002022022020202212210200212010221212212120220200212122220122202222212122102020222220202121222220012222022122221211222101212112122221022102222222222102202122222222212222202202212020210212222220221100202012222112212222222022112121222222212220022021012222122122211212222200212112222220222222220222222112122022022020212222220221222100201222202122222021222122222202212222222122002220202221202211122121212222222022210211022012202001022222122212221222222212222122222120212202202122212001210212222222222121212122221112222222212222112222212222212011022020002222122122210102222001202111022222022202221222222222122022122121202202212021212212200222222122220011202002222002012222222222111222212221202010022120002222122022221100222212212210122201122122220212222112112222222020222202220110222121211202212120221111202012220222202222212122121020212221202111022020002222222222220202022022212011122200222112220222222002202022022122212222211102222000212202212121220101202002221202012222222022102221202220202010122021002222122221201121022122222200222221122122220222222122122222022120202212220120222222212202222222221011222102120102202222222222212020212220212002222220202222102022210202122220212002122200122202222222222222202122022121212202211001222010202220212222222211202202122122222222222122212020222220202200222220102222022020222022122220212101122202122002222212222020002022022120202202211122222122201201212221221200222202222102012222212120021020202220202102122021121222112121122122122112222000222201222122222212222201202222022221222212222121212001201201122121021210222212120002222222202122010020222221222111122020111222022022222202222020202122222221122122221202222120212222122021212212220001202100210210212222020222212212201102112222212220200221202221222210122120202022012021222220222112202020122220022202222222222120122122122220222222201022202002002212222022221120222202220012212222212121202021222221212111022220112022122220001112122101202122022220022202222212222021222222022121212222202111212201001212002021221221222022222112112222202222120121222120222000022221021122102020002112222012212120122211022022221202222012202022222220222212202000222102212200202021022112222022102012102222222221021220222021202120022121011222011121210111222220202120022200122102221212222200102122222122202212211122212201010210022221121200222222202212202222212220121020202021222212022021222122101221021011022010222010122200221022222222222022012122022022202222222200212100010222022120021111212102221202112222212121121022212121212022122221111122221220000202122012202121222200022222220202222022012022222020202212200212202002112200102022220201202112012202012222212220221022222122202002022022212122202122210011122122222201222220021002222202222001012222022021222222202001212222201220222220121112212022010212022222222121200120212122222001122121101022102022212011222122202110022221020212222222222212202122122220212212200220222101102221012120022002222012200202122222202120002221212020222210122121002222221122010202022100202010122201022112222212222100002022222122022212202021202022022212112020022111222222000202012222212022122120202122212101222022102022001220020210222110212010122220222112220202222212112222122120102212202121202002100210212222121122202102022202122222222220020122222220212022222220210122022022120022022111212221122202221222222222222111112022222021122202201200202020222211122222122211222022010012222222222022201120202221212210022120000222211020000011022101212111022200221112222222222020222122122220022202221200222010111222212021022210202102012112122222212121001021202221202010122121002122020021012121222112222202022202122202222202222210222222022020022212201201202220222200112221022122202012212212012202222120221120202222102201022121210222100220101211122221222022222202122122221222202002022022122222212202220111202002222210012002222202212222100022102202202222220120202220122021022020102022120120002212222210202120122001221102220222212210212222022121112200211210202102010210102111122120202112120112122202212120001222222221022201222121021222101022212112222102202021022220122122201212212112112222022120102202201212212020000211102101121222202112022212212212222221001221220122212220022020000222100122221202222020202100022002222202212212212212212122222020002200220210222121212200212201220010222122001112112222112022220221221021122212122122010222100220120101022102212012222102121122202202222120122122122021002212212100202010010220212212020022202122221002202202202020012121212021212211222021201222001122201110022020212211022100121212201222202022012122122121111220220211212201012010222011020110222222002102122212112120201120222022202012022221120222010121102222122010220002122010222012221012212000022222122220112200201101222201111022122121120120222102111112102202000022012121211022112212022121212222221120001022122200212211222102222122211112202002222222122122112211211122212201000201002220021002212212110002112212122021012020221020112110122122211022120021101010222210210111022021020122220002222002102022222220111221220202222121101111012010220020212222111012202202110121100121202120212021222122020022110021212012022112202220022102220112210122222210122122222122002200212120212112101221002202221212212012111212222212221022220221220021202222122120200222010021102221200002222211122111122222210002212121012022122021121221200022202221010212022222122100212012121022002212210021110020202122212021222122210022210121200112220012200201122000021202201222202112210022122021120222211222202101211201002002222011212212011202122202102221121222210022002020022020000222222221122001010221211112222222222002200122222010022222222120202200012221212210122012202200222222212012012212102212221021102221201020202001122221221022222020120110102102220221122011221222202212222120220022022122010212222102222111120221002000020022202212012102022222200121200220220020202022122022100022111020012111121012202121022112022202211002202002200022000021222210122111222220100220202021021221222102210022012222200021011022202021222112022122001122120121002222121201210101122210220202202001202010120122000222021211011021202100110002212020220121202201212212002212110020210222210022012022022020211022010122011101121220211000122102120102222201211010202222202220100212121110202220101001102202221202202212122002112212000122120121201022012110222121022222211021002221110120202212022210020102200222222112020222122222101221211210212122001021122121220201202200212102012102020020221121210020002011112020210022022020121111210222210210222000200112220022210100212212210020100201121101222220112122022010221220212210011212102202100020110222200220222122122221010122122000000220211200201010022012022022212022210012020222200021201201000211202121122011022120122120222022221112222222111120202021220021012100122220202122122200221002001001222000022122001202210122021200001102202020122200122012222012212122222201020110202020020222022202020121222120202101002210022120102122021011111210012102220211211021220111102002021022200220100001220002111011001020010012210012202222020011210011121010211002000012001021201002200012221001101122020211100010020112 diff --git a/src/AdventOfCode/Year2019/Day08.hs b/src/AdventOfCode/Year2019/Day08.hs index ca9d607..1da5d8d 100644 --- a/src/AdventOfCode/Year2019/Day08.hs +++ b/src/AdventOfCode/Year2019/Day08.hs @@ -1,17 +1,29 @@ +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2019.Day08 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) -import Control.Applicative ((<|>)) -import Data.Function (on) -import Data.List (minimumBy) -import Text.Trifecta (Parser, char, count, some, ()) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle +import AdventOfCode.Util qualified as Util +import Data.List.Extra (minimumBy, sumOn') +import Data.Text.IO qualified as TextIO +import Relude +import Text.Show qualified +import Text.Trifecta (Parser, char, choice, count, ()) data Pixel = Black | White | Transparent - deriving (Enum, Eq) + deriving (Eq, Generic) + +instance Semigroup Pixel where + Transparent <> below = below + above <> _ = above + +instance Monoid Pixel where + mempty = Transparent instance Show Pixel where show Black = " " @@ -25,42 +37,44 @@ type Layer = [Row] type Row = [Pixel] main :: IO () -main = $(defaultMain) +main = + getInput >>= evaluatingPuzzle do + putStr "Part One: " + print =<< partOne + putStrLn "Part Two:" + liftIO . TextIO.putStrLn =<< partTwo getInput :: IO Image -getInput = parseInput (image 25 6) $(inputFilePath) +getInput = parseInputAoC 2019 8 (image 25 6) -partOne :: Image -> Int -partOne layers = numberOf White layer * numberOf Transparent layer +partOne :: SimplePuzzle Image Int +partOne = + asks + $ minimumBy (compare `on` numberOf Black) + >>> (numberOf White &&& numberOf Transparent) + >>> uncurry (*) where - layer = minimumBy (compare `on` numberOf Black) layers - numberOf :: (Eq a) => a -> [[a]] -> Int - numberOf x = sum . fmap (length . filter (== x)) - -partTwo :: Image -> String -partTwo layers = - unlines . map (concatMap show) $ - foldl decodeLayer (transparentLayer 25 6) layers + numberOf x = sumOn' (Util.count (== x)) + +partTwo :: SimplePuzzle Image Text +partTwo = + asks + $ foldl' decodeLayer (transparentLayer 25 6) + >>> map (foldMap show) + >>> unlines where - decodeLayer :: Layer -> Layer -> Layer - decodeLayer = zipWith (zipWith decodePixel) - decodePixel :: Pixel -> Pixel -> Pixel - decodePixel Transparent below = below - decodePixel above _ = above + decodeLayer = zipWith (zipWith (<>)) image :: Int -> Int -> Parser Image -image width height = some layer - where - layer :: Parser Layer - layer = count height row - row :: Parser Row - row = count width pixel +image width height = some (count height (count width pixel)) pixel :: Parser Pixel pixel = - (char '0' *> pure Black "A black pixel") - <|> (char '1' *> pure White "A white pixel") - <|> (char '2' *> pure Transparent "A transparent pixel") + choice + [ char '0' *> pure Black "A black pixel", + char '1' *> pure White "A white pixel", + char '2' *> pure Transparent "A transparent pixel" + ] transparentLayer :: Int -> Int -> Layer transparentLayer width height = replicate height (replicate width Transparent) From a901b09178257316aa5a0375e90974e50eaadc67 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 26 Nov 2025 00:17:32 -0600 Subject: [PATCH 51/91] refactor(2019.12-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2019/day12.txt | 4 - package.yaml | 1 + src/AdventOfCode/Year2019/Day12.hs | 110 +++++++++-------------- test/Test/AdventOfCode/Year2019/Day12.hs | 11 ++- 5 files changed, 49 insertions(+), 79 deletions(-) delete mode 100644 input/2019/day12.txt diff --git a/VERSION b/VERSION index 8adb39b..3ebe894 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.72 \ No newline at end of file +2024.7.2.73 \ No newline at end of file diff --git a/input/2019/day12.txt b/input/2019/day12.txt deleted file mode 100644 index b3cd9c4..0000000 --- a/input/2019/day12.txt +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/package.yaml b/package.yaml index cf995ea..16d8896 100644 --- a/package.yaml +++ b/package.yaml @@ -345,6 +345,7 @@ executables: <<: *executable main: AdventOfCode.Year2019.Day12 dependencies: + - infinite-list - linear aoc-2020-day01: <<: *executable diff --git a/src/AdventOfCode/Year2019/Day12.hs b/src/AdventOfCode/Year2019/Day12.hs index 5e2b2d5..a94aeb2 100644 --- a/src/AdventOfCode/Year2019/Day12.hs +++ b/src/AdventOfCode/Year2019/Day12.hs @@ -1,81 +1,55 @@ -{-# LANGUAGE TupleSections #-} +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE NoImplicitPrelude #-} -module AdventOfCode.Year2019.Day12 - ( main, - getInput, - partOne, - partTwo, - ) -where +module AdventOfCode.Year2019.Day12 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (inputFilePath) -import Control.Arrow (second, (&&&), (>>>)) -import Data.Function (on) -import Linear (V3 (..)) -import Text.Trifecta (Parser, angles, between, integer, some, string) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import AdventOfCode.Util ((<.>)) +import Data.Foldable.Extra (sumOn') +import Data.List.Infinite ((!!)) +import Data.List.Infinite qualified as Infinite +import Linear (V2 (..), V3 (..)) +import Relude +import Text.Trifecta (Parser, angles, between, integer, string) -main :: IO () -main = - do - putStrLn "[2019] Day 12: The N-Body Problem" - input <- getInput - putStr "Part One: " - print (partOne input) - putStr "Part Two: " - print (partTwo input) - -getInput :: IO [Pair] -getInput = fmap mkPair <$> parseInput (some dimensions) $(inputFilePath) +type Moon = V2 (V3 Int) -partOne :: [Pair] -> Int -partOne = sum . fmap totalEnergy . (!! 1000) . iterate step - -partTwo :: [Pair] -> Int -partTwo = foldr (lcm . period) 1 . traverse transpose +main :: IO () +main = $(defaultMainPuzzle) -type Pair = (Dimensions, Dimensions) +getInput :: IO [Moon] +getInput = parseInputAoC 2019 12 (some (flip V2 0 <$> dimensions)) -mkPair :: V3 Int -> Pair -mkPair = (,pure 0) +partOne :: SimplePuzzle [Moon] Int +partOne = asks (sumOn' totalEnergy . (!! 1000) . Infinite.iterate step) + where + totalEnergy (V2 position velocity) = + ((*) `on` (sum . abs)) position velocity -type Dimensions = V3 Int +partTwo :: SimplePuzzle [Moon] Int +partTwo = asks (foldr (lcm . period) 1 . traverse twist) + where + twist (V2 (V3 x y z) (V3 u v w)) = V3 (V2 x u) (V2 y v) (V2 z w) -dimensions :: Parser Dimensions +dimensions :: Parser (V3 Int) dimensions = - angles $ - V3 - <$> (fromIntegral <$> between (string "x=") (string ", ") integer) - <*> (fromIntegral <$> between (string "y=") (string ", ") integer) - <*> (fromIntegral <$> (string "z=" *> integer)) - -transpose :: (V3 Int, V3 Int) -> V3 (Int, Int) -transpose (V3 x y z, V3 u v w) = V3 (x, u) (y, v) (z, w) - -period :: (Eq a, Num a) => [(a, a)] -> Int + fmap fromInteger + <.> angles + $ V3 + <$> between (string "x=") (string ", ") integer + <*> between (string "y=") (string ", ") integer + <*> (string "z=" *> integer) + +period :: (Functor f, Foldable f, Eq (f (V2 a)), Num a) => f (V2 a) -> Int period initial = - 1 + length (takeWhile (/= initial) (iterate step (step initial))) + 1 + length (Infinite.takeWhile (/= initial) (Infinite.iterate step (step initial))) -step :: (Num a) => [(a, a)] -> [(a, a)] +step :: (Functor f, Foldable f, Num a) => f (V2 a) -> f (V2 a) step = fmap applyVelocity . applyGravities - -applyGravities :: (Num a) => [(a, a)] -> [(a, a)] -applyGravities moons = fmap (`applyGravity` moons) moons - -applyGravity :: (Num a) => (a, a) -> [(a, a)] -> (a, a) -applyGravity = foldr stepVelocity where - stepVelocity there = second =<< (pull `on` fst) there - pull there here = (+ signum (there - here)) - -applyVelocity :: (Num a) => (a, a) -> (a, a) -applyVelocity (pos, vel) = (pos + vel, vel) - -totalEnergy :: Pair -> Int -totalEnergy = potentialEnergy &&& kineticEnergy >>> uncurry (*) - -potentialEnergy :: Pair -> Int -potentialEnergy = sum . abs . fst - -kineticEnergy :: Pair -> Int -kineticEnergy = sum . abs . snd + applyVelocity (V2 position velocity) = V2 (position + velocity) velocity + applyGravities moons = fmap (`applyGravity` moons) moons + applyGravity = foldr \(V2 there _) (V2 here velocity) -> + V2 here (velocity + signum (there - here)) diff --git a/test/Test/AdventOfCode/Year2019/Day12.hs b/test/Test/AdventOfCode/Year2019/Day12.hs index ac68249..b3bb6f5 100644 --- a/test/Test/AdventOfCode/Year2019/Day12.hs +++ b/test/Test/AdventOfCode/Year2019/Day12.hs @@ -1,5 +1,6 @@ module Test.AdventOfCode.Year2019.Day12 where +import AdventOfCode.Puzzle import AdventOfCode.Year2019.Day12 (getInput, partOne, partTwo) import Test.Tasty import Test.Tasty.HUnit @@ -8,10 +9,8 @@ test_day12 :: TestTree test_day12 = testGroup "Answers" - [ testCase "Part One" $ do - input <- getInput - partOne input @?= 6423, - testCase "Part Two" $ do - input <- getInput - partTwo input @?= 327636285682704 + [ testCase "Part One" $ + getInput >>= evaluatingPuzzle partOne >>= (@?= 6423), + testCase "Part Two" $ + getInput >>= evaluatingPuzzle partTwo >>= (@?= 327636285682704) ] From 7341d2b7f0ab984ce2d273e91cb267a815c368c5 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 26 Nov 2025 00:18:59 -0600 Subject: [PATCH 52/91] test(haskell): fix Test.AdventOfCode.Year2017.Day0{1,2} --- VERSION | 2 +- test/Test/AdventOfCode/Year2017/Day01.hs | 11 +++++---- test/Test/AdventOfCode/Year2017/Day02.hs | 31 ++++++++++++------------ 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/VERSION b/VERSION index 3ebe894..924367d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.73 \ No newline at end of file +2024.7.2.74 \ No newline at end of file diff --git a/test/Test/AdventOfCode/Year2017/Day01.hs b/test/Test/AdventOfCode/Year2017/Day01.hs index b1b119b..48b73a6 100644 --- a/test/Test/AdventOfCode/Year2017/Day01.hs +++ b/test/Test/AdventOfCode/Year2017/Day01.hs @@ -1,6 +1,7 @@ module Test.AdventOfCode.Year2017.Day01 where import AdventOfCode.Input (parseString) +import AdventOfCode.Puzzle import AdventOfCode.Year2017.Day01 import Data.Monoid (Sum) import Data.Vector (Vector) @@ -31,14 +32,14 @@ test_day01_answers = testGroup "Answers" [ testCase "Part One" $ - (1034 @=?) . partOne =<< getInput, + getInput >>= evaluatingPuzzle partOne >>= (@?= 1034), testCase "Part Two" $ - (1356 @=?) . partTwo =<< getInput + getInput >>= evaluatingPuzzle partTwo >>= (@?= 1356) ] -mkExample :: (Vector (Sum Int) -> Int) -> (String, Int) -> TestTree -mkExample f (str, expected) = +mkExample :: SimplePuzzle (Vector (Sum Int)) Int -> (String, Int) -> TestTree +mkExample puzzle (str, expected) = testCase str $ do input <- parseString digits str - f input @?= expected + evaluatingPuzzle puzzle input >>= (@?= expected) diff --git a/test/Test/AdventOfCode/Year2017/Day02.hs b/test/Test/AdventOfCode/Year2017/Day02.hs index 1f89ac2..90fe856 100644 --- a/test/Test/AdventOfCode/Year2017/Day02.hs +++ b/test/Test/AdventOfCode/Year2017/Day02.hs @@ -1,5 +1,6 @@ module Test.AdventOfCode.Year2017.Day02 where +import AdventOfCode.Puzzle import AdventOfCode.Year2017.Day02 import Test.Tasty import Test.Tasty.HUnit @@ -9,21 +10,21 @@ test_day02_examples = testGroup "Examples" [ testCase "Part One" $ - do + evaluatingPuzzle partOne - [ [5, 1, 9, 5], - [7, 5, 3], - [2, 4, 6, 8] - ] - @?= 18, - testCase "Part Two" $ - do + [ [5, 1, 9, 5], + [7, 5, 3], + [2, 4, 6, 8] + ] + >>= (@?= 18), + testCase "Part Two" $ do + evaluatingPuzzle partTwo - [ [5, 9, 2, 8], - [9, 4, 7, 3], - [3, 8, 6, 5] - ] - @?= 9 + [ [5, 9, 2, 8], + [9, 4, 7, 3], + [3, 8, 6, 5] + ] + >>= (@?= 9) ] test_day02_answers :: TestTree @@ -31,7 +32,7 @@ test_day02_answers = testGroup "Answers" [ testCase "Part One" $ - (41887 @=?) . partOne =<< getInput, + getInput >>= evaluatingPuzzle partOne >>= (@?= 41887), testCase "Part Two" $ - (226 @=?) . partTwo =<< getInput + getInput >>= evaluatingPuzzle partTwo >>= (@?= 226) ] From 7dffca5870acf1a030372d29e89f1e4c1ac8e82a Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 26 Nov 2025 00:38:13 -0600 Subject: [PATCH 53/91] refactor(2019.10-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2019/day10.txt | 33 ----------- src/AdventOfCode/Year2019/Day10.hs | 71 ++++++++++++------------ test/Test/AdventOfCode/Year2019/Day10.hs | 9 ++- 4 files changed, 41 insertions(+), 74 deletions(-) delete mode 100644 input/2019/day10.txt diff --git a/VERSION b/VERSION index 924367d..4aaa2ad 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.74 \ No newline at end of file +2024.7.2.75 \ No newline at end of file diff --git a/input/2019/day10.txt b/input/2019/day10.txt deleted file mode 100644 index 0f6d253..0000000 --- a/input/2019/day10.txt +++ /dev/null @@ -1,33 +0,0 @@ -#.#.##..#.###...##.#....##....### -...#..#.#.##.....#..##.#...###..# -####...#..#.##...#.##..####..#.#. -..#.#..#...#..####.##....#..####. -....##...#.##...#.#.#...#.#..##.. -.#....#.##.#.##......#..#..#..#.. -.#.......#.....#.....#...###..... -#.#.#.##..#.#...###.#.###....#..# -#.#..........##..###.......#...## -#.#.........##...##.#.##..####..# -###.#..#####...#..#.#...#..#.#... -.##.#.##.........####.#.#...##... -..##...#..###.....#.#...#.#..#.## -.#...#.....#....##...##...###...# -###...#..#....#............#..... -.#####.#......#.......#.#.##..#.# -#.#......#.#.#.#.......##..##..## -.#.##...##..#..##...##...##.....# -#.#...#.#.#.#.#..#...#...##...#.# -##.#..#....#..##.#.#....#.##...## -...###.#.#.......#.#..#..#...#.## -.....##......#.....#..###.....##. -........##..#.#........##.......# -#.##.##...##..###.#....#....###.# -..##.##....##.#..#.##..#.....#... -.#.#....##..###.#...##.#.#.#..#.. -..#..##.##.#.##....#...#......... -#...#.#.#....#.......#.#...#..#.# -...###.##.#...#..#...##...##....# -...#..#.#.#..#####...#.#...####.# -##.#...#..##..#..###.#..........# -..........#..##..#..###...#..#... -.#.##...#....##.....#.#...##...## diff --git a/src/AdventOfCode/Year2019/Day10.hs b/src/AdventOfCode/Year2019/Day10.hs index cfca621..ef8883e 100644 --- a/src/AdventOfCode/Year2019/Day10.hs +++ b/src/AdventOfCode/Year2019/Day10.hs @@ -1,25 +1,24 @@ {-# LANGUAGE BlockArguments #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2019.Day10 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (defaultMain, inputFilePath) -import Control.Applicative ((<|>)) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import AdventOfCode.Util (maybeFail) import Control.Lens (ifoldl', makeLenses, over, views, (%~), _1, _2, _3, _4) -import Data.Bifunctor (bimap, first) -import Data.Function (on) -import Data.Functor (($>)) -import Data.HashMap.Strict (HashMap, (!)) +import Data.HashMap.Strict ((!)) import Data.HashMap.Strict qualified as HM -import Data.List (sort) import Data.List.Extra (maximumOn, minimumOn) -import Data.Map.Strict (Map) import Data.Map.Strict qualified as Map -import Data.Ratio (denominator, numerator) import Data.Set qualified as Set import GHC.Real (Ratio (..)) import Linear (V2 (..), V4 (..), distance) -import Text.Trifecta (Parser, char, newline, sepEndBy, some) +import Relude +import Text.Show qualified +import Text.Trifecta (Parser, char, newline, sepEndBy) +import Prelude (until) type DetectionMap = HashMap Angle (Map Location Distance) @@ -40,30 +39,31 @@ makeLenses ''Grid instance Show Grid where show (Grid (V2 width height) asteroids) = - concat $ - [ '\n' - : concat - [ maybe "." (show . HM.size) (Map.lookup (V2 x y) asteroids) - | x <- [0 .. width - 1] - ] - | y <- [0 .. height - 1] - ] + concat + $ [ '\n' + : concat + [ maybe "." (show . HM.size) (Map.lookup (V2 x y) asteroids) + | x <- [0 .. width - 1] + ] + | y <- [0 .. height - 1] + ] main :: IO () -main = $(defaultMain) +main = $(defaultMainPuzzle) getInput :: IO Grid -getInput = parseInput grid $(inputFilePath) +getInput = parseInputAoC 2019 10 grid -partOne :: Grid -> Int -partOne = HM.size . snd . bestLocation +partOne :: SimplePuzzle Grid Int +partOne = asks (HM.size . snd . bestLocation) -partTwo :: Grid -> Int -partTwo asteroidBelt = x * 100 + y - where - (_from, visible) = bestLocation asteroidBelt - angles = clockwise (HM.keys visible) - V2 x y = vaporize visible angles !! 199 +partTwo :: SimplePuzzle Grid Int +partTwo = + ask >>= \asteroidBelt -> do + let (_from, visible) = bestLocation asteroidBelt + angles = clockwise (HM.keys visible) + V2 x y <- maybeFail "ope!" $ vaporize visible angles !!? 199 + pure (x * 100 + y) grid :: Parser Grid grid = gridDetection . mkGrid <$> some asteroid `sepEndBy` newline @@ -85,8 +85,9 @@ bestLocation = views stations (maximumOn (HM.size . snd) . Map.toList) vaporize :: DetectionMap -> [Angle] -> [Location] vaporize visible allAngles = - reverse . fst $ - until + reverse + . fst + $ until (all Map.null . snd) (flip (foldl' go) allAngles) ([], visible) @@ -103,8 +104,8 @@ clockwise :: [Angle] -> [Angle] clockwise = foldMap sort . foldr go (pure @V4 []) where go angle = - flip over (angle :) $ - case (isRightward angle, isUpward angle) of + flip over (angle :) + $ case (isRightward angle, isUpward angle) of (True, True) -> _1 (True, False) -> _2 (False, False) -> _3 @@ -120,8 +121,8 @@ gridDetection :: Grid -> Grid gridDetection = stations %~ \asteroids -> flip Map.mapWithKey asteroids \from detections -> - foldl' (detect from) detections $ - Set.delete from (Map.keysSet asteroids) + foldl' (detect from) detections + $ Set.delete from (Map.keysSet asteroids) detect :: Location -> DetectionMap -> Location -> DetectionMap detect from detections to = HM.alter go angle detections diff --git a/test/Test/AdventOfCode/Year2019/Day10.hs b/test/Test/AdventOfCode/Year2019/Day10.hs index d1acc08..26dad69 100644 --- a/test/Test/AdventOfCode/Year2019/Day10.hs +++ b/test/Test/AdventOfCode/Year2019/Day10.hs @@ -1,5 +1,6 @@ module Test.AdventOfCode.Year2019.Day10 where +import AdventOfCode.Puzzle import AdventOfCode.Year2019.Day10 (getInput, partOne, partTwo) import Test.Tasty import Test.Tasty.HUnit @@ -8,10 +9,8 @@ test_day10 :: TestTree test_day10 = testGroup "Answers" - [ testCase "Part One" $ do - input <- getInput - partOne input @?= 326, + [ testCase "Part One" $ + getInput >>= evaluatingPuzzle partOne >>= (@?= 326), testCase "Part Two" $ do - input <- getInput - partTwo input @?= 1623 + getInput >>= evaluatingPuzzle partTwo >>= (@?= 1623) ] From 38d02b23b1b14ef2ddd86af96b645fa303433466 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 26 Nov 2025 22:57:07 -0600 Subject: [PATCH 54/91] refactor(2019.07-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2019/day07.txt | 1 - src/AdventOfCode/Year2019/Day07.hs | 74 +++++++++++++++--------------- 3 files changed, 37 insertions(+), 40 deletions(-) delete mode 100644 input/2019/day07.txt diff --git a/VERSION b/VERSION index 4aaa2ad..f700570 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.75 \ No newline at end of file +2024.7.2.76 \ No newline at end of file diff --git a/input/2019/day07.txt b/input/2019/day07.txt deleted file mode 100644 index a24bf46..0000000 --- a/input/2019/day07.txt +++ /dev/null @@ -1 +0,0 @@ -3,8,1001,8,10,8,105,1,0,0,21,38,63,72,81,106,187,268,349,430,99999,3,9,101,5,9,9,1002,9,3,9,101,3,9,9,4,9,99,3,9,102,3,9,9,101,4,9,9,1002,9,2,9,1001,9,2,9,1002,9,4,9,4,9,99,3,9,1001,9,3,9,4,9,99,3,9,102,5,9,9,4,9,99,3,9,102,4,9,9,1001,9,2,9,1002,9,5,9,1001,9,2,9,102,3,9,9,4,9,99,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,2,9,9,4,9,99,3,9,1001,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,1,9,4,9,99,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,99,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,3,9,101,2,9,9,4,9,99 diff --git a/src/AdventOfCode/Year2019/Day07.hs b/src/AdventOfCode/Year2019/Day07.hs index fa91ff5..a86ad2d 100644 --- a/src/AdventOfCode/Year2019/Day07.hs +++ b/src/AdventOfCode/Year2019/Day07.hs @@ -1,26 +1,24 @@ {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE StrictData #-} +{-# LANGUAGE NoImplicitPrelude #-} {-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-} module AdventOfCode.Year2019.Day07 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (inputFilePath) -import Control.Lens (makeLenses, use, (%=), (&), (+=), (.=), (.~)) -import Control.Monad (forM, when) -import Control.Monad.State (get, lift) -import Control.Monad.Trans.State.Strict (StateT, execStateT) +import AdventOfCode.Input (parseInputAoC) +import Control.Lens (makeLenses, use, (%=), (+=), (.=), (.~)) import Data.Conduit (ConduitM, ConduitT, await, runConduit, yield, (.|)) import Data.Conduit.Lift (evalStateC) import Data.FastDigits (digits) -import Data.List (permutations) -import Data.Vector (Vector, fromList, modify, (!)) +import Data.Foldable (maximum) +import Data.Vector (Vector, (!)) import Data.Vector qualified as V import Data.Vector.Mutable qualified as MV import Foreign.Marshal.Utils (fromBool) -import GHC.Generics (Generic) +import Relude import Text.Trifecta (Parser, comma, integer, sepBy) -- ------------------------------------------------------------------- [ Types ] @@ -68,7 +66,7 @@ main = partOne input getInput :: IO (Vector Int) -getInput = parseInput parseStack $(inputFilePath) +getInput = parseInputAoC 2019 7 parseStack -- ------------------------------------------------------------------- [ Parts ] @@ -77,20 +75,20 @@ partOne prog = do let ampses = prepareAmps prog <$> permutations [0 .. 4] results <- forM ampses $ \[a, b, c, d, e] -> - runConduit $ - yield 0 - .| a - .| b - .| c - .| d - .| e - .| await' + runConduit + $ yield 0 + .| a + .| b + .| c + .| d + .| e + .| await' print (maximum results) -- ------------------------------------------------------------------ [ Parser ] parseStack :: Parser (Vector Int) -parseStack = fromList . map fromInteger <$> (integer `sepBy` comma) +parseStack = V.fromList . map fromInteger <$> (integer `sepBy` comma) -- -------------------------------------------------------- [ Running Programs ] @@ -98,8 +96,8 @@ runProgram :: ConduitT Int Int Program () runProgram = do opCode <- lift nextInt - when (opCode /= 99) $ - do + when (opCode /= 99) + $ do debugState instruction <- getInstruction (normalizeOpCode opCode) debugInstruction instruction @@ -110,42 +108,42 @@ runProgram = debugMode :: Program () debugMode = do - lift $ putStrLn "Enabling debug mode" + putStrLn "Enabling debug mode" debug .= True debugInstruction :: Instruction -> ConduitT a b Program () debugInstruction ins = do st <- get - when (_debug st) $ - lift (lift (print ins)) + when (_debug st) + $ print ins debugState :: ConduitT a b Program () debugState = do st <- get - when (_debug st) $ - lift (lift (print st)) + when (_debug st) + $ print st getInstruction :: [Int] -> ConduitT Int Int Program Instruction getInstruction [1, 0, c, b] = - lift $ Add <$> (mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) <*> nextInt + lift $ (Add . mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) <*> nextInt getInstruction [2, 0, c, b] = - lift $ Multiply <$> (mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) <*> nextInt + lift $ (Multiply . mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) <*> nextInt getInstruction [3, 0, 0, 0] = do input <- await' lift $ Set (ImmediateMode input) <$> nextInt getInstruction [4, 0, c, 0] = - lift $ Output <$> (mkValue c <$> nextInt) + lift $ Output . mkValue c <$> nextInt getInstruction [5, 0, c, b] = - lift $ JumpIfTrue <$> (mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) + lift $ (JumpIfTrue . mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) getInstruction [6, 0, c, b] = - lift $ JumpIfFalse <$> (mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) + lift $ (JumpIfFalse . mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) getInstruction [7, 0, c, b] = - lift $ LessThan <$> (mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) <*> nextInt + lift $ (LessThan . mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) <*> nextInt getInstruction [8, 0, c, b] = - lift $ Equals <$> (mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) <*> nextInt + lift $ (Equals . mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) <*> nextInt getInstruction _ = error "Invalid instruction" runInstruction :: Instruction -> ConduitT Int Int Program () @@ -160,13 +158,13 @@ runInstruction (Output vx) = runInstruction (JumpIfTrue vx vy) = lift $ do x <- handleValue vx - when (x /= 0) $ - jump vy + when (x /= 0) + $ jump vy runInstruction (JumpIfFalse vx vy) = lift $ do x <- handleValue vx - when (x == 0) $ - jump vy + when (x == 0) + $ jump vy runInstruction (LessThan vx vy dst) = lift $ do lt <- (<) <$> handleValue vx <*> handleValue vy @@ -191,7 +189,7 @@ evalStack' st = -- -------------------------------------------------- [ Manipulating the Stack ] setValue :: Int -> Int -> Program () -setValue x dst = stack %= modify (\v -> MV.write v dst x) +setValue x dst = stack %= V.modify (\v -> MV.write v dst x) incrementPointer :: Program () incrementPointer = pointer += 1 From bd2255e52c4944676c7cce4428e563a0a1b3ac99 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 27 Nov 2025 23:45:09 -0600 Subject: [PATCH 55/91] refactor(2019.06-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2019/day06.txt | 1443 ---------------------------- src/AdventOfCode/Year2019/Day06.hs | 90 +- 3 files changed, 42 insertions(+), 1493 deletions(-) delete mode 100644 input/2019/day06.txt diff --git a/VERSION b/VERSION index f700570..2b92d89 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.76 \ No newline at end of file +2024.7.2.77 \ No newline at end of file diff --git a/input/2019/day06.txt b/input/2019/day06.txt deleted file mode 100644 index 94c92a4..0000000 --- a/input/2019/day06.txt +++ /dev/null @@ -1,1443 +0,0 @@ -CWG)HRQ -D4M)NR4 -ZH2)14W -326)55X -88J)W92 -KF2)1D9 -J6C)BGJ -9GS)19J -X17)JJ4 -PRC)PQV -9CB)YPG -RVH)W76 -KX9)4TD -J88)HWB -461)CG1 -Z1V)MZJ -SBV)FF7 -VTP)51F -C2Q)MDM -VHG)M6M -V1L)5KK -VTT)59M -1FF)N6S -PQ8)Y26 -PBH)17V -K7T)NTX -4JQ)SGJ -T5V)ZDD -2CD)JC7 -62B)BNX -BGJ)M47 -B7Z)DQT -ZLV)FYS -9DD)YNF -YKS)Z5Z -QKS)8D1 -7DJ)NGN -3LY)DCB -L4Z)T41 -KJV)9NT -9LV)R55 -D81)W1F -VF4)H7S -VPD)WFR -TRL)X6N -BTY)TRH -WJ8)VZ8 -2W5)58F -91N)H3G -CJK)VTP -JJX)F92 -LS5)9DQ -GSY)B7X -641)PLK -SPK)HVG -12V)MTZ -N34)72T -JRP)S8J -QYW)9RW -FZX)XK8 -YBR)1FF -GZJ)DB7 -8NZ)HT5 -X36)DRX -NWX)L5Q -38F)98X -9GS)6P9 -1RG)DDY -P33)7C2 -QFW)WQ1 -SZQ)YYS -WC9)K8Q -FB2)FV2 -T55)NW3 -JP7)TZ5 -4HK)YT3 -835)TCH -C92)4JQ -DQT)B6W -FR1)HD3 -TKT)4NV -QJ5)2Q7 -3DB)BSR -QLS)Q7G -FLZ)RXZ -64Y)DYQ -QHH)M5H -3X8)L12 -W9W)DV7 -MJJ)GJJ -NGN)H7F -1X6)SYV -TQS)3DC -H22)GZ9 -8VZ)BX2 -PRC)4LM -T8H)L28 -HSB)FS2 -87Z)NR6 -MYS)2CJ -FZ8)YC8 -Z26)B38 -65J)N66 -TDK)SJD -RL1)ZR6 -47M)19R -NCK)4GD -1H4)Y8Z -3PZ)DXC -BR8)YY3 -JZF)YKS -3JS)7DJ -CX7)VPD -YCF)9XQ -DMT)YX9 -FDS)DY3 -1ZV)F2S -SRW)V2N -Q7R)K9L -VRV)39W -LPZ)VYB -DYQ)X4M -61R)XGB -TK1)TR8 -X6N)KPR -HRQ)64T -M1J)YH5 -9CQ)HYB -PB1)KR7 -VKY)89C -PMR)C9K -L16)XXD -5FM)Q8Z -6JG)WV7 -VDC)4BP -Y26)HLF -41H)HBQ -RV3)QHN -GT3)XRH -SNK)MG1 -Q8P)TSL -WQ1)N9R -466)DT2 -B65)276 -MVK)QM9 -YWZ)D4M -N2K)NJP -7WY)D4R -W59)7J1 -78X)LZH -P74)23V -LB8)L75 -M3Z)Y8C -6W5)NSV -7HK)KVF -N47)ZP9 -B3H)ZR9 -VML)MQT -1VQ)RJY -XSJ)5J5 -XRW)5MY -LP1)1F7 -VGM)PH2 -62L)5R7 -99M)R8T -B7X)MYS -XM4)PB1 -W5P)7JS -Y33)VNH -FJ4)WQH -CFQ)L68 -4DX)PM7 -BC3)J9X -PBT)DHZ -DYC)MRF -PKS)L5F -BXF)D6B -JKK)CX7 -K4Z)W7B -DSH)B1Q -M86)8J6 -XQD)MZY -S35)CF2 -ZYX)BJ6 -RY2)LZ3 -4YB)M61 -7WS)7HK -FRW)PZX -YYS)2NP -QJP)G8D -HYH)157 -DXG)Y98 -XXD)8BP -55X)CNT -4YB)1D1 -DST)SHD -FDX)Z8C -1D1)NYL -131)F8H -LQF)T68 -RN3)1X7 -JK9)W5P -MXK)4LJ -CV9)CNP -2HR)N75 -KX9)1WJ -YY3)JWB -VR5)PKN -JJ4)3JH -43W)2Y6 -NBV)3MY -YJ8)3C1 -XGQ)2ZH -J3R)6DY -V2N)D8K -CD1)N2K -9GJ)B8M -MP8)G7Q -LHC)D81 -77W)MDN -HK3)8W2 -ZR6)7GW -RYG)F58 -2VG)DY9 -C4S)JSN -HPT)PGP -NJZ)9TL -JK4)268 -W3F)X8S -XYF)HYH -WXS)6FP -DSS)SD4 -1TX)SDD -YNY)6W2 -23V)XLZ -K1H)RB3 -V99)261 -1WJ)S98 -P1S)96D -PCT)XJZ -2NP)XY4 -16D)YPC -7LK)JNY -7J1)41N -6PX)QQC -FCL)XWM -DRX)RQ1 -KLR)67C -2YD)FMT -HVG)QWT -T78)WL8 -NFF)3LY -M47)Z26 -HM6)TCL -1F7)N34 -SDD)2B6 -9SS)1HN -B1Q)C4S -9PB)DMT -MDL)RG8 -WV7)2XP -3M6)MLZ -V8H)NCK -VHL)6XK -5KR)8VZ -QF9)S4P -84J)QW6 -KDH)PHX -DQ1)ZDC -GVY)ZVD -PSQ)LXJ -XJZ)4W6 -DV7)MK7 -S4N)ZBH -51F)D9Q -18J)LZZ -V58)181 -QTZ)428 -82F)KTS -7LP)YK6 -QJ5)47M -4RJ)RVX -DF6)7B2 -NWL)1TX -2Y6)VR5 -69W)574 -T83)ZTW -JGG)Y33 -VXH)JS2 -ZZ8)TKT -BS1)YH6 -33G)XR2 -FFQ)W2L -WLM)5SS -2ZG)HH8 -7DN)7L8 -J9X)91N -DCB)XYL -LV1)W6S -BKZ)LQ6 -4KG)1RG -TCH)PM2 -DB1)S4N -5Y1)SZQ -48X)FZ8 -NQ3)2HH -VC1)DGN -VN3)9X9 -3NK)BGB -M55)VF4 -62S)14R -ZCV)YLQ -574)NSX -ZX9)9PT -1D9)466 -BNX)WGD -YK6)9DD -49M)53M -CRC)MR7 -QBX)J13 -BD4)3ZX -19C)SP2 -TFZ)Z6N -PJW)Q8K -92C)NRB -W3S)M4D -8NM)64D -6CR)DB1 -7HK)5V4 -W31)YGJ -X1S)P4F -YNZ)WCF -WRY)1ML -SXY)CC3 -K1W)3KW -8BM)B45 -RY2)PFC -CW9)PVZ -RR7)131 -74S)8BF -MQT)8YV -27N)MSN -1H4)W9W -YTZ)Z17 -L8F)M2L -WQH)G54 -PM5)SNM -42J)KMX -V9H)G22 -NNW)S39 -GW7)MXJ -2ZZ)Y9R -VW5)GCD -X4D)FFK -S6X)7J4 -B21)SKX -MQ6)G9P -M6V)Y6N -9X9)Z7Z -YNY)1ZV -KB3)FRW -DFL)2CN -M42)P58 -CYW)VHG -V38)4S3 -1L5)QBX -Q3R)YY2 -5LN)62L -R9Z)JN7 -KHP)6JG -7CW)BW3 -NBL)VDC -789)T88 -SRJ)2DW -WRW)ZG5 -Y7Q)ZQW -H5S)QYZ -W7B)1L5 -PLK)LB8 -KHK)9PW -JMW)SYT -HC1)KBB -YLQ)9GS -F52)J7M -HBH)KHP -5MY)41W -2W5)F8X -F58)B1V -PTQ)V8H -T8W)RQF -W95)KF2 -LJS)5FM -2CN)KXY -YPC)4ND -VN3)GB3 -LZZ)VGD -Q5S)WLM -DLT)6PX -151)6PC -Z7Z)JKQ -QYC)VH8 -DZJ)QVQ -5RR)42J -94M)JN3 -W16)835 -71Y)L2D -X4Z)NBT -8VP)RFG -KPR)QYC -RRY)CVK -8JD)MZK -2BN)H4N -N3Y)YPP -1J2)94M -C9K)NVM -14R)2HT -ZZD)PTB -82C)YTC -LWF)386 -Z77)9SK -C7R)CD5 -ZTW)KV6 -6W2)P52 -YTS)BR8 -62L)8VS -XLG)2D4 -3C1)KDH -MDN)FDS -1HY)31T -77W)6YX -YM8)QF9 -XR2)YRD -H4T)YHN -S3G)QCN -D2Q)1N6 -NBX)C4M -JQW)VK8 -3PZ)64Y -2WM)H21 -DPJ)HQV -18Z)9BY -N8F)65J -G1W)38F -MQT)H5S -YNV)1YL -K63)VG7 -GDS)HK3 -H3L)MYQ -8JN)YKL -VHZ)KDV -MK7)PQ8 -TPL)7LP -63R)PQ2 -13Y)HVV -P58)8BM -JF1)47V -MFY)HHW -FSZ)4YB -N2K)GHQ -KPK)8HS -4PY)4G3 -VK8)SBK -7L8)S4Q -P52)Z3T -M61)ZK7 -QHF)JK4 -27J)4P6 -RXB)DSH -NW3)LC2 -H3G)SWK -FZL)NBV -L4F)XGQ -FDP)QXJ -Z9H)7M6 -VKY)R1Q -P14)NGF -8J7)Q6H -KQM)RR7 -NSV)LKF -Y6N)P62 -K7B)CYW -ZDP)W95 -CD5)Y6T -C5K)ZM7 -TZ5)LWF -MG1)P4B -BJ6)S6X -TFP)4DX -1KD)XK4 -DGF)FV8 -8Y3)Z9H -D47)2RN -H7H)JP7 -NYL)J52 -8YV)FPZ -268)ZLV -4PP)BQP -B2G)5KC -H1T)T8H -1X7)BSV -BSV)QDG -23Y)XHN -2ZH)D8J -9SS)GS1 -R8R)D4W -58F)B8K -L12)868 -M84)751 -S4P)2FJ -PM7)YPB -VNH)58H -SQC)9GG -XC3)WC9 -JN3)VFD -ZMG)84D -VHW)B48 -P5G)NLB -PG7)XLG -Q6G)664 -MV7)3BJ -H9K)RRY -NWQ)DFD -COM)857 -FZ8)RVH -1GS)MV6 -9TL)LS5 -BJG)422 -D41)JQH -FB2)6NW -12C)9LV -X4C)MJJ -67C)N21 -WNW)LQF -2RH)49M -FSJ)82F -PM2)FT5 -FLY)CXX -KK9)5JZ -XLK)YNX -FV2)PCS -5S4)BD4 -Y4K)V3M -5YM)TFZ -8HS)X4Z -NFV)YZW -Q3G)4RJ -QDG)Z9Q -3NH)M69 -XKW)ZZD -JKQ)YR9 -PYK)FQM -W16)2NG -RKN)HXV -KCK)326 -41N)JGY -9DZ)4RT -FXQ)T6Q -Q6P)XYF -L4K)FTQ -NKB)VBN -CMM)RV1 -FR7)5CD -5Y9)XF3 -Z6N)GZJ -5JZ)6S5 -4W6)TNS -276)K1W -ZDC)Z77 -KDV)2BN -J74)1NG -2N5)XGN -47Z)WJY -CJQ)DMW -6YX)HCD -JWB)151 -1C2)GB4 -S7L)953 -WRH)HXF -VZ8)SPK -HYZ)RWR -5J5)89K -X8S)QHF -B1T)1XS -318)8JN -Y6G)23G -F8T)6YL -FFK)5BH -7YJ)8P1 -GN7)GSR -9R4)2WM -RG8)YSX -XWM)QB8 -SRJ)ZDP -PHM)N8T -VY6)87B -8TT)Z1P -GS1)48W -BWJ)RQJ -GGW)16D -HMJ)KS5 -KMX)YGR -F8X)P32 -SKZ)64G -1K5)6M7 -QVQ)DQ8 -3KW)96K -VR8)9FZ -9X9)1VQ -1NG)ZX9 -FGN)3M6 -5M9)2P9 -3HH)X3G -XGN)ZH2 -P22)PZJ -QWT)DST -SK8)KQM -1N6)DXG -J9S)1FB -PYW)41H -FYS)366 -8BY)TFP -JF8)1KD -WBF)X4C -8CG)WYQ -NQL)5ZB -FBY)3RX -YNX)7J5 -LSW)BS7 -TMB)KCK -ZM7)ZV1 -CF9)7DN -VTZ)P59 -W92)5L6 -N75)318 -8VS)4G5 -CMX)3QL -RJM)SXY -WFR)HN9 -832)5C8 -ZPM)789 -LP8)641 -YR9)GW7 -2TN)7VF -MHK)GXX -91Z)PZD -XYL)TMM -QP8)WRH -VH9)45H -2P9)KBG -4ND)DYC -KV6)DFJ -MB5)MW4 -4TD)BJG -TDK)KLR -QMR)NVB -Z1W)13D -2ZP)8J7 -QYZ)VW5 -PD2)BZ9 -LP3)PTQ -JC7)CL1 -RZB)G2J -B7Z)B65 -L7F)4QG -69W)C92 -WM4)7W8 -YTC)SAN -28W)H82 -WHP)W16 -NSF)LTC -DBG)YYJ -P9R)3DB -6GR)FLY -PHX)JWY -ZZ3)7BH -ZVD)Z1G -HSG)2ST -2NG)C3J -DGN)CJK -KR7)9WD -8CG)YCF -KVF)MYJ -MYQ)RYG -2HZ)5Y9 -LZH)1PN -H86)DFL -C3J)4PY -72S)F52 -D6B)MV7 -Q8K)PSQ -YYJ)FCL -ZXH)Z7N -ZR9)1VD -VG7)ZT7 -58H)NFF -DQP)6WG -7CW)W3Y -K8Q)QTZ -FPZ)QSL -N7R)L4Y -MYJ)ZJZ -6P9)368 -S9Q)J4Y -6L6)17R -RLW)3V1 -79B)PJW -RQ1)VN3 -Z4P)Q1X -8HS)2N5 -953)RZB -XFQ)YTZ -9SK)LWH -RR7)MG8 -6WG)WXR -P4F)3KH -KBY)45J -JNY)JLH -YX9)S3G -1GS)6X8 -6DY)BS1 -JS2)8ZT -XC5)JMW -CTJ)87Z -F92)18J -7FQ)B58 -GCD)7FQ -NGF)SDC -HDZ)5MS -3RX)2ZZ -GYG)G6H -TR8)KHK -LFP)21J -VH1)G1W -QJP)ZZ6 -MV6)T55 -H5S)F8K -1XS)SKZ -B2G)QLS -BG8)B36 -WRM)DTK -T68)P8Q -YYJ)HN8 -Y8C)NQ3 -QBX)FR1 -6FP)FBY -DFD)1HB -7TQ)QFW -R8T)B4N -PFT)BC3 -J4Y)ZCV -3KT)FSJ -N8T)GT3 -48Z)1S5 -RVX)JVF -G54)8Z3 -4SD)M6V -N9R)C8M -9NH)F8T -NRB)DK1 -V2T)1MF -M14)SBV -H9K)F51 -9RW)71Y -Z17)VYK -7BH)GBM -7B2)8R3 -BW3)WNW -2D4)9NR -6NW)69W -1S5)L6L -YC8)7YZ -72T)M1J -45H)N84 -BGB)6GR -N75)QD6 -L81)F4V -CJQ)S6T -ZP9)NWQ -RFG)RN3 -YPP)9DZ -4G3)6SF -BYX)W1V -MRR)4QV -KBB)DPC -TNP)JJX -SYT)3FP -PZD)DZJ -P32)FFQ -XKW)K99 -YGJ)63R -P8Q)Y3P -LN4)9CB -ZV1)WRM -KDB)B1T -664)4HK -2HH)9PB -MLK)LMH -7J4)1S4 -RLD)1C2 -B8K)8LH -H7F)4JN -89K)DQR -14W)48X -XF3)MQ6 -T68)XPF -4LM)YNY -YGJ)8NZ -X4M)YTS -NR6)61R -9YZ)GDS -19J)XKK -8LH)1K2 -DJ2)D3R -1WJ)V38 -JKQ)YWZ -W59)N31 -7ZC)W72 -6F2)R9Z -K9L)F7J -94B)B1W -L8T)FDY -9XQ)2HD -QZY)5KQ -NXS)7LK -WZZ)SYL -1MF)53Z -DKL)D27 -NYY)B2G -KTS)T5V -NMC)5S4 -Y3B)5FH -TMM)QDC -ST3)DQP -V8J)WDK -WYQ)8JD -4QV)74S -MP4)36G -P59)4SD -G47)7GR -368)M55 -HXV)KK9 -WHW)MVK -RXB)WVM -X1S)8NC -XLZ)DSS -RL9)C6S -RMY)C7R -SHD)VHZ -7VF)K4Z -C6T)YKB -Z1V)84J -DRX)HPT -F8H)M45 -6DY)1K3 -V5P)N3F -6L2)64J -TYS)JF1 -CF2)PHM -F4V)RL1 -Y5G)LQK -5KK)1J2 -7J4)H4T -YGR)WHW -KVL)H9C -FGF)TVG -YKL)TGN -L5Q)M84 -NVB)P14 -1S4)FMR -Q7G)Y5G -6SM)ZZ3 -JSN)8NM -R55)XFQ -N66)S87 -49R)KX9 -YY2)9R4 -YT3)XC3 -MX2)X7F -K99)VML -GJL)JF8 -2Q7)23Y -PH2)PQ3 -87B)GFQ -WK6)BV2 -3ZX)XM4 -KBG)ZTT -CXX)RXB -4JN)LPZ -K8Q)YRX -WXS)27J -4NV)C6T -471)9YZ -99G)ZPM -TV3)HC1 -PXR)V9H -1YL)WBF -SGJ)2HG -W1F)8TT -BTJ)5Y1 -L68)P69 -857)NFK -G33)4B4 -L28)WM4 -L75)VHW -FQQ)VTT -X4C)FR7 -Q6H)RL9 -TMB)6D1 -WGZ)QJ5 -181)PCT -53M)6CR -Y2X)FXQ -LXJ)73C -4LJ)HSG -QHN)LN4 -4S3)BWJ -9PJ)5RV -132)H3L -8BP)QX1 -6L2)TK1 -TGN)7TQ -ZM7)VXH -CL1)RLW -RSZ)G2B -B4N)BFG -M1C)Q7R -8J6)GVY -MXJ)NWX -H82)L81 -1VD)4N7 -Y3B)Y7S -TPD)YOU -CNP)DJ2 -RXZ)W3F -9PT)72S -YHN)LP8 -B48)QZY -ZZ6)24N -CVK)WZZ -14L)FLZ -MW4)C25 -PZJ)LP3 -7S7)VHL -9NR)SRR -1PN)28W -PBH)S35 -24K)M14 -62S)MP8 -ZTL)6P3 -BC3)6SM -MSN)WK6 -J7S)CMM -2RN)N8F -SZW)WLN -MDM)VTZ -2R1)99M -8W2)D34 -2FJ)SX2 -P69)RHM -5D2)FDP -1N2)FGF -2CD)N47 -PTB)CWG -S98)8F8 -J3R)LSW -GHQ)8D5 -DFJ)V99 -M45)L4K -Q6W)2W5 -261)8VP -59M)KFQ -RQJ)1KC -RHM)FQQ -SYM)9CQ -N2Y)YJ8 -F4N)G47 -MZK)XC5 -QDC)WGZ -PCS)MDL -F6G)D3G -HH8)PM5 -WVM)5NF -MZJ)F6G -CG1)4GQ -N57)Z24 -JQL)V1L -Z9Q)BJ5 -HN9)CTJ -LQK)844 -BM6)2ZG -H4N)NT4 -DPJ)B2J -9BY)H1T -41W)NWL -W1V)WJ8 -3QL)K7T -1HN)12H -5ZB)443 -Q1X)GN7 -K1H)VY6 -FMR)WWD -ZJZ)5D2 -3V1)YQ6 -QLS)LJR -V6V)N57 -NJP)G33 -GGP)7WY -GYV)6DT -5R7)M2B -N6S)YB3 -DTK)SHR -PQ3)QP8 -7WS)CFQ -XSY)BXP -DMT)YBR -ZVP)L4F -B36)TYS -S4X)3P9 -B2J)WXS -2ST)LJS -MB5)V7C -FV8)KBY -L75)DQ1 -VPD)DKL -W72)WH1 -MR7)ST3 -2HG)ZYX -N21)MXK -VNB)FB2 -PTQ)QCH -64D)6L6 -DZJ)SRV -17V)JZF -K6X)LFP -8R3)5LN -YRD)RS5 -Q3L)2WC -S8J)BG8 -2ZG)W3S -8F8)DYF -WH1)Y9P -2XP)NMC -48W)JKK -49R)N3Y -98X)F4N -72S)4PP -64T)CW9 -TSL)SFW -YH5)2RH -2DW)1RW -BNH)N2Y -P62)461 -DPC)QXZ -M3R)VW3 -4P6)CRC -835)S7L -M14)RB1 -FQM)PD2 -3KH)8Y3 -SQC)69C -G8D)J74 -3DC)2R1 -2B6)9PJ -Y9P)132 -9DQ)59F -19C)WRW -GYG)GGP -DY3)V6V -HLF)2YD -KM8)XSJ -96K)KQZ -LQ6)CF9 -YPB)NBK -N46)HBH -YH6)3PZ -2WC)YNV -L1S)TNP -5ZH)49R -T8G)JRG -ZZD)7CW -1B8)NBX -H22)H7H -SL5)NBL -Y9P)471 -2DQ)25P -9XH)NYY -4BP)3KT -QQC)D95 -VXH)RV3 -LWH)1B8 -2QG)91Z -H9C)BTJ -YRX)ZTL -15N)74D -FGN)KM8 -M8W)2HR -BV2)BHJ -S6H)KVL -7W8)NKB -D8K)DBG -9RL)R8R -G2B)88J -RJY)99G -4GQ)JGG -24N)KVY -8HH)19C -PVZ)C18 -T6Q)NKW -8VS)9XH -ZT7)MP4 -3P9)GYG -M4D)D1C -Y7S)QMR -5NF)TRL -8D5)P22 -PGP)ZXH -7YZ)YM8 -LZ3)77W -PKN)PBH -DT2)LML -RJ9)YNZ -C8V)H6X -BX2)FZL -4RJ)VRV -RF6)C2Q -FF7)JQW -WLN)9GJ -Z34)BTY -CNT)TM5 -LC2)WLL -7DJ)Q3R -12H)HSB -1PN)1HY -4BF)BXF -J93)LP1 -19J)J6C -YSX)NSF -3MY)PFT -1TN)W59 -WL8)B7Z -NBT)PBT -LQ6)FJ4 -J84)Q8P -31T)DF6 -9PW)7S7 -D3R)DPJ -NBK)RX6 -QSL)34T -HYB)GSY -GBM)PKS -SP2)TPL -DY9)KPK -21J)CYG -P69)NQL -FMT)621 -MXK)RSZ -2CJ)WTS -F2S)3HH -PFC)2ZP -T41)62S -TSS)5YM -D95)QQK -XK4)23T -6ZX)K63 -3BY)NJZ -XD8)PGD -8NC)3WK -B1V)W1Y -ZQW)13Y -W2L)62B -PQ2)Y4K -C25)FDX -386)D41 -SKX)XSY -QW6)2DQ -FBY)V8J -RS5)PRC -DQ8)KDB -6S5)PXR -TVG)9RL -G7Q)92C -T88)L16 -BFG)RY2 -NFK)6LG -RB1)Y74 -H21)24K -YNF)63K -8D1)X4D -FS2)12C -RQF)K7B -MTZ)JRP -3WK)L8T -2ZP)P1S -L5F)XQD -B4N)3NK -DTT)VGM -YKP)XKW -PZX)TNX -FT6)7ZC -ZBT)L4Z -27N)RJ9 -GXX)3NH -WCF)1GS -7C9)PFJ -DQR)28X -Q8Z)K6J -P4B)Z4P -WDK)P5G -1FB)VH9 -SD4)48Z -RZS)FWM -T3D)2QG -VZ8)HM6 -BXP)ZMG -69C)TPD -WJY)4KG -QX1)YHB -SJD)J9S -WGD)QHH -RB3)6W5 -G9P)V58 -K6J)XD8 -TNS)CD1 -Y8Z)HDZ -C13)RJM -QCN)14L -DDY)Q6P -JWY)B59 -423)PMR -7M6)H9K -64J)Z34 -MRF)33G -G1W)94B -KJV)LGJ -LPZ)5RR -S6T)DGF -B45)B3H -YQ6)82C -F7J)C8V -KXY)ZWW -TCL)WHP -HQV)DLT -J13)X1S -QQK)6L2 -HBQ)NFV -NKW)J84 -X4D)DTT -5CD)47Z -4TD)D47 -HHW)XQJ -3BY)N46 -8BF)2PM -VBN)XRW -6P3)P74 -WK5)1X6 -MLZ)RZS -SYL)K6X -D1C)T8G -BL4)GYV -LFP)Q6W -FDY)JN4 -3BJ)V2T -4QG)FFT -YZW)VC1 -NT4)5KR -FFQ)NXS -5RV)9NH -SFW)TV3 -1HB)848 -6D1)L8F -9GG)ZVP -M86)LV1 -KVY)JCV -HT5)M86 -8Y3)27N -4RT)ZZ8 -DXC)RMY -6XK)J88 -D1Y)M3Z -HXF)D1Y -789)423 -6DT)12V -J52)J7S -WD9)VR8 -BJ5)9SS -S87)MLK -XY4)HYZ -YHB)S5P -6X8)S4X -RWR)LHC -NDK)2G9 -5KQ)PYK -YRD)L1S -1K3)Q3G -VW3)3BY -BFG)CYM -SH8)8HH -SHR)2HZ -LGJ)FT6 -34T)1H4 -JC7)VH1 -FT5)T8W -CC3)TQS -GKJ)BN8 -FFT)KFY -19R)Y6G -V7C)S6H -C18)M1C -Z8C)W3N -VYK)3JS -82C)H86 -M3R)H22 -NSX)8BY -JLH)F24 -SNM)MTH -B1W)WK5 -WH1)N7R -8ZT)BNH -SDC)Q5S -M2B)43W -Z5Z)SK8 -TM5)75H -J74)JQL -N31)7YJ -GJJ)QJP -6YR)8CG -8P1)6ZX -XFQ)SYM -K6X)5ZH -BQP)GM5 -ZBH)RF6 -R1Q)SQC -96D)TMB -6LG)C13 -HN8)SZW -NQS)15N -5BH)TSS -XHN)6YR -4G5)M8W -NLB)SRM -TSL)TDK -9FZ)XLK -MG8)B21 -5V4)QYW -PCT)1K5 -KFQ)KJV -W76)CS4 -N3F)T3D -BS7)VNB -JCV)RKN -B38)J93 -ZK7)V5P -Z3T)1N2 -DB7)SL5 -4VR)CJQ -D3G)KHS -X8S)CRT -7J5)YKP -W3Y)HMJ -JQH)DW9 -6YL)1JX -WPN)FGN -1JX)W31 -39W)L7F -HCD)X36 -WLL)KFD -HD3)GGW -NTX)Z1W -13D)3X8 -GDS)M3R -BSR)NQS -Z1G)FZX -7C2)Z1V -WTS)SRJ -YB3)H3V -SRV)MFY -D34)JK9 -XQJ)924 -SWK)ZBT -S4Q)NDK -LML)Y2X -JS2)MX2 -JRP)2VG -KS5)RLD -KHS)D2Q -C6S)1TN -23G)P33 -5KC)WPN -VC1)4WW -25P)J3R -G22)2CD -Z24)BL4 -ZXC)WRY -443)S9Q -CYM)C5K -H6X)VKY -N3Y)BM6 -D4R)4VR -DYF)K1H -45J)MHK -Z1P)7WS -XPF)CV9 -2HT)WD9 -QCH)PYW -N84)QKS -1RW)2TN -NRB)FSZ -PQV)78X -844)NNW -W6S)Q3L -GM5)6LY -XKK)GJL -XRH)832 -V3M)X17 -TFZ)T78 -XLZ)6F2 -QM9)GKJ -MTH)H19 -XGB)79B -SK8)MB5 -NR4)Y7Q -GFQ)ZXC -89C)M42 -DW9)BT3 -M84)SH8 -75H)P9R -ZYX)Q6G -DHZ)T83 -NVM)Y3B -7JS)SRW -GB3)7C9 -6LY)MRR -S3G)18Z -C4M)BYX -23T)9BV -5L6)CMX -MV6)PG7 -DFD)SNK -7BH)BKZ -YY2)LMJ -TRH)5M9 -47Z)4BF -WWD)KB3 diff --git a/src/AdventOfCode/Year2019/Day06.hs b/src/AdventOfCode/Year2019/Day06.hs index ef15065..7d0aa55 100644 --- a/src/AdventOfCode/Year2019/Day06.hs +++ b/src/AdventOfCode/Year2019/Day06.hs @@ -1,23 +1,20 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2019.Day06 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (inputFilePath) -import Control.Monad (void) -import Data.Map (Map, (!)) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import AdventOfCode.Util (iterateMaybe) +import Data.Map ((!), (!?)) import Data.Map qualified as Map -import Text.Trifecta - ( Parser, - alphaNum, - eof, - manyTill, - some, - symbol, - token, - ) +import Relude +import Text.Show qualified +import Text.Trifecta (Parser, alphaNum, eof, manyTill, symbol, token) data Orbit - = Orbit String String - deriving (Eq) + = Orbit !String !String + deriving (Eq, Generic) instance Show Orbit where show (Orbit outer inner) = outer ++ ")" ++ inner @@ -27,11 +24,9 @@ orbits = manyTill (token orbit) eof orbit :: Parser Orbit orbit = - do - inner <- some alphaNum - void (symbol ")") - outer <- some alphaNum - pure $ Orbit outer inner + flip Orbit + <$> (some alphaNum <* symbol ")") + <*> some alphaNum directOrbits :: [Orbit] -> Map String String directOrbits = foldr go Map.empty @@ -39,39 +34,36 @@ directOrbits = foldr go Map.empty go (Orbit outer inner) = Map.insert outer inner indirectOrbits :: Map String String -> Map String [String] -indirectOrbits dorbs = Map.foldrWithKey go Map.empty dorbs +indirectOrbits dorbs = Map.foldrWithKey outer Map.empty dorbs where - go :: String -> String -> Map String [String] -> Map String [String] - go outer inner = Map.insert outer (go' [] (Map.lookup inner dorbs)) - go' inners Nothing = inners - go' inners (Just inner') = go' (inner' : inners) (Map.lookup inner' dorbs) + outer outerOrbit innerOrbit = + Map.insert outerOrbit + $ maybe [] (iterateMaybe (dorbs !?)) + $ Map.lookup innerOrbit dorbs minimumOrbitalTransfers :: String -> String -> Map String [String] -> Int -minimumOrbitalTransfers from to iorbs = - let froms = reverse (iorbs ! from) - tos = reverse (iorbs ! to) - in 2 - + length (takeWhile (not . flip elem tos) froms) - + length (takeWhile (not . flip elem froms) tos) - -partOne :: [Orbit] -> Int -partOne orbs = Map.size dorbs + sum (fmap length iorbs) +minimumOrbitalTransfers from to iorbs = 2 + go froms tos + go tos froms where - dorbs = directOrbits orbs - iorbs = indirectOrbits dorbs + go these those = length (takeWhile (not . flip elem those) these) + froms = iorbs ! from + tos = iorbs ! to -partTwo :: [Orbit] -> Int -partTwo orbs = minimumOrbitalTransfers "YOU" "SAN" iorbs - where - dorbs = directOrbits orbs - iorbs = indirectOrbits dorbs +partOne :: SimplePuzzle [Orbit] Int +partOne = + asks + $ directOrbits + >>> (Map.size &&& sum . fmap length . indirectOrbits) + >>> uncurry (+) + +partTwo :: SimplePuzzle [Orbit] Int +partTwo = + asks + $ directOrbits + >>> indirectOrbits + >>> minimumOrbitalTransfers "YOU" "SAN" + +getInput :: IO [Orbit] +getInput = parseInputAoC 2019 6 orbits main :: IO () -main = - do - putStrLn "[2019] Day 6: Universal Orbit Map" - input <- parseInput orbits $(inputFilePath) - putStr "Part One: " - print (partOne input) - putStr "Part Two: " - print (partTwo input) +main = $(defaultMainPuzzle) From 245536613a01aac9e3c1e1c0a0ed37c90d71722a Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 27 Nov 2025 23:45:52 -0600 Subject: [PATCH 56/91] refactor(2024.05-haskell): make applyRules more pointfree [ci skip] --- VERSION | 2 +- src/AdventOfCode/Year2024/Day05.hs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 2b92d89..ece70a3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.77 \ No newline at end of file +2024.7.2.78 \ No newline at end of file diff --git a/src/AdventOfCode/Year2024/Day05.hs b/src/AdventOfCode/Year2024/Day05.hs index 528cf59..873beab 100644 --- a/src/AdventOfCode/Year2024/Day05.hs +++ b/src/AdventOfCode/Year2024/Day05.hs @@ -45,7 +45,7 @@ applyRules rules update = filter (`elem` update) (Graph.topSort graph) relevantRules = filter (all (`elem` update)) rules bounds = bimap getMin getMax - $ foldMap (\(before, after) -> (Min (min before after), Max (max before after))) relevantRules + $ foldMap (Min . uncurry min &&& Max . uncurry max) relevantRules getInput :: IO ([(Int, Int)], [[Int]]) getInput = parseInputAoC 2024 5 safetyManual From 91ce832a53d7c145c75b11756e8e4c29c62e8f1b Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Fri, 28 Nov 2025 15:38:05 -0600 Subject: [PATCH 57/91] refactor(2019.05-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2019/day05.txt | 1 - src/AdventOfCode/Year2019/Day05.hs | 209 ++++++++++++++--------------- 3 files changed, 102 insertions(+), 110 deletions(-) delete mode 100644 input/2019/day05.txt diff --git a/VERSION b/VERSION index ece70a3..774baeb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.78 \ No newline at end of file +2024.7.2.79 \ No newline at end of file diff --git a/input/2019/day05.txt b/input/2019/day05.txt deleted file mode 100644 index 33a2773..0000000 --- a/input/2019/day05.txt +++ /dev/null @@ -1 +0,0 @@ -3,225,1,225,6,6,1100,1,238,225,104,0,1102,35,92,225,1101,25,55,225,1102,47,36,225,1102,17,35,225,1,165,18,224,1001,224,-106,224,4,224,102,8,223,223,1001,224,3,224,1,223,224,223,1101,68,23,224,101,-91,224,224,4,224,102,8,223,223,101,1,224,224,1,223,224,223,2,217,13,224,1001,224,-1890,224,4,224,102,8,223,223,1001,224,6,224,1,224,223,223,1102,69,77,224,1001,224,-5313,224,4,224,1002,223,8,223,101,2,224,224,1,224,223,223,102,50,22,224,101,-1800,224,224,4,224,1002,223,8,223,1001,224,5,224,1,224,223,223,1102,89,32,225,1001,26,60,224,1001,224,-95,224,4,224,102,8,223,223,101,2,224,224,1,223,224,223,1102,51,79,225,1102,65,30,225,1002,170,86,224,101,-2580,224,224,4,224,102,8,223,223,1001,224,6,224,1,223,224,223,101,39,139,224,1001,224,-128,224,4,224,102,8,223,223,101,3,224,224,1,223,224,223,1102,54,93,225,4,223,99,0,0,0,677,0,0,0,0,0,0,0,0,0,0,0,1105,0,99999,1105,227,247,1105,1,99999,1005,227,99999,1005,0,256,1105,1,99999,1106,227,99999,1106,0,265,1105,1,99999,1006,0,99999,1006,227,274,1105,1,99999,1105,1,280,1105,1,99999,1,225,225,225,1101,294,0,0,105,1,0,1105,1,99999,1106,0,300,1105,1,99999,1,225,225,225,1101,314,0,0,106,0,0,1105,1,99999,1008,677,677,224,1002,223,2,223,1005,224,329,101,1,223,223,7,677,677,224,102,2,223,223,1006,224,344,101,1,223,223,108,677,677,224,1002,223,2,223,1006,224,359,1001,223,1,223,7,677,226,224,1002,223,2,223,1005,224,374,1001,223,1,223,1107,677,226,224,1002,223,2,223,1005,224,389,1001,223,1,223,107,226,677,224,102,2,223,223,1005,224,404,1001,223,1,223,1108,226,677,224,1002,223,2,223,1006,224,419,101,1,223,223,107,226,226,224,102,2,223,223,1005,224,434,1001,223,1,223,108,677,226,224,1002,223,2,223,1006,224,449,101,1,223,223,108,226,226,224,102,2,223,223,1006,224,464,1001,223,1,223,1007,226,226,224,1002,223,2,223,1005,224,479,101,1,223,223,8,677,226,224,1002,223,2,223,1006,224,494,101,1,223,223,1007,226,677,224,102,2,223,223,1006,224,509,101,1,223,223,7,226,677,224,1002,223,2,223,1005,224,524,101,1,223,223,107,677,677,224,102,2,223,223,1005,224,539,101,1,223,223,1008,677,226,224,1002,223,2,223,1005,224,554,1001,223,1,223,1008,226,226,224,1002,223,2,223,1006,224,569,1001,223,1,223,1108,226,226,224,102,2,223,223,1005,224,584,101,1,223,223,1107,226,677,224,1002,223,2,223,1005,224,599,1001,223,1,223,8,226,677,224,1002,223,2,223,1006,224,614,1001,223,1,223,1108,677,226,224,102,2,223,223,1005,224,629,1001,223,1,223,8,226,226,224,1002,223,2,223,1005,224,644,1001,223,1,223,1107,677,677,224,1002,223,2,223,1005,224,659,1001,223,1,223,1007,677,677,224,1002,223,2,223,1005,224,674,101,1,223,223,4,223,99,226 diff --git a/src/AdventOfCode/Year2019/Day05.hs b/src/AdventOfCode/Year2019/Day05.hs index 8badf94..1b00d54 100644 --- a/src/AdventOfCode/Year2019/Day05.hs +++ b/src/AdventOfCode/Year2019/Day05.hs @@ -1,51 +1,44 @@ +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE DerivingVia #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE StrictData #-} +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2019.Day05 ( main, + getInput, partOne, partTwo, ) where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (inputFilePath) -import Control.Monad (liftM2, when) -import Control.Monad.IO.Class (liftIO) -import Control.Monad.State (StateT, evalStateT, get, gets, put) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle +import Control.Lens (makeLenses, use, (%=), (.=), (<<+=), (<~)) import Data.FastDigits (digits) -import Data.Vector (Vector, fromList, modify, (!)) +import Data.Vector (Vector, (!)) import Data.Vector qualified as V import Data.Vector.Mutable qualified as MV +import Generic.Data (GenericProduct (..)) +import Relude import Text.Trifecta (Parser, comma, integer, sepBy) --- -------------------------------------------------------------------- [ Main ] - -main :: IO () -main = - do - input <- parseInput stack $(inputFilePath) - putStr "Part One> " - partOne input - putStr "Part Two> " - partTwo input - --- ------------------------------------------------------------------- [ Parts ] - -partOne :: Vector Int -> IO () -partOne = evalStack - -partTwo :: Vector Int -> IO () -partTwo = partOne - -- ------------------------------------------------------------------- [ Types ] -type Program = StateT ProgramState IO - type Stack = Vector Int -data ProgramState = ProgramState - { _stack :: Stack, - _pointer :: Int +data ProgramState' a = ProgramState' + { _programStack :: Stack, + _programPointer :: a } - deriving (Eq, Show) + deriving (Eq, Generic, Show) + deriving + (Semigroup, Monoid) + via (GenericProduct (ProgramState' (Sum a))) + +makeLenses ''ProgramState' + +type ProgramState = ProgramState' Int data Instruction = Add Value Value Int @@ -62,45 +55,67 @@ data Instruction data Value = PositionMode Int | ImmediateMode Int - deriving (Eq, Show) + deriving (Eq, Generic, Show) + +type Program = Puzzle (Stack, Int) ProgramState + +-- -------------------------------------------------------------------- [ Main ] + +main :: IO () +main = do + input <- getInput + putStr "Part One: " *> evaluatingPuzzle partOne input + putStr "Part Two: " *> evaluatingPuzzle partTwo input + +getInput :: IO (Stack, (Int, Int)) +getInput = (,(1, 5)) <$> parseInputAoC 2019 5 stack + +-- ------------------------------------------------------------------- [ Parts ] + +partOne :: Puzzle (Stack, (Int, Int)) ProgramState () +partOne = Puzzle $ withReaderT (second fst) (runPuzzle evalStack) + +partTwo :: Puzzle (Stack, (Int, Int)) ProgramState () +partTwo = Puzzle $ withReaderT (second snd) (runPuzzle evalStack) -- ------------------------------------------------------------------ [ Parser ] -stack :: Parser (Vector Int) -stack = fromList . map fromInteger <$> (integer `sepBy` comma) +stack :: Parser Stack +stack = V.fromList <$> int `sepBy` comma + +int :: Parser Int +int = fromInteger <$> integer -- -------------------------------------------------------- [ Running Programs ] -- TODO: ContT -runProgram :: Program () -runProgram = - do - opCode <- nextInt - if opCode == 99 - then pure () - else do - instruction <- getInstruction (normalizeOpCode opCode) - runInstruction instruction - runProgram +runProgram :: Puzzle (Stack, Int) ProgramState () +runProgram = do + opCode <- nextInt + when (opCode /= 99) do + let normalized = normalizeOpCode opCode + instruction <- getInstruction normalized + runInstruction instruction + runProgram getInstruction :: [Int] -> Program Instruction getInstruction [1, 0, c, b] = - Add <$> (mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) <*> nextInt + (Add . mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) <*> nextInt getInstruction [2, 0, c, b] = - Multiply <$> (mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) <*> nextInt + (Multiply . mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) <*> nextInt getInstruction [3, 0, 0, 0] = - Set <$> liftIO (ImmediateMode . read <$> getLine) <*> nextInt + Set <$> asks (ImmediateMode . snd) <*> nextInt getInstruction [4, 0, c, 0] = - Print <$> (mkValue c <$> nextInt) + Print . mkValue c <$> nextInt getInstruction [5, 0, c, b] = - JumpIfTrue <$> (mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) + (JumpIfTrue . mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) getInstruction [6, 0, c, b] = - JumpIfFalse <$> (mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) + (JumpIfFalse . mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) getInstruction [7, 0, c, b] = - LessThan <$> (mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) <*> nextInt + (LessThan . mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) <*> nextInt getInstruction [8, 0, c, b] = - Equals <$> (mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) <*> nextInt -getInstruction _ = error "Invalid instruction" + (Equals . mkValue c <$> nextInt) <*> (mkValue b <$> nextInt) <*> nextInt +getInstruction ins = fail $ "Invalid instruction: " <> show ins runInstruction :: Instruction -> Program () runInstruction (Add vx vy dst) = @@ -109,77 +124,55 @@ runInstruction (Multiply vx vy dst) = flip setValue dst =<< (*) <$> handleValue vx <*> handleValue vy runInstruction (Set vx dst) = flip setValue dst =<< handleValue vx -runInstruction (Print vx) = - do - x <- handleValue vx - when (x /= 0) $ - liftIO $ - print x -runInstruction (JumpIfTrue vx vy) = - do - x <- handleValue vx - when (x /= 0) $ - jump vy -runInstruction (JumpIfFalse vx vy) = - do - x <- handleValue vx - when (x == 0) $ - jump vy -runInstruction (LessThan vx vy dst) = - do - lt <- (<) <$> handleValue vx <*> handleValue vy - if lt - then setValue 1 dst - else setValue 0 dst -runInstruction (Equals vx vy dst) = - do - eq <- (==) <$> handleValue vx <*> handleValue vy - if eq - then setValue 1 dst - else setValue 0 dst +runInstruction (Print vx) = do + x <- handleValue vx + when (x /= 0) + $ print x +runInstruction (JumpIfTrue vx vy) = do + x <- handleValue vx + when (x /= 0) + $ jump vy +runInstruction (JumpIfFalse vx vy) = do + x <- handleValue vx + when (x == 0) + $ jump vy +runInstruction (LessThan vx vy dst) = do + lt <- (<) <$> handleValue vx <*> handleValue vy + if lt + then setValue 1 dst + else setValue 0 dst +runInstruction (Equals vx vy dst) = do + eq <- (==) <$> handleValue vx <*> handleValue vy + if eq + then setValue 1 dst + else setValue 0 dst runInstruction End = pure () jump :: Value -> Program () -jump vy = - do - state <- get - y <- handleValue vy - put $ state {_pointer = y} +jump vy = do + y <- handleValue vy + programPointer .= y -evalStack :: Stack -> IO () -evalStack st = evalStateT runProgram (initialState {_stack = st}) +evalStack :: Program () +evalStack = do + programPointer .= 0 + programStack <~ asks fst + runProgram -- -------------------------------------------------- [ Manipulating the Stack ] --- TODO: Lenses setValue :: Int -> Int -> Program () -setValue x dst = - do - state <- get - put $ state {_stack = modify (\v -> MV.write v dst x) (_stack state)} - -incrementPointer :: Program () -incrementPointer = - do - state <- get - put $ state {_pointer = _pointer state + 1} +setValue x dst = programStack %= V.modify (\v -> MV.write v dst x) nextInt :: Program Int -nextInt = - do - vx <- gets (liftM2 (!) _stack _pointer) - incrementPointer - pure vx +nextInt = liftA2 (!) (use programStack) (programPointer <<+= 1) handleValue :: Value -> Program Int -handleValue (PositionMode i) = flip V.indexM i . _stack =<< get +handleValue (PositionMode i) = use programStack >>= flip V.indexM i handleValue (ImmediateMode n) = pure n -- -------------------------------------------------------- [ Helper Functions ] -initialState :: ProgramState -initialState = ProgramState {_stack = V.empty, _pointer = 0} - normalizeOpCode :: Int -> [Int] normalizeOpCode d = take 4 $ digits 10 (fromIntegral d) ++ repeat 0 From 56ffcba82bf79a1b320908bd556774d73e164911 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Fri, 28 Nov 2025 16:41:11 -0600 Subject: [PATCH 58/91] refactor(2019.03-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2019/day03.txt | 2 - package.yaml | 2 + src/AdventOfCode/Year2019/Day03.hs | 150 +++++++++++++---------------- 4 files changed, 70 insertions(+), 86 deletions(-) delete mode 100644 input/2019/day03.txt diff --git a/VERSION b/VERSION index 774baeb..f738e58 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.79 \ No newline at end of file +2024.7.2.80 \ No newline at end of file diff --git a/input/2019/day03.txt b/input/2019/day03.txt deleted file mode 100644 index 87d829c..0000000 --- a/input/2019/day03.txt +++ /dev/null @@ -1,2 +0,0 @@ -R1003,D430,L108,D570,R459,U7,L68,D232,L130,U93,R238,U951,L821,U723,L370,U873,L680,U749,R110,U17,R185,U484,R550,U356,L212,U350,L239,D208,R666,U70,L369,U448,R54,D402,R165,D375,L468,U886,L303,U779,L752,U664,L120,U643,R405,D288,L220,U727,L764,D615,R630,U688,R961,U499,L782,D852,L743,U443,R355,U856,L795,U235,L876,D511,L108,U637,R427,D338,L699,D911,L506,D607,L539,U977,R654,D634,L196,U944,R922,D774,R358,U828,L970,D386,R795,U602,R249,U793,L171,D217,L476,D123,L179,U820,R895,D239,R363,D629,L226,D811,R962,D848,R218,D581,R369,D872,L653,D281,R304,D302,R780,U636,L413,D712,L642,D886,R613,U736,L968,D82,R953,U408,L130,U654,R312,U74,L610,D798,R242,D586,L808,D664,L764,U455,R264,U384,L154,D484,R883,D276,L423,U11,L145,U156,L268,U46,R202,U641,R920,D483,R859,U94,L173,D796,R11,D328,R48,D161,L615,D396,R350,D48,R946,D233,R385,D294,R640,D301,R810,D824,L969,D469,R34,U995,R750,D827,R52,U606,R143,U868,L973,U863,L17,U995,L236,U994,R403,D312,R49,U143,L399,U821,R974,U119,R410,D233,R228,D326,R112,D512,L950,D103,L590,U80,R7,U441,L744,U643,L80,D631,L576,U680,R369,U741,L87,D748,R773,U145,R464,U546,R80,D251,L972,U414,L390,U148,L84,D481,L425,U293,L564,U880,R535,U703,R981,U944,R224,D366,R29,U517,R342,U686,L384,D650,R983,D287,L108,U713,L523,U695,R881,D126,R151,U153,R161,D791,L599,D936,L816,U387,R411,U637,L434,D22,L720,U579,L661,D644,L220,U325,R753,D392,L503,U617,R1,D956,L607,U602,L800,D749,L193,U215,L91,U733,L606,U510,L124,D550,R303,D835,R19,D326,R577,U265,L156,D924,L122,D186,R803,U3,R879 -L1003,U603,L675,U828,R671,U925,R466,D707,L39,U1,R686,U946,L438,U626,R714,D365,L336,D624,R673,U672,L729,D965,R824,D533,R513,D914,R829,U275,L424,U10,L244,U158,R779,D590,R116,U714,R662,D989,R869,D547,R817,U315,R439,D29,L599,D870,L645,U656,R845,U19,R960,U669,L632,D567,L340,U856,R955,D314,R452,D896,R574,D162,R240,U302,R668,U706,R394,D24,L422,U884,R804,U576,L802,U400,R405,U676,L344,D628,R672,U580,R710,U536,L712,U738,L266,D212,R552,D229,R265,U835,R152,U784,L478,D87,L783,D327,R728,U590,R408,D397,R363,D654,R501,D583,R445,U897,R888,D480,R455,U593,R906,D506,R985,D361,R361,D619,L462,D873,L248,D348,R540,D578,L274,D472,R254,U647,R54,U681,L33,U343,R913,U120,L64,D849,L953,U407,L64,U744,L482,U240,L82,U69,R480,D796,L137,U527,R428,U67,R123,U688,L985,D944,R583,D804,R331,U328,R906,U376,L966,U433,R863,D931,L315,D9,L77,D141,L738,D661,R742,D44,R383,U78,R106,D301,L186,U907,L304,U786,L256,U718,R861,D145,R694,D721,R607,D418,R358,U600,R228,D139,R476,D451,L49,U616,L491,U8,R371,D735,R669,U388,L905,D282,L430,U491,L775,U891,L831,U350,L247,D609,R489,U266,R468,D748,R134,U187,R882,D315,R344,D363,R349,U525,R831,U644,R207,D563,L1,D946,L559,U789,L187,U370,L284,D910,L394,D560,L705,U661,R272,U109,L12,D554,L670,D169,L375,D100,R382,D491,L53,D916,R152,U82,L236,U845,L860,U732,R327,D190,R888,U722,R770,U993,R509,D970,L225,D756,R444,D992,L746,D35,R329,D452,R728,U575,L325,U414,L709,D844,R692,D575,R132,D520,L506,D384,L581,U36,L336,U849,L944,U450,R138,D186,L613,U805,R32,U763,R210,U556,R125,D499,R729 diff --git a/package.yaml b/package.yaml index 16d8896..3fabcaa 100644 --- a/package.yaml +++ b/package.yaml @@ -297,6 +297,8 @@ executables: aoc-2019-day03: <<: *executable main: AdventOfCode.Year2019.Day03 + dependencies: + - linear aoc-2019-day04: <<: *executable main: AdventOfCode.Year2019.Day04 diff --git a/src/AdventOfCode/Year2019/Day03.hs b/src/AdventOfCode/Year2019/Day03.hs index 22370d9..b8b09ce 100644 --- a/src/AdventOfCode/Year2019/Day03.hs +++ b/src/AdventOfCode/Year2019/Day03.hs @@ -1,60 +1,38 @@ +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2019.Day03 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (inputFilePath) -import Control.Applicative ((<|>)) -import Control.Arrow (second, (&&&)) -import Control.Category ((>>>)) -import Data.Foldable (minimumBy) -import Data.Function (on) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import Data.Foldable (maximum, minimum, minimumBy) import Data.Ix (Ix (..)) -import Data.Set (Set) import Data.Set qualified as Set -import GHC.Arr (unsafeIndex, unsafeRangeSize) -import Text.Trifecta +import Linear (V2 (..), (^*)) +import Relude +import Relude.Extra.Bifunctor (bimapBoth) +import Text.Trifecta (Parser, char, choice, comma, natural, sepBy) -- ------------------------------------------------------------------- [ Types ] data Segment - = Segment Direction Int - deriving (Eq, Show) + = Segment !Direction !Int + deriving (Eq, Generic, Show) data Direction = D | L | R | U - deriving (Eq, Show) - -data Point = Point - { _x :: Int, - _y :: Int - } - deriving (Eq, Ord) - -instance Ix Point where - {-# SPECIALIZE instance Ix Point #-} - - range (Point x0 y0, Point x1 y1) = - [ Point x y | x <- range (x0, x1), y <- range (y0, y1) - ] - {-# INLINE range #-} + deriving (Eq, Generic, Show) - unsafeIndex (Point x0 y0, Point x1 y1) (Point x y) = - unsafeIndex (x0, x1) x * unsafeRangeSize (y0, y1) + unsafeIndex (y0, y1) y - {-# INLINE unsafeIndex #-} - - inRange (Point x0 y0, Point x1 y1) (Point x y) = - inRange (x0, x1) x && inRange (y0, y1) y - {-# INLINE inRange #-} - -instance Show Point where - show (Point x y) = concat ["(", show x, ",", show y, ")"] +type Point = V2 Int -- ----------------------------------------------------------------- [ Parsers ] point :: Parser Point -point = Point <$> nonnegInt <*> (comma *> nonnegInt) +point = V2 <$> nonnegInt <*> (comma *> nonnegInt) wires :: Parser ([Segment], [Segment]) wires = (,) <$> segments <*> segments @@ -67,10 +45,12 @@ segment = Segment <$> direction <*> nonnegInt direction :: Parser Direction direction = - (D <$ char 'D') - <|> (L <$ char 'L') - <|> (R <$ char 'R') - <|> (U <$ char 'U') + choice + [ D <$ char 'D', + L <$ char 'L', + R <$ char 'R', + U <$ char 'U' + ] nonnegInt :: Parser Int nonnegInt = fromIntegral <$> natural @@ -78,76 +58,80 @@ nonnegInt = fromIntegral <$> natural -- ----------------------------------------------------------------- [ Helpers ] manhattanDistance :: Point -> Point -> Int -manhattanDistance = curry $ (distanceOn _x &&& distanceOn _y) >>> uncurry (+) - where - distanceOn :: (Num a) => (b -> a) -> (b, b) -> a - distanceOn f = abs . uncurry (subtract `on` f) +manhattanDistance from to = sum (abs (to - from)) findCrossings :: [Point] -> [Point] -> Set Point findCrossings = Set.intersection `on` Set.fromList runSegments :: [Segment] -> [Point] -runSegments = snd . foldl go (Point 0 0, []) +runSegments = snd . foldl' go (0, []) where go (start, pointses) seg = second (pointses ++) (runSegment (start, seg)) runSegment :: (Point, Segment) -> (Point, [Point]) -runSegment (Point x y, Segment D distance) = - let to = Point x (y - distance) in (to, reverse (range (to, Point x (y - 1)))) -runSegment (Point x y, Segment L distance) = - let to = Point (x - distance) y in (to, reverse (range (to, Point (x - 1) y))) -runSegment (Point x y, Segment R distance) = - let to = Point (x + distance) y in (to, range (Point (x + 1) y, to)) -runSegment (Point x y, Segment U distance) = - let to = Point x (y + distance) in (to, range (Point x (y + 1), to)) +runSegment (from, Segment direktion distance) + | 1 == maximum (signum delta) = (to, range (from + delta, to)) + | otherwise = (to, reverse (range (to, from + delta))) + where + delta = directionToPoint direktion + to = from + delta ^* distance + +directionToPoint :: Direction -> Point +directionToPoint = \case + D -> V2 0 (-1) + L -> V2 (-1) 0 + R -> V2 1 0 + U -> V2 0 1 -- ---------------------------------------------------------------- [ Examples ] -exampleOne :: Result Int +exampleOne :: IO () exampleOne = runExample - "R8,U5,L5,D3\ - \ U7,R6,D4,L4" + "R8,U5,L5,D3\n\ + \U7,R6,D4,L4" -exampleTwo :: Result Int +exampleTwo :: IO () exampleTwo = runExample - "R75,D30,R83,U83,L12,D49,R71,U7,L72\ - \ U62,R66,U55,R34,D71,R55,D58,R83" + "R75,D30,R83,U83,L12,D49,R71,U7,L72\n\ + \U62,R66,U55,R34,D71,R55,D58,R83" -exampleThree :: Result Int +exampleThree :: IO () exampleThree = runExample - "R98,U47,R26,D63,R33,U87,L62,D20,R33,U53,R51\ - \ U98,R91,D20,R16,D67,R40,U7,R15,U6,R7" + "R98,U47,R26,D63,R33,U87,L62,D20,R33,U53,R51\n\ + \U98,R91,D20,R16,D67,R40,U7,R15,U6,R7" -runExample :: String -> Result Int -runExample = fmap partOne . parseString wires mempty +runExample :: String -> IO () +runExample = + parseString wires >=> evaluatingPuzzle do + putStr "Part One: " + print =<< partOne + putStr "Part Two: " + print =<< partTwo -- ------------------------------------------------------------------- [ Parts ] -partOne :: ([Segment], [Segment]) -> Int +partOne :: SimplePuzzle ([Segment], [Segment]) Int partOne = - distance + asks + $ distance . minimumBy (compare `on` distance) . uncurry (findCrossings `on` runSegments) where - distance = manhattanDistance (Point 0 0) + distance = manhattanDistance 0 -partTwo :: ([Segment], [Segment]) -> Int -partTwo (xs, ys) = - minimum $ - Set.map (\p -> ((+) `on` (+ 1) . length . takeWhile (/= p)) xs' ys') $ - findCrossings xs' ys' - where - (xs', ys') = (runSegments xs, runSegments ys) +partTwo :: SimplePuzzle ([Segment], [Segment]) Int +partTwo = + asks $ bimapBoth runSegments >>> \(xs, ys) -> + findCrossings xs ys + & Set.map (\p -> 2 + ((+) `on` length . takeWhile (/= p)) xs ys) + & minimum + +getInput :: IO ([Segment], [Segment]) +getInput = parseInputAoC 2019 3 wires main :: IO () -main = - do - input <- parseInput wires $(inputFilePath) - putStr "Part One: " - print $ partOne input - putStr "Part Two: " - print $ partTwo input +main = $(defaultMainPuzzle) From e8d0473bdcb04814541e53f0fdcf79fba38ea880 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Fri, 28 Nov 2025 18:29:28 -0600 Subject: [PATCH 59/91] refactor(2019.02-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2019/day02.txt | 1 - package.yaml | 1 + src/AdventOfCode/Year2019/Day02.hs | 91 +++++++++++++++--------------- 4 files changed, 47 insertions(+), 48 deletions(-) delete mode 100644 input/2019/day02.txt diff --git a/VERSION b/VERSION index f738e58..89f1af3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.80 \ No newline at end of file +2024.7.2.81 \ No newline at end of file diff --git a/input/2019/day02.txt b/input/2019/day02.txt deleted file mode 100644 index f2c7299..0000000 --- a/input/2019/day02.txt +++ /dev/null @@ -1 +0,0 @@ -1,0,0,3,1,1,2,3,1,3,4,3,1,5,0,3,2,13,1,19,1,10,19,23,1,23,9,27,1,5,27,31,2,31,13,35,1,35,5,39,1,39,5,43,2,13,43,47,2,47,10,51,1,51,6,55,2,55,9,59,1,59,5,63,1,63,13,67,2,67,6,71,1,71,5,75,1,75,5,79,1,79,9,83,1,10,83,87,1,87,10,91,1,91,9,95,1,10,95,99,1,10,99,103,2,103,10,107,1,107,9,111,2,6,111,115,1,5,115,119,2,119,13,123,1,6,123,127,2,9,127,131,1,131,5,135,1,135,13,139,1,139,10,143,1,2,143,147,1,147,10,0,99,2,0,14,0 diff --git a/package.yaml b/package.yaml index 3fabcaa..3b2e8de 100644 --- a/package.yaml +++ b/package.yaml @@ -293,6 +293,7 @@ executables: <<: *executable main: AdventOfCode.Year2019.Day02 dependencies: + - pointless-fun - vector aoc-2019-day03: <<: *executable diff --git a/src/AdventOfCode/Year2019/Day02.hs b/src/AdventOfCode/Year2019/Day02.hs index 46d9f48..22267d9 100644 --- a/src/AdventOfCode/Year2019/Day02.hs +++ b/src/AdventOfCode/Year2019/Day02.hs @@ -1,60 +1,59 @@ +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2019.Day02 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (inputFilePath) -import Control.Arrow (first, (>>>)) -import Data.List (find) -import Data.Vector (Vector, fromList, modify, toList, (!)) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import AdventOfCode.Util (maybeFail) +import Data.Function.Pointless ((.:)) +import Data.Vector (Vector, (!)) import Data.Vector qualified as V -import Data.Vector.Mutable (write) import Data.Vector.Mutable qualified as MV -import Text.Trifecta (Parser, Result (..), comma, natural, parseString, sepBy) +import Relude +import Text.Trifecta (Parser, comma, natural, sepBy) +import Prelude (until) program :: Parser (Vector Int) -program = fromList . map fromInteger <$> (natural `sepBy` comma) +program = V.fromList . map fromInteger <$> (natural `sepBy` comma) + +getInput :: IO (Vector Int) +getInput = parseInputAoC 2019 2 program main :: IO () -main = - do - state <- parseInput program $(inputFilePath) - putStr "Part One: " - print $ partOne state - putStr "Part Two: " - print $ partTwo state - -partOne :: Vector Int -> Int -partOne state = V.head (runProgram (restoreGravityAssist state)) - -partTwo :: Vector Int -> Int -partTwo state = - maybe (error "Fail") (first (* 100) >>> uncurry (+)) $ - find go (concatMap (zip [0 .. n] . repeat) [0 .. n]) - where - n = V.length state - 1 - go (noun, verb) = - 19690720 == V.head (runProgram (restoreGravityAssist' noun verb state)) +main = $(defaultMainPuzzle) -restoreGravityAssist :: Vector Int -> Vector Int -restoreGravityAssist = restoreGravityAssist' 12 2 +partOne :: SimplePuzzle (Vector Int) Int +partOne = asks (V.head . runProgram . restoreGravityAssist 12 2) -restoreGravityAssist' :: Int -> Int -> Vector Int -> Vector Int -restoreGravityAssist' noun verb = - modify (\v -> write v 1 noun *> write v 2 verb) +partTwo :: SimplePuzzle (Vector Int) Int +partTwo = do + n <- asks (subtract 1 . V.length) + go <- asks (runProgram .: restoringGravityAssist) + (noun, verb) <- + maybeFail "could not find matching input" + $ find ((19690720 ==) . V.head . go) + $ concatMap (zip [0 .. n] . repeat) [0 .. n] + pure (100 * noun + verb) + +restoringGravityAssist :: Vector Int -> (Int, Int) -> Vector Int +restoringGravityAssist prog (noun, verb) = restoreGravityAssist noun verb prog + +restoreGravityAssist :: Int -> Int -> Vector Int -> Vector Int +restoreGravityAssist noun verb = + V.modify (\v -> MV.write v 1 noun *> MV.write v 2 verb) runProgram :: Vector Int -> Vector Int -runProgram = go 0 +runProgram = fst . until ((99 ==) . uncurry (!)) go . (,0) where - go n state - | state ! n == 99 = state - | otherwise = go (n + 4) $ step (toList (V.slice n 4 state)) + go (prog, n) = (step (V.toList (V.slice n 4 prog)), n + 4) where - step [1, x, y, dst] = modify (runOp (+) x y dst) state - step [2, x, y, dst] = modify (runOp (*) x y dst) state - step _ = state - runOp f x y dst v = write v dst =<< f <$> MV.read v x <*> MV.read v y - -example1 :: Vector Int -example1 = - case parseString program mempty "1,9,10,3,2,3,11,0,99,30,40,50" of - Success prog -> prog - Failure reason -> error (show reason) + step [1, x, y, dst] = V.modify (runOp (+) x y dst) prog + step [2, x, y, dst] = V.modify (runOp (*) x y dst) prog + step _ = prog + runOp f x y dst v = MV.write v dst =<< f <$> MV.read v x <*> MV.read v y + +example1 :: IO (Vector Int) +example1 = parseString program "1,9,10,3,2,3,11,0,99,30,40,50" From ac91dbae44a76235159a99dbe9653ee1f408fa4e Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Fri, 28 Nov 2025 19:50:32 -0600 Subject: [PATCH 60/91] refactor(2020.20-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2020/day20.txt | 1727 ---------------------------- src/AdventOfCode/Year2020/Day20.hs | 74 +- 3 files changed, 38 insertions(+), 1765 deletions(-) delete mode 100644 input/2020/day20.txt diff --git a/VERSION b/VERSION index 89f1af3..fdaf935 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.81 \ No newline at end of file +2024.7.2.82 \ No newline at end of file diff --git a/input/2020/day20.txt b/input/2020/day20.txt deleted file mode 100644 index 824bb86..0000000 --- a/input/2020/day20.txt +++ /dev/null @@ -1,1727 +0,0 @@ -Tile 3469: -.##..#.#.# -##..#...## -...#..##.# -....#.#..# -#..#.##... -.#.##.#.## -..#.#..... -..###.#..# -#.##.#...# -....#...## - -Tile 3739: -..##..#..# -#.#...#..# -.....#.##. -.#..#....# -#.....#... -#..##.#..# -####.#.##. -##..#.#..# -..#......# -#..#.##.## - -Tile 3581: -####.#..## -..#......# -.##...#... -#....#.### -..#..#.#.. -#...#..... -#..####... -......#... -..#...#.## -##.#..#..# - -Tile 2521: -..#.##..## -..#.#..##. -#......... -#.#....... -.#........ -#.....#..# -.......... -.#........ -#........# -#.....#.#. - -Tile 2729: -...##...## -....#..#.. -#...##.... -##.#...... -#..#..#.## -.#...#...# -....#.##.. -#.....##.# -#....##..# -......#.#. - -Tile 2137: -#.#...#.## -#.......#. -.#.#..#..# -##.....#.# -.....#...# -...#...... -#........# -....#....# -.......#.. -.#.#.##### - -Tile 1451: -...#.#.##. -##.#...... -.###...#.# -..##....## -....##.... -...#..#... -...#..#.#. -##..#....# -#..#...##. -.###....## - -Tile 2927: -.#...#.... -.#.......# -#...#....# -##.......# -..#....#.# -#.#....#.. -#....#..## -#........# -#.#....... -#########. - -Tile 2179: -...#..#..# -#....##... -....#...## -...#.#..## -#........# -..#.#...## -.#........ -.###.####. -....#.#..# -..#.#..... - -Tile 2267: -#.##...##. -.....#...# -..###...## -.....#..## -.....#...# -##........ -#..#..#... -....##.... -....#....# -###.####.. - -Tile 2423: -....###.## -#....#.#.. -#......#.# -...#.....# -......#..# -.#......## -#.#......# -.......... -...#..##.. -##.##...## - -Tile 3989: -.#.#....#. -#........# -..##....## -.#.###.##. -.....#.... -#...##.##. -#....##..# -#......... -#....#.... -.#..###... - -Tile 1913: -.####...## -#......... -....#...#. -#.......## -#...#....# -#...#..... -.#.##...#. -.......#.. -##..#...#. -.##..#.##. - -Tile 2017: -.#.##.###. -#.....#... -..#..#...# -#........# -......#.#. -#...#....# -#.#.#...#. -.###.#.... -.##...#### -#.##.##### - -Tile 1277: -.##...#.## -#..#.....# -#.#.#...## -#.#.#...## -.####....# -....#....# -.....#.... -#....####. -#......... -#...#...#. - -Tile 1999: -.##.##..#. -#......... -#...#..... -...#...... -#.#.....#. -....#....# -........## -#......#.# -..#.#....# -.#.#.#.... - -Tile 2803: -#......##. -..##.##... -...#.#.... -#...#....# -....#.#..# -#...#...## -.........# -#...#.##.. -....##.#.# -#..#..#.#. - -Tile 1801: -...#.###.# -...#.###.. -...##..#.# -....##.### -##.......# -....#.#..# -##.###..#. -...#...#.# -#.##..##.. -###......# - -Tile 1009: -...#..#.#. -#.##.#.... -#.....##.. -#.#..#.... -#......... -#....#.#.# -#....##..# -..##...... -..#.#...#. -##.###.#.# - -Tile 3329: -..#.###... -.#....#.#. -.......... -#....##..# -##.##..### -.......... -.......... -#...#.#... -###.#..### -#####.##.# - -Tile 3719: -..#.###.#. -#....#...# -##..#.##.# -....#.###. -##.....#.# -##....#... -##.......# -#.#......# -.##...#.#. -####..##.# - -Tile 2381: -##.#...... -#.....#... -#.....#... -.....##... -..##...##. -###......# -#.....#.## -..#...#### -#.#...#..# -#..#...... - -Tile 2593: -###.#.###. -..#.##..## -#.#......# -....#.#### -..#...##.# -..#.#.#... -#.##...... -..#..#...# -.##.##...# -.###.##.## - -Tile 3559: -...#...#.. -#..#.#.#.. -.......... -.#.#...... -..#......# -....#....# -.......### -...#..###. -..#.#...#. -..#.##.##. - -Tile 2953: -#.##.....# -.........# -#...#..... -#...#....# -...#....#. -#..#...#.. -#.....#.## -#...#.#..# -...###..## -..#..##..# - -Tile 1283: -..#..#.#.# -##.....#.# -.........# -#.....#... -###......# -..#.#.#### -#..#.....# -..#...#..# -###.##.... -...#...### - -Tile 2897: -.......### -##.#....#. -#.....#### -##...#...# -.....#.... -#.....#... -.##...##.. -.....#...# -......#..# -.#....##.# - -Tile 3779: -###..####. -#..##..#.# -#.#...#..# -......#..# -#....#.... -...#...##. -......#### -##....#..# -#.#....#.. -#####....# - -Tile 2693: -#.#.#.#### -.......... -#.#.#....# -..#.#..#.# -##.....#.# -##....#... -.##.#..... -##.......# -.....#.... -.###.#..#. - -Tile 1453: -#..##....# -#..#....#. -#.#....##. -.##.#....# -..#.#....# -.###.....# -....##.... -#...##...# -#.###..... -.##....#.. - -Tile 1459: -.##.##.### -..#....... -......##.# -##...#...# -#.#.....## -#.#......# -...##.#... -###..#...# -...#....#. -...##.#.## - -Tile 1109: -#.#.#.#..# -#..#.####. -.....##..# -.##...#..# -.#...###.# -........#. -.....#.#.# -...#...### -....#.#..# -##..#..##. - -Tile 3943: -...###.... -##...###.# -####.....# -#......... -.#......#. -..#..#.#.# -..#....#.. -##..#....# -#..#.....# -#.##..#.## - -Tile 1129: -###...##.. -....#....# -#........# -#......#.. -..#...#... -#......#.# -....#...#. -.....#.... -##......## -#..####.#. - -Tile 2837: -...###.#.# -#......#.. -..#.....## -.....#...# -#......#.. -.......... -#......#.. -#.#.....## -#.#.#..... -.####.##.. - -Tile 3299: -####..#... -#........# -#...#..#.# -#.#....#.. -#...#..... -...##.#..# -#.#.....## -..##...... -#...#.#..# -#.###..##. - -Tile 1493: -#..##..#.# -###......# -.......... -...#.....# -....#..... -...#.....# -.#........ -...###..#. -.#.#...#.# -####.#.#.. - -Tile 3931: -#.####.... -.....###.# -...#....#. -#.#....#.# -#..#.....# -#........# -...##..#.. -.....#.... -#..#...#.# -#.###.##.. - -Tile 2879: -#####..... -##.#.#...# -#.....#.## -##....#.## -#..#...... -#.#...#... -..#.....#. -...#...### -...#....## -.#.###.#.. - -Tile 2617: -##.#.#.#.# -.....#.#.. -#...#..... -#...##...# -.#.......# -#.#....... -##..#..... -#......### -..#..#...# -.###..#..# - -Tile 2383: -..#.#..#.# -#..#...... -#...#.#... -....##...# -.#..#.#..# -#####....# -#.#......# -#........# -..##...### -.##.##.### - -Tile 3373: -.##..####. -...#..#.## -#..#.....# -####...#.# -#..#..#... -#.#....##. -##.#....## -.#..##..#. -.##..#...# -######..#. - -Tile 3803: -.#..#.##.. -.......##. -#....#.... -..#......# -...##..... -#......... -..##...... -#.#...#..# -..##.....# -#..#####.. - -Tile 3677: -.#.#####.# -#...#..... -.....#.... -..#......# -.#.#...#.# -..###.##.. -##...##..# -#..#...... -#...#..#.. -...#####.# - -Tile 3323: -####.#..#. -#..#.##..# -#......... -.#.......# -#.#.....#. -#..#.....# -#....##.#. -.......#.# -#####..#.. -.#.##.#### - -Tile 3457: -.#.#..#..# -.#..#..... -..##..#... -......#..# -.#.....#.# -#......... -#..#..#.#. -#####....# -###.#...#. -#..###.### - -Tile 1303: -##..#.#### -#.#..#.... -.....#...# -#.#....... -#..####... -#...##.... -###..#..## -##.......# -#...#..#.# -#..#.#..## - -Tile 2687: -.####...## -#..#.....# -..#...#... -##.....#.# -#.....#..# -#......... -...#.#...# -.........# -#..#.....# -#.##.#...# - -Tile 1907: -..#....### -....#...## -..#.##..#. -.#....##.. -......#... -......#.#. -#.....#.## -..#...#... -....#....# -#####.#### - -Tile 3217: -#.##.##... -#..#.##... -.#..#.##.. -#.....#.#. -....#..... -###.#.##.. -.#.#.###.. -#......... -#......#.# -#.###..##. - -Tile 3923: -#.##.#..## -......#..# -#.....#... -..#.#..... -#........# -.#...#...# -.....#...# -.#..#.##.# -..#..#...# -..#####.## - -Tile 2239: -#.#.###.## -#..#..#... -.##..#.... -#...##..#. -#........# -..#.#..... -##.##..... -#.#..###.# -##..##.... -#.#.#..##. - -Tile 1823: -###..###.. -.#.##...#. -..###....# -#.#..#...# -###.#..... -#.#...#.## -#...##..## -##.#...#.# -#....#.### -.#.##.#..# - -Tile 2711: -.#.#.....# -.....#..## -..#..#..## -#......... -.......... -#.##..##.# -####..#### -###....... -........#. -.#.#.####. - -Tile 1123: -###.#.##.# -........## -.......##. -.#........ -.#....#..# -###.#.##.. -..##...... -#.#.#..... -##...#..## -###..##### - -Tile 3659: -...##.##.. -.#....#... -.#..#..... -.......... -.....#.#.. -...#...### -#.....#... -.#........ -#..#...... -#...#.#..# - -Tile 3499: -###..##.#. -#..##....# -###.#..... -#####..... -..#....... -###..#.#.. -......##.# -.#.......# -#.##.#...# -.#.#.##.## - -Tile 3019: -#..#.###.. -....#....# -.#......## -###.#....# -..#.#..... -..##....#. -.#..#..#.# -.........# -....#...## -##..#.#..# - -Tile 3529: -####....## -..##...#.# -#......... -...#...... -......#..# -##......## -#.##....## -##.#...#.# -#.#....... -###.##..#. - -Tile 1733: -##..#....# -....#..... -#.#......# -..#..#...# -...#....#. -.....#.... -.......#.# -......#..# -#.#.#..### -.###.#.##. - -Tile 1367: -#.#.###.#. -#.##.##.#. -##..#.##.. -#.....#### -.##...#..# -...##.#..# -#.......## -.##..##..# -#.##...... -#...###... - -Tile 2557: -##.####### -#..#####.. -##.#.#...# -#..#.#.... -.#..#....# -###...#..# -##..#.#... -#...##..## -#.#.##.#.# -#.#...#..# - -Tile 2081: -.###..#..# -.....#.... -##.....#.. -.......... -.......... -#.##...... -.........# -......#.#. -...#.....# -...###.#.# - -Tile 3391: -.##.#..... -...###...# -..#.##.... -#...#.#..# -#......##. -#........# -...#..#..# -.....#.... -.#...#.... -##....#... - -Tile 2657: -#.#.##.#.. -##...#.... -..#...#... -#......... -.........# -##........ -##...#.... -##.....#.. -...#...#.# -##...###.. - -Tile 1429: -.###.....# -#........# -..#.#..#.. -.......### -.......#.. -.......##. -##..#...## -.#......#. -..#....#.. -.##.##.... - -Tile 2339: -.#.####... -#......#.. -#.#...##.. -##....##.# -......##.# -.#......#. -.#...#..## -#........# -#.##.#.### -..#..#.#.. - -Tile 2347: -..###..### -..###..... -#..#..##.. -#......#.. -#.#..#.#.# -......##.. -.#..#..#.. -..#.....## -#.##..##.. -#..###.... - -Tile 2957: -...#.####. -#.....#... -#..#...... -#.....#.#. -..#.#..#.# -....#...## -###.#.##.# -.#...##..# -#........# -#.#.####.. - -Tile 2477: -.###.##.## -.#.....#.. -#......#.. -....##.#.. -##........ -..#....#.# -##...#.### -.#.#..#... -..#..#.#.# -.....#.#.# - -Tile 1669: -#.##..#.## -.#......#. -#####..#.# -..##...#.# -#.#..#.... -##........ -##.#...... -##..#....# -##.#..#..# -##...##.## - -Tile 2887: -######.#.. -#..#..##.# -#..#..#..# -#..###..#. -#........# -.....##..# -.#..##.#.. -.......... -##..#.#..# -##.#..#..# - -Tile 3517: -.#....#.## -#..#.##.#. -.......... -##...#..## -#......... -#...#.#..# -#...#..#.. -...#...... -.......... -#......#.# - -Tile 3257: -####.....# -.#...##... -#.#.#.#..# -#.##...... -##.#..#... -.##.##..#. -#......#.# -..##...... -#...#....# -#...##.### - -Tile 2029: -#.#.....## -.........# -.#..#..... -...#.....# -...#.###.# -....#.#..# -.......... -#..#..#... -#........# -.#####..## - -Tile 1777: -###....#.. -#..#...... -......##.. -.....#.#.. -##....#..# -#..#...#.. -..##....## -##..#..#.. -#......#.# -.#.....##. - -Tile 3881: -#..###..#. -##.#.##..# -#......... -#...#.#..# -#......... -.#..#.#.## -....#..... -#..###.#.. -#..##.#..# -###..#.#.# - -Tile 3919: -.##..##..# -.......... -......#... -.......... -...#.#..## -#........# -......###. -#....#.##. -..#.....## -.##.##.... - -Tile 1051: -####..###. -.....##... -#.#......# -..#.....#. -#....#...# -##.#..#### -......#### -#..#.....# -#......#.. -##.#####.. - -Tile 2539: -.#.#.#..## -.#.#.#..## -..##...#.# -...#...#.# -#...#..##. -#...##.##. -.#....#..# -....#...#. -#.##..###. -.##.###... - -Tile 2833: -#####.###. -.#...#...# -.........# -..#.#.#..# -####..#..# -#..#...... -#.##..#... -#.##....## -#.#..#.##. -##.#.##.#. - -Tile 1297: -.#.#.####. -.......... -##..#####. -#....##..# -.#.......# -.#.##..... -#.#.#.#..# -...#..#... -#...#.#..# -.#...##### - -Tile 1093: -.##..#...# -#.#.#..... -....#...#. -...#....## -....##..#. -#.......## -...#.#...# -#...#.#..# -....#..#.# -####.#.#.. - -Tile 2843: -.#.#..##.. -..#...###. -....#.#..# -###..#.##. -..#....#.. -#......... -#...#..#.# -#.#...#..# -##..####.. -...#####.. - -Tile 2243: -...##..#.# -.......#.. -#........# -....#....# -.........# -#..#...... -..#..#.#.# -.#.#.##... -#...##.#.. -....###.## - -Tile 1091: -..######.# -.##..#..#. -........## -##..#.#.#. -.....###.. -..#...#..# -..#.#.#... -...#.....# -#.#.##.#.# -#.....##.# - -Tile 2609: -#.#.#...## -#..#..#..# -...####... -..#.#..#.# -#...##.#.. -#.##.#..## -#..##....# -#.#...#.#. -.#...##... -.#.###...# - -Tile 3527: -.#....###. -#..#...#.# -........## -#.#..#..#. -.......#.# -........## -#.....#... -##..####.. -#..##...#. -.#.#.##..# - -Tile 1229: -.#####.##. -...#.#.... -#.#.##...# -.#...##..# -#....#...# -#.#..#...# -.#....#... -....#....# -#.#......# -#.#####.## - -Tile 2549: -.#####.... -#........# -.#.##..... -#.#...#..# -#.#......# -...#..#..# -...#...#.. -##...##..# -.#.#...... -####.#...# - -Tile 2131: -#.#..#.#.# -##..#..... -#.#..##..# -#...#....# -###....... -#..####### -....#..... -#...#....# -...#.#...# -#...#...#. - -Tile 1201: -#...#.#.## -.....#.... -##..#.#..# -...#..#..# -.....#...# -..##..#.## -#.#.#..#.# -.....#.#.# -###.#.#..# -..#.##...# - -Tile 1321: -.#..#...## -#.#...##.. -...#.....# -#....##..# -#......... -.#.......# -#.##....#. -.#..##.### -#...#...## -#.######## - -Tile 2999: -.......#.. -.....#.... -.##....... -#..#.....# -#...#..... -####.#..#. -.#...###.# -##.....#.# -#.####...# -.##....... - -Tile 1621: -####.....# -..#..#..#. -.#...###.. -##...##... -#..#...... -#..##.#... -...#..#..# -.##...##.# -......#..# -.#..#...#. - -Tile 1483: -.#####..#. -.#...#...# -#.#.#..#.. -....####.. -#..#..#### -...##..... -....#.#... -..#..##... -#..##.#... -.###...#.# - -Tile 1579: -.#..###### -##..#....# -..#......# -#...#..#.. -#........# -#.#.#.#..# -#..#.##.## -#....##.## -.#....##.. -##...##### - -Tile 2251: -.#.###..## -...##....# -........## -..#..##### -#..#..#..# -#......#.. -##.##....# -#........# -........## -#.###...#. - -Tile 1511: -#..##.##.# -..#.....## -##.......# -##...#...# -#.##.##.## -#......#.. -#..#...... -#.#...##.# -.#........ -..#..##.## - -Tile 3613: -##.###..## -....#..##. -##..#.#... -..###.##.# -.#.###.... -#.#.##.... -.#.#..##.. -#.......#. -......###. -.#..###.## - -Tile 1663: -#...#...## -......#.#. -###.#.#..# -#..#...... -#.....#.#. -.......... -#.....##.. -.......... -...#.#...# -#.##..#... - -Tile 1997: -##...#.... -.#.#.....# -##.#.#.... -.#.#..#... -...#.#.... -.##.##.##. -#...####.# -..#....... -#.#...#... -.#..#..... - -Tile 2371: -#.###.#... -##...###.# -#....##.## -#......#.# -##..##.... -#.#...##.# -##...##..# -.....#...# -.##....... -##.....#.# - -Tile 3709: -.#..##.#.# -###.#..#.. -##.#..##.. -##.....#.# -.......... -#......##. -....#...#. -.#...#.... -.#......## -.#....#### - -Tile 2143: -######.#.. -##..#...#. -#...#..... -.#.#...#.# -.....#.... -........## -#..#...... -.#.#.....# -...#....## -....#..##. - -Tile 2621: -##.##.##.. -....#..#.# -#..###.... -#....#.... -.........# -##....#... -###..#...# -.##....... -.#....#.## -..#..##### - -Tile 3221: -.....#.... -.....##.#. -.......#.. -#...#..... -#..#.#...# -#.#....#.# -#........# -.......##. -#.#......# -#..#.#..#. - -Tile 1447: -.##..####. -#........# -.#......#. -........## -...#..#### -.#....#... -###...#..# -.#..#.#..# -#.##.#...# -.##.#####. - -Tile 2551: -.#####..#. -......#... -..#....... -.##.##..## -..#..#.... -#..#.....# -......#.## -#.....#..# -#...#..##. -..##...#.. - -Tile 2851: -####.##..# -.......... -....##...# -##.......# -...##..#.# -.#......## -.......#.. -#..#.#.... -.#.....#.# -.#...#..## - -Tile 2129: -#.#.####.. -.#.....#.. -#......... -#..#...... -#.#...#... -#......#.. -.#....#..# -..#.#..#.# -#..#....## -#.##.###.# - -Tile 1753: -#..#...#.# -##.......# -#....##.#. -#.......## -#...#...## -#.##...... -...#..##.. -...#.....# -###......# -#......#.# - -Tile 1471: -####..##.# -#......##. -#..##.#... -.#...#..## -##.#.#.#.# -......#..# -#...#....# -#....#..#. -#..#..##.. -.##.#.###. - -Tile 1019: -#..####... -.....#.... -#......... -..#......# -#.#..#.... -.##.#.#... -....#....# -#...##...# -...#...... -#..#####.# - -Tile 3467: -......#### -#....##.## -...##..#.# -#.....##.. -#.##.#...# -..##...### -........#. -#......##. -.......##. -####.#.#.# - -Tile 1223: -.#.#..##.# -#......... -#.#...#..# -.....#...# -###..#.... -#..###...# -.....#..## -#..#..##.. -.#.###.... -##.##.##.# - -Tile 2293: -##..#..##. -......#... -#......#.. -..#....... -#..#...### -..#....##. -......#### -....###.#. -#..##.##.# -..#...#..# - -Tile 2647: -.#.#...... -..#..##..# -.....#.... -#......##. -#........# -#.#..#...# -#....##..# -##...#.... -....#....# -#.#...#### - -Tile 1931: -.#..##.#.# -##.#.....# -#...#....# -#....#.#.# -.#....##.# -...#..#..# -##..##...# -##........ -.#..#....# -...#..###. - -Tile 2819: -.##.###.#. -.........# -#...#....# -#...#.##.. -.....##.#. -.#..##...# -#....#..#. -#..#.##.## -#..##....# -.......### - -Tile 2749: -##..#...#. -#..##....# -###......# -##...#.##. -#.###..##. -.#.##....# -#.......#. -...#...#.. -#...#...#. -.#..##...# - -Tile 2309: -#......### -##....#..# -#..#...### -#.......## -##........ -..#####..# -..##..#..# -..#....... -#......#.. -.###..#.## - -Tile 2203: -..#..#..#. -.#....##.# -.........# -...#.#.... -#.....#... -.......#.. -#........# -#....#..## -.....#.#.# -.#.###.### - -Tile 1697: -...#.#..#. -#.......#. -.##....#.# -#....#.##. -....#..### -....#..#.# -....#..#.# -##..##..## -.......#.. -..#.#.#... - -Tile 3413: -#.#.#...## -......#..# -...###.... -...###.... -....#.#..# -.....##... -.........# -......#... -.....#.... -.##....#.. - -Tile 3169: -..#.#.##.. -.......... -#......... -##..#..##. -......#..# -#..#.#.... -#.#....... -.......##. -..#.##.#.. -.#..##.##. - -Tile 2153: -#.#.#.#.## -#.....#..# -........## -#....##... -#...#....# -#.#....... -#.####..#. -...#.###.# -..#.#..... -##.##.##.# - -Tile 1031: -.######.#. -....##...# -...##...#. -....##..## -.#...##... -.........# -.#...#..#. -......#..# -..##.....# -##....#### - -Tile 1097: -.#.#.#.### -#..###.#.# -....#..... -...#..#..# -.#....##.# -#..#.#.... -....#..##. -##.###.#.# -...#.#..#. -.#.#.##... - -Tile 1789: -###...##.. -#......... -...#.....# -#....#.... -##...#.... -...#...#.. -....#..#.# -.......... -..#.#..#.# -###.#..### - -Tile 3701: -#...#.#.## -#.#...#..# -#....#...# -.....#..## -#.....##.# -...#..##.# -#.....#... -#...#..... -#.......#. -#...#.##.# - -Tile 3617: -#...##.#.. -..##...#.. -...##..... -.#.....### -..#.#####. -###.#.#.#. -.#.#.#...# -#....##... -#.....###. -##.#...### - -Tile 3727: -####...##. -#..#....## -##.#.##..# -...##.##.. -....#..... -##....##.. -#....##.## -....##.... -##..##.... -.#....##.# - -Tile 3343: -...##.#... -..#.#..... -.....#..#. -#...##.#.. -#.#.#....# -...#...... -....##..## -...####### -.#..#....# -.#.###...# - -Tile 3313: -...####.## -#.#.#..... -#..##...## -.#.#.##..# -#...#....# -..#..#.... -.#..#..... -##.##...## -...#...... -.###....## - -Tile 1847: -..##.##.## -##...#.#.. -##...#.... -#.#......# -#....#.... -.......##. -##.#.#.#.# -...#..#..# -....#..#.. -#..##..##. - -Tile 3557: -..#..##### -......#..# -#.....#..# -..#....... -#.......## -###.#....# -.#.....#.# -##........ -#...#..... -.##...#.## - -Tile 1867: -...##.###. -#......##. -#.#.#...#. -#........# -#.....#... -#....#...# -.#..#.#... -...###.... -##.#..#.## -#..#.###.. - -Tile 2039: -##.#.##### -#.#....#.. -.#.#.....# -##.....#.. -###..#..## -....#..... -##..##.... -.........# -..#.#.#..# -###...#.## - -Tile 3301: -..#..##..# -....#...#. -#....###.. -.....#..#. -....##...# -#......#.. -....#....# -......#### -.......### -..#..###.# - -Tile 1213: -..#.#..#.. -#.#....### -..#......# -##.#...... -..#....### -...#.....# -.#.#.....# -#.#.....## -..##.#..#. -...#...#.# - -Tile 2437: -#.#####.## -.##...#.## -#..#.#...# -.....#.... -.##...#.#. -....##.#.. -#...#..... -##.#..#..# -#....#..## -.#.######. - -Tile 3511: -.#.###.##. -...#...#.. -#...#.##.# -.....#.... -.#........ -........#. -##.#...... -....#..... -....#...#. -.#.##..##. - -Tile 2719: -..#.#.###. -#.##...#.. -...#..##.. -#........# -.........# -.....####. -#.....#.#. -#.#....... -...#...##. -###.##..#. diff --git a/src/AdventOfCode/Year2020/Day20.hs b/src/AdventOfCode/Year2020/Day20.hs index 3278b4f..9f6792e 100644 --- a/src/AdventOfCode/Year2020/Day20.hs +++ b/src/AdventOfCode/Year2020/Day20.hs @@ -1,27 +1,21 @@ -module AdventOfCode.Year2020.Day20 - ( main, - getInput, - partOne, - ) -where - -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (inputFilePath) -import AdventOfCode.Util (frequencies) -import Control.Applicative ((<|>)) -import Control.Arrow ((&&&)) +{-# LANGUAGE NoImplicitPrelude #-} + +module AdventOfCode.Year2020.Day20 where + +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import AdventOfCode.Util (frequencies, maybeFail) import Control.Foldl qualified as Foldl import Control.Lens (ifoldl', view, (+~), (-~)) -import Control.Monad (ap, guard) -import Data.Bool (bool) -import Data.Foldable (toList) -import Data.Map (Map, (!), (!?)) +import Control.Monad (ap) +import Data.Foldable (maximum) +import Data.Map ((!), (!?)) import Data.Map qualified as Map -import Data.Maybe (listToMaybe) -import Data.Set (Set) import Data.Set qualified as Set import Linear.V2 (R1 (..), R2 (..), V2 (..), perp, _yx) -import Text.Trifecta (Parser, char, natural, newline, sepEndBy, some, symbol) +import Relude +import Text.Trifecta (Parser, char, natural, newline, sepEndBy, symbol) type Image = Map Coords LabeledTile @@ -32,23 +26,24 @@ type Tile = Set Coords type Coords = V2 Int main :: IO () -main = - do - input <- getInput - putStr "Part One: " - print (partOne input) +main = $(defaultMainPuzzle) getInput :: IO [LabeledTile] -getInput = parseInput (tile `sepEndBy` newline) $(inputFilePath) - -partOne :: [LabeledTile] -> Maybe Int -partOne pieces = - fmap (Foldl.fold (Foldl.premap fst Foldl.product) . corners) . listToMaybe $ - arrange edges Map.empty (Set.fromList pieces) allHoles +getInput = parseInputAoC 2020 20 (tile `sepEndBy` newline) + +partOne :: SimplePuzzle [LabeledTile] Int +partOne = + asks (Set.fromList &&& findEdges) >>= \(pieces, edges) -> + fmap (Foldl.fold (Foldl.premap fst Foldl.product) . corners) + . maybeFail "ope!" + . listToMaybe + $ arrange edges Map.empty pieces allHoles where - edges = findEdges pieces allHoles = [V2 x y | x <- [0 .. 11], y <- [0 .. 11]] +partTwo :: SimplePuzzle [LabeledTile] Int +partTwo = fail "not yet implemented" + arrange :: Set [Int] -> Image -> Set LabeledTile -> [Coords] -> [Image] arrange _ layout _ [] = [layout] arrange edges layout pieces (hole : holes) = @@ -60,13 +55,15 @@ arrange edges layout pieces (hole : holes) = $ maybe (normalizeEdge theTopEdge `Set.member` edges) ((theTopEdge ==) . bottomEdge . snd) - $ layout !? (_y -~ 1) hole + $ layout + !? (_y -~ 1) hole let theLeftEdge = leftEdge orientedTile guard $ maybe (normalizeEdge theLeftEdge `Set.member` edges) ((theLeftEdge ==) . rightEdge . snd) - $ layout !? (_x -~ 1) hole + $ layout + !? (_x -~ 1) hole arrange edges (Map.insert hole (n, orientedTile) layout) remainingPieces holes findEdges :: [LabeledTile] -> Set [Int] @@ -96,8 +93,9 @@ choices xs = normalizedEdges :: Tile -> [[Int]] normalizedEdges points = - map normalizeEdge $ - [topEdge, rightEdge, bottomEdge, leftEdge] <*> pure points + map normalizeEdge + $ [topEdge, rightEdge, bottomEdge, leftEdge] + <*> pure points normalizeEdge :: [Int] -> [Int] normalizeEdge = min `ap` (reverse . map (9 -)) @@ -116,8 +114,10 @@ tile = (,) <$> label <*> grid pixel :: Parser Bool pixel = - True <$ char '#' - <|> False <$ char '.' + True + <$ char '#' + <|> False + <$ char '.' label :: Parser Int label = symbol "Tile" *> nonnegInt <* symbol ":" From 75218549e5e3c8cafa642c5203cc31d8fa645825 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Fri, 28 Nov 2025 20:13:06 -0600 Subject: [PATCH 61/91] refactor(2020.19-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2020/day19.txt | 569 ----------------------------- src/AdventOfCode/Year2020/Day19.hs | 42 +-- 3 files changed, 18 insertions(+), 595 deletions(-) delete mode 100644 input/2020/day19.txt diff --git a/VERSION b/VERSION index fdaf935..49c5775 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.82 \ No newline at end of file +2024.7.2.83 \ No newline at end of file diff --git a/input/2020/day19.txt b/input/2020/day19.txt deleted file mode 100644 index 1f88232..0000000 --- a/input/2020/day19.txt +++ /dev/null @@ -1,569 +0,0 @@ -75: 105 116 | 40 131 -50: 40 116 | 84 131 -57: 5 116 | 15 131 -20: 128 131 | 84 116 -61: 63 116 -56: 84 131 | 128 116 -51: 116 131 | 131 116 -122: 38 116 | 78 131 -87: 120 116 | 114 131 -130: 131 | 116 -23: 40 130 -3: 131 102 | 116 76 -54: 105 116 | 104 131 -0: 8 11 -31: 116 83 | 131 48 -74: 40 116 | 133 131 -9: 94 131 | 16 116 -70: 128 116 | 104 131 -44: 77 131 | 28 116 -108: 116 105 | 131 94 -66: 16 116 | 105 131 -118: 116 131 | 116 116 -69: 105 116 | 94 131 -78: 116 117 | 131 7 -71: 51 116 | 104 131 -132: 130 116 | 116 131 -53: 116 51 | 131 40 -103: 116 97 | 131 70 -105: 116 116 -46: 105 131 | 105 116 -125: 116 33 | 131 113 -1: 116 68 | 131 68 -55: 104 116 | 94 131 -77: 116 16 | 131 84 -91: 25 116 | 58 131 -43: 116 32 | 131 60 -49: 116 106 | 131 55 -33: 62 131 | 69 116 -99: 116 65 | 131 18 -39: 131 94 | 116 68 -84: 130 116 | 131 131 -124: 20 131 | 13 116 -110: 116 37 | 131 117 -41: 94 131 | 133 116 -13: 131 94 | 116 63 -104: 131 116 | 130 131 -113: 116 129 | 131 108 -64: 116 71 | 131 55 -58: 116 68 -2: 131 40 | 116 128 -32: 53 116 | 9 131 -11: 42 31 -73: 131 29 | 116 2 -133: 131 116 -21: 91 116 | 6 131 -134: 116 88 | 131 56 -119: 52 131 | 81 116 -45: 28 131 | 85 116 -115: 86 116 | 99 131 -85: 116 63 | 131 51 -109: 112 116 | 61 131 -10: 131 121 | 116 30 -67: 116 68 | 131 84 -28: 131 40 -129: 116 51 | 131 63 -97: 131 132 | 116 51 -72: 45 131 | 103 116 -63: 131 131 -36: 82 116 | 10 131 -114: 131 84 | 116 51 -79: 110 131 | 89 116 -95: 116 133 | 131 105 -25: 63 116 | 16 131 -24: 131 125 | 116 12 -82: 116 107 | 131 109 -40: 131 116 | 116 116 -121: 112 116 | 100 131 -117: 68 116 | 133 131 -8: 42 -94: 116 131 | 131 131 -60: 102 116 | 62 131 -123: 116 80 | 131 72 -19: 127 116 | 21 131 -80: 131 111 | 116 87 -35: 131 98 | 116 59 -102: 116 84 -48: 36 131 | 24 116 -38: 23 131 | 41 116 -100: 131 133 | 116 34 -17: 116 118 | 131 133 -18: 3 116 | 44 131 -26: 79 116 | 4 131 -37: 116 84 | 131 68 -16: 130 130 -81: 131 128 | 116 133 -52: 16 131 -5: 131 14 | 116 50 -42: 115 131 | 22 116 -34: 131 116 | 131 131 -47: 122 116 | 57 131 -93: 131 95 | 116 46 -7: 130 40 -126: 16 130 -12: 73 116 | 49 131 -131: "b" -98: 131 104 | 116 128 -30: 39 116 | 7 131 -15: 50 131 | 108 116 -107: 54 116 | 1 131 -68: 116 131 -96: 131 75 | 116 17 -111: 27 116 | 75 131 -89: 116 126 | 131 66 -59: 104 130 -106: 51 131 | 105 116 -92: 67 131 -127: 131 119 | 116 134 -112: 34 116 | 84 131 -62: 132 116 | 16 131 -116: "a" -88: 40 116 | 128 131 -22: 116 19 | 131 123 -90: 116 92 | 131 124 -14: 16 131 | 105 116 -4: 35 116 | 96 131 -27: 40 116 | 51 131 -65: 64 131 | 93 116 -76: 116 84 | 131 40 -6: 116 101 | 131 74 -101: 131 16 | 116 133 -29: 131 34 | 116 51 -86: 131 43 | 116 90 -128: 130 131 | 116 116 -120: 116 133 | 131 94 -83: 26 131 | 47 116 - -abbbaaabbbbbbabaaaabbababbaabaabbbbaababbbbbaababbbaabbabbbabbababaaabaaaabaabbbaaababab -babaaaaaaaaababbbabbbabb -aaaababbbaababaaabbbabba -bbbaabbabbbabaaaaabbbaab -abbbbbbbbabbbbbbbabababa -abbaababbbaabaaabbaaaaba -aaabbababaabbbabbbbaababbbabbaaababababa -aabaababbaabaaabbbaaaabbabaaabbbabbbaabb -bbbbabaabaaabaaaababbaaa -abbaaaaabbbbabbabbabbbba -bbabbabbaaaababbbbbbbbbb -babaaaaaabbabaabbabbabbb -aabbbbbbbbabababbbaabaab -abbaaabaaababbbabbabbbbb -bbbaababbbbabbbbbaabbbaabaaabbabbbbbaaababbbabaa -baabbbbaaaabbababaaabbba -bbabbabaaabaabaaaabaabbabaabbbababbbaaab -aaabaabaabaaabaaaabaaabaabaabaabbababbbbaaaabbaaaabbbbaa -abaabbabbaabbabbabaaabaa -bbbbaabaabbbabababbbabaa -abbbaababaaaabaabbabbbaaaaaababbaaaabbababbbaaabbbababba -ababbbaaaababbbaaabbaaabaababbaabbaaabbaabaaababaaaabbbbbbabbababaabaaaa -aaababbaaabbabbabbaaaaaa -babaaaabaabbbabbbaabaaaaaaabbbbabbbbabab -aaaaaabbaaababbaaabaaaba -babbababbbaabaaaaabbaaaa -aaababbaabbbbaabbabbaaba -aaaabbabaabbbbbbbaabbbbabbbaaaab -bbaaababbaaaababbbaababb -bbbbbbabaaaabbaaabaaabbbbaaabbab -babbabaabbabaaabbaaaabababaabaabaaabaaab -baabaababbbbbbbbaaaaabaabaabaaaa -bbaaaabbabbbabbbbabbaabbaabbbbababababab -abbabaaabbabbababbabbaaaaaabaabb -bbbabaaaabbabaababaaaaba -babbabbaaaaaaabbbbbbbabb -baabbbbbaaababaaaaaaabaa -bbabaabaababbbaababaabaabbbaaaabaabababbbbbaababaababbabbaaabaaa -aaaaabaaaabbbbbbababbaaa -bbabbbbabbaaabbabbabbabaaaaabaabaabaaabaaaababababbabababaabababaaaabbab -aaaaaabbbababbbbbaaaaaaa -bbaabaaabbbabaaabaaabbab -bbaabbabbaaaabbabaabbbbbababaabbbabaaaabbbbaabaa -bbabaabbbabbaaabaabbabbb -aaaabaaaabaaaabaabbbbaba -baaaabbabaabaaabbabbbabb -babbaaaabbbaabababbbbbaabbabbbaa -bbaaabaabaabbbaababbaaba -aaaababbbaabbbaabaaabbaa -abbaabbababbaaababbaaaab -aabaabbbaaaaaaaabababbbbabaabbba -abbabbaabbaaabaaaabababb -aaabbababbbabababbaababb -babaabaabaaabaabaaababaabaabbbabaababaabbbbaabaaabababaabbabbbab -abbaababaaabaababbbbabaababbbbaa -aabbbbabbabaabbaaaabaaaaaababaaabbababba -ababaababaabbbaabaaabaaabaaaaaab -babbabaaababbbababaababb -aaaaabbbabaaaabaabaabaaabaabaaaabbbaaaba -baaaabbabbaabbbbabbaabbbaabbbaaabaabaaabbbbaabbb -abbaabbbbbaaababbabbaaba -abbabaaabbabbaaabbabbbaa -abbaabbbbabbbbbbababbbaaabbbaaaa -abaaababbaaaababaabbaabb -baabaaabbabbabbabaaaaabbabaabbbbbbaaaaba -bbabaaabaaabbbaabbbabbaaabbbbbaa -aaaababbabbbababbaaaaaababaaaababaabbababbababbaabbabbbaaabaaaba -baabaabbbabbaaabbbaabbaa -baabbbbbaabaabaabbbbaaaa -bbaaaabbbbbbbaaababbababaaaaabab -abbbbbbbaababbbaaaaabbba -baaabaaababbabbabbbaabbaaabbaababbbbabbabbabbabaaabbbabb -bbaabbabaabaabbaaaaabaab -aabbbbbbabbaaabbbaaabbab -abbbababbabbaaaaaaaaaaaabbbbaabb -abbaababbaabbbbaabbababaabababbaabababab -bbabbbabbbaaaaababaaabbb -baaaaabbbbabababbbaabbba -baabbabbaabbababbaababba -ababbaabaababbbbbbaabbba -bbabbababbbaababaaaaabab -abbaaaaabbbbbabbabbbaabbabaabbba -bbbbabbabaaababaaaaabbababbbabba -abbabababbbbaababababbaaabbaaaaababaaabbbbbaaaaababbbaabbaababbb -babaaaaabaaabbbbbbabbbabaaaababa -abababbbbababbaaababaaba -ababbbabbaaabaabaaabababaabababaaaabbaaaabaabaaa -bbabaaaaaababaaabbbaabaa -aaaaaaaabbaabbabbabbbaba -aaaaabababaaaaabbabbbabb -abbaaaaaabbaaababaaabbab -baaabaaabaaababaabaabbbb -abbaaaaaabbaabbabaabaaaa -ababaababbbbbbbbbababbbbbababaab -babaababaaaaaabbabbbaaaa -ababbbababaabbabbaabbaaa -abaabbaabbbaababbbbabbbbabbbaabb -baaaaabbbbbbabaabaaaaaba -baabaabbabababbbbbbaabaa -aabaabbbaababaaabaabbabbaaaaabab -bbaaababbbaabaaababbbbaa -babaaabbbbbbbbabbabababaaaaaabbabaaaaabbbababbabbbababaabbaaabbbbabaaabaabaaabaa -aaaaabaababbababbbbaaaab -baaaababaabaabbaaaabbaab -aaabbbaaabbbbbbbaaaaabbb -abaabbabaaabbbbbbabaaaaabababbbbbbaabbaa -aaabaaaabbbbbbabbabaaabbbaaaaaaa -baababaaaabbaababbbbbbbbaaabbabaaaababbbbbaaababbaababbaabaabaababababbaabbbbaba -bababbaababaababbabbbbaa -baaababaaabaababbbabababaaabaaaaaaabbaaa -bbaaabaabbbbaababbbbbaaaaababbaa -abaabaaaabaabbababaaaaaaaaaaabaabbbaabbabbbabbbbaaaabbabbbabbaaaabbaabaaabbbbbba -bbabbaaaaaaabbabaabbbaab -bbabbaaabbabbbabaabaabbabaaaabbaabbbabbb -babbaaabaaaabbaaaabaaabb -aaaabbabbaababaabaabbaaa -babaaaaaaaaaaaaaababbaba -baabaaabbababbbbbaaaaaaa -baababbaabbbbbaabbabaabaabababaaabababbbbabababbbbbbbbbaaaababbb -bbabbaababbaabbbaabbbabb -baaaababbbbabbbbbaaaaabbaaaaabaabbbbbbaaabbababaaaaaaababbaaaaaa -bbaaabbbbbbbbaaaabaabbab -aaaaaabbbbabaaabbbabbaaaaaaaabab -abbabbaabbbaababbbaabbaa -abababbbaaaaaaaabaaaaaaa -aabaaaaabaaababaababbaabbbaabbabaabbbabb -abbbaaaaaaaabbbabaabbbbbbaaabaabaaaaaabbaaabbaabbbababbaabbbbabb -abaabbabaabbabaababbbbabbaababababbaabbbabababbbbaaabbaa -aabbbbbaabbabaaaaaababab -abbaaabbabbaabbbabaabbba -baaabaabaabbbaaabbbabaaabaaabaabbbbbbbabbababaaa -abababbbaaabbbaababaaabbbabababb -abbbbbabbbabbabbbbaaaaaa -bbaabbabaabaabbabaabbbbbbaaaaaabaababaab -aabbbbaabbaaababbaaaabbb -baabaaabbaaabaabbabbaaba -aabbbaaaabbaaabbabaaaaab -aaabaaaaababbbaabaaaaaab -abbaabbaabbabbbaaababbab -aaaaabaabaabbbabbaabbaaa -bbababaabaaabaaabbbbabbb -aabbbaaabbaaaaabbaaababa -bbabaaabbaabbaaabbabababbaabbbabbbbbabbabaaabbaa -abbaababbabbaabbaabbabbb -ababbbbbaaaaabaabbaabbaa -aabababbbbbababbbbababba -babaaaababbbababaababbbbbbbbaabaaaaaabaabababaab -aaabbabaababbbabbbaabaab -abbaabbaababaabbaabbbbbaabbaabababbbabbbbaaaaabbabbbaaabaaabbaab -bbbbabbaabbabbaaabbbabba -bbbbbbbbbbbabbbbbababbab -aaabbaabbbaababbbaabbaabaabbbaabbaabbbabbabaaaabaaababbaabbbbbba -bbabbaabbabbbbabbbbabbbbbbaaaaabbbaaabba -bbbababaababbaabbaaaaaab -aabbababbbaaabbbaababbaa -abababaaababaabaaaaabaaabaabbbbbbabbabab -ababaababbabbaababbbaabb -aaabbbaaaabbbaaaabaabaab -aabbababaaaabbaabbbbabbaaaabbabbabbbabbabaaabababaababbaabaababaabbabaababaabbbb -babaaaaabbabaaabaabaaabb -bbabbaababbabaaabbabaabbbbaaabbbaaaaaaab -bbbaabbbbababbaabbbaabbaabbaabbb -bbabababaaabaaaaaabbbbbaabaaabababbabbaaaaaababaabaabaab -bababbaaabbbababababbabb -baabaaabbaabaabbaabababb -abbbaababaabaabaabbbaaab -aaaaaaaaaaaaaabbababbbba -baabbababbbaaaaabbbbaabababbbbaa -ababbbbbababbaabbbaaabba -bababbbbaabbbbbbbbbaaabb -baaaaaaaaaaabbbaabababaaabbaaaababbbbbbbabaabbbaaaababaabbbabaabbbabbbbbabbbababbbaabaaa -bbaabbabbaabbbaabbbbaabb -abbbbaababababbbbabababb -bbbabaaabbaaaabbababbbbbababbbba -baaaababbbbabaaaabaaaabb -abbaaabbaabbaababbbbbbba -baaaaabbbaabaabababbababababababaaababaababbbbbaabababba -aabbbbaaabbbbbbbabbabaaabbbaaabb -abaabbaaaaaabbaabaabbbbbbbbaabbaaaabbababbbaabaabbbbaabbbaaaabaa -ababbbabbbbbabbabbbbbabb -bbabbbabaabbbbbaaabbbbabbbabbbbb -baabbbbbabbabaaaaaaabaab -baaaabbabbaaaaabbaabaabaabaaabbb -baaaaabbabbbababbababbab -abbaabbaaababbbabbbabaab -aaabaaaaababaababbbabbbbbbbbaababbaaabbbbabbbaaabaababba -babbaabbbbabaaababaaaabb -bbbaabbaabbbbbabbbaababa -bbaabbabbbbbabbabababaaa -aabbabbabaaabaaaabbbbbba -aabaabbaabbaabbbabaabbbb -bbabbaaaabbbababbbbabbabaaabaaaaaababababaababba -ababbbbbaababbbbbaaaabbaaaabaaab -abbbbbbbbbabaaabbbbabaaaaaabbbbbabaaaabaabbabbab -bbaabaaaabbbaabaaaaabbaaababbbaaabaaabbabbbbaaab -aababbbbaababbbbaaababbbbaaabaabaabbbbabbbabaaabbbbabaabbbbaabaabaababbaaaabbbabbbbbbbba -aaaabaaaaaabbabbbabbbaabbbaabaab -abbbaaabbbaaaaaaabaababa -babbbababaabbbbababbbbbabbabbaabbaabbbabaaabbaaaaababbaaabbbbbaaabababbaabbababa -bbaaabababbaaababbbbbabb -aabaabbbbbabbabababaabaa -bbbaabbbbbaaaabaaaaaaaba -bbabbabbaababaaabaaabbaa -bbaaaaabbabbbbbbabbbbbbbababaaaa -bbbbbbabbabbabbabababbab -ababbbabbaababaababbbbba -babaaaabbabbaabbababbabb -abaaabbaababaaaaabaaabbb -aaaababbbaabaabbbbabbabbbaaabbab -baaabbbbbbbaaaaaaaababbaaaaabbbb -baaabaabbbabbabbbababaab -aabbabaaaababbbbaabbbaab -bbbbbbbbbbbabbabbbaaaaba -aabbbbbbaabbbbbabbaababb -bbbabaaaabaabbabaabbaaab -bbbabbbbbbbaabbbabaabaaa -baabbbabbbbbbbaababbaaba -abbaaaaabbbaabbbabbbbbbbabaabbbb -bbaabbbbbaaabbbbbbababaababababaabaabbbb -abababbbbbabbbbabbbaabbbaabbbbbbbbabaaababababbaabbbbbababaaabba -abbbbbabaabbabaaabaaaaab -bbababaababbaaababbbbbaababbabbaabbbbaabaabaababababbaaa -abbbbbaaabababbbbabaaaabbbaabbbababababa -babbabbaaabbabaaaaaaaaba -aabaaaaaabbabbaaaaabbbba -bbbbbbaaabbaababbababaab -aaababbbbbaaabaabababaabaabbbabbaaaabbba -babbbabbaaabbaabbaaabbbaabbaaaabbbbaaaab -babbbbbbbaaaabaaaabbabbbaaaabbbaaabbaaaaaaabbbbbaabbababbaaaaaaaaaabbbbbababbbaabbaaaaaa -baaaaabbbabbbbbbaababbbbbaaabbbabaabbaab -aabbbbbbabbbbbabaabababa -baabaabbbbbaaaaababbbaba -aaabaabaaabaababbaabaabababbbaaa -abbabbbabbbbbbaaaababaab -abbaaabbbabbabbababbbbabbababaaaaababbaa -abaaabbabbbabbbbabbaabbbbbbabbabbaabbbbbaaaaaaab -bbbbbbbbabbbbaaabbaaaaaa -aababbbaaababbbbbbabbbbb -baaababaaabaabaabbabbbaa -bbabbaaababaabbaaaabbbba -babbabbababbaaaabbbabaaabbbaababababbbababbaaaab -baabbbababbbbaabbaabbaab -aaababbabbababaababaabbb -aaaaaaababbbaaaababaabbbabbaaaabaabababbabbaaabbaabaaabb -baaababaaabbabababaabbbb -bbbbbbaabaabbabbababbbabbbababba -aabaaaaababbabaabbabaaba -babaaabaabbaaabbabaabbabbabbbaaa -abbabbbbbbbbbaabbbababaaababaabaabbbaaabbaaabababbaaaaaaabbbabaaaaababab -abaaababbbaaababbaabaaabaabaabbbbbaabbab -bbbabaaabbabaaaaaaabaaab -baabaaaaaabbbababababbbabababbab -bbbbbaaaaaaabbbbbaababaababababaabaabaaabbaaaabbbabababbaaabbaaaaaaaaaba -abababbbbabbabaaaabbbabb -bbbbbabaaababbaaaaaabbbaaaaabaabbaaababbbabababbbabaaaaabaaaaabababaaaaaababababbbaaabba -ababababaabbbaabbabbaaabbaabaabaababaaabbabbbbbabbabaabbbbbaaaaaaaaabbbbbbbaaabb -baababaaaabaababbbbaabaaaabbbabbabbbbbbaabbaaaab -bbaaabbbbbabbababbbbbbba -abbaaabbbbbaabbababbaaabbbbbbbbaababbaba -abbbabababbbababbabbaabbbaabbababaaaabaaaaaaaabaabaaaaaa -bbbaabbabbbbbbabbbaababb -babbababbbababaabaabbbabbabaabaaaababbaa -baaabaaaababaabababaabbb -bbabaaabbabaabaabbbbbaababababaabbabaabaaaaabaaa -baabbbabaaaabbaababbaabbabbbabaaabaabaaa -babaaaaababaaaaabbabaabbabaabbba -abaaababbaabaaabbbabababaabbabbbabaabbba -bbbbabbaabbbbbaaababaabb -baaaaabaaabbbabaaaaaabbabaaabababaaabaababbabbabbbabbaabbbbbaabbababbaba -abaabbababbabaaaabaaabbb -aabaabbabbabbaaaaabaabbbbbbaaaaa -baabbabbaabbbbbaaaaaabaabaabbbbaaabbaababaaaaabbabbbabbabbbabbaa -aabaabbbaababbbaababbbabaabaaaba -aaaaabaaaabbbbbbaaabaaab -aabbbbbaaaaaabaaabbbbbba -abbaaaaababbaabbaababbab -abaaababaaabaaaabababbaababbaaaa -baabbbbbaaaabbabbbaabbba -bbbaabbaaaaabaabbbbbaaaaabbbababbabaaaabababbaaaaaaaabab -abbbaabaababbaabbaaaabbaabbaaabbaaaabaab -abbbbaabaababaaaabaaabaa -baabaabbabbbbbbbbbaabaab -ababaabbbbabaaaaaaababbaaaabbbabbababbba -bbbaabababbaabababaaabbaaaaabbaaaaaababbbbbbaabbbbbabaab -aababbbabbbbabaabbaaabba -aabbababaabaabbaaaaabbbb -bbaababbabaaaabaabababbaabbaaabaaaaaababaaabaaabbabababbabaababb -baabbbaaaaabbbbbaaabaaab -aaabbabaaabaaaaababbabbabababaabaababbaa -abbbbbbbbbbbaabaaaabaabb -babbaaabbbababbbaaabbbbabbababbbbbbaaaababababbaabbaababbaaaabbabbbaabaa -abbbaaababaaabaababbbabbbabaaaaaabbaabbbaaaabbabbaabbbbbaabaabbbbbbbaabbaabaaababbaabbbb -baaabaaaaabbbbaabbbaabbaaaabbabb -aaabbbbbbbbbabaabaaabbba -abbaaabaaababbbaabbbabaa -ababaabbbabbabbabaaaaaab -ababbaaabbbbbbbbaabaabbabaaaabbbaabaabbabaaaaabbaaabbbbbabbaabaababaabba -aababbbabbaabbababaaaabb -abbabaaaaaaaabaabbbbaaaa -babaaaabbaaaabbaaabbbaba -ababbbbbbbaabaaaabababbbaaabaaab -babaaaabbaabbbabbbabbbbb -babaabbaaabbbbaabbaaabbbbabaaaaabbaaaaaa -abaabbbbaaabaaabbbbaaabaabaabaab -babbbbbbabbabaaabababaab -bbabbabbaaaababbbaaabbaa -abbabbbababaabbababbabbabbabbbaa -bbbabbbbabaaabbabbbaaaba -baaaababaaaaabbabbaabbbb -bbbbbbbbbabbbbbbabbababb -bbabbbabaabbababaabbaababaabbabaabaabbaaababaaabababaaabaabbbaba -aababaaabbabaaabaabbbbbbbbaaaaaa -ababbbaaabbbababaabbaabb -abbaabbaabaabbaaababbaaa -aabbbabaabbaabbaabbbbabbbabbbabbabbaabbbbbbaabaa -bbaabbabababaaaaabbbbaba -bbabbababbaaaaabbbbaaaab -aabbbbaabbaabbabbbaaaaaa -baaabaabbbbababaabaaaaaa -bababbaaaaabaaaababaabababbabaabbabbababbabbbabbbbbaaaabbababbba -bbaaaabbaabbabbaabababab -baababaabaaabaaaabbababb -baabbbabaababaaaabbbbbabbbbabbabaaaaaaaaabbbbbba -abbbbaaaaabaaaaaabababba -abbaabaaaaabbabababbaabaaaabaaabbaaaaabbabaabbaabaaaabbbabbbabbbaaabaabb -baaaababbbbbabaabbaaabba -aabababbaaabbababaaaaaabaaabbaaa -babaaaabbbbaabbbbbbbabaababaaaaabbbaabbbaaabbbbbaabbaaaa -bbbababaaaaaabaabaaaaaba -babaaaaabaabbbababbabaababababaabbaaabba -ababbaabbaabbbbbaabbaaba -ababaababbbaabbbabbbaaaa -bbabbababaabaabaaaabaabb -abbbababbababbaaaabababa -bbaaaabbbaaaabbabaabbbbabbaaaabbabbbbbbbabaabbbabbbabaabbabbaaba -babbabaabaaaabaabbbaaabbaabaaabbbaaaaabbbababaaabbaababbbabbbaab -baabbabbbaabbbbbbbbaabaa -babbababbaaaaabbbabbbaab -aabaabaaabbbbaaaaabaaaaabbaabababababaaa -abbbbbabbaabbbbbbbbaaabb -bababbbbbbaaababaaababaabaabbaaa -abbabaaaabbaabbbbaabababbbbbbbabbbabbbbabbbaaaba -bababbaaabbaababbbaaaaba -aaabababbbbaaabbbaabbabaaababbbaabbbaababaaababbababababbabbabaa -aabaabbbbabbbbabbabbbaba -abbbbbabaabbabbaaaaaabba -bbbabbababababaabbaaabbabbbaaabbbabbbaba -baaabaaabaabbbbaaaabbbab -abbaaaaaaaabbbaabaaaaabbabbbbbaaabababababaabbbb -aaabbabbababbbbaaabbabaaabababbababbbaaaaabbbbbababbaaabbbaabaab -babbbbabbaabaaabbbaaaaababbbbaabaabbaaab -bbabbabbabaabbbaaaaaabbaabaabaabbabbaabaaabbabbb -aaababbaabbaaabaababbbaabaabbabbaabbaabb -abbbabaaaabbaaabbabbbbababaabbaaaabaaabbaabbbaabbbabbabb -aaabbababaabbabaaabbbaaaabbabaaabbaaababbaaabbabaaabbbab -ababbbabbbbabbabbaabbbababbabaaaabaabbbbaababaab -abbabaababbbbaabaaaabbaaaababbbababababbbaaaabbb -aaabbbaabaaabaaabaabbabaabaaaababbbbaabb -abbabbaabaaabaaaabaaaaab -aababbabaaabbabbabaabaaababbbbbabaabbbababbbbbabaabbbbbbaaabbaaa -bbbbbbaaabababbabbbbbabb -baabababbabbbbabbbabaaaabbabaaaabbbbaabbbaabbbbabaabbbbbbaaababbabbbbaababaaabba -babbabaaaabaabbaaabaaaab -baaabaaaaabbaababbaababb -aaaaaabbbbbbbbbbaababbab -abbaaabaabaabbabbbaabbbbbbbababaababbaaa -aaabaaaaabbbbaababbaabaa -babbaaabbabbababbaaabbab -aabaabbabbabbabbabbaaababbbbbaaabaabbbababaaaaaabbaababb -bbabbbabaabbbbabaabbabbabababbab -ababaaaaaabaababbaababba -baaaababaaaaaabbaaaaaabbababbabb -aabaaaaabbbaaaaababbbaab -aabbaababbabbabbbbabaaba -aaabaaaabbbbabbaaabbaabb -abbaabbaaaaabbabaaaabbabbabaabaababbbbba -baaaabbaaabbbaaabbbabbaaabaabaab -abbabaabababbbbbbbaababb -baaabaaabbbaabbababaabaa -babbaabaabaaabbbbbbabbaaaaaaaaabababbaaaaaaaabaabbbaaabbabaabaabbbaaaaba -abbbbbaabababbaaaabaabbaabbaabbabbbaabbabbabbbbb -bbbbabaaaabbbaaaaabbaaaa -aaabaaaaabababbbbaaabbba -aabbbbabbaaaababbaaaaaba -babaaaabbaaaaabbabbababa -aaaabaabbaabbbbabbbbabaababbaaabaababaabbaabbbbaaaaaaaaa -abbbbbabaabbabaaaaababaa -ababaaababaaaabaaabbbaabbaaababb -aaabaaaabaabbabaaababaaabbbbabaaaabbbaab -babaaabaaaababbabbabaaabbbaabbabbbabaabaaaaaaaba -bbaabbbbbbabbbbbabbbabbabbaaaabbbaaabaaababbbbaaababaaabbaaaabbaaaabaabb -aabbaabaaaabaabaaabaaaba -babaaabbbbaaaaabaaaabaaa -baabaabbbaaaababbabaaaaaaaabaabb -abbababaabbaaaababbbaaabbbaabbbabbbbaaababbabbabbbabaaaabbabababaaabbbabaaaaabab -bbbabbbbbabaaabbabbbbbbbaabbababbbaaabba -bbbababababaababaaaabaaa -bbbbabaabbbbaababbababbb -ababaabbbbaaaabbbbababbb -abaaababaaaaaaababbbbbbbbbbbaaaaabbbaaabaababaabaaabbbab -babaaabbaabbaabaaabbbaab -baabaabaaababbbbbabbbbbbabbabbab -baabbbabbbaabbbbbabbbbaa -ababbaabbabaabababbbbbaabbaaababaaaaaaaabbabbbbbaaabaaaabbbabbbaaabbbaab -baababaaabbbbbaabbbaabbaababaaaabbaaaabbbbbbaaabaabaaaba -bbabbaabbbaabbabbbbbbbba -baabaabaabababbbaabaababbbbbbbbbaaaaababbbaaaaba -babbaabbbabbbbbbbabbabbb -abbbbbabbbabaabbbaaabbab -aabbabaaaaababbaaaabaabb -baaaabbaaababbbabaaababbbaabaabaaaabbabbbabbabab -babaabbabaababaaaabbbaba -abbbaabbbabbaaaaaabbabbbabbababaaaaaabaaaababaabababbbbbabbaaaaaaabbbaabbaaababbbaababaa -baabbbaabaaaaabbabbababa -aaaababbbbbbbaaaaabbbabb -bbbababaaaababbbbbbaaaab -aabbabbaabbbaabbbbbaaabbbababbbbbbbbabbaababbabbbbabbbbbabbababa -bbaaaaabaababbbabaaaaaaa -abaabbabbbaaaabbaaaaabab -ababbaabbaabbbabaaaabbbb -baaaaabbaaaabbaaabbbbbaaaababaaabbabaaabbabaabbbbbbabbbabbaabaabbaababbaaabaaaba -ababbaabbbabaaabbbbabbaaabaaabababbaababbaabaaaa -bbaaaabbbaabbabbaaabbaaa -babaaabaaabaabbbbaaaaaba -bbbbbbbbaabaabbbbaabaaabaabaaaab -bbbbaabaaabbabbaabaaabaa -aaaaaababbbbaaabbbbbabbaababababbbbabababaabaabbababbaaaaaaaaaab -bbabbabaaaaaaabbbabbbbabbabababaaabaaaab -bbabaabbaabaabbaabbbbabb -aaabbbbbabbaaaaabbbaabbabaaaababbbbbabaabbbaabaa -bababbaabbbbbbbbabbbaababbabaaba -aabaabbbbbbabaaaabbaabbaabbaaaaaaabbababbabababaabbbbabaaabaaaabbbaababb -bbabbaabbbaaabababbbbaba diff --git a/src/AdventOfCode/Year2020/Day19.hs b/src/AdventOfCode/Year2020/Day19.hs index 8c28f92..48c9653 100644 --- a/src/AdventOfCode/Year2020/Day19.hs +++ b/src/AdventOfCode/Year2020/Day19.hs @@ -1,4 +1,5 @@ -{-# LANGUAGE DeriveFunctor #-} +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2020.Day19 ( main, @@ -8,25 +9,22 @@ module AdventOfCode.Year2020.Day19 ) where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (inputFilePath) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (count) -import Control.Applicative ((<|>)) -import Control.Arrow (first) -import Control.Monad (guard, (>=>)) import Data.Functor.Foldable (hylo) -import Data.IntMap (IntMap, (!)) +import Data.IntMap ((!)) import Data.IntMap qualified as IntMap +import Relude import Text.Trifecta ( Parser, lower, - many, natural, newline, notFollowedBy, sepBy, sepEndBy, - some, surroundedBy, symbol, try, @@ -38,36 +36,30 @@ data Rule a deriving (Eq, Show, Functor) main :: IO () -main = - do - input <- getInput - putStr "Part One: " - print $ partOne input - putStr "Part Two: " - print $ partTwo input +main = $(defaultMainPuzzle) getInput :: IO (IntMap (Rule Int), [String]) -getInput = parseInput puzzleInput $(inputFilePath) +getInput = parseInputAoC 2020 19 puzzleInput where puzzleInput = (,) <$> rules <*> messages rules = foldr (uncurry IntMap.insert) IntMap.empty <$> some (simpleRule <|> compoundRule) messages = some lower `sepEndBy` newline -partOne :: (IntMap (Rule Int), [String]) -> Int -partOne = uncurry solve +partOne :: SimplePuzzle (IntMap (Rule Int), [String]) Int +partOne = asks solve -partTwo :: (IntMap (Rule Int), [String]) -> Int -partTwo = uncurry solve . first patchRules +partTwo :: SimplePuzzle (IntMap (Rule Int), [String]) Int +partTwo = asks (solve . first patchRules) where patchRules = - mappend $ - IntMap.fromList + mappend + $ IntMap.fromList [ (8, CompoundRule [[42], [42, 8]]), (11, CompoundRule [[42, 31], [42, 11, 31]]) ] -solve :: IntMap (Rule Int) -> [String] -> Int -solve rulesMap = count (any null . match rulesMap) +solve :: (IntMap (Rule Int), [String]) -> Int +solve = uncurry $ \rulesMap -> count (any null . match rulesMap) match :: IntMap (Rule Int) -> String -> [String] match rulesMap = hylo matchRuleAlg (rulesMap !) 0 From 0a224182adda70e1979a6e4b39a64dc377b16b09 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sat, 29 Nov 2025 02:26:35 -0600 Subject: [PATCH 62/91] refactor(2020.18-haskell): adopt advent-of-code-api --- VERSION | 2 +- src/AdventOfCode/Year2020/Day18.hs | 52 ++++++++++++++++-------------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/VERSION b/VERSION index 49c5775..a97c5d5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.83 \ No newline at end of file +2024.7.2.84 \ No newline at end of file diff --git a/src/AdventOfCode/Year2020/Day18.hs b/src/AdventOfCode/Year2020/Day18.hs index b59515b..091cf58 100644 --- a/src/AdventOfCode/Year2020/Day18.hs +++ b/src/AdventOfCode/Year2020/Day18.hs @@ -1,3 +1,5 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2020.Day18 ( main, partOne, @@ -5,35 +7,35 @@ module AdventOfCode.Year2020.Day18 ) where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (inputFilePath) -import Control.Applicative ((<|>)) -import Control.Monad.Combinators.Expr -import Text.Trifecta (Parser, natural, parens, some, symbol) +import AdventOfCode.Input (parseString, rawInputAoC) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import Control.Monad.Combinators.Expr (Operator (InfixL), makeExprParser) +import Relude +import Text.Trifecta (Parser, natural, parens, symbol) main :: IO () -main = - do - putStr "Part One: " - print =<< partOne - putStr "Part Two: " - print =<< partTwo - -partOne :: IO Int -partOne = sum <$> parseInput (some expr) $(inputFilePath) - where - expr = makeExprParser (parens expr <|> posInt) [[addition, multiplication]] +main = $(defaultMainPuzzle) + +partOne :: SimplePuzzle String Integer +partOne = solve [[multiplication, addition]] + +partTwo :: SimplePuzzle String Integer +partTwo = solve [[addition], [multiplication]] + +getInput :: IO String +getInput = rawInputAoC 2020 18 -partTwo :: IO Int -partTwo = sum <$> parseInput (some expr) $(inputFilePath) +solve :: [[Operator Parser Integer]] -> SimplePuzzle String Integer +solve table = ask >>= parseString (some expr) <&> sum where - expr = makeExprParser (parens expr <|> posInt) [[addition], [multiplication]] + expr = makeExprParser (parens expr <|> natural) table -addition :: Operator Parser Int -addition = InfixL ((+) <$ symbol "+") +addition :: (Num a) => Operator Parser a +addition = binary "+" (+) -multiplication :: Operator Parser Int -multiplication = InfixL ((*) <$ symbol "*") +multiplication :: (Num a) => Operator Parser a +multiplication = binary "*" (*) -posInt :: Parser Int -posInt = fromInteger <$> natural +binary :: String -> (a -> a -> a) -> Operator Parser a +binary name f = InfixL (f <$ symbol name) From 4718e3b31f5c4df7daae0f69f280565b0b263e2d Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sat, 29 Nov 2025 03:15:56 -0600 Subject: [PATCH 63/91] refactor(2020.17-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2020/day17.txt | 8 ---- package.yaml | 1 + src/AdventOfCode/Year2020/Day17.hs | 68 ++++++++++++++++++------------ 4 files changed, 43 insertions(+), 36 deletions(-) delete mode 100644 input/2020/day17.txt diff --git a/VERSION b/VERSION index a97c5d5..1bc1497 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.84 \ No newline at end of file +2024.7.2.85 \ No newline at end of file diff --git a/input/2020/day17.txt b/input/2020/day17.txt deleted file mode 100644 index c586985..0000000 --- a/input/2020/day17.txt +++ /dev/null @@ -1,8 +0,0 @@ -.###.### -.#.#...# -..##.#.. -..##..## -........ -##.#.#.# -..###... -.####... diff --git a/package.yaml b/package.yaml index 3b2e8de..7d6b65c 100644 --- a/package.yaml +++ b/package.yaml @@ -443,6 +443,7 @@ executables: <<: *executable main: AdventOfCode.Year2020.Day17 dependencies: + - infinite-list - linear aoc-2020-day18: <<: *executable diff --git a/src/AdventOfCode/Year2020/Day17.hs b/src/AdventOfCode/Year2020/Day17.hs index bc12948..025645c 100644 --- a/src/AdventOfCode/Year2020/Day17.hs +++ b/src/AdventOfCode/Year2020/Day17.hs @@ -1,3 +1,5 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2020.Day17 ( main, getInput, @@ -6,37 +8,46 @@ module AdventOfCode.Year2020.Day17 ) where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (inputFilePath) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (neighborsOf) -import Control.Applicative ((<|>)) import Control.Lens (ifoldl', set) -import Data.Functor (($>)) +import Data.List.Infinite ((!!)) +import Data.List.Infinite qualified as Infinite import Data.Map qualified as Map -import Data.Set (Set) import Data.Set qualified as Set import Linear (R2 (..), V2 (..), V3 (..), V4 (..)) +import Relude import Text.Trifecta +type Domain f = + ( Applicative f, + Traversable f, + R2 f, + Num (f Int), + Ord (f Int) + ) :: + Constraint + +type Codomain f a = Set (f Int) -> a + main :: IO () -main = - do - input <- getInput - putStr "Part One: " - print $ partOne (mkPocketDimension input) - putStr "Part Two: " - print $ partTwo (mkPocketDimension input) +main = $(defaultMainPuzzle) getInput :: IO [[Bool]] -getInput = parseInput region $(inputFilePath) +getInput = parseInputAoC 2020 17 cubeRegion + +partOne :: SimplePuzzle [[Bool]] Int +partOne = asks (solve . mkPocketDimension @V3) -partOne :: Set (V3 Int) -> Int -partOne = Set.size . (!! 6) . iterate stepCycle +partTwo :: SimplePuzzle [[Bool]] Int +partTwo = asks (solve . mkPocketDimension @V4) -partTwo :: Set (V4 Int) -> Int -partTwo = Set.size . (!! 6) . iterate stepCycle +solve :: (Domain f) => Codomain f Int +solve = Set.size . (!! 6) . Infinite.iterate stepCycle -stepCycle :: (Applicative f, Traversable f, Num (f Int), Ord (f Int)) => Set (f Int) -> Set (f Int) +stepCycle :: (Domain f) => Codomain f (Set (f Int)) stepCycle activeCubes = stillActive <> activated where stillActive = filterNeighborCounts (\n -> n == 2 || n == 3) activeNeighborCounts @@ -45,19 +56,22 @@ stepCycle activeCubes = stillActive <> activated inactiveNeighborCounts = neighborCounts `Map.withoutKeys` activeCubes filterNeighborCounts p = Map.keysSet . Map.filter p neighborCounts = - Map.unionsWith ((+) :: Int -> Int -> Int) $ - Map.fromSet (const 1) . neighborsOf - <$> Set.toList activeCubes + Map.unionsWith ((+) :: Int -> Int -> Int) + $ Map.fromSet (const 1) + . neighborsOf + <$> Set.toList activeCubes -mkPocketDimension :: (Applicative f, R2 f, Ord (f Int)) => [[Bool]] -> Set (f Int) +mkPocketDimension :: (Domain f) => [[Bool]] -> Set (f Int) mkPocketDimension = ifoldl' (ifoldl' . go) Set.empty where - go y x activeCubes True = Set.insert (set _xy (V2 x y) (pure 0)) activeCubes + go y x activeCubes True = Set.insert (set _xy (V2 x y) 0) activeCubes go _ _ activeCubes False = activeCubes -region :: Parser [[Bool]] -region = some cube `sepEndBy` newline +cubeRegion :: Parser [[Bool]] +cubeRegion = some cube `sepEndBy` newline where cube = - char '#' $> True - <|> char '.' $> False + char '#' + $> True + <|> char '.' + $> False From 1aa29ce67c5fad89df1b9b5ec79551452cfa95b3 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sat, 29 Nov 2025 05:53:56 -0600 Subject: [PATCH 64/91] refactor(2020.16-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2020/day16.txt | 261 ----------------------------- package.yaml | 2 + src/AdventOfCode/Year2020/Day16.hs | 164 ++++++++++-------- 4 files changed, 94 insertions(+), 335 deletions(-) delete mode 100644 input/2020/day16.txt diff --git a/VERSION b/VERSION index 1bc1497..65f8057 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.85 \ No newline at end of file +2024.7.2.86 \ No newline at end of file diff --git a/input/2020/day16.txt b/input/2020/day16.txt deleted file mode 100644 index c14e65e..0000000 --- a/input/2020/day16.txt +++ /dev/null @@ -1,261 +0,0 @@ -departure location: 27-672 or 680-954 -departure station: 25-430 or 439-966 -departure platform: 31-293 or 299-953 -departure track: 29-749 or 775-955 -departure date: 43-93 or 107-953 -departure time: 50-916 or 941-963 -arrival location: 31-682 or 702-954 -arrival station: 38-663 or 672-960 -arrival platform: 31-629 or 635-969 -arrival track: 42-365 or 371-967 -class: 30-147 or 167-966 -duration: 39-525 or 545-967 -price: 30-803 or 822-950 -route: 39-235 or 257-957 -row: 33-206 or 231-971 -seat: 29-784 or 798-951 -train: 38-302 or 316-957 -type: 50-635 or 642-966 -wagon: 25-502 or 510-973 -zone: 42-843 or 861-965 - -your ticket: -73,53,173,107,113,89,59,167,137,139,71,179,131,181,67,83,109,127,61,79 - -nearby tickets: -401,502,276,495,9,177,627,330,621,478,589,620,657,138,563,260,167,837,351,943 -492,714,451,146,914,565,290,882,280,405,626,666,597,349,461,340,342,348,482,885 -904,625,470,94,269,863,710,747,284,429,371,866,401,351,259,377,69,189,801,723 -64,238,70,81,478,280,426,609,460,603,137,647,589,76,140,588,472,891,66,376 -458,425,56,320,347,742,887,648,3,389,257,143,646,362,268,195,500,586,895,730 -802,50,181,740,908,732,416,423,895,128,445,905,117,462,881,206,833,86,725,369 -475,107,203,404,627,493,478,870,346,778,383,604,737,668,721,331,454,780,912,784 -464,906,405,206,882,195,2,196,888,344,497,552,841,624,263,417,404,839,561,78 -340,167,568,390,78,397,123,366,828,652,495,445,570,275,144,948,76,893,838,328 -72,173,645,443,610,941,131,335,400,500,379,804,887,824,479,831,582,916,360,884 -469,352,705,914,714,367,520,603,681,137,184,329,702,76,779,524,72,318,167,650 -351,512,110,422,904,832,345,101,55,388,196,547,401,354,57,524,875,386,570,269 -170,489,130,251,188,262,784,517,941,883,875,332,484,82,556,653,656,495,282,611 -408,545,180,349,425,72,139,707,415,722,723,140,350,426,301,831,435,521,897,358 -574,292,491,708,620,895,332,836,599,590,891,589,324,455,734,333,652,61,626,312 -360,595,843,933,289,475,523,441,730,327,473,876,708,599,550,521,554,594,83,909 -467,737,707,717,177,572,191,404,681,704,748,580,418,550,644,58,987,520,599,784 -471,325,736,520,458,720,200,867,469,65,655,81,77,148,654,83,888,711,439,717 -609,283,945,141,465,352,453,833,561,192,582,452,447,400,724,724,897,483,504,588 -404,382,124,337,583,356,897,614,728,346,479,296,337,57,90,626,490,202,401,402 -75,658,402,884,350,615,548,836,171,384,829,910,332,636,660,885,826,875,426,548 -354,890,779,407,823,883,249,360,142,486,316,194,911,722,865,550,867,907,406,883 -132,373,490,886,494,273,518,803,285,609,872,60,54,654,144,324,519,95,802,343 -379,263,524,643,359,726,865,140,712,993,261,178,718,661,338,454,144,880,511,600 -615,703,836,181,202,356,888,132,409,330,505,234,74,656,373,491,350,580,330,316 -356,837,297,137,451,417,736,586,202,470,77,181,742,139,780,144,349,276,202,347 -442,466,547,872,463,327,625,616,979,616,119,650,293,342,577,870,182,145,175,338 -873,201,360,639,116,839,354,828,905,584,912,781,660,647,893,266,334,69,711,549 -231,281,153,616,482,380,874,622,477,490,646,708,902,316,413,93,83,269,574,174 -204,52,875,619,870,385,450,573,173,739,54,150,568,357,741,71,557,907,579,471 -268,615,726,825,360,887,377,523,993,495,268,501,175,204,489,619,643,871,863,52 -718,609,204,353,178,349,592,407,734,721,420,894,459,300,742,712,60,366,729,189 -899,657,635,126,590,581,658,418,945,485,570,901,471,644,175,131,196,157,186,83 -325,762,316,476,92,783,894,374,635,713,473,324,353,749,912,456,401,480,658,915 -865,109,504,724,133,663,261,417,342,907,71,180,191,587,269,578,93,257,62,397 -884,833,331,589,830,911,902,653,469,501,624,311,453,613,946,779,403,719,749,554 -827,165,592,727,572,714,452,948,83,682,178,627,85,442,719,193,741,475,358,322 -391,331,352,725,809,389,173,139,523,713,546,80,635,870,187,801,390,197,803,708 -714,474,276,434,336,520,171,407,338,262,798,657,189,270,327,324,524,287,862,944 -889,580,829,634,439,517,550,87,202,485,486,738,681,866,292,136,802,90,291,180 -650,379,359,364,887,192,275,386,430,742,629,903,364,920,235,336,345,703,647,475 -151,583,835,92,578,823,425,126,199,502,731,193,680,732,800,493,893,885,521,378 -707,324,59,108,448,202,107,565,525,912,371,89,262,487,247,825,124,780,320,620 -377,656,80,310,864,115,778,906,611,55,142,512,408,949,381,561,489,132,470,712 -867,870,800,175,825,401,262,155,280,782,904,399,393,302,586,599,59,375,274,799 -897,603,262,590,580,281,645,656,549,800,232,902,425,473,449,423,174,611,998,175 -199,414,891,445,114,314,833,412,910,522,723,262,573,419,776,914,724,612,502,330 -934,478,891,193,75,130,55,739,738,875,122,81,838,611,115,871,833,448,646,568 -508,394,595,271,360,375,587,329,568,625,706,629,602,864,332,392,136,570,620,448 -413,381,427,264,288,373,8,583,834,56,451,361,340,195,462,183,448,672,905,351 -442,601,304,139,134,449,557,65,884,145,117,610,781,517,423,945,574,458,373,263 -111,188,743,495,611,390,183,141,875,587,837,282,293,595,185,475,492,376,92,255 -186,642,70,523,140,302,193,732,63,429,149,461,168,742,280,233,234,418,204,500 -357,92,567,440,572,565,233,465,293,810,894,870,405,592,131,704,729,645,338,780 -604,187,339,173,886,944,716,192,622,658,279,949,603,885,883,568,0,748,424,362 -728,873,904,405,482,656,590,270,587,52,619,300,987,487,871,942,421,800,200,910 -315,577,351,831,63,80,62,417,119,167,268,131,328,492,471,363,409,184,578,800 -356,405,565,624,137,147,341,617,748,174,466,62,181,269,277,824,674,279,395,411 -716,801,190,615,174,554,588,885,181,715,672,256,420,745,657,776,169,352,193,722 -497,107,680,901,731,137,115,195,353,110,861,401,836,836,663,509,415,515,418,895 -276,471,565,606,704,116,468,351,593,385,284,180,110,145,362,167,671,646,741,647 -440,364,476,72,72,192,127,293,283,593,502,544,620,548,644,718,447,914,335,643 -96,822,317,364,874,571,270,288,398,124,67,107,652,453,783,915,127,501,385,138 -287,423,398,295,548,553,878,349,582,319,583,462,605,906,598,190,398,732,882,286 -197,723,281,488,325,194,128,885,798,717,3,232,93,127,890,494,205,72,409,197 -136,674,393,277,329,189,398,711,60,589,454,389,873,199,278,380,888,590,280,338 -779,391,186,825,390,733,122,54,726,87,946,658,976,628,91,291,899,125,839,346 -403,353,392,123,583,730,416,556,458,577,133,425,709,234,834,944,582,455,611,161 -945,946,912,138,429,443,118,311,465,942,451,838,525,720,886,561,654,498,740,454 -501,747,396,191,997,441,206,496,555,885,455,418,614,72,404,722,479,880,569,498 -440,398,206,623,801,124,459,825,282,985,458,91,266,681,863,717,409,744,182,835 -710,867,259,618,574,882,628,61,825,251,450,275,717,412,607,576,452,606,426,406 -896,276,397,343,385,383,894,383,133,703,748,577,180,624,710,718,506,589,737,603 -706,724,181,841,452,832,475,861,23,167,316,258,782,465,350,445,185,203,682,62 -634,339,347,874,393,266,50,146,643,382,879,454,189,682,301,518,423,838,829,600 -652,748,834,559,70,390,162,545,322,775,577,644,206,429,176,472,495,183,525,658 -325,499,239,135,280,516,316,781,776,204,547,647,400,51,726,822,325,514,522,71 -375,290,900,293,902,643,271,783,383,605,232,780,325,348,608,815,905,909,562,402 -862,428,119,82,360,191,292,281,192,496,462,113,57,761,555,400,51,610,54,456 -460,800,263,170,498,617,14,519,365,479,511,660,144,423,413,454,557,863,300,257 -351,887,478,147,336,627,110,559,721,260,325,141,468,132,276,366,277,468,61,290 -451,317,194,726,948,380,416,841,834,414,478,75,628,547,14,573,377,905,783,328 -405,894,575,300,512,409,645,302,392,347,352,20,487,622,324,682,483,663,465,864 -122,804,320,393,477,672,835,547,711,471,126,882,125,72,88,495,117,130,50,580 -442,779,406,601,912,406,572,435,134,129,439,50,588,110,569,546,779,177,113,745 -838,428,583,730,281,196,782,832,334,643,865,631,565,202,364,398,299,825,404,583 -945,681,484,347,548,430,369,489,174,485,864,874,112,201,501,357,328,781,142,735 -287,702,320,157,592,879,578,597,490,206,77,900,830,77,560,909,710,862,899,349 -448,335,560,908,185,742,134,398,566,51,278,390,521,916,285,236,123,784,262,360 -76,318,938,557,79,171,914,481,231,261,829,896,657,706,491,331,824,362,822,861 -433,803,577,326,267,841,138,131,338,199,191,842,464,193,167,457,888,62,524,460 -332,941,363,481,179,361,118,915,737,131,559,690,621,199,69,359,731,714,906,801 -825,779,681,367,90,877,143,273,184,317,77,473,650,564,361,910,885,568,575,722 -618,109,174,826,552,73,511,373,557,75,91,391,656,259,407,741,300,826,159,179 -283,458,901,466,609,976,473,415,79,67,566,387,635,882,203,649,799,736,603,116 -415,447,681,710,550,727,289,284,54,287,945,385,416,646,280,581,766,498,598,293 -447,407,890,482,803,405,300,588,571,203,112,231,874,266,832,338,340,438,406,710 -624,85,467,487,443,404,779,76,455,353,1,628,288,557,356,601,749,129,136,340 -173,548,413,709,185,349,470,635,328,279,741,833,412,632,125,488,374,284,133,578 -613,525,725,898,399,660,644,201,114,607,455,350,186,833,123,289,632,426,647,64 -358,56,5,778,587,710,479,184,408,286,743,270,711,468,397,112,622,181,385,80 -889,340,168,496,76,579,990,56,395,446,607,280,512,359,604,282,384,647,486,584 -481,456,735,418,585,723,926,129,627,553,495,778,140,51,624,628,826,453,655,885 -778,602,446,726,396,629,632,200,465,517,382,476,285,259,708,123,88,404,425,620 -233,895,802,878,585,117,82,508,408,445,177,87,91,585,399,567,407,385,108,274 -475,892,584,905,748,359,182,280,484,293,620,734,729,503,601,275,799,418,373,378 -266,552,908,591,720,814,170,593,714,357,116,550,177,441,189,134,720,705,494,169 -112,945,714,391,377,81,467,389,279,299,361,916,195,101,111,110,449,517,86,719 -242,449,456,272,783,338,396,353,715,183,571,643,882,417,385,861,78,141,177,741 -300,196,359,119,604,836,490,646,622,662,501,655,778,190,578,733,343,128,491,503 -496,596,711,621,720,320,333,823,183,562,468,291,421,315,338,739,292,745,54,81 -488,370,830,185,458,386,628,272,143,513,373,654,802,359,477,316,629,362,655,422 -944,538,628,514,710,110,714,721,122,654,411,491,626,602,387,206,57,397,653,404 -709,288,22,706,783,278,388,329,174,445,452,144,194,79,598,300,895,523,386,202 -381,294,863,58,833,80,707,643,329,875,834,827,479,838,128,384,467,454,204,834 -284,575,596,774,502,593,704,442,136,58,741,71,513,378,391,489,194,302,289,831 -395,69,127,705,52,743,376,629,609,442,334,193,142,869,137,320,629,246,202,186 -410,364,261,489,182,139,350,702,340,132,140,489,299,480,81,280,821,871,944,733 -551,454,592,440,727,552,617,829,413,738,183,928,480,717,116,346,562,283,661,598 -943,911,119,589,593,568,462,514,287,486,278,577,646,382,653,79,705,561,808,394 -800,847,269,839,299,259,468,358,77,428,712,382,272,120,721,624,136,625,546,462 -68,711,275,415,132,605,405,137,394,577,558,553,572,501,778,272,298,489,144,680 -259,601,62,593,615,187,739,889,52,77,622,871,413,555,975,128,948,740,391,829 -732,662,446,829,245,454,567,439,496,378,135,84,57,422,628,352,282,834,263,269 -476,741,105,386,470,87,512,829,378,574,588,126,374,573,865,388,943,603,467,276 -913,488,336,326,293,122,947,658,745,649,623,321,736,113,393,365,920,286,263,902 -295,595,645,943,607,600,478,173,425,422,478,344,498,490,377,374,343,281,864,564 -391,312,629,68,178,486,713,546,551,650,609,498,681,266,235,167,643,651,301,323 -624,446,600,626,180,345,588,648,642,723,910,916,442,182,947,358,778,506,487,826 -134,723,775,275,416,576,231,327,238,285,396,378,872,579,402,299,591,511,266,721 -554,91,724,615,193,866,430,495,655,64,872,485,620,596,11,133,410,721,456,646 -88,824,438,841,144,121,394,525,81,514,383,496,202,482,86,469,489,487,726,203 -676,943,862,578,610,887,460,703,716,707,881,731,338,351,61,895,648,831,570,799 -578,715,191,189,379,910,406,941,182,801,369,607,291,353,886,741,420,653,331,469 -809,883,898,581,125,825,130,658,495,393,400,355,588,405,458,604,781,424,426,841 -59,137,289,736,783,459,191,561,391,908,410,501,467,583,360,377,155,110,829,109 -422,115,474,885,571,447,324,926,390,591,823,583,205,138,778,510,876,723,269,839 -511,578,197,947,878,350,302,133,83,597,645,182,65,337,798,832,725,772,115,861 -622,863,748,200,832,329,729,70,651,565,51,289,381,322,329,188,399,309,414,519 -405,496,355,511,428,318,664,134,864,316,520,829,660,112,598,564,660,290,549,381 -742,885,285,649,338,413,826,758,178,890,133,342,472,653,201,946,279,64,727,205 -190,841,429,456,400,575,58,553,510,384,416,596,916,941,418,115,235,175,246,617 -331,300,206,393,442,352,579,510,383,519,450,4,376,704,65,555,442,730,802,626 -723,652,418,896,193,508,82,392,185,448,494,608,120,172,300,863,887,199,266,477 -334,922,655,477,175,720,132,454,598,647,205,777,346,320,646,388,569,596,745,642 -779,576,493,613,517,361,375,783,984,421,176,231,627,364,823,468,381,901,450,585 -85,658,745,209,142,734,415,281,731,405,189,720,877,559,579,188,492,941,356,88 -733,400,387,583,331,192,813,593,659,471,171,545,317,649,834,399,611,876,643,126 -717,634,289,134,283,174,823,445,612,201,520,266,130,361,129,267,337,424,661,570 -380,841,472,905,881,85,295,825,317,351,122,291,355,195,776,143,360,321,749,175 -947,430,888,146,479,186,515,747,622,374,873,658,611,990,78,346,128,269,947,352 -898,876,628,916,142,250,357,908,327,745,167,897,119,182,780,872,321,393,608,867 -406,777,656,77,367,288,575,525,463,338,333,729,196,568,92,581,358,362,459,888 -563,66,412,571,442,62,293,296,344,73,147,56,316,569,488,733,84,59,145,112 -741,802,514,546,81,730,434,868,827,463,341,706,184,622,203,863,117,522,143,356 -732,729,129,728,775,619,371,653,279,568,252,408,567,192,837,872,645,908,565,284 -563,492,176,660,872,562,675,623,714,196,727,393,484,405,269,393,721,904,279,602 -366,802,487,949,562,825,69,202,877,442,288,866,593,443,114,868,343,131,517,379 -329,659,744,59,599,445,576,410,6,907,288,524,839,91,55,185,523,179,287,703 -82,104,135,292,425,662,881,659,458,580,453,199,722,747,394,680,552,281,880,595 -374,667,424,461,269,473,355,129,867,354,63,629,469,332,829,602,900,869,706,480 -743,375,370,881,442,274,886,408,418,444,878,646,268,482,133,134,661,561,397,396 -864,656,82,531,625,448,181,714,481,494,899,913,475,275,489,742,359,474,385,474 -579,604,591,343,266,576,20,107,357,905,833,115,397,378,781,829,464,943,562,345 -704,115,902,331,988,269,91,628,459,474,563,902,893,620,610,869,422,711,418,355 -428,208,877,613,744,739,91,197,177,108,874,872,493,54,407,338,521,887,284,288 -259,334,652,261,502,405,411,563,88,891,421,67,739,623,832,388,987,607,339,121 -781,456,376,384,625,109,636,744,446,76,361,124,324,196,589,736,197,703,647,480 -479,572,387,869,579,90,336,584,602,419,600,572,180,394,234,313,127,289,112,716 -359,234,264,720,735,446,742,111,74,728,905,340,83,73,725,412,401,606,865,436 -141,580,365,194,654,739,736,65,870,301,944,136,715,484,609,342,579,810,139,390 -82,285,364,421,393,831,315,411,611,913,460,126,388,479,413,886,82,888,895,730 -57,830,835,472,457,411,430,826,419,383,362,856,61,737,831,831,112,206,232,179 -265,882,90,677,617,548,89,76,133,571,704,472,54,107,554,497,323,713,452,187 -662,124,452,727,553,588,20,723,655,884,429,713,862,843,552,626,417,870,395,549 -329,126,807,876,738,441,231,292,580,388,892,729,141,322,416,365,573,379,619,407 -875,461,170,559,548,874,175,516,146,337,661,511,83,621,189,497,398,654,947,809 -186,902,183,376,800,490,911,424,64,486,356,390,623,679,450,907,829,738,280,361 -839,185,394,196,575,831,716,824,146,51,383,561,283,916,778,913,836,316,366,400 -422,653,551,608,629,893,547,460,894,480,705,367,190,609,68,324,947,172,82,59 -656,169,864,565,80,496,358,493,841,483,904,439,199,448,645,942,248,523,231,282 -450,880,91,176,51,893,770,832,68,115,866,282,662,784,55,875,376,522,416,732 -623,705,284,602,178,881,467,832,318,548,391,407,486,363,598,613,103,552,521,803 -81,431,462,201,649,189,911,621,582,183,523,290,576,749,399,735,914,823,621,725 -828,347,460,672,289,603,719,325,728,873,517,889,575,612,159,726,405,799,748,79 -257,125,381,593,891,416,444,126,898,199,877,775,67,862,174,574,303,327,469,911 -682,410,705,623,803,111,862,447,417,271,70,678,475,548,383,861,907,447,561,658 -19,556,408,589,713,261,126,335,74,894,595,611,169,419,280,592,872,586,561,329 -599,264,647,350,85,780,550,360,197,552,494,874,351,816,302,320,468,744,282,729 -195,564,173,604,451,71,87,746,89,151,446,144,126,391,863,352,361,121,483,335 -725,574,448,439,426,268,128,243,879,823,651,877,481,551,267,601,949,801,358,456 -904,121,525,710,282,191,508,331,586,451,65,387,718,824,107,132,491,274,500,373 -734,459,837,417,826,660,522,108,175,748,733,947,446,826,867,166,830,266,586,613 -784,989,708,574,733,629,602,117,863,518,388,524,361,560,205,607,257,582,713,81 -545,565,59,302,621,616,722,945,584,516,267,882,987,601,283,656,604,563,113,777 -899,349,742,800,299,449,381,490,583,343,571,195,324,245,178,341,189,730,722,578 -182,257,862,659,729,87,511,409,130,836,811,398,648,259,397,877,455,717,487,462 -168,383,179,429,587,406,555,392,177,522,341,436,331,477,142,869,194,347,147,642 -613,174,609,327,284,949,604,647,457,484,742,870,137,4,616,440,590,129,909,550 -499,556,21,292,334,569,379,723,414,746,287,916,420,573,382,682,871,280,727,494 -358,878,717,185,318,60,54,61,264,658,59,717,192,210,615,627,69,453,451,837 -109,50,775,548,901,604,129,556,493,189,734,638,552,85,878,916,878,881,282,863 -375,469,743,865,481,383,893,675,329,571,502,576,365,451,616,648,330,177,912,908 -753,464,867,445,444,468,616,618,894,916,563,355,602,910,832,493,191,363,865,442 -112,363,913,141,71,740,442,327,274,617,377,635,353,301,605,107,596,932,775,146 -591,191,322,484,616,338,380,812,127,137,257,657,884,301,600,423,112,581,415,877 -501,639,324,648,344,499,377,58,901,577,359,493,187,112,69,477,146,720,292,609 -835,513,398,171,622,659,359,325,654,419,432,869,61,405,398,478,654,659,943,600 -82,681,575,594,116,484,890,383,76,655,705,446,454,261,562,396,729,741,343,919 -884,889,268,833,360,870,722,579,52,389,402,582,414,370,783,623,379,635,721,889 -491,466,577,475,841,428,800,843,365,116,307,90,605,720,877,658,682,866,882,234 -349,877,754,346,409,93,176,736,387,377,168,782,205,409,460,867,896,430,826,749 -647,281,574,718,86,928,340,843,708,55,365,470,704,55,725,343,378,822,520,347 -780,826,470,873,557,709,110,557,476,191,83,129,281,297,911,570,128,645,823,376 -339,916,477,68,278,233,945,492,620,74,933,736,617,182,881,337,836,393,204,901 -660,891,563,403,152,888,170,615,333,362,591,672,861,69,324,599,714,410,173,882 -354,864,359,642,613,643,447,709,731,170,502,909,592,800,52,144,914,554,8,944 -59,445,392,509,624,374,586,61,274,396,556,117,128,601,601,123,653,264,270,611 -468,470,350,520,483,739,735,743,550,578,911,984,351,896,523,58,335,708,91,460 -271,372,185,593,650,331,291,598,663,414,591,508,359,779,325,143,520,942,470,740 -582,138,194,373,734,192,139,188,392,520,477,167,648,433,174,878,74,913,515,840 -627,186,325,233,372,152,911,425,781,395,841,561,554,413,739,418,454,398,316,291 -712,728,712,53,746,897,513,453,142,865,2,167,717,133,656,560,354,650,203,661 -905,606,60,183,653,874,325,944,494,576,728,565,331,907,111,708,274,410,122,102 -301,124,711,749,394,709,799,656,50,167,574,76,113,87,735,627,408,592,15,495 -387,712,356,783,498,982,363,644,335,781,395,514,183,458,884,894,194,493,842,74 -204,600,428,458,351,512,113,119,258,653,472,226,422,608,430,87,595,456,879,356 -281,206,895,408,50,610,98,882,443,898,608,737,842,405,580,481,279,746,178,731 -546,10,262,270,333,910,466,337,567,258,729,178,743,379,86,525,460,92,652,799 -901,487,336,821,77,330,889,601,302,421,121,289,879,680,719,496,83,409,613,480 -89,124,616,668,613,414,708,842,323,458,602,826,472,373,599,278,268,120,615,864 -724,506,350,371,870,417,588,473,342,896,59,576,515,680,945,573,397,716,182,494 -61,888,277,259,88,523,57,652,170,175,607,757,91,276,732,427,361,593,781,169 -452,517,739,180,646,471,269,290,610,335,579,984,443,429,704,597,475,525,581,293 -363,672,456,887,898,586,572,142,861,604,457,94,131,77,175,343,884,464,274,396 -581,63,232,130,589,80,775,499,910,603,618,571,880,280,455,491,370,118,283,611 diff --git a/package.yaml b/package.yaml index 7d6b65c..db8d100 100644 --- a/package.yaml +++ b/package.yaml @@ -438,7 +438,9 @@ executables: <<: *executable main: AdventOfCode.Year2020.Day16 dependencies: + - infinite-list - linear + - pointless-fun aoc-2020-day17: <<: *executable main: AdventOfCode.Year2020.Day17 diff --git a/src/AdventOfCode/Year2020/Day16.hs b/src/AdventOfCode/Year2020/Day16.hs index a9ad029..136c8b3 100644 --- a/src/AdventOfCode/Year2020/Day16.hs +++ b/src/AdventOfCode/Year2020/Day16.hs @@ -1,3 +1,7 @@ +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2020.Day16 ( main, getInput, @@ -6,84 +10,98 @@ module AdventOfCode.Year2020.Day16 ) where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (inputFilePath) -import Control.Monad (void) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import AdventOfCode.Util ((<.>)) +import Control.Lens (makeLenses, view, views) +import Data.Foldable.Extra (productOn', sumOn') +import Data.Function.Pointless ((.:)) import Data.Ix (inRange) -import Data.List (isPrefixOf, transpose, (\\)) -import Data.Maybe (mapMaybe) +import Data.List ((\\)) +import Data.List.Infinite qualified as Infinite +import Data.List.NonEmpty qualified as NE import Linear (V2 (..)) -import Text.Trifecta (Parser, anyChar, char, commaSep, eof, manyTill, natural, symbol) +import Relude +import Text.Trifecta (Parser, anyChar, char, comma, eof, manyTill, natural, sepByNonEmpty, symbol) + +data Rule + = Rule + { _field :: !String, + _location :: !(V2 (Int, Int)) + } + deriving (Eq, Generic, Show) + +type Ticket = NonEmpty Int + +data Document + = Document + { _rules :: !(NonEmpty Rule), + _myTicket :: !Ticket, + _nearbyTickets :: !(NonEmpty Ticket) + } + deriving (Eq, Generic, Show) + +makeLenses ''Document main :: IO () -main = - do - input <- getInput - putStr "Part One: " - print $ partOne input - putStr "Part Two: " - print $ partTwo input - --- TODO: Use better types -getInput :: IO ([(String, V2 (Int, Int))], [Int], [[Int]]) -getInput = flip parseInput $(inputFilePath) $ - do - ticketRules <- manyTill ticketRule (symbol "your ticket:") - myTicket <- commaSep posInt - void $ symbol "nearby tickets:" - nearbyTickets <- manyTill (commaSep posInt) eof - pure (ticketRules, myTicket, nearbyTickets) - -partOne :: ([(String, V2 (Int, Int))], [Int], [[Int]]) -> Int -partOne (rules, _, nearbyTickets) = - sum $ concatMap (invalidFields rules) nearbyTickets - --- FIXME: Clean this up... -partTwo :: ([(String, V2 (Int, Int))], [Int], [[Int]]) -> Int -partTwo (rules, myTicket, nearbyTickets) = - product $ - map ((myTicket !!) . fst) $ - filter (isPrefixOf "departure" . snd) $ - zip [0 ..] $ - concat $ - iterate go possibleFields !! length nearbyTickets +main = $(defaultMainPuzzle) + +getInput :: IO Document +getInput = parseInputAoC 2020 16 do + Document + <$> manyTillNonEmpty ticketRule (symbol "your ticket:") + <*> sepByNonEmpty posInt comma + <*> ( symbol "nearby tickets:" + *> manyTillNonEmpty (sepByNonEmpty posInt comma) eof + ) + +partOne :: SimplePuzzle Document Int +partOne = sumOn' <$> views rules (sum .: invalidFields) <*> view nearbyTickets + +partTwo :: SimplePuzzle Document Int +partTwo = do + validTickets <- + map NE.toList + <.> NE.filter + <$> views rules (not .: any . invalidField) + <*> view nearbyTickets + possibleFields <- + views rules $ NE.toList >>> \theRules -> + transpose validTickets <&> \fields -> do + Rule label ranges <- theRules + guard (all (flip any ranges . flip inRange) fields) + pure label + n <- views nearbyTickets (fromIntegral . length) + views myTicket (NE.!!) <&> \readTicket -> + productOn' (readTicket . fst) + $ filter (isPrefixOf "departure" . snd) + $ zip [0 ..] + $ concat + $ Infinite.iterate refine possibleFields + Infinite.!! n + +refine :: (Eq a) => [[a]] -> [[a]] +refine haystacks = flip (foldr go) needles <$> haystacks + where + needles = [needle | needle@[_] <- haystacks] + go needle haystack = bool (haystack \\ needle) needle (haystack == needle) + +ticketRule :: Parser Rule +ticketRule = Rule <$> label <*> intRanges where - go xs = - flip map xs $ \ys -> - foldr (\as bs -> if as == bs then as else bs \\ as) ys singles - where - singles = filter ((1 ==) . length) xs - possibleFields = - [ flip mapMaybe rules $ \(label, ranges) -> - if all (\field -> any (`inRange` field) ranges) fields - then Just label - else Nothing - | fields <- transpose validTickets - ] - validTickets = filter (not . any (invalidField rules)) nearbyTickets - -ticketRule :: Parser (String, V2 (Int, Int)) -ticketRule = - do - label <- manyTill anyChar (symbol ":") - lhs <- intRange - void (symbol "or") - rhs <- intRange - pure (label, V2 lhs rhs) - -invalidFields :: [(String, V2 (Int, Int))] -> [Int] -> [Int] -invalidFields = filter . invalidField - -invalidField :: [(String, V2 (Int, Int))] -> Int -> Bool -invalidField rules field = not (any (any (`inRange` field) . snd) rules) - -intRange :: Parser (Int, Int) -intRange = - do - from <- posInt - void (char '-') - to <- posInt - pure (from, to) + label = manyTill anyChar (symbol ":") + intRanges = V2 <$> (intRange <* symbol "or") <*> intRange + intRange = (,) <$> (posInt <* char '-') <*> posInt + +invalidFields :: NonEmpty Rule -> Ticket -> [Int] +invalidFields = NE.filter . invalidField + +invalidField :: NonEmpty Rule -> Int -> Bool +invalidField knownRules n = not (any (any (`inRange` n) . _location) knownRules) posInt :: Parser Int posInt = fromInteger <$> natural + +manyTillNonEmpty :: (Alternative m) => m a -> m sep -> m (NonEmpty a) +manyTillNonEmpty p end = (:|) <$> p <*> manyTill p end From 1c773cbccff108a9ce222fe511638f30e3ed248c Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sun, 30 Nov 2025 00:48:58 -0600 Subject: [PATCH 65/91] refactor(2020.15-haskell): adopt advent-of-code-api, break partTwo [ci skip] --- VERSION | 2 +- src/AdventOfCode/Puzzle.hs | 3 + src/AdventOfCode/Year2020/Day15.hs | 102 ++++++++++++++++++----------- 3 files changed, 69 insertions(+), 38 deletions(-) diff --git a/VERSION b/VERSION index 65f8057..5141294 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.86 \ No newline at end of file +2024.7.2.87 \ No newline at end of file diff --git a/src/AdventOfCode/Puzzle.hs b/src/AdventOfCode/Puzzle.hs index 15f43ed..b5b23b4 100644 --- a/src/AdventOfCode/Puzzle.hs +++ b/src/AdventOfCode/Puzzle.hs @@ -47,3 +47,6 @@ evalPuzzle input initialState = evaluatingPuzzle :: (MonadIO m, Monoid s) => Puzzle r s a -> r -> m a evaluatingPuzzle puzzle input = evalPuzzle input mempty puzzle + +withPuzzle :: (r' -> r) -> Puzzle r s a -> Puzzle r' s a +withPuzzle f puzzle = Puzzle $ withReaderT f (runPuzzle puzzle) diff --git a/src/AdventOfCode/Year2020/Day15.hs b/src/AdventOfCode/Year2020/Day15.hs index ffc7292..2f1360b 100644 --- a/src/AdventOfCode/Year2020/Day15.hs +++ b/src/AdventOfCode/Year2020/Day15.hs @@ -1,3 +1,7 @@ +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE StrictData #-} +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2020.Day15 ( main, getInput, @@ -6,47 +10,71 @@ module AdventOfCode.Year2020.Day15 ) where -import Control.Monad.State (State, evalState, execState, get, put) -import Data.IntMap (IntMap) -import Data.IntMap qualified as IM +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.Puzzle +import Control.Lens (makeLenses, use, uses, (%=), (+=), (.=), (<~)) +import Control.Monad.Logger (logDebug) +import Data.IntMap qualified as IntMap +import Relude +import Text.Printf (printf) +import Text.Trifecta (commaSep, natural) + +data PuzzleState + = PuzzleState + { _numbersToSay :: NonEmpty Int, + _turn :: Int, + _spokenNumbers :: IntMap Int + } + deriving (Eq, Generic, Show) + +makeLenses ''PuzzleState + +mkState :: NonEmpty Int -> PuzzleState +mkState input = PuzzleState input 0 IntMap.empty main :: IO () main = - do - input <- getInput - putStr "Part One: " - print (partOne input) - putStr "Part Two: " - print (partTwo input) + getInput <&> (id &&& mkState) >>= \(input, initialState) -> + evalPuzzle input initialState do + putStr "Part One: " + print =<< partOne + putStr "Part Two: " + print =<< partTwo -getInput :: IO [Int] -getInput = pure [0, 14, 1, 3, 7, 9] +getInput :: IO (NonEmpty Int) +getInput = fromList <$> parseInputAoC 2020 15 (commaSep posInt) + where + posInt = fromInteger <$> natural -partOne :: [Int] -> Int +partOne :: Puzzle (NonEmpty Int) PuzzleState Int partOne = memoryGame 2020 -partTwo :: [Int] -> Int -partTwo = memoryGame 30000000 - -memoryGame :: Int -> [Int] -> Int -memoryGame n input = - evalState memoryRound $ - (!! pred n) $ - iterate (execState memoryRound) (input, 1, IM.empty) - -memoryRound :: State ([Int], Int, IntMap Int) Int -memoryRound = - do - (input, now, seen) <- get - case input of - [] -> put ([0], now, seen) *> memoryRound - current : rest -> - case IM.lookup current seen of - Nothing -> - do - put (rest, now + 1, IM.insert current now seen) - pure current - Just before -> - do - put (now - before : rest, now + 1, IM.insert current now seen) - pure current +partTwo :: Puzzle (NonEmpty Int) PuzzleState Int +partTwo = memoryGame 30_000_000 + +memoryGame :: Int -> Puzzle (NonEmpty Int) PuzzleState Int +memoryGame n = loop <* (numbersToSay <~ ask) + where + loop = do + turn += 1 + number <- withPuzzle (const (max 1 (n `div` 100))) memoryRound + uses turn (== n) >>= bool loop (pure number) + +memoryRound :: Puzzle Int PuzzleState Int +memoryRound = do + number :| numbers <- use numbersToSay + uses spokenNumbers (IntMap.lookup number) >>= \case + Just before -> + numbersToSay <~ uses turn (subtract before >>> (:| numbers)) + Nothing -> + numbersToSay .= fromMaybe (0 :| []) (nonEmpty numbers) + say number + +say :: Int -> Puzzle Int PuzzleState Int +say number = + use turn >>= \i -> do + spokenNumbers %= IntMap.insert number i + m <- ask + when (i `mod` m == 0 || i `div` m >= 99) + $ $(logDebug) (fromString (printf "%d: %d" i number)) + pure number From d042adc8aa9625d47e4187eebcd12c75136439c8 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sun, 30 Nov 2025 22:16:18 -0600 Subject: [PATCH 66/91] refactor(2020.14-haskell): adopt advent-of-code-api --- VERSION | 2 +- input/2020/day14.txt | 572 --------------------- src/AdventOfCode/Year2020/Day14.hs | 93 ++-- src/AdventOfCode/Year2020/Day14/Parsers.hs | 29 +- src/AdventOfCode/Year2020/Day14/Types.hs | 15 +- 5 files changed, 67 insertions(+), 644 deletions(-) delete mode 100644 input/2020/day14.txt diff --git a/VERSION b/VERSION index 5141294..4cd16bc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.87 \ No newline at end of file +2024.7.2.88 \ No newline at end of file diff --git a/input/2020/day14.txt b/input/2020/day14.txt deleted file mode 100644 index 5693d3b..0000000 --- a/input/2020/day14.txt +++ /dev/null @@ -1,572 +0,0 @@ -mask = 101XX10X1X00001010011011X1XXX1001011 -mem[12898] = 4515455 -mem[39269] = 262864 -mem[15998] = 27 -mem[4565] = 896581 -mem[35263] = 872262 -mask = 110X1111000X000111001XX0110X010111XX -mem[5436] = 29453 -mem[405] = 4591187 -mem[36544] = 119659504 -mem[4590] = 1754617 -mask = 11001111000100XX11000000000XX0X0X001 -mem[18971] = 65392 -mem[12898] = 60445914 -mem[51566] = 8117 -mem[7267] = 99056 -mem[25605] = 978 -mem[33329] = 437436 -mask = 10X0X100X00000101X0X0001111111X101XX -mem[43594] = 7609 -mem[12898] = 126982257 -mem[15065] = 4039 -mask = 11XX11XX000100X10110111001101000X110 -mem[2358] = 139154 -mem[48424] = 361 -mask = X00X0X000101010111111000X11001000111 -mem[60868] = 1012242539 -mem[13504] = 114153 -mem[51015] = 34551413 -mem[43984] = 708156 -mem[58774] = 436301 -mem[15489] = 243282402 -mem[10963] = 81839 -mask = 1001000X1100001001001101XX01000001X0 -mem[63618] = 3428738 -mem[16270] = 289636637 -mem[45847] = 271443 -mem[38518] = 2789 -mask = X0010X000101X00111110010101010X001X1 -mem[56985] = 14253068 -mem[10578] = 869930 -mask = 10000100010100010X11X01X00X011010001 -mem[31893] = 32746 -mem[57677] = 1423 -mem[43667] = 94853349 -mem[7624] = 76941001 -mem[20508] = 1273351 -mask = 10XX00100011X0X0110XX1X10011XX111000 -mem[28963] = 125041 -mem[42777] = 251362 -mem[34873] = 155374451 -mem[29355] = 886081 -mem[16775] = 57795906 -mem[42311] = 10111 -mem[30652] = 4443965 -mask = 10000111XX000001X1X0X001011110X00111 -mem[31369] = 31024146 -mem[23234] = 1046769566 -mask = 00XX1010XX1X001011010111X11X1010011X -mem[20251] = 3138 -mem[23672] = 28276 -mem[48425] = 304 -mem[51384] = 6985 -mask = 110X011X00000001X100111001X010010X0X -mem[44366] = 985 -mem[47430] = 127814906 -mem[34576] = 41033794 -mem[58183] = 11571792 -mask = XX0001X0010100011X11101010000101X011 -mem[47311] = 897443 -mem[47179] = 457654457 -mask = X100X11100010X0XX10X1000X11001001100 -mem[57561] = 38620862 -mem[63945] = 78 -mem[37164] = 2722 -mask = 0000XXXX0011XX0XX1110010X10000111000 -mem[52440] = 14680631 -mem[10040] = 482410861 -mem[31369] = 1312217 -mask = 10X1X0001000X01111X01011100111111001 -mem[33657] = 127832235 -mem[59700] = 232182856 -mem[64183] = 32458630 -mem[13528] = 56706903 -mask = 00XX110X0X0XX00111010101X001110111X0 -mem[34491] = 23031313 -mem[16152] = 2473 -mem[46572] = 58257 -mask = 11X1011X00000001010XXX1010X10000X000 -mem[36932] = 54890 -mem[17249] = 518900642 -mem[58586] = 27068931 -mask = 1100011X0000X00111001000X00011X11001 -mem[4203] = 11690902 -mem[20122] = 399199895 -mem[32417] = 379534 -mem[50520] = 3253466 -mem[23645] = 12184122 -mask = 100000X00001010011X01011100X0010X010 -mem[59410] = 3462 -mem[51849] = 231731736 -mem[31141] = 17505 -mem[2661] = 20669501 -mem[57030] = 225241 -mem[37965] = 4947 -mem[37475] = 120 -mask = 10XX01110001000XX10001X0101111000011 -mem[54239] = 21386681 -mem[25423] = 49927683 -mem[17991] = 24735 -mem[26742] = 66457157 -mask = 10000100100X00100X011X11100X10100100 -mem[42442] = 2898 -mem[33841] = 98213928 -mem[1295] = 436390 -mem[20533] = 26130 -mask = 00X0001X000X000011001X1010000X101101 -mem[12898] = 85396 -mem[17781] = 96765096 -mem[23645] = 156257533 -mem[41542] = 25550 -mem[23694] = 19768 -mask = 00000000X0111101X11101110110X01X0001 -mem[30165] = 9659654 -mem[17417] = 840 -mem[38700] = 20540407 -mem[17514] = 266223622 -mask = 1X0X0X100001000011001000101X11X0XX11 -mem[1187] = 2633 -mem[49568] = 13636 -mem[41073] = 2493 -mem[42442] = 562308 -mask = 10000XXX0001000X1100010X111111000001 -mem[18887] = 22856 -mem[7241] = 580581 -mem[20501] = 15343308 -mem[8329] = 9182 -mem[30265] = 1720165 -mem[55589] = 56956 -mem[56070] = 99398329 -mask = 11X0111100010001X1X0101X0011X01XX1XX -mem[22677] = 289814 -mem[57909] = 24289535 -mem[2053] = 96654349 -mem[12868] = 30681 -mem[28491] = 26428 -mem[52407] = 644 -mem[26000] = 1537 -mask = 100001X11100X00X0110010X111X100X0110 -mem[61720] = 4504409 -mem[18231] = 20747971 -mem[7557] = 40802 -mem[8177] = 1825 -mem[16963] = 831395 -mem[58488] = 32600 -mask = 10000X001000001XX1XX101111X11X100XX1 -mem[23493] = 1676 -mem[14482] = 39198509 -mem[12119] = 277 -mem[34873] = 839193094 -mem[59700] = 213967901 -mem[44792] = 4486 -mask = 11101111XX0X00010X100X101XX100000X00 -mem[21304] = 749 -mem[17415] = 1039713731 -mem[56228] = 1653 -mask = 0000X0X000X1X000X1XXX01000100010100X -mem[54745] = 258440 -mem[9496] = 1382 -mem[677] = 160442786 -mem[18231] = 118264 -mem[3314] = 7774920 -mem[48978] = 58150 -mask = 11010X11000000X1110011100X001001X0X0 -mem[11295] = 1701 -mem[43085] = 35120466 -mem[36184] = 717214 -mem[11085] = 797499853 -mem[50040] = 100884 -mem[12868] = 76327 -mem[1094] = 17127824 -mask = X1X0111100000001X100100111101111X000 -mem[23009] = 56150703 -mem[62945] = 187456 -mem[16270] = 2148 -mem[6558] = 226 -mem[18104] = 116620 -mask = 1100111X000100010X0X1XX0111101X00X1X -mem[20277] = 41195 -mem[55507] = 497048 -mem[65060] = 1392113 -mem[39631] = 729 -mem[20012] = 221 -mem[38700] = 157 -mask = 1011110X1100001010XX01X111X111X01110 -mem[50095] = 329773464 -mem[19363] = 23694 -mem[23187] = 136735746 -mem[41305] = 248581 -mem[60810] = 36613 -mask = 11X1010000000001X00001X0010010111X10 -mem[23234] = 315410359 -mem[61681] = 3806597 -mem[57545] = 205794 -mem[8173] = 743124 -mem[33142] = 2265923 -mem[50325] = 338694 -mask = 11101XX10001X001X100101X0X11101000X0 -mem[10886] = 92 -mem[31621] = 49382572 -mem[40094] = 381691821 -mem[22404] = 25092613 -mem[26046] = 540575313 -mask = 1100X110000X000100X01X0X0X00X0X00001 -mem[6401] = 12044 -mem[51779] = 1254732 -mem[49213] = 14771072 -mask = 11001X1100X10X0111001110X10X0XX00100 -mem[17960] = 1810 -mem[58879] = 14547554 -mask = 10110010X01110X01101000101100X011X01 -mem[6271] = 43039 -mem[42035] = 308023 -mem[61809] = 14965999 -mem[14482] = 22965 -mask = 1000011111000X0X0110X111X1001XX00110 -mem[34865] = 521885574 -mem[32874] = 47758845 -mem[49758] = 486116428 -mem[4620] = 436 -mem[8795] = 37336 -mem[35355] = 1913 -mem[24155] = 5028 -mask = 100X00X100XXX0X011X111000001X00X1001 -mem[12898] = 326718882 -mem[41304] = 2217 -mem[512] = 252187 -mask = 00001X10X0111X0X01100010001010110011 -mem[17133] = 9763003 -mem[53861] = 20374202 -mem[12411] = 11146 -mem[44155] = 70710 -mem[18558] = 1014374 -mem[8244] = 27394 -mask = 1100111100010X0X110X10X1X1110X100100 -mem[6255] = 15673046 -mem[27448] = 617665 -mem[17549] = 1391 -mem[9254] = 1191392 -mask = 1110111X00010001X11XX110X01110100001 -mem[27269] = 915739 -mem[17886] = 2414578 -mem[23234] = 10312308 -mask = 1000111100010X01110X0101XX1010100001 -mem[14210] = 3945538 -mem[53570] = 152079 -mem[42311] = 804 -mem[20501] = 7528 -mem[62486] = 44029 -mask = 1X1X110X1X0X0010100001X111X11X10110X -mem[31020] = 10294 -mem[36367] = 173644419 -mem[3344] = 55087 -mem[22404] = 3768102 -mask = 0X000010000X00X01100XX1000110X001101 -mem[8146] = 32084685 -mem[25356] = 204754 -mem[53100] = 31087 -mem[16162] = 43271515 -mem[7495] = 248175354 -mask = 0X00111X000100000111000011000X11000X -mem[48425] = 16845 -mem[21120] = 5932031 -mem[18984] = 5971079 -mem[22024] = 1139029 -mem[57772] = 8264 -mask = 1000X1X111X00000011001001X01X1000X11 -mem[29416] = 214197264 -mem[23107] = 16163 -mem[35947] = 392 -mem[3969] = 18827505 -mask = 1X001111000XX10X1101110001X111100000 -mem[23664] = 824737 -mem[35051] = 6316 -mem[23107] = 3396 -mem[23133] = 93865 -mask = 101000100011X000110101010110XX01010X -mem[64539] = 503222475 -mem[49280] = 222415 -mem[4908] = 6056 -mask = X11011110001000111X000110X100X111101 -mem[63002] = 227835267 -mem[62736] = 2687 -mem[35355] = 13135677 -mem[30575] = 34622509 -mem[6958] = 8289 -mask = 1100111100X1X00111101011001110XXX011 -mem[38931] = 50025 -mem[5213] = 488636 -mem[16162] = 6370 -mem[49918] = 27948504 -mem[10972] = 32144736 -mem[25810] = 23808695 -mem[59308] = 573239 -mask = 1000001000X10X001100X011X01X11100X01 -mem[8119] = 1356 -mem[18765] = 16001283 -mem[40681] = 81290249 -mem[12898] = 1301 -mem[26361] = 20784743 -mem[27679] = 142542224 -mask = 101X001X001X00001X0X0110001X111X01X1 -mem[35355] = 805383617 -mem[61993] = 4078154 -mem[17549] = 1577966 -mem[5900] = 111957340 -mask = 0000001000010XX01X000000000100X10001 -mem[14482] = 203210 -mem[40789] = 103701945 -mem[60901] = 165096 -mem[9784] = 16634 -mem[58840] = 2959 -mask = 0X0000100001010XX1X0101X001X01X010XX -mem[35677] = 923584 -mem[38170] = 52214160 -mem[59710] = 917580 -mem[28352] = 9711 -mem[24738] = 527299 -mask = 111XX100100100X0XXX0010111011010100X -mem[48324] = 113818619 -mem[46099] = 22968630 -mem[2047] = 7513744 -mem[16084] = 22059 -mem[3484] = 7934120 -mask = 100001X00X01000111XX110010X1X0011X01 -mem[40970] = 582049676 -mem[43326] = 33149 -mem[28352] = 8866951 -mem[8571] = 5223 -mask = X10100100XX1000011001X00100011000010 -mem[57677] = 10736612 -mem[44008] = 27644 -mem[51849] = 54378 -mem[20005] = 5582059 -mem[23107] = 9832268 -mem[57561] = 40400 -mask = 11101111000X0001X10X10X10X1X10X010X0 -mem[29968] = 89927661 -mem[56] = 1989163 -mem[7557] = 17453 -mem[33361] = 9 -mem[43444] = 78638 -mem[12248] = 54497991 -mem[35709] = 2765740 -mask = 110XX1X00000000X0X00110000X0000001X0 -mem[34491] = 13649 -mem[26000] = 980 -mask = 0X0000100X010100X1X0X000010001100101 -mem[7504] = 2704 -mem[41073] = 22655 -mem[28507] = 9278213 -mem[21463] = 1475 -mem[63802] = 11330 -mask = 11001111000X0001X100X1001001101000X0 -mem[45847] = 1029083 -mem[52359] = 87173 -mem[7504] = 205315899 -mem[37731] = 657 -mem[41396] = 1027 -mask = X001X0100XX10X1011X10X010000001111X1 -mem[29618] = 14034335 -mem[7831] = 1455 -mem[28409] = 26087196 -mask = X000001000010X0011001X1XX010XXX011X1 -mem[49280] = 816038 -mem[53410] = 632054 -mem[25605] = 2170 -mem[47742] = 449847 -mem[7056] = 13776253 -mem[12256] = 722 -mask = 110X11X100010001X10010X0X01010100100 -mem[63043] = 7807913 -mem[57885] = 230082055 -mem[50315] = 27089695 -mem[64722] = 54151 -mem[19735] = 978866 -mem[41391] = 9015641 -mem[50548] = 96572794 -mask = 100X00X0XX0000X1110X10111011111000X1 -mem[61760] = 5688555 -mem[18595] = 4630 -mem[41305] = 1670 -mem[25605] = 472094 -mem[50759] = 28261157 -mask = 00XXX1X0010100011XX1011010X0010100XX -mem[16270] = 7874 -mem[63561] = 49551173 -mem[43150] = 11196 -mem[18504] = 18360154 -mask = 1X0101X1000000X111001X100X0011010101 -mem[1825] = 2048695 -mem[26563] = 66443 -mem[22477] = 2539322 -mem[59104] = 1269245 -mem[50554] = 3370 -mem[7797] = 300 -mask = 1000000XX0000X11010X11111X011010X011 -mem[61720] = 700175 -mem[37943] = 41662 -mem[3405] = 441992426 -mask = X0XX0X001X00001001000111110110XX0110 -mem[45473] = 1830 -mem[35940] = 16393 -mem[44793] = 10545068 -mem[23107] = 145304756 -mem[48096] = 480559528 -mem[57539] = 97582237 -mem[64518] = 60543 -mask = 10X00100010100X1X01XX0X000010101011X -mem[14210] = 200447 -mem[26703] = 46292 -mem[42748] = 7946 -mem[11664] = 7633363 -mask = X00X010001010X01XX11X0101X0X01000X01 -mem[40269] = 357709 -mem[36823] = 14385170 -mem[52568] = 522064310 -mem[41363] = 389730 -mem[4127] = 2285054 -mask = 1010110010000010X000XX111011100X01XX -mem[19072] = 49597375 -mem[32473] = 7622 -mem[1916] = 9685106 -mem[10040] = 16339629 -mem[10795] = 25165351 -mem[16634] = 508779 -mem[16084] = 232615 -mask = 11XX1111X001XX0111000010X0110100X111 -mem[44372] = 11010 -mem[58030] = 5106 -mem[15235] = 24371 -mem[41578] = 3641535 -mask = 110000X000000X01X0X0X01X1X0100001011 -mem[64968] = 1528 -mem[21183] = 429276 -mem[51816] = 60726 -mem[12248] = 87748 -mask = X0001111000000011100101X10111100X11X -mem[39612] = 57230 -mem[33329] = 35880 -mem[15681] = 27569 -mem[51326] = 237622439 -mem[36099] = 48369 -mem[58183] = 726 -mem[38471] = 2690 -mask = 11X011110X01000X0100X0X0X000X01X01X0 -mem[41793] = 519002787 -mem[39290] = 5821 -mask = 000X00100001XX00X1000000X1XX10010110 -mem[36367] = 1347261 -mem[52040] = 858329 -mem[60969] = 14183 -mem[49232] = 3014091 -mask = X000X01X000101XX1100X11001X00000100X -mem[61397] = 9063 -mem[63395] = 92917 -mem[47750] = 6587 -mem[13695] = 2038 -mem[52876] = 219355 -mem[50726] = 815351 -mask = 11X0X111000100011100100X0X11X1X011XX -mem[24438] = 360143 -mem[14268] = 233280 -mem[46071] = 14590 -mem[47430] = 195019 -mem[8714] = 5003481 -mem[34758] = 866985 -mask = 10000X00XX010101101X1X111001X0001110 -mem[12826] = 369283 -mem[33546] = 519165 -mem[34578] = 12340 -mem[13504] = 301264250 -mem[4433] = 26315015 -mask = X0X011X000X100X001110100000XX011100X -mem[10779] = 6427 -mem[62591] = 124867728 -mem[4073] = 26086825 -mem[19735] = 14280934 -mem[40681] = 54398576 -mem[44232] = 1164302 -mem[5734] = 677248729 -mask = 1000XX0X11000010X100X01011011X1001X1 -mem[55680] = 6971988 -mem[4565] = 1361280 -mem[35316] = 2209 -mem[40546] = 758 -mem[47381] = 49216 -mask = 000000100XX10101X10X10000XX1X01X0100 -mem[57507] = 477326 -mem[58729] = 256151738 -mem[47689] = 16875625 -mask = 0000001000010X00X100100X0X0X0X00010X -mem[58893] = 531598 -mem[56609] = 1534 -mem[793] = 3558686 -mem[17811] = 31042 -mem[41552] = 73028105 -mem[12657] = 1035597401 -mask = 110011100000000101001XX00101X0000X00 -mem[18971] = 81961737 -mem[58641] = 685839 -mem[58774] = 51830284 -mem[50554] = 190835154 -mask = 1010X100000000101X00100X1110X0001X01 -mem[10630] = 11281616 -mem[30301] = 344 -mem[21809] = 66389352 -mem[15829] = 3924744 -mem[50602] = 546681 -mem[33142] = 153438 -mask = 0X000010000X010X111X01X11110111X10X0 -mem[32309] = 1315 -mem[59481] = 404 -mem[13793] = 2029 -mem[41406] = 2393 -mem[7495] = 24826836 -mem[61576] = 9555003 -mask = 00000100X10X010111111X0010X111010010 -mem[6662] = 15689063 -mem[1130] = 182923358 -mem[6648] = 3538 -mem[8833] = 7984 -mem[7495] = 8285851 -mask = 11000X1X00XX000100X01X0X01X11X000000 -mem[34270] = 180307825 -mem[36097] = 712 -mem[47750] = 843753 -mem[44800] = 247708 -mem[48331] = 31912 -mask = 0001000001010101XX1X1X1X011X1000011X -mem[15235] = 491 -mem[47685] = 775 -mem[52882] = 99948 -mem[32016] = 395727 -mask = 100000010XX0XX00X101X10000X110X01000 -mem[49801] = 230387797 -mem[55855] = 7808 -mem[39291] = 114525 -mem[50759] = 2588 -mem[31793] = 19374 -mask = 10XX11X000010X00X1X1XX010011011110X1 -mem[45068] = 763282 -mem[31165] = 43188 -mem[25684] = 1041033 -mem[52456] = 32196 -mask = 1100X1XXX001X00111X0110X0X101010X101 -mem[59821] = 6610 -mem[57397] = 67932 -mem[15240] = 505977952 -mask = 100X001XX0X1X00011010100X0110000X001 -mem[22585] = 2024050 -mem[30527] = 79580709 -mem[57425] = 7597579 -mem[49280] = 47528262 -mask = 1X00XX1X000X0001110011X010X111000001 -mem[45847] = 207968 -mem[12898] = 69230005 -mem[18887] = 433691609 -mem[7495] = 114085080 -mem[8177] = 105183315 -mem[9561] = 1468259 -mem[38679] = 7998 diff --git a/src/AdventOfCode/Year2020/Day14.hs b/src/AdventOfCode/Year2020/Day14.hs index 23d3668..26f5b29 100644 --- a/src/AdventOfCode/Year2020/Day14.hs +++ b/src/AdventOfCode/Year2020/Day14.hs @@ -1,64 +1,53 @@ +{-# LANGUAGE BlockArguments #-} {-# LANGUAGE LambdaCase #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2020.Day14 where -import AdventOfCode.Input (parseInput) -import AdventOfCode.TH (inputFilePath) +import AdventOfCode.Input (parseInputAoC) +import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Year2020.Day14.Parsers import AdventOfCode.Year2020.Day14.Types -import Control.Applicative (some) -import Control.Lens -import Control.Monad.State (State, execState, gets) +import Control.Lens (ifoldl', ifoldlM, modifying, uses, (%=), (.=)) import Data.Bits (clearBit, setBit) import Data.IntMap qualified as IM +import Relude main :: IO () -main = - do - input <- getInput - putStr "Part One: " - print $ partOne input - putStr "Part Two: " - print $ partTwo input +main = $(defaultMainPuzzle) getInput :: IO [Instruction] -getInput = parseInput (some instruction) $(inputFilePath) - -partOne :: [Instruction] -> Int -partOne = execProgram runInstructionV1 - -runInstructionV1 :: Instruction -> State ProgState () -runInstructionV1 (SetMask newMask) = mask .= newMask -runInstructionV1 (SetValue addr val) = - do - newVal <- gets (applyMaskV1 val <$> view mask) - memory %= IM.insert addr newVal - -applyMaskV1 :: Int -> [Maybe Bool] -> Int -applyMaskV1 = ifoldl' $ \i x -> \case - Nothing -> x - Just False -> x `clearBit` i - Just True -> x `setBit` i - -partTwo :: [Instruction] -> Int -partTwo = execProgram runInstructionV2 - -runInstructionV2 :: Instruction -> State ProgState () -runInstructionV2 (SetMask newMask) = mask .= newMask -runInstructionV2 (SetValue addr val) = - do - addresses <- gets (applyMaskV2 addr <$> view mask) - mapM_ ((memory %=) . flip IM.insert val) addresses - -applyMaskV2 :: Int -> [Maybe Bool] -> [Int] -applyMaskV2 = ifoldlM $ \i x -> \case - Nothing -> [x `clearBit` i, x `setBit` i] - Just False -> [x] - Just True -> [x `setBit` i] - -execProgram :: (Instruction -> State ProgState ()) -> [Instruction] -> Int -execProgram runInstruction instructions = - execState (mapM_ runInstruction instructions) initialState ^. memory & sum - -initialState :: ProgState -initialState = ProgState [] IM.empty +getInput = parseInputAoC 2020 14 (some instruction) + +partOne :: Program Int +partOne = execProgram runInstruction + where + runInstruction (SetMask newMask) = mask .= newMask + runInstruction (SetValue addr val) = + uses mask (applyMask val) + >>= modifying memory + . IM.insert addr + + applyMask = ifoldl' \i x -> \case + Nothing -> x + Just False -> x `clearBit` i + Just True -> x `setBit` i + +partTwo :: Program Int +partTwo = execProgram runInstruction + where + runInstruction (SetMask newMask) = mask .= newMask + runInstruction (SetValue encodedAddress val) = + uses mask (applyMask encodedAddress) >>= mapM_ \addr -> do + memory %= IM.insert addr val + + applyMask = ifoldlM \i x -> \case + Nothing -> [x `clearBit` i, x `setBit` i] + Just False -> [x] + Just True -> [x `setBit` i] + +execProgram :: (Instruction -> Program ()) -> Program Int +execProgram runInstruction = do + put mempty + ask >>= mapM_ runInstruction + uses memory sum diff --git a/src/AdventOfCode/Year2020/Day14/Parsers.hs b/src/AdventOfCode/Year2020/Day14/Parsers.hs index 6a67e87..a7b5ff0 100644 --- a/src/AdventOfCode/Year2020/Day14/Parsers.hs +++ b/src/AdventOfCode/Year2020/Day14/Parsers.hs @@ -1,21 +1,21 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2020.Day14.Parsers where import AdventOfCode.Year2020.Day14.Types -import Control.Applicative ((<|>)) -import Control.Monad (void) -import Text.Trifecta +import Relude +import Text.Trifecta (Parser, brackets, char, choice, natural, symbol, token) instruction :: Parser Instruction instruction = setMask <|> setValue setMask :: Parser Instruction setMask = - do - void $ symbol "mask" - void $ symbol "=" - maskBits <- reverse <$> many maskBit - void whiteSpace - pure (SetMask maskBits) + fmap SetMask + $ symbol "mask" + *> symbol "=" + *> token (many maskBit) + <&> reverse maskBit :: Parser (Maybe Bool) maskBit = @@ -26,10 +26,7 @@ maskBit = ] setValue :: Parser Instruction -setValue = - do - void $ symbol "mem" - address <- between (symbol "[") (symbol "]") (fromInteger <$> natural) - void $ symbol "=" - value <- fromInteger <$> natural - pure $ SetValue address value +setValue = do + address <- symbol "mem" *> brackets (fromInteger <$> natural) + value <- symbol "=" *> natural <&> fromInteger + pure $ SetValue address value diff --git a/src/AdventOfCode/Year2020/Day14/Types.hs b/src/AdventOfCode/Year2020/Day14/Types.hs index eee7629..b9d075c 100644 --- a/src/AdventOfCode/Year2020/Day14/Types.hs +++ b/src/AdventOfCode/Year2020/Day14/Types.hs @@ -1,14 +1,21 @@ -{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE DerivingVia #-} +{-# LANGUAGE StrictData #-} +{-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2020.Day14.Types where +import AdventOfCode.Puzzle import Control.Lens (makeLenses) -import Data.IntMap (IntMap) +import Generic.Data (Generically (..)) +import Relude +import Text.Show qualified data ProgState = ProgState { _mask :: [Maybe Bool], _memory :: IntMap Int } + deriving (Eq, Generic) + deriving (Semigroup, Monoid) via (Generically ProgState) makeLenses ''ProgState @@ -23,6 +30,8 @@ instance Show Instruction where Nothing -> 'X' Just True -> '1' Just False -> '0' - | bit <- reverse bits + | bit <- reverse bits ] show (SetValue addr val) = "mem[" <> show addr <> "] = " <> show val + +type Program = Puzzle [Instruction] ProgState From e2432dfdc6cef12b1a2c9248059e38a573d85cbc Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sun, 30 Nov 2025 23:56:47 -0600 Subject: [PATCH 67/91] fix(2020.15-haskell): reset state between parts --- VERSION | 2 +- src/AdventOfCode/Year2020/Day15.hs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 4cd16bc..4d56526 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.88 \ No newline at end of file +2024.7.2.89 \ No newline at end of file diff --git a/src/AdventOfCode/Year2020/Day15.hs b/src/AdventOfCode/Year2020/Day15.hs index 2f1360b..fcb7a28 100644 --- a/src/AdventOfCode/Year2020/Day15.hs +++ b/src/AdventOfCode/Year2020/Day15.hs @@ -53,8 +53,9 @@ partTwo :: Puzzle (NonEmpty Int) PuzzleState Int partTwo = memoryGame 30_000_000 memoryGame :: Int -> Puzzle (NonEmpty Int) PuzzleState Int -memoryGame n = loop <* (numbersToSay <~ ask) +memoryGame n = resetState *> loop where + resetState = put . mkState =<< ask loop = do turn += 1 number <- withPuzzle (const (max 1 (n `div` 100))) memoryRound From 23212ac5b568678ce9efbd422394c7fdac5e0b7c Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Mon, 1 Dec 2025 00:15:30 -0600 Subject: [PATCH 68/91] refactor(2020.13-haskell): adopt advent-of-code-api [ci skip] --- VERSION | 2 +- input/2020/day13.txt | 2 - src/AdventOfCode/Year2020/Day13.hs | 60 +++++++++++++++--------------- 3 files changed, 32 insertions(+), 32 deletions(-) delete mode 100644 input/2020/day13.txt diff --git a/VERSION b/VERSION index 4d56526..780f7b3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.89 \ No newline at end of file +2024.7.2.91 \ No newline at end of file diff --git a/input/2020/day13.txt b/input/2020/day13.txt deleted file mode 100644 index 5aa483a..0000000 --- a/input/2020/day13.txt +++ /dev/null @@ -1,2 +0,0 @@ -1013728 -23,x,x,x,x,x,x,x,x,x,x,x,x,41,x,x,x,x,x,x,x,x,x,733,x,x,x,x,x,x,x,x,x,x,x,x,13,17,x,x,x,x,19,x,x,x,x,x,x,x,x,x,29,x,449,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,37 diff --git a/src/AdventOfCode/Year2020/Day13.hs b/src/AdventOfCode/Year2020/Day13.hs index 55855d6..b4a55a7 100644 --- a/src/AdventOfCode/Year2020/Day13.hs +++ b/src/AdventOfCode/Year2020/Day13.hs @@ -1,41 +1,43 @@ +{-# LANGUAGE NoImplicitPrelude #-} + module AdventOfCode.Year2020.Day13 where -import AdventOfCode.Input (parseInput, parseString) -import AdventOfCode.TH (defaultMain, inputFilePath) -import Control.Applicative ((<|>)) +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) import Data.List.Extra (minimumOn) -import Data.Maybe (catMaybes, mapMaybe) +import Relude import Text.Trifecta (Parser, char, commaSep, decimal, newline) +import Prelude (until) main :: IO () -main = $(defaultMain) - -partOne :: (Integer, [Maybe Integer]) -> Integer -partOne (timestamp, busIDs) = - uncurry (*) $ - minimumOn snd $ - [ (busID, wait) - | busID <- catMaybes busIDs, - let wait = busID - (timestamp `mod` busID) - ] - -partTwo :: (Integer, [Maybe Integer]) -> Integer -partTwo (_, busIDs) = - fst $ - foldl' go (0, 1) $ - mapMaybe (uncurry ((<$>) . (,))) $ - zip [0 ..] busIDs +main = $(defaultMainPuzzle) + +partOne :: SimplePuzzle (Integer, [Maybe Integer]) Integer +partOne = + ask <&> \(timestamp, busIDs) -> + uncurry (*) + $ minimumOn snd + $ [ (busID, wait) + | busID <- catMaybes busIDs, + let wait = busID - (timestamp `mod` busID) + ] + +partTwo :: SimplePuzzle (Integer, [Maybe Integer]) Integer +partTwo = + asks snd + <&> fst + . foldl' go (0, 1) + . catMaybes + . zipWith (fmap . (,)) [0 ..] where - go (base, step) (offset, busID) = (base', step * busID) - where - base' = - until - (\timestamp -> (timestamp + offset) `mod` busID == 0) - (+ step) - base + go (base, step) (offset, busID) = + ( until ((== 0) . (`mod` busID) . (+ offset)) (+ step) base, + step * busID + ) getInput :: IO (Integer, [Maybe Integer]) -getInput = parseInput notes $(inputFilePath) +getInput = parseInputAoC 2020 13 notes notes :: Parser (Integer, [Maybe Integer]) notes = From adfbe6f84505d15f946358cdda1174a0f89c7d4a Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 2 Dec 2025 23:08:29 -0600 Subject: [PATCH 69/91] feat(2025-01/haskell): solve Part One --- VERSION | 2 +- package.yaml | 3 +++ src/AdventOfCode/Year2025/Day01.hs | 43 ++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/AdventOfCode/Year2025/Day01.hs diff --git a/VERSION b/VERSION index 780f7b3..f614bfb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2024.7.2.91 \ No newline at end of file +2025.1.1.0 \ No newline at end of file diff --git a/package.yaml b/package.yaml index db8d100..e9c6a02 100644 --- a/package.yaml +++ b/package.yaml @@ -599,6 +599,9 @@ executables: aoc-2024-day07: <<: *executable main: AdventOfCode.Year2024.Day07 + aoc-2025-day01: + <<: *executable + main: AdventOfCode.Year2025.Day01 _benchmark: &benchmark ghc-options: - -threaded diff --git a/src/AdventOfCode/Year2025/Day01.hs b/src/AdventOfCode/Year2025/Day01.hs new file mode 100644 index 0000000..59538c4 --- /dev/null +++ b/src/AdventOfCode/Year2025/Day01.hs @@ -0,0 +1,43 @@ +{-# LANGUAGE NoImplicitPrelude #-} + +module AdventOfCode.Year2025.Day01 where + +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import AdventOfCode.Util (count) +import Relude +import Text.Trifecta (Parser, char, decimal, newline, sepEndBy) + +main :: IO () +main = $(defaultMainPuzzle) + +partOne :: SimplePuzzle [Integer] Int +partOne = asks (count (== 0) . scanl' rotate 50) + where + rotate delta position = (position + delta) `mod` 100 + +partTwo :: SimplePuzzle [Integer] Int +partTwo = fail "Not yet implemented" + +getInput :: IO [Integer] +getInput = parseInputAoC 2025 1 (rotation `sepEndBy` newline) + +getExample :: IO [Integer] +getExample = parseString (rotation `sepEndBy` newline) example + +example :: String +example = + "L68\n\ + \L30\n\ + \R48\n\ + \L5\n\ + \R60\n\ + \L55\n\ + \L1\n\ + \L99\n\ + \R14\n\ + \L82" + +rotation :: Parser Integer +rotation = (negate <$ char 'L' <*> decimal) <|> (char 'R' *> decimal) From d744f32ac604f8a94cc227f3f58e88ce0b619a38 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 2 Dec 2025 23:11:25 -0600 Subject: [PATCH 70/91] feat(2025-01/haskell): solve Part Two --- VERSION | 2 +- src/AdventOfCode/Year2025/Day01.hs | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/VERSION b/VERSION index f614bfb..5333867 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.1.1.0 \ No newline at end of file +2025.1.2.0 \ No newline at end of file diff --git a/src/AdventOfCode/Year2025/Day01.hs b/src/AdventOfCode/Year2025/Day01.hs index 59538c4..eb33d33 100644 --- a/src/AdventOfCode/Year2025/Day01.hs +++ b/src/AdventOfCode/Year2025/Day01.hs @@ -6,6 +6,7 @@ import AdventOfCode.Input (parseInputAoC, parseString) import AdventOfCode.Puzzle import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (count) +import Foreign (fromBool) import Relude import Text.Trifecta (Parser, char, decimal, newline, sepEndBy) @@ -17,8 +18,16 @@ partOne = asks (count (== 0) . scanl' rotate 50) where rotate delta position = (position + delta) `mod` 100 -partTwo :: SimplePuzzle [Integer] Int -partTwo = fail "Not yet implemented" +partTwo :: SimplePuzzle [Integer] Integer +partTwo = asks (sum . snd . mapAccumL rotate 50) + where + rotate position delta = (m, zeros) + where + (d, m) = (position + delta) `divMod` 100 + zeros + | delta > 0 = d + | m == 0 = abs d + 1 + | otherwise = abs d - fromBool (position == 0) getInput :: IO [Integer] getInput = parseInputAoC 2025 1 (rotation `sepEndBy` newline) From c74a509431a2939f27fe632a5942e2b3fb68487b Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 2 Dec 2025 23:52:30 -0600 Subject: [PATCH 71/91] feat(2025-02/haskell): solve Part One --- VERSION | 2 +- package.yaml | 5 ++++ src/AdventOfCode/Year2025/Day02.hs | 44 ++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/AdventOfCode/Year2025/Day02.hs diff --git a/VERSION b/VERSION index 5333867..5653839 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.1.2.0 \ No newline at end of file +2025.2.1.0 \ No newline at end of file diff --git a/package.yaml b/package.yaml index e9c6a02..8793968 100644 --- a/package.yaml +++ b/package.yaml @@ -602,6 +602,11 @@ executables: aoc-2025-day01: <<: *executable main: AdventOfCode.Year2025.Day01 + aoc-2025-day02: + <<: *executable + main: AdventOfCode.Year2025.Day02 + dependencies: + - fast-digits _benchmark: &benchmark ghc-options: - -threaded diff --git a/src/AdventOfCode/Year2025/Day02.hs b/src/AdventOfCode/Year2025/Day02.hs new file mode 100644 index 0000000..4f95083 --- /dev/null +++ b/src/AdventOfCode/Year2025/Day02.hs @@ -0,0 +1,44 @@ +{-# LANGUAGE NoImplicitPrelude #-} + +module AdventOfCode.Year2025.Day02 where + +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import AdventOfCode.Util (numDigits) +import Data.FastDigits (digits) +import Data.Ix (range) +import Data.List.Extra (sumOn') +import Relude +import Text.Trifecta (Parser, char, commaSep, natural) + +idRange :: Parser (Integer, Integer) +idRange = (,) <$> natural <* char '-' <*> natural + +getExample :: IO [(Integer, Integer)] +getExample = parseString (commaSep idRange) example + +example :: String +example = + "11-22,95-115,998-1012,1188511880-1188511890,222220-222224,\ + \1698522-1698528,446443-446449,38593856-38593862,565653-565659,\ + \824824821-824824827,2121212118-2121212124" + +getInput :: IO [(Integer, Integer)] +getInput = parseInputAoC 2025 2 (commaSep idRange) + +partOne :: SimplePuzzle [(Integer, Integer)] Integer +partOne = asks (sumOn' (sum . filter isA020338 . range)) + +-- https://oeis.org/A020338 +isA020338 :: Integer -> Bool +isA020338 n = {- n > 0 && -} even k && low == high + where + k = numDigits n + (low, high) = splitAt (k `div` 2) (digits 10 n) + +partTwo :: SimplePuzzle [(Integer, Integer)] Integer +partTwo = fail "not yet implemented" + +main :: IO () +main = $(defaultMainPuzzle) From c2b73a71dfd658685384ee3104033dc765907b1d Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 3 Dec 2025 00:59:22 -0600 Subject: [PATCH 72/91] feat(2025-02/haskell): solve Part Two --- VERSION | 2 +- src/AdventOfCode/Year2025/Day02.hs | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/VERSION b/VERSION index 5653839..5ea9df0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.2.1.0 \ No newline at end of file +2025.2.2.0 \ No newline at end of file diff --git a/src/AdventOfCode/Year2025/Day02.hs b/src/AdventOfCode/Year2025/Day02.hs index 4f95083..787018c 100644 --- a/src/AdventOfCode/Year2025/Day02.hs +++ b/src/AdventOfCode/Year2025/Day02.hs @@ -8,7 +8,7 @@ import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (numDigits) import Data.FastDigits (digits) import Data.Ix (range) -import Data.List.Extra (sumOn') +import Data.List.Extra (chunksOf, sumOn') import Relude import Text.Trifecta (Parser, char, commaSep, natural) @@ -38,7 +38,16 @@ isA020338 n = {- n > 0 && -} even k && low == high (low, high) = splitAt (k `div` 2) (digits 10 n) partTwo :: SimplePuzzle [(Integer, Integer)] Integer -partTwo = fail "not yet implemented" +partTwo = asks (sumOn' (sum . filter isRepeatedSequence . range)) + +isRepeatedSequence :: Integer -> Bool +isRepeatedSequence n = len >= 2 && any isRepeated lengths + where + len = numDigits n + lengths = filter ((0 ==) . mod len) [1 .. len `div` 2] + isRepeated k = + let (ds, rest) = splitAt k (digits 10 n) + in all (== ds) (chunksOf k rest) main :: IO () main = $(defaultMainPuzzle) From 5e84b30c1508f6ec782ea9a94ce26f714c11e357 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 3 Dec 2025 03:43:09 -0600 Subject: [PATCH 73/91] feat(2025-03/haskell): solve Part One --- VERSION | 2 +- package.yaml | 3 +++ src/AdventOfCode/Year2025/Day03.hs | 42 ++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 src/AdventOfCode/Year2025/Day03.hs diff --git a/VERSION b/VERSION index 5ea9df0..c1f8651 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.2.2.0 \ No newline at end of file +2025.3.1.0 \ No newline at end of file diff --git a/package.yaml b/package.yaml index 8793968..4b4f038 100644 --- a/package.yaml +++ b/package.yaml @@ -607,6 +607,9 @@ executables: main: AdventOfCode.Year2025.Day02 dependencies: - fast-digits + aoc-2025-day03: + <<: *executable + main: AdventOfCode.Year2025.Day03 _benchmark: &benchmark ghc-options: - -threaded diff --git a/src/AdventOfCode/Year2025/Day03.hs b/src/AdventOfCode/Year2025/Day03.hs new file mode 100644 index 0000000..9032d0f --- /dev/null +++ b/src/AdventOfCode/Year2025/Day03.hs @@ -0,0 +1,42 @@ +{-# LANGUAGE NoImplicitPrelude #-} + +module AdventOfCode.Year2025.Day03 where + +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import AdventOfCode.Util (maybeFail, (<.>)) +import Data.Char (digitToInt) +import Data.Foldable (maximum) +import Relude +import Text.Trifecta (digit, newline, sepEndBy) + +getExample :: IO [[Int]] +getExample = parseString (some (digitToInt <$> digit) `sepEndBy` newline) example + +example :: String +example = + "987654321111111\n\ + \811111111111119\n\ + \234234234234278\n\ + \818181911112111" + +largestPair :: [Int] -> Maybe Int +largestPair bank = + viaNonEmpty tail (scanr1 max bank) <&> \oneses -> + maximum (zipWith (\tens ones -> 10 * tens + ones) bank oneses) + +partOne :: SimplePuzzle [[Int]] Int +partOne = ask >>= maybeFail "ope!" . sum <.> traverse largestPair + +getInput :: IO [[Int]] +getInput = + parseInputAoC 2025 3 + $ some (digitToInt <$> digit) + `sepEndBy` newline + +partTwo :: SimplePuzzle [[Int]] () +partTwo = fail "not yet implemented" + +main :: IO () +main = $(defaultMainPuzzle) From 1ca0039f0f52e40d686df2273d9c115dba9447ea Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 3 Dec 2025 05:43:22 -0600 Subject: [PATCH 74/91] feat(2025-03/haskell): solve Part Two for the example --- VERSION | 2 +- src/AdventOfCode/Year2025/Day03.hs | 25 ++++++++++++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/VERSION b/VERSION index c1f8651..1a1ddd2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.3.1.0 \ No newline at end of file +2025.3.2.0 \ No newline at end of file diff --git a/src/AdventOfCode/Year2025/Day03.hs b/src/AdventOfCode/Year2025/Day03.hs index 9032d0f..f4d1505 100644 --- a/src/AdventOfCode/Year2025/Day03.hs +++ b/src/AdventOfCode/Year2025/Day03.hs @@ -8,11 +8,15 @@ import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (maybeFail, (<.>)) import Data.Char (digitToInt) import Data.Foldable (maximum) +import Data.Semigroup (Max (..)) import Relude import Text.Trifecta (digit, newline, sepEndBy) getExample :: IO [[Int]] -getExample = parseString (some (digitToInt <$> digit) `sepEndBy` newline) example +getExample = + flip parseString example + $ some (digitToInt <$> digit) + `sepEndBy` newline example :: String example = @@ -35,8 +39,23 @@ getInput = $ some (digitToInt <$> digit) `sepEndBy` newline -partTwo :: SimplePuzzle [[Int]] () -partTwo = fail "not yet implemented" +largestNumber :: Int -> [Int] -> Maybe Int +largestNumber k bank + | k <= 0 = Nothing + | otherwise = getMax <$> go k bank + where + go 1 xs = Just (Max (maximum xs)) + go n xs = + case uncons xs of + Nothing -> Nothing + Just (_, []) -> Nothing + Just (d, ds) -> + let candidate = (Max d * 10 ^ (n - 1) +) <$> go (n - 1) ds + nextCandidate = go n ds + in candidate <> nextCandidate + +partTwo :: SimplePuzzle [[Int]] Int +partTwo = ask >>= maybeFail "ope!" . sum <.> traverse (largestNumber 12) main :: IO () main = $(defaultMainPuzzle) From 64192e2f047d06afa2d01624cfe91ac69956ebfa Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 3 Dec 2025 23:36:18 -0600 Subject: [PATCH 75/91] fix(2025-03/haskell): solve Parts One and Two efficiently --- VERSION | 2 +- package.yaml | 2 + src/AdventOfCode/Year2025/Day03.hs | 62 ++++++++++++++---------------- 3 files changed, 32 insertions(+), 34 deletions(-) diff --git a/VERSION b/VERSION index 1a1ddd2..7781447 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.3.2.0 \ No newline at end of file +2025.3.2.1 \ No newline at end of file diff --git a/package.yaml b/package.yaml index 4b4f038..34b4c31 100644 --- a/package.yaml +++ b/package.yaml @@ -610,6 +610,8 @@ executables: aoc-2025-day03: <<: *executable main: AdventOfCode.Year2025.Day03 + dependencies: + - vector _benchmark: &benchmark ghc-options: - -threaded diff --git a/src/AdventOfCode/Year2025/Day03.hs b/src/AdventOfCode/Year2025/Day03.hs index f4d1505..b3ca5f2 100644 --- a/src/AdventOfCode/Year2025/Day03.hs +++ b/src/AdventOfCode/Year2025/Day03.hs @@ -5,18 +5,17 @@ module AdventOfCode.Year2025.Day03 where import AdventOfCode.Input (parseInputAoC, parseString) import AdventOfCode.Puzzle import AdventOfCode.TH (defaultMainPuzzle) -import AdventOfCode.Util (maybeFail, (<.>)) +import AdventOfCode.Util (maybeFail) import Data.Char (digitToInt) -import Data.Foldable (maximum) -import Data.Semigroup (Max (..)) +import Data.Vector qualified as Vector import Relude -import Text.Trifecta (digit, newline, sepEndBy) +import Text.Trifecta (Parser, digit, newline, sepEndBy) getExample :: IO [[Int]] -getExample = - flip parseString example - $ some (digitToInt <$> digit) - `sepEndBy` newline +getExample = parseString joltageRatings example + +joltageRatings :: Parser [[Int]] +joltageRatings = some (digitToInt <$> digit) `sepEndBy` newline example :: String example = @@ -25,37 +24,34 @@ example = \234234234234278\n\ \818181911112111" -largestPair :: [Int] -> Maybe Int -largestPair bank = - viaNonEmpty tail (scanr1 max bank) <&> \oneses -> - maximum (zipWith (\tens ones -> 10 * tens + ones) bank oneses) +largestPossibleJoltage :: Int -> [Int] -> Maybe Int +largestPossibleJoltage 0 _bank = Nothing +largestPossibleJoltage n bank = go n 0 (Vector.fromList bank) + where + go 0 number _ = Just number + go k number ds + | Vector.null ds = Nothing -- length ds + 1 <= k = Nothing + | otherwise = do + let d = Vector.maximum (Vector.take (Vector.length ds - k + 1) ds) + i <- Vector.elemIndex d ds + go (k - 1) (number * 10 + d) (Vector.drop (i + 1) ds) partOne :: SimplePuzzle [[Int]] Int -partOne = ask >>= maybeFail "ope!" . sum <.> traverse largestPair +partOne = + maybeFail "some bank had fewer than two batteries" + . fmap sum + . traverse (largestPossibleJoltage 2) + =<< ask getInput :: IO [[Int]] -getInput = - parseInputAoC 2025 3 - $ some (digitToInt <$> digit) - `sepEndBy` newline - -largestNumber :: Int -> [Int] -> Maybe Int -largestNumber k bank - | k <= 0 = Nothing - | otherwise = getMax <$> go k bank - where - go 1 xs = Just (Max (maximum xs)) - go n xs = - case uncons xs of - Nothing -> Nothing - Just (_, []) -> Nothing - Just (d, ds) -> - let candidate = (Max d * 10 ^ (n - 1) +) <$> go (n - 1) ds - nextCandidate = go n ds - in candidate <> nextCandidate +getInput = parseInputAoC 2025 3 joltageRatings partTwo :: SimplePuzzle [[Int]] Int -partTwo = ask >>= maybeFail "ope!" . sum <.> traverse (largestNumber 12) +partTwo = + maybeFail "some bank had fewer than two batteries" + . fmap sum + . traverse (largestPossibleJoltage 12) + =<< ask main :: IO () main = $(defaultMainPuzzle) From 88c2a98201ff4baa9dd834b98ceb3c234cdfa156 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 4 Dec 2025 00:40:08 -0600 Subject: [PATCH 76/91] fix(2025-04/haskell): start Part One --- VERSION | 2 +- package.yaml | 5 +++ src/AdventOfCode/Year2025/Day04.hs | 53 ++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/AdventOfCode/Year2025/Day04.hs diff --git a/VERSION b/VERSION index 7781447..70629a3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.3.2.1 \ No newline at end of file +2025.4.1.0 \ No newline at end of file diff --git a/package.yaml b/package.yaml index 34b4c31..a66696f 100644 --- a/package.yaml +++ b/package.yaml @@ -612,6 +612,11 @@ executables: main: AdventOfCode.Year2025.Day03 dependencies: - vector + aoc-2025-day04: + <<: *executable + main: AdventOfCode.Year2025.Day04 + dependencies: + - linear _benchmark: &benchmark ghc-options: - -threaded diff --git a/src/AdventOfCode/Year2025/Day04.hs b/src/AdventOfCode/Year2025/Day04.hs new file mode 100644 index 0000000..739dcc1 --- /dev/null +++ b/src/AdventOfCode/Year2025/Day04.hs @@ -0,0 +1,53 @@ +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE NoImplicitPrelude #-} + +module AdventOfCode.Year2025.Day04 where + +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import AdventOfCode.Util (neighborsOf) +import Control.Lens (ifoldMap') +import Data.Set qualified as Set +import Linear (V2 (..)) +import Relude +import Text.Trifecta (Parser, char, newline, sepEndBy) + +diagram :: Parser (Set (V2 Int)) +diagram = + fmap (ifoldMap' (ifoldMap' . go)) + $ some (True <$ char '@' <|> char '.' $> False) + `sepEndBy` newline + where + go y x = bool Set.empty (Set.singleton (V2 x y)) + +getExample :: IO (Set (V2 Int)) +getExample = parseString diagram example + +example :: String +example = + "..@@.@@@@.\n\ + \@@@.@.@.@@\n\ + \@@@@@.@.@@\n\ + \@.@@@@..@.\n\ + \@@.@@@@.@@\n\ + \.@@@@@@@.@\n\ + \.@.@.@.@@@\n\ + \@.@@@.@@@@\n\ + \.@@@@@@@@.\n\ + \@.@.@@@.@." + +getInput :: IO (Set (V2 Int)) +getInput = parseInputAoC 2025 4 diagram + +partOne :: SimplePuzzle (Set (V2 Int)) Int +partOne = asks \rolls -> + Set.size + $ Set.filter ((< 4) . Set.size) + $ Set.map (Set.intersection rolls . neighborsOf) rolls + +partTwo :: SimplePuzzle (Set (V2 Int)) Int +partTwo = fail "not yet implemented" + +main :: IO () +main = $(defaultMainPuzzle) From 98d23c591f47a0974746eff9544cdd4211428d33 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 4 Dec 2025 22:36:17 -0600 Subject: [PATCH 77/91] fix(2025-04/haskell): solve Part One --- VERSION | 2 +- src/AdventOfCode/Year2025/Day04.hs | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/VERSION b/VERSION index 70629a3..07a31ea 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.4.1.0 \ No newline at end of file +2025.4.1.1 \ No newline at end of file diff --git a/src/AdventOfCode/Year2025/Day04.hs b/src/AdventOfCode/Year2025/Day04.hs index 739dcc1..f8436d3 100644 --- a/src/AdventOfCode/Year2025/Day04.hs +++ b/src/AdventOfCode/Year2025/Day04.hs @@ -42,9 +42,7 @@ getInput = parseInputAoC 2025 4 diagram partOne :: SimplePuzzle (Set (V2 Int)) Int partOne = asks \rolls -> - Set.size - $ Set.filter ((< 4) . Set.size) - $ Set.map (Set.intersection rolls . neighborsOf) rolls + Set.size $ Set.filter ((< 4) . Set.size . Set.intersection rolls . neighborsOf) rolls partTwo :: SimplePuzzle (Set (V2 Int)) Int partTwo = fail "not yet implemented" From 77c839bd3fa4ad228f6e077ded2f9da2bc6cc1f4 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 4 Dec 2025 23:30:56 -0600 Subject: [PATCH 78/91] feat(2025-04/haskell): solve Part Two --- VERSION | 2 +- src/AdventOfCode/Util.hs | 6 ++++++ src/AdventOfCode/Year2025/Day04.hs | 20 ++++++++++++++++---- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/VERSION b/VERSION index 07a31ea..ffee0ed 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.4.1.1 \ No newline at end of file +2025.4.2.0 \ No newline at end of file diff --git a/src/AdventOfCode/Util.hs b/src/AdventOfCode/Util.hs index b838b5b..fc2c098 100644 --- a/src/AdventOfCode/Util.hs +++ b/src/AdventOfCode/Util.hs @@ -19,6 +19,7 @@ module AdventOfCode.Util snoc, wigglesum, fix', + fixM, adjacencies, neighborsOf, holes, @@ -113,6 +114,11 @@ wigglesum wiggle = holesOf traverse >=> experiment wiggle fix' :: (Eq a) => (a -> a) -> a -> a fix' f = fix (\g !x -> let fx = f x in if fx == x then x else g fx) +fixM :: (Eq a, Monad m) => (a -> m a) -> a -> m a +fixM f x = do + fx <- f x + bool (fixM f fx) (pure x) (fx == x) + adjacencies :: (Applicative f, Num a, Eq (f a), Traversable f) => [f a] adjacencies = filter (/= pure 0) $ sequenceA (pure [-1, 0, 1]) diff --git a/src/AdventOfCode/Year2025/Day04.hs b/src/AdventOfCode/Year2025/Day04.hs index f8436d3..31832b0 100644 --- a/src/AdventOfCode/Year2025/Day04.hs +++ b/src/AdventOfCode/Year2025/Day04.hs @@ -6,7 +6,7 @@ module AdventOfCode.Year2025.Day04 where import AdventOfCode.Input (parseInputAoC, parseString) import AdventOfCode.Puzzle import AdventOfCode.TH (defaultMainPuzzle) -import AdventOfCode.Util (neighborsOf) +import AdventOfCode.Util (fixM, neighborsOf, (<.>)) import Control.Lens (ifoldMap') import Data.Set qualified as Set import Linear (V2 (..)) @@ -40,12 +40,24 @@ example = getInput :: IO (Set (V2 Int)) getInput = parseInputAoC 2025 4 diagram +canAccess :: V2 Int -> SimplePuzzle (Set (V2 Int)) Bool +canAccess roll = asks \rolls -> + Set.size (Set.intersection rolls (neighborsOf roll)) < 4 + partOne :: SimplePuzzle (Set (V2 Int)) Int -partOne = asks \rolls -> - Set.size $ Set.filter ((< 4) . Set.size . Set.intersection rolls . neighborsOf) rolls +partOne = + ask + >>= getSum + <.> foldMapM (fmap (Sum . fromEnum) . canAccess) partTwo :: SimplePuzzle (Set (V2 Int)) Int -partTwo = fail "not yet implemented" +partTwo = (-) <$> asks Set.size <*> (Set.size <.> fixM removeRolls =<< ask) + where + removeRolls rolls = foldlM removeRoll rolls rolls + where + removeRoll remaining roll = + bool remaining (Set.delete roll remaining) + <$> withPuzzle (const rolls) (canAccess roll) main :: IO () main = $(defaultMainPuzzle) From 61a32d4c7c3a774f19b23abaf440479d0b87492d Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 4 Dec 2025 23:34:40 -0600 Subject: [PATCH 79/91] fix(2025-03/haskell): fix error message in partTwo --- VERSION | 2 +- src/AdventOfCode/Year2025/Day03.hs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index ffee0ed..f0a592c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.4.2.0 \ No newline at end of file +2025.4.2.1 \ No newline at end of file diff --git a/src/AdventOfCode/Year2025/Day03.hs b/src/AdventOfCode/Year2025/Day03.hs index b3ca5f2..be0e4ae 100644 --- a/src/AdventOfCode/Year2025/Day03.hs +++ b/src/AdventOfCode/Year2025/Day03.hs @@ -48,7 +48,7 @@ getInput = parseInputAoC 2025 3 joltageRatings partTwo :: SimplePuzzle [[Int]] Int partTwo = - maybeFail "some bank had fewer than two batteries" + maybeFail "some bank had fewer than twelve batteries" . fmap sum . traverse (largestPossibleJoltage 12) =<< ask From d4f91314c26fe1fc4925b476c3a698bd4ba64153 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 4 Dec 2025 23:55:13 -0600 Subject: [PATCH 80/91] feat(2025-05/haskell): solve Part One --- VERSION | 2 +- package.yaml | 3 ++ src/AdventOfCode/Year2025/Day05.hs | 52 ++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/AdventOfCode/Year2025/Day05.hs diff --git a/VERSION b/VERSION index f0a592c..e1576f5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.4.2.1 \ No newline at end of file +2025.5.1.0 \ No newline at end of file diff --git a/package.yaml b/package.yaml index a66696f..fb2a753 100644 --- a/package.yaml +++ b/package.yaml @@ -617,6 +617,9 @@ executables: main: AdventOfCode.Year2025.Day04 dependencies: - linear + aoc-2025-day05: + <<: *executable + main: AdventOfCode.Year2025.Day05 _benchmark: &benchmark ghc-options: - -threaded diff --git a/src/AdventOfCode/Year2025/Day05.hs b/src/AdventOfCode/Year2025/Day05.hs new file mode 100644 index 0000000..2b4c0dc --- /dev/null +++ b/src/AdventOfCode/Year2025/Day05.hs @@ -0,0 +1,52 @@ +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE NoImplicitPrelude #-} + +module AdventOfCode.Year2025.Day05 where + +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import AdventOfCode.Util (count) +import Data.Ix (inRange) +import Relude +import Text.Trifecta (Parser, char, decimal, newline, sepEndBy) + +database :: Parser ([(Integer, Integer)], [Integer]) +database = do + idRange <- some $ do + from <- decimal <* char '-' + to <- decimal <* newline + pure (from, to) + ingredients <- newline *> decimal `sepEndBy` newline + pure (idRange, ingredients) + +getExample :: IO ([(Integer, Integer)], [Integer]) +getExample = parseString database example + +example :: String +example = + "3-5\n\ + \10-14\n\ + \16-20\n\ + \12-18\n\ + \\n\ + \1\n\ + \5\n\ + \8\n\ + \11\n\ + \17\n\ + \32" + +getInput :: IO ([(Integer, Integer)], [Integer]) +getInput = parseInputAoC 2025 5 database + +partOne :: SimplePuzzle ([(Integer, Integer)], [Integer]) Int +partOne = + asks \(ranges, ingredients) -> + count (flip any ranges . flip inRange) ingredients + +partTwo :: SimplePuzzle ([(Integer, Integer)], [Integer]) () +partTwo = fail "not yet implemented" + +main :: IO () +main = $(defaultMainPuzzle) From fcd59f22b4bf126673e24fc911aff3b0814d75db Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Fri, 5 Dec 2025 00:41:56 -0600 Subject: [PATCH 81/91] feat(2025-05/haskell): solve Part Two --- VERSION | 2 +- package.yaml | 2 ++ src/AdventOfCode/Year2025/Day05.hs | 23 ++++++++++++++--------- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/VERSION b/VERSION index e1576f5..2de847b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.5.1.0 \ No newline at end of file +2025.5.2.0 \ No newline at end of file diff --git a/package.yaml b/package.yaml index fb2a753..26c4847 100644 --- a/package.yaml +++ b/package.yaml @@ -620,6 +620,8 @@ executables: aoc-2025-day05: <<: *executable main: AdventOfCode.Year2025.Day05 + dependencies: + - data-interval _benchmark: &benchmark ghc-options: - -threaded diff --git a/src/AdventOfCode/Year2025/Day05.hs b/src/AdventOfCode/Year2025/Day05.hs index 2b4c0dc..2eae95f 100644 --- a/src/AdventOfCode/Year2025/Day05.hs +++ b/src/AdventOfCode/Year2025/Day05.hs @@ -7,20 +7,23 @@ import AdventOfCode.Input (parseInputAoC, parseString) import AdventOfCode.Puzzle import AdventOfCode.TH (defaultMainPuzzle) import AdventOfCode.Util (count) -import Data.Ix (inRange) +import Data.Interval (Extended (..), Interval, (<=..<=)) +import Data.Interval qualified as Interval +import Data.IntervalSet qualified as ISet +import Data.List.Extra (sumOn') import Relude import Text.Trifecta (Parser, char, decimal, newline, sepEndBy) -database :: Parser ([(Integer, Integer)], [Integer]) +database :: Parser ([Interval Integer], [Integer]) database = do idRange <- some $ do from <- decimal <* char '-' to <- decimal <* newline - pure (from, to) + pure (Finite from <=..<= Finite to) ingredients <- newline *> decimal `sepEndBy` newline pure (idRange, ingredients) -getExample :: IO ([(Integer, Integer)], [Integer]) +getExample :: IO ([Interval Integer], [Integer]) getExample = parseString database example example :: String @@ -37,16 +40,18 @@ example = \17\n\ \32" -getInput :: IO ([(Integer, Integer)], [Integer]) +getInput :: IO ([Interval Integer], [Integer]) getInput = parseInputAoC 2025 5 database -partOne :: SimplePuzzle ([(Integer, Integer)], [Integer]) Int +partOne :: SimplePuzzle ([Interval Integer], [Integer]) Int partOne = asks \(ranges, ingredients) -> - count (flip any ranges . flip inRange) ingredients + count (flip any ranges . Interval.member) ingredients -partTwo :: SimplePuzzle ([(Integer, Integer)], [Integer]) () -partTwo = fail "not yet implemented" +partTwo :: SimplePuzzle ([Interval Integer], [Integer]) Integer +partTwo = + sumOn' ((1 +) . Interval.width) + <$> withPuzzle fst (asks (ISet.toList . ISet.fromList)) main :: IO () main = $(defaultMainPuzzle) From f1934a40687474729310fef709925a1b0dffa1d9 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Fri, 5 Dec 2025 01:13:16 -0600 Subject: [PATCH 82/91] refactor(2025-04/haskell): tidy partTwo a bit --- VERSION | 2 +- src/AdventOfCode/Year2025/Day04.hs | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 2de847b..f2738a6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.5.2.0 \ No newline at end of file +2025.5.2.1 \ No newline at end of file diff --git a/src/AdventOfCode/Year2025/Day04.hs b/src/AdventOfCode/Year2025/Day04.hs index 31832b0..65fb84d 100644 --- a/src/AdventOfCode/Year2025/Day04.hs +++ b/src/AdventOfCode/Year2025/Day04.hs @@ -51,7 +51,10 @@ partOne = <.> foldMapM (fmap (Sum . fromEnum) . canAccess) partTwo :: SimplePuzzle (Set (V2 Int)) Int -partTwo = (-) <$> asks Set.size <*> (Set.size <.> fixM removeRolls =<< ask) +partTwo = + ask >>= \rolls -> + ((-) `on` Set.size) rolls + <$> fixM removeRolls rolls where removeRolls rolls = foldlM removeRoll rolls rolls where From 54129fa301474a5372fecaf8aa30b36ccf5b1144 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sat, 6 Dec 2025 15:13:23 -0600 Subject: [PATCH 83/91] feat(2025-06/haskell): solve Part One --- VERSION | 2 +- package.yaml | 3 +++ src/AdventOfCode/Year2025/Day06.hs | 40 ++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 src/AdventOfCode/Year2025/Day06.hs diff --git a/VERSION b/VERSION index f2738a6..68fb975 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.5.2.1 \ No newline at end of file +2025.6.1.0 \ No newline at end of file diff --git a/package.yaml b/package.yaml index 26c4847..c2cd787 100644 --- a/package.yaml +++ b/package.yaml @@ -622,6 +622,9 @@ executables: main: AdventOfCode.Year2025.Day05 dependencies: - data-interval + aoc-2025-day06: + <<: *executable + main: AdventOfCode.Year2025.Day06 _benchmark: &benchmark ghc-options: - -threaded diff --git a/src/AdventOfCode/Year2025/Day06.hs b/src/AdventOfCode/Year2025/Day06.hs new file mode 100644 index 0000000..ae2f92a --- /dev/null +++ b/src/AdventOfCode/Year2025/Day06.hs @@ -0,0 +1,40 @@ +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE NoImplicitPrelude #-} + +module AdventOfCode.Year2025.Day06 where + +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import Data.FastDigits (digits, undigits) +import Relude +import Text.Trifecta (Parser, char, decimal, newline, sepEndBy1, symbol) + +worksheet :: Parser ([[Integer]], [[Integer] -> Integer]) +worksheet = do + numbers <- decimal `sepEndBy1` some (char ' ') `sepEndBy1` newline + operations <- some (sum <$ symbol "+" <|> symbol "*" $> product) + pure (transpose numbers, operations) + +getExample :: IO ([[Integer]], [[Integer] -> Integer]) +getExample = parseString worksheet example + +example :: String +example = + "123 328 51 64 \n\ + \ 45 64 387 23 \n\ + \ 6 98 215 314\n\ + \* + * + " + +getInput :: IO ([[Integer]], [[Integer] -> Integer]) +getInput = parseInputAoC 2025 6 worksheet + +partOne :: SimplePuzzle ([[Integer]], [[Integer] -> Integer]) Integer +partOne = asks \(numbers, operations) -> + sum $ zipWith ($) operations numbers + +partTwo :: SimplePuzzle ([[Integer]], [[Integer] -> Integer]) () +partTwo = fail "not yet implemented" + +main :: IO () +main = $(defaultMainPuzzle) From bfd708f0a6b580790a3b00fe2f00fd29f9759990 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sat, 6 Dec 2025 16:29:03 -0600 Subject: [PATCH 84/91] feat(2025-06/haskell): solve Part Two --- VERSION | 2 +- src/AdventOfCode/Year2025/Day06.hs | 45 ++++++++++++++++++++---------- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/VERSION b/VERSION index 68fb975..db6110d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.6.1.0 \ No newline at end of file +2025.6.2.0 \ No newline at end of file diff --git a/src/AdventOfCode/Year2025/Day06.hs b/src/AdventOfCode/Year2025/Day06.hs index ae2f92a..f83d478 100644 --- a/src/AdventOfCode/Year2025/Day06.hs +++ b/src/AdventOfCode/Year2025/Day06.hs @@ -6,17 +6,23 @@ module AdventOfCode.Year2025.Day06 where import AdventOfCode.Input (parseInputAoC, parseString) import AdventOfCode.Puzzle import AdventOfCode.TH (defaultMainPuzzle) -import Data.FastDigits (digits, undigits) +import AdventOfCode.Util (maybeFail) +import Data.Char (isSpace) +import Data.List (unsnoc) +import Data.List.Split (splitWhen) import Relude -import Text.Trifecta (Parser, char, decimal, newline, sepEndBy1, symbol) +import Text.Trifecta (Parser, natural, newline, noneOf, sepEndBy1, symbol, whiteSpace) -worksheet :: Parser ([[Integer]], [[Integer] -> Integer]) -worksheet = do - numbers <- decimal `sepEndBy1` some (char ' ') `sepEndBy1` newline - operations <- some (sum <$ symbol "+" <|> symbol "*" $> product) - pure (transpose numbers, operations) +worksheet :: Parser [String] +worksheet = some (noneOf "\n") `sepEndBy1` newline -getExample :: IO ([[Integer]], [[Integer] -> Integer]) +number :: Parser Integer +number = whiteSpace *> natural + +operation :: Parser ([Integer] -> Integer) +operation = sum <$ symbol "+" <|> symbol "*" $> product + +getExample :: IO [String] getExample = parseString worksheet example example :: String @@ -26,15 +32,24 @@ example = \ 6 98 215 314\n\ \* + * + " -getInput :: IO ([[Integer]], [[Integer] -> Integer]) +getInput :: IO [String] getInput = parseInputAoC 2025 6 worksheet -partOne :: SimplePuzzle ([[Integer]], [[Integer] -> Integer]) Integer -partOne = asks \(numbers, operations) -> - sum $ zipWith ($) operations numbers - -partTwo :: SimplePuzzle ([[Integer]], [[Integer] -> Integer]) () -partTwo = fail "not yet implemented" +partOne :: SimplePuzzle [String] Integer +partOne = + ask >>= maybeFail "empty worksheet" . unsnoc >>= \(nums, ops) -> do + numberColumns <- transpose <$> traverse (parseString (some number)) nums + operations <- parseString (some operation) ops + pure $ sum $ zipWith ($) operations numberColumns + +partTwo :: SimplePuzzle [String] Integer +partTwo = asks (splitWhen (all isSpace) . transpose) >>= traverse go <&> sum + where + go problem = do + (lastColumn, columns) <- maybeFail "empty problem" (uncons problem) + (column, op) <- maybeFail "empty column" (unsnoc lastColumn) + parseString operation [op] + <*> traverse (parseString number) (column : columns) main :: IO () main = $(defaultMainPuzzle) From 236da3bef08f2f9699a065b7df1fe689c21c30ce Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sun, 7 Dec 2025 00:14:42 -0600 Subject: [PATCH 85/91] feat(2025-07/haskell): solve Part One --- VERSION | 2 +- package.yaml | 5 ++ src/AdventOfCode/Year2025/Day07.hs | 102 +++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 src/AdventOfCode/Year2025/Day07.hs diff --git a/VERSION b/VERSION index db6110d..31f7aa3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.6.2.0 \ No newline at end of file +2025.7.1.0 \ No newline at end of file diff --git a/package.yaml b/package.yaml index c2cd787..9a7c94a 100644 --- a/package.yaml +++ b/package.yaml @@ -625,6 +625,11 @@ executables: aoc-2025-day06: <<: *executable main: AdventOfCode.Year2025.Day06 + aoc-2025-day07: + <<: *executable + main: AdventOfCode.Year2025.Day07 + dependencies: + - linear _benchmark: &benchmark ghc-options: - -threaded diff --git a/src/AdventOfCode/Year2025/Day07.hs b/src/AdventOfCode/Year2025/Day07.hs new file mode 100644 index 0000000..99c0f10 --- /dev/null +++ b/src/AdventOfCode/Year2025/Day07.hs @@ -0,0 +1,102 @@ +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE StrictData #-} +{-# LANGUAGE NoImplicitPrelude #-} + +module AdventOfCode.Year2025.Day07 where + +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle +import Control.Lens (ifoldl', makeLenses, use, uses, views, (%=), (%~), (+=), (.=), (.~), _1, _2, _3) +import Data.Set qualified as Set +import Linear (V2 (..), _y) +import Relude +import Text.Trifecta (Parser, char, choice, newline, sepEndBy) + +data Location + = EmptySpace + | Splitter + | Beam + +data Manifold + = Manifold + { _bounds :: V2 Int, + _beams :: Set (V2 Int), + _splitters :: Set (V2 Int) + } + deriving (Eq, Generic, Show) + +makeLenses ''Manifold + +manifold :: Parser Manifold +manifold = + ifoldl' (ifoldl' . go) (Manifold 0 Set.empty Set.empty) + <$> some (choice [EmptySpace <$ char '.', Splitter <$ char '^', Beam <$ char 'S']) + `sepEndBy` newline + where + go y x diagram = \case + EmptySpace -> + diagram & bounds .~ V2 x y + Splitter -> + diagram + & (bounds .~ V2 x y) + & (splitters %~ Set.insert (V2 x y)) + Beam -> + diagram + & (bounds .~ V2 x y) + & (beams .~ Set.singleton (V2 x y)) + +getExample :: IO Manifold +getExample = parseString manifold example + +example :: String +example = + ".......S.......\n\ + \...............\n\ + \.......^.......\n\ + \...............\n\ + \......^.^......\n\ + \...............\n\ + \.....^.^.^.....\n\ + \...............\n\ + \....^.^...^....\n\ + \...............\n\ + \...^.^...^.^...\n\ + \...............\n\ + \..^...^.....^..\n\ + \...............\n\ + \.^.^.^.^.^...^.\n\ + \..............." + +partOne :: Puzzle Manifold (Int, Int, Manifold) Int +partOne = do + (_3 .=) =<< ask + go + where + go = do + done <- uses (_3 . bounds . _y) =<< uses _2 (>) + if done + then use _1 + else do + isTip <- uses _2 (==) + tips <- uses (_3 . beams) (Set.filter (views _y isTip)) + forM_ tips \beam -> do + let next = beam + V2 0 1 + reachedSplitter <- uses (_3 . splitters) (Set.member next) + if reachedSplitter + then do + _1 += 1 + (_3 . beams) %= Set.insert (next - V2 1 0) . Set.insert (next + V2 1 0) + else + (_3 . beams) %= Set.insert next + _2 += 1 + go + +getInput :: IO Manifold +getInput = parseInputAoC 2025 7 manifold + +main :: IO () +main = do + diagram <- getInput + evalPuzzle diagram (0, 0, diagram) do + putStr "Part One: " + print =<< partOne From 4e6986fde07072b702be47a419d34a03c06574d1 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sun, 7 Dec 2025 20:58:49 -0600 Subject: [PATCH 86/91] feat(2025-07/haskell): solve Part Two --- VERSION | 2 +- package.yaml | 2 + src/AdventOfCode/Year2025/Day07.hs | 75 ++++++++++++++++++++++++++++-- 3 files changed, 74 insertions(+), 5 deletions(-) diff --git a/VERSION b/VERSION index 31f7aa3..e0bb222 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.7.1.0 \ No newline at end of file +2025.7.2.0 \ No newline at end of file diff --git a/package.yaml b/package.yaml index 9a7c94a..881b897 100644 --- a/package.yaml +++ b/package.yaml @@ -46,6 +46,7 @@ library: dependencies: - aeson - arithmoi + - array - astar - base16-bytestring - combinatorial @@ -629,6 +630,7 @@ executables: <<: *executable main: AdventOfCode.Year2025.Day07 dependencies: + - array - linear _benchmark: &benchmark ghc-options: diff --git a/src/AdventOfCode/Year2025/Day07.hs b/src/AdventOfCode/Year2025/Day07.hs index 99c0f10..acc917c 100644 --- a/src/AdventOfCode/Year2025/Day07.hs +++ b/src/AdventOfCode/Year2025/Day07.hs @@ -1,15 +1,31 @@ {-# LANGUAGE BlockArguments #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE RecordWildCards #-} {-# LANGUAGE StrictData #-} {-# LANGUAGE NoImplicitPrelude #-} -module AdventOfCode.Year2025.Day07 where +module AdventOfCode.Year2025.Day07 + ( manifold, + getExample, + example, + getInput, + partOne, + partTwo, + main, + ) +where import AdventOfCode.Input (parseInputAoC, parseString) import AdventOfCode.Puzzle -import Control.Lens (ifoldl', makeLenses, use, uses, views, (%=), (%~), (+=), (.=), (.~), _1, _2, _3) +import Control.Lens (ifoldl', makeLenses, use, uses, view, views, (%=), (%~), (+=), (.=), (.~), _1, _2, _3) +import Data.Array ((!)) +import Data.Graph (Graph, Vertex, graphFromEdges, reverseTopSort) +import Data.IntMap.Strict qualified as IntMap +import Data.List.Extra (sumOn') import Data.Set qualified as Set import Linear (V2 (..), _y) import Relude +import Text.Show qualified import Text.Trifecta (Parser, char, choice, newline, sepEndBy) data Location @@ -23,10 +39,24 @@ data Manifold _beams :: Set (V2 Int), _splitters :: Set (V2 Int) } - deriving (Eq, Generic, Show) + deriving (Eq, Generic) makeLenses ''Manifold +instance Show Manifold where + show diagram = + let (V2 maxX maxY) = view bounds diagram + in [ [ if + | diagram & views beams (Set.member location) -> '|' + | diagram & views splitters (Set.member location) -> '^' + | otherwise -> '.' + | x <- [0 .. maxX], + let location = V2 x y + ] + | y <- [0 .. maxY] + ] + & intercalate "\n" + manifold :: Parser Manifold manifold = ifoldl' (ifoldl' . go) (Manifold 0 Set.empty Set.empty) @@ -35,7 +65,8 @@ manifold = where go y x diagram = \case EmptySpace -> - diagram & bounds .~ V2 x y + diagram + & (bounds .~ V2 x y) Splitter -> diagram & (bounds .~ V2 x y) @@ -94,9 +125,45 @@ partOne = do getInput :: IO Manifold getInput = parseInputAoC 2025 7 manifold +buildGraph :: Manifold -> (Graph, Vertex -> (V2 Int, V2 Int, [V2 Int]), V2 Int -> Maybe Vertex) +buildGraph Manifold {..} = + graphFromEdges [(loc, loc, neighbors loc) | loc <- Set.toList _beams] + where + neighbors location + | down `Set.member` _beams = [down] + | otherwise = + [ location + delta + | down `Set.member` _splitters, + delta <- [V2 (-1) 1, V2 1 1] + ] + where + down = location + V2 0 1 + +countDagPaths :: Graph -> Vertex -> [Vertex] -> Int +countDagPaths g start ends = foldl' go IntMap.empty (reverseTopSort g) IntMap.! start + where + endSet = Set.fromList ends + go pathCounts location = IntMap.insert location n pathCounts + where + n + | location `Set.member` endSet = 1 + | otherwise = sumOn' (pathCounts IntMap.!) (g ! location) + +partTwo :: Puzzle Manifold (Int, Int, Manifold) Int +partTwo = do + maxY <- use (_3 . bounds . _y) + (g, _nodeFromVertex, vertexFromKey) <- uses _3 buildGraph + [start] <- asks (mapMaybe vertexFromKey . Set.toList . _beams) + uses (_3 . beams) Set.toList + <&> countDagPaths g start + . mapMaybe vertexFromKey + . filter (views _y (== maxY)) + main :: IO () main = do diagram <- getInput evalPuzzle diagram (0, 0, diagram) do putStr "Part One: " print =<< partOne + putStr "Part Two: " + print =<< partTwo From ffbb6a365310600d1dfef3690ccb58864e3246ce Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 9 Dec 2025 00:26:41 -0600 Subject: [PATCH 87/91] feat(2025-08/haskell): solve Part One --- VERSION | 2 +- package.yaml | 5 ++ src/AdventOfCode/Year2025/Day08.hs | 94 ++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 src/AdventOfCode/Year2025/Day08.hs diff --git a/VERSION b/VERSION index e0bb222..53a5ce0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.7.2.0 \ No newline at end of file +2025.8.1.0 \ No newline at end of file diff --git a/package.yaml b/package.yaml index 881b897..c26166f 100644 --- a/package.yaml +++ b/package.yaml @@ -632,6 +632,11 @@ executables: dependencies: - array - linear + aoc-2025-day08: + <<: *executable + main: AdventOfCode.Year2025.Day08 + dependencies: + - linear _benchmark: &benchmark ghc-options: - -threaded diff --git a/src/AdventOfCode/Year2025/Day08.hs b/src/AdventOfCode/Year2025/Day08.hs new file mode 100644 index 0000000..f5efc76 --- /dev/null +++ b/src/AdventOfCode/Year2025/Day08.hs @@ -0,0 +1,94 @@ +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE DerivingVia #-} +{-# LANGUAGE NoImplicitPrelude #-} + +module AdventOfCode.Year2025.Day08 where + +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import Control.Lens (makeLenses, use, uses, (%=), (.=), (<~)) +import Data.List.Ordered (sortOn') +import Data.Set qualified as Set +import Generic.Data (Generically (..)) +import Linear (Metric, V3 (..), qd) +import Relude +import Text.Trifecta (Parser, comma, decimal, newline, sepEndBy) + +getExample :: IO (Set (V3 Integer)) +getExample = parseString junctionBoxPositions example + +junctionBoxPositions :: Parser (Set (V3 Integer)) +junctionBoxPositions = Set.fromList <$> (go `sepEndBy` newline) + where + go = V3 <$> (coordinate <* comma) <*> (coordinate <* comma) <*> coordinate + coordinate = decimal + +example :: String +example = + "162,817,812\n\ + \57,618,57\n\ + \906,360,560\n\ + \592,479,940\n\ + \352,342,300\n\ + \466,668,158\n\ + \542,29,236\n\ + \431,825,988\n\ + \739,650,466\n\ + \52,470,668\n\ + \216,146,977\n\ + \819,987,18\n\ + \117,168,530\n\ + \805,96,715\n\ + \346,949,466\n\ + \970,615,88\n\ + \941,993,340\n\ + \862,61,35\n\ + \984,92,344\n\ + \425,690,689" + +getInput :: IO (Set (V3 Integer)) +getInput = parseInputAoC 2025 8 junctionBoxPositions + +-- TODO: KD tree? VP tree? + +nearestPairs :: (Metric f, Num a, Ord a) => [f a] -> [(f a, f a)] +nearestPairs pts = sortOn' (uncurry qd) [(p, q) | p : ps <- tails pts, q <- ps] + +data PuzzleState' a + = PuzzleState' + { _circuits :: Set (Set a), + _junctionPairs :: [(a, a)] + } + deriving (Eq, Generic, Show) + deriving + (Semigroup, Monoid) + via (Generically (PuzzleState' a)) + +makeLenses ''PuzzleState' + +type PuzzleState = PuzzleState' (V3 Integer) + +connect :: Puzzle (Set (V3 Integer)) PuzzleState (V3 Integer, V3 Integer) +connect = do + (from, to) : pairs <- use junctionPairs + junctionPairs .= pairs + Just fromCircuit <- uses circuits (find (from `Set.member`)) + when (to `Set.notMember` fromCircuit) $ do + Just toCircuit <- uses circuits (find (to `Set.member`)) + circuits %= Set.insert (fromCircuit <> toCircuit) . Set.delete fromCircuit . Set.delete toCircuit + pure (from, to) + +partOne :: SimplePuzzle (Set (V3 Integer)) Int +partOne = + ask >>= evaluatingPuzzle do + circuits <~ asks (Set.map Set.singleton) + junctionPairs <~ asks (nearestPairs . Set.toList) + replicateM 1000 connect + *> uses circuits (product . take 3 . Set.toDescList . Set.map Set.size) + +partTwo :: SimplePuzzle (Set (V3 Integer)) () +partTwo = undefined + +main :: IO () +main = $(defaultMainPuzzle) From 01540a3aa17bba89b6c7fbd9baedeefc980da542 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 9 Dec 2025 00:58:12 -0600 Subject: [PATCH 88/91] feat(2025-08/haskell): solve Part Two --- VERSION | 2 +- src/AdventOfCode/Puzzle.hs | 3 ++ src/AdventOfCode/Year2025/Day08.hs | 52 ++++++++++++++++++------------ 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/VERSION b/VERSION index 53a5ce0..dbf6952 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.8.1.0 \ No newline at end of file +2025.8.2.0 \ No newline at end of file diff --git a/src/AdventOfCode/Puzzle.hs b/src/AdventOfCode/Puzzle.hs index b5b23b4..148f7f4 100644 --- a/src/AdventOfCode/Puzzle.hs +++ b/src/AdventOfCode/Puzzle.hs @@ -48,5 +48,8 @@ evalPuzzle input initialState = evaluatingPuzzle :: (MonadIO m, Monoid s) => Puzzle r s a -> r -> m a evaluatingPuzzle puzzle input = evalPuzzle input mempty puzzle +evaluatingPuzzleM :: (MonadIO m, MonadReader r m, Monoid s) => Puzzle r s a -> m a +evaluatingPuzzleM puzzle = ask >>= \input -> evalPuzzle input mempty puzzle + withPuzzle :: (r' -> r) -> Puzzle r s a -> Puzzle r' s a withPuzzle f puzzle = Puzzle $ withReaderT f (runPuzzle puzzle) diff --git a/src/AdventOfCode/Year2025/Day08.hs b/src/AdventOfCode/Year2025/Day08.hs index f5efc76..021e5d4 100644 --- a/src/AdventOfCode/Year2025/Day08.hs +++ b/src/AdventOfCode/Year2025/Day08.hs @@ -1,5 +1,6 @@ {-# LANGUAGE BlockArguments #-} {-# LANGUAGE DerivingVia #-} +{-# LANGUAGE StrictData #-} {-# LANGUAGE NoImplicitPrelude #-} module AdventOfCode.Year2025.Day08 where @@ -7,22 +8,23 @@ module AdventOfCode.Year2025.Day08 where import AdventOfCode.Input (parseInputAoC, parseString) import AdventOfCode.Puzzle import AdventOfCode.TH (defaultMainPuzzle) -import Control.Lens (makeLenses, use, uses, (%=), (.=), (<~)) -import Data.List.Ordered (sortOn') +import Control.Lens (makeLenses, use, uses, view, (%=), (.=), (<~)) +import Data.Bifoldable (biproduct) import Data.Set qualified as Set import Generic.Data (Generically (..)) -import Linear (Metric, V3 (..), qd) +import Linear (Metric, V3 (..), qd, _x) import Relude +import Relude.Extra.Bifunctor (bimapBoth) import Text.Trifecta (Parser, comma, decimal, newline, sepEndBy) -getExample :: IO (Set (V3 Integer)) +getExample :: IO (Set (V3 Int)) getExample = parseString junctionBoxPositions example -junctionBoxPositions :: Parser (Set (V3 Integer)) +junctionBoxPositions :: Parser (Set (V3 Int)) junctionBoxPositions = Set.fromList <$> (go `sepEndBy` newline) where go = V3 <$> (coordinate <* comma) <*> (coordinate <* comma) <*> coordinate - coordinate = decimal + coordinate = fromInteger <$> decimal example :: String example = @@ -47,29 +49,32 @@ example = \984,92,344\n\ \425,690,689" -getInput :: IO (Set (V3 Integer)) +getInput :: IO (Set (V3 Int)) getInput = parseInputAoC 2025 8 junctionBoxPositions -- TODO: KD tree? VP tree? nearestPairs :: (Metric f, Num a, Ord a) => [f a] -> [(f a, f a)] -nearestPairs pts = sortOn' (uncurry qd) [(p, q) | p : ps <- tails pts, q <- ps] +nearestPairs pts = sortOn (uncurry qd) [(p, q) | p : ps <- tails pts, q <- ps] -data PuzzleState' a - = PuzzleState' +data PuzzleState a + = PuzzleState { _circuits :: Set (Set a), _junctionPairs :: [(a, a)] } deriving (Eq, Generic, Show) deriving (Semigroup, Monoid) - via (Generically (PuzzleState' a)) + via (Generically (PuzzleState a)) -makeLenses ''PuzzleState' +makeLenses ''PuzzleState -type PuzzleState = PuzzleState' (V3 Integer) +initPuzzleState :: Puzzle (Set (V3 Int)) (PuzzleState (V3 Int)) () +initPuzzleState = do + circuits <~ asks (Set.map Set.singleton) + junctionPairs <~ asks (nearestPairs . Set.toList) -connect :: Puzzle (Set (V3 Integer)) PuzzleState (V3 Integer, V3 Integer) +connect :: (Ord a) => Puzzle (Set a) (PuzzleState a) (a, a) connect = do (from, to) : pairs <- use junctionPairs junctionPairs .= pairs @@ -79,16 +84,23 @@ connect = do circuits %= Set.insert (fromCircuit <> toCircuit) . Set.delete fromCircuit . Set.delete toCircuit pure (from, to) -partOne :: SimplePuzzle (Set (V3 Integer)) Int +partOne :: SimplePuzzle (Set (V3 Int)) Int partOne = - ask >>= evaluatingPuzzle do - circuits <~ asks (Set.map Set.singleton) - junctionPairs <~ asks (nearestPairs . Set.toList) + evaluatingPuzzleM do + initPuzzleState replicateM 1000 connect *> uses circuits (product . take 3 . Set.toDescList . Set.map Set.size) -partTwo :: SimplePuzzle (Set (V3 Integer)) () -partTwo = undefined +partTwo :: SimplePuzzle (Set (V3 Int)) Int +partTwo = + evaluatingPuzzleM do + initPuzzleState + loop <&> biproduct . bimapBoth (view _x) + where + loop = do + lastPair <- connect + ifM (uses circuits ((1 <) . Set.size)) loop + $ pure lastPair main :: IO () main = $(defaultMainPuzzle) From af936d2efe1478ad0c9eb28df4953ef34d57fc7c Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 9 Dec 2025 19:45:41 -0600 Subject: [PATCH 89/91] feat(2025-09/haskell): solve Part One --- VERSION | 2 +- package.yaml | 5 +++ src/AdventOfCode/Year2025/Day09.hs | 51 ++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/AdventOfCode/Year2025/Day09.hs diff --git a/VERSION b/VERSION index dbf6952..17e250f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.8.2.0 \ No newline at end of file +2025.9.1.0 \ No newline at end of file diff --git a/package.yaml b/package.yaml index c26166f..3cb94cd 100644 --- a/package.yaml +++ b/package.yaml @@ -637,6 +637,11 @@ executables: main: AdventOfCode.Year2025.Day08 dependencies: - linear + aoc-2025-day09: + <<: *executable + main: AdventOfCode.Year2025.Day09 + dependencies: + - linear _benchmark: &benchmark ghc-options: - -threaded diff --git a/src/AdventOfCode/Year2025/Day09.hs b/src/AdventOfCode/Year2025/Day09.hs new file mode 100644 index 0000000..571d7c7 --- /dev/null +++ b/src/AdventOfCode/Year2025/Day09.hs @@ -0,0 +1,51 @@ +{-# LANGUAGE NoImplicitPrelude #-} + +module AdventOfCode.Year2025.Day09 where + +import AdventOfCode.Input (parseInputAoC, parseString) +import AdventOfCode.Puzzle +import AdventOfCode.TH (defaultMainPuzzle) +import Data.Foldable (maximum) +import Linear (V2 (..)) +import Relude +import Text.Trifecta (Parser, comma, decimal, newline, sepEndBy) + +locations :: Parser [V2 Integer] +locations = location `sepEndBy` newline + where + location = V2 <$> (decimal <* comma) <*> decimal + +getExample :: IO [V2 Integer] +getExample = parseString locations example + +example :: String +example = + "7,1\n\ + \11,1\n\ + \11,7\n\ + \9,7\n\ + \9,5\n\ + \2,5\n\ + \2,3\n\ + \7,3" + +getInput :: IO [V2 Integer] +getInput = parseInputAoC 2025 9 locations + +-- allPairs :: (Metric f, Num a, Ord a) => [f a] -> [(f a, f a)] +allPairs :: [a] -> [(a, a)] +allPairs xs = + -- sortOn (Down . (uncurry qd)) + [(p, q) | p : ps <- tails xs, q <- ps] + +partOne :: SimplePuzzle [V2 Integer] Integer +partOne = asks (maximum . map area . allPairs) + +area :: (V2 Integer, V2 Integer) -> Integer +area = product . (1 +) . abs . uncurry (-) + +partTwo :: SimplePuzzle [V2 Integer] Integer +partTwo = fail "not yet implemented" + +main :: IO () +main = $(defaultMainPuzzle) From 127541558d88b852ede482e77b2dc21f0c0c9be1 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 9 Dec 2025 23:42:33 -0600 Subject: [PATCH 90/91] chore(2025-09/haskell): start Part Two --- VERSION | 2 +- package.yaml | 2 ++ src/AdventOfCode/Year2025/Day09.hs | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 17e250f..ed85d3e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.9.1.0 \ No newline at end of file +2025.9.2.0 \ No newline at end of file diff --git a/package.yaml b/package.yaml index 3cb94cd..cf93406 100644 --- a/package.yaml +++ b/package.yaml @@ -56,6 +56,7 @@ library: - cryptohash-md5 - data-interval - data-ordlist + - diagrams-lib - dlist - fast-digits - finitary @@ -641,6 +642,7 @@ executables: <<: *executable main: AdventOfCode.Year2025.Day09 dependencies: + - diagrams-lib - linear _benchmark: &benchmark ghc-options: diff --git a/src/AdventOfCode/Year2025/Day09.hs b/src/AdventOfCode/Year2025/Day09.hs index 571d7c7..f18a9f0 100644 --- a/src/AdventOfCode/Year2025/Day09.hs +++ b/src/AdventOfCode/Year2025/Day09.hs @@ -45,7 +45,7 @@ area :: (V2 Integer, V2 Integer) -> Integer area = product . (1 +) . abs . uncurry (-) partTwo :: SimplePuzzle [V2 Integer] Integer -partTwo = fail "not yet implemented" +partTwo = fail "4589596620 is too high" main :: IO () main = $(defaultMainPuzzle) From a40bcdad944ae1f92c401119ae23a15f4e4d327d Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Fri, 12 Dec 2025 22:41:11 -0600 Subject: [PATCH 91/91] feat(2025-10/haskell): start Part One [ci skip] --- VERSION | 2 +- package.yaml | 5 ++++ src/AdventOfCode/Year2025/Day10.hs | 46 ++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 src/AdventOfCode/Year2025/Day10.hs diff --git a/VERSION b/VERSION index ed85d3e..94489d8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2025.9.2.0 \ No newline at end of file +2025.10.1.0 \ No newline at end of file diff --git a/package.yaml b/package.yaml index cf93406..61be1be 100644 --- a/package.yaml +++ b/package.yaml @@ -644,6 +644,11 @@ executables: dependencies: - diagrams-lib - linear + aoc-2025-day10: + <<: *executable + main: AdventOfCode.Year2025.Day10 + dependencies: + - vector _benchmark: &benchmark ghc-options: - -threaded diff --git a/src/AdventOfCode/Year2025/Day10.hs b/src/AdventOfCode/Year2025/Day10.hs new file mode 100644 index 0000000..b7e1684 --- /dev/null +++ b/src/AdventOfCode/Year2025/Day10.hs @@ -0,0 +1,46 @@ +{-# LANGUAGE NoImplicitPrelude #-} + +module AdventOfCode.Year2025.Day10 where + +import AdventOfCode.Input (parseInputAoC, parseString) +import Control.Lens (ifoldl') +import Data.Bits (clearBit, setBit) +import Data.List.NonEmpty qualified as NE +import Data.Vector (Vector) +import Data.Vector qualified as Vector +import Relude +import Text.Trifecta (Parser, braces, brackets, char, commaSep, natural, parens) + +data Machine + = Machine + { _lightDiagram :: Int, + _wiringSchematics :: NonEmpty [Int], + _joltageRequirements :: Vector Int + } + deriving (Eq, Generic, Show) + +machine :: Parser Machine +machine = Machine <$> diagram <*> schematics <*> joltages + where + diagram = + ifoldl' (\i acc b -> bool clearBit setBit b acc i) 0 + . reverse + <$> brackets (some (False <$ char '.' <|> char '#' $> True)) + schematics = NE.some1 (parens (commaSep int)) + joltages = Vector.fromList <$> braces (commaSep int) + int = fromInteger <$> natural + +getExample :: IO [Machine] +getExample = parseString (some machine) example + +example :: String +example = + "[.##.] (3) (1,3) (2) (2,3) (0,2) (0,1) {3,5,4,7}\n\ + \[...#.] (0,2,3,4) (2,3) (0,4) (0,1,2) (1,2,3,4) {7,5,12,7,2}\n\ + \[.###.#] (0,1,2,3,4) (0,3,4) (0,1,2,4,5) (1,2) {10,11,11,5,10,5}" + +getInput :: IO [Machine] +getInput = parseInputAoC 2025 10 (some machine) + +main :: IO () +main = fail "not yet implemented"