From ea7cc85052e41f2ca57b581a8cfc9ac36d4bfbd6 Mon Sep 17 00:00:00 2001 From: Klotz Date: Tue, 2 Dec 2025 22:54:16 +0100 Subject: [PATCH] initial commit with day1 solution --- README.md | 2 - aoc25.opam | 32 + bin/dune | 4 + bin/main.ml | 2 + dune-project | 26 + inputs/day1.txt | 4498 ++++++++++++++++++++++++++++++++++++++++++ lib/day1.ml | 86 + lib/day1_improved.ml | 102 + lib/dune | 4 + lib/reuse.ml | 9 + 10 files changed, 4763 insertions(+), 2 deletions(-) delete mode 100644 README.md create mode 100644 aoc25.opam create mode 100644 bin/dune create mode 100644 bin/main.ml create mode 100644 dune-project create mode 100644 inputs/day1.txt create mode 100644 lib/day1.ml create mode 100644 lib/day1_improved.ml create mode 100644 lib/dune create mode 100644 lib/reuse.ml diff --git a/README.md b/README.md deleted file mode 100644 index 60d2936..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# aoc25_ocaml - diff --git a/aoc25.opam b/aoc25.opam new file mode 100644 index 0000000..a43bbcb --- /dev/null +++ b/aoc25.opam @@ -0,0 +1,32 @@ +# This file is generated by dune, edit dune-project instead +opam-version: "2.0" +synopsis: "A short synopsis" +description: "A longer description" +maintainer: ["Maintainer Name "] +authors: ["Author Name "] +license: "LICENSE" +tags: ["add topics" "to describe" "your" "project"] +homepage: "https://github.com/username/reponame" +doc: "https://url/to/documentation" +bug-reports: "https://github.com/username/reponame/issues" +depends: [ + "dune" {>= "3.20"} + "ocaml" + "odoc" {with-doc} +] +build: [ + ["dune" "subst"] {dev} + [ + "dune" + "build" + "-p" + name + "-j" + jobs + "@install" + "@runtest" {with-test} + "@doc" {with-doc} + ] +] +dev-repo: "git+https://github.com/username/reponame.git" +x-maintenance-intent: ["(latest)"] diff --git a/bin/dune b/bin/dune new file mode 100644 index 0000000..60ee87a --- /dev/null +++ b/bin/dune @@ -0,0 +1,4 @@ +(executable + (public_name aoc25) + (name main) + (libraries aoc25)) diff --git a/bin/main.ml b/bin/main.ml new file mode 100644 index 0000000..74967d3 --- /dev/null +++ b/bin/main.ml @@ -0,0 +1,2 @@ +let () = Printf.printf "%i\n" Aoc25.Day1.day1_part1 +let () = Printf.printf "%i\n" Aoc25.Day1.day1_part2 diff --git a/dune-project b/dune-project new file mode 100644 index 0000000..ce32bf4 --- /dev/null +++ b/dune-project @@ -0,0 +1,26 @@ +(lang dune 3.20) + +(name aoc25) + +(generate_opam_files true) + +(source + (github username/reponame)) + +(authors "Author Name ") + +(maintainers "Maintainer Name ") + +(license LICENSE) + +(documentation https://url/to/documentation) + +(package + (name aoc25) + (synopsis "A short synopsis") + (description "A longer description") + (depends ocaml) + (tags + ("add topics" "to describe" your project))) + +; See the complete stanza docs at https://dune.readthedocs.io/en/stable/reference/dune-project/index.html diff --git a/inputs/day1.txt b/inputs/day1.txt new file mode 100644 index 0000000..8e5c483 --- /dev/null +++ b/inputs/day1.txt @@ -0,0 +1,4498 @@ +L6 +L41 +R25 +L38 +L27 +L21 +R5 +L31 +R10 +L21 +L49 +R44 +L16 +R4 +R39 +L43 +R50 +R27 +R42 +L6 +R1 +L10 +L48 +R12 +L26 +L14 +L19 +L38 +L11 +R30 +R8 +R19 +L19 +L20 +R31 +R7 +L30 +R44 +R43 +R29 +R45 +L14 +R6 +L41 +L24 +R13 +L30 +R36 +L45 +L23 +L9 +R65 +R35 +L29 +L60 +L59 +R20 +L72 +L67 +L81 +L39 +L41 +L72 +R80 +R87 +R55 +R78 +R48 +L28 +L14 +L6 +L16 +L84 +L81 +R12 +R69 +L87 +R87 +R74 +L74 +R34 +R43 +R47 +L83 +R59 +R11 +L24 +L14 +L73 +L50 +L50 +L20 +L80 +R83 +L4 +L90 +L89 +L85 +R16 +L31 +R8 +L14 +R12 +L19 +R13 +L184 +L716 +L705 +L95 +R49 +R398 +R553 +L54 +R10 +L94 +R29 +L91 +L87 +L13 +L10 +L94 +R81 +R307 +L178 +R94 +R65 +R177 +R958 +L47 +R48 +L85 +L75 +R10 +L76 +R576 +R84 +L36 +L99 +L66 +L34 +L78 +L22 +L683 +R56 +R2 +R12 +L712 +R25 +L487 +L13 +L88 +R82 +L657 +L24 +R2 +R57 +R28 +R9 +R91 +R83 +L83 +R18 +L62 +L556 +R858 +R42 +L90 +R90 +R49 +L35 +L75 +R61 +L83 +L17 +R23 +L826 +L106 +L36 +L34 +L55 +L75 +L97 +R18 +R88 +L76 +L623 +L902 +L17 +R18 +L5 +L95 +R962 +R38 +R85 +L11 +L660 +L120 +L94 +L80 +L616 +R75 +L79 +R13 +R87 +R41 +L81 +R840 +L94 +L34 +R653 +R899 +L124 +L13 +L55 +R68 +R65 +R54 +R781 +L54 +L58 +R10 +R525 +L23 +L46 +R61 +L57 +R38 +R4 +L35 +R84 +R94 +L63 +L380 +L27 +L73 +R51 +R461 +R19 +L5 +L209 +R83 +L256 +L846 +R44 +L42 +L76 +L224 +R80 +L9 +L86 +R68 +L25 +L928 +R8 +R105 +L37 +L676 +L77 +L823 +R39 +R77 +L16 +L32 +R84 +L52 +R375 +L503 +L76 +R979 +L75 +R91 +R78 +R81 +L50 +R29 +R571 +L14 +R14 +L483 +L17 +L12 +R12 +L617 +L7 +R24 +L46 +L54 +L79 +R37 +R84 +L42 +L24 +R76 +L52 +L95 +L98 +R89 +L96 +L85 +L19 +L23 +R502 +R20 +R5 +R72 +R21 +R7 +L37 +L39 +L78 +R940 +R38 +R50 +L74 +R649 +L85 +L96 +R455 +L74 +L49 +R65 +L65 +L33 +R33 +R66 +L66 +R99 +R1 +L689 +L7 +L158 +L80 +R550 +R599 +R62 +R611 +R93 +R35 +L16 +R931 +L27 +L4 +R689 +R11 +R341 +R47 +R542 +L57 +R27 +R77 +L84 +R43 +R631 +R26 +R170 +R37 +L97 +R97 +L8 +L92 +L706 +R6 +L37 +R30 +R7 +L49 +L840 +R9 +L20 +L65 +R12 +R84 +R69 +L174 +R74 +R58 +L44 +L14 +L305 +L72 +L923 +L22 +L58 +R35 +R422 +R23 +R30 +R35 +L65 +L55 +R96 +L55 +L86 +L28 +R9 +L976 +R53 +L58 +R992 +R71 +R37 +L29 +L71 +L58 +L855 +R81 +R32 +L44 +R44 +L365 +R14 +L49 +R23 +R4 +R90 +R11 +R72 +R90 +L809 +L181 +R52 +R11 +R830 +R14 +L50 +L57 +L39 +R87 +R52 +L97 +R97 +L70 +L30 +L18 +L82 +L42 +L8 +L83 +R933 +R764 +L64 +R76 +R24 +R838 +L201 +R52 +L99 +R479 +L44 +L45 +R8 +L596 +L80 +L80 +R92 +R54 +R12 +L65 +R82 +R82 +R39 +R66 +L81 +R387 +L43 +R43 +L90 +L618 +R8 +L346 +R10 +R36 +R28 +R58 +L67 +R81 +L5 +L67 +R43 +L271 +R35 +L6 +L70 +L11 +R52 +R111 +L41 +L639 +R97 +L55 +R11 +R56 +L61 +R21 +R32 +L32 +R39 +L739 +R680 +L358 +L11 +R36 +R95 +L704 +L38 +R45 +R52 +R3 +L70 +R99 +L83 +R54 +R41 +R55 +L76 +L20 +R79 +R56 +R48 +R97 +R490 +R30 +L9 +L598 +R953 +R68 +R692 +L306 +R24 +L8 +R605 +R58 +L60 +L25 +L88 +R94 +R45 +R7 +L513 +R61 +L693 +R12 +R29 +L48 +L842 +L58 +R57 +L57 +R6 +R94 +R4 +L674 +L505 +R69 +R806 +R80 +R950 +R3 +R67 +R94 +L94 +R1 +L55 +R28 +R56 +R145 +R25 +L859 +L19 +R78 +L72 +L28 +L99 +L1 +L82 +L18 +R39 +L39 +L28 +R28 +R70 +R30 +L71 +R71 +R44 +R56 +L92 +R22 +R35 +L73 +L769 +L23 +R221 +L50 +R36 +R93 +L925 +L5 +L4 +R34 +R33 +R677 +R90 +R40 +L81 +R55 +L72 +L29 +L86 +L7 +R952 +R392 +R36 +R65 +R35 +R454 +L61 +R9 +L70 +L4 +L76 +L52 +L451 +L13 +R64 +R66 +R34 +R18 +R69 +L87 +L78 +L84 +L856 +R750 +R68 +L77 +R30 +L754 +R20 +R994 +R20 +R67 +L537 +R62 +R97 +R14 +L48 +L98 +L858 +R72 +L104 +R89 +R80 +R231 +R49 +R79 +R783 +R89 +L20 +R96 +R97 +L73 +L510 +L20 +R995 +R344 +R84 +L63 +L57 +R29 +L2 +R65 +R72 +R1 +R83 +R79 +R83 +R217 +L21 +L79 +R48 +L598 +L550 +L33 +R333 +L63 +R380 +R43 +L28 +R49 +R19 +R67 +L29 +L88 +R50 +R365 +R61 +L60 +L59 +R69 +R59 +L380 +R33 +L80 +L780 +L1 +R73 +R4 +R96 +R80 +L80 +L55 +R9 +L138 +R92 +L23 +R2 +L87 +R139 +R79 +R44 +L21 +L69 +L36 +L36 +L38 +R17 +R21 +R55 +L12 +L54 +L989 +L34 +R931 +L838 +L259 +L10 +R12 +L602 +R67 +L32 +L35 +L33 +L67 +L452 +L248 +L207 +R66 +L21 +R86 +R88 +R88 +L75 +L25 +R23 +L23 +R962 +R38 +R32 +R84 +L16 +R68 +R16 +R87 +R236 +R36 +R157 +R17 +L433 +R8 +R41 +L19 +R856 +R91 +L5 +R45 +L45 +R44 +L47 +L90 +L63 +R68 +L121 +R76 +R77 +L97 +L295 +R792 +R7 +R1 +L8 +L357 +R5 +L348 +R49 +L49 +L95 +R22 +R53 +R93 +L73 +R490 +R476 +R34 +R12 +R67 +R362 +L93 +L60 +L488 +L86 +L94 +L99 +R65 +R70 +R444 +R66 +R34 +L43 +L57 +L39 +L76 +R84 +R61 +L30 +R70 +L70 +L59 +L41 +R36 +R64 +R50 +L1 +R94 +L43 +R490 +R610 +R73 +L28 +R52 +L97 +R27 +R73 +R99 +R1 +L2 +R2 +L39 +L261 +L19 +R419 +R63 +L363 +L420 +R87 +R16 +R34 +R83 +R79 +L79 +L121 +R21 +R937 +L33 +L36 +L68 +R17 +R64 +R680 +L261 +L162 +R57 +R80 +L25 +L80 +L70 +L83 +L83 +R66 +L84 +L16 +R89 +R11 +R58 +R60 +L20 +L98 +L747 +R51 +R84 +L253 +R93 +L87 +R66 +R93 +L75 +R204 +R71 +L74 +L26 +L28 +R728 +R24 +L424 +L61 +R34 +L58 +R37 +R48 +R46 +R32 +R37 +L92 +R49 +R52 +R78 +L502 +L77 +R9 +R26 +L85 +L73 +L53 +R691 +R262 +L85 +R1 +R52 +R53 +L80 +L25 +R84 +R65 +R35 +L45 +L55 +L34 +R25 +R34 +R94 +R281 +R46 +R9 +L403 +L14 +L38 +L89 +R3 +R2 +L51 +R35 +L487 +R4 +R39 +L37 +L19 +R363 +R37 +L65 +L35 +L84 +L56 +L60 +R939 +L91 +R62 +L70 +L423 +R94 +L48 +R75 +L89 +R96 +L78 +L67 +L13 +L77 +R90 +L57 +L43 +R85 +R478 +R37 +R92 +R32 +L624 +L340 +L1 +R52 +R879 +R10 +R16 +R384 +R62 +L862 +R59 +L761 +L18 +L11 +R37 +R94 +R25 +L17 +R537 +R55 +L78 +R59 +L81 +L5 +R25 +L20 +L555 +L59 +L86 +R6 +R194 +R367 +L67 +L6 +L94 +R63 +L63 +R30 +L30 +R88 +R12 +L971 +R392 +R31 +R21 +L73 +R19 +L81 +L276 +L62 +L77 +L123 +L81 +L19 +R36 +R519 +L69 +R414 +R21 +R48 +R198 +L29 +R73 +R89 +R22 +L22 +L38 +R9 +R354 +R61 +L986 +L71 +R71 +L16 +R658 +R358 +L43 +R84 +L41 +R34 +R46 +R31 +R78 +R11 +R24 +L95 +L929 +R53 +R34 +R19 +R94 +L51 +L53 +L896 +L95 +R82 +L87 +L52 +L66 +L30 +R63 +L60 +L55 +L97 +R97 +R46 +R54 +L67 +R53 +L27 +R48 +L11 +R4 +L41 +R56 +L77 +R71 +R291 +R31 +L31 +R54 +R29 +L9 +L52 +L4 +L90 +R91 +L619 +L45 +L54 +L901 +R30 +L54 +L92 +L143 +L41 +R114 +L14 +R7 +R93 +R70 +R95 +L20 +R99 +L2 +L42 +R15 +R63 +L2 +R24 +R645 +L90 +R45 +L53 +L47 +L245 +L5 +R88 +L79 +L16 +L43 +R278 +R81 +R36 +L95 +R745 +R151 +R4 +R213 +R4 +R83 +L67 +L7 +L67 +L14 +R20 +L32 +R497 +R70 +L54 +R67 +R87 +L18 +R20 +L89 +L45 +R79 +R11 +L41 +L17 +R30 +L375 +R52 +R29 +L20 +L11 +L805 +R31 +R7 +L38 +R98 +R2 +L956 +R73 +R55 +R15 +R13 +L486 +L14 +L96 +L4 +R264 +R31 +L44 +R21 +R510 +L385 +L25 +L48 +L24 +L98 +R98 +R33 +L33 +L86 +R139 +R47 +L14 +L484 +L2 +L56 +L21 +R677 +L46 +R14 +L2 +L84 +L90 +L92 +R76 +L87 +L236 +R69 +R46 +R32 +L72 +R61 +R34 +L2 +R79 +R602 +R51 +R47 +L11 +R30 +R481 +L21 +R31 +L39 +L71 +R57 +L705 +R348 +R24 +L74 +L65 +R15 +R46 +R78 +R76 +L218 +L77 +R99 +R45 +R806 +L12 +L72 +R29 +L47 +L48 +R85 +R73 +L44 +R58 +R47 +R76 +L85 +L60 +R40 +R77 +R28 +R4 +R37 +L49 +L5 +R867 +L72 +L95 +R923 +L26 +R716 +R9 +R68 +L11 +R526 +R23 +L15 +R75 +R925 +L853 +R53 +R55 +L24 +R69 +R25 +L15 +L24 +L79 +L833 +L2 +R28 +L59 +L3 +R94 +L1 +R69 +L98 +R3 +L5 +L63 +L36 +L201 +L5 +L1 +L594 +R31 +R736 +R509 +L76 +L44 +L77 +L12 +L8 +L59 +R155 +R54 +R1 +R55 +R309 +L69 +L1 +R85 +R94 +R117 +R513 +L10 +L3 +L43 +L47 +L10 +R94 +L442 +L88 +R15 +R69 +L48 +L22 +R558 +R97 +R783 +R84 +R55 +R34 +L989 +L64 +L67 +R31 +R71 +L71 +R11 +L826 +R59 +L6 +L29 +R26 +L335 +R692 +L92 +L177 +R9 +L832 +L88 +R5 +R83 +R39 +R5 +R46 +R4 +R6 +L478 +L3 +R71 +R10 +L98 +L2 +L272 +R92 +L415 +R895 +L41 +R41 +L82 +R37 +R136 +L91 +R56 +R6 +L94 +R924 +R8 +L3 +R3 +R27 +L527 +R93 +L93 +R29 +R71 +R27 +R25 +L89 +L63 +L55 +R55 +R20 +R680 +L43 +L28 +L829 +R68 +R26 +R2 +L40 +L56 +R65 +R35 +L41 +L59 +R50 +R839 +R73 +L62 +R94 +R6 +L67 +L38 +L8 +L78 +L9 +L53 +R53 +R69 +L54 +R93 +L42 +L75 +L44 +R753 +R40 +L40 +L79 +R79 +L10 +R10 +R20 +L20 +R26 +L26 +L989 +R40 +R72 +R4 +L38 +R417 +R96 +R53 +R53 +R63 +R29 +R79 +R46 +L25 +R86 +L49 +R88 +R75 +L85 +L99 +L216 +R96 +R83 +R7 +R29 +L15 +R62 +R47 +L809 +L54 +L55 +L43 +R52 +R42 +R889 +R2 +R67 +L53 +L128 +L1 +R82 +R50 +L94 +R44 +R72 +L72 +L6 +L227 +R46 +R87 +L83 +L85 +L26 +L85 +R719 +L88 +L72 +L23 +R27 +R39 +L72 +R19 +L11 +R32 +L91 +L89 +L74 +L3 +L46 +L74 +L76 +R62 +R65 +R37 +R63 +R46 +R34 +L43 +L2 +L69 +R23 +L59 +R426 +R679 +L46 +L679 +L27 +L163 +L85 +L19 +R19 +L68 +R523 +L37 +R86 +R57 +R18 +R621 +R22 +R78 +R79 +L89 +L187 +R84 +R11 +R2 +R59 +L63 +R67 +L63 +L99 +L1 +R99 +L81 +L18 +L78 +R948 +L243 +R68 +L531 +R436 +L54 +L80 +R70 +R17 +L49 +L5 +R22 +L98 +R77 +R19 +R28 +R69 +L36 +R18 +R61 +L59 +R77 +L977 +R24 +R76 +L73 +R33 +L73 +L22 +R53 +R182 +R4 +R23 +L63 +R36 +L65 +R65 +L41 +L225 +R536 +L61 +R91 +R10 +R81 +R45 +L79 +L203 +L395 +R127 +R39 +L25 +L64 +L36 +R50 +R47 +R3 +L32 +R43 +L35 +L476 +R58 +L3 +L72 +L631 +R16 +L68 +L33 +R60 +L70 +L322 +L35 +L94 +L106 +L90 +L21 +L89 +R61 +L11 +R433 +R345 +R972 +L34 +L66 +R82 +R740 +L22 +R95 +L97 +R10 +L62 +R32 +R90 +R57 +R59 +L84 +R57 +R11 +R43 +L811 +L562 +R290 +R990 +L18 +L120 +L84 +L96 +R40 +L40 +L35 +R15 +R17 +L97 +R53 +R47 +L2 +R12 +L98 +L17 +R3 +L98 +R77 +L77 +R67 +R8 +R20 +L34 +R32 +L559 +L434 +L64 +L636 +L450 +R21 +R29 +R89 +L989 +L23 +L104 +L673 +L72 +L37 +L4 +R813 +R60 +R38 +R2 +R885 +R41 +L26 +L547 +L53 +L58 +L42 +L90 +R788 +R27 +L89 +L27 +L9 +L57 +L43 +R92 +L539 +L29 +L24 +L97 +L3 +R35 +R46 +R519 +L39 +R2 +L263 +L57 +R57 +L17 +L83 +L63 +R63 +L62 +R73 +L89 +R32 +L6 +L9 +R61 +R90 +R734 +L55 +R31 +R61 +L61 +L110 +L90 +R89 +R76 +L65 +L74 +L726 +L3 +L8 +R83 +L72 +L1 +L14 +R91 +L776 +L241 +R95 +L54 +L12 +R463 +L70 +L333 +L29 +L85 +L34 +R3 +R1 +L20 +R16 +R330 +R70 +R671 +R993 +L99 +L785 +R598 +L9 +L938 +L787 +L44 +R154 +L53 +L1 +R591 +R92 +R17 +R443 +R57 +R452 +L12 +L40 +R62 +R15 +L77 +L33 +R33 +L30 +R85 +R45 +R959 +L59 +L42 +R22 +L770 +R876 +R14 +R16 +L16 +L33 +R33 +L887 +R94 +R25 +R234 +R295 +R43 +L690 +R86 +L14 +L86 +L88 +L78 +L11 +L12 +R420 +R81 +L563 +R92 +R33 +R10 +L4 +R788 +R19 +R593 +L80 +L21 +L79 +L1 +L97 +R98 +R224 +L1 +L223 +R7 +L46 +L77 +L63 +L22 +R35 +L84 +R750 +L51 +L15 +R95 +R71 +R17 +L79 +R16 +L821 +R24 +R43 +R45 +L95 +R69 +L37 +L65 +L17 +L39 +L61 +R95 +R38 +L73 +R981 +L153 +R12 +L56 +L58 +R958 +L372 +R91 +L638 +L51 +R189 +R37 +L31 +R31 +L27 +R27 +L51 +L214 +R988 +L77 +L54 +R8 +L20 +L11 +R75 +R99 +L78 +R35 +L56 +R6 +R7 +R52 +L9 +L6 +R67 +L40 +L95 +L99 +R86 +R35 +L26 +L522 +L82 +R563 +L53 +L34 +R61 +R845 +L54 +L40 +L6 +L27 +L973 +R731 +L69 +R53 +R985 +R74 +R99 +L73 +L18 +R18 +R988 +R253 +R545 +R14 +L645 +R36 +L740 +R749 +R99 +R19 +R682 +L475 +R775 +R366 +R13 +L11 +L18 +R19 +L82 +R96 +R55 +L36 +R98 +R35 +L35 +R11 +L87 +L26 +L28 +R7 +L84 +R207 +L97 +L52 +R77 +R872 +L60 +L622 +L760 +R42 +R51 +L580 +R704 +L75 +L403 +L941 +L99 +L92 +L69 +L96 +L47 +L753 +L52 +R52 +R34 +R66 +R53 +R9 +L6 +R44 +L42 +L50 +L11 +L328 +L222 +L47 +L33 +R833 +R84 +R458 +L32 +R72 +R67 +L49 +R4 +R96 +R92 +R301 +L84 +R60 +R31 +R23 +R56 +L79 +L7 +L778 +R85 +L692 +R79 +L96 +R9 +R53 +R47 +R964 +L337 +L27 +L98 +R98 +R60 +L32 +L87 +L5 +R92 +L11 +L33 +L84 +L34 +R34 +R65 +R59 +R76 +R38 +R62 +R60 +L60 +L865 +R65 +R576 +R39 +L867 +R34 +L182 +R91 +L81 +L10 +L747 +L27 +L26 +L15 +R29 +R786 +R76 +L76 +L35 +R535 +R650 +L5 +L449 +L72 +R76 +R73 +L36 +R933 +L84 +R872 +L1 +L28 +R754 +R311 +L40 +R49 +L949 +L95 +R41 +R54 +R28 +R18 +L908 +L57 +L35 +R941 +L41 +R10 +R8 +L218 +R61 +L76 +R33 +R918 +R57 +L593 +L7 +L55 +R21 +R41 +R28 +L69 +R95 +R146 +L41 +L39 +L20 +L62 +R134 +L33 +R61 +L68 +L63 +L318 +R83 +L894 +L40 +R65 +R35 +L895 +L46 +L40 +L28 +L91 +R99 +R911 +L910 +L525 +L32 +R23 +L39 +L49 +L48 +L86 +L68 +L38 +R89 +L94 +R53 +L86 +L7 +L93 +L53 +R45 +L92 +L95 +L36 +R855 +R231 +R84 +L95 +L14 +R992 +L12 +L96 +L79 +R251 +R469 +R43 +R43 +L519 +L22 +R173 +R715 +L55 +L425 +L8 +R95 +R10 +L5 +R23 +R99 +L22 +R546 +R470 +R84 +L23 +R23 +L90 +L3 +R198 +R95 +R48 +R32 +L80 +L88 +L12 +L87 +R37 +R50 +R29 +L289 +R803 +L50 +R958 +L51 +R931 +L65 +R89 +R45 +R29 +R17 +L46 +R27 +R84 +R96 +R93 +R20 +L13 +L70 +L37 +R62 +L62 +L65 +R8 +R5 +R792 +R218 +R1 +R41 +L48 +L37 +L96 +L19 +R92 +R83 +R25 +R57 +L66 +L1 +R67 +R31 +R12 +R26 +R25 +R10 +R19 +L80 +L67 +R143 +R31 +L35 +L672 +R29 +L53 +L85 +L61 +R51 +L53 +R72 +L21 +R21 +L5 +R443 +R97 +R89 +L35 +L89 +L57 +L43 +L80 +L83 +L99 +L38 +L34 +L66 +L61 +R31 +R530 +R92 +L11 +R19 +R94 +L94 +R807 +R93 +L29 +L71 +R27 +R26 +L68 +R378 +R12 +L224 +L974 +R23 +L855 +L59 +R42 +L28 +R7 +R35 +L42 +R47 +R52 +R1 +R58 +L62 +L96 +L90 +R90 +L41 +L59 +R80 +R66 +R62 +R82 +L90 +R63 +R37 +R73 +L373 +R34 +R66 +R644 +R72 +R84 +R503 +L13 +L90 +R78 +L517 +L61 +L35 +R35 +L72 +R258 +L83 +L45 +L8 +R395 +R65 +R37 +L47 +L202 +R2 +L84 +R86 +R98 +R51 +L451 +R69 +L796 +R27 +L60 +L106 +L36 +L42 +L25 +R69 +L10 +L885 +R398 +L8 +L95 +R80 +R36 +L33 +R879 +L62 +R94 +L94 +L15 +R26 +L87 +L24 +L6 +L36 +L858 +L25 +R25 +L74 +R37 +L1 +L11 +R388 +L88 +R68 +R64 +R17 +L42 +L90 +L682 +R25 +R89 +R96 +L30 +L83 +R17 +L2 +L3 +R40 +R65 +L91 +R44 +L53 +L20 +R20 +R46 +R510 +R69 +R75 +L4 +R4 +L5 +L87 +R892 +R76 +R36 +L12 +L93 +L18 +L77 +L12 +R96 +L611 +L74 +R89 +R41 +R81 +L22 +L26 +L74 +R28 +L459 +R31 +R85 +L97 +R24 +R49 +L24 +L80 +R74 +R69 +L82 +R282 +R10 +R3 +R87 +L21 +R43 +R378 +L455 +R55 +R52 +R48 +R26 +R50 +L67 +R91 +R729 +L49 +R20 +L93 +R78 +R71 +R88 +R56 +R38 +R43 +L81 +L176 +R576 +R885 +R59 +L13 +R2 +L33 +R13 +R87 +R17 +L417 +L90 +R745 +R50 +L8 +R32 +L4 +L67 +L70 +R28 +L214 +L2 +L40 +L97 +R37 +R65 +L346 +L48 +R29 +R3 +L3 +L87 +L29 +R35 +R63 +R79 +R39 +L76 +R49 +R78 +R75 +R41 +R157 +R18 +L42 +R47 +R74 +L21 +L177 +R68 +R37 +L96 +R788 +L16 +L4 +R61 +L714 +L947 +L90 +L84 +R74 +L9 +R9 +L26 +L74 +R14 +L14 +R21 +R737 +L58 +R12 +L829 +R40 +L23 +R14 +L49 +R779 +L8 +L85 +R49 +L61 +L39 +L80 +R74 +L94 +R26 +R40 +L75 +R9 +L78 +L91 +R69 +L65 +R970 +L41 +L64 +L10 +R71 +R508 +R60 +L829 +L22 +L478 +R34 +R904 +L19 +R58 +R96 +R527 +L12 +R12 +R86 +R465 +L74 +R460 +L99 +R62 +R205 +R26 +L31 +R401 +R53 +L54 +R29 +L29 +L19 +R97 +L78 +R7 +L7 +R144 +R56 +L484 +R35 +L11 +L65 +L775 +L882 +L18 +R19 +L825 +L59 +L990 +R63 +L8 +R30 +R70 +R17 +L24 +R91 +R11 +R205 +R21 +L21 +R45 +L45 +L7 +R807 +L813 +R13 +L87 +L313 +R64 +L564 +R20 +L20 +R65 +L20 +R99 +R98 +R58 +L722 +L78 +R89 +R311 +R75 +R77 +L852 +R26 +L826 +L95 +L305 +R57 +R10 +L58 +R37 +L54 +R8 +L10 +L590 +R171 +L203 +L16 +L38 +R86 +L902 +L65 +R47 +R4 +L396 +L12 +R524 +L910 +R993 +R35 +R72 +L90 +R30 +R867 +R42 +R485 +R24 +R50 +R90 +R96 +L66 +R52 +L70 +L129 +L871 +R46 +L40 +R988 +R96 +L618 +R43 +L15 +R15 +R46 +L69 +L68 +L324 +L5 +L598 +R21 +L21 +R59 +R44 +L98 +L2 +L86 +L14 +L42 +L4 +L5 +L49 +L98 +R97 +L99 +L90 +R90 +L32 +R322 +L90 +L60 +R432 +L65 +R43 +R57 +R77 +R31 +L19 +R67 +R41 +L4 +L75 +L25 +R30 +R977 +L7 +R3 +L3 +R20 +R13 +R67 +L26 +R23 +L97 +R87 +L87 +R99 +L99 +R66 +L93 +L73 +R43 +R658 +L173 +R12 +L49 +L891 +R5 +R59 +L64 +L34 +R54 +L20 +R9 +L9 +R5 +L5 +L54 +R30 +L97 +R69 +R52 +R52 +R48 +L16 +L61 +L23 +L23 +L56 +L89 +L95 +L16 +L97 +R60 +R79 +R68 +L67 +R695 +R41 +L881 +L350 +L50 +R81 +R65 +R35 +L42 +L82 +R24 +L34 +L2 +L64 +L34 +R34 +R36 +R81 +L17 +R453 +L39 +R29 +R63 +R15 +L21 +L85 +R54 +L8 +R24 +R15 +R870 +R30 +R197 +L97 +L732 +L68 +L793 +R63 +R30 +L604 +L23 +R15 +R939 +L82 +L645 +R81 +L746 +L50 +L822 +R49 +L781 +L59 +L966 +L61 +L79 +R35 +L21 +L90 +L26 +R26 +L90 +L3 +L90 +L98 +L56 +L55 +R2 +R55 +L55 +R72 +L42 +L38 +L92 +R604 +R96 +L87 +L13 +R759 +R859 +L54 +L10 +R51 +R20 +L25 +L35 +L38 +R36 +L963 +L11 +R56 +R92 +R18 +L155 +R271 +L74 +L33 +L16 +L48 +R20 +R12 +L92 +R42 +R73 +L34 +L83 +L14 +R83 +R84 +L546 +L998 +L858 +L89 +R34 +L12 +R19 +L41 +L23 +R74 +L31 +L20 +R28 +L31 +R3 +R80 +R487 +L67 +R348 +L805 +L439 +L23 +L81 +L24 +L42 +L834 +L68 +L2 +L32 +L98 +R880 +L80 +L95 +L605 +L44 +R860 +L31 +R85 +R30 +L39 +R11 +L472 +L88 +L57 +L57 +R180 +R222 +R14 +L44 +L17 +L53 +R21 +R61 +L76 +L32 +L60 +R86 +L53 +L85 +L1 +L69 +R15 +R22 +L7 +L958 +R36 +R99 +L99 +L7 +L993 +R43 +R57 +L95 +R58 +L63 +L55 +R55 +L14 +L9 +L86 +R23 +L314 +L14 +L31 +L55 +L80 +R8 +R372 +L77 +L23 +R73 +R27 +L920 +L93 +R58 +R74 +L64 +R85 +L22 +R69 +R52 +R61 +R74 +L681 +L497 +R33 +L29 +R28 +R72 +L15 +R15 +L67 +L23 +R69 +R41 +L27 +R7 +L85 +R60 +L37 +R762 +R67 +L91 +L784 +R8 +L519 +R88 +L491 +L78 +L73 +R73 +L58 +R58 +R27 +R34 +L57 +R96 +L46 +L54 +L37 +L12 +R549 +R54 +L47 +R93 +L36 +L64 +L54 +R54 +R15 +L37 +R22 +R19 +L712 +R93 +L91 +R56 +R67 +L32 +L92 +L108 +R11 +L691 +R643 +R96 +L96 +L63 +L63 +L62 +R25 +L46 +R546 +L95 +R944 +L611 +R436 +R48 +L22 +L4 +R90 +L86 +L314 +R81 +R33 +L99 +R99 +L565 +R87 +L33 +L89 +R3 +L3 +L909 +R56 +R19 +R62 +R48 +R4 +L62 +R369 +L298 +L89 +L593 +L69 +L339 +L67 +R89 +R72 +R7 +R93 +L99 +L894 +R47 +R53 +L380 +L25 +R5 +L67 +L33 +L64 +L27 +R86 +R96 +L30 +R907 +L11 +R65 +R78 +R55 +R73 +L926 +L23 +L87 +R8 +L51 +L49 +L71 +L66 +R37 +R24 +R330 +R46 +R456 +R9 +L65 +R41 +L42 +L793 +R48 +R646 +R21 +L148 +R27 +L95 +R53 +L977 +R750 +L31 +R2 +L85 +L17 +L61 +R61 +L41 +R56 +R11 +L88 +L62 +R72 +L14 +L78 +L584 +L81 +R9 +L27 +L45 +R97 +R75 +L45 +L55 +R793 +R7 +R1 +L23 +L545 +R67 +L403 +R20 +R870 +R438 +L25 +R6 +L51 +R58 +R87 +L16 +R72 +L56 +L26 +L26 +R852 +R74 +L74 +R55 +L87 +R32 +L16 +L62 +R78 +L45 +L651 +R24 +L82 +L46 +R61 +L6 +R45 +L24 +R61 +L66 +R829 +R33 +R67 +L99 +L316 +R67 +R63 +R876 +L91 +R97 +L97 +L49 +L51 +L99 +R999 +L43 +R40 +L45 +L52 +L584 +L16 +R92 +R7 +R267 +L20 +L46 +R55 +R17 +R7 +L5 +R26 +R18 +L42 +L76 +L315 +L289 +L73 +R44 +R35 +R152 +L27 +R73 +L528 +L6 +R568 +R44 +L216 +R13 +L42 +R67 +R68 +L268 +L41 +R36 +R55 +L56 +R6 +L870 +L90 +R14 +R91 +L45 +L21 +R54 +L25 +L54 +L54 +L60 +L799 +L35 +L59 +R85 +L14 +L28 +L99 +R9 +L33 +L22 +R98 +R84 +R57 +R16 +R2 +R77 +R57 +L67 +R31 +L83 +L13 +R503 +L94 +R87 +L678 +L10 +L49 +L163 +L22 +L78 +R2 +L30 +L53 +L289 +R70 +R9 +R55 +L86 +L10 +L68 +L60 +L81 +L8 +R24 +R30 +R15 +R92 +R4 +L26 +L11 +L83 +R82 +L225 +R47 +L377 +R67 +R10 +L75 +L325 +L59 +R61 +L52 +L901 +L34 +R29 +L424 +R401 +R526 +R94 +L41 +R10 +L610 +L373 +R92 +L68 +R85 +R130 +L466 +L68 +L32 +L88 +L8 +L91 +L497 +R84 +L28 +R25 +L24 +L73 +L1 +L906 +L102 +R9 +L78 +R46 +L786 +R44 +R80 +R77 +R88 +R29 +L5 +R87 +R10 +L65 +R93 +L79 +R959 +L11 +L33 +R44 +R228 +R87 +L47 +R156 +L19 +R22 +L27 +L89 +L89 +L20 +L99 +R97 +R393 +R7 +L24 +R76 +R57 +R738 +L47 +L42 +L48 +R90 +L54 +R94 +L23 +L351 +R50 +R47 +R65 +L59 +R731 +L28 +L34 +L38 +L65 +L81 +L54 +L39 +L66 +L15 +R46 +R59 +L17 +R11 +R99 +L63 +L99 +L16 +R623 +L23 +L99 +R27 +L28 +L91 +L87 +L22 +L99 +R43 +R56 +R3 +R566 +R431 +L86 +R628 +R59 +L31 +R30 +L40 +R68 +L66 +L62 +R48 +R52 +R14 +L92 +L49 +R27 +L96 +R45 +R5 +L62 +R8 +L38 +R338 +R32 +L87 +R55 +R48 +R62 +L43 +L51 +R84 +L74 +R47 +L6 +L867 +R48 +L48 +R67 +L67 +L753 +L93 +L28 +L19 +R40 +L147 +R31 +R534 +R90 +R970 +L68 +R143 +L44 +L687 +R4 +R127 +R734 +R660 +L94 +L39 +L61 +L57 +R23 +R79 +R28 +L973 +R7 +R93 +R58 +L69 +L70 +L15 +L69 +L47 +L88 +L97 +L77 +R30 +R44 +R41 +L18 +R77 +R56 +R163 +R81 +R94 +L510 +R574 +R42 +L49 +L29 +L519 +R86 +L489 +L27 +R86 +R441 +R593 +L93 +R70 +L811 +L73 +R512 +R99 +L97 +L81 +L19 +L462 +R284 +L22 +R88 +R12 +L163 +R4 +L41 +L966 +R9 +L43 +R99 +L18 +L33 +R52 +L85 +R28 +R44 +L644 +L945 +R2 +R8 +R24 +L32 +L87 +R166 +R29 +R239 +R747 +L94 +L12 +R91 +R47 +L34 +R49 +L59 +R18 +L78 +R78 +R7 +L7 +L44 +L67 +L84 +R8 +L331 +L22 +R76 +R17 +L90 +R14 +L577 +L23 +R113 +R916 +R92 +R30 +R38 +R68 +R66 +L41 +R41 +L91 +L57 +L56 +R42 +L338 +R16 +R84 +R4 +L26 +L6 +R28 +R2 +L2 +L28 +R20 +R8 +R87 +L66 +R25 +R54 +L51 +R32 +L81 +L43 +R43 +L17 +L83 +R78 +L401 +L77 +R68 +L22 +R56 +R58 +R35 +L25 +R30 +L82 +L80 +R62 +R411 +R89 +L58 +L79 +R9 +R57 +R43 +L72 +L66 +L34 +R65 +L65 +L9 +L258 +R435 +R88 +R44 +R50 +L34 +L813 +L603 +R68 +L43 +R16 +L69 +R96 +R32 +R6 +L6 +R5 +L5 +R57 +L81 +L376 +L98 +L18 +R398 +L82 +R7 +R93 +L762 +R199 +L32 +L155 +L73 +R23 +R76 +R765 +R55 +L96 +R34 +L33 +L29 +L37 +L735 +R21 +R32 +R15 +R46 +R40 +L5 +L253 +R24 +L14 +L6 +R455 +L55 +R741 +R18 +R441 +L60 +R60 +R24 +L386 +R91 +R71 +R85 +R90 +R53 +R72 +R76 +L76 +R89 +R11 +R83 +R941 +L24 +L795 +R95 +R896 +R542 +R462 +L28 +R54 +L733 +R7 +L20 +R20 +L49 +R92 +L45 +R94 +R80 +L26 +L46 +L47 +L338 +R34 +R51 +R37 +R20 +L803 +L57 +L70 +R12 +L71 +R45 +R67 +L48 +L61 +L71 +R727 +L65 +L90 +L272 +L27 +R27 +L864 +L579 +L462 +R36 +R1 +L82 +R73 +L31 +L871 +L2 +L19 +R7 +R68 +L75 +R50 +L69 +L38 +R57 +L80 +R499 +R10 +R54 +R109 +R78 +L19 +R58 +R79 +R805 +R57 +R75 +R42 +R63 +L17 +L44 +R85 +R893 +L37 +R90 +L7 +R807 +L59 +L941 +R642 +R85 +L95 +L92 +L943 +R71 +R792 +L60 +R36 +R64 +L606 +L7 +R6 +R64 +L21 +R96 +L432 +L89 +R89 +L57 +L20 +L23 +L67 +R58 +L2 +R96 +L85 +L61 +L26 +L69 +L91 +L89 +R376 +R89 +R51 +L437 +R99 +L5 +R63 +L63 +L72 +R65 +R583 +R5 +L56 +R64 +R57 +L83 +L97 +R97 +R35 +R752 +L487 +L685 +R90 +L80 +R23 +R2 +L84 +L66 +R24 +R87 +R6 +L17 +R71 +L71 +R645 +L395 +R50 +L30 +R17 +L78 +L58 +L74 +R34 +L410 +L8 +L14 +R88 +R966 +L37 +R4 +R682 +L82 +L52 +L81 +R86 +L53 +R99 +R301 +R786 +R18 +R315 +L17 +L942 +R40 +L87 +L89 +R7 +R91 +R6 +L58 +R730 +R515 +L15 +L60 +L67 +R61 +L73 +R750 +L440 +L56 +R785 +L48 +L52 +L8 +R25 +L6 +R89 +L91 +R85 +R96 +L56 +R866 +R77 +L77 +L34 +L67 +L548 +L51 +L24 +L12 +R39 +R97 +R4 +R96 +L2 +R470 +R704 +R28 +R12 +R25 +L985 +L52 +L29 +R24 +R834 +R64 +R15 +R77 +L41 +L879 +R835 +L6 +R12 +R994 +L92 +L94 +R30 +L21 +L230 +R56 +R688 +R81 +L51 +R11 +R35 +L113 +L992 +L54 +L54 +R94 +R9 +R73 +R124 +R14 +R232 +L46 +R86 +R14 +R61 +L61 +R47 +R56 +L3 +L93 +R49 +L56 +R72 +L25 +L47 +R66 +R50 +L31 +L18 +L667 +R557 +R143 +L51 +L275 +L7 +R18 +R84 +L969 +L941 +L715 +R76 +R80 +L602 +R27 +R41 +L272 +R120 +L14 +L12 +L56 +L628 +R96 +R85 +L37 +R58 +L6 +R173 +L73 +R48 +R52 +R77 +R80 +R214 +R829 +L205 +R26 +L21 +L59 +R59 +L69 +R53 +L65 +R99 +R80 +R2 +R78 +R283 +R36 +L51 +R554 +L71 +R18 +R53 +L608 +L78 +L176 +L38 +R34 +R543 +R80 +L347 +R121 +L31 +L4 +L996 +L56 +L44 +R372 +L837 +L35 +L583 +R65 +R18 +R78 +R22 +R35 +L55 +R20 +L57 +L943 +L20 +R90 +L16 +L748 +L62 +R56 +R61 +R47 +R62 +L70 +R7 +R93 +L168 +L36 +L52 +L457 +R13 +R38 +L438 +R1 +L1 +R28 +R573 +L91 +L15 +R7 +R83 +L990 +L95 +R75 +L318 +L57 +R77 +R59 +L84 +R44 +L73 +R17 +R27 +L67 +L75 +R12 +L79 +L5 +R47 +L23 +R248 +L11 +L69 +R55 +R19 +L19 +L73 +L60 +R23 +L90 +L234 +L171 +L795 +L40 +L984 +R124 +R671 +L7 +L35 +R75 +R39 +L43 +R44 +R17 +L752 +R288 +L94 +R458 +R39 +L68 +L32 +L7 +L19 +R26 +R55 +R93 +R52 +L45 +R45 +L3 +L72 +L25 +R42 +L42 +R65 +R35 +L80 +L20 +R83 +L83 +R99 +L99 +L41 +R41 +R12 +R84 +R4 +L29 +L96 +L75 +L59 +L20 +R54 +R78 +R99 +L436 +L79 +L26 +L311 +L14 +R514 +R533 +R567 +R34 +R227 +R44 +L5 +R53 +R80 +R73 +R94 +L50 +R52 +R41 +R57 +L16 +R42 +L31 +L95 +R97 +L97 +L36 +L77 +R13 +L92 +R61 +L34 +L35 +L41 +L18 +L41 +R12 +L70 +R58 +L18 +L34 +L83 +R235 +R28 +L598 +L49 +R19 +R19 +R35 +L758 +R4 +R77 +R64 +L76 +L94 +L1 +L70 +L32 +R518 +R691 +R52 +R302 +R38 +R656 +R75 +L54 +R76 +L22 +R16 +R384 +R9 +R66 +R41 +R65 +L981 +L39 +L271 +L47 +R4 +R928 +R1 +L61 +R85 +R45 +R1 +R94 +R24 +L11 +R47 +L645 +R45 +R85 +L85 +L18 +R15 +R3 +L6 +R56 +R31 +R19 +L82 +L18 +L28 +R28 +R932 +L81 +R49 +L9 +R58 +R598 +R53 +R5 +L5 +R79 +L247 +L32 +R48 +R43 +L393 +L98 +L19 +L81 +R36 +R981 +L23 +L687 +R5 +R462 +R634 +R58 +R14 +R20 +R629 +L71 +L683 +R5 +L58 +R899 +R936 +R590 +R53 +L494 +L6 +L67 +R54 +R55 +L35 +L33 +L2 +L72 +L25 +L45 +R70 +R73 +L53 +R91 +L97 +R47 +R25 +R14 +L81 +L38 +L67 +R45 +L59 +R19 +R49 +L82 +R14 +L76 +L20 +R96 +R58 +R16 +R26 +R76 +R97 +L35 +L85 +R37 +L90 +L97 +R38 +L87 +R46 +R69 +R67 +L59 +L93 +R16 +R47 +R53 +R75 +R25 +R11 +L47 +L21 +R45 +L7 +R18 +L5 +L13 +R49 +R44 +R24 +L14 +L10 +L46 +R38 +R31 +L5 +R20 +R19 +L27 +L42 +L1 +R46 +R20 +L15 +R1 +R39 +R48 +L48 +L16 +L49 +R37 +L41 +L12 +R20 +L34 +L30 +L2 +L44 +R39 +R6 +L5 +L40 +L1 +R18 +R7 +R2 +R48 +R31 +R25 \ No newline at end of file diff --git a/lib/day1.ml b/lib/day1.ml new file mode 100644 index 0000000..84076c8 --- /dev/null +++ b/lib/day1.ml @@ -0,0 +1,86 @@ + +let input = Reuse.split_lines "inputs/day1.txt" + + +let convert (s : string): int = + let first_char = s.[0] in + let remainder = String.sub s 1 (String.length s - 1) in + let distance = int_of_string remainder in + match first_char with + | 'L' -> -distance + | 'R' -> distance + | _ -> raise (Invalid_argument "Invalid input") + + +let count_if_zero (counter: int) (position: int) = + if position == 0 then counter + 1 else counter + +let normalize_position (pos : int) (modulus : int) = + let result = pos mod modulus in + if result >= 0 then result else result + modulus + +let count_boundary_crossings (counter: int) (position: int) (movement: int) = + let full_rotations = abs movement / 100 in + let remaining_movement = movement mod 100 in + let new_position = position + remaining_movement in + let boundary_crossings = + if (new_position >= 100 && position < 100) || + (new_position <= 0 && position > 0) then 1 else 0 + in + counter + full_rotations + boundary_crossings + + + +let rec update (values: int list) (position: int) (counter: int) : int = + match values with + | [] -> counter + | x :: xs -> let new_position = normalize_position (position + x) 100 in + update xs new_position (count_if_zero counter new_position) + +let rec update_part2 (values: int list) (position: int) (counter: int) : int = + match values with + | [] -> counter + | x :: xs -> let new_position = normalize_position (position + x) 100 in + update_part2 xs new_position (count_boundary_crossings counter position x) + +let solve_part1 (lines: string list) : int = + update (List.map convert lines) 50 0 + +let solve_part2 (lines: string list) : int = + update_part2 (List.map convert lines) 50 0 + +let day1_part1 : int = + solve_part1 input + +let day1_part2 : int = + solve_part2 input + +module Tests = struct +let test_input = "L268 +L30 +R48 +L5 +R60 +L55 +L1 +L99 +R14 +L82" + +let test_lines = String.split_on_char '\n' test_input + +let run_tests () = + let part1_result = solve_part1 test_lines in + let part2_result = solve_part2 test_lines in + if part1_result <> 3 then + failwith ("Part 1 test failed: expected 3, got " ^ string_of_int part1_result); + + if part2_result <> 8 then + failwith ("Part 2 test failed: expected 8, got " ^ string_of_int part2_result); + + Printf.printf "All tests passed!\n" +end + +let () = Tests.run_tests() + + \ No newline at end of file diff --git a/lib/day1_improved.ml b/lib/day1_improved.ml new file mode 100644 index 0000000..345726d --- /dev/null +++ b/lib/day1_improved.ml @@ -0,0 +1,102 @@ +(* Improved version of day1.ml with better code quality *) + +let input = Reuse.split_lines "inputs/day1.txt" + +(* Improved: Better function name and documentation *) +let parse_direction (s : string) : int = + if String.length s = 0 then + invalid_arg "Empty direction string" + else + let direction = s.[0] in + let distance_str = String.sub s 1 (String.length s - 1) in + let distance = int_of_string distance_str in + match direction with + | 'L' -> -distance (* Negative for left turns *) + | 'R' -> distance (* Positive for right turns *) + | _ -> invalid_arg ("Invalid direction: " ^ String.make 1 direction) + +(* Improved: More descriptive function name *) +let count_if_at_origin (counter : int) (position : int) : int = + if position = 0 then counter + 1 else counter + +(* Improved: Better function name and clearer logic *) +let normalize_position (position : int) (modulus : int) : int = + let result = position mod modulus in + if result >= 0 then result else result + modulus + +(* Improved: More descriptive function name and clearer logic *) +let count_boundary_crossings (counter : int) (old_position : int) (movement : int) : int = + Printf.printf "Position %i, movement %i, current counter %i\n" old_position movement counter; + + (* Count full rotations (every 100 units) *) + let full_rotations = abs movement / 100 in + let remaining_movement = movement mod 100 in + let new_position = old_position + remaining_movement in + + (* Count boundary crossings *) + let boundary_crossings = + if (new_position >= 100 && old_position < 100) || + (new_position <= 0 && old_position > 0) then 1 else 0 + in + + counter + full_rotations + boundary_crossings + +(* Improved: More descriptive function names *) +let rec solve_with_origin_counting (movements : int list) (position : int) (counter : int) : int = + match movements with + | [] -> counter + | movement :: remaining -> + let new_position = normalize_position (position + movement) 100 in + solve_with_origin_counting remaining new_position (count_if_at_origin counter new_position) + +let rec solve_with_boundary_counting (movements : int list) (position : int) (counter : int) : int = + match movements with + | [] -> counter + | movement :: remaining -> + let new_position = normalize_position (position + movement) 100 in + let new_counter = count_boundary_crossings counter position movement in + solve_with_boundary_counting remaining new_position new_counter + +(* Improved: Clear, descriptive function names *) +let solve_part1 (lines : string list) : int = + let movements = List.map parse_direction lines in + solve_with_origin_counting movements 50 0 + +let solve_part2 (lines : string list) : int = + let movements = List.map parse_direction lines in + solve_with_boundary_counting movements 50 0 + +(* Main solutions *) +let day1_part1 : int = solve_part1 input +let day1_part2 : int = solve_part2 input + +(* Improved: Better test organization *) +module Tests = struct + let test_input = "L268 +L30 +R48 +L5 +R60 +L55 +L1 +L99 +R14 +L82" + + let test_lines = String.split_on_char '\n' test_input + + let run_tests () = + let part1_result = solve_part1 test_lines in + let part2_result = solve_part2 test_lines in + + if part1_result <> 3 then + failwith ("Part 1 test failed: expected 3, got " ^ string_of_int part1_result); + + if part2_result <> 8 then + failwith ("Part 2 test failed: expected 8, got " ^ string_of_int part2_result); + + Printf.printf "All tests passed!\n" +end + +(* Run tests *) +let () = Tests.run_tests () diff --git a/lib/dune b/lib/dune new file mode 100644 index 0000000..25f0e57 --- /dev/null +++ b/lib/dune @@ -0,0 +1,4 @@ +(library + (name aoc25) + (inline_tests) + (preprocess (pps ppx_inline_test))) \ No newline at end of file diff --git a/lib/reuse.ml b/lib/reuse.ml new file mode 100644 index 0000000..a40e226 --- /dev/null +++ b/lib/reuse.ml @@ -0,0 +1,9 @@ +let read filename = + let ic = open_in filename in + let length = in_channel_length ic in + let content = really_input_string ic length in + close_in ic; + content + +let split_lines filename = + String.split_on_char '\n' (read filename) \ No newline at end of file