From 32e35cd824c5d7a7f410eee2b5fb37bfcf0622db Mon Sep 17 00:00:00 2001 From: April Eaton Date: Mon, 1 Dec 2025 23:47:25 +0100 Subject: [PATCH] Day 1 Part 1 --- day_1/gleam.toml | 1 + day_1/input.txt | 4145 +++++++++++++++++++++++++++++++++++ day_1/manifest.toml | 3 + day_1/prompt.md | 64 + day_1/src/day_1.gleam | 75 +- day_1/src/good_test.txt | 2 + day_1/test/day_1_test.gleam | 175 +- day_1/test/good_file.txt | 2 + day_1/test/parse_rotats.txt | 10 + 9 files changed, 4471 insertions(+), 6 deletions(-) create mode 100644 day_1/input.txt create mode 100644 day_1/prompt.md create mode 100644 day_1/src/good_test.txt create mode 100644 day_1/test/good_file.txt create mode 100644 day_1/test/parse_rotats.txt diff --git a/day_1/gleam.toml b/day_1/gleam.toml index 8299130..8d69d2a 100644 --- a/day_1/gleam.toml +++ b/day_1/gleam.toml @@ -14,6 +14,7 @@ version = "1.0.0" [dependencies] gleam_stdlib = ">= 0.44.0 and < 2.0.0" +simplifile = ">= 2.3.1 and < 3.0.0" [dev-dependencies] gleeunit = ">= 1.0.0 and < 2.0.0" diff --git a/day_1/input.txt b/day_1/input.txt new file mode 100644 index 0000000..aaa4d2a --- /dev/null +++ b/day_1/input.txt @@ -0,0 +1,4145 @@ +R3 +R10 +L11 +R9 +L6 +L3 +R41 +L13 +L46 +R23 +R36 +R10 +L26 +L12 +R15 +R49 +R46 +L42 +L35 +R29 +L31 +L35 +L47 +L28 +R22 +L12 +L33 +L12 +R8 +L39 +R2 +R29 +R41 +R33 +R45 +L30 +R46 +R43 +R38 +L15 +L38 +L31 +L45 +R50 +R39 +R32 +L32 +R8 +R40 +L75 +R55 +L83 +L72 +L68 +R47 +L58 +L21 +L17 +R26 +R34 +L66 +R48 +L85 +R69 +R27 +R75 +L11 +R62 +L62 +R5 +L6 +L95 +L4 +R42 +R48 +R24 +R55 +L7 +L51 +L53 +L94 +R36 +R88 +L89 +L99 +R20 +R84 +L63 +R59 +L36 +R80 +L25 +L52 +L67 +L91 +R91 +L22 +R98 +L96 +R7 +L69 +R50 +R32 +R28 +R372 +L16 +R16 +R892 +L777 +R22 +L47 +L87 +R679 +R32 +L73 +L41 +L557 +R57 +L362 +L49 +R55 +R16 +L860 +L45 +R1 +R72 +R72 +R52 +R34 +L35 +L86 +R75 +R96 +L4 +R968 +L466 +R66 +R863 +L218 +L45 +R90 +L80 +R70 +L280 +R64 +R79 +L43 +R64 +L806 +L6 +L94 +L58 +R19 +R81 +L19 +L771 +R17 +L584 +R76 +L69 +L39 +L132 +L56 +L45 +R22 +R74 +L74 +L6 +L94 +L163 +L63 +R26 +L91 +R91 +L25 +L97 +L16 +L74 +L88 +L27 +R74 +R5 +L35 +R54 +L15 +R75 +R669 +R64 +L65 +R721 +L19 +R499 +R756 +L81 +R55 +L4 +L986 +R60 +L6 +R9 +L85 +R19 +L37 +L65 +R41 +R824 +L444 +L80 +L95 +L81 +L88 +R63 +R79 +L66 +R12 +R55 +R567 +R45 +R75 +R52 +L714 +L13 +L63 +L4 +L24 +L25 +L77 +R126 +L620 +R97 +R23 +R80 +R89 +R31 +R71 +L771 +R35 +L34 +R57 +L58 +L52 +L30 +L518 +R65 +R835 +R69 +L92 +R23 +L381 +R481 +R49 +L3 +R254 +R905 +L54 +L98 +L6 +L37 +R391 +R97 +L38 +R486 +L41 +R934 +R61 +R75 +R25 +L20 +R320 +L20 +R22 +L302 +L83 +L430 +R42 +R913 +L42 +R30 +R875 +L5 +R916 +R84 +L422 +R14 +L92 +R697 +R265 +L62 +R17 +R26 +R49 +L92 +L45 +R45 +L62 +R62 +R683 +R48 +R69 +L60 +L216 +R76 +R89 +R11 +L279 +L621 +R27 +R456 +R17 +R45 +L12 +L74 +L59 +L8 +R924 +R303 +L89 +R297 +L27 +R20 +R28 +R552 +R402 +L63 +L88 +L51 +R29 +L36 +L764 +R392 +L165 +L16 +R74 +R86 +R55 +R98 +L53 +R523 +L23 +L592 +L41 +R33 +R11 +R41 +L52 +R56 +R21 +L45 +R57 +R253 +L38 +L68 +R64 +R80 +L23 +L57 +L357 +L43 +L968 +L32 +L909 +R49 +R744 +R17 +L38 +L433 +R95 +L40 +R274 +R412 +L11 +L6 +R18 +R28 +L132 +L37 +R969 +R531 +R68 +R1 +L77 +R55 +R90 +R52 +R68 +L26 +L833 +L78 +R4 +R45 +L77 +R77 +L617 +R726 +L9 +L43 +L19 +L26 +R815 +R73 +L58 +R58 +L34 +R34 +R728 +R654 +L50 +R68 +L47 +R47 +R90 +R95 +L85 +L87 +L34 +L25 +R46 +R48 +L26 +L66 +R19 +L50 +L77 +L5 +R62 +L205 +R93 +L93 +R45 +L45 +R473 +R27 +R30 +R86 +R84 +R979 +R21 +L60 +L40 +R86 +L382 +R67 +L78 +L93 +L722 +R22 +L90 +R21 +L31 +R10 +L6 +L29 +L61 +L31 +L58 +R71 +L13 +R580 +R662 +L974 +R46 +L97 +L25 +R25 +R92 +L92 +R4 +L62 +L42 +R44 +R59 +R260 +R66 +L686 +R189 +R68 +R54 +L54 +R564 +L1 +L263 +L54 +L46 +L48 +L7 +L391 +L23 +L15 +L97 +R63 +R318 +R74 +L71 +R59 +L62 +R316 +L6 +L10 +L86 +L30 +L84 +R92 +R30 +R72 +R6 +L28 +L55 +L17 +L221 +L44 +R37 +L12 +R81 +R772 +R87 +L17 +L40 +R923 +R123 +L89 +L667 +L48 +L43 +L742 +R22 +R728 +L61 +R601 +L87 +R67 +L5 +L568 +L97 +R4 +R29 +L88 +L7 +L38 +R531 +L31 +L167 +R967 +R18 +R482 +L68 +R75 +R96 +L3 +L43 +L758 +L894 +L5 +L788 +R88 +L608 +R682 +L45 +L91 +L14 +L24 +R83 +L10 +L73 +R25 +R75 +R62 +L62 +R19 +L19 +L81 +L33 +L86 +R41 +L14 +R95 +L830 +L599 +L64 +L35 +R6 +L36 +L329 +R165 +R48 +L48 +R70 +L70 +L15 +R6 +L894 +L75 +R89 +R86 +L97 +R37 +R55 +R8 +L25 +R325 +R74 +L25 +L67 +R18 +R1 +R40 +L441 +L97 +R81 +R62 +L64 +L96 +L59 +R50 +R23 +R96 +R2 +L75 +R9 +R68 +R69 +L39 +L61 +R459 +L28 +L316 +L84 +L92 +L8 +R20 +R80 +L61 +R61 +R95 +R5 +R94 +R6 +R37 +L439 +L98 +L2 +R31 +R71 +L26 +L13 +L361 +R663 +L1 +R38 +L878 +L22 +L15 +L10 +L75 +L568 +L890 +R58 +L8 +R41 +L78 +L55 +L72 +L95 +R86 +R81 +R68 +L65 +R39 +R99 +L717 +R763 +L16 +R29 +L459 +L41 +R32 +R25 +L57 +R46 +L46 +L63 +L13 +R51 +R329 +L78 +L69 +R64 +R58 +L49 +L2 +R72 +R7 +R38 +L189 +L19 +R64 +L1 +R10 +R52 +R38 +L12 +L899 +L74 +R85 +R348 +R652 +L53 +R36 +R17 +L15 +R3 +L126 +L26 +L563 +L96 +R123 +L88 +L90 +L12 +L10 +L398 +R3 +L5 +R98 +R602 +R41 +R59 +L67 +R790 +R62 +L769 +R2 +R882 +R31 +L28 +R52 +L18 +R63 +L76 +R46 +R47 +L22 +R43 +L39 +L61 +R177 +L13 +R98 +R11 +R87 +R97 +L17 +L58 +L35 +R15 +R10 +L10 +L66 +L5 +R44 +R27 +R25 +R86 +L128 +R17 +L29 +L77 +L94 +R6 +L72 +R66 +L65 +R465 +L18 +R42 +R76 +R98 +R2 +L402 +L49 +L877 +L82 +R10 +L73 +R79 +R30 +R964 +L24 +R97 +L73 +L45 +L55 +R86 +R517 +L148 +R85 +L24 +R5 +R79 +L225 +L75 +R61 +R78 +L739 +R783 +R417 +R66 +R764 +R961 +R9 +L74 +R74 +L41 +R11 +L99 +L371 +R60 +L43 +L88 +R71 +L83 +R55 +L82 +R19 +L897 +L65 +L3 +R56 +R24 +L24 +R93 +R55 +R12 +L160 +L19 +L62 +L55 +R128 +R8 +L29 +R29 +R251 +L6 +R55 +R91 +R14 +R24 +L8 +R98 +R81 +L8 +R91 +R32 +R85 +R98 +L998 +R60 +L44 +L34 +L52 +L30 +L84 +L31 +L88 +L54 +L51 +R38 +R70 +L63 +L55 +R970 +R97 +L49 +L12 +L81 +L51 +L56 +L39 +R52 +L79 +R666 +L24 +L52 +R16 +R660 +L80 +R80 +R17 +R83 +L76 +L24 +L56 +R882 +R74 +R9 +L9 +R424 +L24 +L46 +R46 +L44 +R67 +L23 +L72 +R64 +R54 +L66 +R84 +L56 +R771 +R834 +L23 +L14 +R24 +L2 +L68 +L49 +R5 +R15 +R99 +R52 +R63 +L15 +L543 +R43 +L82 +R36 +L73 +L37 +R11 +L55 +R79 +R21 +R492 +L76 +R58 +R92 +L419 +R74 +L38 +L65 +L18 +L87 +R55 +L35 +R3 +R33 +L821 +L63 +R693 +R522 +R19 +R81 +L87 +L13 +L63 +R68 +R95 +L49 +L51 +R61 +L12 +R19 +L98 +R30 +L63 +R63 +R411 +R33 +L17 +L27 +R31 +R69 +L48 +L52 +L86 +L350 +R45 +R52 +L89 +L720 +R38 +R42 +L74 +L90 +L68 +R96 +R876 +R28 +R13 +L313 +R99 +L83 +R284 +R85 +L84 +R1 +L70 +R89 +L1 +R80 +R94 +R951 +R55 +L82 +L16 +R98 +L63 +L8 +R42 +L71 +L96 +R89 +L93 +L44 +R23 +L65 +L888 +R74 +R86 +L89 +L97 +R96 +L96 +R16 +R39 +R799 +R46 +R90 +R10 +L92 +R21 +L29 +L807 +R15 +R16 +R82 +R894 +L67 +L33 +R94 +R15 +L43 +R15 +R19 +L41 +R753 +R88 +R41 +R59 +L77 +R477 +R393 +R635 +L28 +L44 +R44 +R25 +R52 +L28 +L49 +L92 +L81 +R34 +R42 +R9 +R86 +R602 +L74 +L83 +L53 +R10 +R6 +R39 +R85 +R21 +R74 +L25 +L91 +L9 +R26 +L48 +L78 +L52 +R62 +L33 +R14 +R415 +R50 +R44 +R339 +R61 +R776 +L76 +L62 +L838 +R8 +L26 +L38 +L44 +R69 +R31 +L91 +R66 +L974 +R99 +L1 +R853 +L46 +R17 +L423 +L24 +L41 +L46 +L587 +L2 +L91 +L9 +L37 +R9 +L824 +R10 +R2 +L960 +L38 +R38 +L146 +L56 +R2 +L594 +R49 +L72 +R17 +L97 +R68 +R69 +R64 +L4 +L22 +L78 +R47 +L51 +L21 +L42 +R67 +R97 +R57 +R84 +R26 +R65 +L1 +L45 +R6 +L75 +L14 +L56 +L58 +R36 +R230 +R41 +L93 +L97 +R97 +R42 +L989 +R47 +L25 +L75 +R397 +R75 +L72 +L50 +R50 +L92 +R92 +R21 +R79 +L73 +L8 +R81 +R35 +L5 +L30 +R755 +L36 +R85 +L39 +L52 +R41 +R42 +L18 +R222 +R86 +L86 +L33 +R33 +R19 +L398 +R79 +L6 +R54 +L35 +R87 +L91 +L9 +L30 +R8 +R844 +R78 +L15 +L17 +L70 +L98 +L52 +L95 +L953 +L88 +L26 +R14 +R39 +R447 +L34 +R806 +L58 +R23 +R38 +L383 +R986 +L887 +R32 +R38 +R39 +R66 +R98 +R55 +L79 +L476 +L850 +R5 +L65 +R44 +R16 +R978 +R222 +L3 +L197 +L69 +R89 +R62 +R18 +R47 +R23 +R41 +L4 +L43 +L94 +L25 +L45 +L57 +L43 +L50 +R814 +L64 +R55 +L55 +L60 +L84 +R69 +R75 +L13 +R13 +L50 +L83 +L94 +R27 +R98 +L798 +L992 +L8 +R67 +R29 +R755 +L55 +R704 +R36 +R549 +R3 +R65 +R36 +R11 +R95 +R26 +R56 +R48 +L25 +L47 +L53 +L93 +L38 +L58 +L46 +L75 +L56 +L56 +L51 +L27 +L589 +R15 +R6 +R16 +L108 +R17 +L157 +R16 +R84 +R70 +L70 +R254 +R59 +L77 +L18 +R195 +L41 +R71 +R54 +R5 +L2 +R45 +L63 +R18 +R84 +R66 +L53 +R903 +R141 +R89 +R78 +L8 +L94 +L98 +R473 +L9 +R24 +R304 +L68 +L32 +L16 +R5 +R994 +R84 +R433 +L30 +L70 +R426 +R53 +L280 +R1 +R91 +L391 +R75 +L675 +R64 +L984 +R20 +L7 +L93 +L74 +R56 +R70 +R83 +R146 +R19 +L15 +R634 +R81 +L31 +R1 +R630 +R41 +R999 +R43 +L82 +L44 +R86 +L96 +R353 +R2 +L2 +R87 +R11 +R95 +R57 +R5 +L55 +R426 +L326 +R70 +R30 +R3 +R59 +L362 +R23 +L287 +L26 +L98 +R70 +R18 +R594 +R32 +L67 +R68 +L27 +L65 +L536 +L699 +R515 +L15 +L92 +R92 +L56 +R47 +R209 +R52 +L52 +R79 +R21 +R99 +L5 +R56 +R950 +L13 +R44 +L31 +L64 +L15 +L513 +R431 +R970 +L78 +L31 +R67 +R61 +L66 +L62 +L63 +L73 +R3 +R53 +L401 +R74 +R29 +L58 +R36 +L24 +R54 +R21 +L51 +L42 +L58 +R89 +R60 +L53 +L55 +L96 +R92 +L779 +L25 +L30 +L4 +L55 +R28 +R42 +L97 +L17 +L71 +L73 +R987 +R13 +R58 +L14 +R37 +R63 +L20 +R95 +R33 +R92 +L63 +L37 +R98 +L85 +R85 +L255 +L43 +L907 +L540 +L14 +R261 +L47 +R90 +L85 +L58 +R94 +L94 +R45 +L45 +R74 +R26 +L20 +L80 +L75 +L9 +R84 +L57 +R49 +L992 +L511 +R16 +R25 +L30 +L910 +R551 +R13 +R93 +L64 +L83 +L61 +L20 +R58 +L77 +L83 +L39 +L88 +L882 +L8 +L140 +L13 +R53 +R867 +L98 +L69 +R91 +R9 +R62 +L962 +R37 +L137 +L48 +L91 +L82 +L79 +R67 +L67 +L70 +L75 +R62 +L17 +L49 +R515 +R39 +R37 +R36 +L32 +R226 +R28 +R66 +R48 +R86 +R84 +L21 +R37 +R7 +R75 +R79 +R239 +L240 +R40 +L49 +R7 +R15 +R32 +L123 +R18 +R10 +L10 +L220 +R18 +L34 +L27 +L28 +L12 +R3 +L54 +L46 +L73 +L90 +R17 +L74 +R914 +R930 +L524 +L32 +R7 +L75 +L85 +L37 +L78 +R52 +L52 +R63 +L537 +L916 +R90 +R22 +R78 +R71 +R221 +L20 +L72 +L73 +L7 +R9 +L29 +R231 +R52 +L33 +R50 +L741 +R98 +L38 +L61 +R68 +R74 +L95 +R695 +R51 +R49 +L28 +L258 +R86 +R74 +L11 +L621 +R58 +R73 +L73 +L89 +L29 +R33 +L91 +R28 +R19 +R90 +L84 +L31 +L46 +L6 +R488 +R88 +R830 +L54 +R38 +R16 +L8 +L48 +L948 +R4 +R190 +R17 +R93 +L26 +L331 +L988 +L96 +R41 +R87 +L63 +R84 +L8 +L809 +R848 +L19 +R64 +L29 +L92 +L21 +R58 +L64 +R86 +R125 +R97 +R98 +R958 +R211 +R89 +L94 +R84 +R79 +R73 +R60 +L57 +L45 +R41 +L70 +L71 +L39 +L661 +L35 +R34 +L951 +L7 +R59 +R291 +R609 +R36 +L89 +L47 +R79 +R21 +R26 +R15 +L34 +R7 +R505 +R23 +L42 +R156 +L905 +L51 +R95 +R764 +L47 +R75 +R96 +R801 +R18 +L97 +L505 +L33 +R32 +R501 +R82 +R18 +L77 +L83 +L40 +R28 +L8 +L50 +R905 +R25 +L61 +R853 +R8 +L994 +L94 +L12 +R204 +L11 +R7 +L95 +R95 +R25 +L7 +R351 +L778 +L58 +L34 +L97 +L10 +L77 +R93 +R26 +R66 +R51 +R54 +R60 +L65 +L95 +R95 +L77 +R55 +L3 +R41 +L92 +L24 +R103 +L78 +R85 +R90 +L95 +R95 +R117 +L22 +R5 +R54 +L74 +R82 +L83 +L17 +R38 +L74 +R35 +L661 +R25 +L25 +R18 +L18 +R68 +L397 +R59 +L56 +L742 +R661 +R7 +L42 +R42 +R98 +L70 +L928 +L89 +R23 +R66 +L97 +R97 +R72 +L57 +L4 +R64 +R84 +L59 +L2 +L98 +L170 +R270 +R855 +R845 +R548 +R32 +L82 +L60 +L87 +R583 +L34 +L841 +L59 +L67 +R68 +R99 +R4 +R696 +L81 +L9 +R943 +R47 +R712 +L34 +R22 +L37 +L927 +L253 +L483 +L60 +R60 +R841 +R80 +R479 +L96 +L78 +R428 +R96 +R50 +L25 +L22 +R87 +R60 +R388 +L388 +L234 +L89 +R49 +L53 +L70 +L503 +L488 +L912 +L956 +R60 +R31 +R39 +R13 +L62 +L667 +L81 +R21 +L332 +L367 +L35 +R36 +R15 +L7 +R31 +L23 +R89 +L33 +R50 +R79 +L55 +R54 +R695 +L786 +R75 +R28 +L95 +L49 +L2 +R30 +L96 +R38 +R61 +L99 +L63 +R45 +R718 +R42 +L97 +L45 +R74 +L79 +L106 +R967 +L76 +R20 +L57 +L43 +R848 +R30 +R41 +L12 +L15 +L68 +R73 +R10 +R93 +R55 +L98 +L87 +R315 +R89 +R95 +L169 +L21 +R21 +L888 +R18 +R67 +R19 +R68 +R17 +R25 +L84 +R330 +R88 +L39 +L471 +R50 +L382 +L351 +R38 +L21 +R16 +R535 +R55 +L390 +L747 +L504 +L49 +R733 +R41 +R16 +R86 +L76 +L708 +R99 +L75 +R89 +R82 +L950 +L9 +R204 +R568 +R48 +R6 +L41 +L13 +R8 +L108 +L11 +R252 +L92 +R42 +L78 +L854 +L59 +L531 +L47 +R58 +L80 +L75 +L21 +L4 +R260 +R79 +L43 +L96 +R852 +L52 +L582 +L82 +L36 +L9 +R540 +R25 +R52 +R92 +L95 +R1 +R94 +L58 +R7 +R151 +R79 +R686 +L3 +L25 +L76 +R370 +R69 +L798 +L2 +L65 +R65 +L61 +R41 +L11 +R32 +L995 +L11 +L95 +R46 +L87 +R41 +R69 +L774 +L95 +L220 +L280 +R90 +R10 +R40 +L111 +L29 +R88 +R78 +L89 +R23 +R44 +R95 +R32 +R23 +L94 +R58 +L25 +L868 +L34 +R669 +L95 +R8 +R39 +L3 +R51 +L88 +R88 +R75 +R25 +R50 +L814 +R531 +L55 +R376 +R80 +L41 +L27 +L54 +L95 +R279 +L18 +R95 +L783 +L49 +L942 +R67 +R56 +L7 +L730 +R81 +L97 +R97 +L13 +R613 +R40 +R34 +R26 +R75 +L75 +L80 +R80 +R55 +R26 +L891 +L34 +L56 +R279 +L79 +L96 +L32 +L77 +L995 +R61 +R180 +L41 +R26 +L12 +L54 +R93 +R21 +L74 +R25 +R575 +L285 +R485 +R7 +R93 +R33 +L24 +R21 +L71 +R85 +R76 +L795 +R81 +R469 +L675 +R4 +L46 +L58 +R87 +L87 +L24 +R86 +R238 +L150 +L53 +R41 +R84 +R76 +L83 +L73 +R58 +L90 +R90 +R557 +L57 +L97 +R19 +R10 +L28 +R82 +L786 +R309 +R91 +R43 +R22 +L345 +R67 +L787 +L89 +R989 +L35 +L49 +R84 +R87 +L987 +L92 +R92 +L47 +L92 +R460 +L21 +R25 +L25 +R7 +R756 +R37 +L90 +L880 +R3 +R67 +L99 +L1 +L2 +R15 +R22 +R665 +R20 +L52 +L653 +L10 +L88 +R858 +R25 +L3 +L97 +L66 +L568 +L79 +L25 +L81 +L493 +L11 +L74 +R19 +R33 +L11 +R756 +L61 +R44 +R1 +L82 +L4 +R579 +L53 +R34 +R35 +R66 +R73 +R4 +R79 +L34 +R313 +L66 +R72 +L93 +L7 +R19 +L19 +R72 +R364 +R626 +L21 +R62 +R997 +L35 +L13 +R186 +R94 +L56 +R94 +L70 +L22 +R447 +R75 +L95 +L26 +R21 +L2 +R83 +R19 +L76 +L24 +R233 +L742 +R9 +R63 +L1 +L72 +L78 +R41 +L53 +L33 +L67 +L99 +R899 +L849 +L384 +L70 +R3 +L12 +R12 +R42 +L342 +R7 +L7 +L21 +L79 +L87 +L69 +R62 +L6 +L3 +R279 +L62 +L466 +R25 +R4 +L39 +L69 +L53 +R984 +R607 +L12 +L40 +R74 +L89 +R719 +R91 +R28 +L78 +R9 +R817 +L25 +R99 +L283 +L99 +L85 +L33 +L77 +L52 +R29 +L93 +L65 +R58 +R905 +R15 +L60 +L60 +L656 +R56 +R70 +L770 +R356 +R44 +R97 +L29 +R21 +L763 +R38 +L4 +R40 +R82 +R18 +L869 +R725 +R5 +L61 +R74 +L23 +R67 +L446 +R528 +L89 +R89 +L904 +L96 +L1 +R1 +R837 +R63 +L84 +R84 +R67 +R233 +R54 +R8 +R59 +R3 +R63 +L33 +R20 +L139 +R38 +L87 +L2 +L84 +R73 +L41 +L332 +R578 +L678 +L82 +R45 +L63 +R61 +L665 +L16 +L59 +L44 +L131 +R75 +L421 +R16 +L63 +R47 +L836 +R65 +R839 +R357 +L25 +L424 +L83 +L82 +R686 +R264 +R81 +L5 +L5 +R101 +R685 +L76 +L42 +R89 +R28 +R448 +R76 +R38 +L679 +L59 +R25 +R34 +L96 +L4 +R15 +R77 +R89 +L81 +L28 +L72 +L431 +L19 +R602 +R20 +L24 +L57 +L691 +L574 +L12 +R11 +R56 +R79 +R748 +L8 +R35 +R565 +L42 +L58 +R896 +R4 +R65 +L742 +R77 +R58 +L97 +R39 +L463 +L8 +L163 +L52 +R45 +L59 +R98 +L98 +R188 +R57 +R40 +R15 +L607 +R45 +L99 +R49 +L188 +R16 +L65 +L51 +L20 +R20 +L35 +R35 +R89 +R55 +R890 +R15 +L42 +L7 +L142 +R78 +R36 +L77 +L322 +L96 +R266 +R928 +R29 +R2 +R298 +R801 +R49 +L50 +L69 +L31 +L71 +R30 +L59 +L93 +L87 +R19 +R61 +L19 +R69 +L50 +R89 +R57 +L46 +L77 +R323 +R54 +R30 +L30 +L13 +R91 +L93 +L30 +L37 +L618 +L57 +R106 +R51 +L50 +L3 +R53 +L711 +R11 +R57 +R543 +L3 +L77 +L65 +L39 +R10 +R74 +L724 +L32 +L33 +R45 +R44 +L76 +L24 +L855 +L45 +R621 +R75 +R16 +R70 +L174 +R92 +L46 +R65 +R81 +R64 +L74 +R91 +R19 +L18 +R9 +L91 +L55 +R335 +R120 +L78 +L11 +R87 +R59 +R43 +R54 +L654 +L83 +L17 +R34 +R58 +R8 +L818 +L75 +R20 +L95 +L683 +L669 +R190 +R30 +L73 +L27 +R944 +L31 +L3 +R49 +R94 +L153 +L31 +L37 +L87 +R55 +R584 +L28 +R756 +L97 +L7 +L780 +L65 +R66 +L29 +L35 +R52 +R704 +L85 +R7 +L1 +R58 +R68 +L68 +L39 +R39 +R74 +L76 +L99 +R1 +L97 +L3 +L99 +R80 +R71 +L32 +L253 +R85 +L82 +L46 +R65 +R11 +L192 +L63 +R55 +L69 +L852 +L64 +L5 +L610 +L11 +R211 +R32 +R27 +R369 +R72 +L31 +L69 +L67 +L33 +L890 +R270 +R910 +L2 +L16 +R28 +L60 +R760 +R25 +R364 +R64 +R9 +L177 +R202 +L10 +L42 +L980 +R1 +L7 +L7 +R58 +R41 +R59 +R66 +L28 +L9 +L38 +L98 +L393 +R218 +L18 +L7 +L93 +L533 +L367 +L44 +L1 +L923 +L34 +L98 +L56 +L79 +L75 +L80 +L873 +L37 +L528 +R28 +R87 +L87 +R4 +L233 +L378 +L621 +R428 +L53 +R42 +L89 +R539 +L27 +R61 +L73 +R9 +L9 +L358 +R58 +L226 +L41 +R92 +L25 +L613 +L64 +R82 +L548 +R943 +R78 +L94 +R52 +L456 +L680 +L52 +R52 +R77 +L742 +L33 +R50 +L52 +L59 +L36 +L884 +R61 +R85 +R33 +R54 +L39 +R894 +R75 +L393 +R509 +L25 +L45 +L6 +L989 +L82 +R243 +R34 +L66 +R928 +L21 +L71 +L48 +L53 +R10 +L25 +L84 +L57 +L33 +L15 +L5 +R18 +L5 +L87 +L58 +R798 +L56 +L50 +R96 +L18 +R51 +L94 +R15 +R82 +L293 +L48 +R20 +R241 +R592 +R30 +L35 +L61 +L840 +L84 +L383 +L59 +R38 +L178 +L22 +L64 +L57 +L63 +L69 +L47 +L348 +L43 +L24 +R815 +R16 +R84 +R5 +L86 +L19 +L65 +R65 +R80 +R20 +L83 +L77 +L936 +L16 +L41 +R53 +L29 +R29 +R83 +L72 +R13 +R25 +R4 +R57 +R18 +R88 +L52 +R20 +L847 +R85 +R12 +R261 +L91 +R68 +R714 +R2 +L88 +L69 +R69 +R80 +R35 +L15 +L47 +L99 +L188 +R8 +R162 +L85 +L51 +L95 +L9 +L24 +L383 +R17 +L648 +R89 +L91 +L49 +R93 +L633 +L41 +R16 +L42 +L27 +R27 +L3 +R3 +R966 +L35 +L31 +R42 +L156 +L2 +R18 +R75 +R555 +L913 +R4 +L9 +L30 +R70 +L54 +R979 +R21 +L84 +R84 +L3 +L31 +R34 +L70 +R69 +L60 +R61 +R439 +L247 +L882 +R69 +R668 +R5 +L22 +R70 +R103 +R197 +L35 +L97 +L68 +L65 +L35 +R80 +R20 +R20 +R31 +R856 +R93 +R51 +R43 +R176 +L70 +R10 +L9 +R14 +R22 +R63 +R11 +L585 +R74 +L442 +L558 +L24 +R73 +R51 +R60 +R340 +R25 +L1 +L24 +L31 +R47 +R77 +L705 +R89 +L77 +L48 +L78 +L48 +L1 +L69 +L59 +L97 +R3 +L3 +R76 +L30 +R54 +L67 +L41 +R77 +R31 +L76 +R281 +R81 +R14 +L91 +L93 +R2 +L517 +L1 +L40 +R40 +L36 +L89 +L78 +L37 +L74 +R14 +L10 +R10 +L97 +R59 +L62 +R67 +R33 +R64 +L717 +L47 +L73 +R173 +L44 +L68 +L88 +L567 +L170 +L59 +L97 +L81 +R74 +R22 +R51 +L58 +R66 +L52 +R671 +R77 +L9 +L827 +R759 +R91 +R26 +L36 +L81 +R98 +L98 +R638 +R57 +L114 +L33 +L78 +R49 +R81 +L123 +L15 +R38 +R57 +R1 +L770 +R6 +R26 +R80 +L46 +L84 +R30 +R504 +L1 +L46 +L57 +R7 +R93 +L73 +L168 +R82 +L98 +L25 +R82 +L927 +R27 +L14 +L19 +L434 +R80 +L30 +R643 +L26 +L18 +L82 +R7 +L959 +L48 +L234 +L44 +R70 +L615 +R23 +R34 +L761 +R99 +R28 +R49 +R32 +L61 +L55 +L65 +R29 +L29 +R404 +L15 +L17 +L25 +L16 +L5 +R70 +R4 +L1 +R131 +R27 +R43 +R4 +R60 +R52 +R37 +L153 +L54 +R26 +R28 +R8 +R740 +L42 +R611 +L20 +L50 +R53 +R54 +L354 +R92 +R64 +R44 +L53 +R53 +L48 +R467 +L19 +L94 +L33 +R88 +R10 +R2 +R27 +R98 +L24 +R25 +L986 +R22 +R65 +L4 +R15 +R873 +L31 +L53 +R39 +L1 +R80 +R72 +L90 +R16 +L416 +R59 +L36 +R77 +R95 +L97 +R2 +L33 +R865 +R68 +L65 +L40 +L24 +R397 +R98 +R10 +L98 +R9 +L2 +L85 +R36 +L79 +R43 +R49 +L179 +L78 +L99 +L93 +L714 +L31 +L91 +R136 +L560 +L14 +L77 +L49 +L24 +L80 +R167 +L47 +R84 +R36 +R64 +R84 +L84 +L693 +R73 +R94 +L74 +R47 +R73 +R80 +R28 +R72 +R3 +L50 +R30 +L83 +L50 +L1 +L49 +R48 +L42 +L48 +R9 +L67 +R65 +L60 +L93 +R89 +R4 +L17 +R8 +R1 +R45 +R85 +R22 +R51 +L98 +R160 +L74 +R61 +R51 +L13 +R13 +L31 +R331 +R3 +L403 +R2 +L40 +L63 +L99 +R3 +L82 +L66 +L34 +R79 +L330 +R85 +R49 +L4 +L22 +R22 +L82 +R462 +L80 +R71 +L40 +R69 +L714 +L86 +L23 +R23 +R43 +L45 +L738 +R40 +L95 +R858 +L63 +L83 +R202 +L919 +R63 +L98 +L23 +L42 +R5 +R33 +L31 +L930 +R723 +R15 +L548 +R33 +L33 +R489 +L56 +R47 +L85 +R41 +L13 +R10 +R89 +L89 +R73 +R16 +R84 +R70 +L43 +R21 +L587 +L34 +R55 +R81 +R2 +L81 +R23 +R20 +R53 +L97 +L29 +R11 +L138 +L343 +L57 +L25 +R81 +R78 +L11 +R77 +R10 +R90 +R77 +R23 +L18 +R18 +R70 +R30 +L46 +R81 +L35 +L86 +L14 +R19 +R36 +R70 +R25 +R50 +L99 +R44 +R8 +R18 +L77 +R6 +L34 +R84 +R78 +L65 +L63 +R93 +L45 +L48 +L20 +R61 +L682 +L12 +L71 +R20 +L96 +R407 +L45 +L424 +L18 +L39 +L42 +L39 +L427 +L84 +R211 +R50 +L94 +L31 +R26 +L72 +L47 +R73 +L776 +L59 +R930 +L64 +R64 +R525 +L25 +L31 +R14 +L588 +L72 +R77 +L49 +L58 +L60 +R63 +L30 +R15 +R19 +L125 +R31 +L6 +L76 +L24 +L81 +R86 +R79 +R16 +R29 +L94 +R65 +L11 +R11 +L8 +L47 +R15 +L54 +L18 +L64 +R83 +L92 +L23 +R8 +L83 +R83 +L79 +L37 +L86 +R602 +L82 +L64 +R779 +L30 +L3 +L810 +R103 +R7 +L23 +R93 +R59 +L64 +L8 +L995 +L43 +L119 +R76 +L76 +R132 +R36 +L168 +L17 +L45 +L38 +L68 +L49 +L21 +L10 +R48 +L34 +L9 +R243 +L6 +L76 +R82 +L81 +R328 +L347 +R76 +R52 +R167 +L52 +L43 +R245 +L24 +L21 +L20 +L83 +L17 +L77 +L49 +R616 +R30 +L443 +L60 +R3 +R36 +L670 +R43 +R989 +L77 +R79 +R11 +L711 +R66 +L91 +L68 +L7 +L94 +L6 +R71 +R20 +L9 +R11 +R7 +R21 +L95 +R74 +L47 +L653 +R78 +R679 +L9 +L8 +L94 +L46 +R19 +L95 +L24 +R67 +L67 +L31 +R18 +R25 +R832 +L44 +L23 +L60 +L17 +L91 +L64 +L79 +R39 +R58 +R437 +L68 +L32 +R805 +R13 +L18 +R90 +R20 +L10 +L18 +R18 +L32 +L80 +L288 +L958 +L58 +R997 +L22 +R41 +R616 +R262 +L78 +R61 +R16 +R23 +L74 +R74 +L19 +R62 +R57 +R29 +R71 +R47 +R37 +R66 +R50 +L7 +R7 +L18 +L543 +L87 +L52 +R539 +L39 +L27 +L95 +R95 +L18 +R45 +L74 +R98 +L24 +R26 +R75 +L95 +L6 +L23 +L77 +L32 +R24 +L98 +R42 +R64 +R5 +R27 +R29 +R73 +L9 +L25 +L87 +R87 +R19 +R420 +R690 +R49 +R65 +R776 +R3 +L232 +R88 +R22 +L95 +R4 +L9 +L34 +L66 +R519 +R376 +R261 +L29 +L93 +L31 +R86 +L808 +L27 +L64 +L90 +R24 +L504 +L14 +R891 +L397 +L374 +R38 +L42 +R75 +R244 +R90 +L31 +R9 +L93 +R99 +R533 +L991 +R52 +L91 +L82 +R763 +L9 +R99 +L97 +R99 +R39 +L82 +L97 +L94 +R43 +L15 +L85 +L67 +L522 +L66 +R77 +R34 +L656 +R363 +R18 +R37 +L84 +L70 +R26 +R68 +L24 +L34 +L33 +R69 +L79 +R667 +R976 +L49 +L83 +L68 +R42 +L842 +R991 +L42 +R651 +L483 +R44 +L563 +R2 +R1 +L1 +R61 +R7 +R36 +L4 +L42 +R6 +L31 +L48 +R15 +L244 +L56 +R52 +R48 +L11 +R1 +L22 +L70 +L78 +L42 +L78 +R12 +R35 +L97 +L50 +R69 +L69 +R22 +L82 +L40 +R27 +L21 +R94 +R48 +L40 +R8 +L12 +L31 +L73 +L1 +R1 +L56 +L44 +L27 +R96 +L18 +L25 +R15 +L59 +R243 +L38 +R55 +L299 +L13 +L34 +L43 +R296 +L149 +L12 +L59 +L29 +L80 +R9 +L29 +R6 +R56 +R82 +L48 +L58 +L26 +R88 +L28 +R28 +R370 +L10 +R934 +R6 +R32 +L97 +R65 +R70 +L70 +L57 +R21 +L64 +L98 +L132 +R96 +L66 +R56 +R90 +L62 +L94 +L90 +L342 +R62 +L20 +L90 +L6 +L4 +L55 +R55 +R17 +L95 +L22 +R9 +L9 +L351 +L53 +L28 +R10 +L81 +L24 +L58 +L15 +L36 +L64 +L61 +R70 +R69 +R36 +R83 +L421 +L61 +L15 +L53 +R7 +L57 +L93 +L86 +L35 +R317 +R81 +R638 +L15 +R96 +L52 +L47 +L201 +R21 +R79 +L54 +L46 +L13 +L87 +L44 +R36 +L92 +L58 +R66 +R787 +L85 +L10 +R83 +L83 +L54 +R98 +R34 +L85 +R7 +R39 +L72 +R15 +R96 +L78 +R34 +R36 +R930 +L92 +L55 +R47 +L36 +L97 +R50 +R17 +R1 +L835 +L35 +R92 +L57 +L90 +L10 +R99 +L93 +L5 +L21 +L95 +R78 +R46 +R14 +R93 +L16 +R663 +L4 +L29 +L30 +L878 +R23 +L145 +R491 +R455 +R254 +L40 +L426 +R58 +R44 +L36 +R222 +R392 +L64 +R50 +L90 +L10 +L23 +R6 +R17 +R52 +L298 +R43 +L85 +L312 +R5 +R95 +L88 +R30 +R609 +L64 +R95 +L85 +R98 +R5 +L97 +R18 +L28 +L93 +L96 +L4 +R79 +L79 +R56 +L196 +L10 +L95 +L931 +L907 +R83 +L332 +L68 +R64 +R336 +L96 +L4 +R71 +R38 +R55 +R36 +R31 +L51 +L72 +L10 +L81 +R83 +R71 +R55 +R90 +L16 +L43 +L57 +L28 +R746 +L50 +L668 +R27 +L27 +L20 +L80 +R55 +R45 +R875 +L42 +L33 +L57 +L94 +R28 +L77 +L49 +R49 +L51 +R51 +R6 +L6 +L46 +R93 +L89 +L11 +L81 +L73 +L51 +R3 +L45 +R56 +L82 +L64 +R42 +R53 +R95 +L97 +R97 +R69 +R822 +L291 +R3 +R7 +L117 +R79 +R3 +L17 +R442 +L31 +L28 +L98 +L43 +R21 +R19 +R94 +L61 +L73 +L57 +R83 +R26 +R281 +L684 +L364 +L74 +R94 +L5 +L19 +L881 +L8 +R23 +R85 +L86 +L81 +R97 +R13 +R97 +R60 +L32 +R32 +L90 +L37 +L73 +R84 +R16 +R37 +R63 +L55 +L45 +L45 +R70 +R75 +R69 +L68 +L93 +L5 +R97 +L65 +L97 +L38 +R20 +L53 +R14 +R64 +L45 +R32 +R51 +L67 +L16 +R65 +R68 +R80 +L7 +L6 +L6 +L63 +L31 +L70 +R70 +R30 +L30 +R87 +R19 +L6 +L39 +L1 +L36 +R50 +R34 +L16 +L47 +R7 +R41 +L4 +R9 +L13 +L45 +L36 +R3 +L35 +L26 +R36 +R36 +L7 +L44 +L3 +L23 +R46 +R33 +L6 +L15 +L2 +L6 +R36 +L16 +R24 +L42 +R14 +R19 +L28 +L38 +L5 +R38 +L47 +R49 +R18 +R33 +R2 +R28 +L2 +L13 +R9 +L46 +R8 diff --git a/day_1/manifest.toml b/day_1/manifest.toml index 27177f5..6139ca9 100644 --- a/day_1/manifest.toml +++ b/day_1/manifest.toml @@ -2,10 +2,13 @@ # You typically do not need to edit this file packages = [ + { name = "filepath", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "B06A9AF0BF10E51401D64B98E4B627F1D2E48C154967DA7AF4D0914780A6D40A" }, { name = "gleam_stdlib", version = "0.67.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "6368313DB35963DC02F677A513BB0D95D58A34ED0A9436C8116820BF94BE3511" }, { name = "gleeunit", version = "1.9.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "DA9553CE58B67924B3C631F96FE3370C49EB6D6DC6B384EC4862CC4AAA718F3C" }, + { name = "simplifile", version = "2.3.1", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "957E0E5B75927659F1D2A1B7B75D7B9BA96FAA8D0C53EA71C4AD9CD0C6B848F6" }, ] [requirements] gleam_stdlib = { version = ">= 0.44.0 and < 2.0.0" } gleeunit = { version = ">= 1.0.0 and < 2.0.0" } +simplifile = { version = ">= 2.3.1 and < 3.0.0" } diff --git a/day_1/prompt.md b/day_1/prompt.md new file mode 100644 index 0000000..477e75d --- /dev/null +++ b/day_1/prompt.md @@ -0,0 +1,64 @@ +# Day 1: Secret Entrance + +The Elves have good news and bad news. + +The good news is that they've discovered project management! This has given them the tools they need to prevent their usual Christmas emergency. For example, they now know that the North Pole decorations need to be finished soon so that other critical tasks can start on time. + +The bad news is that they've realized they have a different emergency: according to their resource planning, none of them have any time left to decorate the North Pole! + +To save Christmas, the Elves need you to finish decorating the North Pole by December 12th. + +Collect stars by solving puzzles. Two puzzles will be made available on each day; the second puzzle is unlocked when you complete the first. Each puzzle grants one star. Good luck! + +You arrive at the secret entrance to the North Pole base ready to start decorating. Unfortunately, the password seems to have been changed, so you can't get in. A document taped to the wall helpfully explains: + +"Due to new security protocols, the password is locked in the safe below. Please see the attached document for the new combination." + +The safe has a dial with only an arrow on it; around the dial are the numbers 0 through 99 in order. As you turn the dial, it makes a small click noise as it reaches each number. + +The attached document (your puzzle input) contains a sequence of rotations, one per line, which tell you how to open the safe. A rotation starts with an L or R which indicates whether the rotation should be to the left (toward lower numbers) or to the right (toward higher numbers). Then, the rotation has a distance value which indicates how many clicks the dial should be rotated in that direction. + +So, if the dial were pointing at 11, a rotation of R8 would cause the dial to point at 19. After that, a rotation of L19 would cause it to point at 0. + +Because the dial is a circle, turning the dial left from 0 one click makes it point at 99. Similarly, turning the dial right from 99 one click makes it point at 0. + +So, if the dial were pointing at 5, a rotation of L10 would cause it to point at 95. After that, a rotation of R5 could cause it to point at 0. + +The dial starts by pointing at 50. + +You could follow the instructions, but your recent required official North Pole secret entrance security training seminar taught you that the safe is actually a decoy. The actual password is the number of times the dial is left pointing at 0 after any rotation in the sequence. + +For example, suppose the attached document contained the following rotations: + +``` +L68 +L30 +R48 +L5 +R60 +L55 +L1 +L99 +R14 +L82 +``` + +Following these rotations would cause the dial to move as follows: + + - The dial starts by pointing at `50`. + - The dial is rotated `L68` to point at `82`. + - The dial is rotated `L30` to point at `52`. + - The dial is rotated `R48` to point at `0 `. + - The dial is rotated `L5 ` to point at `95`. + - The dial is rotated `R60` to point at `55`. + - The dial is rotated `L55` to point at `0 `. + - The dial is rotated `L1 ` to point at `99`. + - The dial is rotated `L99` to point at `0 `. + - The dial is rotated `R14` to point at `14`. + - The dial is rotated `L82` to point at `32`. + +Because the dial points at 0 a total of three times during this process, the password in this example is 3. + +Analyze the rotations in your attached document. What's the actual password to open the door? + + diff --git a/day_1/src/day_1.gleam b/day_1/src/day_1.gleam index e5f6c54..c9293ad 100644 --- a/day_1/src/day_1.gleam +++ b/day_1/src/day_1.gleam @@ -1,5 +1,78 @@ +import gleam/int import gleam/io +import gleam/list +import gleam/result +import gleam/string +import simplifile + +pub type Rotation { + Left(Int) + Right(Int) +} + +pub fn rotate(pos: Int, rot: Rotation) -> Int { + case rot { + Left(r) -> + case pos, r { + p, r if p < r -> 100 - { r - p } + p, r -> p - r + } + Right(r) -> { pos + r } % 100 + } +} + +pub fn rotate_step(hist: List(Int), rot: Rotation) -> List(Int) { + case hist { + [] -> [rotate(50, rot), 50] + [p, ..] -> [rotate(p, rot), ..hist] + } +} + +pub fn count_zeros(l: List(Int)) -> Int { + list.filter(l, fn(x) { x == 0 }) |> list.length +} + +pub fn line_to_rotation(l: String) -> Result(Rotation, Nil) { + let first_char = string.first(l) + let numeral = + string.drop_start(l, up_to: 1) |> int.parse |> result.map(fn(n) { n % 100 }) + result.map(first_char, fn(c) { + case c { + "L" -> result.map(numeral, Left) + "R" -> result.map(numeral, Right) + _ -> Error(Nil) + } + }) + |> result.flatten +} + +pub fn read_line(file: String) -> Result(List(String), simplifile.FileError) { + simplifile.read(file) |> result.map(fn(c) { string.split(c, on: "\n") }) +} + +pub fn file_to_rotations(file: String) -> Result(List(Rotation), Nil) { + read_line(file) + |> result.map_error(fn(_) { Nil }) + |> result.map(fn(ls) { + list.map(ls, line_to_rotation) + |> list.filter_map(fn(a) { a }) + }) +} + +pub fn apply_rotations(rots: List(Rotation)) -> List(Int) { + list.fold(rots, [], rotate_step) +} + +pub fn rotations_file_to_zeros(file: String) -> Result(Int, Nil) { + file_to_rotations(file) + |> result.map(apply_rotations) + |> result.map(count_zeros) +} pub fn main() -> Nil { - io.println("Hello from day_1!") + let _ = + rotations_file_to_zeros("input.txt") + |> result.unwrap(-1) + |> int.to_string + |> io.println } diff --git a/day_1/src/good_test.txt b/day_1/src/good_test.txt new file mode 100644 index 0000000..94954ab --- /dev/null +++ b/day_1/src/good_test.txt @@ -0,0 +1,2 @@ +hello +world diff --git a/day_1/test/day_1_test.gleam b/day_1/test/day_1_test.gleam index fba3c88..5585002 100644 --- a/day_1/test/day_1_test.gleam +++ b/day_1/test/day_1_test.gleam @@ -1,13 +1,178 @@ +import day_1.{Left, Right, rotate} +import gleam/list import gleeunit +import simplifile pub fn main() -> Nil { gleeunit.main() } -// gleeunit test functions end in `_test` -pub fn hello_world_test() { - let name = "Joe" - let greeting = "Hello, " <> name <> "!" +pub fn normal_right_rotate_test() { + let initial = 5 + let rotation = Right(5) + let final = rotate(initial, rotation) - assert greeting == "Hello, Joe!" + assert final == 10 +} + +pub fn overflow_right_rotate_test() { + let initial = 60 + let rotation = Right(95) + let final = rotate(initial, rotation) + + assert final == 55 +} + +pub fn normal_left_rotate_test() { + let initial = 40 + let rotation = Left(10) + let final = rotate(initial, rotation) + + assert final == 30 +} + +pub fn underflow_left_rotate_test() { + let initial = 40 + let rotation = Left(50) + let final = rotate(initial, rotation) + + assert final == 90 +} + +pub fn right_rotate_to_zero_test() { + assert rotate(52, Right(48)) == 0 +} + +pub fn left_rotate_to_zero_test() { + assert rotate(20, Left(20)) == 0 +} + +pub fn right_rotate_off_zero_test() { + assert rotate(0, Right(1)) == 1 +} + +pub fn left_rotate_off_zero_test() { + assert rotate(0, Left(1)) == 99 +} + +pub fn rotate_left_step_test() { + let initial = [50] + let rotation = Left(68) + let final = day_1.rotate_step(initial, rotation) + + assert final == [82, 50] +} + +pub fn rotate_1st_step_test() { + assert day_1.rotate_step([], Left(68)) == [82, 50] +} + +pub fn rotate_2nd_step_test() { + assert day_1.rotate_step([82, 50], Left(30)) == [52, 82, 50] +} + +pub fn count_list_of_zeros_test() { + assert { day_1.count_zeros([0, 0, 0]) == 3 } +} + +pub fn count_empty_list_test() { + assert { day_1.count_zeros([]) == 0 } +} + +pub fn count_dirty_list_test() { + assert { day_1.count_zeros([0, 1, 2, 0]) == 2 } +} + +pub fn the_big_test() { + let rotations = [ + Left(68), + Left(30), + Right(48), + Left(5), + Right(60), + Left(55), + Left(1), + Left(99), + Right(14), + Left(82), + ] + + assert { list.fold(rotations, [], day_1.rotate_step) |> day_1.count_zeros } + == 3 +} + +pub fn good_right_parse_test() { + assert day_1.line_to_rotation("R16") == Ok(Right(16)) +} + +pub fn good_left_parse_test() { + assert day_1.line_to_rotation("L32") == Ok(Left(32)) +} + +pub fn no_leading_letter_test() { + assert day_1.line_to_rotation("13") == Error(Nil) +} + +pub fn no_numeral_test() { + assert day_1.line_to_rotation("L") == Error(Nil) +} + +pub fn empty_string_test() { + assert day_1.line_to_rotation("") == Error(Nil) +} + +pub fn garbage_string_test() { + assert day_1.line_to_rotation("a983u4") == Error(Nil) +} + +pub fn split_good_file_test() { + assert day_1.read_line("test/good_file.txt") == Ok(["hello", "world", ""]) +} + +pub fn split_bad_file_test() { + assert day_1.read_line("test/bad_file.txt") == Error(simplifile.Enoent) +} + +pub fn parse_rotats_test() { + assert day_1.file_to_rotations("test/parse_rotats.txt") + == Ok([ + Left(68), + Left(30), + Right(48), + Left(5), + Right(60), + Left(55), + Left(1), + Left(99), + Right(14), + Left(82), + ]) +} + +pub fn apply_empty_rots_test() { + assert day_1.apply_rotations([]) == [] +} + +pub fn apply_first_rot_test() { + assert day_1.apply_rotations([Left(68)]) == [82, 50] +} + +pub fn apply_10_rots_test() { + assert day_1.apply_rotations([ + Left(68), + Left(30), + Right(48), + Left(5), + Right(60), + Left(55), + Left(1), + Left(99), + Right(14), + Left(82), + ]) + == [32, 14, 0, 99, 0, 55, 95, 0, 52, 82, 50] +} + +pub fn proving_test() { + assert day_1.rotations_file_to_zeros("test/parse_rotats.txt") == Ok(3) } diff --git a/day_1/test/good_file.txt b/day_1/test/good_file.txt new file mode 100644 index 0000000..94954ab --- /dev/null +++ b/day_1/test/good_file.txt @@ -0,0 +1,2 @@ +hello +world diff --git a/day_1/test/parse_rotats.txt b/day_1/test/parse_rotats.txt new file mode 100644 index 0000000..53287c7 --- /dev/null +++ b/day_1/test/parse_rotats.txt @@ -0,0 +1,10 @@ +L68 +L30 +R48 +L5 +R60 +L55 +L1 +L99 +R14 +L82