commit 600b41ba7a31440343b32dc9b3e0bf3cd4c163a2 Author: Mindaugas Bernotas Date: Wed Dec 3 22:38:57 2025 +0200 Init commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c7e3278 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode +debug*.txt diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/cmd/day1/example.txt b/cmd/day1/example.txt new file mode 100644 index 0000000..53287c7 --- /dev/null +++ b/cmd/day1/example.txt @@ -0,0 +1,10 @@ +L68 +L30 +R48 +L5 +R60 +L55 +L1 +L99 +R14 +L82 diff --git a/cmd/day1/input.txt b/cmd/day1/input.txt new file mode 100644 index 0000000..4e124bc --- /dev/null +++ b/cmd/day1/input.txt @@ -0,0 +1,4503 @@ +R48 +R2 +R29 +L38 +L3 +R50 +R21 +R29 +L26 +L44 +R1 +R11 +R5 +R36 +L43 +L5 +L15 +L45 +L38 +L34 +R14 +R34 +R50 +L28 +L8 +L24 +L50 +L22 +L10 +L45 +L8 +L41 +L23 +L7 +L3 +R50 +L31 +L43 +R17 +R39 +R31 +R45 +L42 +L26 +L27 +L43 +L40 +L33 +L19 +L24 +L74 +R3 +R56 +R98 +R43 +L32 +L42 +R16 +L64 +R22 +L64 +R64 +L67 +R67 +L65 +R47 +L82 +R69 +L69 +L50 +R86 +L27 +L28 +L51 +R70 +L48 +R94 +R54 +L27 +R54 +L27 +L81 +R33 +R48 +R22 +R94 +L75 +L69 +L53 +R70 +L89 +L51 +R51 +L30 +L53 +L17 +L82 +R54 +L39 +L99 +R66 +R2 +R29 +L31 +L84 +R33 +L35 +R59 +R24 +R3 +L15 +R315 +R18 +R2 +R80 +R88 +R12 +R53 +R94 +L49 +R63 +L61 +R5 +R995 +L61 +L38 +L68 +L52 +R67 +L33 +R87 +L2 +R27 +L727 +L77 +L23 +L80 +L20 +L15 +R76 +R940 +R39 +L95 +L99 +L77 +R82 +R6 +L57 +R20 +R80 +R66 +R94 +L13 +L47 +L54 +R54 +L811 +L942 +R93 +R95 +L87 +L74 +L74 +L22 +L754 +L70 +L54 +L31 +L912 +R43 +R2 +L34 +L789 +L17 +R80 +R958 +L45 +R45 +R11 +L912 +L115 +R29 +R70 +L650 +L26 +R93 +R17 +R83 +R35 +L85 +R88 +R309 +L71 +L5 +L71 +L17 +R39 +L99 +R77 +R15 +L85 +L69 +L69 +L92 +L3 +L97 +R27 +L337 +L12 +R75 +L88 +L57 +R73 +R78 +L89 +L91 +L79 +L53 +L42 +R27 +R464 +R427 +R785 +L8 +R21 +R49 +R89 +L59 +R90 +L296 +L94 +L854 +L21 +L84 +L64 +L25 +R75 +R50 +L77 +R69 +L85 +L84 +R874 +R274 +L64 +L84 +L53 +L51 +L78 +R35 +L4 +R78 +R59 +R99 +R12 +R23 +R80 +L14 +R86 +L62 +L10 +L76 +L8 +L85 +R69 +R87 +L84 +L603 +L79 +L57 +R64 +R36 +R263 +L27 +R73 +L22 +L188 +R14 +R46 +L23 +L38 +R38 +L39 +R239 +R31 +R69 +L57 +L80 +L94 +R22 +L91 +L27 +R7 +L27 +R79 +L32 +L875 +L459 +L16 +L34 +L16 +L34 +L75 +L6 +L85 +L60 +L65 +R21 +L96 +L9 +R37 +R72 +R23 +L23 +L795 +L310 +R50 +L32 +L913 +L52 +R76 +R81 +R66 +R29 +L21 +L73 +R94 +L29 +L48 +R77 +R2 +L2 +L21 +R87 +R99 +R71 +R64 +R93 +R7 +L57 +R79 +R995 +R83 +R19 +R40 +R41 +L652 +L93 +R32 +L39 +R32 +R46 +L832 +R6 +R6 +L6 +R41 +R59 +L747 +L376 +L9 +R27 +L95 +L77 +R77 +L48 +R811 +R37 +L83 +L17 +R65 +R352 +L849 +R95 +L63 +L85 +L79 +R42 +R22 +L95 +L5 +L63 +L88 +L39 +L10 +L18 +R18 +R54 +R54 +R92 +R26 +L62 +L98 +L166 +L741 +L306 +L29 +R17 +L41 +R13 +L1 +L68 +R56 +L22 +R78 +R44 +L81 +R97 +L169 +L47 +R15 +L33 +R502 +R52 +L12 +L27 +L15 +L503 +L79 +L38 +L62 +L29 +R92 +L63 +L9 +R12 +R97 +L52 +R452 +L214 +R52 +R84 +L80 +R27 +L93 +L97 +L992 +R69 +L56 +R45 +R76 +R33 +R35 +R946 +L279 +R63 +R881 +L60 +R60 +R70 +R30 +R31 +R55 +L223 +R60 +L2 +R246 +L472 +L16 +R644 +R47 +L858 +L63 +R54 +R85 +L40 +R52 +L122 +L78 +R540 +R7 +L47 +R14 +L11 +L3 +L460 +L44 +R2 +R50 +L48 +R62 +L62 +L73 +R73 +L60 +L40 +L84 +L473 +R85 +L41 +L79 +L108 +R40 +R91 +R543 +R81 +L781 +L74 +L286 +L555 +R50 +R2 +R17 +R53 +R89 +R23 +R107 +L68 +L32 +R65 +R35 +L36 +R913 +L597 +L80 +L34 +L66 +L96 +L526 +R32 +R15 +R75 +L70 +R21 +L45 +R1 +R93 +L45 +L56 +L99 +R84 +R60 +L44 +R44 +L9 +R65 +L80 +R80 +L18 +L82 +R71 +R29 +L183 +R83 +R22 +R78 +R779 +R21 +L38 +R82 +R88 +R68 +L64 +L214 +R74 +L96 +R21 +R68 +L95 +R6 +L7 +L93 +L24 +L94 +R41 +L254 +R51 +L2 +R82 +R64 +L87 +R21 +R2 +L31 +R84 +R347 +R86 +R72 +L58 +L37 +R84 +R57 +L23 +R94 +R19 +L94 +L982 +R86 +L4 +L46 +L54 +R66 +L59 +R83 +L80 +L98 +L62 +L23 +L40 +R882 +L50 +L540 +L22 +L29 +R94 +L58 +R36 +R47 +L37 +L6 +L46 +L7 +L877 +R80 +R246 +L972 +R72 +R385 +R515 +R96 +R86 +L23 +R41 +R81 +R21 +R16 +R65 +R958 +R50 +R9 +L969 +L48 +L26 +L22 +L35 +R6 +L706 +R43 +L79 +R50 +R199 +L13 +L23 +R19 +L196 +R47 +L504 +L24 +L919 +R611 +L11 +L59 +L66 +R341 +L16 +L155 +R99 +R80 +R11 +L98 +R414 +L31 +L69 +L97 +L54 +R908 +R68 +R54 +L30 +L302 +R61 +R46 +R77 +L38 +R199 +L23 +L20 +L227 +L14 +R23 +R79 +L99 +L62 +R190 +R131 +R179 +L6 +L694 +L63 +L14 +L97 +R67 +R342 +R765 +R217 +R83 +L79 +R39 +R240 +R57 +R934 +R691 +R33 +R28 +R47 +L14 +R42 +L44 +R49 +L754 +R94 +L33 +R275 +R95 +R824 +R90 +L53 +R948 +R42 +L13 +R362 +R80 +L80 +R84 +L73 +R8 +L6 +L89 +R61 +R50 +R94 +R71 +R150 +R72 +R49 +L9 +L41 +R79 +L28 +L3 +R81 +L50 +L72 +R85 +R4 +R57 +R26 +L16 +L67 +L34 +R17 +L183 +L17 +L72 +R72 +R78 +L78 +R28 +L411 +R485 +R15 +L59 +R42 +L18 +L11 +R29 +L63 +R94 +R69 +R91 +R9 +L62 +R42 +L41 +R1 +L99 +R59 +L132 +R48 +L516 +L872 +L82 +L946 +R46 +R92 +L722 +L16 +L48 +R33 +L21 +L393 +L71 +L3 +L34 +L63 +R54 +R46 +L95 +L20 +R15 +R561 +L36 +L76 +L18 +L49 +R18 +L58 +L74 +R37 +R95 +R76 +R24 +R905 +R960 +R43 +R14 +R78 +L709 +L899 +L45 +R53 +L34 +R76 +R231 +L73 +L867 +R21 +R46 +L68 +L47 +L285 +L865 +L365 +L70 +R14 +R86 +R50 +L57 +R51 +L89 +L7 +L817 +L778 +R47 +R368 +L82 +R33 +R58 +L77 +R440 +L26 +L53 +L82 +L692 +R35 +L22 +R78 +L978 +R523 +L966 +R22 +R32 +L63 +R52 +R99 +L49 +R150 +R71 +R29 +L16 +R16 +L150 +R28 +L78 +L45 +R8 +L63 +R39 +L71 +R78 +R54 +R31 +R83 +R90 +L22 +L67 +R34 +L42 +R94 +L96 +R95 +R35 +R665 +R48 +R352 +R55 +R584 +L896 +L586 +R43 +R512 +R57 +R32 +R99 +R22 +L2 +R918 +R46 +L21 +R337 +R912 +R47 +R287 +R67 +L113 +R31 +R98 +L292 +L87 +L55 +L42 +R46 +R909 +R79 +R13 +R1 +L1 +R68 +L85 +L66 +R53 +R30 +R906 +L6 +L348 +R92 +R59 +L20 +L30 +R99 +L83 +R31 +R17 +R14 +L31 +L25 +L109 +L66 +L22 +L6 +L72 +R285 +R61 +R54 +R558 +L58 +L32 +R84 +L52 +R66 +L40 +L45 +L33 +R22 +R27 +L29 +R32 +R36 +L67 +R98 +L260 +R18 +L30 +R811 +L52 +L769 +L11 +L65 +L9 +L69 +L37 +L94 +R60 +L78 +L82 +L552 +L48 +L461 +L31 +L88 +R92 +L14 +L72 +R74 +L2 +L59 +R53 +R95 +L29 +L58 +R53 +R47 +L107 +L93 +R84 +L441 +R49 +L50 +L45 +L4 +R807 +R89 +L2 +R94 +L881 +R184 +L47 +L17 +R80 +R13 +R49 +L2 +R54 +R92 +R94 +R61 +L50 +R19 +L31 +L799 +L51 +L70 +L79 +R485 +L76 +R91 +L46 +R577 +R4 +L29 +R453 +R9 +R82 +R50 +R41 +R97 +L11 +L94 +R80 +R6 +R48 +L48 +R17 +L36 +L933 +L91 +R94 +R57 +L982 +R55 +R62 +L62 +L64 +R43 +L491 +R37 +L60 +L65 +L248 +L52 +R41 +R11 +L52 +L48 +R40 +L92 +R896 +L512 +R845 +L871 +L58 +R22 +L60 +L22 +L81 +L57 +R98 +L13 +R880 +L27 +L461 +R88 +R80 +L20 +R57 +R28 +R9 +L21 +R96 +R30 +R28 +L4 +R47 +R5 +L89 +L74 +L39 +L69 +R28 +R41 +L223 +R81 +R42 +R23 +R77 +L16 +R16 +L95 +R27 +L32 +R99 +L70 +L977 +R48 +L613 +L88 +L142 +L282 +R51 +R74 +R87 +R33 +R85 +R95 +L21 +R50 +L40 +L89 +L797 +L46 +L57 +L601 +R1 +R36 +R64 +L43 +R11 +R98 +L66 +R3 +R97 +R76 +L81 +R82 +L87 +L90 +L48 +L7 +R55 +R19 +R41 +R941 +R54 +L55 +R60 +L33 +L727 +R918 +R82 +R672 +R28 +L59 +R79 +L263 +R65 +R4 +R74 +R159 +L22 +R78 +R98 +L13 +L544 +L97 +R57 +L16 +R856 +R91 +L23 +R76 +R797 +R89 +R114 +L7 +L84 +R91 +R848 +L35 +R2 +L88 +R933 +L2 +L58 +R85 +L887 +R67 +L72 +L93 +L76 +L24 +L415 +L63 +R7 +R588 +L82 +L45 +L90 +L1 +R56 +R14 +L31 +L77 +L60 +R60 +R39 +L656 +R56 +R93 +R7 +L32 +L68 +L94 +R274 +R20 +L30 +L70 +L91 +R2 +L164 +L307 +R12 +R55 +R93 +L12 +R1 +L715 +R26 +R90 +L52 +R344 +L882 +R10 +R57 +L67 +R609 +R43 +R48 +L29 +L974 +L5 +L92 +R6 +R2 +L340 +R732 +L21 +L66 +L91 +R5 +L90 +R6 +L11 +R6 +L66 +R828 +L22 +R22 +L234 +L61 +R90 +R43 +R62 +L135 +R11 +L71 +L35 +L70 +L19 +R70 +L51 +L9 +R428 +L418 +L858 +R282 +R70 +R110 +L31 +R58 +R63 +L95 +L32 +R864 +L422 +R76 +R34 +L5 +R93 +R5 +L17 +R478 +R26 +L50 +L50 +R83 +L76 +R5 +R24 +L636 +L60 +L198 +L942 +R35 +L45 +R74 +R936 +R60 +R11 +L68 +R41 +L244 +R39 +L33 +R93 +R601 +R38 +L28 +L60 +R203 +R24 +L441 +L52 +R88 +R28 +L51 +R151 +R56 +L56 +R15 +L94 +R106 +L14 +L39 +L74 +R509 +L36 +R31 +L4 +R18 +L18 +R63 +L12 +R49 +R25 +R16 +L53 +R12 +R210 +R21 +L31 +R21 +R37 +R13 +R319 +R10 +R42 +R45 +R13 +L5 +L95 +R53 +L761 +R8 +L78 +L115 +L7 +R42 +L99 +R57 +L40 +L14 +R36 +R18 +R652 +L11 +L41 +R16 +R292 +R92 +R10 +L71 +L39 +L94 +L6 +L61 +R61 +L7 +L4 +L65 +L57 +R33 +L33 +L45 +R74 +R98 +L76 +R682 +L60 +L40 +R47 +L37 +R76 +R14 +R43 +R4 +R471 +L42 +R26 +L686 +R11 +R967 +R47 +L441 +L488 +R88 +L7 +L93 +L11 +L74 +R85 +R20 +L27 +L956 +L37 +L69 +L88 +R8 +L91 +L49 +L10 +L96 +L45 +L53 +L7 +L18 +R90 +R28 +R41 +R59 +R725 +R975 +L85 +L13 +L91 +R89 +R44 +R68 +R59 +L88 +L87 +L37 +L40 +R281 +R141 +R22 +R37 +R65 +R35 +L211 +L56 +R67 +R499 +R1 +R380 +R40 +L8 +R588 +L64 +R66 +L802 +L125 +L45 +L30 +L90 +L22 +L88 +L27 +R39 +R2 +L57 +R77 +R66 +L36 +L25 +R92 +R69 +R65 +R21 +R83 +L431 +L266 +R75 +R43 +L140 +L43 +R40 +R477 +L56 +L86 +R18 +L52 +L207 +R59 +R99 +R42 +R524 +R682 +R645 +R8 +R48 +L93 +L55 +L30 +L70 +L70 +L30 +L30 +R742 +L79 +L233 +R75 +L39 +R64 +R70 +R40 +L26 +L45 +L39 +L55 +L42 +R19 +R88 +R90 +L57 +L43 +R35 +R28 +R13 +R83 +L43 +R93 +R87 +R4 +R74 +L59 +L15 +L33 +L67 +R825 +R91 +R921 +L87 +L73 +R98 +L75 +L58 +L120 +R78 +L12 +R12 +L25 +L75 +L85 +R72 +L87 +L17 +L277 +R80 +L85 +L1 +R477 +R27 +R91 +R68 +L41 +L924 +R49 +R53 +L9 +L391 +R78 +L532 +R46 +R15 +R28 +R37 +L57 +L315 +L25 +L8 +R49 +R8 +R11 +L86 +L10 +L139 +L95 +R71 +L26 +R90 +L447 +L92 +R99 +R14 +R86 +R83 +L44 +L419 +L780 +L74 +R634 +L429 +R50 +R42 +R37 +L93 +L625 +R126 +L8 +L19 +L59 +L22 +L147 +R47 +R48 +R5 +L53 +R687 +R13 +R45 +R26 +R29 +R49 +L61 +R351 +L24 +R85 +R444 +R656 +L13 +L41 +R54 +L87 +L43 +L61 +R58 +R231 +R735 +R67 +L20 +L280 +L61 +L65 +R987 +L50 +L252 +R877 +R359 +L95 +R14 +L92 +R7 +R715 +L644 +R65 +L74 +L959 +R53 +L85 +L57 +R757 +L45 +L959 +L96 +R73 +L473 +R345 +R73 +L39 +L179 +L668 +R46 +L30 +L63 +R10 +L25 +R30 +R468 +R35 +R96 +L99 +R7 +L63 +R73 +L17 +R85 +R15 +L51 +R18 +L67 +L852 +R3 +R499 +L50 +L83 +R583 +R429 +L25 +R96 +L123 +R776 +R45 +R2 +R201 +L34 +L18 +L34 +R63 +R712 +R46 +R96 +L363 +R78 +R23 +R30 +R26 +L45 +R19 +L15 +L85 +R558 +R42 +L72 +L539 +R603 +L92 +R90 +L172 +L34 +L88 +L97 +R1 +L57 +L13 +L72 +R42 +R30 +R15 +R85 +R69 +R97 +R4 +L76 +L61 +R72 +L35 +L72 +R83 +R45 +R44 +R66 +R5 +R94 +L60 +R91 +L63 +R12 +R4 +L549 +R10 +L10 +L31 +R7 +R924 +L9 +L21 +R13 +L83 +R99 +R120 +L1 +R182 +L259 +R59 +L637 +L63 +L36 +R952 +R43 +R55 +R86 +L97 +L79 +L505 +R181 +R483 +L43 +R7 +L47 +R884 +L25 +L93 +R45 +R83 +L73 +L21 +L942 +R342 +L55 +L54 +R53 +R56 +R7 +L530 +L19 +L58 +L38 +R755 +R48 +L53 +R88 +R32 +R24 +R85 +L41 +L76 +R54 +L19 +R304 +R28 +L104 +R389 +L76 +L80 +L62 +L58 +R90 +R676 +L66 +R98 +R15 +L66 +R623 +R39 +L72 +R90 +L39 +L288 +R93 +R7 +R43 +L743 +R91 +R9 +R33 +L17 +R53 +L2 +L565 +R16 +R82 +L62 +R54 +L692 +R89 +L10 +L71 +R504 +L7 +R95 +R80 +L56 +L224 +L297 +R97 +R32 +R846 +L65 +L13 +L3 +R3 +L48 +R176 +R972 +L59 +R59 +L93 +R79 +R30 +L2 +L14 +L320 +R20 +L72 +R61 +L4 +R82 +L93 +R726 +L89 +R560 +R29 +R79 +R72 +L165 +L36 +L7 +L32 +R89 +L4 +L96 +R749 +R51 +R903 +L10 +L71 +R96 +L18 +R774 +R75 +L77 +L72 +L82 +R82 +R99 +R31 +R70 +R88 +R12 +R50 +L90 +L99 +L64 +L69 +R915 +R57 +L37 +R37 +R68 +L53 +L915 +R27 +L58 +R302 +R8 +L73 +L6 +R814 +L73 +L41 +L54 +L13 +L190 +L83 +L42 +L18 +L566 +L234 +R307 +R97 +L19 +L75 +L10 +R66 +L66 +R87 +R13 +L97 +L91 +R66 +L78 +L3 +R570 +R38 +L621 +R23 +R67 +L50 +L48 +L3 +R627 +R68 +L568 +L15 +L685 +L34 +R99 +L27 +L38 +L25 +R957 +L38 +R79 +L790 +L507 +R24 +R155 +R45 +R2 +R51 +L71 +L19 +R37 +L33 +R80 +R53 +R90 +R59 +L49 +L238 +L962 +L987 +L11 +L2 +R19 +R26 +R58 +L54 +R90 +L82 +R61 +R4 +L61 +R239 +R32 +R68 +L39 +R39 +R5 +R95 +R109 +L609 +R239 +R762 +R89 +L590 +L95 +L99 +L8 +L998 +R217 +R183 +L92 +L416 +R8 +R282 +L53 +L133 +R704 +L97 +R97 +R63 +R35 +L511 +R213 +L68 +L32 +L3 +R3 +R39 +R88 +L27 +L88 +L63 +L191 +L171 +R42 +R823 +R66 +R21 +L728 +R37 +L48 +L60 +R38 +R22 +L63 +L2 +R45 +R20 +L47 +L68 +R19 +L34 +R30 +R91 +L43 +R75 +L90 +L62 +L20 +L294 +L57 +L87 +L6 +L33 +R6 +R20 +L47 +R65 +L718 +R80 +R20 +L887 +R22 +L35 +L98 +L2 +L57 +L43 +L10 +L90 +R87 +L87 +R95 +L822 +L52 +R35 +L80 +R824 +L28 +R2 +R26 +R90 +L90 +R69 +L269 +R79 +R21 +R55 +R77 +R51 +R73 +R64 +R80 +R75 +L19 +L29 +L379 +R52 +R22 +R19 +L41 +L51 +L57 +R8 +L76 +L626 +R2 +R64 +R36 +R16 +R27 +L21 +R16 +L69 +R80 +R46 +L809 +R9 +R175 +L989 +L781 +L472 +L983 +R98 +R13 +R91 +L63 +L19 +L91 +L1 +R20 +L665 +R72 +R736 +L33 +R97 +L78 +L46 +L20 +L56 +L7 +L536 +L57 +L5 +L554 +R17 +R91 +L57 +R16 +R40 +R44 +L92 +L24 +L744 +R68 +L65 +R24 +L659 +R322 +R90 +R88 +L16 +R69 +R4 +R90 +L56 +L891 +R55 +R87 +L72 +L96 +L687 +L21 +L62 +L93 +L16 +R38 +L513 +R56 +L3 +R27 +R73 +L73 +R275 +R70 +R73 +L59 +L71 +L862 +R74 +L823 +L16 +R16 +L981 +R26 +R1 +L23 +L982 +R78 +R90 +R14 +R334 +L59 +R82 +R26 +L21 +R38 +L5 +L95 +R541 +R16 +R39 +L74 +L22 +L13 +L64 +L458 +R35 +L86 +L14 +R96 +L64 +L31 +L53 +L2 +L46 +R43 +L87 +R9 +L705 +L44 +R42 +R42 +L740 +R53 +L19 +L27 +R33 +L68 +L46 +R514 +L38 +L62 +L64 +L70 +R34 +L597 +R97 +L14 +L68 +L30 +L11 +L377 +R518 +R36 +R57 +R55 +L5 +L61 +R387 +R2 +R211 +R39 +R61 +R94 +L66 +R72 +R63 +R40 +R97 +L555 +L49 +L5 +R951 +R58 +L91 +R91 +L48 +R960 +R18 +R70 +R65 +L65 +R966 +R5 +L71 +L62 +L39 +L295 +R10 +R86 +L83 +R83 +R42 +L42 +R20 +R80 +L39 +R2 +L3 +L145 +R85 +L64 +R64 +L17 +L58 +R75 +R23 +R58 +L81 +R14 +R86 +L47 +L742 +L11 +R48 +L448 +L660 +R58 +L85 +L13 +L65 +R25 +R70 +L730 +L80 +L20 +R673 +L74 +L60 +R17 +L56 +L11 +R11 +L458 +L42 +L634 +L86 +L485 +L95 +L26 +R27 +R89 +L8 +L82 +R95 +R85 +R7 +R8 +L295 +L54 +L51 +L48 +L30 +L42 +R325 +L779 +L21 +R7 +L42 +R33 +R30 +L28 +L61 +R45 +R4 +R412 +R2 +L21 +L49 +L14 +L18 +L34 +R96 +L321 +R59 +L58 +R6 +L834 +R804 +L71 +R67 +R920 +R881 +L66 +L49 +R33 +L640 +L818 +L75 +L96 +R85 +R11 +L44 +R508 +L5 +L839 +L68 +R94 +L46 +L37 +R45 +L925 +L83 +L52 +R652 +R64 +R236 +L6 +L894 +L53 +R69 +L16 +R7 +R1 +R63 +R29 +L78 +R67 +R11 +L94 +R294 +R346 +L74 +L29 +R431 +R726 +R37 +L661 +R27 +L892 +L411 +L2 +L98 +L79 +R7 +R94 +R467 +L11 +R22 +L41 +L72 +R20 +L94 +L313 +R51 +R78 +R771 +R86 +L75 +L59 +R48 +R67 +L90 +R29 +R690 +R130 +R57 +R13 +R610 +L6 +R65 +R756 +L83 +R17 +R86 +R467 +R64 +L610 +L554 +R44 +R48 +L54 +R76 +R78 +L10 +L12 +L15 +R69 +L63 +R15 +L86 +L19 +L79 +L79 +R33 +R16 +R98 +L58 +R954 +R27 +L81 +R50 +R5 +R852 +R83 +L72 +R88 +R716 +R23 +L63 +L92 +L71 +R45 +R854 +L16 +L12 +R80 +R41 +L35 +R53 +L73 +R99 +L34 +R69 +L37 +L63 +R47 +R90 +R430 +R84 +L54 +R7 +R28 +R73 +L805 +R565 +L938 +R740 +R249 +L21 +R21 +R484 +R23 +R744 +L25 +L542 +L34 +L66 +L19 +L27 +R13 +L6 +R37 +R523 +R579 +L90 +R90 +R17 +L61 +L45 +R81 +R81 +L73 +L31 +R831 +R83 +R17 +L38 +L62 +L614 +R66 +L381 +R81 +R846 +R15 +L69 +R85 +L26 +L3 +L30 +R50 +L98 +L22 +R19 +L21 +L28 +L70 +L54 +R54 +R678 +L94 +L92 +L692 +L57 +R57 +R42 +R58 +L92 +R58 +R34 +R43 +R57 +R24 +L24 +R22 +R11 +R67 +L79 +L49 +R628 +L4 +L96 +R33 +L664 +R23 +L49 +L643 +L40 +R17 +L60 +L76 +R59 +L90 +L10 +R991 +R9 +L16 +R220 +L17 +R22 +L9 +R79 +L17 +L98 +L12 +L63 +R11 +L737 +R37 +L82 +L18 +R41 +L41 +L568 +R68 +R11 +L58 +R524 +L58 +L74 +L91 +R46 +R29 +L29 +R66 +R2 +R34 +R84 +L86 +L361 +R61 +R711 +R9 +R81 +R470 +R7 +L78 +L962 +L93 +R55 +R877 +R423 +R86 +L73 +R44 +R75 +R43 +R81 +L969 +L87 +R32 +R35 +L133 +L34 +R554 +L54 +R33 +R24 +L831 +L126 +L23 +R83 +L96 +L64 +R543 +L10 +L15 +L7 +L11 +L4 +R58 +L196 +L51 +L7 +R65 +R665 +R70 +L97 +L3 +L73 +L27 +R57 +L57 +L20 +L80 +R66 +L82 +R90 +L658 +L32 +L59 +R75 +R25 +L471 +L3 +R98 +L49 +R371 +R99 +R30 +L26 +R626 +L4 +L18 +R64 +L746 +L96 +R381 +R51 +R153 +R15 +L33 +L85 +R1 +L2 +R59 +R92 +L32 +L379 +L42 +L70 +L49 +L60 +L92 +R7 +L39 +R389 +L7 +L236 +R43 +R78 +L643 +R33 +L33 +L15 +L373 +R42 +L39 +R85 +R7 +R93 +R75 +L618 +R43 +L93 +L7 +R573 +L73 +R33 +L24 +R91 +R2 +L299 +L54 +L49 +L36 +R36 +L93 +L7 +L42 +L14 +L76 +L468 +L58 +R72 +R7 +R79 +L52 +R267 +R585 +L28 +L72 +L3 +L97 +L41 +R91 +L50 +R80 +L625 +R720 +R25 +L439 +R89 +R51 +L1 +R78 +R588 +L66 +L98 +L120 +R18 +L29 +R83 +L51 +L62 +L77 +L564 +L51 +R32 +R19 +L39 +L802 +L59 +R72 +R228 +L89 +L774 +L36 +R91 +R36 +L62 +R79 +R164 +L9 +L49 +R53 +L47 +L57 +R49 +L49 +R9 +R23 +R198 +L30 +L8 +L70 +R17 +L41 +R102 +L523 +L677 +R49 +L49 +L137 +L16 +R66 +R91 +L82 +R44 +L11 +R45 +L90 +R99 +L9 +L45 +L43 +R14 +L84 +L16 +L26 +R198 +R39 +R64 +L78 +L10 +R87 +R98 +R22 +L20 +L986 +L33 +R52 +L58 +L75 +L160 +R60 +R565 +R35 +R48 +R82 +L130 +R40 +R60 +R81 +R94 +L4 +L62 +R187 +L97 +R6 +L753 +R48 +R1 +R99 +L13 +L87 +L19 +R1 +L99 +R417 +L49 +L451 +L61 +R484 +L76 +R57 +L61 +L10 +L87 +R54 +R30 +R52 +L6 +R24 +R282 +R761 +L25 +L737 +R19 +R82 +L82 +R35 +R64 +R1 +L87 +R87 +L683 +R50 +R794 +L526 +R2 +R23 +L60 +R25 +L25 +L39 +L76 +L11 +R23 +R69 +L8 +L358 +R31 +L29 +L262 +L5 +L7 +L44 +R986 +R661 +L18 +L13 +R98 +R2 +R57 +L54 +L948 +R45 +R86 +L33 +R58 +L11 +R750 +L92 +L90 +R232 +R166 +L821 +L11 +R66 +L31 +R31 +R552 +R62 +L14 +R93 +R543 +L1 +R54 +L81 +R131 +R36 +R25 +R97 +R949 +L448 +R88 +R14 +L48 +L83 +R740 +L9 +R67 +L65 +L64 +R63 +R88 +L19 +L37 +R859 +L21 +L71 +R23 +L77 +L3 +L927 +R72 +L73 +R85 +R68 +R38 +R94 +L425 +L75 +L25 +R17 +L889 +L3 +R6 +L22 +R5 +L43 +R83 +R71 +L14 +R43 +L29 +R60 +L2 +R42 +L8 +L92 +R634 +L819 +R303 +R50 +R32 +R49 +L9 +L80 +R529 +L5 +R4 +L38 +L50 +R11 +R298 +L9 +L115 +L2 +R17 +L72 +L474 +L8 +L192 +L69 +L379 +R26 +R68 +R98 +R2 +L52 +R59 +R593 +L83 +L43 +R26 +L54 +R15 +L61 +L89 +R83 +R12 +L6 +L268 +L1 +R46 +L95 +L884 +L57 +R59 +R263 +L29 +R66 +R95 +L255 +R98 +R255 +R7 +R51 +L14 +R86 +L63 +L360 +R74 +R652 +L665 +R98 +R41 +L68 +R33 +R605 +L60 +R97 +R93 +L466 +R66 +R655 +L32 +L23 +R481 +L76 +L5 +L12 +R3 +L698 +L78 +L546 +R63 +R968 +L56 +R56 +R53 +L56 +R56 +R30 +R88 +L38 +L33 +R17 +R30 +L47 +L98 +R652 +R46 +R68 +L62 +L22 +R16 +R3 +L15 +L10 +L78 +L657 +L88 +R645 +R21 +L545 +R88 +R27 +L91 +R63 +R37 +L36 +L58 +R115 +R65 +L86 +R84 +L98 +L76 +L7 +L574 +R38 +R38 +L131 +L87 +R27 +R3 +L717 +R28 +R80 +L8 +R526 +R59 +L18 +R46 +R84 +R13 +L6 +R75 +R19 +L985 +R61 +R26 +R15 +L98 +R83 +R78 +L1 +L3 +L33 +R96 +R49 +L38 +L54 +L72 +L34 +L88 +L363 +L34 +L64 +R661 +L629 +L71 +L21 +R21 +R45 +L45 +L21 +L79 +L84 +R12 +R572 +L849 +R25 +R32 +L183 +L95 +L18 +R31 +L643 +L80 +L203 +L17 +L1 +L458 +R64 +R29 +R54 +L86 +L34 +R62 +R22 +L52 +L645 +L54 +L121 +L80 +R47 +R53 +R54 +R746 +R38 +L38 +L3 +L10 +R13 +L88 +L15 +L59 +L38 +L88 +L12 +L57 +R857 +L707 +L98 +R5 +R476 +L569 +L858 +L49 +L33 +R97 +R55 +L70 +L23 +L99 +R73 +L20 +R16 +L36 +L59 +R54 +L55 +L40 +L660 +R47 +R53 +R832 +L1 +L29 +L414 +R944 +L50 +L65 +L75 +L93 +L49 +L79 +R887 +L74 +R74 +R92 +L13 +R826 +L13 +R90 +R56 +R54 +L230 +R28 +R43 +R11 +L861 +L91 +L709 +R609 +L24 +L879 +R3 +R13 +R587 +L366 +L34 +L569 +L42 +L89 +L84 +R53 +L369 +R45 +R55 +R7 +R79 +R16 +R98 +R430 +R588 +R82 +L32 +R32 +R96 +L155 +L45 +R70 +R23 +L76 +L79 +R29 +L38 +R98 +R177 +R46 +R61 +L7 +L90 +L67 +L64 +L76 +L54 +R213 +R38 +L9 +R61 +R948 +R796 +R84 +L11 +R31 +R35 +R324 +L55 +R68 +L96 +R52 +L40 +L28 +R769 +L29 +R30 +R71 +R724 +R86 +R60 +R74 +L63 +L663 +R94 +L22 +R409 +R715 +R85 +L697 +L258 +L45 +L8 +L92 +L40 +L212 +L843 +R92 +L96 +R22 +L23 +R35 +L35 +R21 +R69 +L37 +L32 +R87 +L28 +L380 +R31 +R69 +R96 +L96 +L85 +L84 +L31 +R18 +R925 +L362 +R25 +R6 +L12 +R88 +L88 +R37 +L58 +L79 +L284 +L34 +R37 +R81 +L148 +R48 +L79 +L21 +R811 +R51 +L56 +R66 +L18 +R946 +L298 +L72 +L349 +R19 +L617 +R17 +L9 +L50 +L41 +R54 +L54 +L6 +R11 +L795 +R89 +R81 +L80 +L321 +R84 +R37 +R32 +L32 +R829 +L6 +R677 +R10 +L74 +R28 +L927 +L37 +L45 +R54 +L31 +R33 +R99 +R84 +R64 +R42 +L4 +L49 +R53 +R36 +R28 +L5 +R29 +R12 +L63 +L67 +R159 +R437 +L66 +L37 +R51 +L22 +R885 +L77 +R24 +L30 +R48 +R95 +R70 +L30 +L54 +R214 +L34 +L103 +L84 +L33 +R317 +L476 +R31 +R41 +L47 +R55 +R96 +L626 +R34 +R92 +L665 +R142 +L362 +R561 +R67 +R96 +L2 +L37 +L83 +R783 +R90 +R70 +L55 +R495 +R25 +L973 +R56 +L54 +R46 +L59 +L7 +L93 +L79 +R38 +L21 +R858 +L732 +R709 +R76 +R41 +R69 +L28 +L5 +L34 +R13 +L26 +L20 +R80 +R20 +L691 +R29 +L76 +L108 +R37 +L277 +R97 +R31 +L42 +L56 +R98 +L94 +R34 +R39 +L902 +R81 +L73 +L27 +R931 +R69 +L62 +R58 +R20 +L51 +R54 +R29 +R82 +L830 +L446 +L41 +R87 +R935 +L952 +R17 +L83 +R99 +L16 +R41 +L41 +L77 +R98 +L15 +L6 +L889 +R88 +R1 +L426 +R26 +R59 +L59 +R646 +L68 +R935 +L813 +L66 +L59 +L43 +L24 +L34 +L74 +L928 +L88 +L25 +L696 +L55 +R54 +R84 +R8 +L75 +L79 +R83 +R72 +R45 +R136 +R78 +L79 +R50 +L90 +R5 +R52 +R848 +L38 +L87 +R95 +R30 +L83 +L88 +R66 +R94 +L89 +R95 +R472 +R33 +R8 +R92 +L193 +R89 +R204 +L57 +R57 +L74 +L68 +R742 +R70 +R76 +L92 +R42 +R56 +L54 +R702 +R831 +L31 +L307 +L21 +R30 +R158 +L60 +R20 +R80 +L26 +L90 +R709 +L520 +R59 +L32 +L592 +L8 +R33 +R54 +R13 +R98 +L476 +R46 +L68 +L26 +R858 +L36 +L13 +R43 +R74 +L7 +L193 +L31 +L66 +L203 +L354 +R18 +L64 +L668 +R68 +L54 +R52 +L98 +R65 +R21 +L91 +L11 +R96 +R31 +L11 +R197 +L63 +L23 +R20 +L44 +R73 +R65 +R75 +L13 +L87 +L62 +R84 +L98 +L68 +R44 +R65 +R735 +R38 +R62 +R97 +L97 +R98 +R97 +R95 +R10 +L374 +L16 +L8 +L7 +R88 +R17 +L1 +L99 +R57 +L57 +R76 +L76 +R711 +R55 +L83 +L83 +R42 +R1 +R57 +R71 +R29 +R357 +L75 +R89 +L35 +R82 +L558 +R79 +R61 +R18 +L18 +R99 +L440 +L559 +R25 +L25 +L278 +L22 +L30 +L11 +R41 +R40 +L81 +R96 +L898 +L50 +L7 +R32 +L701 +R69 +R36 +R14 +L406 +R56 +L15 +R63 +R27 +L84 +L41 +R20 +L37 +L194 +L39 +L641 +L59 +L571 +R25 +L63 +L67 +R3 +L27 +R110 +L12 +R64 +R666 +L72 +R43 +R856 +L30 +L25 +L18 +L4 +R10 +R12 +R271 +L58 +L26 +L289 +R672 +L22 +R52 +L425 +R71 +R204 +L34 +L75 +L241 +R38 +L295 +L143 +R76 +L40 +L852 +R35 +L19 +R94 +R45 +R45 +R73 +R774 +R30 +L34 +L91 +R560 +L35 +L61 +R95 +R27 +R454 +R367 +L43 +R45 +L16 +L59 +R9 +R1 +R98 +L78 +L63 +R74 +R91 +R96 +R2 +L7 +R7 +R270 +L70 +L10 +L85 +L79 +L26 +R25 +L25 +R838 +R19 +R43 +L65 +R39 +L774 +L62 +L38 +L41 +R48 +R6 +R67 +R980 +L764 +L462 +L34 +L9 +R554 +R44 +R93 +L81 +L201 +L95 +L678 +L33 +R48 +L42 +L12 +L149 +L39 +L946 +R147 +L758 +L759 +R16 +L17 +R85 +L15 +L53 +L47 +R97 +L17 +L633 +L36 +R899 +L48 +R68 +L83 +L664 +R2 +L85 +L253 +R42 +L594 +R55 +L92 +R54 +L10 +R48 +R684 +R713 +R58 +R7 +R96 +L61 +R883 +L83 +L84 +R4 +R80 +L34 +R898 +R10 +R944 +L867 +L51 +L2 +R23 +L994 +L27 +R34 +L424 +R90 +R655 +L54 +L1 +R66 +L13 +R35 +L93 +L95 +R37 +L23 +L14 +R75 +L75 +L31 +L29 +L40 +L24 +R86 +R11 +R27 +R39 +R61 +L233 +R9 +L992 +R55 +R61 +R417 +R83 +R892 +R3 +L58 +R63 +L22 +L74 +R701 +L5 +R23 +L90 +L73 +L81 +L43 +L89 +L93 +L54 +L56 +L44 +L341 +R5 +R7 +L36 +L35 +R79 +R21 +L834 +R213 +R5 +R502 +R14 +R70 +R30 +R31 +R69 +R34 +R347 +L22 +R39 +R88 +R782 +L60 +R80 +R312 +R579 +L79 +L19 +L81 +R113 +R13 +L26 +R30 +L43 +L632 +R45 +L12 +R994 +L53 +L79 +R550 +L32 +R46 +L14 +R4 +L61 +L43 +L9 +R67 +R44 +L87 +L15 +L11 +L62 +L856 +R40 +R46 +L92 +L65 +R2 +R35 +L34 +L23 +L924 +R41 +L42 +R64 +R70 +L89 +L243 +R22 +L79 +L56 +L344 +L33 +L67 +L94 +R94 +R42 +L42 +R20 +R93 +L63 +L77 +L73 +R28 +R10 +R82 +L66 +R46 +R40 +L36 +L29 +R841 +R95 +L55 +R88 +L44 +L428 +R28 +R42 +L11 +R785 +R930 +L46 +R448 +L48 +R99 +R1 +L391 +R91 +R74 +R26 +L59 +R59 +L92 +R49 +R39 +L96 +R22 +R78 +R6 +R80 +L89 +L465 +L98 +L234 +L23 +R23 +R64 +R33 +L37 +R207 +R59 +L87 +R3 +L71 +L18 +L861 +L64 +R551 +L79 +L20 +R790 +L70 +R45 +R35 +L92 +R25 +L13 +L68 +L32 +L65 +R65 +L2 +R657 +L60 +L95 +R40 +R760 +L599 +R99 +R41 +R41 +R88 +L70 +L37 +R7 +L27 +L43 +R35 +L449 +L86 +L74 +R7 +R92 +L268 +R43 +R391 +R55 +R64 +R51 +R99 +L685 +L47 +L28 +L42 +L58 +R28 +R372 +L11 +L89 +R371 +L3 +L68 +L38 +R79 +L43 +L998 +L9 +R676 +R556 +R147 +L622 +R52 +R6 +R48 +R7 +R539 +R192 +R42 +R66 +R43 +R526 +L91 +L548 +L81 +R851 +R80 +L57 +R23 +R13 +R899 +L33 +R51 +R37 +R87 +R95 +L95 +L62 +L38 +R66 +L44 +R37 +L990 +L69 +R95 +L94 +L701 +R98 +L98 +R42 +L42 +L36 +L64 +L10 +R41 +L31 +L56 +R56 +L98 +R62 +R60 +L24 +R762 +R941 +R42 +R524 +R931 +L757 +R66 +L66 +L25 +R44 +R88 +R16 +R29 +R80 +R25 +R52 +R462 +R19 +R83 +L673 +L43 +L88 +R88 +R962 +R40 +R98 +R452 +R48 +R429 +R27 +L56 +R253 +R135 +L78 +R90 +L59 +R19 +R40 +R154 +L53 +L1 +L36 +R536 +L88 +L73 +R85 +L22 +R65 +R278 +R16 +R59 +L19 +R99 +R98 +L98 +R46 +L46 +R80 +L149 +R82 +L813 +L82 +R29 +R53 +L71 +L38 +R79 +R75 +L45 +L40 +R40 +L42 +L29 +L29 +L84 +L92 +L24 +L21 +R93 +L14 +R42 +L68 +L17 +L37 +L72 +R17 +L27 +R4 +L73 +R48 +R94 +L69 +R17 +R51 +L68 +L38 +L62 +L44 +L40 +L44 +R51 +L39 +R54 +L14 +L91 +R30 +R94 +L57 +R64 +R36 +R76 +L24 +L70 +L82 +L6 +L17 +R5 +R47 +L49 +L19 +L6 +R29 +R40 +L46 +R40 +R32 +R5 +L20 +L3 +L3 +R45 +L15 +R26 +R22 +R6 +R7 +L22 +L21 +L23 +R33 +R43 +R33 +L46 +R29 +L2 +L1 +L38 +L22 +R9 +L13 +L8 +R40 +L24 +L44 +R28 +R37 +L21 +R38 +R26 +R34 +L47 +L19 +L8 +R48 diff --git a/cmd/day1/main.go b/cmd/day1/main.go new file mode 100644 index 0000000..49b0385 --- /dev/null +++ b/cmd/day1/main.go @@ -0,0 +1,147 @@ +package main + +import ( + "bufio" + "errors" + "flag" + "fmt" + "log" + "os" + "strconv" +) + +func main() { + debug := flag.Bool("debug", false, "Debug flag.") + flag.Parse() + + d1 := dial{n: 50} + d2 := dial{n: 50} + if *debug { + fmt.Println("LINE d1 d2") + fmt.Println(" 50 50") + } + + sc := bufio.NewScanner(os.Stdin) + for sc.Scan() { + if sc.Text() == "" { + log.Fatal("empty line") + } + n, err := strconv.ParseUint(sc.Text()[1:], 10, 0) + if err != nil { + log.Fatal(err) + } + i := int(n) + if sc.Text()[0] == 'L' { + i = -int(n) + } + + // if err := handleLine(d1.Add1, sc.Text()); err != nil { + // log.Fatal(err) + // } + if err := handleLine(d1.Add1, sc.Text()); err != nil { + log.Fatal(err) + } + if err := handleLine(d2.Add2, sc.Text()); err != nil { + log.Fatal(err) + } + if *debug { + fmt.Printf("%+4d %2d %2d (%+3d %+3d)\n", i, d1.n, d2.n, d1.lastClicks, d2.lastClicks) + } + } + if err := sc.Err(); err != nil { + log.Fatal(err) + } + + fmt.Println("zeros:", d1.zeros, d2.zeros) + fmt.Println("zero passes:", d1.zeroClicks, d2.zeroClicks) +} + +func handleLine(add func(int), line string) error { + if line == "" { + return errors.New("empty line") + } + n, err := strconv.ParseUint(line[1:], 10, 0) + if err != nil { + return err + } + switch line[0] { + case 'L': + add(-int(n)) + return nil + case 'R': + add(int(n)) + return nil + default: + return fmt.Errorf("unexpected line: %q", line) + } +} + +type dial struct { + n int + lastClicks int + zeros int + zeroClicks int +} + +func (d *dial) Add1(n int) { + wasAtZero := d.n == 0 + d.n += n + step := +100 + if d.n < 0 { + step = -100 + } + d.lastClicks = 0 + for d.n < 0 || d.n > 99 { + d.lastClicks++ + d.n -= step + } + if d.lastClicks > 0 && wasAtZero { + d.lastClicks-- + } + if d.n == 0 { + d.zeros++ + if d.lastClicks == 0 { + d.lastClicks++ + } + } + d.zeroClicks += d.lastClicks +} + +func (d *dial) Add2(diff int) { + n := d.n + diff + + var clicks int + switch { + case n < 0: + wasAtZero := d.n == 0 + for n < 0 { + if wasAtZero { + wasAtZero = false + } else { + clicks++ + } + n += 100 + } + if n == 0 && !wasAtZero { + clicks++ + } + + case n > 99: + for n > 99 { + clicks++ + n -= 100 + } + + default: + if n == 0 && d.n != 0 { + clicks++ + } + } + + if n == 0 { + d.zeros++ + } + d.n = n + d.lastClicks = clicks + d.zeroClicks += clicks +} diff --git a/cmd/day1/main_test.go b/cmd/day1/main_test.go new file mode 100644 index 0000000..6ec28bc --- /dev/null +++ b/cmd/day1/main_test.go @@ -0,0 +1,80 @@ +package main + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_dial_Add2(t *testing.T) { + tests := []struct { + start int + turn int + want int + wantClicks int + }{ + { + start: 50, + turn: 300, + want: 50, + wantClicks: 3, + }, + { + start: 50, + turn: -300, + want: 50, + wantClicks: 3, + }, + + { + start: 0, + turn: -100, + want: 0, + wantClicks: 1, + }, + { + start: 1, + turn: -101, + want: 0, + wantClicks: 2, + }, + { + start: 99, + turn: -199, + want: 0, + wantClicks: 2, + }, + + { + start: 0, + turn: 100, + want: 0, + wantClicks: 1, + }, + { + start: 99, + turn: 101, + want: 0, + wantClicks: 2, + }, + { + start: 1, + turn: 199, + want: 0, + wantClicks: 2, + }, + } + for _, tt := range tests { + name := fmt.Sprintf("R%d", tt.turn) + if tt.turn < 0 { + name = fmt.Sprintf("L%d", -tt.turn) + } + t.Run(name, func(t *testing.T) { + d := dial{n: tt.start} + d.Add2(tt.turn) + assert.Equal(t, tt.want, d.n, "dial") + assert.Equal(t, tt.wantClicks, d.zeroClicks, "clicks") + }) + } +} diff --git a/cmd/day2/digits.go b/cmd/day2/digits.go new file mode 100644 index 0000000..3b55ba2 --- /dev/null +++ b/cmd/day2/digits.go @@ -0,0 +1,22 @@ +package main + +func digits(n uint) []uint8 { + if n == 0 { + return []uint8{0} + } + var digits []uint8 + for ; n != 0; n /= 10 { + digits = append(digits, uint8(n%10)) + } + return digits +} + +func number(digits []uint8) uint { + var n uint + base := uint(1) + for _, d := range digits { + n += uint(d) * base + base *= 10 + } + return n +} diff --git a/cmd/day2/digits_test.go b/cmd/day2/digits_test.go new file mode 100644 index 0000000..3f36657 --- /dev/null +++ b/cmd/day2/digits_test.go @@ -0,0 +1,30 @@ +package main + +import ( + "strconv" + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_digits_number(t *testing.T) { + tests := []struct { + n uint + d []uint8 + }{ + {n: 0, d: []uint8{0}}, + {n: 1234, d: []uint8{4, 3, 2, 1}}, + {n: 12345, d: []uint8{5, 4, 3, 2, 1}}, + } + for _, tt := range tests { + name := strconv.FormatUint(uint64(tt.n), 10) + t.Run(name, func(t *testing.T) { + t.Run("digits", func(t *testing.T) { + assert.Equal(t, tt.d, digits(tt.n)) + }) + t.Run("number", func(t *testing.T) { + assert.Equal(t, tt.n, number(tt.d)) + }) + }) + } +} diff --git a/cmd/day2/example.txt b/cmd/day2/example.txt new file mode 100644 index 0000000..a3f22ef --- /dev/null +++ b/cmd/day2/example.txt @@ -0,0 +1 @@ +11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124 diff --git a/cmd/day2/input.txt b/cmd/day2/input.txt new file mode 100644 index 0000000..f3832db --- /dev/null +++ b/cmd/day2/input.txt @@ -0,0 +1 @@ +959516-995437,389276443-389465477,683-1336,15687-26722,91613-136893,4-18,6736-12582,92850684-93066214,65-101,6868676926-6868700146,535033-570760,826141-957696,365650-534331,1502-2812,309789-352254,79110404-79172400,18286593-18485520,34376-65398,26-63,3333208697-3333457635,202007-307147,1859689-1936942,9959142-10053234,2318919-2420944,5142771457-5142940464,1036065-1206184,46314118-46413048,3367-6093,237-481,591751-793578 diff --git a/cmd/day2/main.go b/cmd/day2/main.go new file mode 100644 index 0000000..d077e27 --- /dev/null +++ b/cmd/day2/main.go @@ -0,0 +1,97 @@ +package main + +import ( + "flag" + "fmt" + "log" + "math" + "os" + "slices" +) + +func main() { + debug := flag.Bool("debug", false, "Debug.") + flag.Parse() + + ranges, err := readRanges(os.Stdin) + if err != nil { + log.Fatal(err) + } + + var sum1, sum2 uint + for _, r := range ranges { + invalid1 := handleRange(r, scanPart1) + invalid2 := handleRange(r, scanPart2) + + if *debug { + fmt.Printf("range: %d-%d\n", r.from, r.to) + } + if *debug && len(invalid1) > 0 { + fmt.Println("invalid (part 1):") + for _, id := range invalid1 { + fmt.Printf(" %d\n", id) + } + } + if *debug && len(invalid2) > 0 { + fmt.Println("invalid (part 2):") + for _, id := range invalid2 { + fmt.Printf(" %d\n", id) + } + } + + for _, id := range invalid1 { + sum1 += id + } + for _, id := range invalid2 { + sum2 += id + } + } + + fmt.Println("sum (part 1):", sum1) + fmt.Println("sum (part 2):", sum2) +} + +func handleRange(r idRange, scan func(id uint) (advance uint, ok bool)) []uint { + var invalid []uint + for id := r.from; id <= r.to; { + advance, ok := scan(id) + if !ok { + invalid = append(invalid, id) + } + id += advance + } + return invalid +} + +func scanPart1(id uint) (advance uint, ok bool) { + digits := digits(id) + if len(digits)%2 == 1 { // odd is always valid + nextSmallestEven := uint(math.Pow10(len(digits))) + return nextSmallestEven - id, true + } + var ( + x = uint(math.Pow10(len(digits) / 2)) + left = id / x + right = id % x + ) + return 1, left != right +} + +func scanPart2(id uint) (advance uint, ok bool) { + digits := digits(id) + if len(digits) <= 1 { + return 1, true + } + +loop: + for i := 1; i <= len(digits)/2; i++ { + ref := digits[:i] + for chunk := range slices.Chunk(digits, i) { + if !slices.Equal(chunk, ref) { + continue loop + } + } + return 1, false + } + return 1, true +} diff --git a/cmd/day2/main_test.go b/cmd/day2/main_test.go new file mode 100644 index 0000000..4bf2d16 --- /dev/null +++ b/cmd/day2/main_test.go @@ -0,0 +1,77 @@ +package main + +import ( + "strconv" + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_scanPart1(t *testing.T) { + tests := []struct { + id uint + advance uint + ok bool + }{ + // { + // id: 9, + // advance: 1, + // ok: true, + // }, + // { + // id: 10, + // advance: 1, + // ok: true, + // }, + // { + // id: 11, + // advance: 1, + // ok: false, + // }, + // { + // id: 99, + // advance: 1, + // ok: false, + // }, + // { + // id: 100, + // advance: 900, + // ok: true, + // }, + { + id: 1234, + advance: 1, + ok: true, + }, + } + for _, tt := range tests { + name := strconv.FormatUint(uint64(tt.id), 10) + t.Run(name, func(t *testing.T) { + advance, ok := scanPart1(tt.id) + assert.Equal(t, tt.advance, advance, "advance") + assert.Equal(t, tt.ok, ok, "ok") + }) + } +} + +func Test_scanPart2(t *testing.T) { + tests := []struct { + id uint + advance uint + ok bool + }{ + { + id: 111, + advance: 1, + ok: false, + }, + } + for _, tt := range tests { + name := strconv.FormatUint(uint64(tt.id), 10) + t.Run(name, func(t *testing.T) { + advance, ok := scanPart2(tt.id) + assert.Equal(t, tt.advance, advance, "advance") + assert.Equal(t, tt.ok, ok, "ok") + }) + } +} diff --git a/cmd/day2/range.go b/cmd/day2/range.go new file mode 100644 index 0000000..f25d409 --- /dev/null +++ b/cmd/day2/range.go @@ -0,0 +1,62 @@ +package main + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strconv" + "strings" +) + +type idRange struct { + from, to uint +} + +func readRanges(r io.Reader) ([]idRange, error) { + sc := bufio.NewScanner(r) + sc.Split(scanSimpleCSV) + + var ranges []idRange + for sc.Scan() { + before, after, ok := strings.Cut(sc.Text(), "-") + if !ok { + return nil, fmt.Errorf("range %q: missing dash", sc.Text()) + } + from, err := strconv.ParseUint(before, 10, 0) + if err != nil { + return nil, fmt.Errorf("range %q: %w", sc.Text(), err) + } + to, err := strconv.ParseUint(after, 10, 0) + if err != nil { + return nil, fmt.Errorf("range %q: %w", sc.Text(), err) + } + if from > to { + return nil, fmt.Errorf("range %q: refers from higher to lower", sc.Text()) + } + ranges = append(ranges, idRange{ + from: uint(from), + to: uint(to), + }) + } + return ranges, sc.Err() +} + +func scanSimpleCSV(data []byte, atEOF bool) (advance int, token []byte, err error) { + if atEOF && len(data) == 0 { + return 0, nil, nil + } + if i := bytes.IndexByte(data, ','); i >= 0 { + return i + 1, data[:i], nil + } + if atEOF { + if trimmed, ok := bytes.CutSuffix(data, []byte("\r\n")); ok { + return len(data), trimmed, nil + } + if trimmed, ok := bytes.CutSuffix(data, []byte{'\n'}); ok { + return len(data), trimmed, nil + } + return len(data), data, nil + } + return 0, nil, nil +} diff --git a/cmd/day3/battery.go b/cmd/day3/battery.go new file mode 100644 index 0000000..2cb89ca --- /dev/null +++ b/cmd/day3/battery.go @@ -0,0 +1,22 @@ +package main + +import ( + "bufio" + "fmt" + "io" +) + +func readBatteries(r io.Reader) (banks [][]uint8, err error) { + sc := bufio.NewScanner(r) + for sc.Scan() { + var bank []uint8 + for _, b := range sc.Bytes() { + if b < '0' || b > '9' { + return nil, fmt.Errorf("bank %q: invalid joltage %q", sc.Text(), b) + } + bank = append(bank, b-'0') + } + banks = append(banks, bank) + } + return banks, sc.Err() +} diff --git a/cmd/day3/example.txt b/cmd/day3/example.txt new file mode 100644 index 0000000..7255fca --- /dev/null +++ b/cmd/day3/example.txt @@ -0,0 +1,4 @@ +987654321111111 +811111111111119 +234234234234278 +818181911112111 diff --git a/cmd/day3/input.txt b/cmd/day3/input.txt new file mode 100644 index 0000000..fc7c422 --- /dev/null +++ b/cmd/day3/input.txt @@ -0,0 +1,200 @@ +4426546555433545424424345444644242452452532444564422646557424354153538454225332755435544545533324152 +4325282447422434333445212333343451413231333423353426332541123254243232342322553322244341312543932333 +4332333442334543644333542384256325234452445449454359452442434444344242333247233254353342732444654333 +3242342268563381365322464432323462722532321262324224633345426519263464226222933213111434342164622216 +9447673765733475853338583623277776759662892975737572674219274588774764767584838732636637987466747925 +5465666747656245473486677773645858655623848436585748584726454883586526877665853454785577677638954758 +2444454545573358335454444444533657461424744633575454555414644566436546558449448833539855835444255524 +6157461556353423546422234143542323532463543463631966444536448423543534355464334335525162636648321353 +2835376666759365533343684448534555132335383873465765564643686464153633459349536367566364363345632544 +7344353747645474324795566237335767744553352745445443443425543365567665332834442736643744656373346534 +3432324344242432243242442431213424312243322133232222316433433435212164332223444243334342533334253482 +2622221422722224222132452327221224222224622222233223222324242132332222422263234452222242224221222352 +2333333333332434452126434233262133133233322433432323143323224312238323253333223423537495436441425233 +4223121252222122212232222432222222321212224221232222222232212222212222132111222212222222222251232212 +5656364443456476766564447464434634344344454564655366674845343634444454533645485474555461444675445464 +2222222121422212221222211522213322122342313222422223311222223122112232223422311251182122213322222322 +2333223312323513354132532323242345322322263522221232522335232221232532332552333214121322322432333326 +7375355567864373516855538565346166466365834565633643466338563523647238744789722453348483369683756368 +3433535626365433336245424263342632336633352551353243934354326534345544334562636336633544635333676646 +4552543245436445453245462344463365545345654265453546534544522571554353554535445555264545655555435564 +3462831622494255764853548733574574745524782433922944636735655223248563544574263724458232637544263524 +3222443423222532333422343715535222233233323223229323147323212322223213235433123142326522263133222232 +2333212333432333323325252331233333222732313232324333223824122338323314233632223363333234252333334334 +2331142222264423421223242247254264221412241455233167423223334223352322243322332242134435224322124222 +3221232222123222222425122224223222211121332122111521114212121232122222222222222122314421232222252312 +4434524632643643753662622454563441256616464333645346343655435445363437355666544625446446124156665532 +5763246121842223223525634383114633483812622132447222352264521354343613323122493132222226422223222227 +4323333144422413453633413411233333333524243423323613442334134334272326443343531222133522232333343333 +3234234214223423333422221324424143222312253223324541242142332343441224324344332443233314464323322144 +6423483553431355233336233333334345336244367322543433123333331822542553361323313533255325347255353232 +3132322222322223233332424222432332122221122223412222221632222233122242222122222212233244323221112222 +3223234252425333332431323241242843445242944231814342524224422222443223243222362422833222432522631613 +5452134346551715474544663545634746754756625755345636644657534453655793446525544636345465565236542746 +2542562623212274282227172127123225532255466656628222232244712231262232124222523356442314912654421246 +3211225233123342323233432331212112221333223152322132324122322221233222222322521122723211222213111242 +3353334454347529351635537433344434323313154333345532453533454333633334344534233232145423334343453133 +2421322222222122222412222224221426142223221233322432132223212222221222232223242222321211134225212332 +2232211322312221132342223122223332153233222312242233123533242332222253322332323321225223222123351323 +2212222224122111321322222224322232242322432433322422234351322233321213212322244451123232212221462122 +4753242222111143324312132423244222742522462564632213322315132132323232112123373333383241221125242823 +3343332433226522442332523325331434632334332234433541332334332333321533324463433414323223423452445324 +4524344323452457441245426433352336433434326553565344545554463553455544438435453243345453543233364638 +2222422222322342226232333126234322221442134145212323311233323344224332322333321262212224323432221122 +3383323533448644425453227556452478544424474425324446235764223364445645333444575644414514755244224244 +2343242223221423221232222232322235123135222322222232122251223342243132222424232324122223332321323212 +5354554743424254448274373224228344347744467457167542342976472253445454527198343453444286454338544176 +2223211322212241122221232422322724112224232322212224323223222222212223424124222122257222212222232222 +2434554333445323364344355343542565534353653433345424223233434552444423334434254443374352343633354723 +1122223211242218322232222242222112412222222221222222222212321214432122222222122244222323222222433232 +3435223328333433433423336213335333445244223322372743356333333243335234343654352533322143336232326235 +8378544742468475446585326743783446225742243547346625347879353444342544356656636165235963767334746667 +4244322165354443483434332332423145332345674233324467345451342454527444434234355653425334335554423131 +3244347437313313632433324346415274333463523334233534224637213384333473875425377585334343383721435623 +2685554554535645656456735785556654556665554733943566616656484545455547455754473547517575534755375566 +2222322216222333226262621222213222222227514342221543131325335242221222513222622112127222215253128122 +2222222262225252142233624112522171323122223221242262223222122712226213222711321417112221235466122121 +4333334333225345444622224221332232322243222233423332232235132211236444525373232243322332243234262321 +2642248522122252125221232142221232256424223236215252122642362222222132321222242222522122221426222223 +1226322213251222422211232523211123242331232172224333323215133213233424333516323452242312232222623422 +3122222231213232113242212232822222232222122321222222222212222222122321123322222212322212121221222422 +5423564478854726637332596675245464556354355735582626475634453543575355574784577434459673155684554357 +7222321335635332262332412434655413219633232924622212225164226142242353542343246225753542125222223323 +4267551322534512666454222747274155257242331311455351563556413453655624563424531822633534636274521322 +2322252211221211212122132112222243131223523232132222423222341263332222222212222222222222222221122223 +1768674274274986682341368484535667696977568449486752359465927464497766917178351845264522476299462558 +9973345886329838748767628288667977447953869989379958839745584248767715872788288778581455834264386794 +3147438151432333338344236338737232494224134234544451682652215132332644832842454283383842482244335321 +4643566433347766744675635495457354222475461644663645226234346245536452754345745454465444932565942745 +2225215324326423122223233242434242213262412222221233223222352542224342323121544223222222122424243522 +5322245452664656566453255356611235646656355152264354425465513351415225316613615411625412314435245789 +3532512623242331522454811463433144216352121322573268272964662224275267222324238362545294252247226249 +4212831421213232133322223142223222232221223244343332213353123322323123224122232252313232232212321237 +2559516646662636458444562545554866446626574222272432644244645625329345646257123324497646538129494375 +9487697645944865567668753567656668967724574897467656455865855168454565445566546659685676656548457565 +2271259332592124428922232222322232962517342622322222232214172224332228267227221228162482262221225237 +6443233123316232234343521343174244263223442223223423321152221313245363424122444225443331425623722332 +2631223233332234232222222232233223624324362331422523223632222321252622533132312233252333334122352232 +4374594442425431244344493962542232434523455225227447382442522423334443974437423421342463423254543531 +2355432333335223334533427244747262427442234442324341339233344374345153362152323144742423388326423162 +4443445423434244443443444444444444444453454434424544344351234534453344444435446233443343433434443455 +2253732224712335116222521332125212432325522332331223222422222222232262233125222132623218312312722532 +2745126446333335224424526135332462445373274523354244145463333432422845424534532453225244484442333526 +7243231322222522523243218221822229211222272222132121225212212218162223322262253352242226222836222214 +8455234156755525686463552552391658345445893588246565526285564774355441646662555577978368642945158266 +3343333323213243433334231333434335323412312313221233333132122333233383333233332333432113332333333423 +3383456734935633752439463334363637796364566576539414396635336233843642426783335654663528832337243282 +5344511435325253223124322422315232342443444521133233112342244413322214342143342332245442224284224114 +5672432544132225246254263346129622122631332113422332144322322464231221212259362226232222422423235425 +4524322944436266647664456155534453463635345234664725273342535542575445335444366346254436463682322565 +3451334242232142352433232562333233532438333363343323646422333622532339344445433533245221232362638635 +3233443334336222212333333313221143322323332233423311342213212323422233331233212221332323232313422232 +3538335453453474345453632453342555554432484344312443323743442437447424536444524434375434843224232542 +1134323333132313131333332323533133333233333623323322333244441332334233337333342274333223433233323332 +4454243314521342324532544347434334434335235444344344323342233636214464723343447422324342472464431443 +7212243259122532255215244522214125222124232452252245212117552255264655222522223426322454253422326222 +2312222222222232222222222222222322717232232212282223722231223211112223222213222121232234222222322523 +2423334254424242124413222223224442344344242422322434223443444442221241423332334442224443342321462224 +2128125222642211322122234225124121551426222122221152223262222223412226123232213242622126562225123425 +6363447276635566243523623745255552583521353635323266575519555685676553658347552943633545254924961552 +3676667755587373466346533576626132364223763383165653452675353348646644426366668265737356353476244576 +3422633322422226226233112222224522622422332233123762752272222426216644523363422226125279441225422222 +2421513543234255328413453513213432322425243313515222254346232334321335531342525442552353235434465512 +6415375652731773743516117625153734627224124775172663723121614653367227355752147244664377477315124189 +2422422221222321721222213222222133221322412121222341242222222524122224222242242227224232222222122221 +2222263221312126226422222222222232232232522122222312521212274512142222222239332233161324142222522322 +5214224342122322832221621223821233232353524332825644542254213312221562222316123326232465523312421432 +3666692346463343673765135653333572386454548636472533677643225343655156493533632665435433533363333333 +3236336332133335334334333531334446329333352333444233443333333223336235333533336533533333723322331753 +2332334253445774533552442335534343543373535353354533442353484244432315244243232631235533431325434332 +4552521221112255538222453252525742232852622245255471828252221432256124422144256362213422525332324121 +2372252333723353563333333333333473383323733335833336432411333324316543339422239234393336716637333323 +3332446134233313232612333632163334334322633133212431333462333333224835333344223255333363212354123333 +7552341253243523459433362762313446662433224122932234263432225853655524828528628382822322238267265157 +2322134512221642323542323223511513233543226122331621224322223253615122232123422252522132621252231222 +3429232333431322243333344632343394443442424314352323431333625322314431334423554324321344442415335134 +3133332324343452323333322323333333333334333264133233333332532333133321223323533333342253313333423342 +1343335423352323663332543443263364446232322235234335543232624626585721313544983224252225332324323924 +2343384322234463353555425322583755232622465243247424222413556356413728443742314344222113244251532353 +3232332334422662733311142222213624242324423442212272161353921332323323365114222662326433222211432822 +4744234125222815354354425333344321443843244443221424452394343442222524324344242221332233234242225342 +3462334428262249425482933131743232559746433332564353333244493126335533625323339453832154482421223425 +2222222233134212222222432222224221127322233223212223221332321127222222212311222222122222243322422222 +2432244232223322212223324331424131121232632326332432333422623232243223132243212732213222236112343243 +2353263413345543333423353333424313435236563342233313443334554332372614164221334333214242433343743323 +7262356332233565589343731635726333342324341343234343563337573343334533753353534223443345323333245553 +3431242323312112222476523222532327232153214423528222422132232322222221233323223323234454532312329644 +2333735367546552954626277275124585694263757293962825277347554513674261336273395694226566284745773263 +4173649643475436334333444938463434845834634643336464565244456555431735334846564366333644454658838434 +4224822332242633868373338733362313852898442333324233232246336466283378321233368462332243239624724493 +3534333234432441324334224322153333431244222322152323333332413324252424224444334223352334223435244433 +6797668434457363662697495794664668479675438735856666846457733757642696558784863738494973567987667785 +2532234351434333422252314325113333335424552231452251415554155221313444214412351243321242521144116789 +3342963235551769332228529676272853356744577245483232553575727464245624975847586372312522857261324765 +2524433365455335343313442426354273335335232214443343435433184332364226333334324442532433433436434544 +4222122212332332222223231213222222312211212212121323212233252322321222222213413222323221123352221114 +5424545545342434324453533434332434353334333329332435543336333525325324324362551332333536454133333544 +2222314222413221272111232133221322313112115242245223141212412222244222235114332221123332223221212312 +3212651335442221253634222242124222222642441435234212423212262422522122224324245252222146563216221221 +4534343343554434373455224333444314444534552343337347433344543433344554444335355543345534555526436343 +2912822222483322222232264222224151451255223222333452422122242122248232332227722421522312222232532253 +4363374545543434544442423374342545266566843654647345434434454434474633695544412328432786264722435234 +3343564345744435343522324454522434441435423445134313333444444543324535244244543454334444434424484334 +2322363112224333222332112622331313163122212323222223232231512332235223225122413223321223322222232531 +8546436128277177943554413533685443435367862667384842533295736533834223234414837551795743345232755356 +2213223311223816122359924212256213822322211521422222324321352333322322323236222322223293232222322212 +2554435553538564422555424565552315565514525555355255522743428555232444455355554251246333452345246463 +1333422325315555874222532212731223224223254342221837511242452534326213523243452252233223213322135222 +5645369885892365427476667837637577773387463956656474667757655456846365465836456434746556672555434687 +1421112121223232721222412222222242124512328121322221222122322232222222221131222232242224221212222222 +4775668564556556665766856661654556565656666644646647565572556665554564646675658255256457555646455672 +2342452332222224551123243223222322223222532243215346511152222243322321233351223234222223444213272213 +3134413132411423221323242221321124214114211142114424214131341214344331244312323444323444224243356789 +6474433335362433434337434438443364393293343534343624232383334873273856337846437336343634353362444433 +1233243332444222224424623312622422472142523322262753551222225262222542223454332322545228267264346425 +5236344253423354343636325463336333356423827726333436538779343734634346263644934337562547952563333333 +4224632223222123112222412224243141262412423241322342423442281422522214232242353421222312244224243143 +7469877946847665655586749745973337476666558883376764458965456455676568725755555867744856659595665642 +5356755557561456634566445832832547543365283554567566675752345723326653666295553666765253254564575736 +2321311332333231423323221223223244435231441322214322333343224233412234223313431433353223233353143421 +1124322462241222221323531412334544222322323221214234222324232244223432212422222224223232224112243112 +3332442446346324333247187342434234143434236438533225434637244346324434633333433333446545833348946344 +6262322616264315213225632354273927727338283215826672178422371664423342442785822317832925655256257219 +5445524443444335333443353344243433444334443434344463323445434545248233545423324544444294345453333455 +4223232323333222323333332333322222233332323333313333323242343333332533345333222234233313223533211212 +2223426222252122224112251232142242221222124233312222241221222222212222211222222212224522125231221311 +4627241234423313342333322364213144422247433314234222223143223654226435149632233443252543432234336311 +3333323422333333355233333234444322224324422233131223315323344321434242338123343332321421433143242699 +5722624812261213242322822324282536352232415433623728387976822137157726222323252211524835225474266852 +6336122553423455134143235434142621433345423333324344332423352336233623352364143643333142317333344763 +2323435345339933333233234413323332823632433922347933212225322223237234444332332812753453212221655776 +2114332232122222227222233321132222191224112232322223323413216233224325414223233154142153523213232123 +4363233516332573234322264326642333411233222345332333464327253633423433332221226225313723253223432622 +3422222121231221222421222222121272211223124211222222214432222512422226462422122222221351154222226222 +6573185767843422374335785736331723571626823274547783151717468323887386811276575242725477122713746669 +2433323232322344222233231233134132334523323222232325242333412233214322233314333222533333224362222422 +3222122212322122231223222223232222222313222223113212232222222133211321213121322523223222211221322321 +1242342322434314342233214544224322432222222225724432314723213225244242244514424424223342332323333244 +3322223323232222222221522223212133322322222621322222322222322223213622312322343212233241322414122422 +2625245231422282221441423513255742414624272364847631422343335664343424253113724224727363324547221242 +3326371332622228837252563473123241224363133633313838447333321443724272332475132742349125916442355543 +7233222122232253233222242323323223314121222243233553222212213232332233632222221633531222213332222322 +4421224312252242222221224112221222222224212412222452223422331222221221224222221232323262264232222222 +2253123212223333222222213222243313323332331322233232333213243323321232223233337222421123221325322512 +3225422162433131224312223212312251243322224132425122234262233531224344222313224662223321322393231236 +4642342261562254443344423445428214722743264973162525543742232816222224553343421222242126532254365481 +2312212121222212523433224231211322312282222222522222132135222331121123255225272322122223213222222223 +4312231325246222214421322221112212232222221236232224117221364342225122132212423231222513213355222221 +2651242333442243323334334146333233144333442323333456343363233634333343243343244336244433225344135332 +2763248524234572433753223233622223332331723214122435341443231732223246222334223132623282652622283543 +3243222223323231422312437333423314711552416423122312422543424332522221326222321244222322221422322327 +2233554224243333415331323334332253253232644223453213913343546821552553232233353435533223533435332663 +9646747667546966454644685753753665685635164767563757666773248774626764856573263365676475553556725744 +3865568344165174355665436356555345223355325727554952341715231585477375575282248527523565666551546585 +3234454554445754244327453332241719736853566345534435633379658436763224463639555336653466444123247355 +4438345364534443344333623345533334653253544343661423635845633336348738944346332432336336246326235385 +2114324212222322222222212222254122222222224124132122221332222222424224232332221334212112412425623122 +6221313223122322312222223332222212322222322243233162222222221321233262222522241312222311223223222251 +3134343613223133354232233332661513531335333432332323336333332333333323334433432234333333333632313335 +3413243315334423214232123334223123332333344421223321223234232342332444434512222243333333421331422733 +3643433552173224434364263213563492453254231457525737335444546343413142646222466454322422842347463343 diff --git a/cmd/day3/main.go b/cmd/day3/main.go new file mode 100644 index 0000000..368a1c9 --- /dev/null +++ b/cmd/day3/main.go @@ -0,0 +1,86 @@ +package main + +import ( + "cmp" + "flag" + "fmt" + "log" + "math" + "os" +) + +func main() { + debug := flag.Bool("debug", false, "Debug.") + flag.Parse() + + f := os.Stdin + if flag.NArg() > 0 { + var err error + f, err = os.Open(flag.Arg(0)) + if err != nil { + log.Fatal(err) + } + defer f.Close() + } + + banks, err := readBatteries(f) + if err != nil { + log.Fatal(err) + } + + var sum1, sum2 uint + for _, bank := range banks { + power1 := bestPowerPart1(bank) + power2 := bestPowerPart2(bank) + if *debug { + for _, b := range bank { + fmt.Print(b) + } + fmt.Println(":", power1, power2) + } + sum1 += power1 + sum2 += power2 + } + + fmt.Println("sum (part 1):", sum1) + fmt.Println("sum (part 2):", sum2) +} + +func bestPowerPart1(bank []uint8) uint { + // i := maxIndex(bank[:len(bank)-1]) + // j := maxIndex(bank[i+1:]) + i + 1 + // return uint(bank[i])*10 + uint(bank[j]) + return bestPower(bank, 2) +} + +func bestPowerPart2(bank []uint8) uint { + return bestPower(bank, 12) +} + +func bestPower(bank []uint8, batteries int) uint { + if len(bank) < batteries { + panic(fmt.Sprintf("bank (%d) is smaller than requested batteries (%d)", len(bank), batteries)) + } + var joltage uint + var i int + for j := batteries - 1; j >= 0; j-- { + k := maxIndex(bank[i : len(bank)-j]) + k += i + i = k + 1 + joltage += uint(bank[k]) * uint(math.Pow10(j)) + } + return joltage +} + +func maxIndex[S ~[]E, E cmp.Ordered](x S) int { + if len(x) < 1 { + panic("maxIndex: empty list") + } + i := 0 + for j := 1; j < len(x); j++ { + if x[j] > x[i] { + i = j + } + } + return i +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..3314e41 --- /dev/null +++ b/go.mod @@ -0,0 +1,11 @@ +module git.bernotas.lt/sewiti/advent-of-code-2025 + +go 1.25.5 + +require github.com/stretchr/testify v1.11.1 + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..c4c1710 --- /dev/null +++ b/go.sum @@ -0,0 +1,10 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=