diff --git a/.github/workflows/sbt.yml b/.github/workflows/sbt.yml index fe01cba6..797c4b6a 100644 --- a/.github/workflows/sbt.yml +++ b/.github/workflows/sbt.yml @@ -6,17 +6,32 @@ on: jobs: test: - runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Set up JDK 21 + - name: Set up JDK 25 uses: actions/setup-java@v4 with: distribution: 'zulu' - java-version: '21' + java-version: '25' cache: 'sbt' - uses: sbt/setup-sbt@v1 - name: Test with SBT run: sbt test + + deps: + if: github.ref == 'refs/heads/master' + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 25 + uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: '25' + cache: 'sbt' + - uses: sbt/setup-sbt@v1 + - uses: scalacenter/sbt-dependency-submission@v2 diff --git a/README.md b/README.md index 383b7e3d..b82cda09 100644 --- a/README.md +++ b/README.md @@ -2,15 +2,16 @@ [![Scala CI](https://github.com/sim642/adventofcode/workflows/Scala%20CI/badge.svg?branch=master)](https://github.com/sim642/adventofcode/actions?query=workflow%3A%22Scala+CI%22) -| Year | Solutions | Inputs | Tests | -| ---- | --------- | ------ | ----- | -| 2015 | [Solutions](src/main/scala/eu/sim642/adventofcode2015) | [My inputs](src/main/resources/eu/sim642/adventofcode2015) | [Tests](src/test/scala/eu/sim642/adventofcode2015) | -| 2016 | [Solutions](src/main/scala/eu/sim642/adventofcode2016) | [My inputs](src/main/resources/eu/sim642/adventofcode2016) | [Tests](src/test/scala/eu/sim642/adventofcode2016) | -| 2017 | [Solutions](src/main/scala/eu/sim642/adventofcode2017) | [My inputs](src/main/resources/eu/sim642/adventofcode2017) | [Tests](src/test/scala/eu/sim642/adventofcode2017) | -| 2018 | [Solutions](src/main/scala/eu/sim642/adventofcode2018) | [My inputs](src/main/resources/eu/sim642/adventofcode2018), [other inputs](src/test/resources/eu/sim642/adventofcode2018) | [Tests](src/test/scala/eu/sim642/adventofcode2018) | -| 2019 | [Solutions](src/main/scala/eu/sim642/adventofcode2019) | [My inputs](src/main/resources/eu/sim642/adventofcode2019) | [Tests](src/test/scala/eu/sim642/adventofcode2019) | -| 2020 | [Solutions](src/main/scala/eu/sim642/adventofcode2020) | [My inputs](src/main/resources/eu/sim642/adventofcode2020), [other inputs](src/test/resources/eu/sim642/adventofcode2020) | [Tests](src/test/scala/eu/sim642/adventofcode2020) | -| 2021 | [Solutions](src/main/scala/eu/sim642/adventofcode2021) | [My inputs](src/main/resources/eu/sim642/adventofcode2021), [other inputs](src/test/resources/eu/sim642/adventofcode2021) | [Tests](src/test/scala/eu/sim642/adventofcode2021) | -| 2022 | [Solutions](src/main/scala/eu/sim642/adventofcode2022) | [My inputs](src/main/resources/eu/sim642/adventofcode2022) | [Tests](src/test/scala/eu/sim642/adventofcode2022) | -| 2023 | [Solutions](src/main/scala/eu/sim642/adventofcode2023) | [My inputs](src/main/resources/eu/sim642/adventofcode2023) | [Tests](src/test/scala/eu/sim642/adventofcode2023) | -| 2024 | [Solutions](src/main/scala/eu/sim642/adventofcode2024) | [My inputs](src/main/resources/eu/sim642/adventofcode2024) | [Tests](src/test/scala/eu/sim642/adventofcode2024) | +| Year | Solutions | Tests | +| ---- | --------- | ----- | +| 2015 | [Solutions](src/main/scala/eu/sim642/adventofcode2015) | [Tests](src/test/scala/eu/sim642/adventofcode2015) | +| 2016 | [Solutions](src/main/scala/eu/sim642/adventofcode2016) | [Tests](src/test/scala/eu/sim642/adventofcode2016) | +| 2017 | [Solutions](src/main/scala/eu/sim642/adventofcode2017) | [Tests](src/test/scala/eu/sim642/adventofcode2017) | +| 2018 | [Solutions](src/main/scala/eu/sim642/adventofcode2018) | [Tests](src/test/scala/eu/sim642/adventofcode2018) | +| 2019 | [Solutions](src/main/scala/eu/sim642/adventofcode2019) | [Tests](src/test/scala/eu/sim642/adventofcode2019) | +| 2020 | [Solutions](src/main/scala/eu/sim642/adventofcode2020) | [Tests](src/test/scala/eu/sim642/adventofcode2020) | +| 2021 | [Solutions](src/main/scala/eu/sim642/adventofcode2021) | [Tests](src/test/scala/eu/sim642/adventofcode2021) | +| 2022 | [Solutions](src/main/scala/eu/sim642/adventofcode2022) | [Tests](src/test/scala/eu/sim642/adventofcode2022) | +| 2023 | [Solutions](src/main/scala/eu/sim642/adventofcode2023) | [Tests](src/test/scala/eu/sim642/adventofcode2023) | +| 2024 | [Solutions](src/main/scala/eu/sim642/adventofcode2024) | [Tests](src/test/scala/eu/sim642/adventofcode2024) | +| 2025 | [Solutions](src/main/scala/eu/sim642/adventofcode2025) | [Tests](src/test/scala/eu/sim642/adventofcode2025) | diff --git a/build.sbt b/build.sbt index 1ae737b5..f6c54161 100644 --- a/build.sbt +++ b/build.sbt @@ -2,7 +2,7 @@ name := "adventofcode" version := "0.1" -scalaVersion := "3.5.2" +scalaVersion := "3.7.4" scalacOptions ++= Seq( "-deprecation", "-feature", @@ -16,11 +16,11 @@ scalacOptions ++= Seq( libraryDependencies += "org.scalactic" %% "scalactic" % "3.2.19" libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.19" % "test" -libraryDependencies += "org.scalacheck" %% "scalacheck" % "1.18.1" % "test" +libraryDependencies += "org.scalacheck" %% "scalacheck" % "1.18.1" % "test" // TODO: 1.19 available, but not corresponding scalatestplus libraryDependencies += "org.scalatestplus" %% "scalacheck-1-18" % "3.2.19.0" % "test" libraryDependencies += "org.scala-lang.modules" %% "scala-parser-combinators" % "2.4.0" -libraryDependencies += "com.lihaoyi" %% "ujson" % "4.0.2" -libraryDependencies += "tools.aqua" % "z3-turnkey" % "4.13.0.1" +libraryDependencies += "com.lihaoyi" %% "ujson" % "4.4.1" +libraryDependencies += "tools.aqua" % "z3-turnkey" % "4.14.1" libraryDependencies += "io.github.hughsimpson" %% "scalameter" % "0.22.1" % "test" // Scala 3 compatible scalameter fork // TODO: scalameter tests don't work in SBT diff --git a/project/build.properties b/project/build.properties index 1767a6f8..a360ccac 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version = 1.10.5 +sbt.version = 1.11.7 diff --git a/src/main/resources/eu/sim642/adventofcode2024/day21.txt b/src/main/resources/eu/sim642/adventofcode2024/day21.txt new file mode 100644 index 00000000..45e27e1d --- /dev/null +++ b/src/main/resources/eu/sim642/adventofcode2024/day21.txt @@ -0,0 +1,5 @@ +593A +508A +386A +459A +246A diff --git a/src/main/resources/eu/sim642/adventofcode2024/day22.txt b/src/main/resources/eu/sim642/adventofcode2024/day22.txt new file mode 100644 index 00000000..d71e66ec --- /dev/null +++ b/src/main/resources/eu/sim642/adventofcode2024/day22.txt @@ -0,0 +1,2462 @@ +9934779 +2152381 +503629 +16463157 +6604765 +10656550 +14732578 +1521218 +16374827 +10971068 +482403 +5712888 +2066009 +3554443 +12260252 +15389653 +15247095 +8662566 +9761795 +306878 +1733065 +6289511 +7527385 +12802412 +5712214 +1008199 +6571712 +1150493 +6399094 +16132129 +1385556 +1158173 +16065247 +13185959 +10781917 +9511646 +7591752 +3451813 +9242364 +6788303 +12055918 +10107205 +979884 +11530140 +14020629 +2080524 +8588050 +5794072 +2576002 +7518216 +13279182 +11171757 +3766541 +14300642 +11070388 +3670046 +9234733 +3980154 +4778724 +15625744 +14227994 +4479392 +10198377 +15791857 +11383603 +7269652 +8627865 +11955391 +3402887 +3289748 +2746454 +7581049 +11720565 +1095717 +13054616 +7184924 +15511765 +11746265 +13658208 +195201 +6346567 +13736363 +8373839 +2772950 +15633943 +13003922 +2895870 +2251492 +2356169 +11107610 +1880849 +4428810 +16388524 +5773838 +14525926 +4806003 +7319513 +7256174 +14220936 +13812460 +10659259 +14516238 +12419428 +11334296 +600779 +1809280 +10369274 +9082054 +9348164 +8893887 +12321928 +15498305 +3373942 +12949507 +16311891 +13408663 +16026670 +11108278 +5422830 +3686442 +9702061 +12503323 +13841527 +8372518 +15379742 +3065979 +2047835 +13878277 +6894548 +922352 +4263132 +4281282 +10739333 +12817123 +9774576 +10666128 +1517974 +3159095 +7459549 +1078678 +886193 +15004380 +12190750 +3493419 +9847918 +3077389 +12866510 +8993728 +3755589 +2818783 +615215 +11006706 +1996806 +15015972 +8032571 +16218131 +15697910 +15918496 +14493072 +5355503 +7189542 +533650 +12132715 +6860213 +5118950 +4173131 +148117 +8589410 +11562286 +7282768 +2155906 +13901441 +12811122 +4487890 +1021959 +9057216 +6844376 +5416119 +4835418 +5213788 +1624541 +10047895 +15480861 +168031 +14842688 +3852279 +6167672 +11482974 +13160879 +13301007 +12203575 +3093103 +16442344 +15861747 +16384816 +15955739 +3151381 +10792848 +16416765 +352312 +5421499 +6235239 +8063578 +16579266 +1146938 +16194283 +3525685 +12403262 +1151686 +9988044 +15589807 +12098941 +13551582 +5827856 +9442303 +12333890 +5387175 +15325153 +15117366 +1886657 +6145550 +1074268 +8742576 +8735170 +10868330 +15562822 +8783298 +9763830 +548958 +8992953 +1979418 +3461612 +13682643 +9382675 +2316292 +11076130 +13740666 +10874958 +12870756 +13026469 +13335245 +13290722 +4623909 +9093641 +9845616 +10231762 +4702273 +15519141 +4524290 +12774180 +10328426 +6466667 +3769220 +9402439 +1132481 +14034996 +5988174 +1762623 +494804 +14455235 +6827776 +10456375 +7479654 +11042715 +1444885 +11299419 +13326664 +5524041 +283068 +15595557 +4966098 +14095821 +1363233 +6952774 +12412712 +8884360 +15546077 +911202 +1834936 +10008662 +6984236 +6781281 +13463022 +8686414 +6045578 +5062639 +3675986 +1016101 +1093795 +6417661 +8060335 +11587909 +13515525 +12206991 +10454043 +10028585 +5012674 +8367896 +7287315 +7548423 +14619131 +14099913 +10548480 +15495270 +11101107 +8850405 +6224315 +1908204 +10518120 +12788722 +5202644 +3012727 +7141814 +11851016 +6242433 +381803 +14276856 +3313142 +10575914 +4881438 +4929280 +1129464 +10821292 +13346386 +11322402 +6731530 +15428976 +5916118 +2315614 +5820010 +14545525 +12716705 +2010371 +7601907 +3707499 +7189775 +12675146 +11838523 +1178863 +6265438 +15841582 +2428426 +16706018 +10697478 +5759101 +14340034 +5095105 +8346398 +13420644 +4782002 +12199851 +14947797 +1094563 +11719404 +4646069 +14300570 +14659727 +10633308 +9989336 +12474562 +8116295 +6896926 +4790169 +13079325 +11979214 +4636129 +14678345 +4531804 +13643169 +8234816 +15431268 +14959118 +8601594 +1438264 +6190409 +12682857 +12631625 +9897181 +5301542 +12001387 +1339008 +15391319 +6728077 +4912957 +11310219 +13087428 +10464957 +11114620 +1952487 +3617878 +1541947 +14729086 +2821719 +9096477 +2112196 +833934 +12751324 +14875017 +9133379 +662243 +7849601 +15149135 +969920 +15246327 +6326826 +1258167 +16647105 +500222 +3522665 +2214327 +2712833 +10165573 +6668403 +7824933 +15507867 +901779 +15174294 +12185225 +12644158 +15298249 +13114879 +2533514 +9927729 +13419413 +2851960 +15831255 +15461969 +8728159 +14757008 +5297086 +8387638 +10790216 +1333986 +9104406 +8046637 +5193397 +13121670 +10456864 +13024914 +11809698 +6170189 +4703276 +1489014 +12202467 +3756597 +15970193 +10560369 +12506727 +1072536 +11150155 +1983410 +738965 +13004487 +12451328 +7559490 +9441307 +14550857 +5235886 +9226410 +12416416 +12130448 +10136930 +9395432 +275019 +7092993 +11318148 +8945880 +15758153 +2276893 +9875986 +15651794 +8885057 +7412774 +3483393 +16180342 +11805956 +15974125 +4441715 +12255282 +1607337 +6749822 +8738318 +15137299 +10738178 +11916325 +12923356 +15162142 +3178550 +13130930 +14261862 +5479752 +2724436 +221980 +3432591 +12491723 +4463824 +372861 +15690925 +5323623 +13553127 +10266400 +13698272 +10559132 +9196639 +6034302 +6526033 +9889983 +1686077 +16215885 +4248370 +15907401 +13814711 +8050532 +15087541 +12321878 +16720652 +1993934 +4387850 +11869405 +402348 +4914053 +13460107 +9954222 +3098551 +10861931 +8585412 +15386036 +15808495 +9276791 +870847 +11285371 +8889542 +884159 +11716924 +11246927 +10323367 +3250644 +4171254 +9887191 +4185671 +15777258 +6896112 +5310245 +14772068 +13719989 +4902642 +1137124 +3032405 +865060 +6521837 +922933 +16415086 +14729497 +13574113 +3099746 +7270546 +7237643 +3809553 +15024280 +12799741 +16087468 +1424873 +3757094 +11209958 +7228679 +882917 +13874637 +501364 +5745979 +15801337 +9486597 +9627980 +358814 +8111029 +11591411 +5603340 +8374854 +493613 +15320859 +3165680 +11071251 +217867 +6250941 +3530789 +6792419 +12759247 +4555756 +11922559 +12921911 +14655552 +8995403 +5872540 +10550670 +13393992 +14933612 +6694113 +10535354 +14576465 +4016047 +13193821 +16289526 +14594299 +14085714 +13825836 +4507103 +9751963 +9312858 +9679256 +1657710 +10005362 +6695620 +12503341 +3491307 +4615604 +8249381 +9845948 +13724183 +9151181 +2958292 +2859836 +637752 +2423558 +4805943 +8729026 +3689316 +8893651 +8912319 +16299442 +13625646 +8110425 +6655113 +959175 +3609616 +5018786 +6637695 +13260242 +16537886 +4881915 +7708217 +5608589 +8791338 +12269662 +8200597 +2305642 +16312383 +14526902 +10196338 +11654895 +15945537 +3875787 +9097622 +2891249 +15174589 +6235181 +12053277 +9986503 +10471011 +1497926 +281206 +9513350 +1019430 +8296166 +4638241 +3032679 +9663484 +11701255 +7343879 +16189819 +5249313 +4259738 +12457312 +14531356 +4148018 +13248521 +10362792 +9970133 +11656637 +6331137 +10576699 +10447829 +12565473 +2823586 +7703463 +6633090 +6102332 +14410429 +9174479 +3412084 +9652175 +4269074 +6830671 +15063174 +10433459 +2718364 +244399 +15683287 +3118382 +4634653 +2843159 +11429632 +10163554 +12698321 +16136272 +468006 +5972247 +15930613 +8976379 +14257219 +14216972 +4017752 +6163172 +3307114 +9104391 +8865661 +15934572 +10312917 +11159879 +6272557 +9616872 +1836296 +5644814 +5278532 +11173605 +4107171 +7712268 +9841545 +11796243 +6468637 +3397561 +2097700 +2913419 +2999338 +3989350 +13550782 +9020146 +8201295 +949344 +11880695 +15913449 +3311860 +7548328 +13945339 +884445 +1486370 +13605361 +12834121 +7203641 +11727395 +16149231 +6242445 +2707344 +9776461 +975311 +2234738 +6181427 +3675487 +6314344 +5348555 +13635353 +14126648 +876012 +10038796 +16608234 +2440691 +1720607 +2940011 +1914968 +14337287 +16573607 +2765090 +8096936 +10758498 +12491199 +3101781 +12157401 +5618539 +16164259 +8236314 +8291143 +5323328 +15688732 +8730286 +10589490 +13031325 +4181278 +4663980 +16036105 +15884448 +6876897 +12664642 +10892204 +9503916 +14471914 +6001387 +6090340 +3773661 +8540482 +15470080 +2757750 +15899029 +16716210 +10237881 +6066373 +11669262 +6481420 +12419238 +16421903 +12460610 +10140297 +4733597 +11856057 +14017257 +164075 +15193685 +3213369 +10216177 +14884992 +11967327 +1344397 +939380 +14874443 +16421178 +7681820 +8582161 +11972427 +9206113 +9592522 +15998774 +14607785 +16573418 +5245918 +15206950 +11577232 +15926293 +7475100 +3005258 +8346033 +13959598 +8662642 +11559611 +13431563 +15415427 +12297104 +16261394 +10369286 +8577635 +12623822 +11330795 +11012630 +8969034 +6206389 +15479780 +11525135 +6812692 +10217296 +13126041 +1047475 +12066825 +9029262 +11653479 +11756458 +2739718 +14465405 +9245911 +7483574 +6299794 +241883 +10515717 +3985432 +3031645 +1133551 +13455243 +14907954 +9545706 +6826155 +9724974 +1822470 +6628609 +5424531 +11683300 +13066931 +3925605 +6238658 +15205563 +2790922 +13354999 +6579722 +3675297 +16290162 +14509537 +16674235 +16145473 +7138932 +1672916 +1317464 +8488128 +4609564 +14222975 +13741559 +13771931 +4249288 +640123 +2900137 +1219226 +4139837 +5565902 +3369156 +3514237 +9817547 +2652108 +4479068 +16077561 +730358 +795598 +15197888 +12599381 +4979306 +3198328 +14698269 +9850428 +10606878 +2955962 +6365431 +13263174 +8844143 +13991580 +10467142 +10264323 +1004885 +15699972 +16604079 +14058907 +10283338 +7882070 +5168950 +13408135 +9514814 +13047407 +10325351 +13838681 +7627737 +1790467 +2079984 +5064212 +6398575 +13970101 +9082107 +15453031 +8562053 +1887562 +7109807 +16602813 +8849200 +15463842 +13837686 +8109306 +8459411 +4672668 +13982892 +1590742 +11252911 +6410259 +2367873 +3755669 +11193083 +3844205 +14019544 +537661 +3250364 +15023809 +16507892 +4862078 +15506611 +11328689 +5831876 +1393656 +11105970 +617799 +8955524 +4213202 +11764666 +12092900 +3805551 +14362948 +15980191 +1716559 +14998272 +6088487 +2191558 +2500152 +1728569 +16421262 +8205644 +16666707 +4972330 +11988714 +5701360 +11970591 +5692858 +12724086 +14548294 +15672281 +2881176 +16107356 +2717753 +9997530 +9171634 +11948113 +735351 +1952157 +14543269 +6408041 +15726665 +4972340 +8564948 +1656140 +4374908 +2215564 +6622182 +16148787 +8931896 +16210974 +554150 +5955503 +12518210 +6534407 +2474017 +1835668 +6184398 +10177617 +12512816 +11031887 +9768214 +11851861 +11064134 +2000222 +7069700 +4473764 +11371964 +3291067 +7727286 +2359461 +13319008 +10139325 +6201907 +9135173 +13499738 +15093300 +5224336 +5799078 +14805760 +3369572 +10357440 +8707451 +13962091 +13064178 +5383091 +15648516 +294165 +10263536 +16763303 +9316129 +14841324 +9988557 +14035113 +13344714 +10584251 +7781946 +14187198 +14939274 +12120516 +2387923 +13443010 +14095120 +6823918 +7947758 +13352723 +5898992 +13546684 +11952334 +12735220 +9840599 +6209450 +15618607 +4498999 +4243742 +7095425 +9955159 +5710057 +10085265 +2689892 +6448016 +10420183 +8673164 +13604929 +10266991 +16512094 +3600434 +6005105 +7622455 +4349316 +14668161 +5643846 +14544189 +2488422 +13009980 +12601654 +12913010 +8268795 +5378435 +5939761 +13180647 +9079474 +8465842 +10043327 +9863301 +14637777 +3986606 +11955227 +6664493 +3798133 +578142 +13941407 +9473539 +13338845 +3297822 +8731737 +12842935 +584207 +15767892 +9389218 +12518017 +8756029 +15072549 +15991579 +16576438 +10860800 +16614177 +133963 +5373155 +10749008 +12098162 +16277159 +15757527 +1893213 +341903 +9672597 +2366491 +11915136 +1257932 +11601507 +5895712 +9514827 +7602536 +10993659 +7645089 +5162555 +1535899 +8344692 +6427572 +7399600 +16060980 +2942272 +6850670 +438777 +4899563 +15342382 +246812 +9779869 +13171007 +2146025 +1694155 +515750 +4976127 +9690880 +15662347 +16063918 +7715574 +11673593 +1767101 +9670729 +4905285 +11168053 +12284228 +6905818 +14821098 +12398554 +4011609 +9707086 +11157936 +10449703 +3082900 +8045031 +2288763 +16684787 +4916942 +10999372 +1594692 +16639291 +7699580 +16387607 +16482182 +10097137 +3720304 +6399901 +6584808 +11718735 +16602513 +14836515 +15147023 +1032749 +16353172 +4909220 +12538942 +4383708 +4533026 +6665771 +2443590 +2188602 +13316476 +1590829 +2403737 +15380112 +13819945 +8832430 +9596391 +13197587 +2702902 +15408297 +6754769 +15954572 +761373 +6840111 +4995397 +11748835 +3690145 +15604409 +321299 +14402064 +16178084 +8253591 +2723335 +7211487 +10681201 +8264664 +8543068 +10384591 +11911873 +5039613 +2239730 +16635707 +2051975 +3320197 +6081742 +10736026 +5795194 +15158248 +15093684 +3917735 +16336203 +9339071 +7162762 +9307057 +5227916 +6329767 +3249429 +12672091 +3002493 +11000132 +3439930 +8855146 +11098426 +7683805 +15490436 +6415659 +2972449 +4324181 +11830262 +6032746 +3812537 +7292640 +16066662 +2710678 +12986866 +14938226 +5477301 +3726133 +15889742 +12073987 +16032777 +5800540 +15784464 +4377303 +13081323 +9024322 +5783723 +14791780 +14349252 +16724367 +3217223 +11607846 +4639892 +2814053 +13127821 +1223010 +11088140 +1315476 +11978673 +449297 +15201082 +11756461 +190517 +7549523 +5987842 +5889307 +16398076 +959326 +13254213 +9358225 +12840629 +3183248 +6873445 +13132169 +11815216 +16012075 +8959011 +1388183 +16031413 +9664133 +11547973 +7111880 +10906157 +8066498 +7576967 +14841898 +852393 +8229573 +9941871 +3554558 +11455675 +5956579 +7739231 +6312437 +11708936 +16555995 +14244867 +13136171 +12360051 +9497820 +8749755 +2801503 +15631768 +16311521 +13374474 +9462050 +4909898 +2794311 +7979835 +3701890 +15677013 +731776 +13904790 +2944734 +14738707 +1164497 +5514830 +3575102 +15345142 +4917106 +7011387 +10601902 +444600 +16565218 +5334734 +11715771 +1015220 +12517159 +5251686 +8711990 +9553542 +15759748 +10324541 +10705159 +10375493 +1041061 +8926568 +11332026 +4208704 +14677347 +2379334 +12702224 +12886440 +12208959 +4649904 +16500407 +9709922 +1941824 +11962026 +6672060 +8544710 +12312127 +2988576 +1915973 +14576454 +12434621 +14427470 +7091791 +6642807 +6443043 +3903196 +1435447 +5439884 +14251471 +8105871 +227303 +6930677 +9295234 +4434314 +2310013 +8286336 +9540030 +957835 +2454852 +7090256 +382779 +210035 +2749377 +10249427 +1686028 +5802377 +15049110 +1993698 +5330699 +13452128 +12682425 +3492212 +11407387 +3878706 +12695700 +5061208 +13924636 +5844654 +15076397 +9416146 +1812978 +15139768 +6897041 +10534496 +1449651 +3793541 +15343404 +6020175 +12061179 +12298674 +13348303 +10375037 +14771610 +11879313 +9219694 +10595898 +3375898 +15641783 +6880458 +14936850 +866134 +14363704 +10464084 +15501331 +2673139 +9816705 +2854073 +1935667 +8248023 +947887 +265115 +751207 +9614268 +12228785 +10248449 +16647749 +2077349 +16394716 +5540123 +5873946 +7361150 +15306736 +7586767 +2615289 +11860295 +8335481 +1846959 +637013 +6372889 +2125446 +16516003 +3148205 +287967 +15336275 +15886001 +15309820 +2222315 +15564327 +5720316 +11350466 +12985005 +1794344 +9163522 +12733417 +9330288 +11178512 +14995424 +4044532 +14389903 +1806327 +4438568 +2043069 +10533318 +8621104 +15535245 +11776563 +12227090 +3847492 +7686261 +12245652 +2621786 +12640636 +13594102 +16564002 +11075133 +2659372 +9586612 +8986721 +5366963 +14479134 +15305821 +14549679 +9460396 +2257342 +8667997 +1783885 +1448100 +11729847 +13147579 +1053918 +1328147 +4653445 +14766780 +2307793 +4111818 +14055750 +15271221 +11436110 +10124235 +14159267 +194083 +4681702 +9329835 +820734 +179800 +1429382 +6091137 +10096514 +16619402 +1753879 +11113057 +14336923 +7094371 +6395289 +341933 +7675751 +6312605 +9242801 +11044890 +10315386 +1851714 +230688 +8210134 +5276396 +3582918 +9394167 +1490773 +9099027 +3111827 +10059307 +10050396 +4895688 +1495319 +13536136 +13278263 +1665534 +1328737 +4358432 +11931853 +9501120 +10412960 +13321950 +10184395 +8227895 +15624401 +4696612 +4629874 +11773004 +14457637 +8244515 +16006042 +2378450 +15343488 +12762637 +2459677 +10523064 +2120116 +14104359 +11572068 +13194935 +13747409 +7432053 +15530471 +7275345 +10450970 +5571534 +1550689 +4755108 +7338210 +4261875 +1746162 +12435307 +10827686 +9280439 +11605737 +3519266 +16023910 +14087942 +9015493 +11875261 +10901831 +9973359 +15760086 +3223940 +12870942 +4599227 +4707434 +10136578 +4382068 +8539384 +12841596 +3206327 +15073843 +9679790 +11718114 +9945659 +14541796 +13751023 +3770780 +16618494 +9177638 +13018957 +359945 +8253323 +1770886 +6556965 +16291370 +684359 +682391 +2715919 +454542 +4167194 +4118207 +4823532 +15807550 +12493390 +13774230 +5609107 +3557145 +6815198 +5735276 +11091183 +11781645 +15952177 +2323406 +11319354 +16728627 +1478595 +10660245 +11455955 +4356940 +4303527 +2252330 +3770704 +10519060 +13311004 +9616223 +11699839 +12546771 +13551997 +9690700 +16582714 +5048053 +600767 +11682863 +13124421 +2951391 +13818005 +5306488 +582099 +11909112 +11744456 +6713461 +11650248 +10834890 +13342209 +186699 +2605163 +10271561 +5388638 +9841455 +307421 +16101536 +11455350 +16762076 +8080511 +1620376 +6578293 +1181576 +16706875 +1806428 +6130097 +6848923 +7068340 +8384380 +9195504 +10158235 +4062280 +2782783 +1326606 +14380191 +9906215 +6825703 +13924623 +7003357 +11813319 +10766087 +1170161 +14540958 +10492814 +14244413 +16119195 +964120 +3637945 +7121004 +5780779 +16516180 +7423820 +2546230 +9670071 +9095809 +10785084 +12992459 +4018707 +9072775 +12508652 +15357720 +2699460 +14569190 +7398065 +11345467 +8039277 +1993072 +2027561 +10954097 +14847296 +14581084 +1952766 +5806098 +10381281 +8692422 +15081718 +687594 +10781972 +14913422 +7228710 +5776651 +15544345 +7450900 +10191264 +7294796 +3341624 +10139387 +16364312 +13940238 +5874242 +11429559 +3014044 +8094033 +456979 +12810572 +10150902 +9055454 +11300623 +4810263 +12231414 +7552620 +3675028 +11737622 +16639901 +13193618 +15721720 +12332674 +16198151 +1638924 +11680091 +14544683 +5450690 +9027890 +14096338 +14603329 +6251629 +1360012 +5048558 +14327755 +7872619 +11198556 +2878583 +15757366 +12759255 +10061148 +5468002 +13001440 +12785425 +15260739 +6560168 +16195265 +9975476 +13720464 +14416220 +2839443 +10406973 +12268514 +16492750 +5316887 +8749638 +13057112 +8184289 +1632090 +11317464 +2171604 +10201812 +2449373 +7151410 +661148 +16263646 +6845418 +4580893 +13604493 +14659250 +4729134 +2098453 +14993977 +4715725 +12355336 +3533905 +8656490 +8130794 +14520280 +5836578 +3877143 +7080042 +2332090 +11616811 +1193582 +4748438 +740613 +8342880 +767902 +12623592 +16202713 +5480492 +15059963 +2924597 +13267211 +13812623 +11468208 +14335109 +845936 +12916917 +1125236 +168421 +2853795 +7151421 +5357771 +7793395 +12412663 +8991519 +4863260 +1894457 +13909824 +6886433 +8091478 +13934208 +4602068 +13440437 +13166348 +12367436 +2715330 +2319163 +16755933 +8821354 +3286577 +15597507 +6719907 +9143117 +15818816 +3282635 +2876968 +13855557 +9687185 +9679516 +7166787 +1412897 +16337712 +2568883 +2087927 +15630310 +5727530 +12907986 +16506817 +8093518 +12571541 +11927107 +10721885 +9865917 +10604670 +9773175 +567131 +12275936 +13627260 +991740 +1325671 +1353481 +4851763 +1474228 +2850967 +5559654 +5349257 +9443683 +16679720 +6110929 +13509527 +7768177 +6395870 +12327617 +9944772 +1830500 +4114113 +10870801 +8916709 +1190770 +3999550 +12838637 +13498720 +4970835 +7260045 +14553347 +3057839 +1304742 +11520031 +15067749 +15971792 +14300696 +11884792 +7390455 +2755700 +3748337 +11786317 +9925988 +13657793 +6374550 +6801207 +1332378 +11710688 +12997458 +15905596 +13915545 +12408921 +3891152 +9099366 +11521578 +578479 +8273807 +8454097 +9702278 +9344605 +5225701 +11301179 +1971051 +11694251 +13358681 +1344152 +3129399 +3671177 +12146784 +4427477 +16092389 +3650761 +15116052 +10224579 +10177907 +4271567 +2194927 +15883996 +15612729 +3178969 +13488421 +1894340 +869404 +9153208 +10898456 +7194232 +13082904 +5450443 +6713345 +8960238 +9905643 +6376110 +15448801 +3317829 +8413611 +10556423 +655066 +3002344 +10223918 +4613979 +9896456 +8347876 +7110894 +7952070 +15224107 +7055448 +16139954 +10613985 +2146516 +14854455 +10810589 +2484730 +9960169 +16334500 +7998349 +13499695 +8781578 +6067449 +10594278 +206520 +14549180 +11932441 +12775926 +12599325 +10159116 +12667829 +14560901 +5226910 +13534705 +15670884 +5287365 +2862492 +4396729 +3768780 +3228549 +4359731 +11088771 +10494637 +9077472 +9460393 +15695376 +13053600 +12165046 +476355 +12013825 +5985329 +11613483 +8416589 +2265132 +12305532 +9040806 +15431339 +12600732 +14635970 +11381557 +15026003 +5325465 +8236630 +9415474 +2039954 +1414445 +2614519 +4914759 +1897221 +1868953 +9092879 +15643739 +14904719 +8134262 +6728058 +13818889 +4096155 +16101725 +14456127 +12436575 +10772919 +8732028 +1210947 +13825883 +171683 +12754374 +10796602 +13797223 +9295371 +12943916 +1029924 +8376217 +4342554 +1452719 +5544535 +11389133 +766790 +10873137 +6689916 +6704893 +4175467 +12835416 +4238375 +6746964 +15733897 +3404342 +8326770 +2140719 +9223458 +10595574 +11408301 +3820112 +10722903 +5147750 +10434703 +1803474 +9107579 +14122485 +359987 +9432602 +3992044 +3907446 +11542559 +436259 +5366163 +8143101 +15780576 +4923329 +2451546 +4322564 +8939290 +1479255 +15203965 +5755711 +14158753 +11880809 +8295547 +9270168 +14294295 +1953527 +12524518 +13081373 +7561612 +12784195 +1551905 +16382481 +11414277 +6709704 +5861781 +14476718 +10713929 +1783423 +10521742 +12957645 +12117521 +6199176 +5088119 +8640317 +11547572 +720180 +7428519 +6724438 +4689310 +6113564 +13864061 +10803510 +11400762 +12253085 +16202473 +16080608 +6592414 +4458327 +4434943 +10925481 +11740708 +12990116 +12914825 +11130721 +14368296 +4308764 +1108452 +9242065 +9227611 +15095060 +16484054 +12810395 +3653816 +12857064 +3027278 +5848774 +872138 +11507315 +11843900 +6061524 +5847773 +8781968 +13835518 +15891670 +12238842 +16772068 +16095736 +1954959 +8114628 +10519360 +1219637 +734101 +11068674 +7598589 +10237175 +12567578 +5523825 +15129477 +14160460 +13639217 +5411168 +2616318 +11909070 +12016171 +13947402 +16189554 +9109168 +8335639 +1402856 +1598047 +11005016 +15393388 +11013384 +1398439 +8042144 +12837743 +8493905 +11557904 +10585842 +14687279 +10676653 +8176459 +3089727 +1567878 +14903439 +6302559 +12799169 +15433515 +12453796 +13003452 +11985496 +16418466 +11897736 +11892982 +11512345 +5418359 +13749778 +12544019 +14039935 +14577250 +6350402 +1677527 +1234025 +5189279 +1660174 +7701549 +4196044 +2239260 +9697840 +1853116 +1902265 +1162524 +14393027 +6143077 +12206583 +3977820 +11446959 +5286097 +14732074 +10603770 +16543025 +16515755 +10066941 +12987908 +3409744 +13822263 +15112057 +9207793 +14958796 +1024545 +7082784 +3772951 +431124 +14276646 +5195268 +13891786 +6011893 +15428848 +9948273 +15320261 +4173100 +4839994 +7743562 +8514898 +3655308 +15090040 +2373023 +13000893 +11811677 +11724734 +234331 +8942510 +3890316 +5475986 +10509649 +9736016 +15201702 +3052388 +14408260 +5789010 +9695745 +4212745 +16267709 +8134003 +844863 +1241195 +12496357 +12234612 +5883448 +4011506 +9261243 +11256886 +13811857 +1687935 +11128116 +16275002 +1204106 +1684253 +15196181 +10330784 +6759750 +4627289 +11392095 +6180224 +13154445 +3655741 +2113609 +7871650 +6441216 +11835261 +4508898 +6535014 +8283938 +15866616 +12896122 +8632331 +15087075 +11457806 +10347497 +12375703 +11089186 +9527695 +4910549 +7874080 +1185670 +6969101 +2383895 +7090036 +8864277 +6812994 +8183830 +10448344 +10899558 +6803729 +10588964 +13660415 +5559496 +3192613 +14092405 +8396871 +12881785 +12362947 +8525644 +7707604 +1344294 +443529 +4940218 +12101204 +7149054 +7713824 +12725257 +14015216 +10110505 +2191789 +2270117 +4590639 +3523875 +14073312 +5077280 +1355684 +9727801 +3517147 +12419956 +2634914 +2908835 +9943803 +11919984 +13463399 +14828524 +5322151 +15359675 +13243337 +14535407 +15541672 +7039616 +14327791 +4146278 +2708851 +11383376 +1734198 +13598469 +275408 +13133144 +12221256 +5099595 +856039 +9288321 +5566222 +2499472 +8052826 +10973316 +14144317 +6815122 +2340745 +8881495 +3591474 +3153514 +10821690 +7194848 +12691681 +2753567 +2653222 diff --git a/src/main/resources/eu/sim642/adventofcode2024/day23.txt b/src/main/resources/eu/sim642/adventofcode2024/day23.txt new file mode 100644 index 00000000..6292714d --- /dev/null +++ b/src/main/resources/eu/sim642/adventofcode2024/day23.txt @@ -0,0 +1,3380 @@ +rd-tj +sk-jb +kt-gu +zw-nd +sj-lr +cu-ip +ly-da +wh-ld +fr-bj +bm-gn +ie-qj +ii-wm +wo-xf +pu-ic +rg-tu +px-oh +jq-br +av-eu +wp-sb +sv-gm +tz-wn +lp-rh +ss-xl +yv-po +jk-ax +vb-nb +jz-jf +pc-hw +je-ej +jb-eu +ok-ss +zp-zt +wo-dz +lw-mw +ru-de +wm-pr +eu-zc +iv-jt +hg-rf +ir-jc +zn-cu +ft-gt +nn-xe +ks-nh +ba-ta +mc-ce +lj-nx +on-df +pg-qk +vr-bp +fm-yj +us-iv +fh-ds +dw-tv +hf-wj +to-xm +ye-en +wj-jy +nj-jg +on-ov +tv-ka +tu-ko +sd-zt +uw-kp +vi-lh +dz-bd +ml-kj +uv-cf +xp-mr +ke-hd +yo-wn +ij-tn +yd-ja +wf-nd +zh-wh +ps-dz +hu-gv +de-ik +lw-wp +uc-kq +nl-yk +jy-qc +nf-jq +ab-in +nd-tv +wf-ij +nr-oj +mq-yv +xg-gc +nq-ot +ci-bo +zn-ep +um-kl +nl-es +vj-jg +oa-xg +gc-oa +ft-wo +ky-bq +af-cz +xr-ci +qm-ip +oh-ov +hl-hm +py-oh +uh-in +do-ns +oe-dk +md-hg +au-qo +ug-rd +vg-mw +mj-lp +qb-wt +iw-ox +de-uu +sf-hf +qg-er +nu-at +bx-jz +dy-zo +jt-oa +qg-en +xv-jx +wf-tn +it-tn +yl-ba +au-lc +zn-lh +bw-fh +xp-cm +nf-th +qk-or +tb-rg +yq-jr +bs-ev +qk-ux +hp-ey +xu-gt +to-ip +cj-gl +zu-cf +rm-vm +lx-cu +gr-rj +gt-wo +ir-qc +or-ec +nu-zi +jz-ew +ly-ul +gy-st +vl-nt +zs-ur +lg-as +ex-rw +ds-oa +uw-ep +oq-co +tz-tf +to-ky +bw-oa +hc-ar +uk-in +yk-qx +jq-yq +lr-wn +nj-vj +pg-op +sb-lp +lr-tf +se-fm +bo-hj +ey-qo +mc-lz +ey-au +sv-rq +fk-xm +zi-om +wt-bl +cs-bo +zx-kt +te-mr +mu-re +sy-af +dn-aa +wg-mj +mp-na +rd-og +bm-ax +vc-po +jr-th +mq-po +os-fv +dn-fi +gd-wp +md-mh +ai-la +cg-bm +bt-tm +fy-yk +qb-nj +sc-ns +jc-ev +bx-ar +zo-zp +rw-gz +rh-ik +bd-xf +ii-tb +xq-md +es-vf +bf-wk +xr-ra +kf-pg +jd-dr +xy-it +aa-fb +xq-ea +oq-vr +yf-zu +re-dd +ea-hg +tj-bx +jf-ek +ka-zw +sf-dl +mh-nb +cc-jz +iw-ke +dd-np +yj-ie +gm-rq +py-mk +ir-uq +jv-xz +tb-tu +uh-mq +ob-uf +kn-bq +tp-da +ex-gz +yw-tw +tj-nx +mo-ac +kq-tm +vu-ne +hn-ca +sf-sb +no-dt +yg-ru +ak-tr +zi-ef +yr-kk +ji-zi +rj-zk +nf-yq +wm-pq +zc-sr +vm-ke +uf-cn +nj-zu +zp-yg +zi-fy +rv-qc +ss-cy +ng-yp +bm-ou +xr-cs +io-um +yj-fv +bf-yg +zp-ub +ad-kf +mk-fv +xj-cz +wo-ps +cs-ll +xo-iq +gn-xa +jd-wu +ej-cj +zm-nh +uz-ph +lt-tm +lg-pc +vz-pt +lo-py +wh-vo +mq-no +ek-je +ky-bc +fk-ky +jy-bs +qn-om +rd-lj +iq-zm +yy-xr +fh-gc +ox-ik +cj-gw +fh-rj +em-jg +bn-ri +ej-xw +bl-xp +jl-db +dy-sd +tf-yp +le-ga +ck-ou +gw-my +gr-zk +qe-hm +no-yv +yd-se +at-yk +aq-gu +ug-ar +oy-tx +se-hw +mg-wf +tv-zv +dh-ty +mf-aq +gf-dz +rs-pf +ux-ad +kr-yw +xf-oj +ws-aa +cf-nj +jr-oy +yy-ft +uf-yz +ih-wz +fr-dr +ih-ia +wu-nq +ra-yy +cz-ws +sb-di +fr-jd +wi-wl +tf-wn +sz-ks +py-df +ru-ga +go-pf +af-ws +jo-af +ec-vs +dx-wh +tc-di +ax-js +su-it +ak-iy +dk-mr +lo-ju +fa-kt +nv-fl +wf-ai +ky-mp +sp-hg +os-pc +uc-uf +ue-fa +ld-kb +ck-js +pg-ri +uc-yz +ss-be +bs-vc +vl-pz +aq-pe +uz-wf +qc-uq +bf-ub +dj-ku +nh-kp +mz-yi +dn-lq +cx-te +fi-jn +eu-en +qq-oa +no-ii +xn-zx +bb-ok +dq-ph +kj-pw +os-mk +is-gj +gb-jl +uw-zn +oc-vq +ka-nd +xm-wn +ij-su +xz-fk +hx-tr +hl-kq +sz-gr +zl-pl +hc-ld +ih-ea +db-hp +nn-cq +pc-yj +vl-ul +zq-vz +pt-dp +ab-df +oa-iv +iq-vq +ba-ab +se-ja +ob-ey +hu-pm +wp-mw +zy-nv +yp-sj +us-sj +yn-zb +fm-mk +fb-sy +dp-bz +co-yl +vz-gm +de-rh +ds-bw +xq-nb +ds-gc +gi-uz +wf-dq +to-cr +mk-ie +ej-zs +xm-ky +mo-wz +er-eu +no-ad +mf-fa +qo-hp +em-ga +na-pn +nb-cl +yg-zo +wb-bq +dp-gm +np-mo +ez-sh +kt-mf +tb-wi +gg-zx +zw-jj +wh-ak +ex-jh +ot-yu +dl-wp +ar-tj +be-cy +on-tw +sv-jv +fq-cc +ik-mj +dr-um +dq-ij +ke-ev +zs-xw +zm-xo +sr-qg +td-as +td-ga +es-qn +nd-kg +uo-qr +ri-qu +hv-be +td-lp +li-yd +by-za +uc-lt +vi-ip +pm-wi +ll-dw +ah-ky +uh-vd +hn-kt +zc-lg +re-wd +dj-km +rs-go +aq-ca +dw-nd +it-ij +ti-pf +wl-pr +pd-lz +ef-ri +bz-wk +ka-al +bl-hl +fl-cm +yr-cm +is-rh +vf-cz +fb-kj +cr-bq +gv-wi +az-rf +df-kr +zy-mc +wh-kb +tr-kb +fj-cb +ae-wg +xr-fo +fj-oc +fx-oe +jf-ej +xu-gv +zy-ce +hw-mk +uv-nj +zu-em +ky-en +yi-yr +cl-xq +gj-lp +ij-uz +kf-ri +uu-ga +gm-jv +px-oj +ho-wx +mh-hg +qr-cg +nt-ly +tm-rt +bj-jd +oa-zk +iy-ld +wg-ik +av-er +bf-vm +cp-yf +ek-cj +xs-ub +bx-fq +rt-ve +nh-xo +bq-ah +hc-dx +ax-qy +ly-gx +am-qk +ih-mu +fj-yu +hq-np +gq-rf +gv-rg +yw-lo +sg-ia +uu-td +ws-kj +mg-ij +lw-zp +ip-zd +na-fk +op-kf +gd-zr +jp-gg +jj-dw +hd-iw +qx-la +da-mb +xs-sd +vt-vi +in-co +do-sc +cs-yn +mb-tp +lz-xq +ac-hq +ru-uu +uq-ev +bz-om +tx-yq +fk-bc +hj-ae +kb-hc +ss-bb +qu-ng +ec-qk +gz-fg +wl-tu +fj-nh +iq-ks +sn-lc +wd-cc +ic-rw +vt-lh +dn-ro +yv-ti +ev-iw +js-jk +gy-rt +ne-au +np-re +ho-gz +mz-fl +ca-xn +ae-zb +zm-cb +fv-yd +ps-rr +pd-gq +zw-al +yg-rm +ro-aa +ce-pm +yw-ju +dv-ij +ah-xm +yf-xl +ej-ph +na-yl +tw-ju +nf-by +jy-jc +fk-mp +is-lp +dq-it +fk-to +sc-vl +ug-nx +au-by +tk-ti +xl-cy +st-rt +yd-fm +yv-pa +zs-je +hh-my +ye-eu +rd-ar +as-jn +ks-zm +ps-ft +tr-ld +xa-qy +tv-al +cp-ss +qg-gp +ai-xy +ju-on +fb-gm +ny-wn +xy-mg +pr-tu +ug-fq +cg-qy +wu-xv +go-no +vb-kr +gb-le +uw-qm +mo-lk +uf-ve +jm-cx +kb-dx +zw-kg +ra-ss +cf-hk +xg-jt +ub-zo +vf-yk +ub-ra +gc-gr +xy-uz +yu-xo +ob-hp +gf-gt +vo-hx +xs-vm +px-wo +ov-cb +mf-ue +ix-vi +wj-zr +ca-pe +tc-lw +iw-rv +hh-zq +dw-al +rm-sd +tm-uf +gf-px +ug-lj +ne-qc +sp-qu +yd-yj +dk-xk +xf-rr +ce-kk +kn-wb +ej-sh +fg-sk +ta-vd +qq-sz +ko-pr +to-na +zv-al +pe-jp +yj-os +cm-ce +ji-qn +tc-wp +uk-co +qo-sw +oc-yu +zc-nr +rs-dt +rr-gt +oc-iq +vz-hh +nq-ku +es-at +fx-hm +xf-oc +ar-cc +jv-ew +mf-pe +dq-mg +jo-vo +yp-es +us-tf +nr-as +zu-jg +vu-ey +dp-my +ie-fv +ba-vr +xr-hj +yo-tf +za-th +fa-ca +eu-gp +th-km +ku-fr +ke-jy +yb-nh +kc-ll +gr-oa +gj-le +th-mf +wi-tu +yb-pa +oj-gt +cx-dk +ic-sk +hm-te +qe-mr +de-gj +np-lk +js-jx +ye-er +qm-ix +my-zq +gp-zc +wb-to +uo-js +jg-ed +ah-wb +hx-kd +gn-qr +nj-za +uu-is +gl-ur +bt-lv +yb-cb +jm-mr +yn-xr +lt-yz +bn-vs +xp-qe +in-qz +mq-rs +pm-ii +uq-ox +bj-bg +vo-hc +bb-nn +ok-yf +tr-iy +td-le +ez-gl +pe-zx +mj-gj +ih-sg +si-kc +tm-ml +nm-nv +vx-cq +op-qk +jb-ho +lr-yp +xy-su +do-si +cr-ah +yw-oh +kp-ix +sb-wj +gj-rh +dt-sa +fh-iv +mj-ru +ra-hj +gx-si +io-fr +zl-go +uo-bm +pd-bg +th-dj +jr-tx +kf-qk +pt-rq +qg-jn +vb-fi +zq-gm +gc-rd +wm-rg +vb-ov +on-vb +mg-vo +km-nf +ce-nv +gm-my +rm-xs +tr-hc +gi-tn +yg-zt +lc-ne +uz-ai +zr-tc +cq-rh +tw-ov +pn-kn +aa-xj +ft-dz +dd-mo +oq-uk +mw-fx +kl-xi +mp-to +kd-wh +zw-dw +re-wz +yv-go +uu-gj +gw-gl +nx-og +td-mj +zq-rq +bt-yz +lv-ve +sw-sn +mq-sa +lc-gb +bq-xi +jf-xw +vg-hf +gf-rr +ux-am +jp-aq +us-yo +lc-db +fi-oh +zb-ci +mk-se +dn-xj +eu-qg +ca-jp +jb-rw +go-fr +jj-iz +vs-ad +mo-ql +gc-iv +vi-zd +ob-qo +ex-ic +xn-ue +ot-fj +dt-tk +ns-mb +lk-hq +ef-am +vm-yg +ns-gx +kj-lq +yi-nv +no-ti +jy-hd +wo-ro +oh-df +pt-gm +vl-ly +rm-dy +vz-bv +on-kr +cq-xe +je-ez +gx-tp +mb-do +pe-ue +ye-jn +hf-gd +bn-am +sv-vz +dn-pw +iy-zh +km-oy +mp-wb +ba-uh +th-jq +zk-qq +sh-ur +zx-ca +hd-qc +jb-jh +ab-vd +io-kl +kp-lh +xp-te +bn-ux +hn-xn +py-tw +lt-ev +zp-ib +fl-ce +dh-ex +hl-fx +og-bx +gp-as +ns-ul +os-ie +si-da +bg-xv +mp-cr +ed-cf +vz-my +wz-sg +do-da +ur-ej +ta-yl +am-vs +cq-cp +js-ev +ft-wx +bc-pn +fy-vf +hw-yd +se-fv +zw-zv +wh-iy +pz-ul +um-fr +iq-cb +os-qj +kj-ro +si-nt +sy-ml +sz-fh +gw-je +jc-cf +cl-ea +uf-lv +sy-ws +oq-vd +nm-xb +ue-kt +bs-ir +kb-zh +yv-pf +zs-jf +xa-re +sj-tz +tx-nf +de-ga +vg-wj +qj-ja +vj-qb +ia-mu +qx-om +ix-zn +hh-bz +kg-zv +zl-po +yy-kc +jf-je +gy-bt +sv-zq +hm-mr +sj-yo +ts-py +us-tz +db-ey +df-vb +ny-yo +ec-ef +pt-xz +tj-og +st-lv +bq-mp +zu-ed +vt-zd +qe-jm +xp-fx +tm-gy +rh-ru +pw-qk +hp-vu +iw-ir +xm-na +ml-aa +oy-br +fq-tj +ns-tp +dp-sv +xs-wk +mc-yr +zb-ra +yb-zm +bn-fq +pu-fg +cp-bb +zk-jt +ub-sd +xu-wx +cr-pr +os-ja +zc-er +qr-ix +tb-pm +iz-tg +md-pd +xk-cx +vw-oy +si-sc +cj-xw +dr-ku +nr-ye +fg-dh +uv-vj +ot-xo +qu-ny +xh-sj +yj-pq +bq-to +ii-pr +hq-dr +oq-uh +tx-km +kp-vt +sc-gx +sa-pl +zo-bf +sh-xw +mu-mp +as-ye +cb-oc +vj-hk +tt-nd +hr-nn +kb-hx +de-mj +jh-sk +li-pc +ih-mo +tb-wm +jd-xi +ov-fi +fg-jb +dl-lw +sz-iv +st-lt +hj-yn +hx-zh +kg-dh +ev-ox +fv-ux +tv-oo +la-fy +nt-do +nb-ea +cu-lh +iz-ka +ez-cj +bj-io +ja-hw +jz-fq +dp-zq +ve-cn +sn-ne +fx-jm +bj-ku +cs-zb +gf-wo +jk-qy +uo-tz +vt-ix +bv-zq +vf-om +lj-bx +bp-uh +jg-uv +qm-zn +fo-yn +tv-iz +jc-ox +th-oy +ci-cs +fy-nu +vb-ts +bc-mp +ty-fg +iy-jo +ty-ic +cl-sp +pn-vq +ev-ir +ql-ac +wg-uu +mo-rq +hx-dx +ej-gw +mu-sg +dl-gd +pu-ty +ho-jh +ty-ni +sg-re +gf-ps +es-nu +hw-fm +tp-do +hm-xp +ja-fm +ae-yn +xn-gu +vw-br +op-vs +dn-ml +wp-zr +ll-bo +lv-uc +og-ar +yu-xq +jt-fh +fl-yi +hc-iy +pu-ni +hw-os +hd-bs +jz-rd +tg-nd +qo-ac +jl-hp +ek-gl +yd-mk +bb-hr +ii-tu +uv-mx +lw-di +kg-ka +xu-it +gr-bw +hx-wh +cp-hp +es-qx +ti-po +nd-jj +ih-ac +pg-ph +ex-hw +sn-te +xa-ou +fk-wb +uv-qa +sr-nr +sc-nt +qc-vc +qr-js +yy-ae +lp-ik +ix-zd +jl-ne +do-vl +ql-wz +cg-js +lp-ru +jh-pu +vz-bz +gu-ue +wu-io +ip-ix +xa-js +kb-ak +ph-dv +wf-ph +rt-uc +bt-ve +oz-ej +ea-az +lx-lh +nu-qn +sp-mh +ju-df +xf-wx +re-ac +rq-jv +fk-cr +yl-uh +yk-qn +er-gp +bt-rt +kk-mc +kp-qm +zo-wk +rw-ty +oo-ka +nl-zi +ph-gi +td-ru +ew-cc +wz-lk +oo-zs +lk-bw +bl-cx +rf-xq +jt-ds +ib-ub +ts-ju +ss-cq +zi-yk +tv-jj +bk-xk +is-td +cm-xb +zo-sd +xs-zp +cz-kj +sk-pu +dl-hf +sg-ql +uw-iy +dn-sy +jg-mx +ks-pa +vs-kf +vu-gb +st-ul +vb-lo +qn-nl +bc-wb +zt-wk +nr-av +ve-uc +as-av +mq-zl +gl-xw +xi-bj +bb-dy +ov-df +su-dv +hg-cl +zy-kk +zp-sd +az-hg +go-mq +zr-di +jd-kl +cq-xl +bj-dr +vs-gz +kg-nu +xb-fl +bc-na +fv-pc +um-xi +wo-bd +ck-gn +xf-ft +px-ft +at-nl +ck-jk +xl-ok +vg-di +wm-gv +za-yq +ij-ai +jo-zh +uz-it +iw-uq +xo-vq +pq-pm +hm-dk +oe-jm +ss-yf +yk-nu +yl-qz +qz-um +sv-bz +wu-ep +hl-cx +bv-dp +dd-ql +dx-tr +aq-hn +qq-xg +bo-uc +qa-mx +hd-uq +xo-oc +bz-jv +rs-yv +vw-by +fa-zx +yl-in +wx-wo +vo-kb +vu-qo +mc-hk +rr-oj +nb-lz +na-wb +sr-av +lr-ny +wu-kl +is-ik +ep-qm +zr-hf +vu-sn +pu-jb +gg-xn +pt-uz +gd-mw +hh-pt +ck-ax +gy-cn +gn-jk +fa-jl +av-en +ek-zs +cx-qe +tu-lh +li-mk +qr-xa +qc-iw +bx-wd +uk-bp +tf-ny +ru-le +nv-ue +db-bf +qu-tz +zc-as +cp-hr +vj-cf +yy-hj +kk-cm +oo-tg +zh-kd +yy-ll +tj-wd +wx-dz +mz-xr +bj-ja +jp-kt +cr-ky +to-bc +ak-jo +om-fy +xm-bq +vt-ip +vi-cu +pf-pl +gx-da +ie-ro +bd-rs +dh-sk +kf-bn +mr-fx +in-bp +bb-cq +ta-co +as-en +gb-sw +pr-pm +zx-hn +ks-vq +lv-rt +qm-vi +av-ws +si-tp +hn-fa +hq-wz +ah-bc +ri-ec +sr-gp +az-pd +nd-iz +rd-cc +qk-ri +lj-ar +xv-jd +kr-ts +ab-bp +dq-xy +vr-in +zr-mb +rj-bw +fl-zy +wd-lj +fo-bo +bl-fx +wu-bg +wg-rh +ri-wh +hg-bv +zy-yi +kg-jj +oj-dz +jh-ic +sb-zr +ij-xy +uc-bt +nt-da +dd-hq +lo-fi +mc-nm +ai-gi +hm-gg +ml-lq +yr-fl +iv-qq +ju-fi +ng-ny +cp-ok +gv-pr +ib-zt +gg-gu +qb-qa +om-es +xh-ny +xk-oe +oc-zm +fm-ie +tx-vw +vb-tw +dh-rw +lw-sf +ot-cb +yo-tz +ot-oc +rf-cl +ny-bk +pa-xo +mo-hq +qq-fh +bc-cg +gd-sf +wi-wm +dz-xf +gw-ek +fx-dk +ql-mu +ia-lk +gx-ul +yn-yy +tt-zw +ta-uk +nu-om +qo-ne +mf-jp +ot-zm +ia-wz +fo-hj +jh-ty +hp-gb +lc-vu +nh-cb +aq-fa +sc-pz +xz-zq +jl-ob +qn-qx +jn-nr +jg-qa +mb-pz +xg-ds +dw-kg +mj-is +lt-gy +at-la +wl-wm +oz-je +rr-xu +rh-td +zo-zx +ci-ll +fh-gr +pg-ec +jp-hn +ri-am +js-qy +ae-bo +de-is +um-nq +nr-lg +ta-bp +np-ac +tb-jd +ae-cs +oh-lo +uu-lp +kc-fo +yw-vb +wd-ar +sk-ex +ef-ad +ey-ne +bd-oj +bg-fr +vr-ta +bp-ba +jx-zq +tc-sf +bv-my +df-lo +gv-gq +no-pl +tk-go +xe-cp +vx-nn +na-ah +ro-lq +sr-ye +er-jn +in-vd +zt-zo +om-at +nj-em +sh-zs +dw-oo +hu-wm +bt-tc +oe-cx +ez-qx +bl-te +hh-xg +it-mg +tp-hr +vg-gd +pm-tu +bw-gc +hv-xb +dj-nf +lt-cn +gb-ob +gg-ca +ef-vs +gn-jx +mf-hn +ii-ko +hv-kk +xv-nq +jt-gc +ep-kp +ja-li +yp-xh +ju-kr +yb-oc +ox-bs +cf-qb +ai-mg +pg-ux +en-zc +qj-mk +sj-ng +xv-fr +te-xk +hu-rg +qu-us +rs-po +cy-cq +hc-jo +zd-ep +zb-yy +qb-uv +wh-tr +ox-vc +cn-tm +kk-yi +ue-aq +in-ta +sr-en +rh-le +cg-ou +jx-ck +ew-lj +js-bm +kj-af +nu-nl +fr-kl +bb-cy +qj-fv +qa-vj +yf-cy +dx-ld +wp-nx +hh-dp +jt-rj +ku-bg +eu-lg +on-yw +dv-mg +ah-ld +rw-sk +or-vs +uo-ou +lx-er +mk-pc +za-nf +sy-jf +qa-hk +cg-ck +wn-xh +ok-mr +ku-xi +yn-bo +jq-tx +db-vu +qu-tf +vc-uq +tt-dw +no-zl +hl-jm +fk-bq +ai-tn +nb-sp +sh-ek +cc-ug +tf-sj +kk-uf +xn-jp +tk-sa +kf-am +dk-hl +xe-ok +rr-dz +tr-zh +dd-lk +dl-sb +su-mg +ks-yb +on-ts +lt-rt +dq-dv +wi-pq +md-az +pn-wb +mg-uz +us-ng +in-ba +ox-qc +ea-lz +ld-hx +yk-la +ni-jh +lv-gy +ta-lg +yv-dt +zm-xe +yg-ub +gj-ik +nq-fr +ic-dh +ey-lc +sz-ds +nh-oc +dx-jo +tw-oh +nn-be +kj-jj +gx-mb +vm-ib +vd-uk +gn-ax +vb-py +vt-lx +wx-px +wt-qa +am-zk +ug-ew +jg-ij +ne-hp +jk-uo +ju-vb +fj-xo +ko-rg +ul-mb +pu-gz +gq-mh +dl-mw +se-os +ub-dy +kk-xb +gy-ak +cr-wb +lw-gd +tg-dw +bt-kq +pf-dt +js-gn +lj-xj +fk-gr +kt-ca +hn-ue +bf-ib +bz-pt +jj-tg +av-zc +rq-xz +km-br +kq-ve +xq-sp +xj-lq +iv-ds +yz-gy +vg-zr +sw-ne +dv-ai +kk-mz +fq-nx +zk-bw +kq-st +vi-np +gp-en +lr-us +pq-wl +er-en +hl-mr +xp-xk +vq-fj +yr-mz +os-fm +jl-qo +sn-gb +sv-bv +ax-uo +xa-rf +vq-ot +ni-wl +az-gq +ef-or +ex-jb +sa-ti +yq-by +db-sw +tt-iz +dr-io +py-kr +hu-wi +xu-ps +ps-gt +og-lj +lg-er +lz-oq +mj-uu +qe-dk +tb-pr +fq-wd +te-jm +sa-pf +mq-pl +jd-bg +qj-yj +zd-kp +ku-um +ds-zk +fo-ll +lz-sp +ti-zd +oj-xu +uo-qy +ke-qc +jh-dh +oz-gl +ju-oh +kd-dx +kd-jo +te-oe +ci-kc +nl-wb +xh-qu +vq-nh +oh-vb +ie-pc +yv-sa +ld-vo +af-ml +ah-pn +fj-ks +bd-gf +gl-je +fr-xi +tb-wl +af-xj +sh-gl +gu-ca +vu-jl +ci-sf +ly-pz +kf-ec +zr-mw +ps-fv +sk-ty +em-qa +ok-nn +ia-np +vu-sw +la-om +er-as +ji-es +sh-jf +qe-ds +tc-gd +bk-sj +ia-ql +qj-it +ar-jz +li-yj +pz-do +jr-vw +yk-ji +xg-iv +ev-jy +vg-sb +sd-yg +mp-kn +rs-tk +jr-gj +uo-cg +oq-bp +yq-dj +og-tn +db-au +bs-uq +ea-md +ad-op +xh-tz +yq-th +kr-oh +qn-at +jc-rv +db-ob +pw-af +zo-vm +rj-xg +bq-bc +oz-ur +vr-yl +bf-zp +pw-aa +gv-pq +gr-xg +fv-ja +pf-po +tk-mq +wx-gf +mx-cf +gv-ii +te-fx +bg-um +nr-gp +wm-pm +zi-at +jc-uq +oz-cj +vr-vd +op-ec +kr-tw +zc-ye +ni-ic +je-xw +mw-sf +hj-kc +gi-dv +qc-bs +lh-zd +cg-jk +mq-ti +pa-vq +qx-vf +ck-qr +ou-js +pz-gx +gg-fa +po-pl +ia-re +kg-oo +yb-wi +fa-xn +xq-mh +qm-vt +ph-xy +vl-mr +qu-bk +gj-ru +iy-kd +xu-bd +sw-jl +vj-zu +hn-sb +wn-yp +qq-bw +lt-bt +sn-hp +bj-kl +rv-hd +fm-al +vi-kp +hq-mu +rg-ax +dn-kj +yq-km +ah-xs +lq-cz +kn-na +sp-pd +xv-xi +md-rf +py-ov +dq-uz +st-uc +dh-ni +em-uv +rw-ho +ce-xb +ad-pg +sf-zr +ne-ob +nb-gq +ws-pw +jz-nx +cc-lj +nv-yr +jv-hh +kl-ku +dd-sg +ji-qx +zi-es +xe-xl +kb-sg +tw-uu +bm-qy +ni-rw +vq-zm +rt-yz +xj-pw +aa-af +wz-mu +la-zi +vc-ke +ro-sy +fh-xg +vl-mb +xy-wf +mg-gi +bl-dk +ex-ni +to-pn +th-br +zl-tk +zy-nm +zc-jn +jq-fl +rd-bx +lt-lv +qn-ia +yl-ab +gz-jh +uh-vr +lx-ix +qk-bn +vw-jq +bx-cc +mu-mo +gp-ye +wo-xu +dr-xi +dl-oy +zn-zd +az-xq +qq-jt +xs-ib +sh-gf +tf-gm +yk-om +de-rt +xe-ss +nm-fl +xr-zb +kc-ae +zs-gl +nr-qg +rd-nx +hm-cx +ok-vx +cm-yi +on-zw +pc-yd +lv-tm +vs-dp +gm-hh +jt-bw +lr-bk +is-wg +hk-ed +op-ef +cl-cu +dn-af +mw-wj +ec-bn +ug-jz +wz-co +gu-hn +wn-bk +zy-yr +qz-ab +wh-jo +pa-yu +oz-kr +ko-wl +di-hf +yb-xo +rf-lz +ti-dt +or-ad +ci-ra +wk-sd +ph-su +pu-rw +sg-lk +xw-ek +da-ul +ts-yw +ny-sj +jx-qy +ly-sc +lr-xh +dq-su +qa-cn +yw-df +zo-xs +hx-jo +em-mx +wu-dr +yi-mc +tu-gv +xr-kc +ot-yb +bk-xh +hd-ir +ba-vd +on-fi +jz-lj +tc-mw +ce-yi +vf-nl +sk-ho +ot-iq +vj-mx +ly-tp +ab-vr +dd-pa +qa-ab +ec-rr +ts-fi +yd-os +cm-mz +lc-hp +jc-ke +aa-lq +bc-kn +mh-az +ef-kf +xn-kt +ld-ak +xa-bm +qr-ax +fy-nl +zm-fj +hq-ql +nn-yf +zs-gw +na-bq +ev-rv +oe-hl +bs-rv +ur-ez +ep-vt +dr-nq +wk-rm +ur-pm +yq-vw +jk-qr +be-bb +jr-km +je-os +oo-zw +on-py +cf-jg +hr-xl +jp-yd +sw-yr +ci-yy +df-ts +oy-by +jn-gp +tg-zv +pt-sv +ko-pq +bg-nq +do-ly +au-ob +sj-hx +re-ql +xw-oz +hv-mc +ov-ju +zh-sv +aa-sy +sa-rs +dy-zp +oj-gf +iw-jy +cn-uc +ji-pu +ci-hj +fk-pn +kr-lo +vg-tc +fq-ew +bs-ke +bl-hm +dy-zt +wl-pm +kl-nq +sc-tp +no-pf +xz-gm +jp-fa +be-yf +kc-cs +hg-xq +dy-yg +la-nl +ea-pd +nu-qx +dp-jv +my-jv +hn-gg +ez-jf +na-ky +gd-sb +yf-vx +uz-tn +jo-kb +zb-bo +gd-di +pw-lq +vd-yl +ni-fg +qx-zi +eu-jn +ot-ks +ob-sw +kp-cu +yo-yp +mh-ea +cp-cy +tf-xh +rg-pm +hc-zh +or-ri +um-xv +xz-hh +gz-jb +ng-yo +qn-fy +or-pg +lw-wj +uk-ab +hv-nm +jk-ld +se-qj +ox-hd +bv-hh +bv-xz +pl-go +xz-dp +ip-zn +ci-yn +fo-ra +wb-ky +dw-ka +ax-cg +sp-md +av-lg +wf-su +th-tx +gp-io +vc-jy +rd-ty +tu-wm +lg-en +lo-ov +ko-hu +kl-lo +nb-rf +ld-zh +xp-oe +oa-fh +cy-ok +vx-ss +rm-xb +yo-lr +qy-qr +dt-zl +jq-za +wt-ed +wu-xi +en-nr +rf-pd +zb-fo +bz-my +sj-qu +jp-gu +rj-sz +rf-ea +or-am +xf-px +dv-xy +ik-ru +ci-fo +jg-wt +oj-wo +vr-ko +ak-hx +gt-wx +yd-qj +ll-yn +jq-by +qg-av +zl-tt +wi-ko +rh-mj +ai-ph +dy-wk +jz-og +vf-ji +lq-sa +ga-xk +tz-lr +vf-at +kn-fk +ov-yw +cq-hr +vx-cp +ib-rm +sw-at +bm-jk +ne-db +tv-tg +po-go +vg-wp +hg-gq +su-tn +io-nq +mz-nm +op-bn +pz-xn +ub-vm +yj-ja +dp-vz +qm-zd +xu-dz +ib-dy +ql-ih +bk-ng +xi-nq +ga-ik +ka-zv +bg-kl +cb-ks +or-op +dj-za +ix-lh +ta-qz +ml-ws +sa-no +hu-pq +yv-zl +tt-jj +ye-qg +ey-jl +bd-px +nx-bx +ml-xj +vx-xl +wg-de +cj-ur +iz-dw +bk-tz +dv-wf +kf-hr +jd-nq +lw-sb +kn-xm +xs-zt +ed-uv +bx-ug +bm-qr +qn-vf +bk-us +ty-jb +tc-dl +fy-at +rs-pl +hn-pe +ug-wd +ox-jy +oq-ta +wi-rg +ns-vl +us-yp +oq-ba +hm-oe +wp-hf +fo-cs +qk-vs +uf-gy +bg-io +sv-hh +dl-wj +fi-df +bc-xm +ll-hj +cb-vq +ho-ex +kg-tg +ba-qz +jl-sn +ug-tj +hh-rq +dp-rq +hw-fv +pn-mp +ii-wi +kt-pe +qn-zi +cl-gq +yy-bo +am-ad +wg-lp +gz-ni +ho-ni +cb-qy +cy-vx +bl-jm +sh-oz +zl-sa +px-xu +ga-rh +td-wg +ax-jx +yz-ve +zo-ib +db-gb +ue-zx +ur-xw +mj-ga +fl-hv +wm-ko +kq-cn +ik-le +bo-ra +ti-zl +ql-ny +tx-by +jh-rw +br-za +cu-vt +og-ug +wi-pr +xf-gt +mr-oe +hu-wl +xo-cb +cp-be +tw-ts +fg-ic +qe-hl +mb-ly +cn-st +xb-yi +xs-yg +pe-gu +yn-ra +lr-qu +xu-xf +mx-vg +vf-nu +qq-gc +xh-ng +st-bt +ir-vc +yu-cb +tm-uc +mc-xb +oz-ek +zv-tt +kp-lx +mg-ph +ia-ac +ty-gz +ro-xj +fy-qx +ck-uo +mo-re +zl-rs +vw-dj +kr-ov +ux-ec +or-bn +on-oh +qb-hk +gu-zb +xr-bo +tp-ul +mx-zu +wk-ib +rv-ox +np-wz +dn-cz +zu-hk +em-cf +zq-pt +is-ru +kb-kd +nd-al +sw-au +fy-ug +lw-hf +qz-co +xg-zk +sr-as +hg-nb +lz-mh +ic-pw +pq-rg +io-xv +wp-sf +ps-xf +xf-gf +ec-ad +dd-ia +yn-nf +ji-nu +nt-ul +dj-jr +qe-oe +bb-vx +st-yz +jt-sz +yo-dq +nd-oo +lv-yz +oq-qz +sn-db +tz-yp +wz-dd +gn-qy +oj-ps +yl-bp +fx-cx +wj-di +cl-pd +uk-vr +xw-gw +hf-xl +ie-li +ku-xv +vw-km +rv-uq +pa-zm +kn-md +gp-av +iz-oo +op-ri +ip-lx +tm-ve +bv-rq +oy-nf +jc-bs +us-xh +lw-vg +ok-be +ur-gw +tp-pz +tn-ph +bv-gm +nf-br +vi-uw +ii-hu +xn-be +ox-ir +nj-hk +tb-ko +oo-al +cn-yz +kk-nm +zp-qb +mu-lk +vz-jv +on-lo +ky-kn +gz-dh +cn-rt +tt-al +gi-xy +kg-al +np-mu +iw-jc +jx-cg +pr-pq +lr-uh +ns-si +cg-gn +vx-hr +st-tm +fm-qj +sd-br +uh-uk +mp-ah +av-jn +qa-cf +zt-bf +iq-fj +zl-pf +vx-iw +ju-py +ba-gn +kj-aa +hl-te +vt-uw +zk-sz +rw-fg +cs-hj +ip-kp +zk-fh +hw-ie +uw-lh +de-lp +qg-lg +yw-pl +ds-gr +ux-ef +xm-mp +wk-yg +vm-zt +si-mb +zs-ez +rd-ew +sp-rf +yz-kq +xj-sy +qe-xk +vu-di +vs-pg +le-uu +yk-ou +aq-zx +ae-ll +mf-zx +hu-tb +re-hq +ac-dd +eu-sr +ih-np +dq-ai +gx-vl +op-am +uc-gy +wz-ac +zr-dl +ou-ax +lr-ng +bn-pg +ih-hq +lh-qm +la-es +jp-zx +nl-om +xp-cx +tv-zw +ib-yg +dr-xv +hk-jg +kf-ux +yp-fq +zo-rm +rg-pr +zd-lx +yi-gd +mz-ce +bv-pt +hq-ia +re-ih +qg-as +mr-cx +gz-sk +ip-lh +md-gq +nn-nf +ex-gi +xe-bb +sr-az +xj-ws +tg-tj +dz-io +nm-yr +oa-dv +qb-ed +mh-gc +ik-td +ok-hr +yf-hr +aq-kt +sp-ea +xn-aq +ej-ez +cy-nn +lj-tj +nt-pz +xb-mz +qg-zc +mf-gg +be-xe +by-jr +vo-zh +no-rs +qb-em +xz-bz +jj-zv +lo-tw +ur-ek +oy-dj +ke-uq +hk-em +ir-jy +mr-bl +jj-ka +su-uz +in-rj +la-qn +gi-dq +py-fi +bp-vd +cm-nv +vl-tp +le-de +nv-hv +wt-em +hk-uv +op-ka +oz-gw +ni-sk +yf-xe +ps-px +uv-wt +bw-sz +iy-hx +oc-pa +xw-qg +sh-gw +dw-zv +ak-kd +wj-gd +bd-rr +gt-tt +rr-px +ye-av +df-tw +tc-hf +qy-ou +nx-cc +gi-it +ed-nj +jk-ou +mo-ia +vx-be +sh-cj +li-se +pd-hg +ik-uu +xm-wb +ji-fy +mf-ca +zy-hv +vt-rj +bm-qq +ny-yp +fg-jh +po-sa +ob-sn +yr-xb +oj-wx +lq-af +ng-wn +dr-kl +au-gb +fg-jd +fx-xk +xb-nv +vx-xe +dv-tn +nn-xl +ak-hc +ic-ho +mq-pf +ve-gy +mc-nv +co-bp +ni-jb +km-by +nx-ar +cg-xa +cj-je +gv-wl +wt-cf +mj-le +nh-ot +yu-ks +pl-yv +md-lz +lg-sr +ep-vi +tt-tv +jt-gr +ed-sc +jr-br +uz-dv +oz-or +pm-ko +oe-fo +cq-yf +gc-zk +gf-ft +jy-rv +za-jr +az-cl +cm-mj +cr-xm +hc-kd +np-sg +lg-gp +rq-vz +se-yj +kk-fl +kc-yn +gl-jf +uk-se +yo-qu +ra-cs +mw-di +iq-yu +xg-sz +ve-cy +mh-pd +mx-nj +fv-li +wo-rr +oa-sz +nj-wt +qu-wn +ii-pq +ij-ph +ec-am +xi-io +zn-kp +xw-ez +yu-nh +kd-hg +vz-tv +gu-fa +zc-fj +dj-by +si-ly +sy-cz +ci-ae +jn-pf +vd-iq +zq-jv +la-vf +gr-qq +dl-di +ar-ew +ve-st +tz-ny +yk-es +tk-rw +jl-au +ts-ov +om-ji +xa-ck +do-ul +gj-td +xy-aa +sp-gq +fq-lj +az-lz +ke-ox +jm-xp +ku-io +jk-jx +gb-qo +qe-te +ai-it +tn-xy +ji-la +ek-ez +px-dz +af-ro +iw-bs +zn-lx +tn-dq +fb-af +yf-bb +qb-jg +cs-yy +le-lp +dk-rv +jj-oo +bd-ps +nq-bj +vg-dl +pg-am +mz-zy +kd-vo +db-qo +ep-ix +wd-jz +wj-tc +yv-tk +za-oy +ou-gn +jo-tr +iv-zk +pw-sy +kn-cr +ty-ho +kn-ah +vr-qz +za-km +xi-bg +bw-xg +vq-yb +hu-pr +ad-ri +su-gi +rq-bz +bk-yo +ws-lq +au-sn +jf-cj +kg-iz +ts-ty +lv-kq +di-sf +ez-gw +wt-vj +nl-ji +ux-vs +lh-ep +wx-bd +ft-rr +vl-si +fb-pw +lg-ye +zh-ak +mf-nj +rr-wx +ue-gg +ok-cq +tu-pq +ew-og +zt-rm +ab-ta +dx-iy +tk-fm +ns-da +to-ah +gg-aq +qa-ed +sd-vm +dy-xs +dy-vm +bn-ef +pl-ti +bf-dy +do-wg +bp-zn +ic-gz +by-br +ey-sw +bn-ad +dd-ih +yd-ie +uo-jx +hm-jm +vi-lx +wl-ii +ca-ue +pn-cr +li-qj +tg-tt +nn-ss +rt-uf +jx-bm +ip-ep +ob-vu +ta-uh +yr-ce +rt-kq +nx-ew +jn-en +tr-vo +iv-rj +dj-jq +tx-uw +iz-jo +dt-go +bp-qz +fb-xj +oo-zv +hw-li +tk-po +kd-ld +oq-yl +bk-yp +tx-za +dk-te +pz-ns +ce-nm +lp-ga +ob-lc +wu-ku +le-wg +jv-bv +za-vw +tm-yz +da-sc +cc-ft +ej-gl +ds-rj +sw-lc +hj-vj +sc-ul +ws-ro +qm-cu +bc-cr +cy-xe +zu-uv +tx-dj +tj-jz +ip-uw +ij-gi +sf-wj +cu-uw +qx-nl +vo-dx +gy-kq +uk-yl +td-de +mh-cl +xq-pd +cn-lv +ml-fb +ey-sn +ve-lt +ng-tz +lc-qo +kc-lc +gj-wg +ev-vc +zt-cx +ye-wm +dn-ws +dk-jm +uq-vw +tg-zw +cy-hr +tn-mg +qx-at +wk-vm +ub-rm +ai-su +pc-fm +ng-tf +uf-kq +wj-wp +mb-nt +qk-ad +oz-ez +th-vw +sp-az +da-wk +si-pz +uh-co +op-ux +rf-mh +da-pz +dx-zh +cu-zd +cz-pw +br-tx +ex-fg +pq-tb +qb-zu +su-lk +ca-is +nu-la +og-wd +lq-fb +xl-be +cs-qc +bz-bv +bl-oe +fb-cz +ae-xr +qc-jc +bz-zq +bt-ib +uo-gn +mb-sc +kr-zd +hv-ce +gx-do +tg-ka +yw-py +sh-je +rg-ii +pt-my +ed-vj +mz-mc +sg-mo +nt-ns +sf-vg +bf-sd +ts-lo +yu-zm +yq-lv +vd-qz +sv-xz +sy-kj +iq-yb +km-jm +ix-uw +em-ed +ir-rv +bg-dr +wg-ru +jh-cj +nr-eu +ly-ns +oz-zs +zn-vi +nm-yi +ek-ej +fi-tw +np-ql +mf-gu +wx-ps +ti-rs +nh-iq +zb-kc +bl-xk +ro-fb +bx-ck +ou-jx +ro-ml +gt-dz +po-dt +tt-ka +cp-nn +ef-qk +vz-xz +mx-qb +al-iz +hd-vc +it-dv +sk-tc +ub-wk +iy-kb +pu-dh +ws-fb +dx-zi +kn-to +uq-jy +jp-ue +cz-ml +sb-hf +cp-xl +dj-br +pn-bq +fm-li +bj-xv +ea-gq +tr-kd +mk-yj +sr-jn +jd-um +qo-sn +cl-lz +it-wf +lx-qm +pe-ek +ir-ke +xn-pe +al-jj +tk-pf +dk-xp +uu-rh +yb-fj +kt-yz +gv-ko +er-sr +kk-nv +ml-pw +uw-lx +xu-gf +vq-yu +ho-dh +jq-oy +hm-xk +nb-az +cu-ep +oq-in +lz-gq +ts-oh +co-ba +qa-zu +lx-ep +cn-bt +jr-nf +qm-xh +nb-md +iy-vo +zy-xb +hd-ev +dt-gl +hv-cm +ra-ll +vo-ak +ih-lk +hf-mw +mx-ed +xl-bb +cm-zy +es-fy +pu-ex +xo-ks +dx-ak +ib-sd +ie-ja +pa-fj +xe-hr +mw-sb +le-is +oq-ab +ji-at +bx-ew +mx-wt +ql-lk +sg-ac +bm-ck +tp-nt +kj-xj +zp-rm +hu-tu +wt-zu +wd-ew +hd-nt +iv-gr +pg-ef +qr-jx +pe-fa +pn-xm +bf-rm +jq-km +yy-fo +hp-au +yu-yb +rg-wl +bf-xs +yq-br +og-fq +zv-nd +bo-kc +rq-my +xq-gq +lw-zr +wu-fr +hq-sg +bw-iv +zn-vt +ck-qy +be-cq +by-th +fq-ar +md-cl +tk-pl +vu-au +lc-jl +xa-jk +ey-gb +oo-tt +ks-oc +gj-ga +pt-jv +xa-uo +pc-qj +kt-gg +zp-vm +nv-mz +ae-ra +iw-vc +da-vl +bs-aq +mc-fl +ro-cz +xz-my +hv-yr +nm-cm +fb-dn +wd-nx +pa-iq +zv-ng +vd-co +xo-li +di-wp +ux-or +tf-bk +vr-co +gx-nt +jb-dh +um-wu +wf-gi +ns-ey +ac-mu +ur-jf +px-gt +bd-gt +my-sv +ac-lk +vw-gx +wh-hc +jc-hd +ky-pn +qj-hw +kq-lt +os-li +zw-iz +ab-co +uh-qz +yw-fi +jq-jr +go-ti +ho-fg +rd-wd +qr-ou +bj-um +al-tg +tv-kg +ix-cu +ax-xa +na-cr +jd-ku +xp-hl +pu-ho +uf-st +jt-tr +gc-sz +jm-xk +ft-bd +qe-bl +qe-fx +hx-hc +wn-us +ll-zb +go-sa +iz-zv +ul-si +eu-as +us-ny +xr-ll +ju-hu +gu-zx +cc-og +oj-ft +is-ga +vc-rv +xk-hl +gb-ne +hv-yi +qq-ds +er-nr +pe-gg +tb-gv +nb-pd +pc-ja +uk-ba +mq-dt +vc-jc +mk-ja +ly-zy +ew-tj +hk-mx +gw-jf +ke-rv +lt-uf +ur-je +ri-ux +cc-tj +ub-zt +se-ie +sj-wn +rj-oa +lq-sy +yo-xh +rj-qq +xv-kl +yq-oy +mz-hv +hp-uv +wu-bj +pl-dt +wt-hk +ic-jb +kf-or +zb-hj +qz-uk +pa-nh +mu-dd +vj-em +pa-ot +fo-ae +pc-se +nm-ir +zs-cj +aa-cz +hr-ss +fh-vf +hw-yj +po-no diff --git a/src/main/resources/eu/sim642/adventofcode2024/day24.txt b/src/main/resources/eu/sim642/adventofcode2024/day24.txt new file mode 100644 index 00000000..3c2b9548 --- /dev/null +++ b/src/main/resources/eu/sim642/adventofcode2024/day24.txt @@ -0,0 +1,313 @@ +x00: 1 +x01: 1 +x02: 0 +x03: 0 +x04: 0 +x05: 1 +x06: 0 +x07: 1 +x08: 1 +x09: 0 +x10: 1 +x11: 0 +x12: 0 +x13: 0 +x14: 1 +x15: 1 +x16: 1 +x17: 0 +x18: 0 +x19: 0 +x20: 1 +x21: 0 +x22: 1 +x23: 0 +x24: 0 +x25: 0 +x26: 0 +x27: 1 +x28: 0 +x29: 1 +x30: 0 +x31: 0 +x32: 1 +x33: 1 +x34: 1 +x35: 0 +x36: 0 +x37: 0 +x38: 1 +x39: 1 +x40: 1 +x41: 1 +x42: 0 +x43: 0 +x44: 1 +y00: 1 +y01: 0 +y02: 1 +y03: 1 +y04: 0 +y05: 0 +y06: 1 +y07: 1 +y08: 0 +y09: 1 +y10: 1 +y11: 1 +y12: 1 +y13: 0 +y14: 1 +y15: 0 +y16: 0 +y17: 1 +y18: 0 +y19: 1 +y20: 0 +y21: 1 +y22: 1 +y23: 1 +y24: 0 +y25: 1 +y26: 1 +y27: 0 +y28: 1 +y29: 1 +y30: 0 +y31: 1 +y32: 0 +y33: 0 +y34: 0 +y35: 1 +y36: 1 +y37: 1 +y38: 1 +y39: 1 +y40: 0 +y41: 1 +y42: 0 +y43: 1 +y44: 1 + +x23 AND y23 -> mhq +dbf XOR dsb -> z35 +x41 AND y41 -> qss +kbv AND ctw -> qhg +djs OR tgk -> ccp +nmw AND bgp -> bcr +jns OR npn -> jbv +y29 AND x29 -> tjt +y17 AND x17 -> nhh +kmm AND ptk -> vnr +hbr AND qfp -> mjr +qfk AND pvj -> ndp +tvb XOR jhd -> z25 +y29 XOR x29 -> wft +rqd AND cns -> grb +jbv AND kjg -> vjg +tvm XOR pkw -> z38 +vwd AND kvv -> mgw +nmw XOR bgp -> z02 +cdc OR stq -> z21 +x16 XOR y16 -> mft +x37 XOR y37 -> hbr +x24 XOR y24 -> cns +y40 XOR x40 -> pgc +ccd OR cst -> cbk +fht XOR ddw -> z20 +wft AND nnq -> stm +srk AND sjm -> fwg +y06 AND x06 -> cnm +gqg XOR pmv -> z07 +ndp OR nfq -> rgv +bsm OR vsc -> fjn +x15 XOR y15 -> srk +bwv XOR vbq -> z42 +kbv XOR ctw -> z31 +x10 XOR y10 -> htc +x08 XOR y08 -> knh +fgc AND dvm -> nfn +y03 AND x03 -> ssj +x26 XOR y26 -> spf +y02 AND x02 -> psw +x36 XOR y36 -> fcf +ptj OR dtg -> spg +stm OR tjt -> gsj +mmw XOR ncf -> z23 +y26 AND x26 -> csh +rrj AND mft -> tnt +x05 XOR y05 -> chs +x16 AND y16 -> khn +nqm AND fmf -> tgq +wft XOR nnq -> z29 +y13 AND x13 -> ggg +rcb OR khg -> mfp +y28 AND x28 -> wgd +csf AND bck -> qsg +x31 XOR y31 -> kbv +rrj XOR mft -> z16 +hhg AND ccp -> msp +y00 XOR x00 -> z00 +x25 XOR y25 -> khg +x42 AND y42 -> djs +ggg OR hvg -> csf +pps XOR wdg -> vdc +y04 XOR x04 -> pvj +qtg AND knh -> ccd +x27 AND y27 -> jns +jdk OR pmr -> spk +nhm XOR jmr -> z18 +fpk AND dfh -> ccr +x06 XOR y06 -> bgq +x38 AND y38 -> dcc +x22 XOR y22 -> jkq +vbq AND bwv -> tgk +x14 XOR y14 -> bck +fjn AND htc -> dtg +kfd XOR rtg -> z19 +bvk OR khh -> nmw +x34 XOR y34 -> ptk +mmw AND ncf -> rkf +y11 AND x11 -> rvg +wgd OR vjg -> nnq +qss OR wtt -> bwv +dmb OR crv -> ddw +y08 AND x08 -> cst +nhh OR tgq -> jmr +cpt XOR fqc -> z32 +tnt OR khn -> fmf +fbk AND tcq -> hvg +spq XOR gpk -> z01 +x02 XOR y02 -> bgp +x20 AND y20 -> fct +x36 AND y36 -> jbq +x12 AND y12 -> z12 +mfp XOR spf -> z26 +spg XOR hhm -> z11 +y32 AND x32 -> rjq +y04 AND x04 -> nfq +pkj OR msp -> kvv +tvc OR dcc -> dvm +vnr OR krb -> dbf +fmf XOR nqm -> z17 +rtg AND kfd -> dmb +fvh XOR pgc -> z40 +fcf XOR spk -> z36 +pvc OR gst -> kmm +cbk AND nbm -> vsc +x09 AND y09 -> bsm +x07 XOR y07 -> gqg +ptk XOR kmm -> z34 +x28 XOR y28 -> kjg +dbm OR jft -> qtg +jbr AND wcs -> z33 +y42 XOR x42 -> vbq +y00 AND x00 -> spq +y19 XOR x19 -> kfd +tbn OR grb -> jhd +kvv XOR vwd -> z44 +wcs XOR jbr -> gst +srk XOR sjm -> z15 +y39 AND x39 -> cbf +bgq XOR wdh -> z06 +bbn AND rsc -> cdc +y18 XOR x18 -> nhm +tvm AND pkw -> tvc +x23 XOR y23 -> ncf +x19 AND y19 -> crv +qhg OR gnc -> fqc +jbv XOR kjg -> z28 +y05 AND x05 -> nph +x32 XOR y32 -> cpt +x31 AND y31 -> gnc +ccp XOR hhg -> z43 +x15 AND y15 -> gtf +jmr AND nhm -> ptd +x10 AND y10 -> ptj +bgq AND wdh -> dgh +ftw XOR gsj -> z30 +x44 AND y44 -> bds +fjn XOR htc -> z10 +y43 AND x43 -> pkj +y30 AND x30 -> nmj +tvb AND jhd -> rcb +x40 AND y40 -> gdm +mgw OR bds -> z45 +fdv AND dfs -> wtt +rkf OR mhq -> rqd +pvj XOR qfk -> z04 +pmv AND gqg -> dbm +x21 XOR y21 -> bbn +x38 XOR y38 -> tvm +mjr OR kpb -> pkw +jbq OR vmj -> qfp +jkq XOR nhn -> z22 +qfn OR fct -> rsc +x30 XOR y30 -> ftw +y35 XOR x35 -> dsb +y24 AND x24 -> tbn +fcf AND spk -> vmj +cnm OR dgh -> pmv +x27 XOR y27 -> mcv +chs XOR rgv -> z05 +vdc OR kcp -> fbk +y39 XOR x39 -> fgc +x13 XOR y13 -> tcq +ssj OR ccr -> qfk +fwg OR gtf -> rrj +knh XOR qtg -> z08 +fqc AND cpt -> nfh +y17 XOR x17 -> nqm +hbr XOR qfp -> z37 +y22 AND x22 -> nrq +y01 XOR x01 -> gpk +jhv OR nph -> wdh +dfs XOR fdv -> z41 +gqb OR csh -> mbp +dvm XOR fgc -> z39 +y03 XOR x03 -> fpk +mfp AND spf -> gqb +x44 XOR y44 -> vwd +gpk AND spq -> bvk +x21 AND y21 -> stq +cbf OR nfn -> fvh +spg AND hhm -> wvv +cns XOR rqd -> z24 +rjq OR nfh -> wcs +mcv AND mbp -> npn +wdg AND pps -> kcp +nrq OR vkg -> mmw +x33 AND y33 -> pvc +x20 XOR y20 -> fht +y43 XOR x43 -> hhg +dfh XOR fpk -> z03 +fbk XOR tcq -> z13 +x09 XOR y09 -> nbm +pwp OR nmj -> ctw +y25 AND x25 -> tvb +y34 AND x34 -> krb +x11 XOR y11 -> hhm +hdq OR gdm -> fdv +mcv XOR mbp -> z27 +nbm XOR cbk -> z09 +fvh AND pgc -> hdq +jkq AND nhn -> vkg +dwt OR qsg -> sjm +dbf AND dsb -> pmr +rsc XOR bbn -> nhn +y14 AND x14 -> dwt +x35 AND y35 -> jdk +x41 XOR y41 -> dfs +y37 AND x37 -> kpb +bck XOR csf -> z14 +y07 AND x07 -> jft +sdp OR ptd -> rtg +y01 AND x01 -> khh +bcr OR psw -> dfh +chs AND rgv -> jhv +y18 AND x18 -> sdp +ddw AND fht -> qfn +x33 XOR y33 -> jbr +gsj AND ftw -> pwp +x12 XOR y12 -> pps +rvg OR wvv -> wdg diff --git a/src/main/resources/eu/sim642/adventofcode2024/day25.txt b/src/main/resources/eu/sim642/adventofcode2024/day25.txt new file mode 100644 index 00000000..d813e77d --- /dev/null +++ b/src/main/resources/eu/sim642/adventofcode2024/day25.txt @@ -0,0 +1,3999 @@ +##### +##### +#.### +#.### +#.#.# +....# +..... + +##### +.##.# +.##.# +.##.. +.##.. +.#... +..... + +##### +.#### +..#.# +..#.# +....# +..... +..... + +..... +..#.. +.##.. +.###. +.###. +.###. +##### + +..... +..... +..... +...#. +#..#. +#.### +##### + +##### +##### +#.#.# +..#.. +..#.. +..#.. +..... + +##### +##### +##### +##.#. +.#.#. +..... +..... + +##### +##.#. +##.#. +.#.#. +.#... +..... +..... + +##### +#.### +#.#.# +..#.# +..#.. +..#.. +..... + +##### +##.## +##.## +##..# +##..# +.#... +..... + +..... +..#.. +#.#.. +#.#.. +#.##. +####. +##### + +##### +###.# +##... +#.... +#.... +..... +..... + +##### +.#### +.#### +.#.## +.#..# +....# +..... + +..... +#.... +##... +###.. +###.. +####. +##### + +..... +.#... +.#... +.##.. +####. +####. +##### + +##### +.#### +..### +...#. +..... +..... +..... + +##### +.#### +..### +...#. +...#. +...#. +..... + +..... +#...# +##..# +###.# +##### +##### +##### + +##### +####. +##.#. +##.#. +#..#. +#.... +..... + +..... +..#.. +..#.. +..#.. +#.##. +#.##. +##### + +..... +.#... +.#... +##..# +###.# +###.# +##### + +##### +##### +.##.# +.#..# +.#..# +.#... +..... + +..... +#.... +#.... +#..#. +#.##. +####. +##### + +##### +####. +.##.. +..#.. +..... +..... +..... + +..... +..... +..... +.#... +.#.#. +##.#. +##### + +##### +##.## +#..#. +#..#. +#..#. +#.... +..... + +##### +##### +.#### +.##.# +.#..# +....# +..... + +..... +..#.. +.###. +.###. +.###. +####. +##### + +..... +..#.. +..#.. +#.#.# +#.#.# +#.#.# +##### + +##### +##.## +##.## +##.#. +##.#. +.#... +..... + +##### +##### +.###. +.###. +.###. +.#.#. +..... + +##### +###.# +#.#.# +#.#.# +#.#.# +#.... +..... + +##### +.#### +.#### +..##. +..##. +...#. +..... + +##### +##### +###.# +.##.# +..#.. +..... +..... + +##### +####. +#.##. +#.#.. +#.#.. +..... +..... + +##### +####. +####. +####. +.###. +.#.#. +..... + +##### +####. +##.#. +#..#. +#..#. +#.... +..... + +##### +##### +##### +.#.#. +.#.#. +.#.#. +..... + +##### +##.#. +.#.#. +.#.#. +.#... +..... +..... + +..... +#.... +#..#. +#..## +#.### +##### +##### + +..... +..#.. +..#.. +..#.# +#.#.# +###.# +##### + +##### +##### +##### +#.### +#.#.# +..#.. +..... + +##### +##.## +#..#. +#..#. +#.... +..... +..... + +..... +..... +..... +...#. +.#.## +##### +##### + +..... +#.... +#.#.. +#.#.. +#.##. +#.##. +##### + +..... +..#.. +..##. +..##. +#.##. +#.##. +##### + +..... +.#... +.##.. +.##.. +.##.. +###.# +##### + +##### +##### +###.# +.##.# +.#..# +....# +..... + +##### +##### +####. +.##.. +.#... +..... +..... + +##### +##.## +##..# +##..# +.#... +..... +..... + +##### +##### +#.##. +#..#. +#.... +..... +..... + +..... +..#.. +..#.. +#.##. +#.##. +##### +##### + +##### +##### +##### +.#.#. +...#. +...#. +..... + +##### +#.### +#..## +#..#. +...#. +...#. +..... + +..... +.#... +.#.#. +##.## +##.## +##### +##### + +##### +.#.## +.#.## +.#.## +...#. +..... +..... + +..... +..... +#..#. +#.##. +#.##. +#.### +##### + +##### +####. +####. +.###. +..##. +...#. +..... + +..... +..... +#.... +#.#.# +#.#.# +#.#.# +##### + +##### +##### +##### +###.# +#.#.# +..#.. +..... + +##### +#.### +#..## +#..#. +...#. +..... +..... + +..... +#...# +#...# +##.## +##.## +##.## +##### + +..... +#.... +##.#. +##.#. +####. +####. +##### + +##### +##### +##### +#.### +#..#. +...#. +..... + +..... +..#.. +..#.. +..##. +#.##. +#.### +##### + +..... +..... +..... +....# +#.#.# +#.### +##### + +##### +#.### +#.#.# +#.#.# +....# +....# +..... + +..... +...#. +.#.#. +.#.#. +.###. +.#### +##### + +##### +##.#. +.#.#. +.#.#. +...#. +...#. +..... + +##### +##### +##### +###.# +#.#.# +..... +..... + +##### +#.#.# +#.#.. +#.#.. +#.#.. +..#.. +..... + +..... +..... +..... +#..#. +#.##. +####. +##### + +##### +#.### +#.##. +#..#. +#.... +..... +..... + +..... +..#.. +..#.# +..#.# +.#### +.#### +##### + +..... +.#..# +.#..# +##..# +###.# +###.# +##### + +..... +..#.# +..#.# +..#.# +#.#.# +#.#.# +##### + +##### +##### +#.### +#..## +#..#. +#..#. +..... + +##### +##### +##.## +.#.## +.#.## +.#.#. +..... + +##### +##### +##.#. +##.#. +#.... +#.... +..... + +..... +....# +.#..# +.#..# +.#.## +.#### +##### + +##### +.#### +.#.## +.#.## +.#..# +.#... +..... + +..... +.#... +.#.#. +.###. +.###. +##### +##### + +##### +###.# +#.#.# +#.#.# +....# +..... +..... + +##### +##### +###.# +##... +.#... +.#... +..... + +..... +..... +..... +...#. +#.##. +#.##. +##### + +##### +##### +##### +##### +#.### +#..#. +..... + +##### +##.## +##.## +#..## +#...# +#.... +..... + +##### +##.## +##.## +.#.#. +.#.#. +...#. +..... + +##### +###.# +.##.. +.##.. +.#... +.#... +..... + +..... +..#.. +#.#.# +#.#.# +##### +##### +##### + +..... +#.... +#...# +#..## +#.### +#.### +##### + +##### +##### +##### +###.# +##... +#.... +..... + +##### +####. +####. +####. +.#.#. +...#. +..... + +..... +..... +..... +#...# +#.#.# +#.#.# +##### + +##### +##.## +#...# +#...# +#...# +..... +..... + +##### +##.#. +#..#. +...#. +...#. +...#. +..... + +..... +..... +...#. +...## +.#.## +##.## +##### + +##### +##### +#.##. +..#.. +..#.. +..... +..... + +..... +#.#.. +#.#.. +#.#.. +#.#.# +##### +##### + +##### +##### +#.##. +#.##. +#.#.. +#.... +..... + +##### +##### +##.## +##.## +#..#. +#..#. +..... + +##### +.#### +.##.# +.##.# +.#... +..... +..... + +##### +##### +###.# +###.# +.##.# +.#..# +..... + +##### +.#### +.##.# +.##.# +.#..# +....# +..... + +..... +.#... +.#... +.#.#. +.#### +.#### +##### + +..... +....# +#...# +#...# +##..# +###.# +##### + +##### +##.#. +.#.#. +...#. +..... +..... +..... + +..... +..... +..#.. +.###. +.#### +.#### +##### + +..... +#...# +#.#.# +###.# +##### +##### +##### + +..... +..... +....# +.#..# +###.# +###.# +##### + +..... +#.... +##... +###.. +###.# +###.# +##### + +##### +##### +##.## +.#.#. +...#. +...#. +..... + +##### +##.## +##..# +##..# +.#..# +.#..# +..... + +..... +#...# +#...# +#.#.# +##### +##### +##### + +..... +#.... +##..# +###.# +##### +##### +##### + +..... +..#.. +..#.. +.##.# +###.# +###.# +##### + +##### +##### +#.### +...## +...## +....# +..... + +..... +....# +..#.# +..#.# +#.#.# +###.# +##### + +##### +##### +##.## +#...# +#.... +..... +..... + +##### +##.## +##.## +##.#. +.#.#. +.#.#. +..... + +##### +##### +.#.## +.#.#. +.#.#. +.#.#. +..... + +..... +...#. +..### +..### +#.### +##### +##### + +..... +...#. +..##. +..##. +..##. +#.### +##### + +##### +.###. +.##.. +.#... +.#... +..... +..... + +##### +#.### +#.##. +#.##. +#.##. +#..#. +..... + +..... +..... +.#... +.#... +##..# +##.## +##### + +##### +#.### +#..## +#..## +...## +...#. +..... + +##### +##### +##### +.#### +.#.#. +.#.#. +..... + +..... +..... +..... +.#.#. +##.#. +##.#. +##### + +##### +#.### +#..## +#..#. +#..#. +#..#. +..... + +..... +..#.. +#.#.. +####. +####. +####. +##### + +..... +...#. +...#. +#.##. +##### +##### +##### + +..... +..... +.#.#. +##.#. +####. +####. +##### + +..... +..#.. +..##. +..##. +..### +.#### +##### + +..... +..#.# +.##.# +###.# +###.# +##### +##### + +..... +....# +...## +#..## +##.## +##### +##### + +##### +##### +##### +.##.# +.#..# +.#..# +..... + +##### +####. +.###. +.##.. +.#... +.#... +..... + +##### +##.## +##.## +#...# +#...# +..... +..... + +##### +##.## +#..#. +...#. +...#. +..... +..... + +##### +##.## +##.## +##.## +.#..# +..... +..... + +..... +#...# +##..# +##..# +##.## +##.## +##### + +##### +##### +.##.# +..#.# +..#.# +..... +..... + +##### +##.## +#..## +#...# +#...# +#.... +..... + +##### +##### +#.#.# +#.#.. +..#.. +..#.. +..... + +..... +.#... +.#..# +.##.# +.#### +##### +##### + +..... +....# +...## +.#.## +.#.## +##### +##### + +..... +.#.#. +####. +####. +####. +####. +##### + +##### +##### +##.#. +##.#. +.#.#. +.#.#. +..... + +..... +#.... +#.#.# +#.#.# +#.#.# +###.# +##### + +..... +..... +#.#.. +#.#.# +###.# +##### +##### + +##### +##.## +.#..# +....# +....# +....# +..... + +..... +...#. +...#. +...## +..### +.#### +##### + +##### +#.### +#.### +#.##. +#.#.. +#.#.. +..... + +##### +##### +#.### +#..#. +#..#. +..... +..... + +##### +##### +##### +###.# +#.#.. +#.... +..... + +..... +..... +..#.# +#.#.# +#.#.# +#.#.# +##### + +##### +##### +#.#.# +..#.. +..#.. +..... +..... + +..... +..... +..... +..... +.#.#. +##.## +##### + +##### +####. +####. +#.#.. +#.#.. +..... +..... + +##### +#.### +..### +...## +...## +....# +..... + +..... +#.... +#.... +##... +##.#. +##### +##### + +..... +....# +#.#.# +#.#.# +###.# +##### +##### + +##### +.###. +.###. +..#.. +..... +..... +..... + +##### +##### +####. +####. +#.##. +#.#.. +..... + +##### +.#### +.#.#. +.#.#. +.#.#. +.#.#. +..... + +..... +....# +..#.# +..### +.#### +##### +##### + +##### +###.# +###.. +##... +##... +.#... +..... + +..... +..... +...#. +...#. +#.##. +##### +##### + +..... +..... +#..#. +##.#. +####. +##### +##### + +..... +..... +..... +....# +#.#.# +##### +##### + +..... +..... +..... +...#. +#..#. +#.##. +##### + +##### +.#### +.###. +.##.. +..#.. +..... +..... + +##### +###.# +###.. +##... +.#... +..... +..... + +##### +##### +##.## +##.## +##.#. +.#... +..... + +..... +..... +...#. +...#. +..### +.#### +##### + +..... +...#. +..### +..### +..### +#.### +##### + +..... +#.#.. +###.# +###.# +###.# +###.# +##### + +##### +#.### +#.### +#.### +#.#.# +#.#.# +..... + +##### +.#.#. +...#. +..... +..... +..... +..... + +##### +##.## +.#.## +.#.## +....# +....# +..... + +##### +##### +####. +.##.. +.#... +.#... +..... + +##### +##### +##.#. +.#... +.#... +..... +..... + +##### +#.##. +#..#. +#..#. +#..#. +#.... +..... + +..... +.#..# +.#.## +.#.## +.#### +##### +##### + +..... +.#... +.#..# +.##.# +.##.# +##### +##### + +..... +.#..# +##.## +##.## +##.## +##.## +##### + +##### +.###. +..##. +..##. +..#.. +..... +..... + +##### +.#.## +.#.#. +.#.#. +.#.#. +..... +..... + +##### +##.## +#...# +..... +..... +..... +..... + +..... +#.#.. +#.#.. +###.. +####. +##### +##### + +..... +...#. +.#.## +.#.## +##.## +##.## +##### + +..... +..... +..#.# +.##.# +.##.# +.#### +##### + +..... +..#.# +..### +..### +.#### +##### +##### + +##### +.#.## +....# +....# +....# +..... +..... + +..... +..... +..#.. +..#.# +#.### +#.### +##### + +..... +....# +#..## +##.## +##### +##### +##### + +..... +...#. +...#. +...## +.#.## +##### +##### + +##### +###.# +###.# +###.# +###.# +#.#.. +..... + +..... +#.#.# +##### +##### +##### +##### +##### + +##### +##### +####. +#.##. +...#. +..... +..... + +..... +#.... +#...# +#...# +##..# +##.## +##### + +##### +.#### +.#### +.###. +.#.#. +.#... +..... + +##### +#.#.# +..#.# +..#.# +....# +....# +..... + +##### +###.# +###.. +###.. +##... +#.... +..... + +..... +.#... +.##.. +###.# +###.# +###.# +##### + +##### +##### +.#.#. +...#. +...#. +...#. +..... + +##### +####. +##.#. +##.#. +.#.#. +..... +..... + +##### +.#### +.###. +.##.. +..#.. +..#.. +..... + +##### +#.### +#.##. +#..#. +..... +..... +..... + +..... +..#.. +.##.. +.###. +.###. +##### +##### + +##### +##.## +#..## +#...# +#.... +..... +..... + +##### +##.## +##..# +#...# +..... +..... +..... + +..... +....# +....# +#..## +#.### +##### +##### + +##### +##### +####. +####. +.#.#. +.#... +..... + +..... +#.... +#...# +#...# +#.#.# +#.### +##### + +..... +..... +..... +.#... +##.#. +##### +##### + +..... +..... +#.... +#...# +#...# +#.#.# +##### + +##### +##### +.###. +.##.. +..#.. +..... +..... + +..... +....# +....# +..#.# +#.#.# +###.# +##### + +##### +#.#.# +#.#.# +#.#.# +#...# +....# +..... + +..... +..... +#.... +#..#. +##.#. +##.#. +##### + +..... +.#.#. +##.#. +##.#. +####. +##### +##### + +..... +..... +.#... +.#..# +.#.## +.#.## +##### + +..... +..... +.#... +.#.#. +.#.#. +####. +##### + +##### +.#### +.###. +.#.#. +..... +..... +..... + +##### +.#### +.###. +.#.#. +.#.#. +.#... +..... + +..... +..... +..... +#.#.. +#.##. +##### +##### + +##### +.##.# +.##.# +.#..# +....# +..... +..... + +..... +.#... +.#... +###.. +###.. +####. +##### + +..... +..#.. +..#.. +.##.. +.###. +##### +##### + +##### +.#### +.#### +.#### +..#.# +..... +..... + +..... +#.... +#.... +##..# +##.## +##.## +##### + +##### +#.#.# +#.#.. +#.#.. +..#.. +..#.. +..... + +##### +.#### +.#### +..### +..#.# +..#.. +..... + +..... +..... +#.#.# +##### +##### +##### +##### + +..... +..#.. +#.#.. +#.#.. +###.. +####. +##### + +##### +.#.## +.#.## +.#.## +...## +....# +..... + +##### +.#### +.###. +.##.. +.#... +..... +..... + +##### +##### +#.#.# +#...# +#...# +..... +..... + +##### +##.## +.#.#. +..... +..... +..... +..... + +##### +###.# +#.#.# +#.#.# +..#.# +..#.. +..... + +##### +###.# +##..# +##..# +.#..# +.#... +..... + +..... +#...# +##..# +##.## +##### +##### +##### + +..... +..... +..... +.#..# +.#.## +##### +##### + +##### +##### +.#### +.#.#. +.#.#. +.#.#. +..... + +..... +..... +..#.# +.##.# +.##.# +.##.# +##### + +##### +##.## +##..# +.#..# +.#..# +.#..# +..... + +##### +###.# +#.#.# +#.#.. +#.#.. +#.... +..... + +..... +..... +#.... +#..#. +#.##. +####. +##### + +..... +..... +...#. +..##. +#.### +#.### +##### + +##### +##.## +##.## +##.#. +#.... +#.... +..... + +..... +....# +#.#.# +###.# +##### +##### +##### + +..... +..... +..... +..#.. +.##.# +.##.# +##### + +..... +..... +....# +#.#.# +#.#.# +#.#.# +##### + +##### +##### +####. +####. +#.#.. +..... +..... + +##### +##.## +.#.## +.#.## +.#.#. +.#... +..... + +..... +....# +....# +.#.## +.#.## +.#### +##### + +..... +...#. +#..## +#..## +#.### +##### +##### + +##### +##### +####. +#.##. +#.#.. +..... +..... + +##### +####. +.#.#. +.#.#. +.#... +..... +..... + +..... +...#. +...#. +#..#. +#.##. +####. +##### + +##### +##.## +#...# +#...# +#.... +#.... +..... + +..... +..#.. +.###. +.###. +.#### +##### +##### + +..... +#..#. +#..## +##.## +##.## +##.## +##### + +..... +..... +#...# +#...# +#.#.# +#.### +##### + +..... +.#... +.#.#. +.#.#. +##.## +##.## +##### + +..... +.#..# +.#..# +.#.## +.#.## +##### +##### + +##### +.#### +.##.# +.##.# +.#..# +.#... +..... + +##### +###.# +.#..# +.#..# +.#..# +.#..# +..... + +##### +##.## +##..# +##... +##... +#.... +..... + +..... +..... +..... +..#.. +#.#.. +####. +##### + +##### +##.## +##.## +.#.#. +..... +..... +..... + +..... +#.... +#.... +#..#. +#.##. +##### +##### + +..... +..... +..... +.#... +.#..# +###.# +##### + +..... +...#. +#..## +#..## +#.### +#.### +##### + +##### +##.## +##.## +#...# +#...# +#.... +..... + +##### +#.### +#.### +#.### +#.### +#..#. +..... + +##### +#.#.# +#.#.# +..#.. +..... +..... +..... + +##### +##.#. +##.#. +##... +#.... +..... +..... + +##### +##### +##### +##### +.##.# +.#... +..... + +##### +.###. +.###. +.##.. +..#.. +..#.. +..... + +##### +##.#. +##... +#.... +#.... +..... +..... + +..... +..... +..... +...#. +.#.#. +##.## +##### + +..... +..... +..... +....# +.#..# +.#.## +##### + +..... +....# +#..## +#.### +#.### +##### +##### + +##### +#.### +..### +..##. +...#. +...#. +..... + +##### +#.### +#.### +#..## +#...# +....# +..... + +##### +##.## +#..## +#...# +..... +..... +..... + +..... +....# +#.#.# +#.#.# +###.# +###.# +##### + +..... +...#. +...## +#..## +#.### +##### +##### + +..... +....# +..#.# +#.#.# +#.### +##### +##### + +..... +..#.# +..#.# +.##.# +##### +##### +##### + +..... +..... +.#.#. +.#.#. +.###. +.###. +##### + +..... +..... +.#... +.##.. +.##.# +###.# +##### + +..... +..... +#.... +#.... +#..#. +##.#. +##### + +##### +##### +.#### +..### +..#.# +..#.# +..... + +..... +..#.. +..##. +.###. +.###. +.#### +##### + +..... +..... +..#.. +#.##. +#.##. +####. +##### + +##### +##.## +#..## +....# +..... +..... +..... + +..... +....# +....# +#.#.# +#.### +##### +##### + +..... +#.... +#.... +#.#.# +#.#.# +#.### +##### + +..... +....# +....# +....# +....# +#.#.# +##### + +##### +#.##. +#.##. +#.#.. +#.... +..... +..... + +##### +#.#.# +....# +....# +....# +..... +..... + +..... +..... +..... +.#... +.#.#. +.#### +##### + +..... +..... +....# +#..## +##.## +##### +##### + +..... +..#.. +..##. +..##. +..##. +#.##. +##### + +##### +##### +###.# +###.# +.#..# +.#... +..... + +..... +#.... +#.... +#..#. +##.#. +##### +##### + +##### +##### +##### +.##.# +..#.# +..#.. +..... + +..... +..#.# +..#.# +.#### +.#### +##### +##### + +##### +##### +##### +#.#.# +..#.# +..... +..... + +..... +.#... +.#... +.#... +##... +###.# +##### + +##### +###.# +.##.. +..#.. +..#.. +..#.. +..... + +..... +..... +.#... +.##.# +.#### +##### +##### + +..... +..... +.#... +##... +##... +###.# +##### + +..... +#.... +#.... +#.#.. +#.##. +#.##. +##### + +..... +..... +#..#. +#.##. +#.### +#.### +##### + +##### +####. +#.##. +..##. +...#. +...#. +..... + +##### +###.# +##... +##... +.#... +.#... +..... + +##### +.#.#. +.#.#. +.#... +.#... +.#... +..... + +..... +..#.. +.##.. +.###. +.#### +##### +##### + +##### +##### +##### +.#.## +...## +....# +..... + +##### +##### +##### +##.#. +.#... +.#... +..... + +##### +##.## +#..## +#..## +#...# +..... +..... + +..... +#..#. +#.##. +#.##. +####. +##### +##### + +..... +.#... +.#... +.#... +.#... +###.# +##### + +##### +.#.## +...## +...## +....# +..... +..... + +##### +.#### +..### +..### +...## +....# +..... + +##### +##.## +##.#. +#..#. +..... +..... +..... + +..... +..#.. +.###. +####. +##### +##### +##### + +..... +..#.# +..#.# +..#.# +..### +#.### +##### + +##### +##.#. +##.#. +##.#. +.#... +.#... +..... + +..... +#.... +#.#.# +#.#.# +#.#.# +#.### +##### + +##### +.###. +.###. +.###. +..##. +..#.. +..... + +##### +.#.#. +.#.#. +...#. +..... +..... +..... + +..... +..... +..#.. +..#.. +..#.# +#.#.# +##### + +##### +.#.#. +...#. +...#. +...#. +...#. +..... + +..... +.#... +##... +###.. +####. +####. +##### + +..... +.#... +.#... +.##.# +##### +##### +##### + +..... +#...# +#...# +#..## +#.### +#.### +##### + +##### +####. +.###. +..#.. +..... +..... +..... + +##### +####. +##.#. +#.... +#.... +..... +..... + +..... +..... +...#. +.#.## +.#### +.#### +##### + +..... +#...# +#..## +##.## +##### +##### +##### + +##### +###.# +.##.. +.#... +.#... +.#... +..... + +##### +###.# +###.. +###.. +#.#.. +..... +..... + +##### +##.## +##.#. +.#.#. +...#. +..... +..... + +..... +..... +...#. +.#.#. +.#.#. +.#.## +##### + +..... +#.#.. +#.#.# +###.# +###.# +###.# +##### + +..... +..... +..... +#.#.# +#.#.# +#.#.# +##### + +##### +##.## +.#.#. +.#.#. +...#. +..... +..... + +..... +...#. +..### +.#### +.#### +.#### +##### + +##### +.#### +..##. +...#. +..... +..... +..... + +##### +#.### +#.### +#.#.# +#.#.. +#.... +..... + +##### +.#### +.###. +.###. +.#.#. +.#... +..... + +##### +####. +.#.#. +.#.#. +.#.#. +..... +..... + +..... +..... +#.... +#..#. +##.#. +##.## +##### + +##### +#.##. +..##. +..#.. +..#.. +..#.. +..... + +..... +#.... +#.... +##... +##.#. +##.## +##### + +..... +..... +....# +#..## +#.### +##### +##### + +..... +#.... +#..#. +#..#. +#..#. +#.### +##### + +..... +..#.. +..##. +..##. +#.### +#.### +##### + +..... +...#. +.#.#. +.#.#. +.###. +##### +##### + +..... +...#. +...#. +#..## +##.## +##### +##### + +##### +#.### +#.### +#.### +#.#.# +#...# +..... + +##### +.#### +.#.## +.#.#. +.#.#. +.#... +..... + +##### +##### +####. +.#.#. +.#.#. +.#... +..... + +##### +#.### +#.#.# +#.#.# +..#.# +..#.# +..... + +..... +#.#.# +#.#.# +#.### +#.### +##### +##### + +..... +#.... +#.... +##..# +###.# +###.# +##### + +##### +####. +####. +.##.. +..#.. +..... +..... + +##### +#.### +..### +..### +..##. +...#. +..... + +##### +###.# +###.# +###.. +#.#.. +..#.. +..... + +..... +..#.. +.##.. +.###. +##### +##### +##### + +##### +##### +.#.## +.#.#. +.#.#. +..... +..... + +##### +##### +##### +###.# +.#..# +....# +..... + +##### +##### +###.# +#.#.# +#.#.. +#.#.. +..... + +..... +...#. +...#. +...#. +.#.#. +.#.## +##### + +##### +##### +#.### +..### +..##. +..#.. +..... + +##### +##### +##.## +#..#. +#..#. +#..#. +..... + +##### +.#### +..### +..### +..##. +...#. +..... + +..... +..... +#.#.# +#.### +#.### +##### +##### + +..... +..... +..... +#.#.. +###.# +###.# +##### + +..... +..#.# +.##.# +.##.# +.##.# +.#### +##### + +##### +##### +#.#.# +#.#.# +....# +....# +..... + +##### +.##.# +.##.# +.##.# +..#.# +....# +..... + +..... +..... +...#. +#..#. +##.## +##.## +##### + +##### +.#### +.#### +.##.# +.#..# +....# +..... + +..... +.#... +##... +##... +##... +###.# +##### + +##### +##### +.#### +.##.# +..#.# +....# +..... + +##### +##### +####. +#.##. +#.##. +...#. +..... + +..... +#..#. +#..#. +##.## +##### +##### +##### + +..... +..... +#.... +##... +##... +##.#. +##### + +..... +..#.. +#.#.. +#.#.. +#.#.# +#.#.# +##### + +##### +###.# +###.. +###.. +.#... +..... +..... + +..... +...#. +.#.## +##.## +##.## +##.## +##### + +##### +####. +###.. +###.. +#.#.. +..... +..... + +..... +.#... +.#.#. +.#.#. +##.#. +####. +##### + +##### +###.# +#.#.# +..#.. +..#.. +..#.. +..... + +##### +##.## +##.## +##..# +#.... +..... +..... + +..... +..#.# +#.#.# +#.#.# +#.### +#.### +##### + +..... +..... +..... +..... +.#... +###.# +##### + +##### +##### +.#.## +.#..# +.#..# +.#..# +..... + +##### +##### +.##.# +.#..# +.#..# +.#..# +..... + +##### +##### +##.## +.#.## +.#..# +....# +..... + +..... +#.... +##... +##... +###.# +###.# +##### + +##### +##### +##### +##.## +.#..# +..... +..... + +##### +###.# +.##.# +.##.. +..#.. +..... +..... + +..... +.#... +.#... +.#... +.#... +.#.#. +##### + +..... +#.... +#...# +#...# +##.## +##.## +##### + +##### +##.## +.#.#. +...#. +...#. +...#. +..... + +..... +..#.. +..##. +.###. +####. +##### +##### + +##### +##### +##.## +##.## +.#.## +....# +..... + +..... +.#... +.#... +.#..# +.#..# +.##.# +##### + +..... +#.... +#...# +#...# +##.## +##### +##### + +..... +..#.. +..#.. +.###. +.#### +##### +##### + +..... +..#.. +..#.. +..#.. +.###. +.#### +##### + +..... +#..#. +#..## +#..## +#..## +#.### +##### + +##### +##### +##### +.##.# +.#..# +....# +..... + +..... +..... +..... +....# +.#.## +##### +##### + +..... +..... +..... +...#. +..### +.#### +##### + +##### +###.# +.#..# +.#..# +.#... +.#... +..... + +##### +.##.# +.##.. +..#.. +..... +..... +..... + +..... +..... +#.... +#.... +#.#.# +#.#.# +##### + +##### +##### +##### +#.### +#.#.# +#...# +..... + +..... +#..#. +#.##. +#.##. +#.### +#.### +##### + +..... +....# +#.#.# +#.### +#.### +#.### +##### + +..... +..#.. +..#.. +..#.. +#.##. +####. +##### + +..... +..... +..#.# +..#.# +.#### +##### +##### + +..... +..#.. +..#.# +..### +.#### +.#### +##### + +##### +##### +##### +####. +.###. +..#.. +..... + +##### +##### +#.### +..### +..##. +...#. +..... + +##### +.#### +..### +..##. +..#.. +..#.. +..... + +##### +#.### +#.### +#.### +...## +...#. +..... + +..... +..#.. +..#.. +..#.# +..#.# +.#### +##### + +##### +##### +.#### +.#### +..#.# +..#.# +..... + +##### +##.## +##.## +.#.## +.#..# +.#..# +..... + +..... +..... +....# +..#.# +..### +.#### +##### + +..... +...#. +.#.#. +.#.## +.#.## +.#.## +##### + +..... +.#... +.#... +.#... +.#.#. +.#.#. +##### + +..... +..... +..#.. +#.#.# +##### +##### +##### + +..... +.#.#. +.#.#. +##### +##### +##### +##### + +##### +##### +.#### +..### +..#.# +..#.. +..... + +##### +####. +.#.#. +.#.#. +.#... +.#... +..... + +..... +#.#.. +####. +####. +####. +####. +##### + +##### +##### +####. +####. +###.. +.#... +..... + +##### +##.## +##.#. +#..#. +...#. +...#. +..... + +..... +..#.. +..#.. +..##. +.#### +.#### +##### + +##### +##### +##.## +#..## +#...# +#...# +..... + +..... +..... +....# +.#..# +.#..# +.##.# +##### + +..... +.#.#. +.#.#. +.#.#. +##.#. +##.#. +##### + +..... +..... +..#.. +.##.. +.##.. +.###. +##### + +..... +....# +#...# +#...# +##..# +##.## +##### + +##### +##.## +##.## +.#..# +.#... +..... +..... + +..... +...#. +...## +..### +#.### +#.### +##### + +##### +##### +##### +#.#.# +..#.# +....# +..... + +..... +..... +...#. +.#.## +##.## +##.## +##### + +##### +####. +####. +.#.#. +.#.#. +..... +..... + +##### +##### +##.#. +##.#. +##... +#.... +..... + +..... +....# +#.#.# +#.#.# +#.### +#.### +##### + +..... +.#... +.##.. +.##.# +.##.# +###.# +##### + +..... +.#.#. +.#.#. +.#.#. +.###. +##### +##### + +##### +##### +.###. +..##. +..##. +..#.. +..... + +##### +####. +####. +.###. +..##. +..#.. +..... + +..... +...#. +#.##. +#.##. +#.##. +#.### +##### + +..... +..... +..#.# +#.#.# +###.# +##### +##### + +..... +..... +..#.. +..#.. +#.#.. +#.#.# +##### + +..... +..... +..#.. +#.#.# +#.#.# +###.# +##### + +..... +#..#. +#..#. +##.#. +##.#. +####. +##### + +..... +....# +....# +....# +...## +#.### +##### + +..... +....# +#.#.# +###.# +###.# +###.# +##### + +..... +..... +..... +#..#. +#..#. +#.##. +##### + +..... +..... +.#..# +##.## +##### +##### +##### + +##### +##### +#.### +#.#.# +#...# +#...# +..... + +##### +##### +##.#. +##... +#.... +#.... +..... + +..... +..... +#.#.. +#.##. +#.##. +#.### +##### + +##### +##.## +##.#. +##.#. +.#.#. +.#.#. +..... + +..... +.#.#. +.#.#. +.#.#. +##.#. +##.## +##### + +..... +..#.. +..#.. +.###. +####. +##### +##### + +..... +....# +..#.# +..#.# +.##.# +.##.# +##### + +..... +.#... +.#.#. +##.## +##.## +##.## +##### + +..... +..#.. +..#.. +..#.. +..#.# +#.### +##### + +..... +.#.#. +.#.## +.#.## +##.## +##.## +##### + +..... +..... +#...# +#...# +##..# +##.## +##### + +..... +.#... +.#... +.##.# +###.# +##### +##### + +..... +..#.. +.##.. +###.# +###.# +##### +##### + +##### +.###. +.#.#. +.#.#. +.#.#. +...#. +..... + +##### +###.# +###.# +.#..# +....# +..... +..... + +..... +.#..# +.##.# +.##.# +.##.# +##### +##### + +##### +##### +##### +###.# +##..# +#.... +..... + +##### +##### +###.# +#.#.. +#.#.. +#.... +..... + +..... +#.#.. +#.#.# +#.#.# +#.#.# +###.# +##### + +..... +..#.. +.##.# +.##.# +##### +##### +##### + +##### +##.## +##.## +#...# +..... +..... +..... + +##### +##.## +##.## +##.## +##.#. +#.... +..... + +..... +..... +..... +#...# +#...# +##.## +##### + +..... +..... +..... +#.#.. +#.#.. +####. +##### + +..... +#.... +#.#.. +#.#.# +#.#.# +#.#.# +##### diff --git a/src/main/resources/eu/sim642/adventofcode2025/day1.txt b/src/main/resources/eu/sim642/adventofcode2025/day1.txt new file mode 100644 index 00000000..fe8947ff --- /dev/null +++ b/src/main/resources/eu/sim642/adventofcode2025/day1.txt @@ -0,0 +1,4099 @@ +R10 +L39 +L30 +L9 +R28 +L27 +R14 +L48 +R8 +R9 +R29 +L13 +L15 +R24 +R11 +L24 +L34 +R9 +R2 +L44 +R18 +L39 +L30 +R31 +L13 +R23 +R7 +R14 +R15 +R25 +R44 +R23 +R18 +L16 +R21 +L16 +R48 +L29 +L9 +L13 +L15 +R33 +L35 +L23 +L49 +R24 +L19 +R19 +R5 +R32 +R99 +L4 +L79 +R94 +L11 +R96 +L63 +L37 +L93 +L7 +R35 +R65 +R34 +L91 +L41 +R98 +R22 +L2 +R80 +L66 +L9 +L25 +R45 +R55 +R15 +R32 +R56 +R97 +L78 +L22 +R46 +L84 +L70 +L27 +R35 +R83 +R23 +L6 +L43 +R43 +R62 +R38 +R77 +L75 +R93 +R12 +L38 +R31 +R4 +L52 +L266 +L97 +L10 +R21 +R67 +R33 +R189 +L80 +R66 +R18 +R51 +R56 +R71 +L96 +L475 +R46 +L46 +L60 +R260 +L6 +L330 +R36 +R191 +L19 +L41 +R47 +R22 +L36 +R98 +L266 +L96 +L88 +L12 +R81 +L81 +R44 +L44 +R41 +L98 +L43 +R1 +L49 +R80 +L32 +R29 +R407 +L18 +R18 +R670 +L6 +L43 +L57 +R28 +R11 +R41 +L45 +L35 +L69 +R151 +L59 +R65 +L74 +R86 +L575 +L49 +R85 +L61 +L641 +R41 +L67 +L68 +L75 +R37 +R73 +R80 +L15 +R322 +L23 +R11 +L832 +L744 +L59 +R60 +R27 +R73 +R88 +L62 +R16 +L42 +R56 +R63 +L19 +R89 +L889 +L99 +L48 +R47 +L6 +R68 +R56 +L88 +L170 +R140 +L960 +R60 +L897 +L54 +L49 +L772 +R72 +L95 +R95 +L836 +R989 +R42 +R5 +L54 +R54 +L28 +R28 +R82 +L82 +L7 +R559 +L52 +R49 +R622 +R529 +R20 +L6 +R86 +L16 +L14 +L5 +R601 +L66 +R531 +R87 +R82 +R805 +R95 +R22 +R78 +L9 +R9 +R160 +L83 +L77 +L14 +R15 +R99 +L31 +L77 +R20 +L81 +R3 +R59 +L71 +R58 +L488 +R88 +L80 +L828 +R94 +L69 +L39 +L72 +L46 +L40 +R522 +R97 +L83 +R885 +R17 +R62 +R87 +R77 +R436 +R81 +L81 +R105 +L92 +L666 +L47 +L95 +R95 +R7 +R51 +R42 +L7 +L77 +L91 +R5 +L443 +R77 +L64 +R960 +L80 +R720 +L54 +L76 +L70 +R40 +R60 +L570 +R70 +R67 +R33 +L29 +R74 +L70 +L75 +L99 +L21 +L80 +R55 +L55 +R1 +R99 +R17 +L39 +L78 +L69 +L31 +R832 +L32 +L38 +R74 +L20 +R18 +L47 +R284 +R48 +L6 +R4 +R44 +L661 +L754 +R77 +L23 +R868 +R63 +R69 +R75 +L75 +R90 +L64 +R74 +R360 +R440 +L41 +R75 +L49 +L85 +L1 +L99 +L55 +R55 +R5 +R95 +R86 +R606 +L91 +R99 +R9 +R535 +R4 +L61 +L87 +R57 +L32 +L625 +L769 +R746 +R23 +R9 +L34 +R7 +L91 +L95 +R634 +R41 +L45 +L6 +R93 +L68 +R32 +L61 +L598 +R61 +L82 +L497 +L38 +R38 +L406 +L35 +R68 +L27 +L36 +L473 +L72 +R81 +R955 +L67 +L417 +L44 +R56 +L59 +L67 +L56 +R23 +L24 +R59 +R73 +R46 +L7 +L775 +L17 +L54 +R16 +R74 +L15 +L42 +R42 +R49 +R67 +R84 +L66 +L77 +L314 +R67 +R527 +R63 +R78 +L36 +L88 +L54 +R47 +R955 +L2 +L914 +R60 +R68 +R76 +R23 +R50 +L682 +R28 +R91 +R774 +L74 +L14 +R74 +L2 +R960 +R82 +L59 +R4 +R35 +L55 +L25 +R561 +R4 +R83 +R32 +R20 +R463 +R71 +R369 +L85 +R92 +L16 +R781 +L75 +L369 +L31 +L72 +R72 +L779 +L64 +L106 +L230 +R84 +L405 +R574 +R29 +R72 +L875 +L143 +R39 +R1 +L24 +R27 +L69 +R69 +L57 +R84 +L22 +L875 +R82 +R77 +L89 +R88 +R40 +R92 +R54 +L91 +R322 +R625 +R71 +L36 +R26 +R9 +R157 +L32 +R75 +R32 +R68 +L978 +R78 +L80 +R86 +L6 +R66 +L566 +R2 +L2 +L95 +R72 +L118 +L20 +R61 +R26 +R26 +L65 +L77 +L65 +R53 +R2 +R43 +R88 +L31 +L24 +R34 +L35 +L21 +R8 +L47 +L78 +L74 +L89 +R26 +R248 +L987 +R340 +R65 +L66 +R322 +R45 +R833 +L20 +L80 +L592 +R92 +R6 +L71 +R98 +L38 +R29 +R36 +R87 +R42 +R11 +L46 +R58 +R879 +R9 +L91 +L216 +R7 +L387 +R87 +L16 +L84 +R75 +R25 +L25 +L341 +R70 +L42 +R38 +R65 +L51 +L14 +R72 +R38 +L626 +R16 +L3 +L62 +L38 +R99 +R4 +L19 +L14 +R33 +R847 +R82 +R71 +L41 +L59 +L798 +L68 +R51 +R915 +R365 +R20 +L70 +L15 +L76 +R68 +R8 +L93 +R93 +L80 +R854 +L8 +L66 +L85 +L15 +L241 +R41 +L35 +R39 +R745 +L185 +L66 +L98 +L38 +L4 +R48 +R35 +L36 +L288 +R54 +R621 +R32 +L24 +R92 +L75 +R83 +L59 +R93 +L62 +L884 +L88 +L16 +R46 +R9 +R93 +R68 +R50 +L72 +R31 +L305 +R96 +L48 +L52 +R93 +L93 +L428 +R20 +L654 +L55 +R92 +R10 +L78 +R93 +R56 +L731 +R75 +R37 +L285 +R40 +R508 +L74 +R35 +L761 +R52 +L12 +L39 +L36 +R461 +R80 +L6 +R77 +R23 +L71 +L834 +R23 +R97 +R90 +R48 +L28 +R949 +L8 +R55 +L21 +R85 +R215 +R36 +R55 +R58 +R45 +L94 +L376 +L95 +L87 +L71 +L584 +R313 +L6 +L62 +L32 +R15 +L42 +L85 +L488 +L58 +L59 +R17 +R189 +L189 +L69 +L98 +R91 +L243 +R76 +R43 +L93 +R93 +R85 +L83 +R98 +L38 +L102 +L60 +L88 +L7 +L34 +L71 +L439 +L15 +R354 +L49 +R345 +L3 +R85 +L61 +R794 +L11 +L702 +L903 +R5 +R39 +L639 +L57 +R43 +L639 +R55 +L87 +L5 +L51 +L659 +L50 +R658 +R92 +L496 +L4 +R82 +R18 +L11 +R766 +L72 +R65 +L79 +R61 +L54 +R24 +R98 +L97 +R515 +R20 +L64 +L49 +L46 +R22 +L99 +L835 +L34 +L576 +L55 +R96 +L96 +L44 +R44 +L27 +R5 +R22 +L4 +L32 +L77 +L25 +R25 +L37 +L650 +L51 +L61 +R512 +R11 +R35 +R55 +R99 +R19 +L19 +R26 +L26 +L64 +L36 +L910 +L180 +L1 +R91 +R672 +R58 +L88 +L3 +L239 +R39 +R65 +L52 +L64 +R44 +L32 +L128 +L572 +R52 +R68 +L51 +L45 +L88 +R56 +L92 +R363 +L82 +R66 +R863 +R60 +R72 +R9 +R95 +R54 +L10 +L367 +R74 +R89 +L92 +L998 +R87 +R74 +R43 +L42 +R42 +R2 +R291 +R30 +L609 +R786 +L1 +L99 +L36 +R36 +R37 +L37 +L47 +L53 +R49 +R51 +L403 +L28 +R17 +L69 +L795 +R78 +L70 +R70 +R33 +L52 +R44 +R79 +L104 +L85 +R62 +L77 +R49 +L49 +L84 +R92 +L22 +L85 +R20 +R79 +R29 +L67 +R38 +R52 +R518 +R930 +L78 +R32 +R15 +L69 +L35 +R35 +R98 +L66 +R11 +R29 +L97 +L147 +R613 +L72 +R697 +R34 +L17 +R475 +L21 +L94 +L35 +R92 +R9 +R471 +L80 +R63 +R68 +R91 +L22 +L59 +L41 +L47 +L958 +R5 +R69 +L69 +R650 +R21 +R80 +R24 +L775 +R341 +R59 +L985 +R33 +R23 +L23 +L59 +R11 +L97 +L94 +L209 +L89 +L313 +L67 +L875 +L3 +R484 +R11 +L65 +L83 +R11 +L89 +R110 +R23 +R23 +R2 +R20 +L26 +L471 +R4 +L211 +L8 +L34 +R546 +L421 +L9 +L70 +L240 +L104 +L956 +R407 +R134 +L41 +L84 +L16 +R532 +L32 +L13 +L587 +R213 +R64 +R155 +R12 +R25 +R28 +R70 +L627 +R423 +R49 +L12 +R27 +R46 +R27 +R42 +R69 +L51 +R81 +R267 +R74 +L99 +R1 +R16 +R85 +L59 +L26 +R99 +R95 +R85 +R21 +R28 +R86 +L77 +R298 +L35 +L56 +R56 +L94 +L17 +R11 +R35 +R796 +L6 +R75 +R37 +L37 +L81 +R81 +R86 +L72 +R3 +R490 +L10 +R27 +R787 +R38 +R18 +R70 +L73 +L570 +L751 +R6 +R96 +R91 +L87 +R51 +L94 +L6 +L99 +R72 +R22 +R12 +L33 +R78 +L44 +L70 +L603 +R86 +L42 +L74 +R52 +L57 +R113 +L78 +L35 +R590 +L90 +L16 +L85 +L99 +L45 +R39 +L94 +L29 +L71 +R76 +R24 +R83 +R35 +L34 +L55 +R16 +L45 +L60 +L40 +R91 +L10 +L75 +R94 +L49 +L2 +L241 +R7 +R85 +R47 +L47 +R29 +R71 +L45 +R18 +R51 +L32 +L23 +R938 +L91 +L16 +R80 +L37 +L28 +R85 +L41 +R66 +L98 +R38 +R543 +R69 +L77 +R32 +R63 +L60 +L35 +L18 +L682 +R46 +L88 +R42 +L76 +L41 +L21 +R38 +L73 +R6 +R94 +R990 +R83 +R41 +L47 +R51 +L54 +L92 +R87 +R14 +L86 +R86 +R65 +R35 +R87 +L84 +R97 +R61 +R93 +R73 +L538 +L95 +R65 +R39 +L313 +L81 +R96 +L24 +L762 +R60 +R65 +L49 +R28 +L18 +L52 +L48 +R12 +R186 +L19 +R121 +L77 +R84 +R6 +R14 +R673 +L19 +L481 +L59 +R24 +L65 +L28 +L95 +R20 +L97 +L4 +R4 +R378 +R58 +L102 +L57 +R23 +L51 +L49 +L91 +R91 +R9 +L68 +R59 +R5 +R88 +R7 +R668 +L68 +R48 +R52 +R98 +L68 +R70 +L421 +R19 +R17 +R62 +R23 +R858 +L79 +R2 +R54 +L2 +L30 +R7 +R73 +R48 +L31 +R93 +R54 +R63 +L10 +R42 +L679 +R65 +R584 +R88 +L13 +L24 +L31 +L32 +L63 +R63 +L89 +R87 +R2 +L87 +R290 +L3 +R326 +R53 +R59 +L70 +R70 +L9 +L29 +L79 +R83 +L528 +R13 +L27 +R23 +R89 +L59 +R51 +R29 +L95 +L910 +R110 +L70 +R18 +L48 +L22 +L20 +L13 +R55 +L22 +R39 +L64 +R96 +R41 +L88 +R92 +R924 +L18 +L831 +L90 +R39 +L58 +L60 +R93 +L893 +L81 +L32 +L87 +L46 +R260 +L37 +L41 +L836 +L9 +R24 +R33 +L48 +L81 +R89 +R67 +R25 +R820 +L703 +R83 +R70 +R13 +L83 +R89 +L35 +L122 +R68 +L56 +L59 +L84 +L77 +R70 +L81 +L349 +R36 +R63 +R4 +L867 +R70 +L704 +L4 +L83 +L66 +L30 +R72 +L55 +R74 +R67 +L82 +R51 +R90 +L24 +L76 +R909 +L9 +L72 +L65 +R53 +R63 +L79 +L78 +L20 +L86 +L9 +L264 +R57 +R5 +L78 +R80 +L9 +R86 +R16 +L21 +L90 +L90 +L15 +R17 +L98 +R709 +L212 +R79 +R92 +L297 +R63 +R63 +L729 +L601 +L40 +R13 +R67 +R90 +L68 +R53 +R52 +L37 +L19 +L81 +L67 +R67 +R29 +R13 +R50 +R52 +L761 +L83 +L999 +R99 +R507 +L266 +R59 +L31 +R26 +L52 +R57 +L90 +L10 +L46 +L334 +R17 +R65 +L195 +L239 +R132 +R972 +L99 +L30 +L43 +L34 +R13 +R556 +L35 +L23 +L77 +L90 +L32 +R184 +L62 +L5 +L295 +R988 +L62 +R475 +R969 +R87 +L57 +L91 +R91 +R49 +L66 +R64 +L347 +L761 +R61 +R30 +R306 +R49 +R615 +L47 +R47 +R31 +L531 +L90 +R64 +L475 +R1 +L33 +L67 +L422 +L78 +L25 +R616 +R481 +L72 +R612 +L306 +L75 +L51 +R16 +R83 +R96 +L87 +R31 +R81 +L34 +L18 +R52 +R1 +L80 +R7 +R88 +R84 +R589 +R37 +L94 +R54 +L190 +R4 +L590 +R7 +R943 +R40 +R75 +R225 +R50 +R50 +L92 +L8 +L21 +R21 +L22 +L47 +R9 +L6 +L34 +R36 +L87 +L49 +L78 +L7 +R65 +R37 +R707 +L768 +L56 +L754 +R59 +R695 +L65 +R65 +R924 +R81 +L82 +L82 +R159 +L74 +R9 +R66 +R99 +L76 +L49 +R512 +R96 +R23 +L71 +R50 +R92 +L77 +L89 +R16 +R31 +R47 +R97 +L95 +L11 +R6 +L23 +L79 +R226 +L4 +R19 +L741 +R75 +L75 +L89 +L8 +R9 +R88 +R46 +L46 +L36 +R65 +L38 +L91 +L260 +L35 +R195 +R81 +R19 +R84 +R3 +L494 +L87 +R23 +L29 +L64 +L694 +L42 +L14 +L486 +L33 +R81 +L19 +R71 +R18 +R82 +R58 +L365 +L95 +L50 +R99 +L547 +L93 +L8 +L53 +R24 +L60 +R2 +R388 +R86 +L86 +L82 +L18 +R345 +R360 +R618 +R13 +R64 +L766 +L926 +L154 +R31 +L879 +L6 +R80 +L97 +R1 +R96 +L33 +R64 +L7 +R496 +L63 +R84 +R503 +L24 +R45 +L2 +L343 +L95 +L5 +R47 +L647 +R40 +L340 +L8 +L92 +L77 +R56 +L79 +R68 +L91 +R57 +R66 +R29 +R71 +L87 +L870 +L29 +R86 +L87 +R15 +L974 +R446 +R163 +L74 +L189 +R615 +L23 +L692 +L88 +L12 +L16 +R58 +L95 +R353 +R52 +L38 +R86 +L75 +R75 +R90 +R96 +R25 +L57 +L24 +L82 +L364 +L584 +R3 +L441 +L94 +L68 +L44 +R2 +L74 +R16 +L58 +R574 +L816 +R66 +L9 +L57 +R783 +L83 +R25 +R58 +R493 +R142 +R308 +L380 +L654 +R77 +L36 +R93 +L126 +L35 +L65 +R28 +L27 +R99 +L12 +R12 +R864 +L85 +R38 +R49 +R27 +R38 +L4 +R84 +R481 +L10 +L8 +R14 +R12 +R140 +L57 +L83 +R51 +L51 +L67 +L15 +L18 +L48 +L43 +R91 +R71 +L658 +L51 +L90 +L18 +R46 +L58 +L42 +L26 +R84 +L17 +L41 +R508 +L308 +R47 +L208 +R226 +R37 +L802 +R689 +R11 +L396 +R296 +L760 +R60 +R90 +L49 +L41 +R75 +L93 +R598 +L63 +L17 +R55 +R12 +R77 +L44 +R325 +L541 +R16 +R64 +L64 +L23 +R23 +R6 +L6 +L67 +L10 +R77 +L373 +R73 +R90 +L90 +R18 +L34 +R361 +L45 +L64 +L85 +R18 +L95 +R82 +L17 +L39 +L50 +R95 +R78 +L52 +R13 +R16 +L878 +R78 +R15 +L15 +R48 +L37 +L32 +R97 +R24 +L265 +L79 +R44 +R77 +L77 +R917 +R93 +L87 +L66 +L13 +R189 +L85 +L48 +R30 +R84 +R86 +R19 +R48 +L67 +R25 +R285 +R72 +R53 +R52 +R13 +L394 +R194 +L15 +R84 +R85 +R12 +L66 +L71 +R71 +L720 +R20 +R78 +R58 +L272 +R36 +L90 +L10 +L27 +L41 +L32 +R86 +R9 +L95 +R37 +L77 +L60 +R35 +R6 +L41 +L1 +L99 +L40 +R40 +L483 +R651 +L868 +R761 +L714 +R549 +R304 +R22 +L222 +L62 +R28 +L66 +R36 +L156 +L81 +L99 +R371 +R29 +R89 +L25 +R928 +R8 +R39 +R8 +L46 +R50 +R49 +L49 +L251 +R7 +R37 +R56 +L78 +L622 +R98 +L31 +L95 +L85 +R13 +R111 +L19 +L92 +L36 +L64 +R27 +L27 +L24 +L20 +L68 +R76 +R13 +L72 +L5 +R619 +R181 +R49 +L11 +L88 +R77 +R409 +R511 +L29 +L502 +L73 +R48 +L91 +L79 +R74 +L59 +R12 +L76 +L68 +R96 +L29 +R929 +L22 +L72 +R74 +L43 +R74 +L32 +L79 +R51 +L34 +L17 +L53 +L20 +R73 +L15 +R15 +L97 +L3 +R97 +R61 +L58 +L2 +R26 +L24 +R59 +L54 +R33 +L538 +L222 +R695 +R26 +R66 +L56 +L68 +L13 +R8 +R868 +R936 +R49 +L89 +R37 +L82 +L38 +R83 +R113 +L508 +R22 +L127 +R419 +R64 +R17 +L71 +L59 +R324 +R98 +L130 +R38 +R913 +L13 +L56 +L44 +L5 +R35 +L73 +R51 +L79 +R227 +L54 +L23 +R294 +L243 +L130 +L812 +L88 +L65 +L35 +L558 +R58 +L90 +R5 +R49 +R59 +L28 +R5 +L63 +L952 +L85 +L20 +L80 +R40 +R1 +L46 +R905 +R766 +L46 +R380 +L55 +R23 +R690 +L787 +R10 +R12 +R901 +R6 +R96 +R404 +L77 +R486 +L9 +L197 +L3 +L89 +L111 +L20 +L4 +R3 +L85 +R44 +L38 +R89 +L50 +L874 +L15 +R50 +R50 +R90 +L55 +R15 +L552 +R81 +L18 +L31 +L49 +R69 +L874 +R55 +L61 +L763 +L257 +R82 +L72 +R82 +R8 +R19 +L72 +R53 +L2 +R69 +R913 +L480 +R598 +R2 +L45 +R70 +L78 +R12 +R42 +R1 +L508 +R8 +R99 +L1 +L67 +R49 +L82 +R570 +L91 +R747 +L8 +R51 +L22 +L647 +R940 +R960 +R7 +R93 +R96 +L82 +L59 +R60 +L515 +L647 +L49 +L54 +L39 +L11 +L23 +L43 +L34 +L41 +R41 +L24 +L98 +L32 +L46 +R68 +R66 +L34 +R14 +L91 +R96 +R29 +L48 +L37 +L61 +R651 +L53 +R53 +R247 +L24 +L76 +R78 +L812 +L15 +R40 +L91 +L32 +L61 +R76 +L90 +L93 +L15 +L935 +R50 +R56 +L56 +L31 +L64 +R435 +R86 +R14 +R560 +L37 +R28 +L69 +R78 +L68 +L9 +L23 +L71 +R235 +R62 +R74 +L63 +R23 +L16 +R15 +R41 +R53 +R512 +L70 +L47 +L48 +L2 +R2 +R20 +R63 +R17 +R436 +L7 +R170 +L99 +R57 +R22 +R11 +R610 +L8 +L92 +L83 +L17 +L414 +L486 +R99 +L6 +R47 +L46 +R6 +L86 +R86 +L73 +R68 +L68 +L13 +R9 +L75 +R67 +R38 +R13 +R634 +L70 +R70 +R89 +L89 +L56 +R72 +L93 +R96 +L19 +R92 +L692 +L45 +L73 +R18 +R20 +L20 +R58 +L955 +R36 +L5 +R66 +L17 +R81 +L47 +R15 +R568 +L10 +L39 +L53 +L98 +R79 +L75 +L91 +R87 +R24 +R76 +L15 +R20 +L25 +R37 +R18 +R43 +R57 +R97 +R68 +R587 +L27 +L13 +R870 +L146 +R73 +R56 +R74 +R15 +L47 +R30 +R13 +R35 +R80 +L75 +L1 +L24 +R17 +L58 +L75 +R806 +L114 +R24 +R47 +R753 +L263 +R97 +L7 +R639 +R87 +R12 +L19 +R54 +R37 +L58 +R23 +R98 +R89 +L489 +R88 +L88 +L86 +R6 +R4 +R52 +L62 +L80 +L32 +L391 +L11 +L36 +R861 +R75 +L20 +R31 +L11 +L4 +L96 +R732 +R68 +L866 +L68 +R65 +L31 +R761 +L11 +L56 +R6 +L595 +R73 +L35 +L43 +R46 +R54 +R53 +R747 +R82 +R34 +R40 +L885 +L34 +R2 +L67 +R828 +L77 +L19 +L61 +R32 +L76 +R21 +L50 +R55 +L89 +R91 +R73 +L63 +R94 +R11 +L42 +L46 +L954 +L39 +L61 +R55 +L22 +R57 +R872 +R59 +L9 +L5 +L7 +R64 +L221 +L743 +R35 +R82 +R88 +L10 +L495 +R66 +L807 +L644 +L15 +L79 +R36 +L5 +R20 +R34 +L6 +L52 +L48 +R74 +R26 +R34 +L58 +R24 +L86 +R17 +R69 +L10 +L90 +R5 +L45 +R19 +R621 +L22 +R41 +L85 +R26 +L60 +L36 +L723 +L63 +L986 +R815 +L20 +R13 +R9 +L109 +L11 +R30 +R95 +R386 +R72 +R528 +L21 +L79 +L23 +L723 +L54 +L87 +L35 +L94 +L75 +L9 +R22 +R78 +L23 +L94 +R17 +L889 +L11 +L532 +L57 +L94 +R83 +R19 +R70 +L342 +R53 +L922 +R22 +R944 +L91 +R9 +R18 +L80 +L64 +L36 +L96 +L4 +L71 +L1 +L28 +R9 +R57 +R51 +R917 +R166 +L283 +L517 +R27 +L15 +L199 +L13 +L29 +L67 +L4 +L421 +R2 +R62 +L43 +R518 +R82 +L51 +L89 +R54 +R66 +L90 +L3 +L7 +L37 +L57 +L48 +L9 +R351 +L39 +L718 +L81 +R12 +L67 +R51 +R91 +L29 +R262 +R6 +R71 +R61 +L38 +L83 +L68 +L11 +R50 +L29 +R876 +R3 +R91 +L30 +R939 +L780 +R1 +L770 +L51 +R35 +R38 +L62 +R78 +R11 +L17 +L45 +R62 +R67 +R21 +R54 +L17 +R275 +L31 +L127 +R58 +L8 +R39 +R88 +R97 +L786 +R17 +R148 +R12 +L657 +L68 +L889 +L46 +L47 +R52 +L35 +R12 +L31 +R2 +L2 +R21 +L77 +R564 +R21 +L17 +L56 +L21 +R92 +L3 +L84 +R41 +R21 +R29 +R71 +L54 +L46 +L328 +L70 +R98 +L8 +R8 +L117 +L86 +L57 +R45 +L199 +R503 +R33 +R42 +L40 +R77 +L201 +R72 +R28 +R12 +L12 +R66 +L407 +L59 +L18 +R18 +L90 +R93 +R97 +L89 +R89 +R82 +L682 +L24 +L76 +L77 +L23 +L96 +R96 +R58 +L67 +R9 +L203 +L97 +L67 +R85 +R12 +L666 +L64 +L39 +R907 +R32 +R91 +L71 +R93 +L913 +R76 +L76 +R21 +L51 +L18 +L84 +L33 +L235 +R446 +R54 +L72 +L78 +L17 +R52 +L68 +R83 +L707 +L49 +L185 +R41 +L60 +L33 +R531 +R20 +R48 +L54 +L98 +L96 +L18 +R81 +R79 +L72 +L28 +R40 +L69 +R22 +R657 +L93 +L72 +L26 +L17 +L788 +R9 +R91 +R48 +L2 +R89 +L35 +R11 +L13 +R49 +L1 +R75 +L475 +L39 +L988 +R27 +R356 +R44 +R97 +R74 +L71 +L6 +L94 +R82 +R47 +L830 +R58 +L908 +L49 +R22 +R59 +R19 +R44 +R39 +L83 +L97 +L39 +R68 +L16 +L316 +R3 +L115 +R12 +L23 +L53 +L24 +R58 +L61 +L22 +L675 +L9 +L189 +L702 +L19 +L81 +R72 +R317 +L48 +L8 +L79 +L947 +R693 +R25 +L25 +R35 +L37 +R2 +R54 +L54 +R148 +R152 +L96 +L77 +R345 +R54 +R98 +L24 +R437 +L14 +L12 +L411 +L32 +L60 +L43 +L132 +L133 +L80 +L84 +L65 +L3 +R32 +L76 +R94 +R82 +L73 +R85 +L19 +L226 +R39 +R99 +L5 +L9 +L13 +R68 +R74 +R80 +R97 +R46 +R657 +L24 +R424 +R49 +R17 +R65 +R90 +L21 +R85 +R448 +L71 +R38 +L935 +R78 +L86 +L2 +R143 +R2 +R814 +L359 +L39 +R578 +R6 +L69 +R69 +L70 +L71 +R84 +R50 +L765 +R172 +R50 +R50 +R47 +L226 +R93 +R11 +R32 +L31 +L46 +L21 +R55 +L14 +R45 +R35 +R27 +R93 +R94 +R26 +R37 +R943 +L712 +R57 +L12 +L743 +R95 +R85 +L98 +L20 +L91 +R239 +R55 +L75 +L80 +L589 +L51 +R40 +L34 +R2 +L68 +L90 +L77 +R67 +R68 +R63 +L31 +L7 +R7 +L69 +R93 +L45 +L19 +R73 +L7 +L26 +L789 +R72 +R17 +L9 +R9 +L42 +L52 +R94 +L298 +R261 +L86 +R11 +R20 +R53 +L61 +R77 +R73 +R90 +R81 +L21 +L43 +L57 +L76 +R76 +L5 +L9 +L76 +R95 +L705 +L67 +R940 +L73 +L33 +R319 +R40 +L26 +R466 +L20 +L961 +R120 +L223 +L651 +R63 +R83 +R23 +L74 +L4 +R78 +L96 +R96 +L24 +R849 +L82 +L643 +L560 +R43 +R36 +R92 +L18 +R72 +R784 +R35 +R510 +L55 +L498 +L71 +L70 +L291 +R60 +R63 +R29 +R57 +L15 +L98 +R550 +R93 +L244 +L98 +L606 +L56 +L96 +R52 +L78 +R362 +R43 +R50 +R43 +R25 +R81 +L26 +R48 +L15 +L934 +R7 +R516 +L122 +R39 +L73 +L52 +L72 +L653 +L537 +R40 +R8 +R446 +R54 +R730 +R70 +L46 +R1 +L59 +R335 +R69 +R54 +R73 +R61 +L88 +L94 +R58 +R12 +L32 +R38 +L82 +R5 +R87 +L43 +L53 +L71 +L757 +R897 +L65 +L34 +L71 +L462 +R97 +L41 +L45 +L816 +L988 +L54 +R347 +L97 +R67 +R85 +R22 +R90 +R42 +R58 +R99 +R28 +L492 +L30 +R26 +R69 +R88 +R61 +L32 +R90 +L343 +L703 +R12 +L93 +L80 +L61 +L36 +R324 +R851 +R90 +L68 +L63 +L19 +L28 +L24 +R93 +L44 +L15 +R49 +L49 +R10 +L10 +R26 +R74 +L33 +R15 +L82 +R92 +R67 +R36 +L95 +L450 +L76 +L74 +R24 +R93 +R53 +L87 +R17 +R907 +R5 +R86 +L1 +R3 +L762 +L755 +R17 +L74 +R3 +L16 +L24 +L78 +L381 +L10 +R80 +R82 +R418 +L87 +L56 +L64 +R870 +R37 +R68 +L688 +L648 +L32 +R450 +R50 +L57 +R32 +R56 +R73 +R96 +R14 +L14 +L35 +R32 +R73 +R31 +R75 +L76 +R70 +L84 +L986 +L675 +R75 +L3 +L5 +R93 +R15 +L27 +L73 +R16 +R941 +L5 +R98 +R50 +R57 +R41 +R25 +R77 +R90 +L9 +L81 +R39 +L39 +L917 +R662 +L13 +L32 +R282 +R34 +L67 +R52 +R1 +L2 +R63 +L9 +R198 +R63 +L15 +R877 +R76 +L53 +R65 +R19 +R149 +L33 +L744 +R44 +R84 +R62 +R226 +L72 +R58 +L621 +R463 +L3 +L97 +R601 +L301 +R44 +R66 +R3 +L713 +R68 +L45 +R38 +R640 +L5 +R4 +R61 +R11 +R30 +L4 +R74 +L79 +L93 +L637 +R95 +L358 +R69 +L57 +R930 +L42 +L53 +L215 +L32 +R69 +L513 +R97 +L8 +L98 +R153 +R67 +R62 +R171 +L40 +L60 +L74 +L26 +R22 +R61 +L83 +R2 +R67 +R31 +R27 +R56 +R53 +L336 +R353 +L53 +R23 +R52 +R25 +R67 +L707 +R840 +L298 +L49 +R47 +R28 +R94 +R14 +L36 +R78 +L25 +R847 +R42 +L150 +L92 +R806 +R19 +L61 +R136 +R38 +L138 +L54 +L46 +R17 +L17 +R78 +R38 +L43 +L220 +L74 +R21 +R43 +R60 +R59 +L244 +R33 +L69 +R28 +L610 +L57 +R57 +L667 +R10 +L69 +L15 +L18 +L41 +L949 +R139 +L94 +R804 +R59 +R20 +L48 +R911 +R99 +L289 +R348 +R57 +L39 +R359 +R364 +L41 +R16 +L16 +R87 +R113 +R59 +L82 +L126 +R49 +L10 +L56 +R18 +L12 +L45 +R56 +L12 +L39 +L61 +R353 +L7 +L93 +R8 +R96 +L59 +R840 +L77 +R80 +R94 +L874 +R30 +L43 +L64 +L61 +R257 +L28 +R8 +L65 +R66 +R893 +L370 +R65 +L558 +R70 +R15 +L32 +R84 +L46 +R579 +L252 +L76 +R102 +R914 +R12 +R24 +L24 +R43 +L43 +R528 +L28 +L74 +L360 +R72 +R70 +L21 +R73 +R40 +L338 +R861 +L123 +L87 +L22 +R94 +L634 +L39 +R88 +R94 +L94 +L44 +R44 +L8 +L48 +L44 +L92 +L44 +R36 +L10 +L28 +R77 +L39 +L87 +L17 +R71 +R19 +L30 +L208 +L74 +R91 +R29 +L82 +R88 +L18 +R3 +L24 +L34 +L93 +R43 +R3 +L43 +R63 +R43 +R14 +R69 +L1 +R75 +L77 +L23 +L683 +R893 +L39 +R29 +R63 +L2 +R39 +R71 +R37 +L276 +R988 +L20 +R32 +R568 +L72 +R72 +L453 +R18 +R494 +L79 +R193 +L73 +R719 +L494 +R18 +R430 +L89 +L98 +R14 +L680 +R43 +L94 +R531 +R2 +R56 +L58 +L37 +R588 +R42 +R51 +L74 +R30 +L17 +L383 +L75 +R75 +R46 +R54 +L18 +L78 +L4 +R786 +L37 +L71 +R22 +R27 +L59 +R32 +L83 +R94 +R19 +R15 +R55 +R74 +L74 +R44 +R55 +L99 +R21 +R79 +L43 +L34 +L23 +R26 +L26 +R24 +R76 +L44 +L188 +L68 +R80 +R93 +L957 +L32 +L984 +L995 +R7 +R88 +R77 +L63 +L595 +L119 +L369 +L68 +R37 +R21 +R25 +R75 +R79 +L490 +L45 +R48 +L13 +R46 +R78 +R65 +R28 +L13 +L4 +L80 +L632 +R81 +L30 +L32 +L99 +L3 +R84 +R11 +L62 +L49 +L62 +R673 +L236 +R36 +L665 +R9 +R56 +L25 +L75 +R503 +R97 +L23 +R48 +R475 +L6 +R48 +R554 +R4 +R37 +L61 +L76 +R84 +L84 +R2 +L2 +R62 +L13 +L49 +L75 +L370 +L97 +L19 +R91 +L14 +L24 +L71 +R20 +L94 +R30 +R35 +L37 +R55 +R61 +R236 +L27 +L33 +R33 +L9 +R9 +L98 +R49 +R49 +R17 +L87 +L15 +R26 +L41 +L68 +L10 +R5 +L27 +L74 +L2 +L88 +L50 +L86 +R64 +R236 +R19 +R81 +R831 +L662 +R61 +L11 +L95 +L24 +R93 +R25 +L53 +R88 +R815 +R86 +L53 +L69 +R92 +L79 +L17 +R72 +L9 +R250 +L41 +L580 +R26 +R454 +L5 +L1 +R6 +R29 +R30 +R447 +L1 +L54 +R96 +L547 +R25 +L131 +R79 +R27 +R34 +L29 +R91 +L96 +L1 +L99 +L60 +L98 +L10 +R68 +L11 +R4 +L19 +L274 +R88 +R12 +L95 +R24 +R49 +R192 +R435 +R92 +L13 +L884 +R9 +R732 +L41 +R27 +R47 +L480 +L42 +R14 +L81 +R992 +R38 +R93 +R76 +L84 +L939 +R7 +R90 +L58 +R74 +R55 +R75 +R95 +L899 +L3 +L17 +R9 +R11 +L68 +L23 +L9 +R77 +R23 +L79 +L21 +L624 +L76 +R19 +L19 +R458 +R42 +L301 +L524 +R25 +L93 +L31 +L9 +L98 +L40 +R29 +L437 +L21 +R79 +L16 +R92 +R719 +R44 +L415 +L3 +R93 +R7 +L52 +R91 +R61 +R91 +L91 +L88 +R988 +L64 +L336 +L36 +L41 +R939 +L95 +R333 +R15 +L15 +L37 +R61 +R76 +R890 +R61 +R83 +L19 +L72 +L97 +R786 +R68 +R97 +L97 +L25 +R162 +L58 +R6 +R45 +L20 +L10 +L38 +R356 +L29 +R20 +R44 +R78 +L56 +R618 +R7 +R86 +R83 +R31 +R628 +R96 +R58 +R65 +L75 +L72 +L265 +R819 +L61 +L285 +L15 +L65 +R341 +L11 +R642 +R93 +R678 +L795 +R20 +L95 +L50 +R33 +L536 +R852 +R66 +L66 +L22 +L36 +R26 +R30 +L98 +R86 +L37 +L74 +L74 +L61 +L76 +L93 +L58 +R91 +L893 +L35 +L76 +R51 +L76 +R47 +L92 +L36 +L37 +L156 +R47 +L148 +L49 +L23 +L28 +L59 +R22 +R63 +L29 +R3 +L547 +R465 +R207 +R415 +R73 +R15 +L54 +R26 +L93 +R930 +R83 +L62 +R5 +R337 +R301 +R99 +L86 +R89 +L54 +L49 +R66 +L66 +R631 +R869 +R424 +L46 +R22 +R44 +R25 +R41 +R37 +R84 +L43 +L45 +L43 +L23 +R92 +R75 +R98 +R92 +R40 +L941 +R767 +L37 +L63 +L15 +R15 +L15 +L59 +R42 +R83 +R212 +L229 +R666 +L97 +R97 +L44 +R78 +R66 +R62 +R538 +R58 +L83 +R25 +R68 +L68 +L74 +L639 +L87 +L18 +R18 +L22 +L710 +L43 +R567 +L67 +R853 +R8 +R53 +R61 +L69 +R269 +L564 +R419 +L98 +R55 +R88 +L96 +L45 +L16 +L179 +L977 +R353 +L40 +R2 +L43 +L14 +L3 +R30 +L72 +R24 +L24 +R64 +R61 +R31 +L70 +R14 +L33 +L851 +L16 +L420 +L54 +R74 +R468 +L68 +L79 +R51 +R5 +R23 +L846 +L48 +R556 +R75 +R63 +L83 +R78 +R87 +R60 +L18 +R31 +L83 +L835 +R25 +R38 +R79 +L26 +R27 +L57 +L76 +L47 +L98 +R98 +R14 +L71 +L43 +R91 +R9 +L90 +R33 +L43 +R32 +L17 +R26 +L41 +L52 +R93 +R60 +R5 +L6 +R58 +R56 +L6 +L8 +R77 +R23 +R12 +R92 +L4 +R74 +R26 +L26 +R41 +R33 +R77 +R79 +L89 +L45 +R86 +R44 +R88 +L21 +R89 +R41 +L97 +R69 +R55 +R49 +L29 +L28 +R45 +L30 +L25 +R49 +L19 +L6 +L49 +R36 +L41 +L26 +R36 +R33 +R44 +L48 +R10 +R5 +R49 +R1 +L26 +L20 +L4 +R20 +L4 +L18 +L8 +L36 +R44 +L30 +L37 +L18 +R22 +R23 +R17 +R47 +L41 +R1 +R42 +R49 +R31 +L39 +L50 +R39 +L3 +R26 +L21 +L1 +R14 diff --git a/src/main/resources/eu/sim642/adventofcode2025/day10.txt b/src/main/resources/eu/sim642/adventofcode2025/day10.txt new file mode 100644 index 00000000..56a0bbe0 --- /dev/null +++ b/src/main/resources/eu/sim642/adventofcode2025/day10.txt @@ -0,0 +1,162 @@ +[.##.#..##.] (3,6) (0,1,2,3,4,5,7,9) (0,1,5,6,7,8,9) (1,9) (0,1,3,4,5,6,7) (0,1,2,3,4,5) (1,2,3,4,5,6,7,8) (2,3,5,7,8) (2,3,5,7,9) (0,1,2,3,4,6,9) (4,5,6,7,8) (3,6,7,8,9) {52,67,66,109,49,65,70,66,33,72} +[..##.] (2,4) (0,4) (1,3,4) (0,2,3,4) (2,3) {16,2,22,13,29} +[..#.##..] (1,2,3,4,5,6) (0,2,7) (1,2,3) (0,4) (0,1,4,5,6,7) (0,4,5,7) (0,1,2,3,5,7) {35,30,34,20,20,18,10,32} +[#.#.#..##] (0,2,4,5,6,7,8) (0,2,4,8) (0,1,4,5) (3,6,8) (2,6,8) (0,1,2,3,5,6) (0,5,7) (0,3,4,5) (2,4,5,6,8) (0,1,3,5) {78,40,73,52,50,88,79,25,63} +[###..#] (0,1,2,4,5) (0,4,5) (2,3) (1,3) (2,3,4,5) (0,1,4,5) (2,5) {33,38,44,37,46,51} +[.####...#.] (1,2,3,4,8) (0,1,2,3,4,5,6,9) (2,5) (0,4,6,7,9) (0,2,6,7,8) (0,2,6,8,9) (0,1,4,5,6,7,8,9) (1,5,6,9) (1,3) (0,1,2,3,4,7,8,9) (0,1,2,5,7) {57,69,71,46,34,52,43,31,38,52} +[###..#...#] (2,6,7,8) (0,3,7,8,9) (0,8) (5,7) (1,2,5,8) (1,3,6,7) (2,3,4,7,9) (0,1,2,3,6,9) (0,2,4,6,7,8,9) (1,2,3,4,5,6,9) (0,1,4,5,7,9) {54,37,34,27,18,20,28,34,44,38} +[#.##..##] (2,5) (1,3,4,7) (0,2,3,6,7) (0,2,3,4,5,7) (4,5,7) (1,2,3,5,7) (3,6) (0,1,3,4,5,6) (1) {39,42,54,72,44,57,31,51} +[##.#] (3) (0,3) (0,2) (1,3) (0,2,3) {20,6,10,37} +[##..#.] (3,4,5) (1,3,5) (2,4) (0,1,2,3,4,5) {17,131,30,138,37,138} +[.##.#.] (3) (0,3,4,5) (0,1,2,5) (1,4,5) {25,16,8,36,25,33} +[..###.##.] (4,6) (2,4) (0,8) (1,5,6,7,8) (3) (3,7,8) (2,8) (1,2,5) {17,22,22,17,10,22,26,33,66} +[...###.] (1,3,5,6) (0,2,3,4) (0,2,4,5,6) (0,2,5) (0,1,2,3,4) (4,5) {183,25,183,38,44,185,38} +[....#...] (1,2,4,6,7) (0,1,2,6,7) (0,1,2,3,4,5,6) (0,1,3,4,6,7) (2,5,6,7) (1,2,4,5,6,7) (1,3,4,5,6) (4,5) {19,51,30,33,62,45,51,23} +[..#...###] (0,1,4,5,6) (3,4,7,8) (0,6,7) (0,1,4) (0,4,6) (0,1,2,3,6,7,8) (1,2,3,4,7,8) (0,1,5,6,8) {44,37,15,35,50,17,39,45,46} +[#.##..###] (0,5) (1,2,5,7) (0,1,3,4,6) (5,7) (1,4) (1,3,4,5,8) (1,2,4,8) (2,6) (0,1) (0,1,2,3,4,6,7) (3,5,6,7) {172,213,30,32,59,43,17,27,34} +[#..#..] (4) (0,1,3,5) (1,2) (1,2,3,4,5) (0,5) {21,50,30,30,13,31} +[#..##.#.#.] (2,3,4,6,8) (3,4,5,6,7) (3,8,9) (3,5,6,7,9) (0,3,4,5,8) (2,3,5,6,8,9) (1,8) (0,1,2,3,5,6,7,8) (1,2,5,6,8,9) (2) {12,40,30,27,7,35,38,23,44,19} +[.#..#..#..] (0,3) (3,4,5,6,8,9) (0,1,4,5,7,9) (1,3,4,7,9) (0,1,2,3,4,5,7,8,9) (2,6,7) (0,4,6,9) (0,1,4) (3,7,8) {47,37,18,56,63,38,31,45,38,57} +[##.#.###.#] (0,1,4,6,7) (0,1,3,5) (0,3) (1,2,3,5,6,7,8,9) (0,2,3,4,5,6,7,8) (1,4,8) (0,1,7,8,9) (0,1,2,4,5,7,8,9) (2,3,4,5,7,8,9) (1,4) (9) (0,6) (0,1,3,5,6,7,8,9) {106,109,39,74,61,68,67,85,83,56} +[###.] (1,2,3) (0,1,2) {133,145,145,12} +[..###] (0,3) (2) (2,4) (1) (0,1,4) (0,1,2,3) {21,28,32,16,8} +[..#.####.#] (0,1,2,6,7,8,9) (0,7) (0,2,3,4,5,6,7) (0,1,4,5,6) (3,4,5) (0,1,2,3,4,5,8,9) (4,5) (2,4,5,6,7,9) (0,1,2,3,4,5,6,7) (0,1,2,3,4,5,6,9) (8,9) {257,237,81,62,284,284,267,78,39,68} +[#.#.#] (0,3) (0,2,4) (0,1,4) {173,9,163,1,172} +[.#..##...] (8) (0,3,4,5,7,8) (7) (2,8) (5,7) (0,1,3,7,8) (1,4,6,7) (0,3,4,5,7) (0,1,2,5,6,7) (0,2,5,8) (3,5,7,8) {64,35,33,48,38,69,17,82,69} +[##.##.#] (0,1,3,5,6) (2,5) (2,4) (2,3) (0,1,2,3,5,6) {18,18,62,36,17,35,18} +[.###.] (0,1,2,3,4) (1,2,4) (1,2,3) {149,166,166,162,153} +[.#...] (0,1,2,3) (0,4) (1,2,4) (1,3) (2,3,4) {13,39,31,26,24} +[###.####.#] (0,1,2,3,6,7,8,9) (4,5,7,8) (0,1,3,4,5,6,8,9) (0,6,7,8) (0,2,3) (0,1,3,4,5,9) (0,1,6,8) (1,2,3,4,6,7,8,9) (0,2,4,5,7,8,9) (3,5,6,7,8) (0,2,4,6,8) (4,6) {90,47,42,59,59,36,80,38,77,36} +[##..#] (1,2) (0,1,3) (2,4) (1,2,3) (0,1,4) {12,27,22,3,18} +[.##....##.] (2,7) (1,2,6,7,9) (1,2,3,4,6,7,8,9) (0,7,8) (0,2,4,7) (6) (0,1,3,4,5,7,8,9) (1,3,5,7) {37,47,63,27,37,7,54,90,41,41} +[######..#] (1,2,6,7,8) (1,2,5,7,8) (0,1,7,8) (2,3,5,6,7,8) (0,3,4) (0,1,2,4,6,7,8) (0,1,2,5,6,7) {23,19,32,33,17,24,27,38,38} +[...#.#] (3,5) (0,4,5) (0,2,4) (0,1,3) (0,2,3,5) (0,3) (4,5) (1,2,3) {46,22,31,56,18,29} +[....###] (4,5,6) (1,3) (0,3,4,5) (1,2,3,5,6) (2,3,4,5,6) (0,1,2) (1,2,3,4,6) {179,56,51,207,195,198,50} +[##.....] (1,2,4,5) (1,3,4,5) (1,2,3,6) (2,5,6) (0,1,2,6) (0) (0,1,3,4,5,6) (2,3,5) {42,58,64,58,38,69,50} +[##.#.#.] (0,4,6) (0,2,3,4,5) (3,4,5) (0,1,2,3,4) (1,2,5,6) (0,2,3,4,6) (1,2,3,4,5) (2,6) {49,35,64,61,80,54,43} +[#.##] (0,1,3) (1,2,3) (0,1) (1,2) {30,49,19,28} +[##.#.#..##] (0,3,4,5,6,7,8,9) (0,1,2,3,6,8) (3,4,5,6,9) (0,2,3,4,6,8,9) (0,1,2,3,7,8,9) (8,9) (0,1,2,3,4,6,9) (5,7) (5,7,8) (3,6,7,8,9) {64,43,56,86,38,130,68,158,72,74} +[##.#.] (0,1,2,3) (0,1,2,4) (0,1,3) (2) {151,151,28,141,10} +[..##..##] (0,1) (0,1,2,3,4,5,7) (0,2,5,6,7) (0,2,4,7) (0,3,4,5,6,7) (2,3,4,5) (3,4,7) {43,13,44,47,50,53,27,52} +[#..#.##] (1,2) (4,5) (0,2,6) (0,1,2,5) (0,1,3,5,6) (0) (1,2,4,6) (0,3,5,6) {177,50,46,7,26,46,14} +[#.#.] (1) (0) (0,1,3) (2,3) (2) (3) {30,18,11,31} +[####..#...] (4,8) (2,5,8,9) (7,8) (1,2,6,8) (1,2,5,8) (6) (0,2,3,5,6,7,8,9) (1,2,3,5,9) (3,5,6,7,9) (0,1,5) {28,33,50,31,11,65,33,28,58,48} +[##...] (0,1,2,3) (0,1,2,4) (0,2) (0,4) (2,4) {143,133,135,132,9} +[#..#] (1,2,3) (0,2,3) (2,3) (1,2) (0,3) (3) {37,27,56,76} +[###.] (0,1,2) (0,1,3) {25,25,11,14} +[#...#..#] (1,2,3,5,6,7) (0,1,4,5,6,7) (0,2,4) (0,1,3,7) (2,7) (2,3,5,6) (0,5,6,7) (1,4,6,7) (3,5) (0,1,2,4,5,7) {73,210,49,41,203,62,194,228} +[#..##.###.] (6,7,8) (3,5,7) (2,4) (1,3,4,9) (0,1,2,3,6,7,9) (0,1,2,3,5,8) (3,8) (2,3,4,6,7,8,9) (3,4,7,8) (0,1,2,3,4,5,7,8) (0,1,2,4,7) (2,4,6) (5,6,8,9) {41,59,70,115,88,248,237,94,286,230} +[####.#.] (2,3,4,5,6) (0,1,5) (1,5) (4,5) (3,5,6) (0,2,3,4,5,6) (0,1,2,4,5) (1,2,4,5,6) (2,4) {23,38,45,36,52,81,51} +[#.##..#.] (1,3,6,7) (1,2,3) (0,1,3,5,6) (0,1,2,3,4,5,6,7) (2,3,4,6) (1,2,3,4,5,7) {13,55,45,62,33,33,30,36} +[.#.#...#] (2,4,6) (1,2,3,4,5,7) (0,1,4,5,7) (0,1,2,4,5,6) (1,3,4,5,6,7) (1,2,4,5,6,7) (0,1,5,7) (1,3,7) {36,55,41,16,59,54,28,37} +[..##...#..] (0,1,4,5,6,7,8,9) (1,3,5,6,7,8,9) (4,6) (2,3,7) (7) (1,2,3,5,6) (1,5,9) (0,1,8,9) {28,61,21,32,17,49,42,51,39,47} +[..#......] (0,6,7) (4,5,6,7) (0,1,2) (2,3,4,5,7,8) (0,3,5,6,7,8) (3,5,6) (1,2,3,4,5,6,8) {34,23,32,44,26,47,54,37,32} +[#.###] (0,1) (1,2) (1,2,3,4) (0,1,3) (1,2,3) (2,4) {28,62,36,26,15} +[#.#..##..#] (0,3,5,7) (0,6) (1,2,3,9) (2,4,6,7,9) (2,4,8) (0,1,4,5,6,7,8,9) (0,1,3,4,6,7,8,9) (1,2,3,4,5,6,7,8) (2,6) (4,9) {16,21,65,27,69,18,51,40,36,44} +[..##..#] (1,4,6) (0,1,2,3,5) (0,2,4) (3,4) (0,1,2,3,5,6) (4,6) (2,4,5,6) {54,58,66,47,72,50,66} +[#.#..#] (1,2,4) (0,2,4) (0,1,2,3) (2,4) (0,1,4,5) (1,2,3,5) (0,1,2,3,5) {36,61,68,41,37,48} +[.#.#.] (0,1) (4) (1,2,3) (3,4) (2,3,4) (2) {17,37,34,41,35} +[.######..] (0,1,2,5,6,8) (0,5,6) (1,3,4,7) (0,1,3,4,6) (0,4,8) (0,1,3,4,5,7,8) (1,4,5,6,7) (0,1,2,6) (0,2,3,4) {51,58,20,39,54,35,46,30,19} +[#..##] (1,2,4) (1,2) (0,1,2,3) {10,34,34,10,12} +[#.##] (0,2,3) (1,2,3) {13,8,21,21} +[######.#] (1,2,3,4,5,7) (0,3,4,5,6) (0,1,4,7) (2,5,7) (3,5,6,7) (0,5) (0,1,3,5,6,7) {28,17,19,33,26,47,28,36} +[.#.##.#.#] (0,3,4,5) (2,3,6,7,8) (0,2,3,4,5,7,8) (3,4,6) (0,1,3,4,5,6,7,8) (0,2,3,4,5,6,8) (1,3,6,8) {26,31,23,71,41,26,64,26,54} +[.#..#.#] (0,1,3,5,6) (0,3,5,6) (4,6) (0,1,2,3,4,6) (1,2,5,6) (0,3,4,5) {225,21,10,225,30,221,223} +[.#...#] (0,3,4) (0,1,2,3,4) (0,1,2,3) (0,2,4) (2,3,4) (3,5) (0,2,3,5) (0,1) {97,55,66,91,45,29} +[#.......] (5,7) (2,4) (0,2,3,4,5,6) (0,1,2,3) (2,3,4,5,7) (0,1,2,3,5,6,7) (1,6) (0,1,2,4,6) {44,41,62,43,47,39,53,22} +[.##...##] (0,1,3,4,7) (1,2,3,5) (0,1,3,7) (0,1,2,3,4,6) (1,2,6,7) (1,4,5,6) (0,1,2,5,6,7) {46,73,32,52,37,23,34,40} +[...#.##] (1,2,4) (0,1,2,5) (0,3,4,6) (4,5) (0,1,4,6) {36,203,193,11,203,19,21} +[##..#.] (0,1,2,4,5) (0,2,5) (0,1,4,5) (1,3,4,5) (0,1,4) (0,2,3,4) {155,56,125,123,160,55} +[.###] (0,2,3) (2) (0,2) (0) (0,1) (1,2) {39,10,42,11} +[.#..##] (1,2) (0,2,3,5) (0,5) (0,2,4) (0,1,2,3) {150,121,144,121,10,32} +[.#..#] (1,3,4) (0,3,4) (1) (1,3) (0,2,4) (0,2,3) (1,2,3) {33,23,30,43,19} +[.##.##...] (1,2,3,4,5,7,8) (0,1,3,5,7) (6) (0,1,4,7,8) (0,1,5,6) (1,7) (3,4,5,6) (0,1,2,3,4,6,7) {40,67,18,34,38,26,19,65,24} +[..#.#.] (0,1,4,5) (3,4) (0,1,2,3,4) (2,3) {17,17,181,187,23,14} +[.##..] (1,3) (0,1,3) (0,2,3) (3,4) (2,4) {22,25,4,43,14} +[...#.#..##] (0,1,2,4,5,6,7,8) (0,2,4,6,7,8,9) (5,7) (1,5,6,7,8) (0,3,4,5,6,8,9) (0,3,5,6) (0,7,9) (0,1,2,3,4,5,6,9) (1) {203,54,35,160,164,186,190,53,159,168} +[..##] (0,2) (2,3) (0,3) (1,2,3) (0,1) {27,10,197,193} +[.##..##..#] (1,3,4,5,6) (0,6,9) (6) (0,1,3,5,6,8,9) (1,4,6,7) (0,1,2,3,4,6,8,9) (2,4) (1,5,8) (0,1,2,4,5,6,7,8) {57,78,43,37,62,63,90,24,59,39} +[##.#.##] (0,1,2,4,6) (0,1,2,3,4) (1,2,3,5,6) (0,1) (0,1,5,6) (2,5,6) (2,3,5) (0,1,5) {56,75,46,39,24,53,37} +[##.#....] (0,1,6) (1,2,4,5,6) (2,3,5,7) (0,3,4,5,6) (2,3,4,6) (0,1,3,4,6) (0,1,2,4,5,6) (0,3,5,7) (1,2,5) (0,1,2,3,5,6,7) {72,64,56,62,60,82,81,34} +[..#...] (1,2,5) (1,3,4,5) (2,3,4) (2,5) (0,3) (2,4,5) (1,4) (0,3,5) {2,43,27,28,62,43} +[.##...#.] (6) (0,7) (1,3,4,7) (4,6,7) (2,5) (0,1,2,4) (1,2) (3,4,5,6) {8,26,20,20,33,14,14,21} +[#.#..] (0,2) (0,1,2,4) (0,1,2,3) {18,18,18,15,3} +[..##.] (2,3,4) (0,2) (1,2) (0,3,4) (0,3) (0,2,3) {40,166,189,31,26} +[..##.#.#] (0,7) (1,3,4,5) (0,1,3,4,5,7) (0,1,2,3,4,5,6) (0,3,5,6,7) (1,2,3,4,5,7) (1,4,5) (0,2) {28,57,14,54,57,60,4,36} +[.#.#..] (2) (0,4,5) (0,1,2,3) (2,4,5) (3,4) {25,19,201,35,29,13} +[##.#] (0,2,3) (0,2) (2) (1,3) (2,3) {30,9,53,39} +[.##.##..] (0,1,3,5) (0,3,4,6) (0,1,3) (5,6,7) (0,1,3,4,7) (0,1,3,6,7) (2,3,4,5,7) (0,2,3,4,6,7) (0,2,5) (1,2,4,5,7) {233,54,194,237,219,50,212,221} +[#...] (0) (0,2) (2,3) (0,1) {39,4,34,18} +[#.#.#.#.] (3,4,5,6,7) (0,2,3,5,6,7) (0,1,3,4,5,6,7) (0,2,3,4,5) (0,1) (0,2,3,5,7) (0,1,2,3,5,6,7) (1,7) (1,4,6) {60,44,47,67,36,67,59,62} +[###....] (1,2,3,6) (4,6) (0,4,6) (4,5) (1,2,3) (0,4,5,6) (0,1,2,4,5) {10,28,28,23,32,22,29} +[#####.###] (0,2,5,7) (1,2,5,6,7,8) (1,2,3,4,5,7,8) (0,1,3,4,5,7,8) (0,1,3,4,6,7,8) (1,3,5,7) (0,1,2,4) (2) (0,1,4,8) (0,1,2,3,4,6,7,8) (0,2,5,8) {49,63,52,35,41,46,31,61,49} +[.#.#] (1,3) (0,3) (0,1,2) (1,2) {117,130,112,23} +[...##...] (3,4,5,6,7) (0,5) (1,2,3,5,7) (0,1,2,3,7) (1,3,6) (0,3,5) (0,1,2,3,5,6) {38,218,23,231,2,55,203,19} +[....#...] (0,2,3,4,5,7) (0,1,2,3,4,7) (0,3,7) (2,5) (0,2,3,5,6) (1,3,4,5,6,7) (3,4,5,6) (2,4,7) (4,5) {22,19,18,53,42,50,36,41} +[.#####..] (1,2,3,6,7) (0,3,5,6) (0,1,2,4,5,7) (1,2,3,4,5,7) (5,6) (4,7) {30,33,33,27,44,46,27,51} +[.....##.#] (0,2,3,6,7,8) (1,3,5,6,7) (0,1,2,5,6,7) (0,1,2,3,4,5,6,7) (1,2,3,5,6,8) (0,3,4,5,6) (0,7) (0,1,2,4,5,7,8) (0,2,3,6,8) (5,6,8) {76,34,57,49,41,53,56,53,49} +[#.###] (0,2,4) (1,2,4) (1,2,3,4) (0,3) {200,16,24,195,24} +[##...#.] (0,2,3,4,6) (0,4,5,6) (0,1,4,5,6) (2,3) (1,2,3,4,5,6) {10,17,35,35,27,26,27} +[#.##.#] (1,3) (0,1,4,5) (0,2,3,5) (1,5) (0,2,5) (5) (1,2,3) (1,2,4,5) {38,59,53,51,25,67} +[###.##] (1,4) (0,2,3,4,5) (1,3) (0,3) (0,2) {211,12,195,202,194,184} +[##...####] (1,7) (2,5,7,8) (5,6,7) (0,2,3,4,5,6,8) (0,1,2,3,4,5,7) (0,1,3,7) (0,1,4,5,6,8) (0,2,6) (0,1,2,5,8) {43,39,44,20,27,49,20,34,28} +[...#.#.#.#] (1,4,5,8,9) (0,1,3,5,7) (0,1,2,3,4,5,6) (0,1,2,4,5,7,8,9) (4,6,7) (0,2) (1,3,4,5,6,8) (0,1,2,3,4,5) (1,2,4,6,8,9) (6,9) (0,2,3,5,6,7,8,9) (1,7) {62,83,81,43,70,61,53,51,56,53} +[##....#..] (0,1,2,3,4,5,6,8) (0,1,6) (0,2,3,5,6,7) (1,2) (1,2,3,6,7) (0,1,2,3,5,7) (2,3,4,5) {37,56,85,68,21,51,39,47,1} +[..#..#] (0,3,4,5) (2,5) (1,2,5) (1,2,3) {19,18,37,29,19,46} +[#..######.] (0,3,8) (0,1,2) (2,3,5,6,8,9) (1,7,9) (0,5,8) (0,4,9) (0,1,4,6,8) (6,7,8) (1,2,5,9) (3,4,5,8,9) (0,3,6,7,8,9) (3) {40,42,36,48,28,57,41,21,74,50} +[.#....] (0,2,3,5) (2,4) (1,2,3,4) (4) (0,2,3,4,5) (1,3,4,5) (2,3,4,5) {11,24,47,55,62,43} +[.##..##] (0,3,6) (2,4,5,6) (0,1,2,3,4,6) (1,4,5) (0,2,3,6) (3,4) {176,6,172,191,26,11,181} +[#.#..####] (0,1,2,3,4,5,6,8) (0,1,2,3,5,6,8) (0,4,5,6,7) (0,2,3,4,6) (0,3,5,6) (6,7) (0,2,5,6,7,8) (2,3,4,5,6,8) {76,23,51,67,54,66,94,27,34} +[.##.##.] (1,2,3,6) (1,3,4,5,6) (1,2,4,5) (3) (0,5) (0,2) (0,3,4) (0,2,5) (4) {148,43,62,51,27,153,36} +[#.##] (0,1,3) (1,2) (0,3) {175,36,20,175} +[.###.#] (1,2,4,5) (4,5) (1,3) (0,1,4) (0,1,4,5) (0,4) {10,43,13,20,25,24} +[..###.#] (1,2,4,5,6) (2,5) (1,2) (0,1,4) (3,4,5,6) (0,3,4,5) (0,2,4) (3) (6) {132,36,164,38,167,61,50} +[#.#....#] (3,5) (0,1,2,3,4,5) (0,1,3,4,5,6) (0,2,3,4,7) (1,2,3,5,7) (2,6) (0,1,3,4,6,7) (6,7) (1,6,7) (2,3,4,7) {37,66,49,72,47,43,45,64} +[.#...] (0,1,2,3) (1,2) (0,2,3,4) (0,1,3) {133,15,146,133,132} +[..#..#....] (0,1,2,5,8,9) (1,4,5,6,7) (0,2,3,4,5,6,8,9) (0,1,3,5,6,8) (2,3,5) (0,1,3,4,5,7,8,9) (0,1,2,3,4,8) (0,1,2,4,7,9) (0,1,3,4,5,6,8,9) (0,1,5,7,8) (0,3,4,9) (1,6) (4,5,6,7) {86,99,36,84,72,95,65,44,71,58} +[.##...#.#] (1,2,3,4,5,6,7) (5,8) (0,4,5,8) (0,4) (2,5,6,7) (2,7) (2,8) (0,1,4,6,8) (0,1,3,7) (2,5,6,7,8) {68,38,28,22,50,48,31,39,60} +[#.#####] (2,3,4,6) (2,5) (1,3,4,5,6) (1,2,5,6) (0,5,6) (0,1,2,3,4,6) (1,2,3,5,6) (1,3,4,6) (0,2,3,4,5,6) {23,42,62,53,35,62,74} +[..##..] (0,2,5) (2,3) (1,2) (0,4) (2,4,5) (0,3) {42,5,188,178,19,21} +[#.#...##.] (0,1,2,3,5,6,7,8) (1,2,5,7,8) (0,1,2,4,5,6,7) (1,2,4,6) (1,2,7) (2,7,8) (0,1,5,7) (2,6,8) (4,6) (0,1,3,7,8) (0,2,6,8) {61,81,97,16,45,42,77,83,63} +[##.##...#.] (0,2,3,4,7,8,9) (5,8) (1,2,5,7) (1,3,8) (0,1,2,3,4,5,7,8,9) (0,3,4,5,6,7,8,9) (4,5,6,8,9) (3,5,6,7) (1,9) (0,4) (1,3,4,6,7,9) (3,5,6,8,9) (1,2,3,5,8,9) {7,58,28,50,18,50,29,49,34,34} +[####..#.] (0,1,3,4,5) (1,2,3,4,7) (1,2,3,5) (1,2,3,4,5) (0,2,3,4,5,6,7) (1,4,5,7) {17,45,35,46,50,42,6,20} +[.#.#.#.] (2,3,4,5) (0,4) (1,2,4,6) (0,1,2,3,6) (1,2,3,4,6) (0,4,6) {12,37,53,36,59,16,38} +[##...#####] (0,1,5,6) (1,4,5,6,7,8,9) (0,1,2,3,4,5,6,7) (0,3,6,8,9) (0,4,5,6,7,8,9) (1,3,4,6,7,8,9) (2,3,4,8,9) (3) (0,1,2,4,5,7,8,9) (0,1,2,3,4,5,6,9) (0,2,5,6,7,9) (2,3,4,5,7) {66,88,60,76,107,91,85,93,89,90} +[##..] (0,3) (0) (1) (2) (1,2) {7,5,16,3} +[#.##] (0,1) (0,3) (2) {28,15,3,13} +[##..] (1,2,3) (2,3) (3) (0,2) (0,1) (1) {15,185,20,23} +[##.#] (0,1,3) (0,2,3) {151,140,11,151} +[#.#.] (1,2,3) (0,2) {4,20,24,20} +[#.##..#] (1,2,4,5) (2,5,6) (3,6) (0,1,3,4) (0,1,2,5,6) (0,1,5,6) {26,34,199,19,14,204,209} +[#..#] (1,2) (0,3) (1) {11,16,1,11} +[...#...#..] (3,7) (0,1,4,8) (0,2,3,4,6,8) (0,1,2,3,4,6,7,9) (0,4,5,6) (0,1,2,3,6,7,8,9) (1,2,3,6,7,9) (1,5,6,8,9) {54,43,48,56,42,7,55,43,33,36} +[..#..###..] (0,1,2,3,6,9) (1,2,3,4,6,7,8) (0,2,4,8) (0,2,4,5,6,8,9) (0,3,4,6) (0,2,3,4,5,6,8,9) (0,1,5,7,8) (2,3,7,8,9) {71,32,75,68,71,42,74,32,73,53} +[#.###] (0,2,3,4) (0,2,4) (0,1,2,3) (1,3) {51,24,51,41,32} +[#.#..#.##] (2,3,6) (3,4,5,6,7,8) (0,1,2,3,4,6,8) (0,1,2,3,4,5,6,8) (1,3) (1,4,5,6,8) (6,8) (0,1,3,4,6,7) (1,2,3,4,8) (4,6) {44,211,64,232,70,14,80,19,53} +[.###.] (3) (1,4) (2,3) (0,2,3,4) (1,2,4) (0,2) (2,4) {19,122,57,47,151} +[##.#.] (0,2,3) (0,2,3,4) (1,2,4) (0,1,4) (0) (3,4) {36,19,26,33,36} +[#..#.#..] (0,1,5,6) (3,6) (0,1) (0,1,3,4,5,6) (6,7) (5,6,7) (2,5,6) (2,3,4) (0,3,5,6) {48,47,29,225,34,64,274,34} +[#.....] (0,2,3,5) (0) (0,1,2,3) (3,4) (0,1,4) (0,1,2,3,5) (1,2,3,4) (3,5) {29,20,24,41,20,23} +[####] (3) (2) (1,2,3) (0,2) (0) (1,2) {21,31,39,14} +[.#####..#] (1,4) (2,7,8) (2,4,5,6,8) (0,1,2,3,4,5,8) (0,5,6) (1,6) (2,4,5,7,8) (0,2,3,4,5) (3) {33,36,49,19,49,57,47,11,48} +[.#...#.] (2,4,6) (3,4,6) (0,1) (1,4) (0,2) (0,1,3,4,6) (0,5,6) {8,14,9,24,40,1,32} +[###.##.###] (2,8) (0,1,2,3,5,6,7,8,9) (0,2,4,5,7,8) (4,8,9) (0,1,4,5,6,7,8,9) (0,2,9) (0,1,2,3,4,5,8,9) (0,1,3,5,6,7,8,9) (0,1,3,5,8,9) (0,2,3,7) (0,1,2,3,5,6,7,8) {115,77,80,81,36,90,53,80,104,77} +[#.###] (1,3) (0,3,4) (0,1,2,3) (0,2,4) (0,2,3,4) (1) (0,3) {50,22,31,56,44} +[.#.#] (1,2) (0,2,3) (2,3) {13,8,194,186} +[.#.#......] (8) (0,4,8,9) (0,2,4,8,9) (1,2,4) (0,1,2,6,8) (5,8) (2,3,5,6,7,8,9) (0,2,3,4,5,6,7,8,9) (2,3,5,7,9) (2,4,6,8,9) (0,1) (4,6,7) {81,45,76,21,77,35,44,26,99,60} +[.#..##] (3,5) (1,2,3,4) (0,1,2) (0,1,3,4,5) (1,2) (1,2,3,4,5) (0,2,3) {35,59,60,62,44,24} +[###..#] (1,2,5) (3,5) (0,3,4) (0,1,2,5) {174,165,165,32,15,182} +[.#.#] (1,2) (1,3) (0,1) (0,1,3) (0,3) {38,69,19,39} +[..#..#] (1,2,3,4,5) (4) (0,2,4) (2,5) (0,2,3,4) (0,1,3,4) {27,2,29,17,38,4} +[###.#.##.#] (1,6,8,9) (1,4,5,9) (1,2,3,5,6,8,9) (0,1,2,4,5,6) (0,1,3,4,5,6,7,8) (0,4) (0,2,3,4,5,7,8,9) (0,2,3,5,6,9) (0,2,3) (2,3,4,9) {61,69,176,183,198,81,62,23,46,185} +[...##.#..#] (2,4,5,8,9) (0,2,3,4,5,6,7,8,9) (2,4,8) (7,8) (3,5,8) (0,4,6,8,9) (4,5,6,7,9) (1,2,3,4,5) (0,1,2,5,6,7,8,9) {32,10,38,29,53,38,35,19,71,35} +[...##..] (0,2,4,5,6) (2,3,4,5,6) (1,2,3,4,6) (1,3,4,5,6) (0,1,2,3,6) {111,26,127,35,142,135,144} +[...###.###] (0,1,2,3,6,7,8,9) (0,1,4,5,6,8) (1,2,3) (0,2,6,7) (1,4) (3,6) (1,2,3,6,7) (2,4) (4,5,6,8) (1,2,3,6,7,8,9) (0,2,3,4,6,7,9) {8,65,45,203,30,7,197,31,17,12} +[...#.##] (3,6) (0,1,3,4) (0,2,3,4,5,6) (0,1,4,5) (3,5,6) (0,1,2) (0,1,2,4) {68,56,34,48,49,36,30} +[.#.#..#] (1,4) (2,3,4) (5,6) (1,2,3,5) (0,1,2,3,4,6) (3,4,5) (3,5) (0,2,5,6) {13,25,49,39,23,41,23} +[.#..] (0,1,2) (2,3) (0,2) (0,2,3) {46,7,57,30} +[#####.#.] (0,3,4,5,7) (0,1,6) (0,1,3,5,6,7) (2,3,5) (2,3,4) (1,4,5,6,7) {36,28,24,40,33,30,28,21} +[...#.##.#] (0,2,7,8) (1,4,6) (0,1,2,3,4,5,6) (7,8) (1,2,4) (0,6,7,8) (0,1,2,3,5,6,7) (3,7,8) (1,2,3,4,5,6,7) {44,70,68,55,64,38,64,75,51} +[..#.#] (4) (0,3,4) (0,2,3,4) (0,1,2) (3) (1,2,3) (2,3,4) {24,17,48,51,53} +[####....#.] (6,7) (0,2,3,4,5,6) (0,1,4,5,6,7,8) (1,9) (1,4,7,8) (1,6,8) (1,6) (2,3,4,7) (3,5,8) (0,8,9) (1,2,3,4,6,7,8,9) (4,7,8) (2,5,9) {35,53,31,28,29,41,61,24,48,42} +[.##.#.###] (0,2,3,4) (3,4,6) (0,3,8) (0,1,5,6,7,8) (2,3) (0,1,2,4) (0,1,3,5,6,8) (0,2,4,5,6,8) (0,4,5,8) (1,3,4,5,8) {39,3,17,32,48,27,33,0,38} diff --git a/src/main/resources/eu/sim642/adventofcode2025/day11.txt b/src/main/resources/eu/sim642/adventofcode2025/day11.txt new file mode 100644 index 00000000..29b9e1d2 --- /dev/null +++ b/src/main/resources/eu/sim642/adventofcode2025/day11.txt @@ -0,0 +1,631 @@ +yoy: dtu sgc qjc viq +vyp: tcu wrp +xof: jlp puv cth jwv +bvz: pis +mec: nem rak +bxi: ykt rie +ztr: xhp gms +mbs: isu bez pna +yzt: fqw ubj rhi +ctd: fri lpm run +bkj: hqz kag chj mop ysj +cml: wsd qdv wjf moy +jjv: pgt rua you +hwk: uvn +xvk: tre +jjf: kag hqz chj mop ysj +goe: kas +xuc: zdt +fqw: qrh lyw umm bjp +run: hjt heb jyg +yuu: vqz jih +jya: uuv kgc ero onh +bid: rcu aap zag +sll: evf uuv ero +fri: hjt +jzu: wyu wrp tcu +lsv: amz bzc els +nkk: upz nos +zvf: phf cpk sez edr +lcc: isj pgs +kmm: ave zou plb +cpk: eud pix wqm +vow: mcl vfd +ofc: typ +gtb: nmi yfy syh +ejd: azc qqp uxi zej +jxr: zwh oec nwz vch +tgx: wrp tcu +pmo: els bzc amz +hyd: wvv xeq +xcr: rvg dpn +wrp: weh yzt foo dcq uob +lbj: wyu ygr tcu +egw: cga +xnf: xeq bar kmm wvv dea +moy: pxf fvd +nsu: lcc kpp ftz +dcq: rcs vtd fal +uyh: out +opo: isi +cyu: cav zzc cao anq eze wlg jcn xpr gof syk dko cml cfq fmg xdi ytv egw vwg bsm cdi fki bmv fuf nlr clr +tom: yec uxi zej +vxo: ykk auv lry kmd +fjd: vxo obq +xhb: xro qzn +djq: ysj kag hqz chj +pve: out +zvx: byt fjg +heb: djq +ejy: pis urk cfx opo rdh +rib: mtt fjo tas pqh +tgh: mdu cbx hfh +cjv: iow vre +fmg: bey +mlf: kis +sgc: rib +awe: afr +edr: jzd wqm nrn +bqo: cpc ico twl +rld: jir +ave: cpc ico +tzw: hmh +sqt: cxy wrp wyu +wub: oec +qtm: ihy uwg oyu +hsp: cxy +obr: dst nre fft +inc: tve +amz: out +uwr: edu oun pjg +htk: ysj chj +zwe: tgx ccu jzx vyp +agc: npi hwk gnl +uvz: xdr mbs +yfy: ylw zyq lcx +zou: ico +nos: upw oim +syk: zvf att ckc +xow: uyh yel +uce: cxy ygr wrp +cbx: esf afr pgx +vam: vsa wnl +gmj: xex fdp ghk +lgs: tcu cxy wyu +gxv: ggt axc +hnh: esf afr +lgj: you +nma: oqs yel uyh +jcn: bey yht qtm +kwd: els bzc +fjo: kqy qdy mwi +cga: zpi eyb hnh +quf: bar dea +coh: wcq feg rak +fbh: rmn fvk xyx dxv +pgs: zag rcu +flr: wil +dpn: ysj +nri: lnk +vsl: pgt you +mqp: lnk gsk vvf +rie: yhv +yzn: ccu jzx tgx +jsm: nwz vch +and: cjv wil +ihz: vrb xuc ael nkk +zej: feg rak nem uso +hfh: afr +ckx: pdl +kjz: out +qdp: xdr zka mbs +ihy: ogt tgh +usc: jwf npx vee yhe +zpc: afr esf +gtm: qrh lyw wzo umm bjp +cwp: qii paz lkx +qsp: vyw dve nvi tud +itw: cxy tcu +dkm: out +vbr: evf uuv kgc +qzn: out +kna: tgx jzx +rgi: jlp vrw cth +nrn: zpc +xpr: ovd kar +plf: mop chj kag +kgc: uce hsp +olx: jjf gyn +van: rgi xof psj +tlv: lou kas gri kwn +wjg: rua pgt +azc: wcq +qme: you +yma: hzs vjr +zuw: out +wjh: afr +cjh: lou kwn kas +wxs: kmd ykk lry +syh: ylw +mlk: pgx +rhf: fal +thd: chj hqz mop +iow: kag chj mop ysj +sro: hxf inc lvz +ckc: edr +yel: out +dmx: run fri crk +zew: you rua pgt +jrv: feg wcq nem +vle: kag ysj mop +ptd: hbp +xex: qfi +ioj: pgt you +zfq: sof rld +lyw: uso rak nem feg +fpp: xof psj +eex: cxy tcu wrp ygr wyu +rip: rld hih pcq rmv +ren: out +fhk: yoy fvk rmn +wcq: sjo rwb hjo rvu miq mlf cqk hdl flr ykr xpc and fgm +pfs: plf rvg +vfd: afr pgx +byt: rho +pts: out +rto: wjg kjt vsl ioj gjs +tre: you rua +rho: qme feo +gre: jzx +wsw: wrp wyu cxy +qpg: usc +pjj: cvk +dve: ynq qwc +anq: rqt crs +pxf: pgx +ldp: ogt +hzs: kag chj mop +mnj: irl tfm +ygr: hln rfw rhf guu nfp weh iwg vfy dkg uob ooh yzt aas bxi dcq sro rsa dio zhl fjd +miq: vyw tud +kas: xev +elv: nem feg wcq +asn: oid rho igi +ykt: yhv ejd rjm +qcv: plf +viy: nem rak wcq feg +zny: hwd wsw +xev: pgt you +ovd: zpi klm eyb hnh +ygy: feg +bix: zvi sfd jrg +xod: rip eda nob +ikg: hmh +uzc: pgx +fpf: feg +ytv: hem axc ckx +fft: sqt akb +ksj: vle +gms: yfy nmi +nob: pcq hih +vch: awe orp uzc +zag: gcc gob yfg +sbe: oim xhb upw +lqu: kwn ile kas +svr: vpo cyu hfy csx +mja: ucz ren +vvf: rcq alw zny cit +chi: rak nem uso feg +sle: dbw +pqh: xrz kqy +fna: tjd +eze: kar ovd cga +bbh: evf onh uuv +bjp: feg wcq uso rak +lcp: edf foa +wjf: pxf +ooh: hxf xey lvz +eda: sof rld rmv +pnn: pgt +isi: ghq rmb bes bco +hjt: vle +ucz: out +urk: isi jju +pjd: hcq bfj wmj +gxj: crk +igi: rsh feo lgj +puv: zwe kna yzn fck gre +zcc: prr sfd +pjg: kwd pmo ltz +xsy: mja tfm irl +oqs: out +nkn: dst nre +vpg: pix +lcx: nma xow ptd +cfx: isi jju aiv +fvd: pgx afr +qin: mja +rxm: lcc kpp ftz +vrb: nos miw upz sbe +xhp: nmi syh +lou: jjv +skj: xex fdp uwr +irl: cop urg +tgv: ysj mop chj hqz +yef: lpm crk fri +bmv: ubd wsd wjf +dko: rqt +hem: wub uws +vpo: nlr clr fmg cfq jcn cdi gof fki fuf cao anq xdi egw ytv vwg bsm cav zzc +hxf: lkf tzw ikg +jir: chj kag +dzm: kpr usc +kag: lqu kia gjg cjh qpg oco tlv flp goe upr nsu yah +cop: out +qmi: tcu ygr wyu +wil: vre iow jjf gyn +ero: zpz qmi hsp uce +nxp: nkk ael xuc vrb +feo: pgt rua +qdy: out +iiz: uso +kpp: pgs bid ofc dac isj +bco: dkm +hmh: feg nem uso +wzo: feg wcq +rcq: hwd +upw: lav pro gbk xro +rmv: jir bkj +zhl: xey lvz hxf +zvi: bbh ebn vbr sll +ysj: sfl yah tig nsu wfi flp goe gdj cck cgn tlv kia upr rxm oco ccr qpg lqu cjh +wvv: bqo ave +cck: kpp ftz +yht: ihy uwg ldp oyu +uob: hxf inc lvz xey +gdj: okn +rjm: zej qqp yec +lqn: ysj +rrm: qii +tfm: urg ucz ren cop +jlp: kna zwe +xxa: esf +jju: ghq bes oev +ikc: xyx rmn +ogt: xmm hfh +gwl: gmj wwm skj +kia: byt fjg +hjo: yef ctd dmx +vtd: jrv mec qxg chi ygy +wyu: hln ooh rhf pjd rsa iwg sro zhl fjd +viq: zdz srl +xdi: lcp crs +vre: chj +npx: gjs vsl +hbq: jxr wub uws pdl +vyw: ynq qwc nff ujo +psm: vvf gsk +csx: egw zzc vwg cml nlr clr cfq gxv fmg xpr jcn fuf syk bmv +pis: isi jju +upr: gbi +qrh: wcq feg nem uso +ico: itw eex jzu vsh +mcl: afr pgx +inm: eps tre zew +cxy: dio rsa sro yzt ooh dcq bxi aas iwg weh uob dkg vfy hln rfw rhf foo +xro: out +evf: zpz qmi hsp +aaa: dbw nxp +pna: lkx paz +pbb: mcl wjh fwp vfd +eij: wrp ygr tcu cxy +wdl: wil cjv +clr: ggt +cdi: ckc zvf +yjj: jih +vrw: fck yzn zwe kna +hqt: pgt you +eps: you rua pgt +oec: orp +vqz: wcq feg rak nem uso +you: uyu fbh cll ztr ikc fna fhk tee squ sqf hnr +zyq: loy nma xow +rak: cbr hdl miq mlf hjo xpc ykr yur rvu flr qsp +rcu: bjw gcc +zka: cwp bez rrm isu +ibw: ysj +rvu: mbs xdr +dea: bqp bqo zou plb +hfy: cfq fmg clr cml bmv cdi gof xpr eze cao vwg zzc egw ytv +zoj: xsy +nfp: irw ykt +ykk: elv iiz cim +qex: vsa nkn obr +eru: mop kag hqz +rua: hnr sle sqf squ atn fhk aaa zpd ikc kiy sgl eca fbh cne ivi cll uyu agc +uso: hjo rwb qdp qsp pih lzq and fgm mlf +wnl: dst nre fft +cqk: yef gxj dmx +yzh: urk opo +pgx: dpa van zcc quf vam goo vxk pjj fpp +vfy: ubj fqw +jzd: chk zpc +wlg: moy wjf ubd wsd +sgl: xhp +rfw: bfj wmj +fck: vyp tgx +nlr: lcp crs +mdu: pgx +plb: twl ico cpc +goo: psj rgi +wfi: okn +upq: skj +upz: upw +gcc: pgt +kar: zpi eyb klm +cao: qtm +crs: foa edf pbb vow +nvi: kib nff qwc ujo +ubj: bjp wzo lyw +isu: lkx +lnk: rcq zny cit +hnr: xhp gtb +atw: cwp bez rrm pna +uws: zwh ewg oec nwz +mga: coh rth +tcu: guu nfp rhf uob zhl bxi fjd +ynq: sap pfs qcv +kpr: rto npx jwf yhe vee +hcq: vqz fmn +kpi: rip +yhv: uxi zej +gjg: byt +fal: jrv qxg chi mec +chk: esf afr pgx +tjd: zoj uhp +sul: pnn rsh +ylw: fhg ptd nma +bqp: twl +rmn: viq +gkv: ygr +hqz: kia gjg oco dzm ccr rxm sfl yah +vwg: bey yht qtm +bfj: fmn vqz +cne: xyx yoy +axc: pdl uws jsm +eyb: esf afr +fhg: yel +jbw: qqp yec +uxi: feg uso nem rak +tee: yzh ejy +nff: xcr +edu: ltz kwd +sfd: vbr +hwd: cxy tcu wrp ygr +yhe: kjt +kwn: xev hqt +qfi: lsv +fjg: oid +mop: tlv qpg cck cjh kia zvx tig rxm +ftz: bid pgs isj +klm: afr +irw: tom jbw +vsh: wrp cxy tcu +sqf: skj wwm gmj +cth: yzn fck gre +esf: dpa hyd zcc ozc amq goo nri pjj xnf vxk +bzv: pgx esf +nem: wdl mlf cbr uvz pih bsg rwb xpc ykr +qwc: xcr nit qcv pfs +zdt: upw oim +hbp: out +jyg: htk djq vle +bes: pve +pgt: tee atn gwl zpd ark fna uyu kiy ikc upq ztr +clb: pgx esf +bzc: out +uvn: ycj qin +ycj: mja tfm +bez: paz yma +xdr: isu pna rrm +uuv: hsp qmi +xmm: afr +cpc: gkv jzu vsh eex itw +dxv: dtu sgc +squ: gms xhp +zzc: att ckc +dio: vtd rcs +fki: moy qdv wjf ubd wsd +zpd: bvz +nre: eij +flp: fjg asn +aap: yfg +cbr: olx +rwb: dmx yef +yah: elo +fmn: wcq feg +elo: isj dac ofc bid pgs +guu: rcs fal vtd +edf: mlk +oco: xvk lib +cit: lbj lgs +crk: jyg eec +kjt: you pgt +qys: mnj +obq: auv +pix: bzv +sap: plf dpn rvg thd +cav: kar ovd +ryc: clb mdu xmm hfh +cgn: kwo inm lib +vjr: chj hqz kag mop +npi: qys uvn +isj: rcu aap zag +sez: eud jzd wqm +dst: sqt +hih: ibw +iwg: gtm fqw rhi +kqy: out +lry: elv viy iiz cim +eec: htk +gob: pgt rua +lib: zew eps tre +lkx: vjr lqn +ile: jjv +rmb: kjz pts +fgm: zka mbs +eud: bzv zpc +zwh: uzc +kmd: cim elv iiz viy +kiy: yzh bvz +fuf: att frp +uwg: ogt ryc +dee: esf afr +mtt: xrz kqy +onh: hsp qmi zpz +gbi: igi sul oid +dtu: srl +oun: lsv pmo +ghk: edu oun +gyn: mop hqz kag chj +ark: hwk gnl +kwo: tre +cim: uso rak feg wcq +tig: usc kpr okn +uyu: npi hwk tjd gnl +nnp: psj rgi xof +oim: pro gbk lav +rhi: lyw qrh umm +srl: tas fjo mtt pqh +zpi: pgx +twl: gkv vsh eex itw +xpc: tud +bjw: you pgt +nmi: lcx +att: vpg cpk phf +yec: feg wcq uso rak +psj: cth +rqt: edf +xrz: out +cvk: jya +pwl: mwi +pih: nvi dve vyw +cll: ejy yzh +tve: hmh coh rth +rsh: pgt you +xeq: ave bqo +qjc: srl rib +tud: ujo kib nff +eca: ihz +jrg: bbh +pdl: zwh ewg +sjo: zka atw +vee: kjt wjg ioj vsl gjs +lpm: ksj hjt eec heb +dpa: jrg +okn: vee yhe jwf +aas: fal rcs +sof: eru +lzq: xod +rdh: aiv +bsm: yht +nyq: hwd wsw lgs +wqm: chk zpc bzv +frp: sez cpk edr phf +prr: ebn bbh sll vbr +nwz: wlw +amq: nkn obr +ujo: sap qcv nit xcr +dac: aap typ zag +lav: out +ebn: onh ero kgc evf +atn: gms xhp +hdl: tud nvi dve vyw +jwv: gre +edl: kis xod zhz kpi +jzx: cxy tcu wrp ygr wyu +oev: zuw +ael: sbe upz nos miw +loy: hbp yel oqs uyh +qxg: wcq +nit: thd +ltz: amz els +gbk: out +cfq: ovd cga +fdp: pjg +ozc: jrg sfd cvk +gjs: pgt you +bey: uwg ldp oyu ihy +els: out +gof: hbq ckx axc ggt +qii: lqn hzs vjr tgv +weh: hcq yuu yjj bfj +qdv: fvd pxf xxa +aiv: rmb oev bes +chj: tlv cgn cck gdj gjg kia yah wfi tig nsu sfl goe flp ccr qpg dzm oco cjh lqu zvx upr rxm +gsk: zny nyq +rsa: lvz +ggt: jxr jsm +ubd: pxf fvd +vsa: fft +fvk: qjc +mwi: out +oid: rsh lgj feo +vxk: xof +wwm: fdp uwr +miw: oim xhb +foa: fwp wjh mcl +orp: esf afr pgx +zpz: ygr wrp cxy +dkg: rie +pll: zew +uhp: qin ycj mnj +kgp: ykk auv lry +fwp: esf pgx afr +jwf: vsl +tas: qdy kqy +sfl: kwo pll +zdz: pwl tas mtt +wsd: xxa pxf fvd +urg: out +wlw: pgx afr +lkf: coh hmh +kib: nit pfs sap +rth: uso feg wcq +rcs: jrv qxg chi mec +paz: tgv lqn hzs +feg: hdl mlf cqk wdl rvu hjo qdp rwb sjo and fgm cbr lzq ykr xpc edl flr uvz +hln: kgp vxo wxs +bar: plb +afr: dpa nnp mqp quf vxk pjj psm vam hyd bix zcc qex xnf nri +ivi: wwm +pro: out +alw: lgs hwd lbj wsw +dbw: nkk ael xuc +pcq: ibw eru jir +yur: cjv wil +gnl: zoj uvn uhp +qqp: feg wcq rak nem +akb: ygr wyu cxy +umm: feg +lvz: ikg tzw lkf +zhz: rip zfq +rvg: hqz kag ysj mop +yfg: pgt rua you +ghq: pts zuw dkm pve +ccr: lou kwn gri kas +xey: mga lkf tve +xyx: qjc dtu +kis: eda +bsg: zhz +wmj: jih +ccu: tcu wyu +oyu: tgh ryc +foo: wxs +ewg: dee uzc wlw +gri: jjv hqt +phf: eud nrn wqm pix +jih: uso nem +typ: gob yfg +ykr: dmx ctd gxj +auv: cim fpf elv viy diff --git a/src/main/resources/eu/sim642/adventofcode2025/day12.txt b/src/main/resources/eu/sim642/adventofcode2025/day12.txt new file mode 100644 index 00000000..6f6e73af --- /dev/null +++ b/src/main/resources/eu/sim642/adventofcode2025/day12.txt @@ -0,0 +1,1030 @@ +0: +##. +### +#.# + +1: +### +### +..# + +2: +### +..# +### + +3: +#.. +##. +### + +4: +#.# +### +#.# + +5: +#.. +##. +.## + +47x47: 38 32 39 37 41 38 +46x48: 40 41 40 35 38 46 +46x35: 37 40 37 44 48 43 +41x38: 27 27 17 29 28 28 +37x39: 39 39 36 37 35 36 +46x35: 26 28 27 21 31 31 +41x42: 28 22 31 42 30 28 +45x47: 40 43 26 41 35 40 +43x36: 39 42 35 40 37 48 +47x47: 37 40 30 45 39 33 +39x44: 33 52 57 45 37 39 +36x42: 42 35 41 47 36 31 +44x36: 32 45 45 28 44 51 +44x45: 43 30 37 32 33 34 +43x49: 52 56 51 39 63 64 +46x45: 50 39 29 37 34 35 +44x49: 66 57 45 48 60 55 +47x38: 35 47 43 57 48 47 +46x38: 28 37 28 28 33 25 +36x42: 39 46 35 37 41 33 +48x48: 39 47 50 32 52 36 +42x49: 55 58 45 55 52 52 +50x38: 50 47 44 51 50 52 +50x43: 32 37 37 34 41 43 +46x50: 37 36 40 49 43 35 +46x38: 49 47 44 47 36 47 +40x48: 38 33 41 32 31 32 +35x35: 16 13 27 20 20 24 +45x35: 38 49 37 41 36 42 +42x47: 44 44 27 24 40 30 +50x39: 49 55 47 48 54 46 +40x36: 20 26 28 29 28 25 +35x47: 33 35 31 19 30 16 +44x39: 46 50 51 32 44 38 +47x36: 38 49 45 31 45 54 +35x38: 28 35 34 40 36 32 +39x49: 52 45 58 46 46 46 +41x45: 38 34 30 33 34 26 +48x36: 54 51 41 34 40 45 +39x40: 33 34 42 46 41 47 +46x37: 53 32 32 45 47 57 +44x36: 30 35 30 25 16 32 +49x50: 71 71 64 47 62 59 +48x45: 40 34 43 41 43 39 +42x42: 38 46 56 44 43 44 +38x49: 44 43 47 56 52 45 +48x48: 55 60 54 55 69 62 +49x39: 25 26 39 38 37 43 +41x35: 28 20 25 24 24 21 +41x37: 40 39 36 39 42 37 +39x43: 52 47 47 35 36 39 +46x38: 39 47 44 46 45 50 +39x35: 32 34 33 38 41 32 +49x50: 79 59 71 54 57 53 +35x47: 27 20 25 31 31 30 +45x46: 50 53 59 56 48 53 +49x40: 31 38 35 38 36 29 +47x36: 24 25 41 31 25 34 +50x39: 57 59 43 39 53 47 +47x49: 34 46 36 44 36 43 +46x42: 34 32 42 37 39 25 +35x48: 35 42 48 41 51 41 +39x37: 29 29 23 32 20 22 +36x41: 50 30 42 29 33 44 +35x37: 36 31 37 41 21 35 +46x40: 45 49 45 54 43 49 +42x48: 61 39 53 51 53 54 +48x44: 39 41 46 33 28 36 +42x36: 48 34 38 44 38 29 +49x48: 60 59 64 66 56 57 +36x35: 32 33 31 34 35 28 +40x49: 43 52 46 58 58 44 +46x39: 30 36 42 28 25 34 +36x45: 30 49 45 43 40 43 +44x43: 40 48 64 55 38 47 +50x49: 66 69 67 43 67 62 +42x49: 39 35 42 35 33 40 +44x50: 33 43 37 35 35 41 +38x41: 54 40 33 36 38 38 +41x46: 39 30 31 35 27 33 +39x43: 48 40 49 40 42 37 +41x40: 26 19 28 37 28 30 +35x47: 36 26 26 29 16 31 +44x46: 50 46 50 55 59 52 +50x42: 42 41 26 38 32 45 +50x41: 55 48 57 56 51 48 +38x45: 38 43 42 53 44 45 +47x42: 55 49 42 51 51 58 +35x42: 35 39 37 38 39 39 +44x38: 49 46 43 31 41 47 +36x48: 24 30 29 38 39 31 +41x39: 39 42 42 49 30 47 +40x40: 33 32 24 27 24 29 +44x36: 25 34 32 21 24 32 +42x43: 27 49 28 31 30 31 +37x44: 39 33 47 33 42 61 +44x45: 50 49 48 51 56 51 +47x38: 32 33 29 27 24 35 +38x39: 34 45 39 36 26 52 +38x45: 31 25 23 33 38 29 +38x37: 19 26 30 28 18 23 +40x39: 35 41 40 47 37 42 +43x44: 39 32 30 34 24 36 +40x35: 29 24 23 25 20 22 +45x46: 60 45 62 55 57 35 +38x37: 30 25 32 21 21 14 +41x35: 24 22 25 29 26 17 +50x44: 31 31 41 47 32 41 +48x45: 34 33 33 45 50 45 +47x45: 36 40 35 49 37 28 +49x43: 59 58 63 50 40 54 +50x44: 46 56 49 66 64 60 +46x50: 68 61 50 63 51 63 +42x47: 59 48 59 44 42 51 +38x45: 44 45 48 37 51 35 +39x50: 55 53 48 47 56 37 +38x42: 27 31 26 35 23 26 +43x46: 53 53 48 44 52 55 +35x43: 28 27 27 20 20 31 +47x48: 60 62 56 50 54 67 +49x50: 60 62 62 58 66 71 +35x39: 35 35 34 27 44 34 +38x35: 19 25 15 23 24 25 +43x39: 47 52 36 49 35 39 +50x46: 31 46 44 43 37 38 +48x36: 46 45 37 52 43 44 +50x42: 34 34 39 39 30 48 +37x41: 24 31 24 22 30 25 +39x44: 29 30 30 28 36 28 +44x48: 29 41 44 21 41 48 +40x39: 30 46 37 52 39 37 +41x42: 42 55 33 51 37 50 +37x45: 51 48 34 46 32 47 +37x36: 21 26 22 30 19 25 +36x43: 25 29 28 22 31 32 +42x36: 35 19 37 33 23 20 +40x49: 48 65 52 48 42 45 +43x35: 26 16 29 21 35 26 +47x45: 35 28 39 36 50 36 +35x41: 42 32 34 32 34 50 +41x37: 39 41 39 43 41 28 +36x47: 30 35 30 29 20 35 +49x46: 67 62 52 46 54 67 +38x35: 27 24 20 15 18 27 +46x41: 31 19 44 39 29 33 +37x37: 37 32 38 34 39 29 +37x37: 35 34 40 34 34 33 +46x46: 38 47 39 34 36 31 +46x41: 23 31 29 43 31 37 +36x46: 37 49 50 30 40 49 +46x36: 34 31 34 33 24 23 +49x49: 63 62 57 56 61 73 +35x41: 22 17 27 23 29 25 +48x46: 46 37 36 41 38 41 +44x48: 61 48 48 59 63 44 +39x45: 40 34 47 47 52 53 +42x48: 48 49 50 46 64 53 +45x39: 29 31 32 40 35 28 +49x39: 41 53 45 46 52 60 +38x40: 37 36 37 43 37 47 +37x47: 37 43 50 45 43 52 +39x46: 41 46 31 54 46 65 +50x35: 25 35 22 27 32 34 +44x39: 40 42 51 43 45 43 +45x50: 24 39 44 45 48 40 +43x46: 24 39 38 31 38 40 +40x35: 30 17 22 30 24 20 +42x36: 24 23 28 25 44 24 +38x38: 43 27 40 36 42 33 +42x40: 48 40 47 35 43 45 +50x43: 47 50 53 66 60 57 +48x48: 50 60 55 65 65 61 +50x50: 57 59 70 59 73 67 +39x41: 32 30 34 27 21 25 +45x36: 33 29 23 32 32 31 +41x39: 29 29 25 26 33 26 +45x36: 43 38 30 50 48 42 +47x47: 37 43 38 33 44 30 +39x50: 33 32 40 32 43 28 +36x45: 33 48 47 41 38 43 +41x49: 35 39 36 32 32 33 +36x37: 38 35 37 34 33 26 +45x44: 61 45 48 46 52 53 +49x38: 25 29 30 45 32 30 +49x46: 58 67 51 61 57 52 +38x49: 44 49 49 51 49 44 +40x35: 37 41 29 42 28 41 +36x43: 34 32 21 35 23 23 +38x49: 31 37 36 30 28 30 +38x44: 33 45 42 37 54 47 +35x41: 24 21 16 31 22 29 +36x48: 28 25 25 37 40 37 +37x46: 28 24 27 27 26 47 +41x42: 37 37 51 50 47 44 +44x35: 27 52 35 47 39 38 +46x45: 53 33 35 31 39 33 +46x48: 69 43 69 60 46 52 +42x46: 40 38 41 31 26 33 +36x35: 38 28 33 29 43 19 +43x45: 34 35 38 36 39 28 +46x42: 47 52 49 47 51 52 +45x48: 28 56 43 34 35 44 +49x36: 38 34 30 31 25 33 +49x42: 59 59 52 43 54 47 +49x42: 50 47 52 67 52 50 +36x35: 35 27 30 35 36 31 +43x47: 34 37 36 35 30 38 +35x50: 51 42 45 46 37 50 +41x42: 28 27 29 33 37 27 +40x38: 38 47 33 43 34 40 +44x40: 43 42 51 47 41 48 +39x41: 28 34 25 30 27 25 +42x49: 33 33 43 38 33 43 +50x38: 26 39 35 24 32 36 +39x42: 48 44 39 38 45 36 +47x40: 48 49 50 47 50 44 +44x37: 27 27 31 26 26 30 +45x36: 29 27 23 33 33 35 +46x35: 41 47 37 37 45 40 +35x50: 28 25 31 29 33 30 +45x46: 36 40 37 34 42 36 +49x46: 40 45 56 36 26 36 +50x46: 52 62 53 64 55 73 +35x50: 59 47 34 38 45 46 +43x44: 34 27 36 29 32 38 +41x50: 44 59 54 58 47 55 +38x48: 45 44 46 52 50 44 +40x39: 44 38 33 36 41 51 +43x37: 40 36 36 51 41 43 +40x38: 53 38 30 34 46 30 +37x44: 37 43 44 47 38 43 +35x49: 37 22 25 33 35 24 +38x41: 43 45 47 42 34 25 +46x39: 45 49 49 36 49 47 +41x48: 39 46 26 30 33 33 +36x43: 37 44 35 44 40 39 +40x40: 25 34 29 32 30 19 +35x38: 27 20 21 18 14 32 +48x39: 32 34 37 43 34 27 +41x40: 28 32 35 28 29 17 +38x36: 43 30 36 27 37 37 +47x37: 38 47 43 43 43 57 +50x41: 62 44 49 59 52 50 +45x46: 53 48 67 50 45 56 +46x39: 29 35 26 36 43 25 +44x37: 42 47 43 48 37 32 +41x48: 60 55 40 50 47 51 +35x47: 34 35 50 45 45 46 +39x41: 47 32 40 46 46 34 +37x47: 22 20 38 33 28 39 +46x45: 62 59 55 46 49 44 +44x43: 54 36 48 55 51 48 +38x38: 43 37 43 33 39 23 +35x45: 42 42 36 32 50 39 +41x47: 54 54 52 45 45 45 +45x42: 47 53 57 41 41 52 +39x50: 34 22 40 42 29 40 +44x46: 51 56 61 33 59 48 +44x35: 30 28 27 23 23 22 +44x38: 43 45 51 42 34 42 +40x43: 24 37 26 35 27 32 +36x49: 33 38 35 32 26 27 +38x40: 35 44 34 41 43 37 +45x50: 55 59 63 49 57 64 +36x41: 34 21 27 23 24 27 +49x35: 33 21 18 44 28 31 +42x44: 46 34 31 20 28 36 +43x43: 52 44 54 50 46 36 +35x44: 42 43 43 38 36 33 +43x47: 68 47 43 52 50 51 +40x35: 24 22 34 16 21 26 +41x48: 51 65 49 49 40 48 +47x42: 53 39 61 54 50 46 +47x41: 43 26 28 30 33 34 +36x37: 36 35 29 41 29 37 +35x45: 23 29 22 26 35 29 +49x35: 49 37 45 48 46 38 +36x49: 29 30 32 36 29 36 +44x40: 40 45 51 44 46 45 +46x35: 32 26 20 33 24 30 +40x50: 56 56 47 57 51 38 +46x44: 47 25 31 36 34 36 +48x47: 61 53 63 50 62 57 +49x46: 39 43 33 50 34 41 +35x45: 29 25 27 31 27 26 +46x37: 29 32 27 39 25 28 +43x40: 46 49 46 36 44 42 +45x50: 49 39 38 29 38 46 +39x42: 38 49 47 37 33 50 +49x39: 39 31 33 38 31 35 +38x48: 42 35 49 49 52 57 +36x38: 42 26 33 30 46 32 +44x49: 60 45 50 56 63 59 +37x50: 45 47 55 46 48 42 +43x46: 43 47 53 59 53 51 +45x45: 43 39 40 35 32 36 +50x35: 38 36 25 25 26 26 +45x41: 42 55 41 48 54 43 +45x46: 32 44 41 39 34 35 +46x49: 46 42 39 37 46 30 +37x48: 50 39 41 43 53 48 +45x42: 52 45 53 54 44 42 +47x43: 54 61 50 50 44 52 +46x35: 32 21 28 21 30 33 +49x45: 47 52 63 73 48 60 +35x36: 23 22 20 20 28 18 +41x44: 38 37 52 61 51 39 +39x44: 38 47 41 35 46 61 +44x47: 39 33 35 40 29 34 +39x50: 21 39 40 27 37 43 +47x44: 45 58 60 61 44 51 +43x43: 47 35 50 66 35 57 +46x39: 32 34 33 33 26 37 +38x50: 41 27 31 32 32 28 +41x36: 21 25 32 23 24 31 +44x45: 37 33 25 44 38 33 +42x45: 40 23 29 44 32 41 +42x48: 44 55 53 43 66 47 +43x41: 43 54 49 44 37 44 +44x44: 38 46 48 66 52 51 +37x37: 25 24 27 17 21 29 +47x48: 37 43 42 39 43 35 +50x37: 40 44 55 57 49 39 +38x50: 57 51 35 44 51 56 +42x47: 34 38 35 27 38 37 +42x48: 36 37 27 47 38 38 +42x41: 42 33 50 41 54 45 +35x39: 30 38 40 24 41 36 +46x40: 30 42 24 24 39 36 +50x40: 58 47 55 38 55 54 +38x43: 41 52 41 39 35 44 +43x50: 37 42 35 40 32 38 +50x40: 40 29 34 25 39 40 +37x48: 29 30 38 32 29 33 +46x40: 35 45 28 26 30 31 +37x38: 31 31 39 42 42 31 +42x47: 30 40 29 33 38 40 +35x44: 28 18 27 26 19 35 +47x47: 55 58 48 50 60 73 +44x36: 23 19 29 30 36 30 +39x48: 37 34 34 33 33 37 +36x38: 32 27 39 40 39 34 +49x45: 53 64 56 51 55 61 +38x43: 22 32 29 29 25 30 +48x45: 38 35 28 43 44 52 +35x46: 28 25 27 23 34 28 +40x40: 30 31 33 21 36 17 +40x35: 20 22 29 27 22 23 +49x38: 47 52 47 51 43 47 +36x40: 29 24 24 23 32 23 +40x36: 25 27 30 24 25 24 +36x39: 47 33 33 38 29 37 +48x49: 41 45 43 40 40 47 +39x50: 35 35 41 33 26 37 +50x49: 74 54 64 73 53 60 +38x36: 27 22 29 15 24 26 +36x35: 38 40 31 30 25 29 +37x42: 37 31 28 19 21 32 +39x43: 44 44 35 49 47 39 +50x47: 42 51 48 39 26 33 +41x42: 36 45 42 51 44 50 +49x39: 41 29 29 36 45 27 +40x44: 48 47 47 40 39 51 +48x47: 55 42 52 68 66 69 +43x47: 37 33 35 30 35 39 +49x35: 45 63 42 38 34 40 +37x37: 28 25 25 21 22 23 +39x42: 34 24 33 30 33 28 +44x36: 42 39 38 37 50 36 +42x42: 40 57 45 37 43 50 +49x35: 41 51 49 40 38 45 +47x37: 33 20 34 32 32 29 +37x42: 23 32 27 28 28 29 +37x47: 55 40 41 43 45 43 +37x43: 47 42 32 40 48 34 +45x47: 53 49 54 62 56 52 +43x45: 46 42 55 51 48 59 +42x40: 43 28 50 31 54 54 +40x47: 27 30 32 29 36 40 +50x46: 34 33 34 55 39 44 +46x45: 63 57 47 47 50 54 +49x38: 55 42 46 56 36 55 +46x45: 31 40 27 42 42 43 +42x35: 31 35 41 36 38 48 +35x49: 50 46 36 40 49 42 +37x44: 41 35 48 43 40 45 +35x46: 40 48 37 42 43 37 +42x43: 33 36 31 34 20 41 +48x38: 35 28 30 31 40 28 +38x46: 41 35 45 46 46 61 +42x44: 28 35 42 28 32 30 +42x48: 37 42 38 47 36 23 +43x40: 35 28 25 30 37 26 +47x43: 51 48 55 57 46 56 +42x36: 31 30 22 30 30 25 +38x46: 34 41 30 28 24 23 +48x43: 59 49 57 51 52 48 +49x50: 67 67 65 63 55 59 +38x44: 41 40 40 59 44 33 +50x48: 47 37 35 46 50 41 +44x36: 36 30 23 23 26 29 +41x40: 47 46 45 29 43 40 +45x40: 48 50 42 46 40 53 +41x41: 46 55 42 31 45 36 +35x45: 26 25 29 36 18 31 +46x41: 45 50 61 37 44 53 +40x48: 35 62 50 57 40 54 +49x42: 53 55 51 57 52 48 +48x47: 62 49 67 46 66 55 +35x42: 48 34 44 29 33 37 +35x36: 17 19 19 27 23 26 +38x38: 27 30 17 26 23 21 +48x49: 40 41 49 43 34 48 +46x35: 46 30 44 45 41 43 +43x41: 32 34 25 33 27 30 +39x38: 37 26 21 28 19 24 +38x35: 14 30 22 19 18 28 +48x42: 40 37 34 41 34 37 +50x46: 51 62 54 67 61 61 +39x40: 29 43 36 44 48 41 +37x43: 31 29 30 31 17 30 +38x49: 51 47 43 45 53 47 +40x45: 47 39 45 49 48 51 +38x35: 21 19 29 27 15 20 +36x35: 20 20 19 30 21 22 +38x44: 46 46 33 37 46 51 +36x48: 35 40 51 48 53 38 +47x45: 46 34 36 40 33 35 +48x48: 36 42 42 48 41 47 +44x39: 30 33 31 32 23 32 +47x47: 32 40 43 34 39 37 +50x46: 39 44 36 39 38 43 +36x43: 37 38 49 53 22 42 +37x49: 33 25 25 28 36 44 +47x46: 41 29 40 34 38 43 +44x36: 49 44 37 34 39 40 +48x44: 33 43 41 39 38 30 +40x42: 39 26 26 34 25 31 +43x46: 52 44 49 60 53 47 +47x48: 46 48 36 44 32 33 +42x41: 24 28 32 26 36 36 +48x43: 72 52 38 58 45 54 +45x41: 50 54 56 42 42 36 +50x45: 55 60 59 60 57 55 +38x41: 28 32 30 20 27 18 +45x41: 32 36 31 36 27 33 +41x36: 24 18 26 30 29 28 +38x39: 36 40 35 31 35 55 +45x37: 44 49 44 44 34 41 +36x49: 39 41 54 39 50 49 +49x43: 52 53 57 47 57 59 +49x48: 59 64 74 40 67 53 +41x49: 45 50 59 45 56 54 +39x39: 24 49 36 45 48 31 +49x38: 44 48 40 56 47 55 +35x50: 45 47 37 39 55 46 +38x44: 29 33 24 28 25 28 +42x42: 61 42 43 36 41 48 +36x35: 27 36 32 26 40 32 +37x46: 37 58 43 39 40 45 +47x38: 29 18 29 33 33 38 +49x45: 47 61 64 59 52 57 +39x48: 25 39 37 45 29 33 +35x46: 38 30 47 36 53 44 +47x50: 55 57 52 72 61 69 +48x45: 63 60 55 50 51 52 +46x45: 60 46 60 54 40 61 +35x45: 24 32 27 31 30 21 +45x44: 31 41 33 39 30 35 +49x49: 66 69 56 59 66 50 +48x45: 63 52 69 38 56 51 +48x39: 53 51 51 36 49 46 +35x47: 27 28 30 29 29 21 +41x35: 32 27 19 22 20 23 +42x47: 40 56 46 51 56 57 +35x47: 49 45 40 38 41 39 +39x38: 37 43 38 34 39 36 +46x47: 51 54 54 55 61 59 +40x38: 33 35 36 43 40 51 +42x45: 48 53 51 49 45 44 +48x36: 47 49 41 51 45 30 +42x42: 33 31 27 43 37 25 +47x47: 65 60 52 54 59 47 +40x47: 34 32 30 30 31 38 +35x37: 27 24 20 16 29 15 +39x40: 22 27 33 33 27 26 +37x47: 52 45 46 45 40 38 +44x35: 42 35 53 44 27 36 +44x37: 23 20 28 26 38 33 +35x50: 35 37 23 24 31 25 +44x50: 51 57 67 57 50 57 +47x48: 56 57 61 55 63 54 +35x47: 31 24 22 25 30 33 +39x40: 39 37 42 39 41 43 +36x40: 37 31 46 41 29 39 +36x37: 23 23 28 29 20 21 +45x36: 39 38 40 56 33 47 +46x42: 57 45 41 48 52 56 +38x39: 25 27 27 27 26 23 +47x49: 51 59 68 56 57 65 +38x38: 22 29 18 26 27 21 +38x48: 49 38 52 49 45 49 +45x49: 59 48 62 60 55 56 +46x36: 25 40 19 30 31 34 +48x37: 56 41 51 31 50 41 +36x47: 34 29 29 29 24 35 +39x48: 46 62 44 51 35 52 +41x45: 42 58 53 49 44 35 +44x47: 53 53 51 50 58 53 +36x42: 24 33 28 32 21 30 +43x45: 43 35 38 29 40 25 +37x35: 36 39 38 28 27 30 +41x49: 31 35 34 26 42 40 +36x47: 38 52 38 42 56 31 +38x43: 31 29 29 27 35 17 +35x35: 16 18 23 18 26 20 +39x46: 40 47 47 41 49 54 +50x37: 39 25 41 27 28 31 +39x49: 42 32 36 31 32 34 +39x36: 40 41 29 46 32 27 +43x48: 62 56 51 45 56 44 +39x36: 29 24 21 24 24 33 +37x38: 40 40 35 32 31 39 +41x35: 27 46 35 37 34 44 +35x36: 23 28 25 20 17 18 +44x50: 56 51 58 62 63 47 +44x46: 46 46 52 57 63 47 +50x48: 41 48 50 39 43 35 +44x47: 62 50 56 42 53 54 +47x36: 31 29 30 30 31 28 +44x43: 52 54 52 43 45 43 +35x47: 46 51 30 43 43 40 +44x44: 57 57 45 48 44 46 +37x40: 36 40 46 33 32 41 +49x47: 49 40 37 28 48 38 +47x39: 47 42 51 44 50 48 +42x39: 31 41 46 40 45 52 +49x40: 32 27 36 39 36 37 +36x47: 19 31 33 41 30 26 +46x48: 50 55 56 62 60 58 +40x46: 34 22 31 34 30 44 +41x40: 21 33 30 29 31 24 +48x47: 66 56 59 47 57 62 +47x41: 63 40 44 47 57 44 +43x37: 35 34 30 19 25 24 +37x46: 32 49 40 47 50 45 +45x46: 46 60 56 60 49 47 +48x50: 38 42 49 42 41 44 +41x40: 30 28 25 30 26 30 +38x42: 35 52 37 41 35 48 +50x41: 63 49 49 46 64 40 +46x40: 56 40 49 39 47 53 +44x41: 44 56 41 43 53 38 +48x48: 36 46 41 43 45 45 +39x37: 34 45 30 42 43 26 +37x42: 37 37 31 56 40 41 +37x47: 49 53 35 46 43 41 +42x45: 34 33 39 37 36 30 +38x37: 34 43 38 31 39 29 +42x39: 41 44 36 49 35 51 +35x39: 17 28 24 25 23 26 +40x39: 25 33 30 23 29 28 +49x49: 48 71 68 71 56 55 +48x40: 65 51 52 40 43 41 +48x40: 50 57 40 45 54 49 +47x47: 52 33 27 39 39 34 +37x37: 38 35 28 43 38 28 +50x44: 70 50 51 65 57 43 +37x39: 24 27 26 22 25 32 +40x49: 42 35 35 37 32 27 +46x47: 53 56 61 58 53 51 +39x50: 55 53 45 44 51 52 +49x50: 34 40 49 46 43 44 +46x41: 58 45 44 47 39 61 +50x47: 54 41 31 42 38 34 +48x48: 64 46 54 64 67 61 +45x45: 41 32 32 40 34 45 +45x42: 43 40 51 47 54 59 +38x50: 32 35 30 35 29 31 +47x37: 42 55 41 38 44 48 +50x47: 60 66 54 68 62 50 +47x36: 35 34 27 28 31 24 +38x41: 41 36 45 34 43 40 +35x40: 43 38 29 36 35 34 +48x40: 57 44 49 52 45 49 +38x35: 26 18 17 24 19 28 +46x43: 54 48 54 55 46 47 +36x40: 49 31 35 29 36 42 +44x39: 25 27 33 27 37 33 +48x47: 33 49 38 32 45 43 +48x50: 56 53 75 63 55 70 +49x38: 26 33 30 44 32 26 +43x47: 34 38 35 47 29 26 +47x45: 57 52 56 61 53 45 +35x35: 38 37 26 29 28 30 +40x36: 19 18 16 39 26 38 +35x40: 29 39 38 37 37 36 +44x45: 43 34 35 35 33 30 +36x41: 36 35 53 31 40 29 +47x42: 35 48 47 65 53 61 +38x49: 54 47 48 46 43 49 +43x46: 34 31 41 35 35 34 +47x41: 33 36 32 28 33 33 +36x41: 45 30 49 30 38 33 +38x40: 43 39 41 42 34 34 +43x39: 45 46 52 49 35 28 +50x38: 44 41 49 59 50 52 +35x36: 31 29 28 30 35 44 +41x43: 29 33 24 30 33 33 +47x43: 54 56 37 52 66 44 +44x42: 44 52 42 53 50 43 +36x40: 30 33 27 19 20 26 +45x35: 44 45 31 47 40 35 +47x35: 45 42 40 46 43 36 +50x49: 80 65 59 57 54 61 +36x37: 35 36 31 33 38 31 +44x38: 26 29 34 25 28 25 +44x36: 29 26 27 30 19 36 +41x42: 49 39 51 41 35 52 +39x41: 27 30 19 26 26 40 +37x35: 22 25 27 22 17 18 +45x44: 48 45 39 53 62 61 +41x38: 29 51 41 42 38 39 +43x47: 41 32 42 32 34 28 +39x36: 41 33 42 25 32 44 +39x41: 36 51 40 33 52 30 +41x50: 62 52 39 58 49 58 +50x49: 70 76 62 56 53 58 +40x46: 50 42 51 47 50 42 +35x48: 43 45 47 38 44 40 +35x50: 24 36 26 25 35 29 +36x48: 26 28 47 22 36 33 +47x50: 62 58 76 55 55 53 +38x40: 22 34 32 16 24 28 +46x37: 29 26 42 27 29 27 +40x39: 30 24 40 23 24 27 +39x36: 32 47 22 45 27 48 +37x42: 39 32 38 38 47 47 +41x44: 47 52 41 40 51 46 +36x36: 28 23 17 23 27 25 +42x41: 46 49 40 51 36 44 +40x40: 34 43 53 31 40 45 +39x36: 38 43 36 27 30 43 +50x39: 34 30 40 34 34 36 +36x36: 36 38 39 24 32 28 +50x45: 36 42 50 37 34 41 +40x42: 48 43 31 46 49 42 +35x42: 36 34 42 37 41 36 +37x46: 42 45 43 45 44 43 +39x49: 36 32 33 39 30 38 +40x46: 52 51 46 41 46 46 +49x49: 49 42 45 43 38 38 +50x36: 41 41 53 53 52 35 +40x44: 35 26 27 30 34 29 +42x38: 23 37 24 29 30 24 +39x50: 35 33 34 39 33 33 +39x35: 24 11 31 31 24 22 +48x46: 22 32 40 41 51 54 +36x35: 20 22 13 20 30 27 +49x40: 31 31 31 32 38 45 +36x41: 40 30 39 40 43 35 +37x39: 25 30 25 27 30 18 +41x38: 48 42 39 34 37 39 +35x50: 47 48 38 50 48 37 +44x38: 40 40 47 38 41 54 +44x40: 34 23 29 37 27 32 +38x43: 49 38 38 40 41 47 +47x40: 47 44 56 43 50 49 +46x48: 43 46 37 39 30 44 +44x42: 46 46 34 53 57 50 +46x48: 43 57 59 56 71 53 +37x47: 26 28 30 36 30 30 +47x38: 43 45 41 61 42 45 +45x40: 26 44 53 59 44 56 +46x47: 55 53 53 53 54 68 +50x43: 39 51 33 29 34 37 +43x38: 28 29 26 33 23 29 +42x48: 42 35 34 31 40 42 +36x47: 37 32 30 19 34 28 +40x39: 19 37 30 20 37 26 +39x44: 51 42 36 47 44 45 +36x36: 30 31 52 35 29 19 +36x45: 37 31 31 33 23 25 +37x39: 25 24 29 30 30 18 +43x50: 51 66 54 44 51 67 +44x44: 53 54 47 48 44 53 +45x47: 49 65 49 51 57 54 +48x43: 40 34 33 37 48 31 +36x49: 45 40 43 48 48 49 +39x46: 34 48 44 57 43 54 +38x50: 27 36 20 33 43 32 +36x48: 20 27 45 24 32 44 +40x49: 35 28 37 34 42 32 +49x47: 59 57 54 63 63 59 +44x37: 47 45 52 38 37 27 +44x45: 42 53 58 46 52 54 +50x43: 61 62 57 48 44 59 +49x44: 41 35 33 42 36 37 +42x36: 40 41 40 34 42 34 +36x47: 35 64 41 40 45 32 +43x44: 28 34 28 38 41 27 +40x50: 47 49 46 56 56 56 +48x40: 39 37 30 42 30 30 +46x35: 24 31 32 26 26 26 +41x42: 30 29 27 27 31 38 +41x44: 49 49 45 41 49 43 +41x44: 24 32 36 30 30 29 +41x37: 18 31 25 23 30 29 +37x39: 35 30 35 41 47 34 +43x45: 43 30 34 37 29 37 +35x45: 42 37 39 37 45 43 +40x42: 39 38 49 39 50 43 +49x37: 46 45 42 48 53 45 +47x38: 49 43 43 55 46 38 +46x50: 56 58 60 56 62 63 +50x42: 40 34 37 43 35 35 +36x40: 37 37 47 24 40 34 +38x50: 32 27 32 31 38 32 +42x45: 46 60 39 47 48 52 +37x50: 50 44 45 53 43 52 +35x50: 47 41 47 42 43 51 +39x37: 30 28 23 30 18 27 +50x40: 58 43 56 55 44 53 +49x48: 56 80 67 58 48 50 +40x49: 39 32 36 31 27 43 +35x44: 40 34 39 34 49 41 +41x50: 44 59 53 59 50 51 +49x37: 47 42 51 41 54 42 +48x37: 29 27 35 31 39 31 +46x47: 66 44 61 43 62 55 +43x50: 51 57 55 49 53 69 +47x46: 53 63 51 53 53 61 +42x36: 54 34 41 33 34 35 +44x44: 61 45 42 50 51 49 +38x44: 40 36 56 46 42 36 +39x40: 43 51 32 31 42 40 +38x41: 36 35 38 43 44 46 +47x35: 26 27 29 26 30 26 +44x47: 60 50 57 59 43 49 +46x41: 54 50 38 54 58 33 +49x41: 42 29 35 41 27 33 +49x43: 51 49 60 59 52 54 +43x43: 32 29 37 28 30 40 +50x37: 36 34 37 27 29 29 +41x43: 48 48 47 51 44 30 +43x48: 63 57 41 49 48 62 +47x43: 58 42 39 56 60 59 +46x37: 28 42 30 23 23 34 +43x47: 35 29 28 34 42 41 +41x38: 25 21 32 24 20 33 +39x35: 30 19 25 21 27 20 +46x41: 52 44 44 46 51 55 +48x37: 47 49 44 39 52 40 +48x37: 23 41 33 40 29 25 +35x42: 50 35 34 38 35 33 +50x48: 41 55 38 38 30 54 +40x35: 22 31 29 20 20 21 +50x43: 59 44 63 51 57 57 +46x43: 41 60 51 42 57 53 +47x42: 39 39 35 32 26 39 +37x37: 36 32 44 38 32 27 +49x43: 63 52 59 61 42 46 +36x48: 36 45 42 42 49 55 +45x46: 66 54 42 56 53 46 +44x37: 37 32 40 49 52 42 +48x38: 38 37 37 29 24 27 +42x40: 26 34 30 28 32 32 +49x38: 29 30 33 26 32 42 +40x35: 47 37 34 42 29 24 +41x40: 33 28 27 29 21 30 +50x47: 74 59 59 49 67 49 +44x37: 34 26 24 29 31 24 +37x35: 24 24 21 23 23 17 +38x44: 45 41 37 52 40 44 +42x50: 23 44 39 41 36 41 +43x47: 61 51 54 48 54 39 +47x37: 30 22 26 30 30 41 +48x38: 26 43 28 25 35 34 +36x48: 35 29 29 31 29 38 +47x40: 42 44 45 48 56 57 +40x48: 33 35 39 37 32 32 +47x36: 48 41 36 45 42 51 +47x42: 35 53 49 49 54 69 +37x41: 25 30 21 23 30 27 +46x38: 23 34 30 29 24 39 +49x45: 70 54 49 48 64 52 +39x41: 34 38 25 20 28 23 +38x44: 46 41 42 35 46 48 +43x37: 43 49 43 42 35 30 +42x45: 42 30 37 31 32 38 +45x41: 42 44 41 56 54 49 +46x46: 45 49 60 68 48 59 +41x39: 25 27 23 34 30 30 +49x47: 40 31 44 29 46 49 +50x39: 53 49 48 47 47 58 +40x42: 32 31 23 40 31 25 +42x50: 46 37 40 31 26 43 +42x39: 24 26 40 36 23 32 +45x35: 21 38 29 26 31 19 +40x38: 26 16 31 27 26 29 +38x49: 36 33 27 22 33 40 +43x38: 30 29 23 26 23 37 +40x48: 37 30 43 28 37 32 +35x38: 27 32 43 26 38 39 +46x36: 32 31 34 26 37 20 +44x45: 52 48 48 67 45 46 +43x44: 53 51 47 50 41 50 +46x36: 50 38 39 43 50 32 +42x43: 41 32 29 24 34 35 +49x45: 60 57 56 54 58 53 +49x42: 51 37 35 33 30 37 +49x45: 44 38 38 37 42 41 +37x48: 53 42 41 49 41 49 +38x39: 40 39 38 41 34 36 +49x46: 29 48 45 40 37 40 +44x43: 51 45 53 50 50 40 +46x50: 58 46 62 54 61 78 +35x44: 42 32 35 43 48 37 +43x44: 42 48 60 46 42 55 +43x38: 24 39 27 28 21 29 +36x47: 42 33 41 49 51 46 +44x46: 51 57 50 49 53 51 +35x36: 30 27 31 30 38 40 +41x36: 22 24 28 35 20 26 +45x35: 34 33 18 28 28 24 +35x37: 28 36 41 34 26 35 +50x44: 53 72 61 61 44 45 +43x39: 29 25 29 34 38 26 +38x39: 37 43 29 37 45 37 +39x36: 34 29 35 35 48 35 +43x41: 48 36 48 43 52 44 +45x46: 36 38 40 33 35 43 +47x48: 39 32 37 47 42 43 +41x39: 30 26 31 22 24 35 +38x35: 41 34 39 25 37 25 +39x36: 41 36 40 32 28 40 +42x47: 43 40 39 36 26 25 +44x37: 41 51 44 34 42 36 +40x39: 42 41 31 47 49 28 +46x43: 33 33 29 39 43 32 +47x45: 60 61 39 46 50 74 +41x35: 28 21 22 20 25 27 +38x37: 24 24 28 18 29 21 +44x50: 47 34 36 29 33 44 +43x47: 56 46 46 54 54 57 +36x40: 41 34 43 39 23 44 +41x41: 49 42 37 51 35 47 +43x47: 35 58 46 70 42 67 +41x36: 19 24 32 27 29 25 +36x49: 55 39 50 45 46 33 +41x35: 28 26 18 22 26 23 +35x42: 44 30 33 44 40 36 +39x49: 30 28 48 37 31 34 +48x36: 26 37 41 27 26 34 +39x45: 51 39 49 49 47 32 +50x35: 34 24 24 33 28 33 +40x44: 41 48 31 50 48 57 +42x39: 38 38 42 56 37 44 +39x48: 37 35 32 32 31 41 +47x44: 55 53 47 49 56 60 +50x49: 57 33 42 40 44 39 +37x44: 32 20 36 21 23 35 +39x46: 38 35 37 30 24 31 +45x41: 54 50 41 47 52 37 +50x43: 51 46 60 55 61 59 +50x48: 57 66 57 67 58 67 +46x43: 53 47 51 56 56 39 +38x36: 22 23 21 30 18 29 +38x44: 29 29 29 32 23 25 +41x49: 35 31 32 31 43 36 +40x43: 44 48 46 49 39 38 +44x50: 49 68 44 58 59 63 +44x35: 27 25 26 16 32 28 +46x35: 39 48 32 38 48 43 +40x47: 41 56 47 60 37 51 +47x48: 35 28 49 43 38 46 +43x50: 60 60 57 48 57 45 +36x35: 34 34 38 21 40 23 +50x49: 49 38 33 42 44 50 +36x41: 30 39 39 33 47 39 +36x50: 32 41 23 30 39 27 +39x36: 35 26 31 16 24 23 +38x49: 31 30 24 39 32 35 +47x48: 60 59 50 66 55 59 +50x43: 51 29 65 51 65 75 +38x41: 34 35 39 45 49 38 +35x47: 25 33 21 36 16 34 +50x49: 54 60 72 66 69 54 +42x40: 40 47 40 40 44 49 +38x48: 56 45 49 37 45 48 +41x49: 31 37 42 35 27 36 +38x40: 39 45 31 42 40 37 +38x36: 28 39 29 40 41 34 +43x36: 34 29 23 31 29 22 +47x35: 41 41 33 53 37 53 +48x42: 40 48 51 69 48 59 +37x46: 41 56 36 49 42 37 +39x37: 35 40 37 44 34 32 +47x35: 44 40 43 34 50 41 +38x35: 40 34 31 31 35 33 +36x41: 27 30 17 18 27 36 +46x42: 46 32 40 26 36 29 +50x42: 60 42 54 44 71 50 +39x47: 50 43 52 47 39 53 +48x40: 49 51 49 70 42 33 +35x47: 41 51 47 33 41 38 +38x49: 43 49 49 57 47 41 +44x44: 50 41 51 45 54 59 +50x44: 33 35 40 45 34 36 +46x36: 37 53 35 37 48 45 +43x39: 32 28 30 34 24 33 +43x44: 23 34 35 30 42 32 +38x48: 49 35 54 52 46 45 +47x37: 30 30 34 31 26 28 +47x39: 44 50 45 53 52 36 +48x41: 34 51 56 56 54 54 +48x43: 53 51 49 64 53 48 +45x40: 32 66 42 49 42 47 +35x42: 26 19 31 29 25 23 +44x38: 30 26 22 23 29 38 +41x37: 29 32 20 24 19 31 +43x37: 47 31 43 39 46 38 +50x39: 53 43 52 45 56 51 +44x42: 48 44 55 47 45 45 +43x46: 30 44 33 34 34 34 +46x35: 36 47 40 44 44 36 +40x40: 34 42 39 49 47 35 +42x43: 22 43 32 35 37 27 +50x43: 61 62 51 52 48 57 +39x45: 37 28 25 29 36 39 +43x46: 41 34 27 35 41 31 +40x41: 46 41 51 47 34 31 +41x39: 21 28 29 29 33 28 +37x39: 49 43 35 31 30 32 +35x40: 33 33 36 38 35 43 +42x45: 46 50 53 51 41 51 +36x38: 30 39 24 39 40 41 +38x45: 38 16 43 25 22 35 +47x37: 35 30 32 27 26 29 +37x35: 28 20 16 27 20 20 +39x41: 36 41 31 44 46 52 +37x35: 32 34 33 35 37 27 +46x50: 50 59 56 70 68 50 +39x38: 36 41 43 34 38 35 +38x40: 26 21 21 26 26 36 +48x47: 55 66 50 56 63 57 +49x48: 55 43 36 40 45 37 +42x40: 32 30 40 27 28 25 +40x39: 31 33 25 25 30 25 +35x50: 48 45 46 43 45 41 +48x36: 31 30 36 22 37 36 +48x50: 53 66 73 64 55 58 +48x46: 72 65 40 57 59 43 +39x47: 49 52 39 51 49 41 +40x41: 43 45 32 46 51 34 +45x37: 45 45 44 47 38 36 +39x42: 42 36 45 43 48 37 +36x44: 41 33 44 48 38 41 +45x43: 26 49 41 31 35 27 +41x48: 35 23 40 26 40 43 +47x49: 47 42 39 43 30 39 +35x43: 26 27 19 31 27 23 +50x50: 74 53 73 61 60 63 +50x36: 30 30 31 34 39 28 +42x40: 31 28 28 29 37 28 +39x39: 24 26 28 32 24 34 +42x35: 29 33 19 27 29 17 +43x45: 43 52 56 52 56 35 +47x37: 38 54 49 38 53 31 +49x47: 64 64 71 47 55 49 +38x39: 19 28 21 32 29 26 +46x42: 34 27 46 36 40 26 +48x37: 48 39 42 57 47 41 +38x40: 32 34 19 22 30 19 +37x37: 25 19 27 27 21 25 +38x48: 49 52 51 31 48 48 +39x45: 49 53 39 33 53 40 +49x35: 31 22 31 26 39 27 +44x41: 25 34 27 30 35 31 +42x42: 46 49 41 48 51 34 +40x35: 24 27 25 25 19 23 +43x39: 42 43 47 41 42 43 +49x48: 59 62 59 59 58 67 +37x48: 50 41 51 48 41 42 +42x47: 38 51 55 49 59 52 +49x44: 48 60 73 56 50 41 +47x44: 56 49 47 65 51 52 +49x47: 63 67 57 64 58 41 +36x35: 25 13 23 21 25 25 +41x44: 35 31 19 27 39 31 +46x38: 42 53 48 41 42 42 +39x40: 48 28 38 39 48 39 +49x45: 54 58 58 54 67 45 +36x48: 31 30 28 36 31 36 +35x38: 35 34 38 28 33 37 +47x45: 59 58 46 49 59 54 +38x46: 32 24 27 33 34 30 +41x35: 28 20 27 24 19 24 +50x39: 34 41 27 36 37 33 +44x42: 30 37 41 30 25 32 diff --git a/src/main/resources/eu/sim642/adventofcode2025/day2.txt b/src/main/resources/eu/sim642/adventofcode2025/day2.txt new file mode 100644 index 00000000..0b040d76 --- /dev/null +++ b/src/main/resources/eu/sim642/adventofcode2025/day2.txt @@ -0,0 +1 @@ +9191896883-9191940271,457499-518693,4952-6512,960-1219,882220-1039699,2694-3465,3818-4790,166124487-166225167,759713819-759869448,4821434-4881387,7271-9983,1182154-1266413,810784-881078,802-958,1288-1491,45169-59445,25035-29864,379542-433637,287-398,75872077-75913335,653953-689335,168872-217692,91-113,475-590,592-770,310876-346156,2214325-2229214,85977-112721,51466993-51620441,8838997-8982991,534003-610353,32397-42770,17-27,68666227-68701396,1826294188-1826476065,1649-2195,141065204-141208529,7437352-7611438,10216-13989,33-44,1-16,49-74,60646-73921,701379-808878 diff --git a/src/main/resources/eu/sim642/adventofcode2025/day3.txt b/src/main/resources/eu/sim642/adventofcode2025/day3.txt new file mode 100644 index 00000000..da1e67f8 --- /dev/null +++ b/src/main/resources/eu/sim642/adventofcode2025/day3.txt @@ -0,0 +1,200 @@ +1122328377227565294573525668246252925164246287987784122693983869922222576473238222367725229292476776 +3439534344443341434449413434544546443313443434337243446444273233229964474333524343343263333397462332 +6446534656654345665545756845652445664554567453344355533455445732365554785365556466544424657625334454 +5764366546346565433173426656673446256755342552276356475358736554561768323235448436642626716668436552 +2432245322434343223312234234145234422422151425334232333434465223124422432123313313144223245434213122 +6373269138466626334224232272352251726573428236361362251272335335353545412626366252362443323122568732 +5673357339533533557574944447475576653565555474357764385574312376575243553954836367339357555551434444 +3232332132231233321122322231333232213233313332432312143232132213233232233243131223222222233422123252 +2532332134274262221121535425342131732342222326625224242334335132442252434322423352213461259334224487 +7565667856454556567454551653458944467437678656453544834356545556463354463263379773577656253433555445 +1376533544556457252934534268532349354424919842725952222763551835834557316545232355343561434353534372 +2523224493232433232232455126224252263322422141222233724236541332332735342832245213233463352313233144 +2125433524432544443453442442415232314454515362344343344431423442473342513223323343242354443455412243 +2223253513531336231535341344345453334337333533533361233323412322433143663333333373465253335734633327 +4222443232236314324237231323222882275222733343331312832133839321228313232237135332232232382344322422 +2531231222624224222222221242321222233212232242324222212221311445532222222224121224222222221252222524 +1282322243523323214433323343353334144321323323232732322223331131423423332423323326142343424314333343 +2233222322332112322233213222336221232222222214321225322213222122222352112222251322233152122421233222 +2133332225122552132443253453123412221223124644261212221552222235242211223223252155412122322122223222 +2342322335344224245235521242242243244442442432343445366241334834335442144222344342324144436322223252 +2255222226226744212232452222211222226644152224654642222241212623263422212222222123625471252525231222 +5253225434222243232256531212424522455213211226332242213164222254163325125452125461243424432232521451 +4288524434546485223254522441625265492255546828544443435345215657285553533178244452552176455574652293 +3235223132313212332222313343333222533331243421222333232232242221233321253222222311122211231321322323 +4123522222232222222222212221222312422443212311122224412242222422224221222222222421211512213232212222 +3322373222222242321232243243233223232232512214323122273433454631213413261244431323333233422222231333 +2436942332444453225144242332328323644174461313334813734323432222643133233737233352242843536483323424 +6623144536217362257362532276645667275225345632247317547264542717622752322512614462233614623212714313 +7643456556435262153535522356454446472226533567512621825444284454542422642342465553247415548425143345 +4232122253524333334533233324453222123233355235433223215572332412412135421543333225525442333542135342 +4323634634112252442592132533345314252129523914383352446365752563854222222135312255213224324234346522 +4353236333333443555453153222447234744855224242235222342821423544314432335143463324453212425243526253 +4534533361674341342373533433515133733463337326382435134633116532215664264731353346325231336324543442 +2441442233421553345123135143544543514414123543133232143423433134342241153555343533344332141124526789 +2212132232223312224121332321533433233231422432232322122242112121722221232232333333243232232321421332 +8276778647457225634262651262236665334746366328315345666276362545653426736648663235942674241466416645 +6757738683896779756978663273677647866865646763676539757557937794766886638666596578695866568667655479 +3235324533378448433335274942743645133375734577352715333261865358656374737284338777478232537365245343 +4544353485657685546454346442946313765454162559656661655383342671254345353453455264741766557648336668 +4264444443344473336242134323433423332343324333333254454443353213543335532443424243315435135233422373 +1432231244233483432121332254224143463222222243441213141223116223382721445238114213423233232232332221 +2222232322231222124222632512222322213212221522222322622211221322323233231312252122312222125222322125 +5366463442922353342532343315353122223432333452564936553861366438243355223456466376443429233733334342 +3333313233338514434336423444332456333438337336334342944347366333335933448363374642593526334235338432 +4222227222723244622222522625222227222591432114121271213422152232224222226451352886471215497226325622 +1111232241325222223121223534135331234513222224322152124231242425541542225512524325733232352114412425 +2223242372213783432244443234232241344257232234142233121223233244472224342214321145234135323222432222 +7222442251221342522212221263241222371222232252234532724122222223222242224126211222532342223261652272 +4123225523222243223332322233234223232323322421142343312222229252254332222231193233834232232232232342 +2455764672725285657557127457517886446383484443658853833551482862866696188528695445645864389836857824 +2335444449544244436542644344544332333444523525443443443433354544543555542346346934445434844534545545 +5456273732532761553636356321172336466215117763244762713542265616432246521176656227355141144521551389 +2333422422432424443133444224144223341444434246243346423344424236632222442323343342324426234343122243 +3232132222422262223173221122312222152213222216322222322165261222322331222222121213321311112321122223 +3336333635243464343314533547253312547553323635943356434524952334676984593636433632765833434735333295 +4466554446434343493244435644444546434456454446348134436455234534443633474446345344434349465344542534 +2283252222342324222242622432262222323242122472321325124722324133443416344232141342132222553222421221 +4733348213224614422542424524214442636434324322292112134274318423422425123232424143342426622122238342 +2547264446444453762654263745461534446445544246536154444456443634445537415555334834377456344442646345 +3234224523322112535364324435413222325212153235152232455542541542221253231224252442422424254422322212 +4434564642215554435546544343332243535432454423352834136234355653533947223444444433559353348543449567 +2252223221242232222222222222322222135222522222422222212152222212142212232121524124222322322224512122 +6635325243417345346543264825444676456234266553634661542263245335263444345423441364353444546365574427 +7244414324124342461462282831333363334223423253732522331422224422472834422742232252325332625423268222 +2522622422112622217136512442223148422522324324124421413262423456322242411142825222228223214212228222 +3542431852246554422545441526832353454624686525132255542551525344785454952341555431284422845282543531 +6456543746236666493367458482564445566646525647444144454366346513356435534382553243655846351653344585 +4223242121216152122132225135242212122223222322224214222231222243243232242222241122122221122232122545 +3666373263664638165458763666665656467334352246464434543434477354455615261454865224445241343254422436 +2545565568686975346357665466842836222436467776544436712632246471487464342898667553627255465468376526 +8222221224443333523484433432432252335423242323328434425143514452234724343465245447444244224323224222 +2231312223232323222282423422223414222223222212211122131222271221212222132322225122122322122122313322 +2351332722235622221115145344331322225322122522212322121233331363235353126542531252122234332322222632 +2222242222312422212844422121412221224224124242222252422142322325522324223312222232212212221212211423 +2422244322524332312422342135124221236423242242223232314218225183222432432232316163341254323211322422 +7932432222612262562422365343251724436522544235334252356725456232252325344141535346213432274336253556 +9517575495452463285625246622534143448544564729362945322553625244434653552723435775592696432635377248 +3285162422434542545733334242423355222835383224499473445323643214353333757362543467664433552383344345 +2624644522324533575226262424221534652968142565323566422323427228547262322561472973342542424234374363 +4252222322228122522222212224312211422343261243323222142222222223232323122231233212321322212352523231 +6333223322633614336133113463236222231322323361233153422235132233233241222221222633632232623332353323 +2434212432262232444423248513532323352132223343222235343843132342229242656331455524752215233354246225 +2821224223223233412223241321221222321222222132223132222321312242322424223132131232228221623221812221 +2522242314662335523532565226725434225254232633423425643565362345346345325359543433233622333547274127 +2142225142338322332322243224221253323412624233233424332332213311232233333332232242212321243433422222 +5457355948683856656457323863456263474356866754656654653576636656534564565268665746465622445365445614 +2221341212182232121222221241212223211232222322227222232222452221432211221422115225225322222212412223 +3333434443324362261444445643385443327443332324449763243385411335233354943533422338233545444394352393 +2433147245324334441433333313333642232142541344333123332343338463224233333342333343532434433113523383 +5214225313223233254524132672222242143113242231232312312242222244224353533113122132312212131222343213 +2651382833637664484389263776638888223726886234133422477852462545242564244982243246336763492552122385 +3447347335463643563377634477743644335336334244551444337536654736676124685542476435225623446634324664 +6798722675959385959955965473475636478285786397788537344625695675694767865289787789684444365577697799 +4342392334342333343323434242433342443444334332454368444343443444343333316224422333634353433444524243 +1132232222322423222322812312222222211132213222212222223231223222225212222222222222232122232222222242 +6777676475454474963718646644654675646848455656875566677876634666673675765957556849565967666775724657 +9937685975477776554675666685777758757636985565656687448887574884454865669765655445678158564484556665 +2233222122221222222222221222222121231221322322422242321332222222211122222122221222221122511322222222 +5343434464433254367753443233454474354443464536462244254424343346533432454253644316546443536534322563 +4231232232312222222223113211223222125212232132224222122332212223322243121332233232322123232324331322 +3323243333343232234442221332433312233222222241343232223342434132441343322223233243433115233233341142 +2261321222222222221229246925531422323635533332222333422527231332353227222133228352423224227332262223 +5555958875565589677535967847573599996477698587254577575545554589558899538785774458869568857545573977 +5214222222222222222345312246222322237247342225222235222222222242413322222322222222153223442132322472 +3243338152344243429215412527332523242224373343648344241373243332385624742434422444654442336442534422 +1222226123222152934223223122222162221222672222122222122222213232212222222235212212222322222252222222 +5854456249637745756667484452645648695565856545425335866356574555555555676868475555378293465665575479 +3245455545452243862642554833652545413524455331444434334363344434431241365343523434433554332553213535 +2654764623252226452222126726264584214222526925222565934251222228175322722323627475621432222712266228 +2211593522362319922453245223592262143135224173239127386572222172224261212222442582447253172726525722 +1292232247422327232931222122473236332229414132432322226322242422234121254245434124433749432244311222 +2376266634476255566464645552246527646527116472755384536339256364314546223561571544557837662576545225 +4256364466666844987645457666556542666665666585356953545624223376445516665425542276465756445675634233 +3331333333333342254332333333353233333532352323341332433232533353333423443433123224333923333323434533 +3133323315314232333313215512438333233223223344623343221322442854333391333223333321332325333856733144 +2232222221222352222322322222233121222123222321212223222122221323314223224325221232322222212322322242 +3223312325434422333263234122126353314612232211222412424324351423242327324333333214232432252512415321 +4324312443333412313243112123212343331122241334333241341134433343134413422313423234433431244324156789 +4243522334622415411232154541422322533823354423252322454343524624233244321332422341223121253327212442 +2634332652432675331222272824265621332859222925233323632295371137223232376222225232424762243526136227 +1262622222432222213232222211223822221322222123223331323222222236221422512212222223131233122261422232 +2894221243222512212222224123331312229212222125136523212542122321322222222342223223233231221522572623 +2743946428734154148535536567233352844848227254434468132453632673482434344253644422324567623737462358 +7475533242444354536668624624455233655454632655465453454463323345444646265533671445624652646445424353 +2142321233213322114232225223224533224241233623642342221121313233223222219423222211222313433233226332 +3434447434937346434744423322255134514526553464272334633641332232434322443445343343224644244646223345 +2226242226412127622225121242432463313111222132325122221212523113223132231321263325122122122324221112 +2243533353234655333344333313536352333333232343322335123433453333533334333352254222333354553335324334 +2242124281222122144913212222222322222242222442222322228223218223122723422121222222231225222222212521 +6333333233846425213386353453331543224231222232388343243131333732311233327753333353226142471182426927 +4835333534662133342343434444343462583311535233334453433455584323535433641444144234314733352343442243 +6536758559666357457485434644655556854996457444563433954756763433378345587465535696547957436365555476 +3311312223223242222213222223322422221322223222322112254333221212322612352313212444222252312212232233 +5235222121222231324221123333123212122212221222532262222244223423132223241423212211423323221244248244 +2323121223423223324222223322232333233232324222323122223432123232232322222333342323333433332322122223 +5153323234232342222332222226312232113233322222222132233122232211232232322132223222232322222233231332 +4445242122222412252131484252816482332322212742325664246322226222235222222726222422222723148172562332 +5313353552552441443332334323344544346525363544533433453334332452543645345333333145125333435532535545 +2253325121232521322235332544212312312334233333613533544262125333433323242334312213353412313224335323 +3442455225824322325483215225328113822323363525253546424414346444685422225156364832522575532426362223 +1221232215252242322241122222322122232222222232222222221222222312222122524222222322225224232221142222 +1434411514222231342462123235465455646133223251262356536544253133563344423361124424434443451651453789 +5421333333154443254642523234545223143421434524543454242744542212333743422434244174422545424435324354 +2422225221321523422522321223422222221282132222421214132232224212127424222332352213214233722312221224 +8353366333623336363313332333668463335533335157633543646363234266534224738445635343936313336233333233 +4322313323734333233333133324332223361223333223333643133333152343333233334332222431433334232332342333 +4433555432513464345746344453554444945533345446356524754433455232462436463458454945555522134644345462 +1113322363222143322232422212222212112222233722231223321222234222322213321222262213432332223223222322 +4222333453325447341444442235423245335414424246724344234442633222442244424342345526444334443433343311 +2132392234222424334346324322232414433224332241443234442222422333423412332323524464444342261235341532 +2112332342532272232223275313233436223321233437135331262264123523352223532764132713226233262613423352 +4322222423721333283242323831364445738311334244633453347343472243237432374552234437223243212124322625 +1242468252334224755152335722155522422413313344554714234126324454626564243715252472212245243814274254 +7288471218123876835345677886537524525236527146666547752676112542531773366423574584288157326835587569 +7873669783877895986988965879478566639655779488956895968166899989557765975793814875581995987549987493 +1334334411325223943913344532323253464273222224622231241226241385242422514224312467644744674332264744 +1435222224242252225222521223522262223246265253223153233312525272222325424212513524222225183226643257 +3333332333333333333333333233323332333733313223313322432333323553322223334326334383334373323433423332 +2434222434342632322321224344227322233222451243242242322331322422422424223452222341223222524244223224 +2334113333222224331331421225323232452662862632333236231524234433234233233432434234343532393232233332 +4134224234542424342343312344334323334322342434444643233924434333338222243241442324422333425544423233 +3565636644445546545564766358556624446435646236664567636346646356364654647675612752316533743545346563 +2122232321222232134122222263434222142312323322211322222512231121221821122222131125232242232232342322 +5375425527762434248677433758261823212541262432573347762373434443753131295314323323425336274272313675 +3222222222222222246212321331121322212122262252122223122222121222232222222221223222222212222222533232 +2142432532411353333545333513346433433533244333233326433433333566331333335445333143333333323363373533 +3333334214223333334343323343323453434333333333333244343343443343233333334344524233313337434333432322 +2232432224433433313385333321323345333333333223243243334333332252323333233212223342433323353333233223 +3234337223322314472232212314143623424244223434234133321222215136433234223221321442432422424334222224 +4422625214416262624221172625722223459222256245232634254242434722522128225323225713135335221224222111 +1332233222222352233332151322322233222222321233324232332132222233133625322222222323143225333424413222 +1212221233434411242222222232342272261362231222122213233211242123448423412622121212224222245232221231 +5299239242432267722312144753524325235544143326621526223357993233413345372525642521566214321229314226 +4145815259445253437345286245352965222465396946455525666535157576493246439135482348345259474534214895 +4359454935483443642555444253332646423565846452265442345833574549442746543574436733264526894364357572 +4455362612251424257347533535244543123224216453411496584314352529524942421253415255562112225354222522 +1442232342433253322444534281432832532221672244522533352331353433357344632533273418434294521434522442 +4222222215222314232121254322233232222223122634122452442325321222225215221262211462212251222122432225 +5433343433354336555313334535433334646344314443334434323324433351432333233343343453434443354755443144 +7455735614556556475541373865756554446747474542632733338546537454714443436561535533325555442337664366 +3344244343421362432233243522354253434334144424341223843414452442242233253333415322242242421421222344 +6566496645534446467563655546666284568446568656566488652487754568586356364667666343653435344856634686 +3144742294362343433433444152533433333354533454223125636323643244343342222413333242523375333224753333 +3221523222332442343532222237412235442452325221435232234441525512343524244632563143252254222455154221 +3224327652164274373434256367436252531482365553771428333238873236774688169262541264643619643249432147 +4884532535643454176544345559146393647314561543235243325754646564452432255522565243562352226356533255 +2311434244645331433437443324222242222346543444433231311844443214411344612234346424445322444644242422 +2162123222225122221111123222322122322233422452224412222322421212222421237222222225232132222231522142 +4634423245446733424454237456446454376514876546452544686573653263546426444252424446345435263643465462 +3333433236833532333323333332633353333373964224333234334234434235324533133333366333323333233443527332 +2213222322242112532233111222211252231251222334273212372255322233222322521253222127321321121222351322 +3333531243833462333332223231353333233423323335442148233323423433334223232432341332332113321733223323 +1253222412232122142223322252221331232333213442223222222322329232133533222333322223233421612131455332 +2126352214354453312222742413223131233982433261445213341234522712243224286251232222322412242832421233 +6755646362147242536753172684353487842555958732547755226562634346554123245448573341747273467855165235 +2222212222222722222322211223233322242232221125222151222152123226222164222523412311242122125222222212 +3335321234234455143444233435223252532335334336334245233424223444352465523413253533334644323424424432 +3343742454932436532444334343432433343532443425428234452394453474344344383332325454346344412541474253 +2474477763936979663333346343374443344643635572649454475855374386394583444346862733437379465433493339 +3289373373182327263634375433233261632333632233239373343722362254522232326722313742223237132632342532 diff --git a/src/main/resources/eu/sim642/adventofcode2025/day4.txt b/src/main/resources/eu/sim642/adventofcode2025/day4.txt new file mode 100644 index 00000000..9225f7e6 --- /dev/null +++ b/src/main/resources/eu/sim642/adventofcode2025/day4.txt @@ -0,0 +1,139 @@ +@@@@@..@@@@@@@@..@@@@.@@.@.@@.@@@@@@@.@@.@..@@@@..@@@..@.@@..@@@@.@......@@@..@@@@.@@@@@@@@.@@@@@.@@@@@@@@.@.@@..@.@@@@@@@@@@.@..@..@@..@.@ +@.@..@@.@..@@@@.@..@@@..@@....@.@.@...@.@@..@.@@.@@@@.@@.@@@..@..@.@.@..@@@@@.@@@.@@@..@@.@@@@.@@.@..@.@@@@@@@.@@...@@@@.@@.@@@@@@@@@@..@.@ +@..@@@@@.@.@@.@.@.@@@@@...@.@@.@.@@@@@.@@.@@...@@@...@@@@@@@@@@@@@@.@.@@.@.@@@..@.@@.@@@@..@@.@.@.@@@@@@@@@.@.@@@@..@.@@@@@@@@.@@@@@@.@@@.. +@@@.@@@@.@.@@@@...@@..@@@.@.@@@.@.@.@@..@.@@@@@@@@@@@.@@.@@@.@@.@@@@@@@@@@@@..@..@@@..@@@.@.@@..@@.@.@..@.@@@@.@@@@@.@@.@@@.@@@@@..@@..@... +@@@@..@.@...@@.@.@@..@@@@.@@@@@@....@@..@@@.@@@@@@@@......@@@@@@.@@...@@.@@.@@@@@.@@..@@.@@.@@@.@@@@@@@@...@@@@.@.@@.@..@..@@@.@...@@.@...@ +@..@@@@@..@@.@.@@..@@@.@@.@@@@@@...@@@@@..@@.@@@@@..@.@...@@@..@@.@@@@.@@....@@@@@@@@@@@@.@@@.@@@@..@@@@.@..@@@@@@.@.@...@..@.@..@.@@.@@.@@ +.@..@@@@@..@@.@@@@@@@@.@@@.@@@.@.@...@..@@@.@.@@@.@@.@.@..@.@@..@@..@.@.@@@@..@.@@@@@@@@@@@@.@..@...@.@@@@@@@@@.@@...@@@.@.@@@..@@@.@@@@@@@ +@@@@.@@@@.@..@.@.@..@..@@.@@@@@@.@......@@@..@@@.@@@.@.@@@@..@@@.@@@..@@@@@..@@@@.@@@@@..@@.@.@@@@@..@@@.@@.@@@@@.@.@@.@@..@@@..@.@.@.@@.@@ +@@@@@@@@.@..@@@@.@.@@..@.@.@@@@@....@.@@@..@@.@@@@@..@@....@@.@.@@@@@@@.@@@@@@@@.@@.@..@.@@@..@.@@@.@@..@@@.@@@@@@@@@@.@.@@@@..@@@@@@@@.@@@ +.@.@@...@.@.@@@@@.@@@@@@@...@..@@@@@.@.@@@@@@@@@.@@..@.@@.@@@..@@@.@@@.@@@.@.@@.@@@@@@@@@@..@.@@@@@@@@@@@.@@@....@@.@.@@@@.@@..@@@@@@.@@@@@ +@@@@..@..@.@@.@@@@.@.@@@@@@@@@@@.@@@....@@.@@@@.@..@@..@@.@@@@.@.@.@@.@@@.@.@@@@.@.@@@@@.@@@..@.@@@@@@..@...@@@@..@@@@@@@.@@@@@@@@@.@.@@@@@ +...@@@@@@@@.@@@@...@@.@..@@@@@@@@@.@@@.@@@@.@@.@@....@@...@@@.@.@.@@@@@@@@@@.@@.@.@.@@@.@@..@@..@@.@.@.@.@.@.@@@@.@..@.@..@@@@.@.@@@@@.@@@. +@@@...@@@@@..@.@.@...@@..@.@@@@..@@@@...@@@@.@@@@@.@@@@.@@@@@..@.@@@@@.@@@@.@@@.@@@@..@@@@@..@.@@@...@@...@@@@@@@@.@.@@@..@@.@@@.....@@.@@@ +.@@@@@.@@@@@@@..@@.@@@@@@@@@@.@@.@@.@@@@@.@@@@@..@@@@@@@@@..@@@@@@@@@.@@@..@.@.@@....@@..@..@.@@@.@@@@@@...@@@@@@@@@@@.@.@@..@.@@.@@@@.@@.. +..@@@@@@@@@@.@.@@@@@@.@..@@.@.@@@@@@@@.@.@@@@@@@@.@.@@@.@@@@.@@@..@@..@@@@@.@@@.@@@@@@.@@@..@@@@@...@@@.@@@.@.@@...@@.@@@.@@@@@@@@@@@@@@@@@ +@@.@..@@@.@@@.@@@@@@@@@@@..@..@.@@.@@@.@@@@@@@.@..@..@@@..@@@...@..@@@@@...@@.@@@@@@@@...@@..@@.@@@@....@@@@.....@.@...@@@..@@@@.@@@.@@@@@@ +@@..@@.@@@.@@@@..@.@@@.@@.@@@@@@.@..@@@@@...@@@@@@@..@.....@@.@@.@..@@@..@@@@.@@@..@.@.@@@@.@@@@@@@@@@@@@@@@.@@.@.@.@@@@.@@..@.@@...@..@.@@ +@@@.@@@@@@@@@@.@@@@.@@@@@@@@.@@@@@.@@@.@@..@.@@..@@@@@..@.@.....@.@@@@@..@.@@@.@@@@.@..@..@..@@@...@@@@..@.@.@@@@.@...@@@@@@@...@..@@.@@.@. +@.@@...@@.@@@@@@@..@.@.@@@..@@.@.@@@@...@.@@@@@@@@@@@@@@@..@@@@.@@....@@@@@...@@.@@.@@@@@@.@@.@@.@@.@@.@@.@@@.@.@.@@@@.@@.@.@@..@@..@.@@@@@ +@@@@.@.@.@@@@@@@..@@@@@..@@.@.@@@.@@@.@.@@@@@@@@@@@@@@@@@...@@@....@.@.@@@@@@.@....@..@@.@@@@@..@@.@@@@@.@@@@.@@@@@..@@@@@.@@@@.@.@.@@@..@. +@@@.@@.@@@.@@@@.@@.@@@.@..@@.@..@@@@@.....@.@@.@.@@.@@.@@@.@.@@@.@@.@@@@..@..@@@..@@@@@.@....@@..@.@@@@@.@.@@@@..@@@@@@@@.@@....@@.@@.@@@.. +.@@.@@.@@..@@@.@@@@@@@.@@@.@@@@@@@..@@.@@@.@@@@.@@.@..@@@.@@.....@.@@...@@.@.@@.@@@@@@@@.@@..@@@.@.@.@@.@@@@@@@.@..@@@@.@@@@@@@@..@..@@.@.. +@@@...@@@.@@@@.@.@@.@@..@@@@@@@@@@@@.@.@@.@..@@@@@.@@@...@@@.@@.@.@.@......@@.@@.@.@@@.@@@@@..@@.@.@@..@@@@@@@.@@@..@..@@...@@@@@@@@@@@@@.@ +@@@@.@....@@@@@@@@@@@..@@..@.@@..@@@@.@@@@@.@.@@@.@.@@.@@@@@@@@.@...@@.@@.@@@.@@@.@..@@.@@.@@..@@.@...@@@.@.@@@...@@@.@@@@@@@@.@.@@.@..@@@@ +@@@@.@.@.@@@@@@@@.@@@@@.@.@.@.@.@@.@@@.@@@.....@@.@.@.@@@.....@@..@.@@@@@.@...@@@@@@.@@@.@.@..@@.@@@@@...@@@@.@.@.@..@@@..@@@@@@.@@.@@@.@.. +..@@@.@.@@@@@@@@..@@@..@@@@@@@@@@.@.@@@@@@@@@..@@@@...@@@@.@..@@..@@@@.@@@@.@@@.@@.@@@@....@.@.@..@.@.@@..@@.@@@@@@.@...@@.@@@.@..@@@@.@.@@ +..@@@@@.@.@@@.@@..@.@..@.@@@@@@@@@.@...@..@@@@@.@@@@@.@...@@....@@@@@.@.@@.@.@.@.@.@.@@@@@@...@@..@...@@@@.@@@@.@.@..@.@@@@@@@@@@.@@@@.@.@@ +.@@@@@..@@@@.@@@@@..@@@.@@.@..@...@@@..@@@@@.@@.@@..@@@.@@..@@...@@@.@.@...@@.@@@@@..@@@@@.@@@@@@.@.@@@@.@.@.@.@@@@@.@@@@...@@@@@.@@@@@@.@. +@@@.@@..@...@@@@@@..@@@@@@@...@@@@@@@@......@@.@@.@@.@.@.@.@@..@@..@@.@.@.@@.@@@.@@@@@@@@@@@.@@.@@..@@@@...@@@@@@@@.@.@@@.@.@@@..@@@@@@...@ +@..@@..@@@@@.@@@@.@.@@@.@..@.@.@.@.@@@.....@@@.@.@.@@.@@.@@..@@@@@@@@@...@@....@.@.@@@..@@..@@@@@...@@@@@@@@@@@@@@@@@@@.@...@@@@..@.@.@@@@@ +@@..@.@@@.@@@..@.@@.@@@@@@..@@.@..@@@@@@.@@@.@@@...@@.@.@@@@.@.@@@@@..@@@@@@.@@@@.@.@@@@@@@@@@..@@.@@.@@.@@@.@.@@@..@@.@@.@@.@.@@@@@@@..@.. +@..@@.@..@@@@@@@.@.@...@.@@@@@@.@@@@@....@@@@@....@@@.@@..@@@@..@@@.@.@@@@@@@@.@..@@@@@..@@@@@@@@.@@@.@@@@@@@@.@@@@.@@..@@...@@@@@.@@@.@@@. +@@@@@@@..@@@.@..@.@..@@.@.@@@@.@@@@.....@@.@.@@@.@@..@@.@@@.@..@@.@.@@.@.@.@@.@@@.@@.@@.@@@@@.@..@@.@...@@.@..@@@@@@@@@..@@@@@.@@.@@..@.@.@ +@.@@@.@.@.@@.@@@@.@@....@@@@@.@@@..@..@@....@.@@@@@@..@@@.@@@@@@..@.@.@@@....@.@...@@@.@@@@@.@.@.@@@@@..@@@.@.@@..@@.@.@.@@@@@@.@.@..@@.@.@ +.@@..@@.@.@@@@@.@@.@..@@.@@.@@@@@@@@...@.@@@@@@..@@@@@.@@.@.......@@.@@@@@@.@.@.@.@@@.@.@@@.@..@.@@@@...@@@@.@@..@..@@@@@.@@@@@.@@@@@@@@@@@ +@@@@@@@@@.@...@@..@.@@@@@.@@@..@@@@@..@@@@.@.@.@.@@@@@@@@@@@@.@...@.@@@@@.@@.@@@@@@.@@@@@@@.@..@@@@.@.@@@@@@@@..@.@@@@@@@.@@.@@..@@@@@@@@@@ +@@@...@@@@@@@.@@@@@@..@.@@@.@@@.@..@@.@@.@@.@@.@.@@.@.@@@..@@@@@....@@@@.@..@@...@@@@@@.@.@@.@@@..@.@.@.@@@@.@@@...@@@@@@.@@@..@.@@.@@..... +@@.@@@@@.@.@@@@...@@@@@@@.@.@@....@@.@.@@.@...@@.@@@@@@......@.@@@@@...@.@...@@@@@@@.@@..@@@.@@@@@.@.@@.@@@@..@@.@.@@@@@@.@@...@@..@@@@@.@@ +@@@.@@@.@@..@@@@....@.@.@.@.@@@@.@..@@@@.@@@@@@@@@@..@.....@.@@.@@@.@@@@@@.@.@@.@@.@.@@@@@.@@@@@@@..@@@@@.@...@@@..@....@.@@@.@@.....@..@.@ +@@@.@@.@@@@..@@@.@.@@.@..@@@@.@@.@@@.@@.@@.@@@..@@.@..@@@.@.@@@@..@.@@@@@.@..@@.@.@@@@@@.@@@@@.@.@@.@@@@.@@@..@.@@.@@.@.@..@@@.@.@@@.@@.@@@ +@.@@@@@@@@..@@@@@@@@@@..@@@@.@@....@.@...@@@@....@@@@.@@@@.@@@@@@.@@.@..@.@@@@@.@.@@@@@..@@.@@..@@@.@@.@.@@.....@@@..@@@@..@@@@@.@@.@@@@..@ +..@@@@@@@@@.@@@.@@@@@.@@@..@.@...@........@@@.@@.@@@@@...@.@.@@.@..@..@@@.@.@...@@@.@.@@.@..@@@@..@@@@.@......@@.@@..@.@@..@@@..@.....@@@.@ +.@@@@..@.@@.@@@.@@@@@@@.@@@..@@..@@@.@..@..@@@.....@@.@@@@@@@@.@.@.@.@@@@@@..@@@@@@.@@.....@.@..@@..@@..@@@.@@@@.@@@.@@.@@@.@.@@..@@.@@@..@ +.@@@@@@@@@@@@@.@@@@.@..@@.@..@@.@@.@.@@.@@@@@@@.@@.@@@...@@@.@@..@@..@.@..@@@@@@@@@@@@.....@@@@@@@@@@@@.@@.@@.@@@.@@.@....@@@...@@.@.@@.@@. +.@....@@@@@@@@@@..@@.@@@@..@@@@@.@@@@@@..@...@.@.....@@@@@@...@@.@@.....@@@@@@@.@@@@.@@.@.@@@.@@.@@@@@@@@@..@@.@.@@@.@@@.@@@@.@@.@.@..@.@.@ +@@@@.@@.@..@@.@@@@@@@..@.@.@..@..@@@.@@@@@@@.@.@.@@@..@@@@@@.@@@.@.@..@@@@@@@@@....@@.@@@@@@..@@@..@.@@@@@..@@....@@@@@@.@..@@@...@.@.@..@@ +@@.@@@@...@@.@.@@.@@@.@@@@@....@@@@@@.@@.@..@.@.@@.@@@@.@.@@@@@@..@@@...@@@@@@@....@.@@@@.@@@@@.@@@.@@..@@.@.@..@@@@@@@.@..@@@@@@@@..@@.@@@ +.@@@@.@@@@.@.@...@.@@@..@..@@@@@@@@.@.@..@.@..@@@@@.@..@@@@@@.@@@@@@@.@@@.@@@...@.@.@@@@@@.@@@...@.@..@@@@@.@..@..@.@..@@@@@@@@@@.@@@.@.@@. +@...@.@@@@@.@@@@@..@@.@@@.@@@@@..@@@@@@@@@@@...@@@@@@.....@@.@.@.@@@@@@@@..@@@@@@@@@@@@.@.....@@.@..@@@@.@...@@@@@@@@...@@@.@@@@.@@@@@@@... +.@.@..........@...@....@...@@.@@@@@@@.@@.@...@@.@..@@..@@@..@@@@...@@...@@@..@@..@@@@@.@@@@@@@.@...@@@@@@@@@@..@..@@@@@@.@.@@@@..@.@@@@@.@. +@@.@@@@.@@.@@@@.@@.@@@@.@@@.@.@@.@@@@@.@@@.@..@@@@@.@@@..@@..@@.@.@@...@@@....@@..@@..@.@@@...@@@@.@@...@..@@@@@..@@@@@@.@@.@.@@..@@.@.@@@@ +@@@@@....@....@@.@..@@@@...@...@@.@.@@@..@@@@.@..@.@@@@.@@@@..@.@.@.@@@@@..@@@@.@@....@.@.@.@..@..@@.@..@@@@@.@@@.@@@@@@@@.@@@@@@.@@@@.@@.@ +@.@....@..@@@@@@@.@@@.@.@@@@@.@.@@@.@@@@@@@@.@@@.@@@.@@@@.@.@..@.@@@@@@..@@.@..@@@.@.@@@@.@@@.@@@@..@@@@.@@@@@..@@@.@..@@@@.@.@@@@.@@@.@... +..@@@@@@@@...@@@@.@@.@@@..@@@@..@@.@@.@..@......@...@@....@@.@@@@@@.@@@@@@@@@@@..@@@.@.@@@@.@..@@.@.@@.@..@.@@@@@..@..@@@@@@.@.@.@.@@.@@@@@ +@.@....@.@@...@@@@@@.@@@@@.@@@@@@@@.@.@...@.@.@@@.@@@@@@......@...@.@@..@@.@@@@.....@@@@@@@...@@...@@@.@@.@@@@@@@@@@@@@.@@@@@@@.@@@@@@.@@@@ +@@@@.@@@@@@..@@.@@..@@.@..@.@..@@@@@@@@@@@....@.......@..@.@@.@@.@@@@@@@@@@.@@@@@@@..@..@@.@@@.@@.@.@@.@...@..@..@@@.@.@@@..@@@.@..@.@@@.@@ +@@@.@@.@@@..@@@.@@.@@.@@.@@@@@@@@@.@.@.@@@.@@.@@@...@@.@@....@@@@.@@..@@@@@@.@@@.@@@@@.@@....@@@@@@.@...@@.@.@@@.@@@@.@@@@...@@@@@@@.@@.@@@ +@.@@@@..@.@...@@@@@@@@@..@@@@@@@@@@@.@..@@@@@.@....@.@.@@@.@@.@...@.@.@@@@...@@@...@..@@@@@@@@@.@.@@..@@@@@@.@@.@...@@..@@.@@.@@@.@..@.@.@@ +.@@@.@.@@...@.@@@@@@@@@@.@@@@.@.@.@@@@@.@.@@@@@@@@@@@.@.@@@@@@@@@.@...@@@@.@@@@@.@...@@.@@.@@@@..@@@@@@@.@@@..@@@.@@.@@@@@.@@@@@@.@@@@@@..@ +@.@@.@@.@@@.@@@@@@.@@.@@.@.@@@.@@..@@.@.@@@@@.@@@@....@.@...@@@@.@.@..@@@.@@@.@.@.@.@.@...@.@@.@@@@.@@.@@..@.@@@@@@@.@.@..@.@@.@.@.@@.@@@@. +.@@..@..@@@@@@@@.@@@@@.@.@.@.@@@@@....@@..@@.@.@.@@@@@@.@..@..@.@@..@@@@@@.@..@.@@.@@@.@..@..@.@@.@@@@@@@.@@.@@@@.@..@.@@.@@@.@@.@@@.@.@..@ +.@@.@@@.@@....@@..@.@.@.@@@..@.@@@.@@@@@@.@@@@.@@@.@@.@@...@.@.@@@@@@..@..@.@.@@@@@@@@@...@@@..@.@..@..@@.@@@..@..@@@.@.@@@@@...@@@@@@@@@.@ +@@.@..@@@.@@...@@@@@..@@....@@@@@@@@@.@.@@@@.@...@.@@@..@@@@@@@@..@@@.@@..@.@@@..@@@@.@@@..@@@.....@...@.@.@..@.@.@@@@...@@@@.@@@@.@.@@@..@ +@@@@@.@@..@@@@.@@.@@.@.@@@@.@.@@@@@@.@@..@@..@@@...@.@@@@....@@.@.@..@.@@@...@@.@.@@@@@@@@.@.@@.@.@@.@@@@@..@@.@@@@@@@@..@.@@@@.@@.@@..@..@ +@@.....@@@@.@@.@.@@@@@@@@.@@@@@..@.@@...@.@@.@@@@@@@..@@.@@.@@@.@.@@.@@@@.@@@....@@@@..@@@.@.@..@@....@@@..@....@@.@.@..@.@@@@@@@@.@@@..@@. +.@.@@@@..@@@.@@.@.@@@.@@@@..@@@@@@@@@.@@@@.@@@@.@@@.@@@.@@@...@..@.@@...@@@@@..@@@.@@@..@@.@@@@.@@.@@@.@@@@@@@@.@.@...@.@.@@..@.@@@@..@@@@@ +@@..@.@.@@.@@@@@@@..@@@@.@@.@@@@..@@@.@@.@@@..@@@@.@.@@.@@@@.@@.@@@@@@@@@.@.@...@@@...@@@.@@...@@@@.@@.@@..@.@...@@@@@@@.@@@.@@@...@@@@.@@@ +..@.@@@@@@..@@..@.@@@@.@..@@@@....@....@.@@.@@.@..@.@@.@.@@@@@.@@@.@@@.@@@@@.@@@@.@@...@@@......@@.@@@.@.@@.@.@@@@@@@@.@@@.@@@@@@@@@@.@.@@. +@.@..@..@.@@@.@.@.@.@@@..@@..@@..@....@@@@@@.@@@@...@.@.@.@@@@@.@@@@@@@@@.@....@.@..@@@.@@@@.@@@.@@.@@@@@@.@@.@@@@@@@.@@@..@...@@@..@@...@@ +.@@@@@...@@.@.@@@@@@@@@@@@.@@@..@.@.@@@..@.@..@@..@.@@@.@@@@..@..@..@@.@.@@..@..@@.@...@@@@@@@.@@@@.@@..@.@@@@@@@@@.@@.@@@.@@.@@.@..@@@@@@@ +..@..@@@..@.....@.@@@@@@@@@@@.@.....@.@...@.@@@@@@@@@@@..@.@@@@..@.....@@.@.@@@@@@.@@@@..@.@.@@@@@@@@@...@.@@@.@@...@@.@.@@.@@...@@@@@@@@@@ +@...@@@.@.@@@.@.@@@..@...@@@@@@..@@.@.@@.@.@.@@...@.....@.@@@.@...@@@..@@@@@...@.@@.@.@@@.@@.@@@@@@.@@@@@@@@@.@@@@@.@.@@@..@.@@@@...@@@@@.. +@@@@@@.@@@.@....@.@.@.@@@@.@@.....@@.@..@..@@@@@@...@@..@@..@@@@@@@.@..@@.@..@.@@@@@@@@@..@.@@@.@@@.@@.@@@.@@@@...@......@.@@@.@@@@.@@@.@.. +@@@@.@@@...@@@@@@..@@.@.@@..@@@.@@.@@@...@......@@@.@@@@@@....@@@.@@.@@@@.@...@@@@@@@@.@@..@@.@@@@.@@@.@.@@@@@.@.@@.@.@...@@.@@@.@@@@@@@@@. +...@@.@@@@....@@..@.....@@.@@...@@@..@.@@.@@.@@@.@@@.@@@@.@@.@@@@.@@..@.@@.@..@@@@@@.@@@@@@@..@@@@@@.@@@@@@.@@@@@.@...@@@..@.@@@@@@@.@@@@@@ +@@.@.@.@.@.@@@@@@@@@@......@@@@@@@@@.@@..@@@@@@@@@@@.@@.@@@.@.@@....@.@..@@..@@@@..@@@....@@@..@.@@..@.@@@..@@.@.@@@...@@@@@@@@..@@.@@@.... +@@@@.@@@@@@@@@@@@@@@@@@@.@@.@@@@.@@@@.@@..@@.@@@@.@@.@@@@.@.@@.@.@@@@.@@.@@@@@...@...@@.@.@@@@...@@.@@.@@@...@.@...@.@@.@.@@.@@@@.@@@@@@@.@ +.@.@.@@@@@@@@@..@@.@@@@..@.@@.@@.@..@@..@@@@.@@@..@@@...@@@@.@.@@...@.@@@@@@@..@.@@.@@@@@.@@@@@@..@@@@..@@@@...@@....@@@@.@.@@@.@@..@.@@.@. +@@..@.@.@.@@@@@@.@@..@..@.@.@@@@@....@@@@.@@@@@@.@.@.@@..@@...@@.@..@@@.@.@@.@@@@@.@@.......@.@.@.@@..@.....@@.@@.@@@@..@@@.@.@@@@@.@@@.@@@ +.@@@..@..@@@@..@@@@@@.@...@.@..@@@.@@@.@@.@@@..@@@@.@@@@.@@....@@@.@@@@@@@@.@@@@.@@.@@@@@@@@@......@@.@@.@@@@.@.@@@@.@..@@.@.@.@@@@.@@@@@@. +.@@@@@@....@@.@..@.@@@@.@@@@@.@@@.@@@@.@@@@@@@@..@.@@@@.@@@@@@@@@@@@@..@@@@@@.@@@@@.@@.@@@@@@@@.@.@@.@@@@@.@@.@.@@@@@@@.@@@@@@.@.@@.@.@@@.@ +@@@@@...@@.@.@.@.@@@.@.@@@@.@..@....@@@@@@@.@...@@.@@..@@@..@@.@@@....@@@@@.@@.@.@..@..@@@.@@...@.@@@@@@.@@@@@@@..@...@.@.@.@.@@..@.@@@@@.. +....@@@@.@.@@..@@.@@.@@.@@@@@..@@.@.@@.@@@..@@.@.@@...@.@.@.@@.@@@@@@.@@@@@.@.@.@..@@@@@@.@@@.@@@.@.@@@@..@..@@.@@@..@@@@..@.@@@@@@@@@@.@@. +..@@.@@@@.@.@@@..@@...@@@@@@@.@..@@.@.@.@@@@@@.@@.@@@.@@.@@@@@..@.@@@...@@@@@.@@.@@.@@..@@@@@@...@@..@@...@@@@@@@@@@@@.@@.@@@@@@.@@.@@@@..@ +@@@..@@.@@@@@...@...@@@@@.@@...@.@@@@..@@.@.@.@.@@.@@@@@@@..@@@@.@@@@.@@@@@..@@.@.@.@.@@@.@..@.@@@@@@@@@@.@.@.@@@@@@@@@.@@@@@.@@.@.@@@.@.@. +@@@.@@..@...@@.@.@@@.@@.@@@@.@@@@@...@@..@@@@.@..@@.@@@@..@@@.@.@.@..@@.@@@@@@.@.@@@.@@.@@@@@.@@@@@@@@.@...@@.@@@@.@.@@@.@@@@..@@@@@.@@..@@ +@@...@@.@.@@.@@@.@..@.@@@@@.@.@@@.@@@@@@.@@.@.@@@@@.@@@@@.@@@@@@.@@@@....@..@....@@@..@.@.@@@@@.@@@@@@@@@@@.@@@@@@@@.@@.@@..@..@@@@@..@..@@ +@..@@@.@.@.@@.@@@.@@@@@.@@@.@@@@.@@.@.@@.@@@@@@@.@@@...@@.@@@@@@.@@@.@..@@@@@@.@@....@.@@@@@@@..@..@@.@@@.@@@@@.@@@@.@@@@@.@.@@@.@.@.@.@.@. +@@@.@@..@@@@.@.@..@@.@@..@@..@@.@.@@.@.@@.@..@@@.@@@@.@..@.@..@@@@@@@.@@@@@@@@@@..@@@.@@.@@..@.@..@.@@@@@@@.@@@.@.@@@.@.....@.@..@@@@@@...@ +@..@.@..@@@@@...@@...@..@@..@@.@..@@@@.@..@@..@@@@..@@@.@@...@.@@@@@@@@....@@@.@@@@@@@@@@@@@.....@@..@@@@@@@@@@.@@@@@@@@.@@@@@@...@@..@@@@. +@.@@.@.@.@.@..@@@.@@...@@@..@.@@.@@@@@......@@@@@.@@.@@@@@@..@@...@...@..@@.@@.@@..@@.@@.@@.@@.@@@@@@.@@@..@@.@@@@@@@@@.@.@.@@@@.@@@@@@.@@@ +..@@@@@@.@...@..@@@@@@@@@.@@@@@...@@@@@@@@@@@@.@.@@..@.@@@....@@@.@..@@@@@@@@@@.@@.@@@@.@.@@.@.@@@@@@.@@@@..@.@@@..@@@@.@@@@@@@@@..@@@@@.@@ +@@@@@@.@@@.@@.@..@@.@..@.@.@.@@.@@@@@@...@..@@.@.@@@@.@.@@@..@.@@..@.@@@...@@@...@.@.@@.....@@.@..@@@@.@@..@@.@@@@@@@..@.....@@@.@.@@@@..@@ +.@@....@.@.....@.@@@@....@@@..@...@@@@@@.@@@@.@@@.@@.@@@..@@.@@@.@.@...@@@.@.@@.@.@.@@@..@@@@@.@@@@@@@@@.@@.@.@@.@.@@.@@..@.@@@@.@@@@@@@@@@ +@.@@@@@@@.@@@@@.@..@@@@@@.....@..@@@@@.@@@.@@@.@@@@.@..@@.@@@..@@@.@@@@@.@@@@@@.@@..@@.@..@@@@@@@@@@@@.@@.@@.@@@..@@.@@@@..@@.@@@@@@@@@.@.. +@@.@@.@.@@@@..@@@@.@@@@@@@@...@@@@..@@..@.@@.@@@@@@@@.@.@@@@.@@@..@@@@@@.@@@@@.@@.@@.@....@@@@@@..@@@@.@@@@.....@@...@@.@@.@@@.@@@@.@@@.@.@ +.@@@.@@@@@@.@.@.@@@.@.@.@..@@.@.@@@.@@@@@@@@@..@@.@.@@@@@@@@.@.@.@.@@.@@..@@...@.@@@@@@@.@.@@.@.@@.@..@@@..@@.@.@@@.@@..@@@@@@@@.@@@@@.@@@@ +.@@.@@@.@@@.@@@..@@.@@..@@..@@@.@.@@....@@..@..@@@@@@@@@@@.@@@.@.@@@@..@@.@.@@@@@@@@@..@.@.@@@@@@...@@@@.@..@@.@.@.@@@@@.@..@@@@@@..@...@@@ +.@@@@.@@@@@@@@.@@.@@@@@..@@@@.@.@@@...@@@.@@@..@@@@@@@@.@.@@@.@@.@@@.@@@@@@@@@.@..@.@.@@..@@@@...@@..@@.@..@.@@@@..@@@@@@..@@@....@.@@@@.@@ +.@@.@..@.@..@.@@@@@@@@.@@@@@@@@@@..@@...@..@@.@@.@@@.@..@..@@.@@@@@@.@.@.@@.@@@.@@...@@@@@@@@@..@@@@@...@.@@@@..@@@.@.@.@.@@@@..@@@@@.@@..@ +@@@.@@@.@.@@.@@@@.@.@@@.@@@@@@.@@@@.....@@@@@..@@@...@.@@@..@@@@.@@..@@@.@@@..@@@@..@@.@@.@..@@.@@..@.@@@@@.@@@@.@@....@@@@@@@@.@@@@@.@.@.. +@@...@@@@@@@@@@@@@..@.@@@..@@@@@@@@@@.@@.@..@.@@@@...@.@..@@@.@@.@.@.@@@@@@@.@..@@.@@..@@@@@@@@@@@.@.@@@@@.@@@@@.@@@@..@@..@.@@@@.@@@@@...@ +.@@@@.@..@@@.@@@.@@@@...@@@.@@@....@@.@@@@@@@..@.@.....@.@@@...@@@@@@@..@@@.@.@@@@.@..@@@.@.@.@@@@@@@..@@@@@..@.@@@@.@@@@@.@.@@.@@.@@@@.@.. +@@@..@@@@.@@@@..@@..@@@@@..@.@.@.@...@.@@.@@@..@@.@.@@@@@@@.@@@@...@@..@@..@@@.@..@@@.@.@@@@.@.@@@@@@@@.....@@.@@@@@..@@@@@@....@@@.@@@@@@. +@@.@@@@@@@@@..@@@.@.@.@..@..@.@..@@@..@@..@.@@@@.@@@@@@@@@@@@@@@.@..@@@@@@@@@@@@.@@@@.@@...@@@.@@.@@.@@@@@@.@@@@..@...@.@@@@@.@.@.@@@@@@@@. +.@.@@@.@@.@@..@@.@.@...@.@.@@..@..@@@..@@@@.@@@..@@@..@.@.@.@.@@@@@@@@@@....@@.@@@@.@@@@@@..@@@..@@@.@@@@..@..@@@.@@@@@@@.@.@.@@@@@@@@...@. +.@....@.@.@@@@@.@@@@.@@@.@..@...@@@.@@.@@..@.@@@@@@@@.@.@.@@.@.@@..@@..@.@...@@@@@.@@@@@..@@.@@@.@@@@..@@.@@@@@@.@....@@@@@@@@@@@.....@@.@@ +@..@@.@@@@@@@@@.@@@.@..@@@@.@@@@@.@.@@.@.@@@@@..@@@.@@.@@@..@.@.@@@...@.@.@@@..@@@@@@@@@..@.@@@@.@@.@@@@@@@@..@@.@.@@@....@@@@@@..@.@...@@@ +.@@@@@..@@@.@..@@@.@@@.@.@@.@@.@@.@...@.@.@@..@@@@@@@...@@..@@@@@@@.@@@..@..@.@@@..@@@@@@.@@@@..@.@@@@@@@@@@@@.@.@@.@@@.@@@.@@.@.@.@.@.@@@. +@@@@@..@...@@@...@@@.@.@@@@...@..@@@@@@@@..@@...@.@.@@@@@.@@@@.@@@.@@@@@..@@@...@.@@@@@@@@.@@.@@@...@@@@@@.@@@@@.@@@@@@@.@@.@.@@.@@@..@@@@@ +@..@.@@.@@@@@.@@.@@...@@@.@@@....@...@..@..@.@@@@.@@@@@@@@@.@.@@@@@@@@..@@@@@@..@..@.@@..@@@.@@...@.@.@.@..@@..@@@@.@.@.@..@@.@@.@.@@@@@@@@ +@@.@.@.@@@@....@.@@@@.@@@..@.@@@.@.@@.@@..@@.@@@.@...@.@@@@@@@@@..@..@@@@@@@.@...@@@..@@@..@..@@..@@@@@@...@.@@.@@@@@..@@@@@@.@@@@@.@@@@@@. +@@..@@@@@@.@..@.@.@@@@.@@@@@.@@@.@@@@@@@.@@@@@....@@.@@..@@@@@@@@@...@.@@@.@@@.@@.@@@@.@..@.@.@.@@@@@.@@@@...@.@@@@@@.@.@@.@@@@@..@@@@@.@@@ +.@..@@@.@..@.@.@...@@@@@.@@@@.@@@@@@@@@@@.@@.@@@@@.@@.@@.@@@.@@@.@...@.@@@@@@@.@.@@@@.@@@@@@@@@@@@...@@@@.@@.@@@@@@@.@@.@@@.@.@@.@@@.@@@@@@ +@@@@.@@@@.@@@@@@@@@@.@@@@@...@.@@@@@.@@@@@@@@@.@@@..@...@@...@@@.@..@@@..@.@@.@@@@.@@@@.@@@@@@@@@.@@@@@@.@@@.@.@@@.@@.@.@..@@@@.@..@@@..@@@ +....@..@@.@.@...@@@@@@..@@.@@.@@..@@@..@@..@@.@..@@@@.@@@.@@@@@.@@.@@..@..@@..@@@@@..@.@@@@@@@@..@.@@..@@@@..@@@@..@@...@...@.@..@@@@@@@@.. +@@..@@@@.@@.....@.@@@@..@.@@..@@@.@@@@@@@@@@@@@@.@@@@.@@@@.@@.@@.@@@@@.@@.@..@@.@......@@@.@@@..@@@@@@@@@@.@.@@...@@@@@@@@.@.@@.@@@@@.@@@@. +@@@..@.@@.@@@@.....@@@.@.@@@.@@@.@....@@@@.@.@.@@@..@@@.@@.@@@.@@.@.@@..@@@@@.@.@@..@.@.@...@@@.@.@.@@@@.@@.@@@.@@..@..@@@.@.@@.@@..@..@@@. +..@@.@@@@@@@@.@.@@..@..@@@..@..@@@..@.....@@@@..@@@.@@.@@@.@@@....@@.@.@@....@@@@@@.@@@.@@@.@@@.@@@.@@@@@@@.@@....@@@@..@.@....@@@@.@..@@@@ +@..@.@@.@@.@.@@@.....@.@@@@.@.@@.@@..@@@@.@..@@@@@@.@@@@@.@@@@..@@@@@@@@@@@@@.@.@.@@@.@.@@@@@@@@.@.@@@@.@@@.@@@@@.@@@@@@..@@@@@..@.@.@@@@@@ +@@@@@..@@@..@@@@@@.@@@.@.@.@@@..@@@@@@@.@@....@@@@@@@..@@..@..@@.@@@@@.@.@@@....@@@@@@.....@....@@.@@@@.@@@.@@@@.@@@@.@@@@@@..@@.@@...@@@.@ +.@....@@.@.@..@.@.@@@@@@@@@.@@.@@@.@...@.....@@.@@...@@@@@@@..@.@@@@@.@@.@@@@@@@.@@..@.@@@.@.@@@.@@@@@@.@@..@@@.@@..@@@.@@@.@.@@...@@@@..@. +@..@@@@@@@@.@@@.@@@@.@..@.@@@.@@@@..@@.@@@@.@@.@@@.@@@@@@@@.@@@..@@..@@@@@.@@.@.@@.@.@@@.@@@.@@.@.@@@@....@@@..@.@@.@.@.@@@.@@@@@@@@@.@@@@@ +.@@@.@@@.@@@@.@.@@@@@@@.@.@@@@@@@.@@@@@@.@@.@@@.@@.@.@.@@@@@@...@@@@@.@@@@....@.@@@@@..@.@@@@@@@@@.@.@@.@.@@...@.@.....@@.@@@@@@@..@@@.@.@. +@@@@..@@@.@@@.@@@@@@@@@.@@.@@..@.@@.@@...@@.@@@.@@.@@..@@..@@@@.@@.@@@@@@@@@.@.@@@@@@.@@@@..@..@@..@@@.@@.@@@@@@.@@@@.@.@.@@@@@@@@@....@@.@ +@@@.@@@@@@.@@....@@@@@@@@@@@@@@.@@@@@@.@@@@.@.@.@@@@.@@@..@@.@@...@@@@@.@@@@@..@....@@@....@@.@@.@...@.@@@.@@...@@.@@@@.@@@@.@..@.@@@@@@@.. +@@@.@@..@..@.@@@@.@@@@@@@.@@@@@.@..@@.@@@@.@@@@.@.@@.@.@@@.@@@..@@@..@@@@...@@.@@@@.@@@@@..@.@@@@@@.@@@.......@@@@.@@@@@..@@..@@@@@..@@@@@@ +@@.@@@@..@.@..@..@.@.@.@.@@@@@...@.@.@.@.@....@.@@.@@@.@.@@@@@@...@.@@@.@@@@@@@.@@@.@@@@.@....@@@.@.@@.@.@@@@@..@@@@@@....@@@..@@.@....@@@@ +@@.@@@@@@.@@.@@@.@.@@@.@..@@@..@@.@@.@@..@@@.@@@.@@..@@@@@@@.@@.@.@..@@@@@@@@.@@@@@...@@.@@@..@.@@@@@@.@@@...@.@.@.@@@..@.@@...@@@@..@@@@@. +.@.@.@..@@@@@@@@.@.@@..@..@@..@@@.@.@.@@.@@.@@@@@@..@.@@.@..@.@@@.@.@@@.@@@@@.@.@@@@.@.@@...@.@@@..@@@@..@.@@@.@.@.@@..@@@@@@.@@@@..@.@@@@@ +.@@.@.@@@@@@.@..@@@@@@.@@@@.@.....@@@@@@.@@..@.@@@..@@..@@@@.@.@.@@.@..@.@@@@.@@@@@.@@..@@@.@..@...@@@@@@@..@@.@@@.@@@@@.@@.@.@@@@@.@@@@..@ +..@.@..@@.@@.@@@@@@@..@.@...@..@@@...@@@.@@@@....@@@@....@@@@@@@.@.@@.@@@@@@.@@.@@...@@@@..@.@..@.@@@@@.@@..@@@.@@@@..@@@.@@@@..@@.@.@..@@. +@.@@@@@@@@@.@@@@..@.@.@@@@..@@..@@@@.@@@@@..@@...@@@@..@.@....@.@@.@.@@.@.@.@.@@@@@@.@@.@....@.@.@..@@@.@..@@@@.@@@@@.@.@.@@@.@.@.@.@..@@@@ +@.@@@@.@...@@@.@@..@.@@.@@@...@..@@.@@@@@@@@.@@@@@.@.@..@..@.@@@.@...@@@.@@..@.@..@.@@@...@@@@@@@@@@@@..@@@@@@..@@@..@@@.@.@@@..@@@@@.@.@@@ +.@@@@@@.@....@.@..@@@@@.@.@@.@@@.@@@@..@.@.@.@.@.@...@.@@.@@@@..@@@@@.@@.@..@@@@@@.@.@@@@@@@@@@@.@..@.@@..@.@@@@@@.@@@.@@.@@@@@.@.@..@.@@.. +@@.@@@.@.@@@@@..@.@@@@@@.@@.@.@@@..@@@@@@@.@@@@..@@@@@.@..@.@.@..@.@@@@@.@.@@.@.@@@@@@@...@..@.@.@@..@@..@@@@@.@.@@@@.@@..@@@...@.@.@.@@.@@ +@@@@@@@@.@..@.@@.@..@@@....@....@..@@@.@@@@.@@@..@@@@@@@..@.@@@@@.@.@@..@@@..@@.@@@@.@.@@@.@@.@@@@@@..@.@@.@..@.@@.@@.@@@@.@...@@@@....@@.@ +.@@@@@..@....@@@@...@@@.@.@.@@@@.@@..@.@@..@@@@..@.@@@@@@@@@.@..@.@@@@.@@@@@.@@@.@.@@@..@@...@.@.@..@@@.@@.@..@@.@@@.@@.@@.@@@@.@@..@@@@@@. +.@@@..@@@@@@@....@@@@.@@@@@.@@@@@@@.@@@@@.@@.@@@@.@.@.@@.@@@@..@@.@......@@@@.@@@@....@@.@@@.@.@@.@@@@@@.@@@@@.@.@@...@@.@@.@...@@@..@@@@.. diff --git a/src/main/resources/eu/sim642/adventofcode2025/day5.txt b/src/main/resources/eu/sim642/adventofcode2025/day5.txt new file mode 100644 index 00000000..5fc98137 --- /dev/null +++ b/src/main/resources/eu/sim642/adventofcode2025/day5.txt @@ -0,0 +1,1183 @@ +169486974574545-170251643963353 +350457710225863-350888576149828 +412668022187283-420338049796469 +83592398782322-86848354888786 +543631433070278-550047239522393 +54642106271472-55339277279689 +53411401957158-54202606041934 +161774338930928-162461408006849 +230409669398989-230409669398989 +11394209724752-16043466617348 +265838296793488-267797579010038 +333958375901986-340440511082582 +365878561655587-367060734788885 +206173623518495-208892725730242 +283627389269124-287511159291116 +153365292360184-156019673771099 +75536984781079-77165727327975 +1619411001861-7121891284565 +481329981942543-482000629244722 +464553468357734-471131581665134 +432458385573270-435515334151023 +70448752368732-72110305170811 +347882670820002-348212468442938 +72545735761667-73944254348695 +25337145734852-27963159368492 +350677402162432-351380994452023 +546416799583850-550851120598346 +272929947013386-280747977038405 +200502607169613-200502607169613 +475873361991877-476277337247539 +342101939844008-342852058158447 +486239490794954-490237517599172 +222455214858287-230409669398988 +474010097524065-474827654040207 +53411401957158-54202606041934 +360113865157894-360113865157894 +480910238254220-481329981942543 +516174197223468-518816402892832 +201659428112760-204121615094505 +57717408554543-58122407961906 +395911803566308-399327053790244 +508868788402312-508868788402312 +368405259282444-370023111163741 +314516326843655-317549268809184 +162232350328601-162461408006849 +559686803138542-559686803138542 +103338608596923-107554094171651 +32913975686374-39732989816222 +523901130815537-530703460706557 +32913975686374-35290859827001 +364003029454290-365324584461110 +477889387261903-478118316872151 +20806909809692-27963159368492 +345837526507522-346164565414866 +51740513080594-52409085527159 +303484971907692-308412681226401 +183906237377184-187976347273481 +384706908852909-390346194454490 +57852974455319-58122407961906 +168689784685610-169356995569703 +54886545352890-55257966550262 +349114039096987-349487320391028 +146788372377156-149108300248003 +362928567972307-364510430479176 +427408359544251-430040269311236 +167568672967860-168207345342844 +348440577989652-348894196644023 +43208227708230-49758804908205 +367769727274544-369109029982678 +516174197223467-516174197223467 +405856375959476-408496944374436 +347882670820002-348440577989652 +274598539023818-276871897377653 +235424258744543-238506621244425 +172630392640057-172630392640057 +208050863272740-210361053323478 +192237219410593-200502607169613 +134729473420702-139983892386141 +474010097524065-474305905223759 +73508267403983-75291144718480 +477087245968109-477889387261903 +345837526507522-346478567624106 +62613903146308-62613903146308 +86848354888786-86848354888786 +126394728062228-129522049716478 +412668022187283-420338049796469 +283627389269124-289921833430318 +342401173107874-343162908583358 +241750786712108-250182753568904 +247240895255314-250182753568904 +476651753875225-476960040171256 +345148890039103-345455454180186 +167772840329548-167985941724660 +494234352071136-497303892670947 +473347411356836-474010097524065 +59397707463417-59966343820842 +153365292360184-157936077085284 +324686108322897-329753102093113 +52946002321587-53411401957158 +533445638590445-540186367605755 +292298385683753-295792444429555 +57717408554543-58122407961906 +314516326843654-314516326843654 +55849580681255-56357141651164 +231698593106163-235424258744542 +434256671568972-436538941154228 +439104555586761-441593495703514 +384706908852909-384706908852909 +164762330697985-164969667575089 +362276900056335-363670143941921 +366541882302880-368122635566150 +11394209724752-16043466617348 +343999514461259-344509033218459 +203436319276917-205640943197084 +349637919178361-350026632310006 +52640081604997-53117523372446 +503203389229978-508868788402311 +92989145845687-96524214733722 +163044740996218-163240511195133 +76752836650791-78123362707607 +123455758474555-126394728062227 +101424352095858-110086771279740 +525619552424679-528959977856256 +183906237377183-183906237377183 +554074836948068-559686803138542 +77779604315574-79158148059598 +141205463388944-146788372377154 +370452833833991-371897898223566 +49758804908206-49758804908206 +374114511950407-377644029616368 +494234352071136-501863783760968 +478600117928393-478824710671111 +172630392640057-179520209905481 +423465253017527-427408359544249 +78635312190451-80232475910069 +377644029616369-379811872274849 +355131858666440-360113865157894 +475033176088839-475649812150129 +254798182447389-259910083230244 +58995278820687-59397707463417 +112810316106639-116323918708015 +345737380640930-345837526507522 +116323918708017-119144923116978 +212623125402992-220123949658034 +348440577989652-349114039096987 +484679585430218-486239490794953 +538678075001302-540186367605755 +130987447947074-137332783042981 +62613903146308-65939644438015 +403504575059351-410013419146208 +364943267837974-366372560110142 +481108061072351-481329981942543 +437720846119634-440454991965740 +71584582295120-72963896717108 +472513591299362-472918717631593 +464553468357734-464553468357734 +392482661906061-399327053790244 +74524649575795-76267967421178 +168207345342844-168583893783486 +477087245968109-477279401948376 +55849580681255-56751399357064 +436347159101619-438410653267442 +51298814197636-52196252110091 +163044740996218-163633550337293 +342770680395427-342852058158447 +1619411001860-1619411001860 +454830743926318-461227564607971 +204512289107481-207201836850737 +295792444429557-300642043871836 +167985941724660-168583893783486 +480910238254220-481695161883099 +265838296793488-267797579010038 +478600117928393-479038689890985 +454830743926318-461227564607971 +51298814197636-51740513080594 +369404546102670-370868390469186 +345837526507522-346164565414866 +304645312705932-310580105808502 +251935678435015-257633285751739 +329753102093114-329753102093114 +443500959989085-451450465997509 +51298814197636-52196252110091 + +166774327825644 +91047458369966 +404952508284339 +378520907949428 +325621911145521 +268242101107817 +546085944803731 +454899401278924 +88862938669386 +496100464432050 +289057181519769 +90727792836649 +337288198669145 +429094156122272 +343633512916410 +92886236123125 +378139567233455 +439641576767616 +247301227994645 +68713748805875 +208716676008021 +497074374734370 +559885823894181 +492095693832264 +554963120377769 +443896984163009 +206006923989321 +483032749206065 +47577646102574 +292521463036307 +216230717404539 +448739194445012 +442035479231881 +519714926322577 +403713656861498 +374756451523046 +478314416927106 +377836316243415 +498772052463351 +333022116865348 +135692758943211 +294037907597476 +263323517435128 +440825739263296 +434995455366622 +337212881252755 +146153984473380 +448601868945693 +408100845362893 +35583521113278 +225403433549332 +317696241596672 +312014019668924 +362115200307652 +554760333330106 +154282704810251 +438959797352439 +319452260444851 +473156766088282 +198403531998350 +504423873956916 +429367609375118 +126266607271906 +26674090809762 +530017595777797 +77956466007652 +143490545051443 +250510694180056 +326130853845873 +205070489620183 +147090705023854 +204182443095809 +288679101880747 +243801389965051 +182008355369256 +45128892324888 +476607297358048 +531771182080436 +73516497016098 +316726833468449 +362906532335825 +435314854551601 +290974906905504 +157230439564388 +86563221570145 +24063423156372 +43581070629947 +427217170097429 +395299379557797 +544551981061231 +15205854665320 +53234016286885 +399136093173212 +292094746756200 +491175189160611 +199251817787429 +111086427066885 +471998625163919 +273174678462782 +490995373871544 +34898033068500 +229275663034833 +419334245035424 +41965901830193 +407830580606630 +27502544185036 +156565938081564 +514048184413057 +521744695790109 +141491285324069 +392325069875868 +510980130947114 +174723942867829 +556352074108761 +43427842503161 +146696161286344 +104746357885859 +15275765849861 +281559681026688 +429139225151741 +396910615804192 +442408317235005 +132772453136679 +155135334989459 +200470713530827 +220689700977119 +168334134153744 +157503332651641 +149663209145269 +343632254653643 +497528664863277 +106690107773611 +34099564590700 +448413992513436 +475520911454283 +301687971625084 +9980454276181 +240111072470395 +37340591261478 +288852137211212 +475298931312112 +214515170796338 +500110784985138 +515633106108978 +544761044008642 +112006257449342 +342516445985685 +73401353536885 +123678078844082 +206016682334723 +485144331084789 +90165056085394 +77579052160686 +499840743815185 +237563103284284 +139759202638467 +162227122680255 +113057027572568 +438666695332958 +158470826981849 +535518691265400 +254227700432454 +253825750937685 +560330325476428 +154600147802843 +549790739569034 +289873164396695 +539498241340336 +547087343925695 +426793043068177 +69406275853236 +14173153440243 +306613204257181 +335628041490725 +77668534832095 +408856705538595 +52257595224282 +378047409571086 +139108263947637 +484991719095291 +493284067026758 +142677908005147 +63970767087445 +546284579954929 +336645727455680 +92019100262899 +13529714907659 +222144029068424 +545536837640330 +428432432029515 +459840949966208 +447710485749632 +498615999177888 +130650784933857 +33555847493984 +449331183743590 +488515663620787 +553075138140193 +61441497652823 +153914238077790 +496362331734422 +314346491893291 +440155676882947 +379905912125002 +99554008377065 +45081920765806 +505235190993142 +306393771255886 +319907372816476 +277228163816061 +400768808830359 +510582755621519 +4194290219194 +481101819993467 +523353832646727 +205765537357831 +343468690986522 +131578423633226 +434673084239015 +371766027051303 +144329935374669 +139437541951224 +465802130555913 +167902011625254 +72057652886449 +347437328991353 +263451819863886 +192977391964026 +492929013900137 +154794338298037 +522652226020058 +554923432030486 +519919555270186 +249518239643285 +358970107775753 +80413199256712 +275594334714499 +553421607746393 +98275619718110 +302825984544905 +174717141496020 +230288973137562 +292589182404411 +505687418573659 +349247528804259 +20293692905023 +240453445858027 +224257842516546 +304130767608387 +304907136037024 +408166394354772 +103523839764491 +73232136461566 +140468463705508 +311772003245493 +331790724794140 +93708199162906 +162580150832440 +449460000094559 +277197897984645 +205763891375110 +19084635772736 +496419186274794 +470727201928223 +485281849665196 +552053076054079 +431468704048245 +76281897291 +349523959877693 +270456878893079 +111101684122584 +465800898958960 +322283852128561 +455213177508997 +247665311665579 +500922881756589 +219524289499707 +115323986356921 +37301704048791 +377657381382923 +399245034825861 +399137551109704 +285052077702242 +175745328787311 +245041458958184 +35936598644078 +547099513362520 +359611859652486 +204033001215851 +29342247975471 +39126462245283 +443969245402798 +347385388155441 +109989290386312 +153901115627129 +402919114061017 +286247392087343 +328624943744608 +236904877535583 +523236113372747 +434675877307776 +27674435121456 +378216883223033 +282898606567911 +56026201149263 +464544460566619 +248276994486089 +273492366150243 +171087374795861 +405435698757553 +468944442788875 +7049732367352 +376735622849138 +465012318485387 +198100033101471 +285562486089743 +386344157741757 +211071073318516 +271557956243230 +316094793010015 +526573252229373 +150383520289242 +353008308480241 +33123570103319 +453952884356644 +366157930303720 +397812086863838 +124217788847844 +105934191361195 +49745618863657 +122008798112999 +285249575332918 +239025960707951 +191925873999393 +511321770610334 +198592227375691 +172719309600276 +303636693797816 +400470943462252 +525625440685246 +202232306722844 +304151285095384 +358632108681359 +32705945457149 +429740280260146 +130138390342090 +206605674498611 +483121948365376 +250510040752339 +351921064694049 +535953664899745 +158982805815737 +266481019547471 +231185500366155 +375457642508105 +379254716521887 +522704569941592 +253921764244290 +376581066623112 +482448004328873 +92897693882413 +308082658112356 +134926238563825 +552017602142312 +499186706253637 +228968019568939 +552698362888668 +413972746049689 +184067938318774 +235837199222396 +496246484173299 +531756589501261 +480286521324801 +376794227331873 +526362702872444 +252465295891886 +66438065687693 +523692313003135 +75474495675861 +407087658568321 +299103592741349 +489933891930451 +469566832122542 +236585411136668 +385792759141446 +199862910462477 +204234857664791 +436025855142507 +447086196413929 +474562365525964 +104199028836605 +559091073788308 +550823053762154 +12554729643032 +458024648847184 +529809193948024 +230755709261846 +515708781882909 +430686836417890 +427022962074744 +10344169433954 +529600667662099 +314031716058590 +380415441188599 +80735780063370 +147995713700406 +300154675727708 +254100597066464 +419430042425209 +347898083694759 +249982748292502 +131591948140352 +198961066256750 +254064651718220 +294549907082315 +355855335549975 +39095550579264 +215057752113540 +198911085823360 +105315096195198 +96911775053522 +9752114023042 +119608753327095 +352109210076272 +299660081952358 +221342243195663 +449827754968231 +93161124128574 +90560460067988 +496820623206224 +399035515487329 +467039225296969 +226205475803100 +406250706063702 +161376090137496 +466642236986406 +87720858451453 +539998160378913 +474240741925151 +277488291971913 +450850530532280 +482580184705728 +15178409260792 +369966906873577 +400180173996328 +545520527368074 +554039014929435 +120288590508287 +480499899695046 +30680680513644 +395953882351651 +331163443172107 +538320803328506 +133848213353087 +145447720285170 +530096349236746 +135712192178712 +172660263989807 +310646583405735 +150976892032270 +80303563356605 +72150987366375 +109574604058464 +332565509676132 +157262606965695 +536137192446697 +142574755052471 +547002315544389 +325580540545510 +511807714132532 +63170811304147 +238171943106505 +32278044680851 +179196591322316 +60476845998806 +284676411075326 +389916634471871 +283424058473505 +35677745835226 +159735707193319 +165751606408001 +495282293549472 +236887629497311 +357049330901689 +446024442218974 +330289464969167 +261767824871893 +547134171577378 +271894738315108 +464445794485769 +283707594225371 +253194669396361 +325228375230067 +100167990043675 +327074956674009 +347177664977676 +372780048698071 +219800585406824 +498885421047630 +512193212681227 +136278702175098 +465930952499220 +494968478723722 +518730224649751 +341718847619297 +369179893782034 +18121280125790 +502047998998948 +484247612508853 +243685163913354 +173885282196723 +454559310285359 +222481381853756 +36481973632734 +116568229233070 +200682472235708 +367381773923936 +318140580419192 +112746752748157 +194425586115078 +139920342874717 +477854212858029 +212782546089078 +411702881636276 +54614831725181 +119613230049112 +107957548533008 +306551673436599 +549081498723393 +548626856154576 +160349494359209 +324318282735730 +386448067125454 +27300210555086 +514902811407797 +108516545097433 +533882495640448 +12389113182564 +196435848198080 +200386570578615 +327994991203546 +224990930591296 +207258895819722 +468283840902024 +465322974978643 +417331553592809 +267062196670485 +534882878531783 +485795748442565 +124686049206296 +122417371941044 +179677582114325 +355648713774809 +456775682757418 +455875269976321 +201520187565331 +313468690853343 +388607312186246 +407880900356278 +505910380417316 +521668910461157 +302438493660595 +68632453018008 +216516287566682 +220153010370991 +170743111358423 +476602833583011 +136714925539866 +138542773800608 +247937496976447 +544572691111046 +422461680747741 +495972631659052 +396257346899195 +165858869725569 +184036350334348 +114816205868801 +468919534915319 +359698785498507 +132331751780775 +239718654581434 +50834178782395 +161964306160464 +31349446995438 +169847193913893 +554036884459619 +70888025693166 +467980930193560 +87169550705955 +352889260590027 +207006180941867 +101192316051676 +418316979509841 +275255999278932 +500211864880517 +247683565035233 +358000736149919 +179092401762171 +262295061294554 +462291069839473 +362219924628579 +35584727855687 +495689617672703 +321096712807163 +156364174620707 +437031146558623 +446679647768106 +184440728802140 +179356086860912 +306891786124622 +268358471924233 +365713738595080 +252110336879163 +521753426679053 +142089571248901 +233364018812935 +370243133281741 +432653663089468 +532163582734910 +245359058488424 +298473508335275 +14031841956723 +57758508231202 +276785474301686 +387031828270953 +418561042543787 +226025352024472 +168616632323375 +311324670253932 +547033628524340 +337858669245797 +378941433166064 +434546414339480 +78370809294330 +102398932025390 +27462225362802 +271644860641047 +59211680553870 +374355924515856 +494149562346856 +213796833170602 +128135299204247 +84211937157469 +107789712965090 +315004087428381 +178674310012579 +94222198781966 +501454541701207 +365333830515032 +16161431876644 +224979397972164 +421498139560827 +412437440049979 +209121212751838 +293402144169905 +58518948754701 +61064684714537 +263104024059027 +415830606177897 +116101661231073 +287296300703319 +493171466545647 +384809141661398 +366268084709017 +5818563609451 +120385781854262 +205173946461332 +54227022193045 +113669352148263 +104280079340054 +238631636388913 +515441396296070 +159206962175763 +302525814386414 +339164299598453 +409578249037337 +70028767566230 +551246401580664 +90986719623993 +239400067544876 +443230144976513 +186795213046561 +140231198077831 +368739361751067 +452456527289621 +171671532434000 +30931652757817 +416957992048482 +463069395875833 +253755350992279 +349965935700429 +133749783233188 +180340731313778 +33363980680018 +374134294864507 +428936219872049 +206504381518276 +242106673977763 +78473546271018 +406533910239398 +348365497824643 +422545173570195 +385468965921062 +389459883982367 +274101373507453 +459134086881060 +260614137764036 +432619487732863 +75943978969609 +505570839641777 +444169632072478 +312730304789069 +197557319636041 +543647435965560 +408265085050905 +281586696861111 +171123135278775 +169177863584715 +135874101403130 +209377109419580 +256271393941940 +70452063565247 +250769496553007 +223944217959492 +108632638730605 +451964402873132 +339383738439337 +314755936046586 +251717159170970 +414342097829544 +49274921382019 +440343085052918 +272517019507874 +503487049856713 +304083032446976 +9836321621803 +557853443983096 +386806299514432 +230379467150045 +232023573717795 +274489679300692 +401325353109711 +344716266688317 +479400650716478 +123206571735690 +384655568576539 +219773398158939 +31295584853941 +143433803077974 +7561633804086 +85756695376827 +398284723132607 +26623728524409 +83183595817576 +286957840183868 +120636608165605 +357724055042151 +469680621960771 +384067541851018 +405289416687099 +410808664927062 +238794187284823 +414890307360090 +196104637822439 +127544444499349 +221984070862241 +132518041974535 +112940565231543 +265275705436390 +479025893934810 +314505867497367 +496263702544464 +148143576830654 +115376626359323 +557691219367239 +45905454760957 +524675720827548 +22064684741843 +252994432278803 +517397261955144 +452871657432505 +337201911451932 +88763534103445 +173676858500472 +348768711387613 +138471044229711 +95399248614045 +68285619776492 +318457822556018 +525105694589579 +517805457516633 +378989018882559 +368298292538616 +458658561435518 +207422464400509 +181866569133454 +525640297406461 +129229881420908 +51717759679443 +166092571951220 +256408042663479 +275292791989704 +118319831731504 +5633133708006 +194395191717822 +310435849658461 +463025478328394 +527077985492674 +21106581449621 +523549300613533 +398214390451437 +171025532583124 +213138707290654 +326653422501064 +477914754170203 +267571570824864 +46626246940772 +476735477541776 +145035252872093 +187916186413891 +371693525502994 +168673863508163 +346959319988017 +454491121936793 +217885984189970 +299221157582395 +164810512090946 +212519092200144 +189755604591660 +86785344019253 +123692871131037 +275273479722087 +172201699513478 +307100655626988 +8429324160009 +11688874902984 +93429701044828 +87505554320007 +192547267337156 +424980042713196 +232232355674129 +120882770297477 +400642598192429 +112474076477861 +10340906762331 +468185262885354 +473115146434914 +546220244501277 +230746941039487 +474003157713676 +44868234288982 +134879528193057 +423906683473633 +212063817695168 +271695045483699 +409441138399226 +476263702459672 +516238652632498 +352219807950940 +428243297944988 +141935371043504 +365325692257606 +221266910655110 +3169796195887 +367133246977675 +458638914268606 +381166588589841 +334196333309437 +249709703265767 +366808681147270 +140601356365909 +490426342099955 +319540267637888 +372354531067299 +108558567973915 +219216361647628 +490413942590716 +546169226369143 +267961218722974 +316709186119253 +330318122561515 +7914554630956 +214248574179445 +225217158276800 +266018543894708 +76916781182273 +61938963784429 +290159525874705 +31456612431862 +84679786180184 +172374064863107 +37353984479663 +340133489894036 +280746496541083 +60142024461394 +8862582481952 +234025965023325 +93054503232686 +539882817169577 +536566109891024 +144011267061452 +451312569796552 +350329972823014 +476257951614801 +45590639642899 +451351680776874 +425164577202709 +226607172134288 +227902543752441 +326465979074352 +181342541666891 +462660700607043 +150224259144078 +488630331998626 +54860468478369 +101914026619125 +294756653101713 +202272597191959 +76050673612329 +238860757008309 +48621264302279 +14319569575066 +560780594889128 +144584257609115 +7002261598710 +251737669455207 +102490965796155 +254089228645909 +458850237935972 +444494162113316 +342612583612144 +203261620323802 +130739573902267 +556503818068118 +558892062105595 +36094704072154 +95593696940294 +244216036056071 +263649852755312 +125782927760917 +318698954414381 +163405285563569 +62989351003745 +483851364863882 +85875561472613 +258960741690709 +407576336377045 +448360245242560 +249577485109234 +433669489426532 +219916919792675 +148832385339069 +32205722322915 +32897635016190 +177545108774500 +91884027353209 +89540680416542 +141028982943171 +242867991040476 +200955710974663 +259952079512445 +426148978382011 +524766003835077 +75783352497314 +279339636090366 +374415735625254 +280956513062478 +494710165439429 +508379047536234 +280690636971471 +396012124017689 +248444391158398 +329249791188540 +216762541147551 +259537664996523 +113005729648331 +460214823752344 +30372390699746 +383470652629746 +56469028751500 +235911537030805 +395352178290627 +145022639218919 +36303214253904 +77113739462114 +332613040134789 +368179871295577 +54500507778458 +559819181914339 +359024060500704 +142775441258314 +555929172898758 +234335170287736 +432996614204002 +265211936254785 +219076815767968 +470376747245611 +195650968848679 +186443234315411 +531724905067097 diff --git a/src/main/resources/eu/sim642/adventofcode2025/day6.txt b/src/main/resources/eu/sim642/adventofcode2025/day6.txt new file mode 100644 index 00000000..0d46e4b4 --- /dev/null +++ b/src/main/resources/eu/sim642/adventofcode2025/day6.txt @@ -0,0 +1,5 @@ +91 23 61 16 57 74 65 739 11 98 551 6 2 823 51 4 314 7 37 2668 8 328 371 9 49 637 313 61 7 1991 39 2 12 8 93 49 199 14 96 8 1 1833 491 44 57 499 2 81 85 3 19 75 966 95 71 467 2 843 11 7598 1 34 18 13 12 823 9 25 1 133 997 97 26 3399 96 796 4 43 85 48 47 84 75 3 45 858 3 99 683 225 659 18 69 798 94 48 874 53 41 4 165 536 4538 5 887 5 3 769 46 196 27 144 96 87 444 725 76 63 56 3 244 12 5 15 95 92 46 76 29 21 8 451 52 87 498 418 214 25 87 3425 21 975 4 8 9686 59 323 6 97 352 99 524 77 1 952 98 759 22 23 251 334 1 2 46 7 63 7 2 38 95 95 86 353 63 78 82 39 46 24 4 43 6 24 4 78 569 2381 1 858 68 691 3224 29 83 77 58 89 144 23 51 779 1 8 784 3 6699 49 93 9 856 9425 69 624 66 619 714 7 391 7526 68 388 431 14 73 73 9 535 967 99 525 34 84 297 685 268 94 925 828 48 1 49 1 36 78 3 96 877 965 8 39 488 51 9751 6724 87 68 466 92 91 769 83 827 76 5217 75 81 83 817 97 725 289 755 899 32 31 3 544 29 4 68 939 72 41 3 7 7 837 758 48 41 88 55 769 12 9462 6 8676 576 6 57 956 31 94 7 5415 7645 7 51 59 998 9 553 67 38 5812 6 8437 81 3 58 6452 99 9 52 93 56 63 248 221 2 462 349 61 9 49 9126 31 5 4 99 257 13 474 74 837 832 556 73 2 57 84 34 778 398 616 116 272 14 8 26 149 45 22 52 8231 22 66 341 5 14 724 415 5 84 72 97 49 219 664 2663 18 923 6 368 57 49 6 894 4 764 31 9 3 118 316 576 18 45 75 8 795 181 5 753 81 79 68 25 981 75 182 932 28 59 942 8 189 12 845 37 1 13 822 28 72 7 563 36 9 164 6 52 68 338 5 6 25 6 8 542 53 76 57 62 484 97 44 11 977 36 51 27 55 1379 2617 61 66 569 87 1 389 721 499 6 339 182 14 24 9432 464 5758 661 695 95 46 4 22 33 25 215 414 5 2 411 389 2 613 98 24 68 49 798 57 333 2 454 62 59 97 12 29 328 23 3 23 73 52 367 1956 49 8 28 38 62 7 8 2837 7 97 48 269 34 56 5 62 438 77 38 1 188 971 433 76 87 181 22 45 1 6266 9774 7 14 642 951 6 3 6616 9 79 1781 61 3 2556 48 83 334 85 853 39 25 7 5774 625 32 44 318 766 778 5496 17 98 764 464 4 8846 9 4 4 85 29 68 6 5 55 64 63 386 832 92 2886 56 914 38 91 85 346 61 4 3 686 25 5 6 69 9 38 362 81 66 4 6 69 436 37 751 8 6 65 72 527 86 34 813 67 651 55 44 478 53 7 84 824 4 4 69 1973 8 514 148 27 9254 7715 98 5 57 9963 2456 59 63 33 8877 5 47 9 454 2 9292 134 72 162 511 73 7876 298 5772 45 99 4 78 2 9636 862 39 856 88 4 787 9 688 147 8451 45 73 755 46 11 98 122 553 817 2 59 77 6564 523 93 55 76 9 5 582 697 441 5429 97 62 369 223 6 3 721 586 86 61 5 77 2 24 455 691 9 542 69 6 79 973 66 3 679 12 821 7 7 11 87 282 895 198 99 16 387 56 7 313 45 56 548 36 233 8 933 7115 43 8853 74 98 45 696 2 734 61 8675 57 33 24 9 15 2644 814 75 59 71 395 8 56 9 64 89 759 2334 367 362 9 17 69 2547 8 272 13 45 74 31 32 16 89 63 76 84 2 76 4 767 2 32 56 69 52 7 29 866 5 235 18 8 97 17 4 27 466 56 511 52 433 972 8 32 979 17 29 96 17 7373 73 88 6 27 67 73 16 84 26 99 6 8986 46 4667 942 6 4 5 1 9 9 54 5136 63 674 57 712 4 1966 225 46 982 2 524 5 2 73 34 1 1 39 7 99 52 29 7 32 86 87 685 5823 22 77 434 45 81 95 95 16 9853 69 379 53 4 51 44 387 1 7762 1 58 352 7 3 356 956 19 681 5 25 325 96 853 54 5 56 7 8 71 98 95 5754 93 54 55 8 3 24 373 89 27 876 56 859 1999 68 31 298 7 3 52 77 497 67 112 957 44 96 129 3 1684 93 6 2212 96 4 14 1 58 28 52 39 353 4 7 51 9711 21 52 6 11 2968 827 53 548 85 62 823 8 75 826 3 3 927 641 23 537 38 9 9845 9388 681 2 66 41 825 3 491 +75 89 21 92 124 15 659 837 576 62 557 8 797 966 531 93 633 754 627 1938 9 614 274 11 85 889 437 834 762 139 958 6 15 46 27 132 995 52 25 23 8 2539 531 3594 986 388 8 47 91 518 15 69 329 66 43 218 52 518 42 5915 82 53 32 567 93 283 63 69 99 244 477 41 28 5397 325 484 814 25 43 31 615 971 82 36 13 256 92 82 798 461 786 38 59 826 64 571 711 81 13 3 692 664 5423 9 423 6 77 69 82 255 11 65 461 13 497 626 41 45 369 7 146 14 68 59 16 95 76 91 237 15 55 122 93 66 374 8235 53 38 82 2453 13 12 65 4 3156 41 159 32 39 8198 78 376 99 3 365 7 849 99 64 359 882 6 69 85 68 39 9 51 24 796 28 31 123 99 9732 42 85 11 17 968 46 19 28 27 87 772 2682 21 484 74 611 1245 81 872 36 74 97 258 96 31 284 6 79 698 73 2549 45 62 4 223 8746 95 52 38 951 843 273 944 5545 373 715 829 25 743 13 841 7116 746 511 421 7 13 469 537 796 736 291 686 52 1 63 3 32 77 22 98 885 885 6 967 452 54 1463 4782 33 699 319 55 19 498 15 533 24 6334 89 329 34 77 91 665 418 424 237 63 178 85 974 27 89 75 726 52 66 7 3 46 145 621 66 63 61 87 317 91 7638 45 3516 435 7 45 28 96 974 897 2813 6696 251 793 884 256 592 315 79 627 283 314 1122 11 36 16 9196 19 9 5 13 92 434 496 527 7 175 678 96 6 13 5544 94 7 9 43 559 93 237 25 7737 674 47 6 55 61 829 16 392 115 487 665 359 14 5 969 736 92 71 11 5775 68 36 317 8 51 572 144 12 19 631 76 49 668 4257 6591 96 228 683 475 46 329 5 718 483 791 538 33 86 998 646 771 79 86 29 5 67 892 98 659 57 99 39 93 942 14 816 515 829 82 454 54 813 983 734 19 374 84 257 77 86 3 768 5496 273 993 11 67 81 637 39 68 67 5 1 831 49 97 16 9 529 53 81 3 273 68 23 19 85 227 1963 66 79 314 58 8 317 93 182 26 549 186 59 69 878 176 9175 952 828 75 13 78 63 27 6 642 162 3 13 116 588 7 888 16 44 565 183 871 57 21 75 828 88 69 8 5457 16 969 86 19 35 35 12 786 5468 77 88 12 93 47 77 43 3535 9 24 681 511 81 864 48 789 941 75 51 69 597 713 363 2 719 455 19 9759 21 4244 5312 5 12 334 188 4 5 2622 9 58 9816 7656 7 9823 862 13 539 51 34 44 436 99 2536 333 69 35 384 825 255 3124 96 57 228 715 9 91 3 23 44 18 66 52 425 95 784 22 96 842 172 36 295 76 7745 63 35 87 653 87 77 9 483 29 54 8 12 86 498 9634 216 51 2 7 78 752 861 871 89 93 53 626 918 32 65 679 5 272 3585 58 585 75 38 61 379 2 77 38 8311 4 271 495 61 8794 3986 58 239 532 9396 966 89 46 866 919 4 96 11 632 91 4715 868 32 478 6186 556 555 886 8292 6 91 3 71 3 9336 193 39 585 68 99 224 237 739 466 9521 6443 195 4239 93 99 67 746 839 854 34 99 146 1833 718 62 35 66 3 73 736 5847 957 7986 46 38 982 273 7 85 447 789 26 6 3 71 8 39 256 337 73 289 98 746 54 989 7 36 579 23 699 88 5 37 925 673 536 471 82 4 755 99 45 143 1 27 141 541 593 9 125 678 29 8418 23 33 99 526 3 116 94 6378 77 22 69 35 97 663 994 53 674 835 22 7 98 46 13 54 762 9339 856 593 35 81 3582 8693 2 514 66 87 34 26 63 83 363 71 11 75 636 73 6342 754 72 536 39 13 77 1 916 587 43 215 995 28 44 86 42 385 338 65 779 18 115 462 1 13 517 398 12 75 988 5141 42 44 26 31 41 91 61 29 938 79 7 2883 44 7916 637 89 22 918 9 4 96 36 3732 92 872 25 833 566 9641 458 25 369 83 649 44 4 539 51 57 94 95 983 19 83 99 62 38 75 12 923 4952 893 133 213 47 76 95 35 86 8479 65 213 14 59 633 57 891 2 7253 28 49 793 78 7 267 127 59 9764 98 59 172 323 162 15 491 32 737 76 922 91 55 9165 28 96 84 64 72 67 735 48 84 878 24 823 7685 51 48 788 734 3 13 28 523 87 286 593 22 69 233 685 3445 38 7 871 19 69 92 44 35 981 8978 74 123 8 3 45 7283 45 15 3 782 4632 57 99 499 17 85 739 62 82 314 27 41 326 379 71 676 92 8 997 2473 494 995 69 2 733 91 643 +644 11 23 38 373 962 791 821 733 51 324 21 918 23 561 5589 53 584 678 1568 372 4685 543 26 86 938 829 878 932 534 751 32 3 19 43 412 154 7 77 17 55 6522 926 5668 853 1 6 32 77 498 25 97 868 97 31 657 525 5 62 1413 83 3 5 8429 3 876 564 31 69 987 91 11 848 438 631 526 217 31 19 73 938 218 698 82 12 64 37 42 426 5 54 42 41 259 1 949 9676 53 45 31 428 3 86 98 42 561 296 58 65 34 53 61 441 41 827 471 14 48 645 34 592 33 18 81 86 84 91 52 942 98 693 368 88 43 62 9167 78 77 1735 5282 97 56 431 93 264 58 372 93 31 8544 89 775 35 71 985 7 17 29 86 195 35 92 14 26 55 96 49 83 13 6158 61 82 671 32 4548 55 15 51 42 9934 86 662 58 92 92 83 71 31 363 39 25 4235 69 791 1 25 32 113 43 13 5441 56 62 59 82 3415 664 658 44 262 5885 96 4 8 662 332 441 343 875 682 133 2253 92 389 81 618 6617 81 312 558 5 8 233 765 758 942 675 235 43 85 542 37 18 73 7711 122 785 36 682 787 434 497 46 3342 37 865 89 43 85 188 87 492 15 629 73 345 86 99 15 795 291 4 565 76 617 43 522 35 879 46 284 58 75 1 82 56 768 299 44 777 74 54 385 86 6967 219 115 91 98 36 12 53 824 818 5243 8518 1798 985 948 4 579 514 11 389 567 879 5413 51 86 12 186 48 6 9 1 69 6642 9 791 91 487 994 54 76 4 3364 32 979 9 22 583 51 24 19 5673 725 96 8 53 24 776 65 41 134 89 56 377 8 69 246 633 94 7719 19 574 57 9 542 62 69 2 459 3473 9 932 61 89 9424 3945 464 42 294 249 21 95 262 94 978 757 165 252 497 62 245 582 349 76 54 48 1 16 675 52 923 91 95 52 38 275 21 895 431 721 64 145 87 421 996 496 33 233 92 79 88 77 39 448 7439 2227 334 46 54 4 92 32 292 5 14 2 22 6825 82 31 8 274 1 71 3 398 5 71 51 71 22 4697 23 45 992 64 8 122 32 562 212 94 973 72 71 662 313 758 727 268 99 6651 53 85 53 5 873 585 23 22 286 944 33 674 32 76 643 275 55 93 72 614 32 2 58 3 7244 47 475 58 87 93 174 48 7191 555 82 12 61 1 91 74 88 6883 67 23 7977 57 33 841 99 531 138 74 64 32 887 95 963 9 137 637 94 1526 587 2154 634 84 18 643 885 7 86 3677 51 97 982 5331 68 1191 396 62 489 19 92 26 765 623 2728 814 25 17 287 34 251 5532 18 32 716 438 79 68 39 81 646 65 9 49 873 453 296 523 658 275 884 18 717 68 2642 88 95 1 541 36 686 95 719 8 74 66 7 11 974 4991 582 94 679 28 814 272 592 144 886 23 96 459 455 92 749 666 7 368 9494 6334 89 4 56 54 394 82 65 22 596 39 861 747 57 981 7997 12 663 573 7566 5 75 59 133 55 2 56 88 898 26 773 741 6 829 1872 545 552 294 569 7 88 36 72 7 555 2252 74 529 5 45 273 267 256 514 472 6644 653 7697 282 4 3 98 54 9377 14 26 282 8385 717 97 36 62 8 799 477 1171 134 5592 72 72 844 624 11 81 6966 16 41 2 55 81 56 87 119 55 84 68 43 696 92 997 4 341 224 97 644 68 9 51 712 555 88 616 62 4 142 74 84 946 6 28 1 226 43 58 866 72 54 5377 39 272 85 879 1 268 44 469 17 53 58 337 69 22 663 52 535 361 1 15 21 166 66 5 541 6873 183 534 44 17 1242 273 559 32 56 69 67 78 23 81 246 27 82 68 215 45 6392 38 26 792 57 52 17 7 448 68 184 366 362 278 21 42 724 548 496 36 8 23 241 322 2 27 475 239 47 79 544 7844 4 93 11 32 14 66 53 22 562 4 14 121 33 3271 99 83 55 298 87 38 21 53 12 66 587 26 186 7685 367 542 57 928 66 257 43 92 387 68 52 84 7 746 67 35 36 848 67 54 24 18 155 835 559 42 39 656 34 76 21 7111 28 744 46 99 452 5 848 46 9772 476 41 374 297 52 726 993 1 9785 86 1 61 342 545 75 418 28 384 26 965 51 31 385 5 795 35 45 86 1 791 75 81 9162 77 723 5347 85 11 66 889 72 86 63 688 94 63 835 91 125 7134 976 7658 13 56 292 421 74 52 41 72 431 8989 69 145 13 753 2 841 29 51 17 191 6792 83 26 4642 53 26 328 69 72 48 476 83 281 64 48 568 18 7 251 973 888 777 62 7 91 47 445 +392 438 95 67 988 988 728 6 378 53 7 483 665 13 6538 3447 4 572 266 2879 296 1991 768 781 72 33 25 487 155 47 669 16 7 11 4 594 98 8 76 33 37 4917 758 2265 9194 7 46 23 56 323 36 49 325 25 22 9163 119 1 91 51 44 7 5 7449 7 218 476 2 52 993 2 39 829 153 432 753 525 64 4 88 412 496 446 89 62 31 59 42 662 5 3 8 23 96 6 651 1914 15 68 41 56 7 37 86 17 449 665 91 53 95 28 55 952 5 92 917 54 55 681 94 8 5 84 3 51 53 68 5 513 53 593 514 72 42 15 4896 65 75 5166 9765 7 59 163 46 435 35 17 57 9 5222 4 21 48 62 37 7 7 51 5 639 16 21 47 42 78 42 81 82 58 8826 68 1 384 73 5261 72 6 1 73 3543 76 222 23 55 83 87 14 76 23 15 5 9512 87 679 5 79 1 992 39 74 9577 76 85 86 83 5 932 535 38 926 9855 4 8 1 621 78 176 717 817 758 949 4731 2 5149 46 314 3587 3 757 91 8 9 6279 515 689 162 133 5 72 23 161 95 1 89 6123 665 99 4 364 911 321 799 97 23 9 289 84 19 87 367 46 195 93 487 8 928 62 81 12 66 775 2 778 55 599 93 547 85 765 36 987 13 28 88 168 83 96 48 35 767 51 61 333 96 583 561 29 5 27 3 1 99 626 466 197 793 2394 414 642 1 377 15 89 744 97 445 79 86 17 99 65 95 56 6 7 74 7776 9 754 27 85 14 31 68 3 5461 58 533 98 61 1177 85 81 6 9864 166 2 8 454 42 787 13 63 281 9 29 34 4 52 446 985 33 5363 34 8 96 1 3 39 73 2 64 2619 2 974 75 475 5843 5398 44 17 454 936 86 53 189 86 749 428 6 483 697 55 515 23 732 53 24 53 89 58 672 13 199 78 78 52 87 275 89 331 313 867 71 232 82 63 292 742 94 926 3 8 98 378 25 386 7838 8171 49 36 7 7 64 13 172 6 26 47 8 3924 7 44 6 615 6 48 8 86 5 54 2 61 41 36 71 49 68 54 79 838 25 321 416 52 963 2 22 5 25 42 982 869 9 1794 67 87 42 2 21 62 97 59 67 581 28 18 89 2 994 458 3 82 93 9852 9 3 5 1 7871 4 3 95 62 73 868 57 2943 9 889 27 623 6 62 21 85 9 23 3 8128 18 11 271 79 3596 67 5 29 44 765 48 71 9 325 689 38 5563 222 957 77 25 78 276 226 33 52 53 329 76 11 4397 29 31 999 6 146 7 9 86 663 855 2459 7 568 91 93 72 77 1294 76 47 67 668 37 96 15 25 348 9 9 48 579 118 676 981 423 75 523 5 2 75 2896 17 6 4 23 2 123 83 83 7 52 56 8 62 698 8576 733 1 257 49 825 771 617 91 771 38 84 291 61 43 4485 825 9 435 8481 9793 1 9 23 53 942 23 77 86 533 33 374 56 57 6 868 8 734 378 4111 3 85 6 213 2 47 94 27 194 343 831 62 6 655 8115 348 846 218 39 2 41 36 17 15 175 8148 73 99 3 91 277 137 59 23 11 6944 687 1964 217 1 8 18 3 2275 12 938 673 9659 9 74 21 2 28 883 721 9243 9 94 84 17 98 538 45 76 5123 5 26 2 93 8 47 99 326 67 749 4 62 344 61 842 3 675 995 63 3 67 85 52 284 49 97 11 14 4 3 89 36 32 4 5 6 978 94 27 11 91 65 36 14 186 31 761 16 846 47 121 84 65 4 958 16 94 287 82 843 582 6 888 49 665 323 7 3 119 861 264 19 73 7144 2 334 34 73 47 3 84 23 94 724 55 4 26 455 37 3523 87 23 362 16 36 63 63 212 47 327 422 987 263 99 93 159 188 76 69 9 62 713 724 11 4 613 991 41 79 995 622 4 34 56 5 52 9 38 87 673 6 984 35 78 2372 54 57 73 441 26 35 58 62 4 5 833 44 156 5136 61 884 96 8376 77 789 11 76 766 19 45 482 7 758 44 9 82 279 45 25 2 8 445 578 693 38 19 241 48 12 5 31 98 5 1 61 1469 4 47 32 725 762 39 166 699 71 534 65 1 7961 44 9 89 937 358 85 562 25 596 77 8415 52 96 84 8 127 28 91 335 7 77 5 88 7893 65 316 16 54 25 88 825 61 77 2 737 7 46 559 24 811 9942 823 4639 61 36 849 257 24 3 26 1 113 3897 2 412 53 162 9 783 113 88 48 836 24 38 2 8684 19 11 832 24 848 4 6247 81 618 2 58 562 5 27 7 264 34 854 29 6 5 33 462 +* * + * + * + * * * + * * + + + + * * + + + + * * * * + + + + * * * * + * * * * * + * + + + + * + * + + + + * + * * * + * * * + * * * * * * + * * + * * + * + * * * * * * * + + * + * * * * * * + * * * * + + * + * * * * + + + * * * * * * + * * + * * + * * * + + * * + + + + * * + + + * * * + * * * + + * * * + + * + * * * + * + + * * + * + + + * + + + * * * + + + * * + + + + * * * * + * + + + * * + + + * * * * + * * * * + + * * + * + + + * + + * + * * + + + + + + + * * * + + * + + * * + + * + * * + * + + + * * + * + * * * + + * * * * * + * * * * * + + + + * * * + + * * * * + * * + * + + * + * * + * + + + + + + * + * + * * * + * + + * * + + * * * * + * * + + * * * * + * + * + + * + * + * * * * + * * * + * * * * * * + + + * + + * * * * * * + * * + + + + + + + * + * * + + + + * * * * * + * * * + + * * * * * * + + * * * + * * + * + * * * * * + * + * + + * + * + + * * + * * * + + + * * * + + * + + * + + + + * + * + * * * * + * + * + + + + * * + + * * + + + * * + + + + + + + + * * + + + + + + + * * + + + * + + + * + + + * + * + * * + + * + * + + + * + + + + + * + + + + + + * * + * + + + * * + + + + * + * * + + * * + * + + + * * + * + * + * + * * * * * * + + * * + * + + + + + + + * + * * + + * + * * + * + * * * * + * * * * * + * * + + * * + + + * * + * + * + * + + * * + + + + + * + + + + + + * + + + * + + * * + * + + + * + + * + + + + + + * + * + * + + + + + * + + * + * + + + + * + + * * + + * + * + * * * + + + * + * * * * + + * + * * * + * * + + * * * * * + + * * * * * + * * * + * * + * + * + + * * + * * * + + * + + + + * * * * * + * * * + * + * + * * + + * + * + * * * * * * * + * * + * * + * * * * * * * * + * + * * * + * * + + * * + * * + + * + * * + * * * + * * * + + * + * * * * + + * + + * * + + + + * * + + * * * * * + + * + + * + + + * * * + + + * * * + * * + * * * + + + + * + + * + * * * + * + * * * * * * * * + * + * * + + + * * * * * * * + + * + * + + + + * * * * * * * * + * + * * + * * * + * * + * * + + * + + * * * + + + + * * + * + + + * * * * + * + + + + * + + + * * diff --git a/src/main/resources/eu/sim642/adventofcode2025/day7.txt b/src/main/resources/eu/sim642/adventofcode2025/day7.txt new file mode 100644 index 00000000..f2f6a6b6 --- /dev/null +++ b/src/main/resources/eu/sim642/adventofcode2025/day7.txt @@ -0,0 +1,142 @@ +......................................................................S...................................................................... +............................................................................................................................................. +......................................................................^...................................................................... +............................................................................................................................................. +.....................................................................^.^..................................................................... +............................................................................................................................................. +....................................................................^.^.^.................................................................... +............................................................................................................................................. +...................................................................^.^.^.^................................................................... +............................................................................................................................................. +..................................................................^.^.^.^.^.................................................................. +............................................................................................................................................. +.................................................................^.^...^...^................................................................. +............................................................................................................................................. +................................................................^.^.^.^...^.^................................................................ +............................................................................................................................................. +...............................................................^.^.^...^.^.^.^............................................................... +............................................................................................................................................. +..............................................................^.^.^.^.^.^.^.^.^.............................................................. +............................................................................................................................................. +.............................................................^.^.^.^.^.....^...^............................................................. +............................................................................................................................................. +............................................................^...^.^.^.^.......^.^............................................................ +............................................................................................................................................. +...........................................................^.....^...^.^.^.^.^...^........................................................... +............................................................................................................................................. +..........................................................^.^...^.....^...^.....^.^.......................................................... +............................................................................................................................................. +.........................................................^.....^.....^...^.^.^...^.^......................................................... +............................................................................................................................................. +........................................................^...^.^...^.......^...^...^.^........................................................ +............................................................................................................................................. +.......................................................^.^...^.....^.^.....^...^.^.^.^....................................................... +............................................................................................................................................. +......................................................^.^.......^.....^.^.^.^.^.^...^.^...................................................... +............................................................................................................................................. +.....................................................^.^...^.^.^.^.^.^...^.^.^...^.^.^.^..................................................... +............................................................................................................................................. +....................................................^.^.^.^.^.^.^.....^.^.^.^.^.^.^.^.^.^.................................................... +............................................................................................................................................. +...................................................^...^.^.^.^.......^.^.^.^.^.^.^.^.^...^................................................... +............................................................................................................................................. +..................................................^...^.....^.^.......^...^.^.^.^...^...^.^.................................................. +............................................................................................................................................. +.................................................^.^.^.^.^.^.^.^.^.....^.^.^.....^...^...^.^................................................. +............................................................................................................................................. +................................................^.^...^.^.....^.^.....^.^.....^...^.^...^.^.^................................................ +............................................................................................................................................. +...............................................^.^.....^.^.^.......^.^.^.^...^.^.....^.^...^.^............................................... +............................................................................................................................................. +..............................................^.^.^.....^.....^.^...^.^...^.^.^.^.^.^.........^.............................................. +............................................................................................................................................. +.............................................^.^.^...^.^.^...^.....^.^.^.^.^...^.....^.^.^.^.^.^............................................. +............................................................................................................................................. +............................................^...^.^.^.^.....^.^.^.^.^.^...^.^.....^.^.^.^.^.^.^.^............................................ +............................................................................................................................................. +...........................................^.^.........^.....^.^...^.^...^.^.^...^.^...^.....^...^........................................... +............................................................................................................................................. +..........................................^.^.....^.^.....^.^.^.^.^.^.^...^.^.^...^.^.^...^.^.^.^.^.......................................... +............................................................................................................................................. +.........................................^.....^.^.^...............^.....^.^...^...^.^.^.^.^...^.^.^......................................... +............................................................................................................................................. +........................................^.^.^.^.^.^.^.^.^.^.....^.^.....^.^.^.^.^.^...^.^.....^.^.^.^........................................ +............................................................................................................................................. +.......................................^...^.^.^...^.^...^.^...^...........^.^.^.^.^.^...^...^.^.^.^.^....................................... +............................................................................................................................................. +......................................^.^.^...^.^.^...^.^.^...^.^.^.^...^.^.....^.^...^.^.^.^.^.^.^.^.^...................................... +............................................................................................................................................. +.....................................^.^.^.^.^.^.^.^.^...^...^.......^.^.^.^.^.....^...^...^.^.^.^...^.^..................................... +............................................................................................................................................. +....................................^.^.^.^...^.^.^.^.^.^.^.^...^.^...^...^.....^...^.^.^...^.^.^.^.^.^.^.................................... +............................................................................................................................................. +...................................^...^.^...^...^.^...^.^...^.^.^.^.^.....^.^.^.^...^.^...^.^.^.^.^.^.^.^................................... +............................................................................................................................................. +..................................^.^...^...^.^.^.^...^.^.^.^...^.^...^...^.^.....^...^.^.^.^...^...^.^.^.^.................................. +............................................................................................................................................. +.................................^...^.^.....^.^.........^.^.^.^.....^.....^.....^...^.^...^.......^.^.....^................................. +............................................................................................................................................. +................................^.^...^.....^...^.^.^.^.^.^.^...^.^...^.^.^.^.^.^...^.....^...^.^.^.^.^.^.^.^................................ +............................................................................................................................................. +...............................^...^.^.^.....^.....^.^...^.^.....^.^.^...^.^.^.^.^.^.^...^.......^.^.^.^.....^............................... +............................................................................................................................................. +..............................^.^.^...^.^...^.........^.^.^.......^.^...^.^.^.^.^.^.^...^.....^.^...^.^.^.....^.............................. +............................................................................................................................................. +.............................^.^.......^.^.....^...^...^.......^...^.^.......^...^.^.^...^.^.......^.^.^.^...^.^............................. +............................................................................................................................................. +............................^.^.^.....^.^.^.^.^.^.^.^...^.^.^...^.....^.^.^.^.^.^.^.^...^.^.^.^.^.....^.^.^.^.^.^............................ +............................................................................................................................................. +...........................^...^.^.^...^.^.^.^.^.^.^.^.^.^.^.^.^.^...^.^...^...^.^.^.^.^.^.^.^.^.^...^.^.^.^.^.^.^........................... +............................................................................................................................................. +..........................^.^.^...^.^.^...^...^.^.^.^...^.^.^.^.^.^.^.^.^.^.^.^...^.^.....^.....^.^.^...^...^.^.^.^.......................... +............................................................................................................................................. +.........................^...^.^.^.^...^.^...^.^.^.^.^.^...^.^.^.^...^...^.....^.^.....^.^.^...^.^.^.^.^.^.....^.^.^......................... +............................................................................................................................................. +........................^...^.^...^.^.^...^.^.^.^.^.^...^.^...^.^.^.^.^.^.^.......^...^...^.^...^.^...........^.^.^.^........................ +............................................................................................................................................. +.......................^.^.^.....^.^.^.^.^.^.^...^.^.....^.^.^...^.^...^.^.^.^.^.^.^.^.^.^.....^.^...^...^.^...^.^.^.^....................... +............................................................................................................................................. +......................^...^.^.^.^.^.^...^.^.....^.^.^.....^.^.^.^...^.^.^.^.^.^...^.....^.^.^...^.^...^.^.^.^.^.^.^...^...................... +............................................................................................................................................. +.....................^.^.^...^.^...^.^...^.^.^.^.^.^.^.^...^.^.^.^.^.^.^.^.........^.^.^.^.^.^...^.^.^.^...^...^.....^.^..................... +............................................................................................................................................. +....................^...^...^.^.^.^...^.^.^.....^...^.^.^.^...^.^.^...^...^.^.....^.....^...^.^.^...^.....^.^.^.^.^.^.^.^.................... +............................................................................................................................................. +...................^.....^.^.^.^.^.........^.^.....^.^.^.^...^.......^.^.^...^.^.^.^.^.^...^.^.^.^...^.^.^.^.^.^.^...^.^.^................... +............................................................................................................................................. +..................^.^.^.^.......^.^...^.^.^...^.^.^.^...^.^.^...^.^.^.....^.^.^.^.^.^.^.^.^.^...^.^.^.^.^.^.^...^.^.^.^.^.^.................. +............................................................................................................................................. +.................^.........^.^.^...........^.^.^.....^.^.^...^.^.....^.^.^.....^.^.^.^.^.^.^.^.^...^.^.^.^.^.^...^.^.^.^.^.^................. +............................................................................................................................................. +................^.^.^.^.^.^.^.^.^.^.^.^.^.^.....^.^...^.^.^.^.^...^.....^...^...^...^.....^.^.^.^.^.^.^.....^.^...........^.^................ +............................................................................................................................................. +...............^...^.......^.........^.^.^...^.^.^...^.^...^.....^...^.^.^.^...^.^.^.^.^...^...^.^...^...^.^.^...^.^.^...^.^.^............... +............................................................................................................................................. +..............^.^.....^...^...^...^.^.^.^...^.....^.^.^...^.......^.^.^.^.....^.^.....^.^.^.^.^.....^.^.^.^.^...^.^.^.....^.^.^.............. +............................................................................................................................................. +.............^.^...^.^...^.^.....^.^.....^.........^.^.^.^.^.^...^...^...^...^.^...^...^.^.^.^.^.^.....^.^...^...^...^.^.^.^...^............. +............................................................................................................................................. +............^...^...^.^...^.^.....^...^.^.^.........^.^.^...^.^.^.^.......^.^.^.^...^.....^.^.^.^.^...^.^.^.^.....^.^.^.^.^...^.^............ +............................................................................................................................................. +...........^...^.^.^.^.^.^.^...^.^.^...^.....^.^...^...^...^...^.^...^.^.....^.^.^.^.^...^.^.^.^.^.^.^.........^...^.^.^...^.^.^.^........... +............................................................................................................................................. +..........^.^.^.^.^.^.....^.^.^.^.^.^.^.....^...^...^.^...^...^.......^.^.^.^.^.....^.^...^...^.^.^.^...^...^...^.^.^.^.^...^.^...^.......... +............................................................................................................................................. +.........^...^.^.^.^.^.^.^...^.^.^.^.^.^.^...^.^.......^.^.^.......^.^.^.....^...^.^...^.^.......^.^.^...........^.^...^.^...^.^...^......... +............................................................................................................................................. +........^...^...^.^.^.^...^...........^.^.^.^.^.^...^...^.....^.^.^.^.....^.^.....^...^.^.^.^.^.^.^.....^.^.....^.^.^.^.^.....^.^.^.^........ +............................................................................................................................................. +.......^.^.^.^.....^...^.^...^.....^.^.^...^.^.^.^.^.^...^.^...^.^.^.^.....^.......^.^.^...^.....^...^.^.^...^.^...^.....^...^...^...^....... +............................................................................................................................................. +......^.....^.^.^.^.^.^.^.^.^.^...^.^.^...^...^.^.^.^.^.^.....^.............^.^.^.....^...^.^...^.^.^.^.....^.^.^.^.^...^.^.^.^.......^...... +............................................................................................................................................. +.....^.^.^...^.^.^.^.^.^.^.....^...^...^.^.^.^...^.^.^...^...^.^.^.....^.^.^.^...^.^.......^.^.^...^.^.^.^...^...^.^.^...^...^.^.^.^.^.^..... +............................................................................................................................................. +....^.^.^.^.^.^.^...^.^.^...^.^.^.^...^.^.^.^.^.^.^.^...^.^.....^.^...^.......^.^.....^...^.^.^.^.^.^.......^.^.^.^.^.^.^.^.^...^.......^.... +............................................................................................................................................. +...^.^.^.^.^...^.^.^.^...........^.^...^...^...^.^.^.^.^.^...^.^.^...^.^.^.^.^.......^.^.^.^.^.^.^.........^.^...^.^.^.^.^...^.^.^.^.^.^.^... +............................................................................................................................................. +..^...^.^...^.......^.^.^.^.....^.^.^.....^.^.^...^.^.^.^...^.^.^.^...^.^.^.^.^.^.^.^...^.^.^...^.^...^.^.^.^...^.^.^...^.^...^.^...^.....^.. +............................................................................................................................................. +.^.^.^.^.^.^.^.....^.^.^.^.^.^.^.^.^.^.^.^...^.^.......^...^.^.^.^...^.^.^...^.^...^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^...^.^.^.^...^.^.^.^.....^. +............................................................................................................................................. diff --git a/src/main/resources/eu/sim642/adventofcode2025/day8.txt b/src/main/resources/eu/sim642/adventofcode2025/day8.txt new file mode 100644 index 00000000..2dfc8bfe --- /dev/null +++ b/src/main/resources/eu/sim642/adventofcode2025/day8.txt @@ -0,0 +1,1000 @@ +27558,61383,12726 +15513,81970,25554 +24379,89821,82524 +42987,15460,38773 +10680,2978,15903 +77950,19916,8194 +84115,76354,95701 +75128,80898,64571 +71561,94114,61650 +41769,64801,84116 +99451,81585,8703 +57564,2417,64836 +84589,38412,15385 +35597,52203,16486 +42032,73225,53406 +38913,2543,47366 +18003,27047,63249 +15725,35221,8917 +67459,89481,6379 +93053,35768,21677 +57854,1647,34547 +26887,45673,77882 +73271,62199,8639 +84107,45639,50143 +43769,90773,81919 +3151,61180,99236 +6927,79733,83957 +49142,71115,17212 +57941,89686,33277 +11148,25706,76435 +59562,53048,55156 +26033,72414,65197 +35437,81135,37478 +43184,8900,19814 +39591,5679,77570 +76644,39268,69061 +44173,17521,57147 +87465,41898,44085 +40053,91676,2430 +65503,72760,2043 +69780,10458,14163 +99262,7255,7737 +25197,94672,68707 +13113,84009,19685 +22729,28488,37015 +37615,72443,48207 +43754,94508,4531 +80141,39964,57206 +12264,55521,63720 +14183,59921,42797 +80687,29108,13747 +75010,68740,69291 +39507,46719,11879 +75662,23096,21415 +36451,81573,81035 +51321,47179,22052 +97171,62492,79997 +40190,13460,15078 +46864,93827,62207 +53653,63701,83672 +8140,9633,5785 +67384,57598,77233 +49953,36056,33266 +28305,35015,17094 +33220,58166,90907 +26878,27464,14325 +64339,38036,61393 +79452,59545,99067 +59026,87348,43948 +61689,57920,646 +61210,36153,78337 +78124,90634,23401 +80550,90455,78974 +20812,2778,90692 +6276,85114,87764 +20620,83987,70476 +95774,99066,94559 +64585,95960,32347 +85442,82506,14651 +51087,15650,73173 +68929,78932,3859 +61393,5525,95977 +47915,18329,9892 +68532,26098,93537 +17779,74102,70836 +84003,3496,79650 +40862,81306,95431 +7537,43864,62478 +72760,98524,59372 +47421,78304,8267 +32277,74472,74328 +32398,97508,73150 +11911,77189,22960 +80912,54267,85567 +32921,39348,21798 +1567,80577,59352 +26233,46143,53410 +98091,55392,71164 +17715,90810,13977 +20593,81378,14449 +32419,24055,91387 +78652,20980,70459 +93201,82894,73543 +1877,92653,150 +51424,51029,52106 +40916,96161,41356 +66126,73502,8761 +25262,38433,73583 +76100,53965,81815 +8319,40815,27976 +92168,27128,74487 +48814,82989,95976 +83658,85041,79166 +27064,20153,35247 +50648,87752,80413 +50257,54718,26914 +19700,1056,57720 +3256,15711,8622 +25952,97316,39681 +99837,34249,9462 +11677,8872,7993 +2099,68373,96744 +28568,11500,77149 +30434,27905,97828 +18204,15717,28915 +362,88236,60359 +55146,36470,74160 +3272,4903,9849 +5383,54345,27583 +46884,28341,73997 +38938,45279,99784 +82589,98095,20314 +66326,31165,43943 +59917,70307,16044 +48356,27369,87139 +62163,5620,71537 +80954,91498,3597 +49641,45317,92981 +45037,31191,38528 +5005,34990,17722 +970,48548,70437 +79005,60267,22282 +54754,9273,51696 +6434,75957,47697 +52057,62040,93134 +75673,98839,50315 +49330,3505,29238 +3568,96165,33898 +69791,26533,70664 +46370,64081,93466 +98416,81416,77944 +82199,20051,26457 +36689,78071,5895 +66265,52351,16511 +62986,72460,99358 +67886,70855,71849 +10277,8294,49542 +68675,38386,48264 +52495,56631,77571 +92271,45675,62423 +31846,86614,35291 +22523,84140,44123 +13279,31179,57039 +50560,20274,72628 +74796,164,69281 +89636,97112,43762 +13530,58949,79375 +81288,83546,70927 +32782,86542,10999 +13667,80234,12815 +20317,73372,82134 +16975,18919,3896 +141,31945,88594 +24363,69171,64739 +55258,49031,9007 +52809,43138,76384 +60034,54881,49040 +92316,14074,15368 +69619,16654,4816 +31471,91673,23803 +54873,78967,95026 +41526,62361,52220 +97242,10550,71652 +33887,87544,19526 +65695,94279,97165 +1757,53946,94997 +48895,42774,6468 +28697,28697,41441 +4595,10443,56531 +45575,78251,66463 +76483,39357,73728 +65276,83094,51049 +20586,52573,91691 +22015,27123,85041 +6184,91956,48328 +86218,44191,10018 +13806,47539,22759 +40240,34158,74994 +59867,45337,88910 +92360,99400,71321 +36048,88918,57325 +22736,29516,77226 +22152,83793,26016 +66096,26096,63226 +53560,67789,57830 +92927,81686,36037 +81913,4277,14931 +63270,2460,17295 +47978,68878,93692 +71428,1416,54146 +71865,81773,62639 +29236,1572,39013 +6467,80074,84491 +67396,66452,11878 +35693,83917,80560 +6361,97157,48677 +86545,63127,1372 +85587,93465,65458 +80731,72511,89605 +46653,17868,27955 +54806,16377,64581 +49176,50661,95231 +85190,14526,47065 +59328,36210,45646 +72700,1097,6201 +16537,22531,5533 +55608,94144,22541 +36648,9733,35943 +3690,42847,32623 +54770,19157,64585 +4518,79897,5155 +56707,20054,13 +22132,91939,43445 +11489,64489,62861 +95184,21113,19927 +45992,92977,62673 +29123,83469,38134 +91485,10329,1774 +83518,69655,97060 +51350,66635,60774 +98766,70568,63132 +18409,50192,58526 +53796,94647,14093 +66804,89170,68622 +50759,74674,37877 +20045,55967,6715 +70249,58003,93865 +48704,31274,83344 +43197,56334,14434 +75734,21963,72373 +49688,79822,28133 +38664,48600,33772 +10797,28758,11817 +66734,78689,30266 +48629,57795,30581 +70291,4960,29523 +6593,26071,60430 +65748,71000,71255 +72552,30895,38133 +27845,97749,1290 +94158,77785,55917 +35859,82001,16549 +74299,41863,45678 +34805,14430,72385 +47721,1735,64941 +6685,10901,3798 +55778,56898,7730 +2156,93506,48653 +50520,97898,31203 +86643,76337,921 +13285,25953,87937 +51530,89294,76779 +99610,35840,80286 +14135,49269,10630 +36399,99114,11630 +30959,19101,37452 +76160,76522,21637 +61476,14625,48882 +46508,69476,41416 +61557,50231,52005 +83197,45097,48950 +77305,97973,17871 +30077,61008,76093 +35319,6547,61121 +82823,81975,73409 +84540,62949,44775 +18563,71428,79252 +37359,7912,8478 +37975,94395,13055 +69996,13121,34855 +99794,69636,97715 +93020,16878,37327 +21886,26287,55091 +91337,5822,47039 +21331,19446,88706 +60732,44863,94853 +54207,69259,3410 +49828,78182,64724 +94997,95263,56998 +67379,52979,78534 +45157,77794,91917 +541,81378,19049 +12132,89864,13502 +43002,81834,46037 +27713,95331,54574 +92356,37904,58440 +83010,13054,20281 +77263,20098,20467 +68430,80160,88073 +99821,59469,21255 +72030,95994,34989 +29581,6530,35936 +16495,68230,63987 +59104,56818,99157 +86413,57222,22486 +58698,86379,93768 +60721,68934,58397 +86953,15200,11344 +12785,40498,61023 +43578,65707,1524 +58696,46266,81656 +10415,14082,94593 +78836,93886,43976 +85674,29799,89072 +10675,45624,45308 +86494,11870,44591 +40597,45830,10689 +70127,91655,86940 +13410,32076,82223 +45166,56298,80140 +77282,24147,37464 +19462,88860,90037 +22156,72482,98015 +50705,90575,96319 +81436,14148,74121 +64454,50959,47846 +9767,27090,33463 +79993,11675,94940 +1610,23513,25486 +41767,62251,32580 +63383,88782,39248 +51157,68916,42561 +66140,4896,89649 +82420,67241,57118 +35574,85087,34310 +70579,22496,86978 +51192,27824,75370 +97462,27333,91615 +38199,21365,39717 +74574,78297,33557 +63841,14490,15365 +82381,80208,63263 +64405,17717,51502 +26912,78383,31490 +75039,89194,66928 +27426,68960,99038 +64203,68538,62462 +52971,18230,77628 +39481,98058,78946 +31671,60834,72501 +9630,15904,36742 +83092,30176,9557 +84834,48233,98278 +11166,28555,58517 +30432,77208,27968 +84042,76865,20244 +95241,88170,68192 +69862,6932,54522 +5276,46493,55987 +50320,33488,90759 +80314,971,27255 +62469,98693,43844 +67174,8117,86598 +32979,59637,54764 +36682,39778,75188 +34195,94621,10275 +46928,63241,9069 +9171,12143,95078 +23373,80369,19796 +29195,695,48170 +92202,93642,67428 +51554,82461,37389 +82214,64294,29428 +40145,59348,87902 +81029,35430,61288 +84049,44641,74984 +10980,23231,72485 +40622,91753,91370 +1353,36376,1899 +4299,22361,99224 +9247,8808,49402 +32079,25117,90078 +8029,45932,48977 +88930,61704,58728 +57699,53512,94112 +22453,54132,92136 +46853,74970,97061 +54974,76681,53206 +1910,88848,8328 +75299,92526,82480 +63705,43449,58210 +39031,99663,30342 +6074,82751,70661 +60560,21757,70040 +94165,56320,56260 +39304,62254,82719 +33728,94971,47639 +51500,34926,89050 +63848,50922,9947 +88040,83076,90684 +37565,7239,99565 +40015,99262,60924 +67356,130,15147 +32057,87877,72362 +83955,64590,81759 +44755,37686,44902 +40098,33806,15831 +74809,10453,47104 +15701,25131,6386 +84105,23240,77827 +8074,57466,99148 +48471,41060,19380 +64612,48080,72406 +59340,17899,96709 +47120,89317,16889 +79555,53478,10077 +84980,24000,14937 +44467,6863,1685 +97708,6974,44753 +65233,31970,80117 +46765,82681,49960 +5460,16849,80641 +73216,11101,1632 +16576,75567,62658 +31416,83571,88651 +72363,39894,90084 +47419,45881,16086 +30238,27903,10872 +99926,65424,56338 +10550,84238,18747 +54200,72420,96008 +53918,78905,72819 +91461,78745,64612 +15496,56025,9684 +15848,63621,72470 +32772,51613,3606 +30191,42660,96275 +52875,44310,75709 +12253,37358,35160 +35920,28277,75320 +63326,49694,35482 +88026,1167,53454 +64776,72691,53157 +88432,75655,85491 +71104,41528,45055 +90906,78929,67060 +50780,95156,60009 +59204,66970,35477 +28862,21537,87789 +90822,20941,21811 +42660,93541,78650 +94999,73917,93466 +79029,4860,91385 +76690,56287,27612 +63206,99518,89264 +35348,27209,25223 +95368,31121,30231 +66437,45610,92367 +6269,41481,63517 +79675,59346,58259 +19091,49627,8735 +87621,79146,4448 +7025,79298,30757 +18717,43854,91452 +84636,1119,77360 +40258,71740,93880 +83034,52918,26862 +46567,6323,7792 +67128,56554,45520 +33338,7076,73868 +59074,85867,42951 +71082,83983,39706 +1287,73219,6462 +65325,96304,91804 +43230,87147,19568 +70452,61743,56595 +87500,6064,94208 +34039,68154,84518 +26671,89805,70072 +57764,77660,36390 +1693,80672,17244 +26353,49595,31690 +27001,60710,4703 +17006,13774,76513 +15483,30109,78377 +27930,21057,28600 +7323,58776,21285 +40066,17377,34835 +68323,98451,72276 +56487,14057,29110 +574,11569,44437 +76188,50709,85149 +48806,58199,39696 +67155,39613,45664 +45672,85127,54359 +71611,29934,9734 +96771,50775,72652 +57938,74725,10297 +18431,12956,35177 +9554,24153,68193 +19971,54774,9167 +45038,30571,70480 +62424,66969,87359 +26159,43646,69226 +50486,86121,77251 +22701,67763,33089 +25186,80124,71835 +42916,4869,53591 +37719,67079,3413 +85547,64607,20356 +11571,25167,77075 +9850,38429,2268 +72847,65444,68744 +49364,32329,5337 +32532,45821,62127 +59020,84827,97392 +66553,66400,51503 +59513,31272,19374 +14064,17648,98276 +31617,57138,45790 +5394,35581,31983 +32062,33668,61113 +38055,34365,37121 +48053,53135,69543 +39107,62047,56767 +45801,43405,97034 +67921,83518,84504 +64110,27581,86664 +96407,41126,92231 +92112,11643,23366 +2091,42972,68690 +7395,56114,74131 +46395,18753,66885 +22315,5325,72198 +5879,51737,78821 +19738,51513,31874 +58487,87620,57754 +91633,80970,45915 +3873,69474,73760 +62209,20682,60530 +18612,9728,14847 +47899,61560,76737 +773,77823,40210 +32043,64401,68872 +22000,65748,10662 +18673,94090,46959 +17257,12435,16983 +23920,33228,34016 +33072,67029,17877 +9881,99418,2594 +31050,70589,14767 +62959,21689,23990 +16212,46305,50497 +93647,95276,22918 +52306,68981,99018 +81745,42491,37818 +44223,95719,92971 +64420,44780,12305 +10734,37408,79822 +89445,4508,32280 +66616,90201,2618 +16506,34154,92476 +11808,14386,64943 +35166,78035,51304 +10821,7440,16179 +8697,28518,43753 +26935,52388,89881 +40235,71853,97179 +25594,86569,57790 +53036,68212,66097 +11536,65469,86516 +22069,45979,31160 +97422,2549,18081 +95081,10790,65014 +13640,37082,95952 +55145,17209,42635 +54028,35326,10699 +47125,67192,66068 +9642,7359,63207 +78755,80514,13883 +51250,87908,70115 +28094,32199,94649 +23018,38008,74413 +25383,15424,44069 +43865,28073,13206 +43515,37421,36296 +84006,99930,49816 +83641,93521,98833 +1314,59658,75508 +74802,14426,96621 +34911,89236,87950 +43728,70382,67614 +15843,53250,53230 +12750,11196,79597 +86728,76495,53422 +86634,75223,41313 +94334,7008,34496 +68715,58417,87253 +71407,61689,9447 +48236,95533,49473 +42727,57753,11997 +86496,95279,43166 +92133,2796,49122 +10618,56360,4770 +71569,4087,6368 +95839,85597,54234 +56567,23555,69835 +82281,77883,9103 +36384,38000,41179 +37307,43316,40143 +38753,79380,42619 +30313,46752,50251 +2051,52310,40589 +19703,36799,84660 +81374,68344,43006 +17278,91292,11099 +96878,8478,37112 +72142,9717,46916 +46701,44704,58232 +87045,16364,79582 +21088,15526,95789 +29534,84698,30431 +901,8617,54778 +92340,37219,71212 +53519,5312,71758 +53607,57053,51781 +69692,70001,53256 +85496,83175,96528 +78004,54314,8934 +82643,28585,5061 +4406,84291,98748 +17430,58,41901 +31413,26236,69512 +16848,25476,51028 +15668,30051,53818 +40533,17142,7285 +74189,14420,17247 +58221,25094,6053 +59785,94703,59485 +63183,10223,12101 +52529,86551,95204 +13458,30937,93285 +41549,86392,73527 +98527,61445,48205 +71416,57131,72735 +45333,65316,91458 +41258,33203,83129 +21662,10945,14623 +27694,83280,41784 +86450,39189,62121 +96141,31361,14169 +48322,10989,4490 +71228,36775,23197 +52856,37292,8090 +3602,82093,96839 +67675,24456,52628 +15134,6682,76221 +62546,64583,60442 +50490,12506,57566 +62069,73753,68869 +8826,32095,64563 +53390,13385,72081 +67507,14079,61867 +39470,66617,18130 +17240,87535,39498 +65681,73141,83896 +69476,24365,97279 +56883,74400,40088 +28772,44158,50175 +96810,98088,39913 +10795,41187,96558 +46862,62965,86640 +19612,49844,50127 +32435,28815,15508 +21867,85470,44104 +99062,83026,61606 +75306,80962,47756 +78745,20447,15995 +69668,45427,10972 +26568,14021,30921 +71134,93985,8305 +61919,83484,67485 +27882,59534,47520 +14138,15975,88809 +42379,71884,70228 +42465,74770,80406 +23574,59421,35389 +46005,87069,80221 +64482,36433,69692 +1282,73552,36586 +44140,5662,77592 +57387,95775,30164 +16323,61448,84514 +52229,41847,54878 +38068,97939,90215 +51269,71679,50828 +34337,74447,31255 +85781,92436,65312 +91372,32691,79194 +56237,9665,49375 +83322,86531,67824 +25399,15708,43572 +85336,59583,34456 +17138,13789,30091 +37932,66483,41354 +71974,52876,89627 +13175,71909,93268 +97627,3539,1681 +46099,80202,30081 +22853,54575,76552 +43948,76241,27478 +61607,48698,6466 +48002,24967,25556 +88415,86960,60676 +74797,7171,27098 +30418,19092,73372 +68378,92173,71444 +23546,32604,58721 +10226,90247,1185 +25009,59065,24499 +66948,66487,68098 +96740,31859,99536 +83159,90014,42606 +24302,64671,67238 +88264,55300,41715 +44065,34291,28337 +18451,19911,88773 +47509,68772,16241 +76388,73632,85831 +86260,77284,27444 +90615,818,99061 +85810,38662,77835 +25077,37126,6695 +17215,89170,59612 +47575,79093,90943 +21789,98678,14183 +95414,32490,37200 +22878,72173,95043 +29342,91611,85523 +10676,1097,43991 +38038,62140,50550 +66170,72284,40900 +5992,45701,51278 +4226,39622,5384 +50615,79215,15549 +8512,17272,86617 +59026,75486,28773 +57992,61538,23255 +80263,79288,23234 +95170,70262,1912 +19588,94805,51343 +94907,86492,88193 +80850,28840,22434 +30636,84246,75996 +59529,87577,4189 +33141,10332,5262 +90212,55533,34182 +92683,14523,75380 +529,59129,22357 +73233,13046,89550 +20560,72482,93026 +22939,21446,20496 +78550,98673,47170 +86727,1114,13528 +38591,60579,65079 +4475,23357,19320 +86219,34865,98521 +40593,34362,32456 +30891,98449,21634 +87051,2092,61042 +53032,94640,60093 +190,56281,18766 +84867,88621,93329 +46130,9587,5792 +25787,17534,38484 +73916,24464,75582 +73092,74089,31362 +53198,56232,39634 +67520,30781,942 +27651,37580,71694 +23800,37467,81465 +45005,10016,79164 +23810,8611,13681 +29970,17996,60901 +54979,57514,36552 +4068,87924,15925 +35934,74631,61399 +64436,45797,44286 +38284,28152,95849 +523,10778,25517 +77886,37327,30812 +24881,94437,68902 +55701,27807,65010 +69291,3661,95357 +62808,19454,92557 +76546,88143,21210 +87159,46012,54852 +52016,25675,12229 +90627,11694,66240 +39840,50663,77383 +37850,20075,16855 +46123,49276,41709 +9841,30314,28729 +24036,92621,73386 +73007,35550,8045 +34964,78688,83483 +10433,15926,99336 +73552,17813,33222 +25936,92655,96093 +36951,65621,4057 +62030,83029,3628 +91931,56489,24051 +71285,84753,43456 +69421,19101,92677 +38247,7008,22306 +95690,50715,81400 +22798,1883,39078 +97393,48957,89157 +42167,25755,87418 +95119,34779,51786 +71514,70273,70835 +99210,28565,64867 +31121,92709,82492 +51862,56425,91067 +63799,6933,12926 +65081,34010,4993 +41832,52496,8111 +99859,25145,31525 +92768,61850,5512 +17645,46909,77156 +62793,57219,38426 +78306,94172,26022 +91167,12373,3805 +33640,41783,43863 +56366,36383,9678 +83694,24800,5147 +4885,80906,93573 +21732,89697,76598 +6266,61297,78070 +12374,50957,91738 +11776,90678,3264 +97326,30002,79779 +28641,36292,37111 +39833,30567,25396 +35909,62018,6206 +21850,96541,73833 +86956,40020,66525 +79420,38008,890 +39101,3648,22468 +2499,5639,67269 +95019,13984,45046 +82933,34460,11266 +97700,68285,51 +73905,33376,83750 +63662,67674,28584 +24588,27576,21634 +97059,5813,49718 +30124,72392,46180 +16775,35272,80557 +75498,97257,73279 +95114,95234,76997 +54596,73687,23359 +53294,48560,56348 +33487,76996,53403 +28739,49349,31941 +18557,78351,61431 +64905,46577,81367 +44147,57239,46764 +62965,61422,29023 +97670,76554,84092 +42453,38904,72747 +17517,70357,94159 +33072,83730,97076 +97895,72132,63672 +94036,9635,98011 +15702,80797,96997 +33335,92606,96309 +83537,30546,27618 +16632,55681,95850 +56081,22189,66801 +97312,65034,99349 +98178,68577,82699 +43720,64193,14149 +6016,53580,30644 +72967,22085,75631 +44076,40943,71809 +76705,12450,70391 +51251,56708,65053 +83935,10987,93955 +66536,61372,66465 +89463,62762,94419 +95606,43220,10051 +94821,65440,98446 +60080,87051,33313 +95270,75515,60761 +54863,3268,80687 +1909,70758,54694 +49428,8815,13045 +96637,41312,2821 +66895,69930,1284 +49925,408,12055 +20209,77302,53289 +60080,26400,49818 +39613,33132,52818 +45108,95087,47179 +9884,11815,82890 +2323,23516,93150 +21852,66060,13310 +59513,55728,29959 +62160,58529,71656 +86380,28957,8736 +83564,92735,71634 +68608,79619,6878 +31147,95647,15911 +17986,18680,7898 +5753,33596,30133 +72437,56701,53475 +17081,51766,92019 +26956,48589,21616 +34223,64851,30124 +52350,26964,16468 +1144,50802,28939 +5712,11837,42034 +15633,4342,96840 +36687,11858,80723 +37531,57305,41909 +67029,44245,20705 +91002,54485,61476 +65250,95415,46856 +87169,76076,34533 +12890,19560,30695 +28762,24084,58486 +39240,1604,85100 +39103,72587,42114 +21171,24641,75521 +82258,85786,30549 +26368,60414,69201 +58510,87510,82379 +95323,37796,58953 +70970,83300,69756 +98576,47603,57841 +54479,64696,48572 +26408,16473,8468 +6180,4857,97239 +43028,32921,88920 +19643,23141,24872 +5678,63810,21519 +38860,75464,2836 +6777,14326,4853 +93688,41663,73761 +69481,83550,90311 +90697,31630,92244 +49772,97939,98914 +56742,75301,23707 +97519,76079,65520 +20657,29559,27790 +40535,54454,75405 +16180,36048,74480 +92084,56295,18038 +92133,27983,82739 +56252,59282,29503 +53867,67955,13840 +48145,48229,85662 +24253,18455,79477 +63328,28633,22301 +5287,14348,45080 +55134,71511,8468 +25616,92236,52740 +79996,6074,86711 +17076,68986,2270 +40297,55699,44597 +53144,39238,79990 +77647,75019,29337 +41808,19432,82428 +97364,13058,81279 +4482,85751,74652 +25202,34094,17675 +39125,77660,60813 +10603,39789,68162 +32436,92486,20095 +91767,55765,17030 +2462,8304,79939 +65605,79562,43967 +37095,62401,71231 +14734,32542,57111 +15628,71608,51104 +13179,98114,90116 +56224,98078,69900 +19501,15471,865 +20509,39055,59319 diff --git a/src/main/resources/eu/sim642/adventofcode2025/day9.txt b/src/main/resources/eu/sim642/adventofcode2025/day9.txt new file mode 100644 index 00000000..ab41d76a --- /dev/null +++ b/src/main/resources/eu/sim642/adventofcode2025/day9.txt @@ -0,0 +1,496 @@ +98139,50134 +98139,51344 +97752,51344 +97752,52552 +97690,52552 +97690,53768 +97716,53768 +97716,55028 +98110,55028 +98110,56140 +97156,56140 +97156,57477 +97912,57477 +97912,58631 +97393,58631 +97393,59810 +97068,59810 +97068,60999 +96805,60999 +96805,62191 +96547,62191 +96547,63241 +95790,63241 +95790,64439 +95574,64439 +95574,65656 +95388,65656 +95388,66774 +94904,66774 +94904,67836 +94290,67836 +94290,69244 +94501,69244 +94501,70268 +93788,70268 +93788,71148 +92809,71148 +92809,72346 +92489,72346 +92489,73328 +91753,73328 +91753,74320 +91051,74320 +91051,75306 +90348,75306 +90348,76613 +90136,76613 +90136,77644 +89480,77644 +89480,78337 +88364,78337 +88364,79295 +87628,79295 +87628,80165 +86784,80165 +86784,81228 +86171,81228 +86171,82441 +85705,82441 +85705,83098 +84624,83098 +84624,84064 +83873,84064 +83873,84825 +82918,84825 +82918,85335 +81744,85335 +81744,86744 +81365,86744 +81365,86949 +79956,86949 +79956,88350 +79514,88350 +79514,88946 +78431,88946 +78431,89218 +77134,89218 +77134,90171 +76314,90171 +76314,91035 +75418,91035 +75418,91538 +74296,91538 +74296,91669 +72975,91669 +72975,92779 +72193,92779 +72193,92918 +70903,92918 +70903,93286 +69742,93286 +69742,93717 +68615,93717 +68615,94951 +67809,94951 +67809,95446 +66686,95446 +66686,95710 +65481,95710 +65481,95839 +64241,95839 +64241,95966 +63013,95966 +63013,96113 +61801,96113 +61801,97201 +60813,97201 +60813,96716 +59464,96716 +59464,97458 +58368,97458 +58368,97772 +57181,97772 +57181,97368 +55897,97368 +55897,97883 +54733,97883 +54733,97638 +53493,97638 +53493,97722 +52286,97722 +52286,98001 +51081,98001 +51081,97675 +49866,97675 +49866,97707 +48657,97707 +48657,98136 +47423,98136 +47423,97634 +46238,97634 +46238,98098 +44972,98098 +44972,97622 +43799,97622 +43799,97855 +42531,97855 +42531,97299 +41385,97299 +41385,96972 +40209,96972 +40209,96335 +39110,96335 +39110,96563 +37804,96563 +37804,95651 +36799,95651 +36799,95762 +35501,95762 +35501,94989 +34481,94989 +34481,95417 +33034,95417 +33034,94438 +32104,94438 +32104,93632 +31130,93632 +31130,93574 +29830,93574 +29830,93411 +28554,93411 +28554,92731 +27526,92731 +27526,91888 +26595,91888 +26595,91570 +25371,91570 +25371,90514 +24589,90514 +24589,89701 +23674,89701 +23674,89384 +22423,89384 +22423,88761 +21369,88761 +21369,87707 +20642,87707 +20642,87225 +19472,87225 +19472,85980 +18936,85980 +18936,85790 +17482,85790 +17482,84618 +16907,84618 +16907,83563 +16247,83563 +16247,82768 +15333,82768 +15333,82271 +14078,82271 +14078,80864 +13842,80864 +13842,80408 +12492,80408 +12492,79557 +11593,79557 +11593,78479 +10986,78479 +10986,77474 +10289,77474 +10289,76312 +9830,76312 +9830,75465 +8887,75465 +8887,74377 +8322,74377 +8322,73361 +7631,73361 +7631,71962 +7666,71962 +7666,71126 +6622,71126 +6622,70096 +5936,70096 +5936,68996 +5389,68996 +5389,67683 +5367,67683 +5367,66513 +5025,66513 +5025,65515 +4188,65515 +4188,64224 +4215,64224 +4215,63167 +3489,63167 +3489,61910 +3462,61910 +3462,60708 +3257,60708 +3257,59625 +2484,59625 +2484,58265 +3125,58265 +3125,57194 +2142,57194 +2142,55886 +2721,55886 +2721,54690 +2552,54690 +2552,53529 +1870,53529 +1870,52300 +1984,52300 +1984,51075 +2287,51075 +2287,50126 +94997,50126 +94997,48641 +1738,48641 +1738,47438 +2142,47438 +2142,46228 +2242,46228 +2242,45035 +2503,45035 +2503,43802 +2400,43802 +2400,42582 +2469,42582 +2469,41477 +3203,41477 +3203,40123 +2614,40123 +2614,39130 +3748,39130 +3748,37771 +3311,37771 +3311,36688 +3965,36688 +3965,35618 +4607,35618 +4607,34321 +4547,34321 +4547,33197 +5019,33197 +5019,31962 +5208,31962 +5208,31031 +6138,31031 +6138,29690 +6123,29690 +6123,28824 +7136,28824 +7136,27785 +7761,27785 +7761,26487 +7917,26487 +7917,25366 +8421,25366 +8421,24655 +9592,24655 +9592,23544 +10102,23544 +10102,22385 +10560,22385 +10560,21358 +11223,21358 +11223,20681 +12341,20681 +12341,19804 +13179,19804 +13179,18387 +13383,18387 +13383,17846 +14610,17846 +14610,16742 +15209,16742 +15209,16240 +16429,16240 +16429,14832 +16758,14832 +16758,14652 +18243,14652 +18243,13592 +18921,13592 +18921,13025 +20023,13025 +20023,11804 +20605,11804 +20605,11323 +21765,11323 +21765,10506 +22675,10506 +22675,10187 +23921,10187 +23921,9541 +24939,9541 +24939,8539 +25750,8539 +25750,7925 +26800,7925 +26800,7268 +27831,7268 +27831,7118 +29114,7118 +29114,6182 +30015,6182 +30015,5471 +31038,5471 +31038,5830 +32500,5830 +32500,5118 +33520,5118 +33520,4516 +34595,4516 +34595,3842 +35659,3842 +35659,3852 +36935,3852 +36935,3660 +38140,3660 +38140,3437 +39332,3437 +39332,2972 +40472,2972 +40472,2852 +41686,2852 +41686,2524 +42863,2524 +42863,2771 +44119,2771 +44119,2721 +45326,2721 +45326,2485 +46515,2485 +46515,2257 +47712,2257 +47712,2068 +48919,2068 +48919,2423 +50133,2423 +50133,2070 +51349,2070 +51349,2501 +52542,2501 +52542,1823 +53804,1823 +53804,2662 +54947,2662 +54947,2141 +56231,2141 +56231,2160 +57466,2160 +57466,2742 +58606,2742 +58606,3176 +59759,3176 +59759,3160 +61007,3160 +61007,3713 +62122,3713 +62122,3596 +63418,3596 +63418,4576 +64391,4576 +64391,4917 +65550,4917 +65550,5332 +66685,5332 +66685,5802 +67798,5802 +67798,5698 +69158,5698 +69158,5988 +70371,5988 +70371,7040 +71222,7040 +71222,7085 +72570,7085 +72570,8251 +73325,8251 +73325,8772 +74424,8772 +74424,9591 +75344,9591 +75344,10037 +76498,10037 +76498,10972 +77326,10972 +77326,11171 +78680,11171 +78680,12095 +79510,12095 +79510,12791 +80513,12791 +80513,13793 +81258,13793 +81258,14467 +82284,14467 +82284,15132 +83330,15132 +83330,16459 +83729,16459 +83729,17146 +84756,17146 +84756,17950 +85674,17950 +85674,18854 +86486,18854 +86486,19790 +87261,19790 +87261,20559 +88254,20559 +88254,21754 +88691,21754 +88691,22539 +89690,22539 +89690,23885 +89867,23885 +89867,24583 +91032,24583 +91032,25801 +91371,25801 +91371,27020 +91675,27020 +91675,27977 +92449,27977 +92449,29020 +93074,29020 +93074,30116 +93597,30116 +93597,31248 +94036,31248 +94036,32343 +94564,32343 +94564,33526 +94865,33526 +94865,34739 +95057,34739 +95057,35811 +95668,35811 +95668,37049 +95744,37049 +95744,38096 +96509,38096 +96509,39350 +96482,39350 +96482,40433 +97222,40433 +97222,41595 +97659,41595 +97659,42878 +97375,42878 +97375,44100 +97379,44100 +97379,45229 +98259,45229 +98259,46460 +98267,46460 +98267,47709 +97813,47709 +97813,48914 +98189,48914 +98189,50134 diff --git a/src/main/scala/eu/sim642/adventofcode2017/Day2.scala b/src/main/scala/eu/sim642/adventofcode2017/Day2.scala index b3e6cdf5..429050b7 100644 --- a/src/main/scala/eu/sim642/adventofcode2017/Day2.scala +++ b/src/main/scala/eu/sim642/adventofcode2017/Day2.scala @@ -19,7 +19,7 @@ object Day2 { object Part2 extends Part { override def rowChecksum(row: Seq[Int]): Int = { - val descRow = row.sorted(Ordering[Int].reverse) + val descRow = row.sorted(using Ordering[Int].reverse) val dividePairs = for { i <- descRow.indices j <- (i + 1) until descRow.size diff --git a/src/main/scala/eu/sim642/adventofcode2018/Day23.scala b/src/main/scala/eu/sim642/adventofcode2018/Day23.scala index 63c04e44..84f2f233 100644 --- a/src/main/scala/eu/sim642/adventofcode2018/Day23.scala +++ b/src/main/scala/eu/sim642/adventofcode2018/Day23.scala @@ -4,6 +4,7 @@ import eu.sim642.adventofcodelib.box.{Box3, Box4} import eu.sim642.adventofcodelib.pos.Pos3 import eu.sim642.adventofcodelib.pos.Pos4 import eu.sim642.adventofcodelib.IntegralImplicits.* +import eu.sim642.adventofcodelib.graph.BronKerbosch import scala.collection.mutable import scala.util.boundary @@ -40,35 +41,9 @@ object Day23 { } object NaiveCliquePart2Solution extends Part2Solution { - def maximumClique(neighbors: Map[Nanobot, Set[Nanobot]]): Set[Nanobot] = { - var best: Set[Nanobot] = Set.empty - - def bronKerbosh(r: Set[Nanobot], p: Set[Nanobot], x: Set[Nanobot]): Unit = { - if (p.isEmpty && x.isEmpty) { - //println(r) - if (r.size > best.size) - best = r - } - else { - //val u = p.headOption.getOrElse(x.head) - val u = (p ++ x).maxBy(neighbors(_).size) // pivot on highest degree - var p2 = p - var x2 = x - for (v <- p -- neighbors(u)) { - bronKerbosh(r + v, p2 intersect neighbors(v), x2 intersect neighbors(v)) - p2 -= v - x2 += v - } - } - } - - bronKerbosh(Set.empty, neighbors.keySet, Set.empty) - best - } - def maximumOverlap(nanobots: Seq[Nanobot]): Set[Nanobot] = { val neighbors: Map[Nanobot, Set[Nanobot]] = nanobots.map(nanobot1 => nanobot1 -> nanobots.filter(nanobot2 => nanobot2 != nanobot1 && nanobot1.overlaps(nanobot2)).toSet).toMap - maximumClique(neighbors) + BronKerbosch.maximumClique(neighbors) } def closestMostNanobots(nanobots: Seq[Nanobot]): Int = { @@ -168,7 +143,7 @@ object Day23 { def closestMostNanobots(nanobots: Seq[Nanobot]): Int = { val queue: mutable.PriorityQueue[(Nanobot, (Int, Int), Int)] = - mutable.PriorityQueue.empty(Ordering.by({ case (octahedron, (lower, upper), originDist) => + mutable.PriorityQueue.empty(using Ordering.by({ case (octahedron, (lower, upper), originDist) => (upper, lower, -originDist) //(upper, -octahedron.radius, -originDist) // much faster but possibly incorrect? })) @@ -266,7 +241,7 @@ object Day23 { def closestMostNanobots(nanobots: Seq[Nanobot]): Int = { val queue: mutable.PriorityQueue[(Box3, (Int, Int), Int)] = - mutable.PriorityQueue.empty(Ordering.by({ case (octahedron, (lower, upper), originDist) => + mutable.PriorityQueue.empty(using Ordering.by({ case (octahedron, (lower, upper), originDist) => (upper, lower, -originDist) //(upper, -octahedron.radius, -originDist) // much faster but possibly incorrect? })) diff --git a/src/main/scala/eu/sim642/adventofcode2019/Day10.scala b/src/main/scala/eu/sim642/adventofcode2019/Day10.scala index 1bebf7d2..83c57419 100644 --- a/src/main/scala/eu/sim642/adventofcode2019/Day10.scala +++ b/src/main/scala/eu/sim642/adventofcode2019/Day10.scala @@ -65,7 +65,7 @@ object Day10 { Seq.empty else { val visible = filterVisible(monitoring, asteroids) - val vaporizeRotation = visible.toSeq.sortBy(laserAngle(monitoring, _))(Ordering.Double.TotalOrdering) + val vaporizeRotation = visible.toSeq.sortBy(laserAngle(monitoring, _))(using Ordering.Double.TotalOrdering) vaporizeRotation ++ vaporizeSeq(monitoring, asteroids -- visible) } } diff --git a/src/main/scala/eu/sim642/adventofcode2019/Day13.scala b/src/main/scala/eu/sim642/adventofcode2019/Day13.scala index 42c81349..54245111 100644 --- a/src/main/scala/eu/sim642/adventofcode2019/Day13.scala +++ b/src/main/scala/eu/sim642/adventofcode2019/Day13.scala @@ -16,6 +16,8 @@ object Day13 { case (acc, LazyList(x, y, tile)) => val pos = Pos(x.toInt, y.toInt) acc + (pos -> tile.toInt) + case (_, _) => + throw new IllegalArgumentException("incomplete output") }) } diff --git a/src/main/scala/eu/sim642/adventofcode2019/Day18.scala b/src/main/scala/eu/sim642/adventofcode2019/Day18.scala index 67855209..b083cccc 100644 --- a/src/main/scala/eu/sim642/adventofcode2019/Day18.scala +++ b/src/main/scala/eu/sim642/adventofcode2019/Day18.scala @@ -23,6 +23,7 @@ object Day18 { trait KeyNeighborsSolution extends Solution { case class PathData(distance: Int, pathDoors: Set[Pos], pathKeys: Set[Pos]) + // https://en.wikipedia.org/wiki/Transit_node_routing def getKeyNeighbors(input: Input): collection.Map[Pos, collection.Map[Pos, PathData]] override def collectKeysSteps(input: Input): Int = { diff --git a/src/main/scala/eu/sim642/adventofcode2021/Day23.scala b/src/main/scala/eu/sim642/adventofcode2021/Day23.scala index 78440534..569869ad 100644 --- a/src/main/scala/eu/sim642/adventofcode2021/Day23.scala +++ b/src/main/scala/eu/sim642/adventofcode2021/Day23.scala @@ -33,6 +33,7 @@ object Day23 { private case class PathData(length: Int, pathPoss: Set[Pos]) + // https://en.wikipedia.org/wiki/Transit_node_routing private val posNeighbors: collection.Map[Pos, collection.Map[Pos, PathData]] = { val allPoss: Set[Pos] = hallways ++ room2amphipod.keySet diff --git a/src/main/scala/eu/sim642/adventofcode2022/Day16.scala b/src/main/scala/eu/sim642/adventofcode2022/Day16.scala index 5621fecc..0f08baea 100644 --- a/src/main/scala/eu/sim642/adventofcode2022/Day16.scala +++ b/src/main/scala/eu/sim642/adventofcode2022/Day16.scala @@ -12,6 +12,7 @@ object Day16 { case class ValveData(flowRate: Int, tunnels: Seq[Valve]) + // https://en.wikipedia.org/wiki/Transit_node_routing def valveDists(valves: Map[Valve, ValveData]): collection.Map[Valve, collection.Map[Valve, Int]] = { val dists: mutable.Map[Valve, mutable.Map[Valve, Int]] = valves.view.mapValues(_.tunnels.map(_ -> 1).to(mutable.Map)).to(mutable.Map) // Floyd-Warshall diff --git a/src/main/scala/eu/sim642/adventofcode2022/Day22.scala b/src/main/scala/eu/sim642/adventofcode2022/Day22.scala index e8ee4811..6f107a46 100644 --- a/src/main/scala/eu/sim642/adventofcode2022/Day22.scala +++ b/src/main/scala/eu/sim642/adventofcode2022/Day22.scala @@ -85,6 +85,7 @@ object Day22 { case Pos(0, 1) => Pos(pos.x, mapTranspose(pos.x).indexWhere(_ != ' ')) case Pos(-1, 0) => Pos(map(pos.y).lastIndexWhere(_ != ' '), pos.y) case Pos(0, -1) => Pos(pos.x, mapTranspose(pos.x).lastIndexWhere(_ != ' ')) + case _ => throw new IllegalArgumentException("illegal facing") } PosFacing(newPos, facing) } @@ -120,6 +121,7 @@ object Day22 { case Pos(0, 1) => Pos(edgeLength - 1, edgeLength - 1) case Pos(-1, 0) => Pos(0, edgeLength - 1) case Pos(0, -1) => Pos(0, 0) + case _ => throw new IllegalArgumentException("illegal edge") } def wrap(posFacing: PosFacing): PosFacing = { diff --git a/src/main/scala/eu/sim642/adventofcode2023/Day7.scala b/src/main/scala/eu/sim642/adventofcode2023/Day7.scala index 39d01a29..b3077c97 100644 --- a/src/main/scala/eu/sim642/adventofcode2023/Day7.scala +++ b/src/main/scala/eu/sim642/adventofcode2023/Day7.scala @@ -17,10 +17,10 @@ object Day7 { case HighCard } - val handTypeOrdering: Ordering[HandType] = Ordering.by[HandType, Int](_.ordinal)(Ordering[Int]).reverse + val handTypeOrdering: Ordering[HandType] = Ordering.by[HandType, Int](_.ordinal)(using Ordering[Int]).reverse def handFrequency(hand: Hand): Seq[Int] = - hand.groupCount(identity).values.toSeq.sorted(Ordering[Int].reverse) + hand.groupCount(identity).values.toSeq.sorted(using Ordering[Int].reverse) def frequencyHandType(freq: Seq[Int]): HandType = freq match { case Seq(5) => HandType.FiveOfAKind @@ -40,11 +40,11 @@ object Day7 { def handType(hand: Hand): HandType - val handOrdering: Ordering[Hand] = Ordering.by(handType)(handTypeOrdering).orElse(Ordering.Implicits.seqOrdering(cardOrdering)) + val handOrdering: Ordering[Hand] = Ordering.by(handType)(using handTypeOrdering).orElse(Ordering.Implicits.seqOrdering(using cardOrdering)) def totalWinnings(hands: Seq[(Hand, Int)]): Int = { hands - .sortBy(_._1)(handOrdering) + .sortBy(_._1)(using handOrdering) .zipWithIndex .map({ case ((hand, bid), i) => (i + 1) * bid }) .sum diff --git a/src/main/scala/eu/sim642/adventofcode2023/Day8.scala b/src/main/scala/eu/sim642/adventofcode2023/Day8.scala index afe92524..cec4b453 100644 --- a/src/main/scala/eu/sim642/adventofcode2023/Day8.scala +++ b/src/main/scala/eu/sim642/adventofcode2023/Day8.scala @@ -15,6 +15,7 @@ object Day8 { instructions.cycle.scanLeft(startNode)({ case (node, 'L') => network(node)._1 case (node, 'R') => network(node)._2 + case _ => throw new IllegalArgumentException("illegal instruction") }) } diff --git a/src/main/scala/eu/sim642/adventofcode2024/Day17.scala b/src/main/scala/eu/sim642/adventofcode2024/Day17.scala index e96d0952..c0552551 100644 --- a/src/main/scala/eu/sim642/adventofcode2024/Day17.scala +++ b/src/main/scala/eu/sim642/adventofcode2024/Day17.scala @@ -102,7 +102,7 @@ object Day17 { object ReverseEngineeredZ3Part2Solution extends Part2Solution { override def findQuineA(input: Input): Long = { - val Seq(2, 4, 1, bxl1, 7, 5, 1, bxl2, 4, 5, 0, 3, 5, 5, 3, 0) = input.program // TODO: doesn't support other orders of some operations + val Seq(2, 4, 1, bxl1, 7, 5, 1, bxl2, 4, 5, 0, 3, 5, 5, 3, 0) = input.program: @unchecked // TODO: doesn't support other orders of some operations val ctx = new Context(Map("model" -> "true").asJava) import ctx._ @@ -211,7 +211,7 @@ object Day17 { object ReverseEngineeredPart2Solution extends Part2Solution { override def findQuineA(input: Input): Long = { - val iterProgram :+ 3 :+ 0 = input.program + val iterProgram :+ 3 :+ 0 = input.program: @unchecked @tailrec def helper(as: Set[Long], expectedOutputsRev: List[Byte]): Set[Long] = expectedOutputsRev match { diff --git a/src/main/scala/eu/sim642/adventofcode2024/Day21.scala b/src/main/scala/eu/sim642/adventofcode2024/Day21.scala new file mode 100644 index 00000000..9343593f --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcode2024/Day21.scala @@ -0,0 +1,192 @@ +package eu.sim642.adventofcode2024 + +import eu.sim642.adventofcodelib.Grid +import eu.sim642.adventofcodelib.GridImplicits.* +import eu.sim642.adventofcodelib.box.Box +import eu.sim642.adventofcodelib.graph.* +import eu.sim642.adventofcodelib.pos.Pos + +import scala.collection.mutable + +object Day21 { + + type Code = String + + private val numericKeypad: Grid[Char] = Vector( + Vector('7', '8', '9'), + Vector('4', '5', '6'), + Vector('1', '2', '3'), + Vector(' ', '0', 'A'), + ) + + private val directionalKeypad: Grid[Char] = Vector( + Vector(' ', '^', 'A'), + Vector('<', 'v', '>'), + ) + + private val directionalOffsets = Map( + '^' -> Pos(0, -1), + '>' -> Pos(1, 0), + 'v' -> Pos(0, 1), + '<' -> Pos(-1, 0), + ) + + trait Solution { + def shortestSequenceLength(code: Code, directionalKeypads: Int): Long + + def codeComplexity(code: Code, directionalKeypads: Int): Long = { + val numericPart = code.dropRight(1).toInt + shortestSequenceLength(code, directionalKeypads) * numericPart + } + + def sumCodeComplexity(codes: Seq[Code], directionalKeypads: Int): Long = codes.map(codeComplexity(_, directionalKeypads)).sum + } + + object NaiveSolution extends Solution { + + case class State(directionalPoss: List[Pos], numericPos: Pos, input: Code) { + + private def numericPress(button: Char): Option[State] = button match { + case 'A' => + val newButton = numericKeypad(numericPos) + Some(copy(input = input + newButton)) + case _ => + val offset = directionalOffsets(button) + val newNumericPos = numericPos + offset + if (numericKeypad.containsPos(newNumericPos) && numericKeypad(newNumericPos) != ' ') + Some(copy(numericPos = newNumericPos)) + else + None // out of keypad + } + + private def directionalPress(button: Char): Option[State] = directionalPoss match { + case Nil => numericPress(button) + case directionalPos :: newDirectionalPoss => + button match { + case 'A' => + val newButton = directionalKeypad(directionalPos) + copy(directionalPoss = newDirectionalPoss).directionalPress(newButton).map(newState => + newState.copy(directionalPoss = directionalPos :: newState.directionalPoss) + ) + case _ => + val offset = directionalOffsets(button) + val newDirectionalPos = directionalPos + offset + if (directionalKeypad.containsPos(newDirectionalPos) && directionalKeypad(newDirectionalPos) != ' ') + Some(copy(directionalPoss = newDirectionalPos :: newDirectionalPoss)) + else + None // out of keypad + } + } + + def userPress(button: Char): Option[State] = directionalPress(button) + } + + override def shortestSequenceLength(code: Code, directionalKeypads: Int): Long = { + + val graphSearch = new GraphSearch[State] with UnitNeighbors[State] { + override val startNode: State = + State(List.fill(directionalKeypads)(directionalKeypad.posOf('A')), numericKeypad.posOf('A'), "") + + override def unitNeighbors(state: State): IterableOnce[State] = { + // TODO: why not flatMap? + "^A".iterator.flatten(using state.userPress).filter(newState => code.startsWith(newState.input)) + } + + override def isTargetNode(state: State, dist: Int): Boolean = state.input == code + } + + BFS.search(graphSearch).target.get._2 + } + } + + object DynamicProgrammingSolution extends Solution { + + // copied & modified from 2024 day 10 + // TODO: extract to library? + def pathSearch[A](graphSearch: GraphSearch[A] & UnitNeighbors[A]): GraphSearch[List[A]] & UnitNeighbors[List[A]] = { + new GraphSearch[List[A]] with UnitNeighbors[List[A]] { + override val startNode: List[A] = List(graphSearch.startNode) + + override def unitNeighbors(node: List[A]): IterableOnce[List[A]] = + graphSearch.unitNeighbors(node.head).iterator.map(_ :: node) + + override def isTargetNode(node: List[A], dist: Int): Boolean = graphSearch.isTargetNode(node.head, dist) + } + } + + private val offsetDirectionals: Map[Pos, Char] = directionalOffsets.map(_.swap) + + private def keypadPaths(keypad: Grid[Char]): Map[(Char, Char), Set[Code]] = { + val box = Box(Pos.zero, Pos(keypad(0).size - 1, keypad.size - 1)) + // TODO: use one traversal per position (to all other positions), instead of pairwise + (for { + startPos <- box.iterator + if keypad(startPos) != ' ' + targetPos <- box.iterator + if keypad(targetPos) != ' ' + } yield { + // TODO: use multi-predecessor BFS to construct all shortest paths + val graphSearch = new GraphSearch[Pos] with UnitNeighbors[Pos] with TargetNode[Pos] { + override val startNode: Pos = startPos + + override def unitNeighbors(pos: Pos): IterableOnce[Pos] = + Pos.axisOffsets.map(pos + _).filter(keypad.containsPos).filter(keypad(_) != ' ') + + override val targetNode: Pos = targetPos + } + (keypad(targetPos), keypad(startPos)) -> // flipped because paths are reversed + SimultaneousBFS.search(pathSearch(graphSearch)) + .nodes + .filter(_.head == targetPos) + .map(poss => + (poss lazyZip poss.tail) + .map({ (p2, p1) => offsetDirectionals(p1 - p2) }) + .mkString + ) + .toSet + }).toMap + } + + private val numericPaths: Map[(Char, Char), Set[Code]] = keypadPaths(numericKeypad) + private val directionalPaths: Map[(Char, Char), Set[Code]] = keypadPaths(directionalKeypad) + + def keypadPaths(keypad: Int): Map[(Char, Char), Set[Code]] = if (keypad == 0) numericPaths else directionalPaths + + override def shortestSequenceLength(code: Code, directionalKeypads: Int): Long = { + val memo = mutable.Map.empty[(Code, Int), Long] + + def helper(code: Code, keypad: Int): Long = { + if (keypad == directionalKeypads + 1) + code.length + else { + memo.getOrElseUpdate((code, keypad), { + (("A" + code) lazyZip code) // start moving from A + .map({ (prev, cur) => + keypadPaths(keypad)((prev, cur)) + .map(path => helper(path + 'A', keypad + 1)) // end at A to press + .min + }) + .sum + }) + } + } + + helper(code, 0) + } + } + + def parseCodes(input: String): Seq[Code] = input.linesIterator.toSeq + + lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day21.txt")).mkString.trim + + val part1DirectionalKeypads = 2 + val part2DirectionalKeypads = 25 + + def main(args: Array[String]): Unit = { + import DynamicProgrammingSolution.* + println(sumCodeComplexity(parseCodes(input), part1DirectionalKeypads)) + println(sumCodeComplexity(parseCodes(input), part2DirectionalKeypads)) + + // part 2: 1301407762 - too low (Int overflowed in shortestSequenceLength2) + } +} diff --git a/src/main/scala/eu/sim642/adventofcode2024/Day22.scala b/src/main/scala/eu/sim642/adventofcode2024/Day22.scala new file mode 100644 index 00000000..83166586 --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcode2024/Day22.scala @@ -0,0 +1,52 @@ +package eu.sim642.adventofcode2024 + +import eu.sim642.adventofcodelib.IteratorImplicits._ + +object Day22 { + + type Secret = Long + + def mix(secret: Secret, value: Secret): Secret = value ^ secret + def prune(secret: Secret): Secret = secret & 0xFFFFFF // % 16777216 + + def nextSecret(secret: Secret): Secret = { + val secret1 = prune(mix(secret, secret << 6)) // * 64 + val secret2 = mix(secret1, secret1 >> 5) // / 32, no prune needed after right shift + prune(mix(secret2, secret2 << 11)) // * 2048 + } + + def secretIterator(initialSecret: Secret): Iterator[Secret] = + Iterator.iterate(initialSecret)(nextSecret) + + def sumSecretsAfter(secrets: Seq[Secret], after: Int = 2000): Secret = + secrets.map(secretIterator(_)(after)).sum + + def mostBananas(secrets: Seq[Secret]): Int = { + // TODO: optimize (~4.7s) + val secretMaps = secrets + .map({ initialSecret => + secretIterator(initialSecret).take(2000 + 1) + .map(_ % 10) + .map(_.toInt) + .sliding(5) + .map({ prices => + val changes = (prices lazyZip prices.tail).map((a, b) => b - a) + changes -> prices.last + }) + .groupMapReduce(_._1)(_._2)((a, _) => a) + }) + val secretMaps2 = secretMaps + .flatten + .groupMapReduce(_._1)(_._2)(_ + _) + secretMaps2.values.max + } + + def parseSecrets(input: String): Seq[Secret] = input.linesIterator.map(_.toLong).toSeq + + lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day22.txt")).mkString.trim + + def main(args: Array[String]): Unit = { + println(sumSecretsAfter(parseSecrets(input))) + println(mostBananas(parseSecrets(input))) + } +} diff --git a/src/main/scala/eu/sim642/adventofcode2024/Day23.scala b/src/main/scala/eu/sim642/adventofcode2024/Day23.scala new file mode 100644 index 00000000..e9e1ec97 --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcode2024/Day23.scala @@ -0,0 +1,43 @@ +package eu.sim642.adventofcode2024 + +import eu.sim642.adventofcodelib.graph.BronKerbosch + +object Day23 { + + type Computer = String + type Edge = (Computer, Computer) + + def edges2neighbors(edges: Set[Edge]): Map[Computer, Set[Computer]] = + (edges ++ edges.map(_.swap)).groupMap(_._1)(_._2) + + def find3Cliques(edges: Set[Edge]): Set[Set[Computer]] = { + val neighbors = edges2neighbors(edges) + for { + (from, to) <- edges + third <- neighbors(from) & neighbors(to) + } yield Set(from, third, to) + } + + def count3CliquesT(edges: Set[Edge]): Int = find3Cliques(edges).count(_.exists(_.startsWith("t"))) + + def maximumClique(edges: Set[Edge]): Set[Computer] = + BronKerbosch.maximumClique(edges2neighbors(edges)) + + def lanPartyPassword(edges: Set[Edge]): String = + maximumClique(edges).toSeq.sorted.mkString(",") + + def parseEdge(s: String): Edge = s match { + case s"$from-$to" => (from, to) + } + + def parseEdges(input: String): Set[Edge] = input.linesIterator.map(parseEdge).toSet + + lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day23.txt")).mkString.trim + + def main(args: Array[String]): Unit = { + println(count3CliquesT(parseEdges(input))) + println(lanPartyPassword(parseEdges(input))) + + // part 1: 2366 - too high (used contains 't' instead of startsWith 't') + } +} diff --git a/src/main/scala/eu/sim642/adventofcode2024/Day24.scala b/src/main/scala/eu/sim642/adventofcode2024/Day24.scala new file mode 100644 index 00000000..696a8efd --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcode2024/Day24.scala @@ -0,0 +1,191 @@ +package eu.sim642.adventofcode2024 + +import scala.collection.mutable + +import eu.sim642.adventofcodelib.IteratorImplicits._ + +object Day24 { + + enum Op { + case And + case Or + case Xor + } + + enum Wire { + case Input(value: Boolean) + case Gate(lhs: String, op: Op, rhs: String) + } + + /** + * Exception to indicate cyclic circuit evaluation. + * When trying for swaps in part 2, cycles may be introduced, which otherwise (slowly) lead to StackOverflowError. + */ + class CircuitCycleException extends RuntimeException + + case class Circuit(wireMap: Map[String, Wire]) { + def zValue: Long = { + val memo = mutable.Map.empty[String, Boolean] + + def evalName(name: String, called: Set[String]): Boolean = + if (called.contains(name)) + throw new CircuitCycleException + else + memo.getOrElseUpdate(name, evalWire(wireMap(name), called + name)) + + def evalWire(wire: Wire, called: Set[String]): Boolean = wire match { + case Wire.Input(value) => value + case Wire.Gate(lhs, op, rhs) => + val left = evalName(lhs, called) + val right = evalName(rhs, called) + op match { + case Op.And => left && right + case Op.Or => left || right + case Op.Xor => left != right + } + } + + wireMap.keys + .filter(_.startsWith("z")) + .toSeq + .sorted + .foldRight(0L)({ case (zName, acc) => + acc << 1 | (if (evalName(zName, Set.empty)) 1 else 0) + }) + } + + def dependencies(name: String): Set[String] = { + val memo = mutable.Map.empty[String, Set[String]] + + def evalName(name: String, called: Set[String]): Set[String] = + if (called.contains(name)) + throw new CircuitCycleException + else + memo.getOrElseUpdate(name, evalWire(wireMap(name), called + name) + name) + + def evalWire(wire: Wire, called: Set[String]): Set[String] = wire match { + case Wire.Input(value) => Set.empty + case Wire.Gate(lhs, op, rhs) => + val left = evalName(lhs, called) + val right = evalName(rhs, called) + left ++ right + } + + evalName(name, Set.empty) + } + + def swapped(name1: String, name2: String): Circuit = + Circuit(wireMap + (name1 -> wireMap(name2)) + (name2 -> wireMap(name1))) + + private def withInputValue(inputPrefix: String, value: Long): Circuit = { + val (newCircuit, remainingValue) = wireMap.keys + .filter(_.startsWith(inputPrefix)) + .toSeq + .sorted + .foldLeft((wireMap, value))({ case ((circuit, value), prefixName) => + (circuit + (prefixName -> Wire.Input((value & 1) == 1L)), value >> 1) + }) + assert(remainingValue == 0) + Circuit(newCircuit) + } + + def withXValue(value: Long): Circuit = withInputValue("x", value) + def withYValue(value: Long): Circuit = withInputValue("y", value) + + def add(xValue: Long, yValue: Long): Long = + withXValue(xValue).withYValue(yValue).zValue + } + + def findWireSwaps(circuit: Circuit): Seq[(String, String)] = { + def isCorrect(circuit: Circuit, i: Int): Boolean = { + (for { + // must also check previous bit to account for incoming carry + xBit <- 0 to 3 + yBit <- 0 to 3 + xValue = xBit.toLong << i >> 1 + yValue = yBit.toLong << i >> 1 + } yield { + try circuit.add(xValue, yValue) == xValue + yValue + catch case _: CircuitCycleException => false + }).forall(identity) + } + + def helper(circuit: Circuit, i: Int, acc: List[(String, String)]): Iterator[List[(String, String)]] = { + if (acc.sizeIs > 4) + Iterator.empty + else if (i > 44) + Iterator.single(acc) + else if (isCorrect(circuit, i)) + helper(circuit, i + 1, acc) + else { + val depsPrev = circuit.dependencies(s"z${i - 1}") + val deps = circuit.dependencies(s"z$i") + val depsNext = circuit.dependencies(s"z${i + 1}") + val depsNext2 = circuit.dependencies(s"z${i + 2}") + val wrong1 = ((deps -- depsPrev) ++ (depsNext -- deps)).filterNot(_.startsWith("x")).filterNot(_.startsWith("y")) + val wrong2 = (depsNext2 -- depsPrev).filterNot(_.startsWith("x")).filterNot(_.startsWith("y")) + val swaps = + for { + name1 <- wrong1 + name2 <- wrong2 + // order names in swap to avoid duplicate checking + minName = if (name1 < name2) name1 else name2 + maxName = if (name1 < name2) name2 else name1 + } yield (minName, maxName) + for { + swap@(name1, name2) <- swaps.iterator + newCircuit = circuit.swapped(name1, name2) + if isCorrect(newCircuit, i) + newAcc <- helper(newCircuit, i + 1, swap :: acc) + } yield newAcc + } + } + + val swapss = helper(circuit, 0, Nil) + swapss.head + } + + def findWireSwapsString(circuit: Circuit): String = + findWireSwaps(circuit).flatMap({ case (name1, name2) => Seq(name1, name2) }).sorted.mkString(",") + + def parseInput(s: String): (String, Wire.Input) = s match { + case s"$name: 0" => name -> Wire.Input(false) + case s"$name: 1" => name -> Wire.Input(true) + } + + def parseGate(s: String): (String, Wire.Gate) = s match { + case s"$lhs AND $rhs -> $name" => name -> Wire.Gate(lhs, Op.And, rhs) + case s"$lhs OR $rhs -> $name" => name -> Wire.Gate(lhs, Op.Or, rhs) + case s"$lhs XOR $rhs -> $name" => name -> Wire.Gate(lhs, Op.Xor, rhs) + } + + def parseCircuit(input: String): Circuit = input match { + case s"$inputs\n\n$gates" => + val inputMap = inputs.linesIterator.map(parseInput).toMap + val gateMap = gates.linesIterator.map(parseGate).toMap + Circuit(inputMap ++ gateMap) + } + + def printCircuitDot(circuit: Circuit): Unit = { + println("digraph circuit {") + for ((name, wire) <- circuit.wireMap) { + wire match { + case Wire.Input(value) => + println(s" $name;") + case Wire.Gate(lhs, op, rhs) => + println(s" $name [label=\"$name $op\"];") + println(s" $lhs -> $name;") + println(s" $rhs -> $name;") + } + } + println("}") + } + + lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day24.txt")).mkString.trim + + def main(args: Array[String]): Unit = { + val circuit = parseCircuit(input) + println(circuit.zValue) + println(findWireSwapsString(circuit)) + } +} diff --git a/src/main/scala/eu/sim642/adventofcode2024/Day25.scala b/src/main/scala/eu/sim642/adventofcode2024/Day25.scala new file mode 100644 index 00000000..6607a194 --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcode2024/Day25.scala @@ -0,0 +1,28 @@ +package eu.sim642.adventofcode2024 + +import eu.sim642.adventofcodelib.Grid +import eu.sim642.adventofcodelib.GridImplicits._ + +object Day25 { + + def isKey(grid: Grid[Boolean]): Boolean = + grid.head.forall(identity) + + def fits(key: Grid[Boolean], lock: Grid[Boolean]): Boolean = + key.correspondsGrid(lock)((k, l) => !(k && l)) + + def countLockKeyFits(lockKeys: Seq[Grid[Boolean]]): Int = { + val (keys, locks) = lockKeys.partition(isKey) + keys.view.map(key => locks.count(fits(key, _))).sum + } + + def parseLockKey(s: String): Grid[Boolean] = s.linesIterator.map(_.map(_ == '#').toVector).toVector + + def parseLockKeys(input: String): Seq[Grid[Boolean]] = input.split("\n\n").map(parseLockKey).toSeq + + lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day25.txt")).mkString.trim + + def main(args: Array[String]): Unit = { + println(countLockKeyFits(parseLockKeys(input))) + } +} diff --git a/src/main/scala/eu/sim642/adventofcode2025/Day1.scala b/src/main/scala/eu/sim642/adventofcode2025/Day1.scala new file mode 100644 index 00000000..cff3aa3e --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcode2025/Day1.scala @@ -0,0 +1,40 @@ +package eu.sim642.adventofcode2025 + +import eu.sim642.adventofcodelib.IntegralImplicits._ + +object Day1 { + + trait Part { + def password(rotations: Seq[Int]): Int + } + + object Part1 extends Part { + override def password(rotations: Seq[Int]): Int = { + rotations + .scanLeft[Int](50)((a, b) => (a + b) %+ 100) // TODO: why can't use implicit arguments? + .count(_ == 0) + } + } + + object Part2 extends Part { + override def password(rotations: Seq[Int]): Int = { + // expand all rotations to single to make each click observable, this is silly but works + val newRotations = rotations.flatMap(i => Seq.fill(i.abs)(i.sign)) + Part1.password(newRotations) + } + } + + def parseRotation(s: String): Int = s match { + case s"L$i" => -i.toInt + case s"R$i" => i.toInt + } + + def parseRotations(input: String): Seq[Int] = input.linesIterator.map(parseRotation).toSeq + + lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day1.txt")).mkString.trim + + def main(args: Array[String]): Unit = { + println(Part1.password(parseRotations(input))) + println(Part2.password(parseRotations(input))) + } +} diff --git a/src/main/scala/eu/sim642/adventofcode2025/Day10.scala b/src/main/scala/eu/sim642/adventofcode2025/Day10.scala new file mode 100644 index 00000000..60b6440f --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcode2025/Day10.scala @@ -0,0 +1,169 @@ +package eu.sim642.adventofcode2025 + +import eu.sim642.adventofcodelib.IteratorImplicits.* +import com.microsoft.z3.{ArithExpr, Context, IntExpr, IntSort, Status} +import eu.sim642.adventofcodelib.{GaussianElimination, NumberTheory} +import eu.sim642.adventofcodelib.graph.{BFS, Dijkstra, GraphSearch, TargetNode, UnitNeighbors} + +import scala.collection.mutable +import scala.jdk.CollectionConverters.* + +object Day10 { + + type Lights = Vector[Boolean] + type Buttons = Seq[Seq[Int]] + type Joltages = Vector[Int] + + case class Machine(lights: Lights, buttons: Buttons, joltages: Joltages) + + trait Part { + def fewestPresses(machine: Machine): Int + + def sumFewestPresses(machines: Seq[Machine]): Int = machines.map(fewestPresses).sum + } + + object Part1 extends Part { + override def fewestPresses(machine: Machine): Int = { + val graphSearch = new GraphSearch[Lights] with UnitNeighbors[Lights] with TargetNode[Lights] { + override val startNode: Lights = machine.lights.map(_ => false) + + override def unitNeighbors(lights: Lights): IterableOnce[Lights] = + machine.buttons.map(_.foldLeft(lights)((acc, i) => acc.updated(i, !acc(i)))) + + override val targetNode: Lights = machine.lights + } + + BFS.search(graphSearch).target.get._2 + } + } + + trait Part2Solution extends Part + + /** + * Solution, which naively finds fewest presses by BFS. + * Does not scale to inputs. + */ + object NaivePart2Solution extends Part2Solution { + override def fewestPresses(machine: Machine): Int = { + val graphSearch = new GraphSearch[Joltages] with UnitNeighbors[Joltages] with TargetNode[Joltages] { + override val startNode: Joltages = machine.joltages.map(_ => 0) + + override def unitNeighbors(joltages: Joltages): IterableOnce[Joltages] = + machine.buttons.map(_.foldLeft(joltages)((acc, i) => acc.updated(i, acc(i) + 1))) + + override val targetNode: Joltages = machine.joltages + } + + BFS.search(graphSearch).target.get._2 + } + } + + /** + * Solution, which finds fewest presses via an ILP problem, solved by Z3. + */ + object Z3Part2Solution extends Part2Solution { + override def fewestPresses(machine: Machine): Int = { + val ctx = new Context(Map("model" -> "true").asJava) + import ctx._ + val s = mkOptimize() + + val buttonPresses = machine.buttons.zipWithIndex.map((_, i) => mkIntConst(s"x$i")) + for (presses <- buttonPresses) + s.Add(mkGe(presses, mkInt(0))) + + val totalPresses = buttonPresses.foldLeft[ArithExpr[IntSort]](mkInt(0))(mkAdd(_, _)) + s.MkMinimize(totalPresses) + + (machine.buttons lazyZip buttonPresses) + .foldLeft(machine.joltages.map[ArithExpr[IntSort]](mkInt))({ case (acc, (button, presses)) => + button.foldLeft(acc)((acc, i) => acc.updated(i, mkSub(acc(i), presses))) + }) + .foreach(joltageLeft => + s.Add(mkEq(joltageLeft, mkInt(0))) + ) + + assert(s.Check() == Status.SATISFIABLE) + s.getModel.evaluate(totalPresses, false).toString.toInt + } + } + + /** + * Solution, which performs Gaussian elimination and then brute forces free variables in their ranges. + */ + object GaussianEliminationPart2Solution extends Part2Solution { + /* + x0 x1 x2 x3 x4 x5 + (3) (1,3) (2) (2,3) (0,2) (0,1) + 0: x4 x5 = 3 + 1: x1 x5 = 5 + 2: x2 x3 x4 = 4 + 3: x0 x1 x3 = 7 + + + 0 0 0 0 1 1 | 3 + 0 1 0 0 0 1 | 5 + 0 0 1 1 1 0 | 4 + 1 1 0 1 0 0 | 7 + + 1 1 0 1 0 0 | 7 + 0 1 0 0 0 1 | 5 + 0 0 1 1 1 0 | 4 + 0 0 0 0 1 1 | 3 + + 1 0 0 1 0 -1 | 2 + 0 1 0 0 0 1 | 5 + 0 0 1 1 0 -1 | 1 + 0 0 0 0 1 1 | 3 + + 1 1 1 2 1 0 | 11 + -1 1 | ? + */ + + override def fewestPresses(machine: Machine): Int = { + val zeroCol = machine.joltages.map(_ => 0) + val rows = + machine.buttons + .map(_.foldLeft(zeroCol)(_.updated(_, 1))) + .transpose + + val sol = GaussianElimination.solve(rows, machine.joltages).get + //val mSum = m.transpose.map(_.sum) // TODO: use? + + def helper(freeMaxs: List[Int]): Iterator[List[Int]] = freeMaxs match { // TODO: this seems like it should exist from earlier somewhere + case Nil => Iterator(Nil) + case freeMax :: newFreeMaxs => + for { + freeVal <- (0 to freeMax).iterator + newFreeVals <- helper(newFreeMaxs) + } yield freeVal :: newFreeVals + } + + val maxs = machine.buttons.map(_.map(machine.joltages).min) + val freeMaxs = sol.freeVars.map(maxs) + val dependentMaxs = sol.dependentVars.map(maxs) + (for { + freeVals <- helper(freeMaxs.toList) + dependentVals <- sol.evaluate(freeVals) + if dependentVals.forall(_ >= 0) + if (dependentVals lazyZip dependentMaxs).forall(_ <= _) + } yield dependentVals.sum + freeVals.sum).min + } + } + + def parseMachine(s: String): Machine = s match { + case s"[$lightsStr] $buttonsStr {$joltagesStr}" => + val lights = lightsStr.map(_ == '#').toVector + val buttons = buttonsStr.split(" ").map(_.tail.init.split(",").map(_.toInt).toSeq).toSeq + val joltages = joltagesStr.split(",").map(_.toInt).toVector + Machine(lights, buttons, joltages) + } + + def parseMachines(input: String): Seq[Machine] = input.linesIterator.map(parseMachine).toSeq + + lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day10.txt")).mkString.trim + + def main(args: Array[String]): Unit = { + println(Part1.sumFewestPresses(parseMachines(input))) + println(GaussianEliminationPart2Solution.sumFewestPresses(parseMachines(input))) + } +} diff --git a/src/main/scala/eu/sim642/adventofcode2025/Day11.scala b/src/main/scala/eu/sim642/adventofcode2025/Day11.scala new file mode 100644 index 00000000..68539ff3 --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcode2025/Day11.scala @@ -0,0 +1,170 @@ +package eu.sim642.adventofcode2025 + +import scala.annotation.tailrec +import scala.collection.mutable + +object Day11 { + + type Device = String + type Devices = Map[Device, Seq[Device]] + + trait PartDevices { + val from: Device + val via: Set[Device] + val to: Device = "out" + } + + trait Part1Devices extends PartDevices { + override val from: Device = "you" + override val via: Set[Device] = Set.empty + } + + trait Part2Devices extends PartDevices { + override val from: Device = "svr" + override val via: Set[Device] = Set("dac", "fft") + } + + trait PartSolution extends PartDevices { + def countPaths(devices: Devices): Long + } + + trait Solution { + val Part1: PartSolution + val Part2: PartSolution + } + + /** + * Solution, which counts paths separately for subsets of visited vias. + */ + object ViaMapSolution extends Solution { + trait ViaMapPartSolution extends PartSolution { + override def countPaths(devices: Devices): Long = { + val memo = mutable.Map.empty[Device, Map[Set[Device], Long]] + + def helper(device: Device): Map[Set[Device], Long] = { + memo.getOrElseUpdate(device, { + val deviceVia = via.intersect(Set(device)) + if (device == to) + Map(deviceVia -> 1) + else + devices(device).flatMap(helper).groupMapReduce(_._1 ++ deviceVia)(_._2)(_ + _) + }) + } + + helper(from)(via) + } + } + + override object Part1 extends ViaMapPartSolution with Part1Devices + override object Part2 extends ViaMapPartSolution with Part2Devices + } + + /** + * Optimized version of [[ViaMapSolution]], which only keeps the largest key pair from the mapping. + * Others are useless for passing all the vias. + * Also, just the size of the visited vias set is tracked, because incompatible sets can't arise. + */ + object ViaPairSolution extends Solution { + + case class ViaPair(via: Int, count: Long) { + infix def combine(that: ViaPair): ViaPair = { + if (via == that.via) + ViaPair(via, count + that.count) + else if (via < that.via) + that + else // that.via < via + this + } + + def unionVia(thatVia: Int): ViaPair = + copy(via = via + thatVia) + } + + object ViaPair { + val empty = ViaPair(0, 0) + } + + trait ViaPairPartSolution extends PartSolution { + override def countPaths(devices: Devices): Long = { + val memo = mutable.Map.empty[Device, ViaPair] + + def helper(device: Device): ViaPair = { + memo.getOrElseUpdate(device, { + val deviceVia = if (via(device)) 1 else 0 + if (device == to) + ViaPair(deviceVia, 1) + else + devices(device).map(helper).foldLeft(ViaPair.empty)(_ combine _).unionVia(deviceVia) + }) + } + + val viaPair = helper(from) + assert(viaPair.via == via.size) + viaPair.count + } + } + + override object Part1 extends ViaPairPartSolution with Part1Devices + override object Part2 extends ViaPairPartSolution with Part2Devices + } + + /** + * Solution, which tries all permutations of vias and counts each one by multiplying adjacent steps. + */ + object PermutationSolution extends Solution { + trait PermutationPartSolution extends PartSolution { + def countPathsTo(devices: Devices)(to: Device): Device => Long = { + val memo = mutable.Map.empty[Device, Long] + + def helper(device: Device): Long = { + memo.getOrElseUpdate(device, { + if (device == to) + 1 + else + devices.getOrElse(device, Set.empty).map(helper).sum // need getOrElse for "out" when from is different, but reaches "out" + }) + } + + helper + } + + override def countPaths(devices: Devices): Long = { + val memo = mutable.Map.empty[Device, Device => Long] + + def countPathsFromTo(from: Device, to: Device): Long = // memoize by to, because same to will be reused + memo.getOrElseUpdate(to, countPathsTo(devices)(to))(from) + + @tailrec + def helper(prevDevice: Device, acc: Long, via: List[Device]): Long = via match { + case Nil => acc * countPathsFromTo(prevDevice, to) + case device :: newVia => + val newAcc = countPathsFromTo(prevDevice, device) + if (newAcc == 0) + 0 // this step is impossible, so no need to continue (multiplying 0) + else + helper(device, acc * newAcc, newVia) + } + + via.toList.permutations.map(helper(from, 1L, _)).find(_ != 0).get // this could be a sum, but only one vias permutation can be non-zero, so stop after finding that one, no need to continue (adding 0s) + } + } + + override object Part1 extends PermutationPartSolution with Part1Devices + override object Part2 extends PermutationPartSolution with Part2Devices + } + + def parseDevice(s: String): (Device, Seq[Device]) = s match { + case s"$key: $values" => key -> values.split(" ").toSeq + } + + def parseDevices(input: String): Devices = input.linesIterator.map(parseDevice).toMap + + lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day11.txt")).mkString.trim + + def main(args: Array[String]): Unit = { + import ViaPairSolution._ + + println(Part1.countPaths(parseDevices(input))) + println(Part2.countPaths(parseDevices(input))) + } +} diff --git a/src/main/scala/eu/sim642/adventofcode2025/Day12.scala b/src/main/scala/eu/sim642/adventofcode2025/Day12.scala new file mode 100644 index 00000000..a15a57f3 --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcode2025/Day12.scala @@ -0,0 +1,124 @@ +package eu.sim642.adventofcode2025 + +import eu.sim642.adventofcodelib.Grid +import eu.sim642.adventofcodelib.pos.Pos +import eu.sim642.adventofcodelib.IteratorImplicits.* +import eu.sim642.adventofcode2020.Day20.OrientationGridOps +import eu.sim642.adventofcodelib.GridImplicits._ +import eu.sim642.adventofcodelib.box.Box + +object Day12 { + + type Shape = Grid[Boolean] + + case class Region(size: Pos, shapeCounts: Seq[Int]) + + case class Input(shapes: Seq[Shape], regions: Seq[Region]) + + trait Solution { + def fits(shapes: Seq[Shape])(region: Region): Boolean + + def countFits(input: Input): Int = + input.regions.count(fits(input.shapes)) + } + + object NaiveSolution extends Solution { + override def fits(shapes: Seq[Shape])(region: Region): Boolean = { + val shapeOrientationBox = Box(Pos.zero, region.size - Pos(3, 3)) // assuming all shappes of same size + + val shapeOrientations = shapes.map(_.orientations.toSet) + + def helper(grid: Grid[Boolean], shapeCounts: Seq[Int], poss: List[Pos], depth: Int): Boolean = { + val indent = " " * depth + //println(s"$indent: $shapeCounts") + //for (row <- grid) { + // print(indent) + // for (cell <- row) + // print(if (cell) '#' else '.') + // println() + //} + val shapeI = shapeCounts.indexWhere(_ > 0) + if (shapeI < 0) + true // nothing more to fit + else { + if (poss.isEmpty) + false + else { + val pos = poss.head + //print(s"$indent $pos") + val todo = region.size.x * region.size.y - pos.x * region.size.y - pos.y - (if (pos.x == shapeOrientationBox.max.x) pos.y * 2 else 0) + val areaLowerBound = // only counting the #-s in shapes + shapes + .map(_.countGrid(identity)) + .lazyZip(shapeCounts) + .map(_ * _) + .sum + if (areaLowerBound > todo) { + //println("bounded") + false + } else { + //println() + val newPoss = poss.tail + (for { + ((shapeO, count), shapeI) <- shapeOrientations.lazyZip(shapeCounts).zipWithIndex + if count > 0 + newShapeCounts = shapeCounts.updated(shapeI, count - 1) + shapeOrientation <- shapeO.iterator + shapeOrientationSize = Pos(shapeOrientation(0).size, shapeOrientation.size) + shapeOrientationBox2 = Box(Pos.zero, shapeOrientationSize - Pos(1, 1)) + if shapeOrientationBox2.iterator.forall(p => !(shapeOrientation(p) && grid(pos + p))) + newGrid = shapeOrientationBox2.iterator.foldLeft(grid)((newGrid, p) => newGrid.updatedGrid(pos + p, newGrid(pos + p) || shapeOrientation(p))) + } yield helper(newGrid, newShapeCounts, newPoss, depth + 1)).exists(identity) || + !Box(Pos.zero, Pos(2, 2)).iterator.forall(p => !grid(pos + p)) && helper(grid, shapeCounts, newPoss, depth + 1) // or don't place anything here + } + } + } + } + + val initialGrid = Vector.fill(region.size.y, region.size.x)(false) + helper(initialGrid, region.shapeCounts, shapeOrientationBox.iterator.toList, 0) + } + } + + object SanitySolution extends Solution { + override def fits(shapes: Seq[Shape])(region: Region): Boolean = { + val area = Box(Pos(1, 1), region.size).size[Int] + val areaLowerBound = // only counting the #-s in shapes + shapes + .map(_.countGrid(identity)) + .lazyZip(region.shapeCounts) + .map(_ * _) + .sum + val areaUpperBound = // counting area needed if no "overlaps" are possible + shapes + .map(_.sizeGrid) + .lazyZip(region.shapeCounts) + .map(_ * _) + .sum + if (areaUpperBound <= area) + true + else if (areaLowerBound > area) + false + else + throw IllegalArgumentException("undecidable by sanity check") + } + } + + def parseShape(s: String): Shape = s.linesIterator.tail.map(_.map(_ == '#').toVector).toVector + + def parseRegion(s: String): Region = s match { + case s"${width}x$height: $shapeCounts" => + Region(Pos(width.toInt, height.toInt), shapeCounts.split(" ").map(_.toInt).toSeq) + } + + def parseInput(input: String): Input = { + val lineGroups = input.split("\n\n").toSeq + Input(lineGroups.init.map(parseShape), lineGroups.last.linesIterator.map(parseRegion).toSeq) + } + + lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day12.txt")).mkString.trim + + def main(args: Array[String]): Unit = { + println(SanitySolution.countFits(parseInput(input))) + } +} diff --git a/src/main/scala/eu/sim642/adventofcode2025/Day2.scala b/src/main/scala/eu/sim642/adventofcode2025/Day2.scala new file mode 100644 index 00000000..9805afff --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcode2025/Day2.scala @@ -0,0 +1,52 @@ +package eu.sim642.adventofcode2025 + +import eu.sim642.adventofcode2016.Day20.Interval + +object Day2 { + + type Range = Interval + + def numDigits(i: Long): Int = { + i.toString.length // TODO: already have a (better) way to get number of digits? + } + + def invalidIds(times: Int): LazyList[Long] = LazyList.from(1).map(i => + val pow = Math.powExact(10L, numDigits(i)) + val pattern = (1 until times).foldLeft(1L)((acc, _) => pow * acc + 1) + i * pattern + ) + + trait Part { + def maxTimes(max: Long): Int + + def sumInvalidIds(ranges: Seq[Range]): Long = { + val max = ranges.map(_.max).max + (for { + times <- 2 to maxTimes(max) // TODO: bad shadowing + id <- invalidIds(times).takeWhile(_ <= max) + if ranges.exists(_.contains(id)) + } yield id).toSet.sum // toSet because some IDs can be created multiple ways (2222 is 2-2-2-2 and 22-22), but shouldn't count multiple times + } + } + + object Part1 extends Part { + override def maxTimes(max: Long): Int = 2 + } + + object Part2 extends Part { + override def maxTimes(max: Long): Int = numDigits(max) + } + + def parseRange(s: String): Range = s match { + case s"$i-$j" => Interval(i.toLong, j.toLong) + } + + def parseRanges(input: String): Seq[Interval] = input.split(",").toSeq.map(parseRange) + + lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day2.txt")).mkString.trim + + def main(args: Array[String]): Unit = { + println(Part1.sumInvalidIds(parseRanges(input))) + println(Part2.sumInvalidIds(parseRanges(input))) + } +} diff --git a/src/main/scala/eu/sim642/adventofcode2025/Day3.scala b/src/main/scala/eu/sim642/adventofcode2025/Day3.scala new file mode 100644 index 00000000..ad3f4afa --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcode2025/Day3.scala @@ -0,0 +1,50 @@ +package eu.sim642.adventofcode2025 + +import scala.collection.mutable + +object Day3 { + + type Bank = String + + def maxJoltageDigits(bank: Bank, digits: Int): Long = { + val memo = mutable.Map.empty[(Int, Int), Long] + + def helper(i: Int, digits: Int): Long = { + memo.getOrElseUpdate((i, digits), { + if (i >= 0 && digits >= 1) { + helper(i - 1, digits) max (helper(i - 1, digits - 1) * 10 + bank(i).asDigit) + } else + 0 + }) + } + + helper(bank.length - 1, digits) + } + + trait Part { + val digits: Int + + def maxJoltage(bank: Bank): Long = maxJoltageDigits(bank, digits) + + def totalJoltage(banks: Seq[Bank]): Long = banks.map(maxJoltage).sum + } + + object Part1 extends Part { + override val digits: Int = 2 + } + + object Part2 extends Part { + override val digits: Int = 12 + } + + def parseBanks(input: String): Seq[Bank] = input.linesIterator.toSeq + + lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day3.txt")).mkString.trim + + def main(args: Array[String]): Unit = { + println(Part1.totalJoltage(parseBanks(input))) + println(Part2.totalJoltage(parseBanks(input))) + + // part 1: 16769 - not right (combinations don't keep order) + } +} diff --git a/src/main/scala/eu/sim642/adventofcode2025/Day4.scala b/src/main/scala/eu/sim642/adventofcode2025/Day4.scala new file mode 100644 index 00000000..575726ae --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcode2025/Day4.scala @@ -0,0 +1,43 @@ +package eu.sim642.adventofcode2025 + +import eu.sim642.adventofcodelib.Grid +import eu.sim642.adventofcodelib.GridImplicits._ +import eu.sim642.adventofcodelib.pos.Pos + +object Day4 { + + // TODO: make this more like cellular automaton? + def accessibleRolls(grid: Grid[Char]): Seq[Pos] = { + (for { + (row, y) <- grid.view.zipWithIndex + (cell, x) <- row.view.zipWithIndex + pos = Pos(x, y) + if grid(pos) == '@' + neighbors = Pos.allOffsets.map(pos + _).filter(grid.containsPos) + if neighbors.count(grid(_) == '@') < 4 + } yield pos).toSeq + } + + def countAccessibleRolls(grid: Grid[Char]): Int = { + accessibleRolls(grid).size + } + + def countRemovableRolls(grid: Grid[Char]): Int = { + val accessible = accessibleRolls(grid) + if (accessible.isEmpty) + 0 + else { + val newGrid = accessible.foldLeft(grid)(_.updatedGrid(_, '.')) + accessible.size + countRemovableRolls(newGrid) + } + } + + def parseGrid(input: String): Grid[Char] = input.linesIterator.map(_.toVector).toVector + + lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day4.txt")).mkString.trim + + def main(args: Array[String]): Unit = { + println(countAccessibleRolls(parseGrid(input))) + println(countRemovableRolls(parseGrid(input))) + } +} diff --git a/src/main/scala/eu/sim642/adventofcode2025/Day5.scala b/src/main/scala/eu/sim642/adventofcode2025/Day5.scala new file mode 100644 index 00000000..16408e86 --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcode2025/Day5.scala @@ -0,0 +1,35 @@ +package eu.sim642.adventofcode2025 + +import eu.sim642.adventofcode2016.Day20.{Interval, mergeIntervals} + +object Day5 { + + case class Database(fresh: Seq[Interval], available: Seq[Long]) + + def countFreshAvailable(database: Database): Int = { + val Database(fresh, available) = database + available.count(id => fresh.exists(_.contains(id))) + } + + def countFresh(database: Database): Long = { + mergeIntervals(database.fresh).map(_.size).sum + } + + def parseInterval(s: String): Interval = s match { + case s"$i-$j" => Interval(i.toLong, j.toLong) + } + + def parseDatabase(input: String): Database = input match { + case s"$freshStr\n\n$availableStr" => + val fresh = freshStr.linesIterator.map(parseInterval).toSeq + val available = availableStr.linesIterator.map(_.toLong).toSeq + Database(fresh, available) + } + + lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day5.txt")).mkString.trim + + def main(args: Array[String]): Unit = { + println(countFreshAvailable(parseDatabase(input))) + println(countFresh(parseDatabase(input))) + } +} diff --git a/src/main/scala/eu/sim642/adventofcode2025/Day6.scala b/src/main/scala/eu/sim642/adventofcode2025/Day6.scala new file mode 100644 index 00000000..e04881bf --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcode2025/Day6.scala @@ -0,0 +1,77 @@ +package eu.sim642.adventofcode2025 + +import Day6.ProblemKind._ + +object Day6 { + + enum ProblemKind { + case Add + case Multiply + } + + case class Problem(nums: Seq[Int], problemKind: ProblemKind) { + def answer: Long = problemKind match { + case Add => nums.map(_.toLong).sum + case Multiply => nums.map(_.toLong).product + } + } + + def sumAnswers(problems: Seq[Problem]): Long = { + problems.map(_.answer).sum + } + + def parseProblemKind(s: String): ProblemKind = s match { + case "+" => Add + case "*" => Multiply + } + + trait Part { + def parseProblems(input: String): Seq[Problem] + } + + object Part1 extends Part { + override def parseProblems(input: String): Seq[Problem] = { + input + .linesIterator + .map(_.trim.split(" +").toSeq) + .toSeq + .transpose + .map(s => Problem(s.init.map(_.toInt), parseProblemKind(s.last))) + } + } + + object Part2 extends Part { + override def parseProblems(input: String): Seq[Problem] = { + val lines = input.linesIterator.toSeq + val maxLength = lines.map(_.length).max + val paddedLines = lines.map(_.padTo(maxLength, ' ')) // pad because test code has trimmed trailing whitespace + val cols = paddedLines.transpose + + // TODO: split on Seq? + def helper(cols: Seq[Seq[Char]]): List[Problem] = { + val (problemCols, newCols) = cols.span(!_.forall(_ == ' ')) + val problemKind = parseProblemKind(problemCols.head.last.toString) + val nums = problemCols.map(_.init.mkString("").trim.toInt) + val problem = Problem(nums, problemKind) + val rest = { + if (newCols.isEmpty) + Nil + else + helper(newCols.tail) + } + problem :: rest + } + + helper(cols) + } + } + + lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day6.txt")).mkString.trim + + def main(args: Array[String]): Unit = { + println(sumAnswers(Part1.parseProblems(input))) + println(sumAnswers(Part2.parseProblems(input))) + + // part 1: 1615951811 - too low (Int overflowed in Problem#answer) + } +} diff --git a/src/main/scala/eu/sim642/adventofcode2025/Day7.scala b/src/main/scala/eu/sim642/adventofcode2025/Day7.scala new file mode 100644 index 00000000..688f543a --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcode2025/Day7.scala @@ -0,0 +1,65 @@ +package eu.sim642.adventofcode2025 + +import eu.sim642.adventofcodelib.Grid +import eu.sim642.adventofcodelib.GridImplicits.* +import eu.sim642.adventofcodelib.graph.{BFS, GraphTraversal, UnitNeighbors} +import eu.sim642.adventofcodelib.pos.Pos + +import scala.annotation.tailrec + +object Day7 { + + private val cellOffsets = Map( + 'S' -> Seq(Pos(0, 1)), + '.' -> Seq(Pos(0, 1)), + '^' -> Seq(Pos(-1, 0), Pos(1, 0)), + ) + + def countBeamSplits(grid: Grid[Char]): Int = { + val graphTraversal = new GraphTraversal[Pos] with UnitNeighbors[Pos] { + override val startNode: Pos = grid.posOf('S') + + override def unitNeighbors(pos: Pos): IterableOnce[Pos] = { + cellOffsets(grid(pos)).map(pos + _).filter(grid.containsPos) + } + } + + BFS.traverse(graphTraversal) + .nodes + .count(grid(_) == '^') + } + + def countTimelines(grid: Grid[Char]): Long = { + + @tailrec + def helper(y: Int, xs: Map[Int, Long]): Long = { + if (y >= grid.size) + xs.values.sum + else { + val newXs = + (for { + (x, count) <- xs.view + pos = Pos(x, y) + offset <- cellOffsets(grid(pos)) + newPos = pos + offset + } yield newPos.x -> count).groupMapReduce(_._1)(_._2)(_ + _) + + helper(y + 1, newXs) + } + } + + val startPos = grid.posOf('S') + helper(startPos.y, Map(startPos.x -> 1)) + } + + def parseGrid(input: String): Grid[Char] = input.linesIterator.map(_.toVector).toVector + + lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day7.txt")).mkString.trim + + def main(args: Array[String]): Unit = { + println(countBeamSplits(parseGrid(input))) + println(countTimelines(parseGrid(input))) + + // part 2: 2012790981 (Int overflowed in countTimelines) + } +} diff --git a/src/main/scala/eu/sim642/adventofcode2025/Day8.scala b/src/main/scala/eu/sim642/adventofcode2025/Day8.scala new file mode 100644 index 00000000..610a998e --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcode2025/Day8.scala @@ -0,0 +1,68 @@ +package eu.sim642.adventofcode2025 + +import eu.sim642.adventofcodelib.IteratorImplicits.* +import eu.sim642.adventofcodelib.graph.Kruskal +import eu.sim642.adventofcodelib.pos.Pos3 + +import scala.collection.mutable + +object Day8 { + + extension (pos: Pos3) { + infix def euclideanDistanceSqr(that: Pos3): Long = { + val d = that - pos + d.x.toLong * d.x + d.y.toLong * d.y + d.z.toLong * d.z + } + } + + extension [A](queue: mutable.PriorityQueue[A]) { + // normal queue.iterator does not yield dequeue order + def dequeueIterator: Iterator[A] = new Iterator[A] { + override def hasNext: Boolean = queue.nonEmpty + + override def next(): A = queue.dequeue() + } + } + + def iterateClosestPairs(junctionBoxes: Seq[Pos3]): Iterator[(Pos3, Pos3)] = { + // it is faster to use a PriorityQueue than sort the Seq of all pairs because Kruskal will only need some closest pairs, not all + val queue = mutable.PriorityQueue.empty[((Pos3, Pos3), Long)](using Ordering.by(-_._2)) + for { + // faster than combinations(2) + (p1, i) <- junctionBoxes.iterator.zipWithIndex + p2 <- junctionBoxes.view.slice(i + 1, junctionBoxes.size).iterator + } queue.enqueue((p1, p2) -> (p1 euclideanDistanceSqr p2)) // no need to sqrt distance just for sorting + queue.dequeueIterator.map(_._1) + } + + def multiplySizesAfter(junctionBoxes: Seq[Pos3], after: Int = 1000, sizes: Int = 3): Int = { + val closestPairs = iterateClosestPairs(junctionBoxes) + val (ufAfter, _) = Kruskal.iterate(junctionBoxes, closestPairs)(after) + + ufAfter.rootNodes + .map(_.size) + .toSeq + .sorted(using Ordering.Int.reverse) + .take(sizes) + .product + } + + def multiplyLastXs(junctionBoxes: Seq[Pos3]): Int = { + val closestPairs = iterateClosestPairs(junctionBoxes) + val (p1, p2) = Kruskal.iterateEdges(junctionBoxes, closestPairs).last + p1.x * p2.x + } + + def parseJunctionBox(s: String): Pos3 = s match { + case s"$x,$y,$z" => Pos3(x.toInt, y.toInt, z.toInt) + } + + def parseJunctionBoxes(input: String): Seq[Pos3] = input.linesIterator.map(parseJunctionBox).toSeq + + lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day8.txt")).mkString.trim + + def main(args: Array[String]): Unit = { + println(multiplySizesAfter(parseJunctionBoxes(input))) + println(multiplyLastXs(parseJunctionBoxes(input))) + } +} diff --git a/src/main/scala/eu/sim642/adventofcode2025/Day9.scala b/src/main/scala/eu/sim642/adventofcode2025/Day9.scala new file mode 100644 index 00000000..71a3e198 --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcode2025/Day9.scala @@ -0,0 +1,157 @@ +package eu.sim642.adventofcode2025 + +import eu.sim642.adventofcode2018.Day11.SumGrid +import eu.sim642.adventofcodelib.SeqImplicits.* +import eu.sim642.adventofcodelib.box.Box +import eu.sim642.adventofcodelib.graph.{BFS, GraphTraversal, UnitNeighbors} +import eu.sim642.adventofcodelib.pos.Pos + +import scala.collection.mutable + +object Day9 { + + trait Part { + def makeIsValid(redTiles: Seq[Pos]): Box => Boolean + + def largestArea(redTiles: Seq[Pos]): Long = { + val isValid = makeIsValid(redTiles) + + (for { + // faster than combinations(2) + (p1, i) <- redTiles.iterator.zipWithIndex + p2 <- redTiles.view.slice(i + 1, redTiles.size).iterator + box = Box.bounding(Seq(p1, p2)) + if isValid(box) + } yield box.size[Long]).max + } + } + + object Part1 extends Part { + override def makeIsValid(redTiles: Seq[Pos]): Box => Boolean = + _ => true + } + + trait Part2Solution extends Part + + // Copied & modified from 2018 day 11 + class ArrayPartialSumGrid(f: Pos => Int, box: Box) extends SumGrid { + val Box(min, max) = box + val Pos(width, height) = max - min + Pos(1, 1) + val partialSums: mutable.ArraySeq[mutable.ArraySeq[Int]] = mutable.ArraySeq.fill(height + 1, width + 1)(0) // larger by 1 to allow min-coordinate queries + + for (y <- 1 until height + 1) { + for (x <- 1 until width + 1) { + val pos = min + Pos(x - 1, y - 1) + val sum = partialSums(y - 1)(x) + partialSums(y)(x - 1) - partialSums(y - 1)(x - 1) + f(pos) + partialSums(y)(x) = sum + } + } + + override def sumBox(box: Box): Int = { + //val Box(topLeft, bottomRight) = box + val topLeft = box.min - min + Pos(1, 1) + val bottomRight = box.max - min + Pos(1, 1) + val bottomLeft1 = Pos(topLeft.x - 1, bottomRight.y) + val topRight1 = Pos(bottomRight.x, topLeft.y - 1) + val topLeft1 = Pos(topLeft.x - 1, topLeft.y - 1) + partialSums(bottomRight.y)(bottomRight.x) - partialSums(bottomLeft1.y)(bottomLeft1.x) - partialSums(topRight1.y)(topRight1.x) + partialSums(topLeft1.y)(topLeft1.x) + } + } + + /** + * Solution, which compresses the grid to 2-unit distances between occurring coordinates + * and checks validity by counting outside cells (in the compressed grid) using a [[SumGrid]]. + * + * Grid compression assumes no adjacent coordinates occur. + */ + object CompressGridPart2Solution extends Part2Solution { + def makeCompressPos(redTiles: Seq[Pos]): Pos => Pos = { + val xs = redTiles.map(_.x).distinct.sorted + val ys = redTiles.map(_.y).distinct.sorted + + p => + Pos(xs.indexOf(p.x) * 2 + 1, ys.indexOf(p.y) * 2 + 1) // leave edge around for fill + // it's much faster to do the +1-s here than add Pos(1, 1) below + } + + override def makeIsValid(redTiles: Seq[Pos]): Box => Boolean = { + val compressPos = makeCompressPos(redTiles) + def compressBox(box: Box): Box = + Box(compressPos(box.min), compressPos(box.max)) + + val originalBox = Box.bounding(redTiles) + val compressedBox@Box(_, compressedMax) = compressBox(originalBox) + + val grid = mutable.ArraySeq.fill(compressedMax.y + 2, compressedMax.x + 2)(false) // leave edge around for fill + // TODO: why need +2? + for ((redTile1, redTile2) <- redTiles lazyZip redTiles.rotateLeft(1)) { + for (pos <- compressBox(Box.bounding(Seq(redTile1, redTile2))).iterator) + grid(pos.y)(pos.x) = true + } + //for (row <- grid) { + // for (cell <- row) + // print(cell) + // println() + //} + + val graphTraversal = new GraphTraversal[Pos] with UnitNeighbors[Pos] { + override val startNode: Pos = Pos.zero + + override def unitNeighbors(pos: Pos): IterableOnce[Pos] = + Pos.axisOffsets.map(pos + _).filter(p => p.x >= 0 && p.y >= 0 && p.y < grid.size && p.x < grid(p.y).size && !grid(p.y)(p.x)) + } + val outside = BFS.traverse(graphTraversal).nodes + + val outsideSumGrid = new ArrayPartialSumGrid(pos => if (outside(pos)) 1 else 0, compressedBox) + def isValid(box: Box): Boolean = { + val compressedBox = Box(compressPos(box.min), compressPos(box.max)) + //!compressedBox.iterator.exists(outside) + outsideSumGrid.sumBox(compressedBox) == 0 + } + + isValid + } + } + + /** + * Solution, which checks validity geometrically using axis-aligned line-box intersection. + * + * Assumes largest area won't be outside. + * Assumes no adjacent coordinates occur. + */ + object IntersectionPart2Solution extends Part2Solution { + override def makeIsValid(redTiles: Seq[Pos]): Box => Boolean = { + val lines = + (redTiles lazyZip redTiles.rotateLeft(1)) + .toSeq + .map((p1, p2) => Box.bounding(Seq(p1, p2))) // convert line to box of width/height 1 + + def isValid(box: Box): Boolean = { + // construct box interior, otherwise box intersects with its own edges + val innerMin = box.min + Pos(1, 1) + val innerMax = box.max - Pos(1, 1) + //innerMin <= innerMax && + !(innerMin <= innerMax) || // box has no/empty interior // TODO: this is wrong for line-line intersections + !lines.exists(_.intersect(Box(innerMin, innerMax)).nonEmpty) // interior doesn't intersect any line + } + + isValid + } + } + + // TODO: line of sight in all directions solution (single iteration over corners, not all pairs!) + // TODO: glguy's solution + + def parseRedTile(s: String): Pos = s match { + case s"$x,$y" => Pos(x.toInt, y.toInt) + } + + def parseRedTiles(input: String): Seq[Pos] = input.linesIterator.map(parseRedTile).toSeq + + lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day9.txt")).mkString.trim + + def main(args: Array[String]): Unit = { + println(Part1.largestArea(parseRedTiles(input))) + println(CompressGridPart2Solution.largestArea(parseRedTiles(input))) + } +} diff --git a/src/main/scala/eu/sim642/adventofcodelib/GaussianElimination.scala b/src/main/scala/eu/sim642/adventofcodelib/GaussianElimination.scala new file mode 100644 index 00000000..966397bb --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcodelib/GaussianElimination.scala @@ -0,0 +1,124 @@ +package eu.sim642.adventofcodelib + +import eu.sim642.adventofcodelib.IntegralImplicits.ExtraDivModIntegralOps + +import scala.collection.mutable +import scala.math.Integral.Implicits.infixIntegralOps +import scala.math.Ordering.Implicits.infixOrderingOps +import scala.reflect.ClassTag +import scala.util.boundary +import scala.util.boundary.break + +/** + * Integer-only Gaussian elimination. + */ +object GaussianElimination { + + case class Solution[A: Integral](dependentVars: Seq[Int], dependentGenerator: Seq[A], + freeVars: Seq[Int], freeGenerators: Seq[Seq[A]], + constGenerator: Seq[A]) { + private lazy val freeGeneratorsTransposed = { // transpose of empty generators needs right length for lazyZip to work below + if (freeGenerators.isEmpty) + constGenerator.map(_ => Nil) + else + freeGenerators.transpose + } + + require(dependentGenerator.size == constGenerator.size) + require(dependentGenerator.size == freeGeneratorsTransposed.size) + + def evaluate(freeVals: Seq[A]): Option[Seq[A]] = { + boundary { // poor man's sequence + Some((constGenerator lazyZip freeGeneratorsTransposed lazyZip dependentGenerator).map((const, freeCoeffs, dependentCoeff) => { + val r = const - (freeCoeffs lazyZip freeVals).map(_ * _).sum + (r /! dependentCoeff).getOrElse(break(None)) + })) + } + } + } + + def solve[A: ClassTag](initialA: Seq[Seq[A]], initialb: Seq[A])(using aIntegral: Integral[A]): Option[Solution[A]] = { + val m = initialA.size + val n = initialA.head.size + require(initialb.sizeIs == m) + + val A: mutable.ArraySeq[mutable.ArraySeq[A]] = initialA.map(_.to(mutable.ArraySeq)).to(mutable.ArraySeq) + val b: mutable.ArraySeq[A] = initialb.to(mutable.ArraySeq) + + def swapRows(y1: Int, y2: Int): Unit = { + val A1 = A(y1) + A(y1) = A(y2) + A(y2) = A1 + val b1 = b(y1) + b(y1) = b(y2) + b(y2) = b1 + } + + def simplifyRow(y: Int): Unit = { + val factor = NumberTheory.gcd(NumberTheory.gcd(A(y).toSeq), b(y)) // TODO: avoid conversion + if (factor.abs > summon[Integral[A]].one) { + A(y).mapInPlace(_ / factor) + b(y) /= factor + } + } + + def reduceRow(x: Int, y1: Int, y2: Int): Unit = { + val c2 = A(y2)(x) + if (c2 != 0) { + val c1 = A(y1)(x) + val (factor1, factor2) = NumberTheory.extendedGcd(c1, c2)._3 + for (x2 <- 0 until x) // must start from 0 because we're now multiplying entire row y2 + A(y2)(x2) = factor2 * A(y2)(x2) + for (x2 <- x until n) + A(y2)(x2) = factor2 * A(y2)(x2) + factor1 * A(y1)(x2) + b(y2) = factor2 * b(y2) + factor1 * b(y1) + //simplifyRow(y2) // TODO: helps? + } + } + + // forward elimination + var y = 0 + for (x <- 0 until n) { + (y until m).find(A(_)(x) != 0) match { + case None => // move to next x + case Some(y2) => + swapRows(y, y2) + for (y3 <- (y + 1) until m) + reduceRow(x, y, y3) + y += 1 + } + } + + boundary { + // check consistency + for (y2 <- y until b.size) { + if (b(y2) != 0) + break(None) + } + + // backward elimination + val dependentVars = mutable.ArrayBuffer.empty[Int] + val freeVars = mutable.ArrayBuffer.empty[Int] + y = 0 + for (x <- 0 until n) { + if (y >= m || A(y)(x) == 0) + freeVars += x + else { + dependentVars += x + for (y2 <- 0 until y) + reduceRow(x, y, y2) + y += 1 + } + } + + val Aview = A.view.take(dependentVars.size) + Some(Solution( + dependentVars = dependentVars.toSeq, + dependentGenerator = (A lazyZip dependentVars).map(_(_)).toSeq, + freeVars = freeVars.toSeq, + freeGenerators = freeVars.view.map(x => Aview.map(_(x)).toSeq).toSeq, + constGenerator = b.view.take(dependentVars.size).toSeq + )) + } + } +} diff --git a/src/main/scala/eu/sim642/adventofcodelib/NumberTheory.scala b/src/main/scala/eu/sim642/adventofcodelib/NumberTheory.scala index 1b20a557..9f5f736a 100644 --- a/src/main/scala/eu/sim642/adventofcodelib/NumberTheory.scala +++ b/src/main/scala/eu/sim642/adventofcodelib/NumberTheory.scala @@ -70,7 +70,7 @@ object NumberTheory { } def sieveCrt[A](ans: Seq[(A, A)])(using aIntegral: Integral[A]): (A, A) = { - ans.sortBy(_._2)(aIntegral.reverse) + ans.sortBy(_._2)(using aIntegral.reverse) .reduceLeft(sieveCrt2(_, _)) } } diff --git a/src/main/scala/eu/sim642/adventofcodelib/UnionFind.scala b/src/main/scala/eu/sim642/adventofcodelib/UnionFind.scala new file mode 100644 index 00000000..8cdd6270 --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcodelib/UnionFind.scala @@ -0,0 +1,52 @@ +package eu.sim642.adventofcodelib + +import eu.sim642.adventofcodelib.UnionFind.Node + +import scala.annotation.tailrec + +class UnionFind[A](val nodes: Map[A, Node[A]]) { + + def this(xs: Seq[A]) = { + this(xs.map(x => x -> Node(x, 1)).toMap) + } + + @tailrec + final def findReprNode(x: A): Node[A] = { + // TODO: path compression + val node = nodes(x) + if (x == node.parent) + node + else + findReprNode(node.parent) + } + + def findRepr(x: A): A = findReprNode(x).parent + + def sameRepr(x: A, y: A): Boolean = + findRepr(x) == findRepr(y) + + def unioned(x: A, y: A): UnionFind[A] = { + val xNode = findReprNode(x) + val yNode = findReprNode(y) + val xRepr = xNode.parent + val yRepr = yNode.parent + if (xRepr == yRepr) // sameRepr inlined + this + else if (xNode.size >= yNode.size) + new UnionFind(nodes + (xRepr -> xNode.copy(size = xNode.size + yNode.size)) + (yRepr -> yNode.copy(parent = xRepr))) + else + new UnionFind(nodes + (yRepr -> yNode.copy(size = xNode.size + yNode.size)) + (xRepr -> xNode.copy(parent = yRepr))) + } + + def components: Iterable[Iterable[A]] = + nodes.keys.groupBy(findRepr).values + + def rootNodes: Iterable[Node[A]] = + nodes.view.filter((x, node) => x == node.parent).values + + override def toString: String = nodes.toString() +} + +object UnionFind { + case class Node[A](parent: A, size: Int) +} diff --git a/src/main/scala/eu/sim642/adventofcodelib/graph/AStar.scala b/src/main/scala/eu/sim642/adventofcodelib/graph/AStar.scala index fe81053a..ce87aa45 100644 --- a/src/main/scala/eu/sim642/adventofcodelib/graph/AStar.scala +++ b/src/main/scala/eu/sim642/adventofcodelib/graph/AStar.scala @@ -6,7 +6,7 @@ object AStar { // moved from 2018 Day 22 def search[A](graphSearch: GraphSearch[A] & Heuristic[A]): Distances[A] & Target[A] = { val visitedDistance: mutable.Map[A, Int] = mutable.Map.empty - val toVisit: mutable.PriorityQueue[(Int, Int, A)] = mutable.PriorityQueue.empty(Ordering.by(-_._1)) + val toVisit: mutable.PriorityQueue[(Int, Int, A)] = mutable.PriorityQueue.empty(using Ordering.by(-_._1)) def enqueueHeuristically(node: A, dist: Int): Unit = { toVisit.enqueue((dist + graphSearch.heuristic(node), dist, node)) diff --git a/src/main/scala/eu/sim642/adventofcodelib/graph/BronKerbosch.scala b/src/main/scala/eu/sim642/adventofcodelib/graph/BronKerbosch.scala new file mode 100644 index 00000000..fde07173 --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcodelib/graph/BronKerbosch.scala @@ -0,0 +1,60 @@ +package eu.sim642.adventofcodelib.graph + +object BronKerbosch { + + // unused + def maximalCliques[A](neighbors: Map[A, Set[A]]): Iterator[Set[A]] = { + + def bronKerbosch(r: Set[A], p: Set[A], x: Set[A]): Iterator[Set[A]] = { + if (p.isEmpty) { + if (x.isEmpty) + Iterator.single(r) + else + Iterator.empty + } + else { + //val u = p.headOption.getOrElse(x.head) + val u = (p ++ x).maxBy(neighbors(_).size) // pivot on highest degree + val vs = (p -- neighbors(u)).iterator + Iterator.unfold((p, x))((p, x) => // foldLeftFlatMap + vs.nextOption().map(v => + (bronKerbosch(r + v, p intersect neighbors(v), x intersect neighbors(v)), (p - v, x + v)) + ) + ).flatten + } + } + + bronKerbosch(Set.empty, neighbors.keySet, Set.empty) + } + + // TODO: would this be slower than direct implementation below? + /*def maximumClique[A](neighbors: Map[A, Set[A]]): Set[A] = + maximalCliques(neighbors).maxBy(_.size)*/ + + // moved from 2018 day 23 + def maximumClique[A](neighbors: Map[A, Set[A]]): Set[A] = { + var best: Set[A] = Set.empty + + def bronKerbosch(r: Set[A], p: Set[A], x: Set[A]): Unit = { + if (p.isEmpty && x.isEmpty) { + //println(r) + if (r.size > best.size) + best = r + } + else { + //val u = p.headOption.getOrElse(x.head) + val u = (p ++ x).maxBy(neighbors(_).size) // pivot on highest degree + var p2 = p + var x2 = x + for (v <- p -- neighbors(u)) { + bronKerbosch(r + v, p2 intersect neighbors(v), x2 intersect neighbors(v)) + p2 -= v + x2 += v + } + } + } + + bronKerbosch(Set.empty, neighbors.keySet, Set.empty) + best + } +} diff --git a/src/main/scala/eu/sim642/adventofcodelib/graph/Dijkstra.scala b/src/main/scala/eu/sim642/adventofcodelib/graph/Dijkstra.scala index 5503b2fe..b90d5574 100644 --- a/src/main/scala/eu/sim642/adventofcodelib/graph/Dijkstra.scala +++ b/src/main/scala/eu/sim642/adventofcodelib/graph/Dijkstra.scala @@ -8,7 +8,7 @@ object Dijkstra { // copied from AStar def traverse[A](graphTraversal: GraphTraversal[A]): Distances[A] = { val visitedDistance: mutable.Map[A, Int] = mutable.Map.empty - val toVisit: mutable.PriorityQueue[(Int, A)] = mutable.PriorityQueue.empty(Ordering.by(-_._1)) + val toVisit: mutable.PriorityQueue[(Int, A)] = mutable.PriorityQueue.empty(using Ordering.by(-_._1)) def enqueue(node: A, dist: Int): Unit = { toVisit.enqueue((dist, node)) @@ -40,7 +40,7 @@ object Dijkstra { // copied from AStar def search[A](graphSearch: GraphSearch[A]): Distances[A] & Target[A] = { val visitedDistance: mutable.Map[A, Int] = mutable.Map.empty - val toVisit: mutable.PriorityQueue[(Int, A)] = mutable.PriorityQueue.empty(Ordering.by(-_._1)) + val toVisit: mutable.PriorityQueue[(Int, A)] = mutable.PriorityQueue.empty(using Ordering.by(-_._1)) def enqueue(node: A, dist: Int): Unit = { toVisit.enqueue((dist, node)) diff --git a/src/main/scala/eu/sim642/adventofcodelib/graph/Kruskal.scala b/src/main/scala/eu/sim642/adventofcodelib/graph/Kruskal.scala new file mode 100644 index 00000000..00d52232 --- /dev/null +++ b/src/main/scala/eu/sim642/adventofcodelib/graph/Kruskal.scala @@ -0,0 +1,19 @@ +package eu.sim642.adventofcodelib.graph + +import eu.sim642.adventofcodelib.UnionFind + +object Kruskal { + + def iterate[A](nodes: Seq[A], sortedEdges: IterableOnce[(A, A)]): Iterator[(UnionFind[A], Option[(A, A)])] = { + sortedEdges.iterator + .scanLeft((new UnionFind(nodes), Option.empty[(A, A)]))({ case ((uf, _), edge@(p1, p2)) => + if (uf.sameRepr(p1, p2)) + (uf, None) + else + (uf.unioned(p1, p2), Some(edge)) + }) + } + + def iterateEdges[A](nodes: Seq[A], sortedEdges: IterableOnce[(A, A)]): Iterator[(A, A)] = + iterate(nodes, sortedEdges).flatMap(_._2).take(nodes.size - 1) +} diff --git a/src/main/scala/eu/sim642/adventofcodelib/graph/NaiveTSP.scala b/src/main/scala/eu/sim642/adventofcodelib/graph/NaiveTSP.scala index 43b3370f..5e46d162 100644 --- a/src/main/scala/eu/sim642/adventofcodelib/graph/NaiveTSP.scala +++ b/src/main/scala/eu/sim642/adventofcodelib/graph/NaiveTSP.scala @@ -19,7 +19,7 @@ object NaiveTSP { .permutations .map({ path => totalPathLength(distanceMatrix, path) - }).min(lengthOrdering) + }).min(using lengthOrdering) } // moved from 2016 Day 24 @@ -29,7 +29,7 @@ object NaiveTSP { .map({ path => distanceMatrix(start)(path.head) + totalPathLength(distanceMatrix, path) - }).min(lengthOrdering) + }).min(using lengthOrdering) } // moved from 2016 Day 24 @@ -40,7 +40,7 @@ object NaiveTSP { distanceMatrix(start)(path.head) + totalPathLength(distanceMatrix, path) + distanceMatrix(path.last)(start) - }).min(lengthOrdering) + }).min(using lengthOrdering) } def cycleLength[A](distanceMatrix: DistanceMatrix[A])(using lengthOrdering: Ordering[Int]): Int = { diff --git a/src/test/scala/eu/sim642/adventofcode2024/Day21Test.scala b/src/test/scala/eu/sim642/adventofcode2024/Day21Test.scala new file mode 100644 index 00000000..f8cb30aa --- /dev/null +++ b/src/test/scala/eu/sim642/adventofcode2024/Day21Test.scala @@ -0,0 +1,55 @@ +package eu.sim642.adventofcode2024 + +import Day21.* +import Day21Test.* +import org.scalatest.Suites +import org.scalatest.funsuite.AnyFunSuite + +class Day21Test extends Suites( + new NaiveSolutionTest, + new DynamicProgrammingSolutionTest, +) + +object Day21Test { + + val exampleInput = + """029A + |980A + |179A + |456A + |379A""".stripMargin + + abstract class SolutionTest(solution: Solution) extends AnyFunSuite { + import solution._ + + test("Part 1 examples") { + assert(shortestSequenceLength("029A", 0) == "^^AvvvA".length) + assert(shortestSequenceLength("029A", 1) == "v<>^AAvA<^AA>A^A".length) + assert(shortestSequenceLength("029A", 2) == ">^AvAA<^A>A>^AvA^A^A^A>AAvA^AA>^AAAvA<^A>A".length) + + assert(sumCodeComplexity(parseCodes(exampleInput), part1DirectionalKeypads) == 126384) + } + + test("Part 1 input answer") { + assert(sumCodeComplexity(parseCodes(input), part1DirectionalKeypads) == 157892) + } + + protected val testPart2: Boolean = true + + if (testPart2) { + test("Part 2 examples") { + assert(sumCodeComplexity(parseCodes(exampleInput), part2DirectionalKeypads) == 154115708116294L) // not in text + } + + test("Part 2 input answer") { + assert(sumCodeComplexity(parseCodes(input), part2DirectionalKeypads) == 197015606336332L) + } + } + } + + class NaiveSolutionTest extends SolutionTest(NaiveSolution) { + override protected val testPart2: Boolean = false + } + + class DynamicProgrammingSolutionTest extends SolutionTest(DynamicProgrammingSolution) +} diff --git a/src/test/scala/eu/sim642/adventofcode2024/Day22Test.scala b/src/test/scala/eu/sim642/adventofcode2024/Day22Test.scala new file mode 100644 index 00000000..6867475f --- /dev/null +++ b/src/test/scala/eu/sim642/adventofcode2024/Day22Test.scala @@ -0,0 +1,56 @@ +package eu.sim642.adventofcode2024 + +import Day22.* +import org.scalatest.funsuite.AnyFunSuite +import org.scalatestplus.scalacheck.ScalaCheckPropertyChecks + +class Day22Test extends AnyFunSuite with ScalaCheckPropertyChecks { + + val exampleInput = + """1 + |10 + |100 + |2024""".stripMargin + + val exampleInput2 = + """1 + |2 + |3 + |2024""".stripMargin + + test("Part 1 examples") { + val secrets = Table( + "secret", + 123, + 15887950, + 16495136, + 527345, + 704524, + 1553684, + 12683156, + 11100544, + 12249484, + 7753432, + 5908254, + ) + + val it = secretIterator(123) + forAll (secrets) { secret => + assert(it.next() == secret) + } + + assert(sumSecretsAfter(parseSecrets(exampleInput)) == 37327623) + } + + test("Part 1 input answer") { + assert(sumSecretsAfter(parseSecrets(input)) == 21147129593L) + } + + test("Part 2 examples") { + assert(mostBananas(parseSecrets(exampleInput2)) == 23) + } + + test("Part 2 input answer") { + assert(mostBananas(parseSecrets(input)) == 2445) + } +} diff --git a/src/test/scala/eu/sim642/adventofcode2024/Day23Test.scala b/src/test/scala/eu/sim642/adventofcode2024/Day23Test.scala new file mode 100644 index 00000000..e58c66b1 --- /dev/null +++ b/src/test/scala/eu/sim642/adventofcode2024/Day23Test.scala @@ -0,0 +1,57 @@ +package eu.sim642.adventofcode2024 + +import Day23._ +import org.scalatest.funsuite.AnyFunSuite + +class Day23Test extends AnyFunSuite { + + val exampleInput = + """kh-tc + |qp-kh + |de-cg + |ka-co + |yn-aq + |qp-ub + |cg-tb + |vc-aq + |tb-ka + |wh-tc + |yn-cg + |kh-ub + |ta-co + |de-co + |tc-td + |tb-wq + |wh-td + |ta-ka + |td-qp + |aq-cg + |wq-ub + |ub-vc + |de-ta + |wq-aq + |wq-vc + |wh-yn + |ka-de + |kh-ta + |co-tc + |wh-qp + |tb-vc + |td-yn""".stripMargin + + test("Part 1 examples") { + assert(count3CliquesT(parseEdges(exampleInput)) == 7) + } + + test("Part 1 input answer") { + assert(count3CliquesT(parseEdges(input)) == 1437) + } + + test("Part 2 examples") { + assert(lanPartyPassword(parseEdges(exampleInput)) == "co,de,ka,ta") + } + + test("Part 2 input answer") { + assert(lanPartyPassword(parseEdges(input)) == "da,do,gx,ly,mb,ns,nt,pz,sc,si,tp,ul,vl") + } +} diff --git a/src/test/scala/eu/sim642/adventofcode2024/Day24Test.scala b/src/test/scala/eu/sim642/adventofcode2024/Day24Test.scala new file mode 100644 index 00000000..e08de7b2 --- /dev/null +++ b/src/test/scala/eu/sim642/adventofcode2024/Day24Test.scala @@ -0,0 +1,81 @@ +package eu.sim642.adventofcode2024 + +import Day24._ +import org.scalatest.funsuite.AnyFunSuite + +class Day24Test extends AnyFunSuite { + + val exampleInput = + """x00: 1 + |x01: 1 + |x02: 1 + |y00: 0 + |y01: 1 + |y02: 0 + | + |x00 AND y00 -> z00 + |x01 XOR y01 -> z01 + |x02 OR y02 -> z02""".stripMargin + + val exampleInput2 = + """x00: 1 + |x01: 0 + |x02: 1 + |x03: 1 + |x04: 0 + |y00: 1 + |y01: 1 + |y02: 1 + |y03: 1 + |y04: 1 + | + |ntg XOR fgs -> mjb + |y02 OR x01 -> tnw + |kwq OR kpj -> z05 + |x00 OR x03 -> fst + |tgd XOR rvg -> z01 + |vdt OR tnw -> bfw + |bfw AND frj -> z10 + |ffh OR nrd -> bqk + |y00 AND y03 -> djm + |y03 OR y00 -> psh + |bqk OR frj -> z08 + |tnw OR fst -> frj + |gnj AND tgd -> z11 + |bfw XOR mjb -> z00 + |x03 OR x00 -> vdt + |gnj AND wpb -> z02 + |x04 AND y00 -> kjc + |djm OR pbm -> qhw + |nrd AND vdt -> hwm + |kjc AND fst -> rvg + |y04 OR y02 -> fgs + |y01 AND x02 -> pbm + |ntg OR kjc -> kwq + |psh XOR fgs -> tgd + |qhw XOR tgd -> z09 + |pbm OR djm -> kpj + |x03 XOR y03 -> ffh + |x00 XOR y04 -> ntg + |bfw OR bqk -> z06 + |nrd XOR fgs -> wpb + |frj XOR qhw -> z04 + |bqk OR frj -> z07 + |y03 OR x01 -> nrd + |hwm AND bqk -> z03 + |tgd XOR rvg -> z12 + |tnw OR pbm -> gnj""".stripMargin + + test("Part 1 examples") { + assert(parseCircuit(exampleInput).zValue == 4) + assert(parseCircuit(exampleInput2).zValue == 2024) + } + + test("Part 1 input answer") { + assert(parseCircuit(input).zValue == 51410244478064L) + } + + test("Part 2 input answer") { + assert(findWireSwapsString(parseCircuit(input)) == "gst,khg,nhn,tvb,vdc,z12,z21,z33") + } +} diff --git a/src/test/scala/eu/sim642/adventofcode2024/Day25Test.scala b/src/test/scala/eu/sim642/adventofcode2024/Day25Test.scala new file mode 100644 index 00000000..081714fa --- /dev/null +++ b/src/test/scala/eu/sim642/adventofcode2024/Day25Test.scala @@ -0,0 +1,56 @@ +package eu.sim642.adventofcode2024 + +import Day25._ +import org.scalatest.funsuite.AnyFunSuite + +class Day25Test extends AnyFunSuite { + + val exampleInput = + """##### + |.#### + |.#### + |.#### + |.#.#. + |.#... + |..... + | + |##### + |##.## + |.#.## + |...## + |...#. + |...#. + |..... + | + |..... + |#.... + |#.... + |#...# + |#.#.# + |#.### + |##### + | + |..... + |..... + |#.#.. + |###.. + |###.# + |###.# + |##### + | + |..... + |..... + |..... + |#.... + |#.#.. + |#.#.# + |#####""".stripMargin + + test("Part 1 examples") { + assert(countLockKeyFits(parseLockKeys(exampleInput)) == 3) + } + + test("Part 1 input answer") { + assert(countLockKeyFits(parseLockKeys(input)) == 3264) + } +} diff --git a/src/test/scala/eu/sim642/adventofcode2025/Day10Test.scala b/src/test/scala/eu/sim642/adventofcode2025/Day10Test.scala new file mode 100644 index 00000000..2e36de76 --- /dev/null +++ b/src/test/scala/eu/sim642/adventofcode2025/Day10Test.scala @@ -0,0 +1,55 @@ +package eu.sim642.adventofcode2025 + +import Day10.* +import Day10Test.* +import org.scalatest.Suites +import org.scalatest.funsuite.AnyFunSuite + +class Day10Test extends Suites( + new Part1Test, + new NaivePart2SolutionTest, + new Z3Part2SolutionTest, + new GaussianEliminationPart2SolutionTest, +) + +object Day10Test { + + val exampleInput = + """[.##.] (3) (1,3) (2) (2,3) (0,2) (0,1) {3,5,4,7} + |[...#.] (0,2,3,4) (2,3) (0,4) (0,1,2) (1,2,3,4) {7,5,12,7,2} + |[.###.#] (0,1,2,3,4) (0,3,4) (0,1,2,4,5) (1,2) {10,11,11,5,10,5}""".stripMargin + + class Part1Test extends AnyFunSuite { + + test("Part 1 examples") { + assert(Part1.sumFewestPresses(parseMachines(exampleInput)) == 7) + } + + test("Part 1 input answer") { + assert(Part1.sumFewestPresses(parseMachines(input)) == 449) + } + } + + abstract class Part2SolutionTest(part2Solution: Part2Solution) extends AnyFunSuite { + + test("Part 2 examples") { + assert(part2Solution.sumFewestPresses(parseMachines(exampleInput)) == 33) + } + + protected val testInput = true + + if (testInput) { + test("Part 2 input answer") { + assert(part2Solution.sumFewestPresses(parseMachines(input)) == 17848) + } + } + } + + class NaivePart2SolutionTest extends Part2SolutionTest(NaivePart2Solution) { + override protected val testInput: Boolean = false + } + + class Z3Part2SolutionTest extends Part2SolutionTest(Z3Part2Solution) + + class GaussianEliminationPart2SolutionTest extends Part2SolutionTest(GaussianEliminationPart2Solution) +} diff --git a/src/test/scala/eu/sim642/adventofcode2025/Day11Benchmark.scala b/src/test/scala/eu/sim642/adventofcode2025/Day11Benchmark.scala new file mode 100644 index 00000000..83a56915 --- /dev/null +++ b/src/test/scala/eu/sim642/adventofcode2025/Day11Benchmark.scala @@ -0,0 +1,40 @@ +package eu.sim642.adventofcode2025 + +import Day11.* +import org.scalameter.Bench +import org.scalameter.api.Gen + +object Day11Benchmark extends Bench.Group { + + val inputDevices = parseDevices(input) + + abstract class SolutionBenchmark(solution: Solution) extends Bench.LocalTime { + performance of solution.getClass.getSimpleName in { + performance of "Part 1" in { + measure method "countPaths" in { + using (Gen.unit("input")) in { _ => + solution.Part1.countPaths(inputDevices) + } + } + } + + performance of "Part 2" in { + measure method "countPaths" in { + using (Gen.unit("input")) in { _ => + solution.Part2.countPaths(inputDevices) + } + } + } + } + } + + class ViaMapSolutionBenchmark extends SolutionBenchmark(ViaMapSolution) + + class ViaPairSolutionBenchmark extends SolutionBenchmark(ViaPairSolution) + + class PermutationsSolutionBenchmark extends SolutionBenchmark(PermutationSolution) + + include(new ViaMapSolutionBenchmark) + include(new ViaPairSolutionBenchmark) + include(new PermutationsSolutionBenchmark) +} diff --git a/src/test/scala/eu/sim642/adventofcode2025/Day11Test.scala b/src/test/scala/eu/sim642/adventofcode2025/Day11Test.scala new file mode 100644 index 00000000..d6ee97f6 --- /dev/null +++ b/src/test/scala/eu/sim642/adventofcode2025/Day11Test.scala @@ -0,0 +1,66 @@ +package eu.sim642.adventofcode2025 + +import Day11.* +import Day11Test.* +import org.scalatest.Suites +import org.scalatest.funsuite.AnyFunSuite + +class Day11Test extends Suites( + new ViaMapSolutionTest, + new ViaPairSolutionTest, + new PermutationSolutionTest, +) + +object Day11Test { + + val exampleInput = + """aaa: you hhh + |you: bbb ccc + |bbb: ddd eee + |ccc: ddd eee fff + |ddd: ggg + |eee: out + |fff: out + |ggg: out + |hhh: ccc fff iii + |iii: out""".stripMargin + + val exampleInput2 = + """svr: aaa bbb + |aaa: fft + |fft: ccc + |bbb: tty + |tty: ccc + |ccc: ddd eee + |ddd: hub + |hub: fff + |eee: dac + |dac: fff + |fff: ggg hhh + |ggg: out + |hhh: out""".stripMargin + + abstract class SolutionTest(solution: Solution) extends AnyFunSuite { + test("Part 1 examples") { + assert(solution.Part1.countPaths(parseDevices(exampleInput)) == 5) + } + + test("Part 1 input answer") { + assert(solution.Part1.countPaths(parseDevices(input)) == 643) + } + + test("Part 2 examples") { + assert(solution.Part2.countPaths(parseDevices(exampleInput2)) == 2) + } + + test("Part 2 input answer") { + assert(solution.Part2.countPaths(parseDevices(input)) == 417190406827152L) + } + } + + class ViaMapSolutionTest extends SolutionTest(ViaMapSolution) + + class ViaPairSolutionTest extends SolutionTest(ViaPairSolution) + + class PermutationSolutionTest extends SolutionTest(PermutationSolution) +} diff --git a/src/test/scala/eu/sim642/adventofcode2025/Day12Test.scala b/src/test/scala/eu/sim642/adventofcode2025/Day12Test.scala new file mode 100644 index 00000000..20038c6f --- /dev/null +++ b/src/test/scala/eu/sim642/adventofcode2025/Day12Test.scala @@ -0,0 +1,55 @@ +package eu.sim642.adventofcode2025 + +import Day12._ +import org.scalatest.funsuite.AnyFunSuite + +class Day12Test extends AnyFunSuite { + + val exampleInput = + """0: + |### + |##. + |##. + | + |1: + |### + |##. + |.## + | + |2: + |.## + |### + |##. + | + |3: + |##. + |### + |##. + | + |4: + |### + |#.. + |### + | + |5: + |### + |.#. + |### + | + |4x4: 0 0 0 0 2 0 + |12x5: 1 0 1 0 2 2 + |12x5: 1 0 1 0 3 2""".stripMargin + + test("Part 1 examples") { + import NaiveSolution._ // doesn't work with cheat solution + val input1 = parseInput(exampleInput) + assert(fits(input1.shapes)(input1.regions(0))) + assert(fits(input1.shapes)(input1.regions(1))) + assert(!fits(input1.shapes)(input1.regions(2))) + assert(countFits(parseInput(exampleInput)) == 2) + } + + test("Part 1 input answer") { + assert(SanitySolution.countFits(parseInput(input)) == 443) + } +} diff --git a/src/test/scala/eu/sim642/adventofcode2025/Day1Test.scala b/src/test/scala/eu/sim642/adventofcode2025/Day1Test.scala new file mode 100644 index 00000000..e72a2840 --- /dev/null +++ b/src/test/scala/eu/sim642/adventofcode2025/Day1Test.scala @@ -0,0 +1,36 @@ +package eu.sim642.adventofcode2025 + +import Day1._ +import org.scalatest.funsuite.AnyFunSuite + +class Day1Test extends AnyFunSuite { + + val exampleInput = + """L68 + |L30 + |R48 + |L5 + |R60 + |L55 + |L1 + |L99 + |R14 + |L82""".stripMargin + + test("Part 1 examples") { + assert(Part1.password(parseRotations(exampleInput)) == 3) + } + + test("Part 1 input answer") { + assert(Part1.password(parseRotations(input)) == 995) + } + + test("Part 2 examples") { + assert(Part2.password(parseRotations(exampleInput)) == 6) + assert(Part2.password(parseRotations("R1000")) == 10) + } + + test("Part 2 input answer") { + assert(Part2.password(parseRotations(input)) == 5847) + } +} diff --git a/src/test/scala/eu/sim642/adventofcode2025/Day2Test.scala b/src/test/scala/eu/sim642/adventofcode2025/Day2Test.scala new file mode 100644 index 00000000..b5923d88 --- /dev/null +++ b/src/test/scala/eu/sim642/adventofcode2025/Day2Test.scala @@ -0,0 +1,26 @@ +package eu.sim642.adventofcode2025 + +import Day2._ +import org.scalatest.funsuite.AnyFunSuite + +class Day2Test extends AnyFunSuite { + + val exampleInput = + """11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124""" + + test("Part 1 examples") { + assert(Part1.sumInvalidIds(parseRanges(exampleInput)) == 1227775554) + } + + test("Part 1 input answer") { + assert(Part1.sumInvalidIds(parseRanges(input)) == 5398419778L) + } + + test("Part 2 examples") { + assert(Part2.sumInvalidIds(parseRanges(exampleInput)) == 4174379265L) + } + + test("Part 2 input answer") { + assert(Part2.sumInvalidIds(parseRanges(input)) == 15704845910L) + } +} diff --git a/src/test/scala/eu/sim642/adventofcode2025/Day3Test.scala b/src/test/scala/eu/sim642/adventofcode2025/Day3Test.scala new file mode 100644 index 00000000..c264d154 --- /dev/null +++ b/src/test/scala/eu/sim642/adventofcode2025/Day3Test.scala @@ -0,0 +1,32 @@ +package eu.sim642.adventofcode2025 + +import Day3._ +import org.scalatest.funsuite.AnyFunSuite + +class Day3Test extends AnyFunSuite { + + val exampleInput = + """987654321111111 + |811111111111119 + |234234234234278 + |818181911112111""".stripMargin + + test("Part 1 examples") { + assert(Part1.maxJoltage("98") == 98) + assert(Part1.maxJoltage("987") == 98) + assert(Part1.totalJoltage(parseBanks(exampleInput)) == 357) + } + + test("Part 1 input answer") { + assert(Part1.totalJoltage(parseBanks(input)) == 17301) + } + + test("Part 2 examples") { + assert(Part2.maxJoltage("987654321111111") == 987654321111L) + assert(Part2.totalJoltage(parseBanks(exampleInput)) == 3121910778619L) + } + + test("Part 2 input answer") { + assert(Part2.totalJoltage(parseBanks(input)) == 172162399742349L) + } +} diff --git a/src/test/scala/eu/sim642/adventofcode2025/Day4Test.scala b/src/test/scala/eu/sim642/adventofcode2025/Day4Test.scala new file mode 100644 index 00000000..bfe56585 --- /dev/null +++ b/src/test/scala/eu/sim642/adventofcode2025/Day4Test.scala @@ -0,0 +1,35 @@ +package eu.sim642.adventofcode2025 + +import Day4._ +import org.scalatest.funsuite.AnyFunSuite + +class Day4Test extends AnyFunSuite { + + val exampleInput = + """..@@.@@@@. + |@@@.@.@.@@ + |@@@@@.@.@@ + |@.@@@@..@. + |@@.@@@@.@@ + |.@@@@@@@.@ + |.@.@.@.@@@ + |@.@@@.@@@@ + |.@@@@@@@@. + |@.@.@@@.@.""".stripMargin + + test("Part 1 examples") { + assert(countAccessibleRolls(parseGrid(exampleInput)) == 13) + } + + test("Part 1 input answer") { + assert(countAccessibleRolls(parseGrid(input)) == 1527) + } + + test("Part 2 examples") { + assert(countRemovableRolls(parseGrid(exampleInput)) == 43) + } + + test("Part 2 input answer") { + assert(countRemovableRolls(parseGrid(input)) == 8690) + } +} diff --git a/src/test/scala/eu/sim642/adventofcode2025/Day5Test.scala b/src/test/scala/eu/sim642/adventofcode2025/Day5Test.scala new file mode 100644 index 00000000..63192baf --- /dev/null +++ b/src/test/scala/eu/sim642/adventofcode2025/Day5Test.scala @@ -0,0 +1,36 @@ +package eu.sim642.adventofcode2025 + +import Day5._ +import org.scalatest.funsuite.AnyFunSuite + +class Day5Test extends AnyFunSuite { + + val exampleInput = + """3-5 + |10-14 + |16-20 + |12-18 + | + |1 + |5 + |8 + |11 + |17 + |32""".stripMargin + + test("Part 1 examples") { + assert(countFreshAvailable(parseDatabase(exampleInput)) == 3) + } + + test("Part 1 input answer") { + assert(countFreshAvailable(parseDatabase(input)) == 679) + } + + test("Part 2 examples") { + assert(countFresh(parseDatabase(exampleInput)) == 14) + } + + test("Part 2 input answer") { + assert(countFresh(parseDatabase(input)) == 358155203664116L) + } +} diff --git a/src/test/scala/eu/sim642/adventofcode2025/Day6Test.scala b/src/test/scala/eu/sim642/adventofcode2025/Day6Test.scala new file mode 100644 index 00000000..561f32bc --- /dev/null +++ b/src/test/scala/eu/sim642/adventofcode2025/Day6Test.scala @@ -0,0 +1,29 @@ +package eu.sim642.adventofcode2025 + +import Day6._ +import org.scalatest.funsuite.AnyFunSuite + +class Day6Test extends AnyFunSuite { + + val exampleInput = + """123 328 51 64 + | 45 64 387 23 + | 6 98 215 314 + |* + * +""".stripMargin + + test("Part 1 examples") { + assert(sumAnswers(Part1.parseProblems(exampleInput)) == 4277556) + } + + test("Part 1 input answer") { + assert(sumAnswers(Part1.parseProblems(input)) == 5361735137219L) + } + + test("Part 2 examples") { + assert(sumAnswers(Part2.parseProblems(exampleInput)) == 3263827) + } + + test("Part 2 input answer") { + assert(sumAnswers(Part2.parseProblems(input)) == 11744693538946L) + } +} diff --git a/src/test/scala/eu/sim642/adventofcode2025/Day7Test.scala b/src/test/scala/eu/sim642/adventofcode2025/Day7Test.scala new file mode 100644 index 00000000..a2fec4d5 --- /dev/null +++ b/src/test/scala/eu/sim642/adventofcode2025/Day7Test.scala @@ -0,0 +1,41 @@ +package eu.sim642.adventofcode2025 + +import Day7._ +import org.scalatest.funsuite.AnyFunSuite + +class Day7Test extends AnyFunSuite { + + val exampleInput = + """.......S....... + |............... + |.......^....... + |............... + |......^.^...... + |............... + |.....^.^.^..... + |............... + |....^.^...^.... + |............... + |...^.^...^.^... + |............... + |..^...^.....^.. + |............... + |.^.^.^.^.^...^. + |...............""".stripMargin + + test("Part 1 examples") { + assert(countBeamSplits(parseGrid(exampleInput)) == 21) + } + + test("Part 1 input answer") { + assert(countBeamSplits(parseGrid(input)) == 1587) + } + + test("Part 2 examples") { + assert(countTimelines(parseGrid(exampleInput)) == 40) + } + + test("Part 2 input answer") { + assert(countTimelines(parseGrid(input)) == 5748679033029L) + } +} diff --git a/src/test/scala/eu/sim642/adventofcode2025/Day8Test.scala b/src/test/scala/eu/sim642/adventofcode2025/Day8Test.scala new file mode 100644 index 00000000..0e58baa6 --- /dev/null +++ b/src/test/scala/eu/sim642/adventofcode2025/Day8Test.scala @@ -0,0 +1,45 @@ +package eu.sim642.adventofcode2025 + +import Day8._ +import org.scalatest.funsuite.AnyFunSuite + +class Day8Test extends AnyFunSuite { + + val exampleInput = + """162,817,812 + |57,618,57 + |906,360,560 + |592,479,940 + |352,342,300 + |466,668,158 + |542,29,236 + |431,825,988 + |739,650,466 + |52,470,668 + |216,146,977 + |819,987,18 + |117,168,530 + |805,96,715 + |346,949,466 + |970,615,88 + |941,993,340 + |862,61,35 + |984,92,344 + |425,690,689""".stripMargin + + test("Part 1 examples") { + assert(multiplySizesAfter(parseJunctionBoxes(exampleInput), after = 10) == 40) + } + + test("Part 1 input answer") { + assert(multiplySizesAfter(parseJunctionBoxes(input)) == 52668) + } + + test("Part 2 examples") { + assert(multiplyLastXs(parseJunctionBoxes(exampleInput)) == 25272) + } + + test("Part 2 input answer") { + assert(multiplyLastXs(parseJunctionBoxes(input)) == 1474050600) + } +} diff --git a/src/test/scala/eu/sim642/adventofcode2025/Day9Test.scala b/src/test/scala/eu/sim642/adventofcode2025/Day9Test.scala new file mode 100644 index 00000000..b8f5e96f --- /dev/null +++ b/src/test/scala/eu/sim642/adventofcode2025/Day9Test.scala @@ -0,0 +1,96 @@ +package eu.sim642.adventofcode2025 + +import Day9.* +import Day9Test.* +import org.scalatest.Suites +import org.scalatest.funsuite.AnyFunSuite + +class Day9Test extends Suites( + new Part1Test, + new CompressGridPart2SolutionTest, + new IntersectionPart2SolutionTest, +) + +object Day9Test { + + val exampleInput = + """7,1 + |11,1 + |11,7 + |9,7 + |9,5 + |2,5 + |2,3 + |7,3""".stripMargin + + val largeUInput = + """1,1 + |3,1 + |3,1000 + |1000,1000 + |1000,1 + |1002,1 + |1002,1002 + |1,1002""".stripMargin + + val adjacentCoordinateInput = // from Timvde on Libera IRC + """1,1 + |3,1 + |3,6 + |4,6 + |4,1 + |6,1 + |6,10 + |1,10""".stripMargin + + class Part1Test extends AnyFunSuite { + + test("Part 1 examples") { + assert(Part1.largestArea(parseRedTiles(exampleInput)) == 50) + } + + test("Part 1 large U") { + assert(Part1.largestArea(parseRedTiles(largeUInput)) == 1004004) + } + + test("Part 1 adjacent coordinate") { + assert(Part1.largestArea(parseRedTiles(adjacentCoordinateInput)) == 60) + } + + test("Part 1 input answer") { + assert(Part1.largestArea(parseRedTiles(input)) == 4729332959L) + } + } + + abstract class Part2SolutionTest(val part2Solution: Part2Solution) extends AnyFunSuite { + + test("Part 2 examples") { + assert(part2Solution.largestArea(parseRedTiles(exampleInput)) == 24) + } + + ignore("Part 2 adjacent coordinate") { + // should not be 30 + assert(part2Solution.largestArea(parseRedTiles(adjacentCoordinateInput)) == 60) + } + + test("Part 2 input answer") { + assert(part2Solution.largestArea(parseRedTiles(input)) == 1474477524L) + } + } + + class CompressGridPart2SolutionTest extends Part2SolutionTest(CompressGridPart2Solution) { + + test("Part 2 large U") { + // should not be 998000, which would be the completely outside box in the large U + assert(part2Solution.largestArea(parseRedTiles(largeUInput)) == 3006) + } + } + + class IntersectionPart2SolutionTest extends Part2SolutionTest(IntersectionPart2Solution) { + + ignore("Part 2 large U") { // fails due to assumption + // should not be 998000, which would be the completely outside box in the large U + assert(part2Solution.largestArea(parseRedTiles(largeUInput)) == 3006) + } + } +}