From 2b400c1d7a78dc195895757732afd713f188d1e3 Mon Sep 17 00:00:00 2001 From: Mark Bebawy Date: Sun, 14 Dec 2025 14:27:16 +0100 Subject: [PATCH] Solutions day1-day3 --- mark/day1/example.txt | 11 + mark/day1/input.txt | 4571 +++++++++++++++++++++++++++++++++ mark/day1/part1.rb | 29 + mark/day1/part2.rb | 53 + mark/day2/example.txt | 1 + mark/day2/input.txt | 1 + mark/day2/part1.rb | 57 + mark/day2/part2.rb | 74 + mark/day3/example.txt | 4 + mark/day3/input.txt | 200 ++ mark/day3/part1.rb | 49 + mark/day3/part1_prep_for_2.rb | 67 + mark/day3/part2.rb | 91 + 13 files changed, 5208 insertions(+) create mode 100644 mark/day1/example.txt create mode 100644 mark/day1/input.txt create mode 100644 mark/day1/part1.rb create mode 100644 mark/day1/part2.rb create mode 100644 mark/day2/example.txt create mode 100644 mark/day2/input.txt create mode 100644 mark/day2/part1.rb create mode 100644 mark/day2/part2.rb create mode 100644 mark/day3/example.txt create mode 100644 mark/day3/input.txt create mode 100644 mark/day3/part1.rb create mode 100644 mark/day3/part1_prep_for_2.rb create mode 100644 mark/day3/part2.rb diff --git a/mark/day1/example.txt b/mark/day1/example.txt new file mode 100644 index 0000000..5b04997 --- /dev/null +++ b/mark/day1/example.txt @@ -0,0 +1,11 @@ +L68 +L30 +R48 +L5 +R60 +L55 +L1 +L99 +R14 +L82 + diff --git a/mark/day1/input.txt b/mark/day1/input.txt new file mode 100644 index 0000000..03ee22a --- /dev/null +++ b/mark/day1/input.txt @@ -0,0 +1,4571 @@ +L4 +R49 +L25 +R16 +R45 +R41 +R19 +R20 +R22 +L16 +R42 +R5 +L29 +L5 +R1 +R6 +R30 +R5 +R11 +R44 +L13 +R28 +R36 +R45 +L22 +L6 +L39 +R16 +R20 +L12 +R2 +L29 +L42 +L22 +L7 +R13 +L38 +L26 +L10 +R35 +R30 +R10 +R13 +L37 +L3 +L48 +L12 +R20 +L16 +R87 +R82 +R18 +L76 +L94 +R95 +L25 +R77 +R23 +L28 +R28 +L65 +R65 +L5 +R60 +R33 +L88 +L67 +R96 +R71 +L57 +L70 +L7 +R72 +L88 +L22 +R59 +L87 +L52 +L35 +R87 +L61 +R83 +R82 +L57 +L19 +L28 +L55 +R55 +L54 +L5 +L36 +L34 +L71 +L21 +L1 +R22 +R1 +L81 +R89 +L3 +R3 +R33 +R53 +L43 +R297 +R12 +L61 +R49 +R851 +R22 +L22 +R57 +R95 +R84 +L44 +R77 +L52 +R183 +R85 +L40 +R55 +R85 +L485 +L62 +L90 +R81 +L29 +L56 +R49 +R7 +R57 +R56 +L13 +R61 +L61 +L90 +L35 +R28 +L95 +L73 +L14 +L21 +L79 +L4 +R67 +L84 +R69 +R23 +L13 +R21 +R611 +L22 +L92 +L86 +R5 +L79 +R63 +R85 +L263 +R27 +L56 +R83 +R93 +R35 +L67 +R69 +L67 +L18 +R89 +R17 +L27 +R15 +L22 +R30 +L17 +R12 +L18 +L46 +L54 +R48 +R18 +R96 +L62 +R40 +R60 +R5 +R16 +R79 +L99 +L1 +L53 +L47 +L33 +L85 +L501 +R808 +R511 +L26 +R126 +R373 +R27 +L812 +L29 +L85 +L74 +R88 +L88 +L929 +R929 +L32 +L68 +L43 +L68 +R65 +L71 +R75 +L25 +L44 +L93 +R15 +R89 +R88 +L88 +L793 +R93 +R1 +R386 +L53 +R503 +L37 +R41 +L64 +L813 +R949 +L37 +L76 +L28 +L354 +L86 +R39 +L871 +R61 +R22 +R17 +R88 +L78 +R17 +R73 +R48 +R11 +R60 +L19 +R531 +R49 +R44 +R667 +R77 +R532 +R799 +R1 +L84 +L16 +L40 +R49 +L89 +R80 +L735 +L365 +R44 +R32 +R79 +R952 +R893 +L21 +L36 +R157 +R53 +R47 +R30 +L30 +R28 +L49 +R22 +R43 +R45 +L89 +R116 +R90 +L6 +L11 +L7 +R62 +L671 +R31 +L8 +R4 +L77 +R77 +L32 +R376 +R956 +R19 +L91 +L589 +L484 +R68 +L453 +L24 +L46 +L59 +L41 +R876 +R24 +R601 +R52 +R47 +L20 +L56 +L4 +L20 +R57 +L799 +R42 +L35 +L36 +L29 +R93 +R21 +L14 +L14 +R496 +L982 +L10 +R39 +L29 +L118 +L13 +L69 +R3 +R99 +R98 +R769 +R95 +R160 +R558 +L82 +R88 +L35 +R30 +L65 +L217 +R67 +R24 +R51 +R30 +R4 +R52 +R165 +L694 +R53 +R47 +L49 +L51 +R60 +L95 +L65 +L94 +R94 +L8 +R7 +L85 +L10 +L895 +L35 +R948 +R14 +L36 +R17 +L817 +L52 +R991 +L57 +R23 +R11 +L57 +R70 +L78 +R60 +R67 +L78 +R59 +R494 +L53 +L306 +R83 +L77 +L95 +L33 +L88 +L82 +R98 +R80 +L80 +L57 +L43 +L688 +L12 +L113 +R94 +L81 +L65 +R8 +R637 +R85 +R14 +R169 +R2 +L23 +R32 +L63 +R6 +L30 +L32 +R60 +L64 +R67 +R27 +R71 +L784 +R85 +R147 +R48 +R3 +R83 +R196 +L63 +R5 +L21 +L64 +R254 +R10 +R51 +R49 +L32 +R93 +R39 +R95 +R45 +L89 +L51 +L97 +R348 +R70 +L17 +R96 +R471 +L96 +L75 +L48 +R59 +R89 +R335 +L35 +L59 +R77 +L718 +L60 +R60 +L65 +R65 +R53 +L53 +R23 +R68 +L643 +R23 +R99 +R835 +R434 +L86 +R90 +R32 +R25 +L94 +L351 +L41 +L33 +L81 +L37 +R37 +L749 +L49 +R29 +L51 +L13 +R13 +L80 +L58 +R58 +R76 +L98 +L78 +L17 +L60 +R77 +R409 +R334 +L43 +L74 +L3 +L28 +L48 +R53 +L88 +L90 +L61 +L61 +R99 +R5 +R31 +L326 +L33 +L76 +R17 +L29 +L88 +L13 +L61 +L26 +R17 +R62 +L79 +R12 +R88 +R46 +R84 +L30 +R58 +L938 +R80 +R8 +R64 +L72 +L42 +L414 +L11 +L233 +L31 +L169 +R52 +L52 +L43 +L80 +L377 +R20 +R80 +L70 +R70 +R47 +L49 +L10 +L83 +R95 +R22 +R59 +L81 +L120 +R20 +L786 +R80 +L72 +L85 +L128 +L809 +R39 +R57 +R4 +L57 +L35 +R92 +L93 +R25 +R68 +L71 +L544 +L783 +L11 +L91 +R377 +L77 +R10 +L964 +R6 +L76 +R324 +L15 +R82 +L72 +L66 +R128 +R875 +R86 +R82 +R873 +L81 +L67 +L86 +R23 +R61 +R77 +R15 +R47 +R88 +L59 +R9 +L19 +L81 +R56 +L86 +L15 +L955 +L39 +L744 +R83 +R93 +L93 +R7 +R87 +L32 +L62 +L45 +L50 +R3 +R92 +L485 +L15 +L70 +R276 +L76 +L66 +R58 +L12 +R90 +L14 +R41 +R78 +L14 +L91 +L93 +L5 +L319 +L90 +L293 +R22 +R172 +R6 +R31 +L45 +R88 +R48 +L95 +R47 +L94 +L15 +L8 +R64 +L21 +R10 +L10 +L73 +L69 +R33 +R7 +R282 +L80 +R7 +L2 +R19 +L63 +R39 +L955 +L27 +R718 +L39 +R218 +L915 +R10 +L83 +R73 +R70 +L70 +L94 +L19 +R55 +R57 +R1 +R67 +L2 +R35 +R48 +L948 +R846 +R54 +R1 +R99 +L86 +L14 +R55 +R71 +R44 +L47 +L484 +L739 +R3 +L56 +L53 +R6 +R11 +R740 +L37 +L57 +L89 +R34 +R20 +L91 +R73 +R10 +R84 +L41 +L57 +L16 +L923 +R39 +L25 +R757 +R268 +L23 +L856 +L57 +L96 +R32 +R52 +R999 +R84 +L616 +R81 +L87 +R90 +R97 +R25 +L68 +L57 +R271 +R29 +R41 +R959 +R91 +R9 +R48 +R52 +L14 +R84 +R61 +R55 +R87 +L59 +R86 +R17 +L70 +R141 +R12 +R64 +L701 +R937 +R17 +R85 +L75 +L436 +R9 +L2 +L206 +L3 +L70 +R82 +L1 +L762 +R96 +L34 +L29 +R49 +L20 +R15 +R221 +R77 +R615 +R72 +L71 +R99 +R88 +R84 +R83 +L63 +L476 +R97 +L75 +R371 +R56 +L98 +L69 +L26 +L51 +L49 +R55 +R17 +R6 +R330 +L49 +L90 +L69 +R39 +L939 +R56 +L48 +R92 +L83 +R36 +L21 +R68 +L717 +L62 +L66 +R27 +R595 +L15 +L34 +R730 +L80 +L78 +L129 +L15 +R5 +R34 +R63 +R20 +L28 +L50 +R29 +L22 +L7 +L903 +L9 +R12 +L85 +L15 +L46 +L54 +R13 +R92 +R11 +L987 +R71 +R80 +R23 +R938 +R58 +R31 +R70 +L26 +R26 +R790 +R310 +L11 +R11 +R38 +R413 +R49 +R43 +L343 +L789 +R50 +L4 +R43 +R83 +R74 +R23 +L80 +R72 +R22 +L86 +L8 +R3 +R23 +L926 +R890 +R501 +L61 +L30 +L4 +R34 +L54 +R24 +L78 +R96 +L90 +L28 +R64 +R936 +L56 +R89 +R40 +L27 +R54 +R43 +R37 +R50 +R770 +R57 +R43 +R16 +L1 +L15 +R20 +R404 +L65 +R241 +L90 +L10 +L6 +R6 +R564 +L854 +L75 +R94 +L58 +R29 +L753 +L31 +L16 +R18 +R982 +R11 +L13 +R2 +R18 +R82 +R87 +R58 +R12 +L15 +R63 +R344 +R93 +R88 +L967 +R37 +R44 +L62 +L82 +R76 +R80 +L51 +R56 +R39 +L656 +L44 +R11 +R89 +L96 +L4 +L31 +L69 +R39 +R61 +L61 +L64 +L61 +L6 +R872 +R6 +R131 +R60 +L24 +R30 +L98 +L83 +R86 +R471 +R62 +L99 +R77 +L38 +L45 +L11 +L7 +R2 +L52 +R89 +R98 +L70 +L94 +R51 +R89 +R44 +L55 +L70 +L30 +L76 +L907 +L34 +L39 +L818 +L226 +L75 +R32 +L390 +L941 +L738 +L93 +R90 +R73 +R42 +L34 +R134 +R10 +L60 +L50 +R28 +L46 +L66 +L581 +R465 +L76 +L42 +R201 +R84 +L96 +R290 +R68 +L7 +R49 +R44 +R734 +L49 +L82 +L417 +L1 +R731 +R85 +R284 +R50 +R74 +L322 +R27 +L15 +L14 +R54 +L654 +L65 +R965 +R77 +L50 +R173 +R79 +R521 +R2 +R28 +L30 +R472 +L72 +R38 +R49 +L87 +R49 +R99 +L48 +R9 +R91 +R62 +R538 +R27 +L621 +L84 +L15 +L75 +L32 +R68 +L55 +L149 +L964 +L94 +L606 +L576 +L42 +L79 +R77 +R20 +L11 +R11 +L27 +R42 +L72 +L343 +R46 +R990 +L334 +R98 +L38 +R485 +L47 +R845 +L45 +R14 +R495 +R91 +R63 +L73 +L49 +L924 +R14 +L4 +R23 +R950 +R829 +R6 +R81 +L86 +R70 +R89 +R28 +R34 +R49 +L88 +R925 +L19 +R367 +R25 +L7 +R14 +R83 +R50 +R868 +L59 +R42 +L1 +R914 +L97 +L61 +L56 +R38 +L60 +R94 +R389 +R39 +L12 +R69 +L66 +L91 +R18 +L91 +L27 +R24 +R76 +L940 +L89 +R7 +L86 +R65 +L57 +L70 +R38 +R81 +L49 +R368 +L568 +R36 +R76 +R19 +L31 +R39 +L86 +L953 +R2 +R45 +L204 +R57 +L33 +L63 +R509 +R87 +R93 +L93 +R14 +R48 +R38 +R75 +L75 +R821 +L98 +R49 +R3 +R225 +R30 +L23 +L37 +L86 +R28 +L612 +L68 +L32 +L93 +L98 +L9 +R68 +R660 +R56 +L84 +R74 +L99 +R25 +R26 +R47 +R517 +L90 +R70 +L48 +R50 +L34 +R62 +R46 +R341 +R88 +L575 +L965 +L193 +L20 +R78 +L97 +R17 +L702 +L46 +L1 +R29 +R78 +R52 +L15 +R85 +R54 +R46 +L74 +L26 +L795 +R736 +L8 +L63 +R289 +R87 +L146 +R627 +R13 +L94 +L56 +L92 +L90 +L285 +L39 +L284 +L31 +L369 +L69 +L31 +L457 +R12 +R45 +L13 +L87 +R81 +R19 +R32 +R87 +R67 +R887 +R127 +L658 +L23 +R93 +R88 +R44 +L44 +R78 +L35 +L43 +L30 +R30 +R45 +R93 +L64 +L74 +L65 +L635 +L75 +L25 +L248 +L52 +L59 +L41 +L790 +R82 +L92 +R11 +R35 +L1 +L60 +R715 +R98 +R702 +R172 +L72 +L65 +L96 +R75 +L22 +R846 +L38 +R79 +L79 +R78 +R22 +R36 +R664 +L30 +L70 +L471 +R71 +L17 +R46 +L61 +R575 +L92 +R31 +L9 +L855 +R853 +L71 +L24 +R81 +R38 +L1 +L1 +R446 +R61 +L42 +R50 +R604 +L912 +R68 +L68 +L50 +R50 +L376 +L25 +L258 +L77 +R83 +R66 +L81 +R78 +R190 +L759 +R45 +R66 +L39 +R11 +L67 +R43 +R83 +L83 +R48 +L48 +L14 +L389 +R45 +L30 +L82 +L991 +R66 +L27 +R53 +L31 +L723 +L77 +L42 +R98 +R444 +L528 +L72 +L72 +R73 +L60 +L78 +R315 +L78 +L75 +R194 +R818 +R63 +L272 +R972 +L964 +L41 +L1 +L94 +R36 +L68 +L606 +R72 +L18 +R431 +L626 +R79 +R665 +R552 +L32 +R40 +L1 +R299 +R77 +L53 +L45 +R98 +R29 +L54 +L61 +R73 +R613 +L60 +R282 +L49 +L273 +L88 +R54 +L71 +R5 +R59 +R41 +R36 +L8 +R69 +L97 +L72 +L28 +L23 +R23 +R12 +L420 +L92 +L29 +R17 +L71 +R61 +R78 +R8 +L82 +L82 +R54 +R725 +R521 +R8 +L983 +R21 +R54 +L42 +R55 +L13 +R16 +R684 +R10 +L610 +L27 +R27 +L21 +L37 +L78 +R49 +L13 +R73 +R62 +R53 +L88 +L92 +R57 +L65 +R98 +R2 +R25 +R75 +R14 +R27 +R759 +R6 +L19 +L31 +L719 +L167 +R76 +L84 +L63 +R1 +R89 +R22 +R125 +L92 +L44 +R1 +L94 +R39 +R17 +L63 +L15 +R313 +R29 +R10 +L237 +R15 +R8 +L62 +L28 +R602 +L423 +R35 +L47 +L28 +R28 +R13 +L691 +R79 +L1 +R17 +R83 +R16 +R56 +L750 +R78 +L49 +L75 +L33 +R57 +L763 +L7 +R59 +L1 +R512 +R53 +L53 +L55 +L45 +L30 +L70 +L76 +R855 +L579 +L22 +R24 +R98 +R24 +L24 +R329 +R20 +L501 +R48 +L36 +L88 +L80 +R58 +R6 +R44 +R36 +R64 +L54 +L548 +R2 +R53 +L53 +L59 +R159 +R1 +R80 +L88 +L72 +R94 +L44 +R90 +R39 +R61 +L479 +L790 +L792 +L95 +L112 +R50 +L43 +R93 +R307 +R39 +L39 +R992 +R8 +R67 +R735 +L2 +R56 +L86 +R179 +R22 +L919 +L21 +L634 +L97 +R119 +L26 +R797 +R3 +L88 +L5 +R49 +L57 +R8 +R17 +L17 +L48 +R222 +R26 +L172 +L54 +R65 +R61 +L90 +L20 +R10 +L464 +R31 +L4 +L46 +R14 +L17 +R86 +R15 +R85 +R1 +R14 +L109 +L12 +R629 +R89 +L12 +L261 +R5 +R56 +R52 +L52 +R91 +R25 +R84 +R84 +L38 +R363 +L66 +L96 +L9 +L38 +R57 +R77 +R3 +L37 +L1 +R56 +L494 +R28 +L30 +R259 +L64 +L54 +R74 +L374 +R37 +L78 +L59 +L59 +L933 +R92 +L97 +L603 +R52 +L87 +R4 +R59 +L29 +R1 +R92 +R29 +R12 +L24 +R337 +R49 +L99 +L57 +R961 +R69 +L49 +R80 +R1 +L30 +R141 +R788 +L30 +R30 +L371 +R71 +L20 +L680 +L70 +R70 +L595 +R95 +R25 +L25 +L66 +R54 +R12 +R54 +R99 +L11 +R95 +L37 +L78 +R178 +L798 +L2 +R354 +R78 +L96 +R64 +L14 +L86 +R44 +L26 +R82 +L12 +L88 +L98 +L14 +R1 +R68 +R11 +R95 +R43 +R94 +R54 +L46 +R92 +R67 +R33 +R591 +L57 +R77 +L27 +R16 +R11 +L3 +L8 +L7 +L182 +R76 +L87 +L34 +L93 +R73 +R98 +R49 +L93 +L19 +L881 +R76 +R24 +L57 +R925 +R79 +R13 +R658 +R82 +R84 +L41 +R357 +R13 +L550 +L26 +L3 +R66 +L59 +L44 +L760 +R63 +L686 +L14 +R96 +R19 +R85 +L88 +R88 +R36 +L13 +L473 +L5 +R45 +L90 +L261 +L57 +R37 +R81 +R27 +R81 +R92 +R37 +L3 +R66 +R857 +R81 +L38 +L277 +R15 +R62 +R38 +R62 +R57 +L57 +L28 +R82 +R46 +R59 +L78 +L78 +L3 +R44 +R45 +R84 +R512 +R12 +L27 +L7 +R83 +R86 +R68 +R27 +L30 +R3 +L45 +L66 +L789 +L85 +R138 +L743 +L310 +R95 +R5 +R53 +R24 +R91 +L93 +L75 +R85 +L95 +L90 +R61 +L61 +L35 +R35 +L131 +R40 +L388 +R7 +L28 +R33 +L33 +L62 +L698 +L40 +R363 +R670 +R365 +L98 +L114 +L79 +R63 +R42 +R104 +L66 +R50 +L62 +R16 +L54 +R55 +R469 +L38 +R14 +R92 +R88 +L80 +R33 +R67 +R29 +L29 +R702 +L2 +R40 +L48 +R8 +L55 +R55 +R8 +L21 +R65 +R91 +L824 +R95 +R817 +R21 +L18 +L6 +R78 +R46 +R98 +L97 +R55 +R312 +L74 +R654 +L33 +L75 +L92 +L16 +R59 +L94 +R917 +R69 +L38 +L23 +L74 +R15 +R456 +L44 +R85 +R288 +R98 +R721 +R61 +L44 +L31 +L98 +L25 +R81 +R37 +R22 +R74 +R53 +R77 +L26 +R74 +L74 +L37 +L33 +L52 +R34 +L218 +L96 +L12 +R807 +R32 +L25 +L86 +L8 +R573 +L79 +L83 +L78 +L39 +R643 +L32 +R89 +R87 +L58 +L872 +R26 +R14 +L97 +R99 +L99 +R42 +R58 +R2 +L67 +R90 +R75 +R69 +R31 +L57 +L643 +L543 +L57 +L52 +L85 +R31 +L74 +R72 +R8 +R7 +R64 +R9 +R95 +R25 +R31 +L64 +R681 +R52 +R84 +L84 +L71 +L17 +R639 +R49 +L35 +L27 +R53 +L81 +R51 +R29 +L90 +R41 +L51 +L60 +L938 +L698 +L381 +R87 +R26 +L90 +L3 +R27 +R85 +L45 +R10 +L17 +L93 +R314 +L14 +L5 +R129 +L2 +L22 +L42 +L28 +R70 +L46 +L43 +R47 +R81 +R8 +L827 +L603 +R49 +L46 +L73 +R383 +R879 +L34 +L12 +R606 +R11 +L3 +R74 +R23 +R13 +R71 +R42 +R41 +R7 +R39 +R274 +R39 +R31 +L85 +R54 +L14 +R276 +R582 +L44 +L839 +L87 +L74 +R75 +R20 +R5 +L955 +L6 +L23 +L16 +R3 +R60 +R28 +L98 +L61 +L133 +R388 +L90 +L40 +L57 +R64 +R368 +L32 +L80 +R380 +L70 +R12 +R876 +L794 +R19 +R683 +L25 +L45 +L99 +L363 +L75 +R81 +R70 +R77 +R53 +L3 +L26 +R29 +R63 +R93 +R75 +R69 +R43 +R57 +R25 +R83 +R4 +R79 +R715 +L6 +L95 +R76 +L81 +L36 +L64 +L91 +R91 +L130 +L66 +R83 +L87 +R479 +R66 +R55 +R26 +R74 +L534 +L50 +R84 +R31 +R19 +R71 +L643 +R83 +L74 +L87 +L6 +R89 +R17 +L57 +R57 +L94 +R94 +R66 +L687 +R21 +R6 +R22 +R92 +R80 +L542 +L13 +R55 +R69 +R31 +R69 +L343 +R86 +L134 +R24 +L2 +L95 +L11 +L70 +R65 +R2 +R10 +R811 +R88 +R55 +L16 +L439 +L82 +L88 +R533 +R13 +R24 +R73 +R42 +L30 +L804 +R97 +R622 +R310 +L66 +R56 +R95 +L89 +L6 +R13 +R87 +R10 +L10 +R24 +L66 +R442 +L30 +R38 +R46 +R46 +R9 +L409 +L47 +L89 +R515 +R13 +R48 +R40 +R98 +R22 +L88 +R88 +R90 +L20 +R30 +L34 +R24 +R10 +R9 +L33 +R38 +R54 +R329 +L97 +L47 +R45 +L53 +L15 +R89 +R74 +R5 +L806 +L892 +R14 +L22 +L92 +R20 +R41 +L78 +L83 +R47 +L47 +L52 +L830 +R13 +L31 +L2 +R90 +L776 +L428 +R16 +R91 +L91 +R79 +L55 +L45 +R12 +L91 +L25 +R299 +L55 +L150 +L48 +R98 +L19 +L86 +R46 +R40 +R26 +L454 +R7 +L946 +L33 +L19 +L981 +R7 +L7 +L51 +R51 +R97 +R731 +R59 +L25 +L18 +R56 +R69 +L468 +L65 +L36 +L66 +R66 +R38 +R62 +L13 +L79 +L608 +R90 +R80 +L74 +L25 +L17 +L16 +L26 +R88 +R12 +L12 +L50 +R22 +R89 +R7 +R665 +R467 +L86 +L83 +L31 +R91 +R9 +L31 +L69 +R11 +L6 +L605 +L7 +R99 +R8 +L76 +L982 +R53 +L92 +R92 +R56 +R49 +R90 +L90 +R82 +L882 +R859 +L8 +L201 +L34 +L69 +L47 +L25 +L73 +L75 +R25 +R690 +R44 +L9 +L77 +L238 +L62 +L83 +R27 +L89 +L355 +R78 +L538 +R81 +L69 +L61 +R809 +R89 +R11 +R393 +R292 +L96 +L2 +L62 +R475 +R50 +R41 +R9 +R28 +L40 +L49 +R25 +L31 +L372 +R39 +R672 +R32 +R96 +R41 +L941 +L18 +R76 +L58 +L59 +R429 +L370 +R55 +R87 +R86 +R72 +R29 +R71 +L92 +L462 +L97 +R61 +R90 +L39 +L61 +R93 +L39 +R23 +R23 +R40 +R360 +R769 +L69 +R3 +L757 +R18 +L5 +R74 +L14 +R76 +R82 +L436 +R50 +L91 +L66 +R66 +R269 +R92 +L61 +R83 +R758 +R2 +L43 +L575 +L922 +R21 +L50 +L70 +R96 +R38 +R62 +L85 +R75 +R10 +R129 +L30 +L99 +L92 +R592 +L13 +R30 +R56 +R29 +L27 +R94 +R65 +L22 +L95 +R83 +L682 +R71 +L22 +L1 +L77 +L37 +L3 +R51 +R59 +R41 +L93 +R85 +L90 +L2 +L18 +R60 +R58 +R90 +R10 +R6 +L81 +L25 +R5 +R45 +L15 +L35 +L37 +R31 +L391 +L29 +R313 +L388 +L99 +L25 +R8 +L48 +R65 +L88 +R70 +R68 +R50 +R257 +R43 +L92 +L47 +L26 +L573 +R38 +R31 +R826 +R43 +R5 +L79 +R970 +R53 +R1 +L41 +R68 +R52 +R71 +R65 +L93 +L572 +L47 +R47 +L40 +L94 +L66 +R56 +R44 +R84 +R754 +L316 +R98 +R440 +L97 +R37 +R61 +L57 +R13 +R83 +R31 +R98 +L29 +L82 +R982 +L632 +L968 +R60 +L60 +L19 +R419 +L864 +L36 +L66 +L71 +R37 +L89 +R93 +L32 +L49 +L83 +L540 +L59 +L86 +R45 +L87 +R790 +R697 +R553 +L281 +R41 +R56 +R31 +R70 +L70 +R28 +L28 +L39 +R39 +R86 +R14 +L89 +R89 +R323 +L968 +L55 +R54 +L82 +L97 +L36 +R61 +R19 +L19 +L33 +L51 +L54 +R20 +L79 +L630 +L73 +R61 +R54 +R47 +L62 +R453 +R47 +L40 +R359 +L97 +R4 +R30 +L84 +L72 +R657 +R56 +R95 +L71 +L4 +L92 +L57 +L708 +L42 +R66 +L37 +L463 +L29 +R729 +R96 +L96 +L40 +R40 +L64 +L36 +L529 +R3 +L74 +L33 +L66 +L51 +R6 +L413 +R74 +L67 +L50 +R19 +R181 +L404 +R68 +L76 +L937 +L93 +L10 +L48 +L615 +R11 +R56 +R48 +R69 +R31 +R94 +R672 +R88 +L90 +L44 +L20 +L76 +L24 +L85 +R85 +L374 +L126 +R67 +R97 +R69 +L33 +L3 +R19 +L79 +L86 +L132 +L37 +R18 +L288 +L12 +R55 +R45 +R83 +R62 +R55 +L78 +R859 +R19 +L34 +L966 +L35 +R29 +L94 +L23 +R75 +R22 +R55 +R399 +R38 +R428 +R6 +L30 +R24 +L75 +L97 +R29 +R56 +R22 +L54 +R25 +R999 +R95 +L269 +L659 +L13 +R34 +L68 +L25 +R6 +L23 +L58 +R81 +R68 +L68 +R634 +R66 +R89 +R79 +R32 +L37 +L63 +R25 +L80 +R72 +L852 +L365 +L7 +R42 +L60 +L58 +L823 +L94 +L59 +R306 +L25 +R78 +L29 +R29 +R86 +L486 +R891 +L94 +R3 +L13 +L60 +R97 +L424 +R76 +L76 +R919 +R81 +L23 +L577 +L81 +R25 +L44 +L91 +R916 +L86 +L809 +L47 +R725 +L5 +R46 +L49 +L291 +L29 +R92 +R668 +L40 +R91 +R909 +L50 +L50 +L14 +R19 +L5 +R59 +R7 +R54 +R58 +R73 +R97 +L553 +R78 +R30 +L75 +R38 +R60 +R74 +R86 +R187 +R27 +R5 +R19 +L142 +L18 +L47 +L64 +R21 +L74 +R75 +R25 +L87 +L63 +R512 +L79 +L19 +L45 +R81 +L40 +L47 +L13 +L11 +R953 +L42 +R90 +L95 +R22 +L40 +L57 +L20 +R978 +R98 +L90 +L23 +L90 +L98 +R325 +L92 +L8 +L497 +R12 +R85 +L64 +L99 +L37 +L91 +R491 +R15 +L90 +L395 +L14 +R84 +L38 +R475 +L45 +R19 +L11 +L51 +L49 +L72 +L69 +R96 +R45 +R86 +R33 +L19 +L99 +L795 +R94 +R37 +R66 +L76 +L76 +R49 +R61 +R39 +L917 +L8 +L52 +L44 +R21 +R15 +R99 +L314 +R27 +R71 +R198 +L754 +L691 +R16 +L67 +R13 +L13 +R64 +L54 +L70 +R68 +L59 +L649 +R23 +R314 +L37 +R14 +L57 +L298 +L59 +L810 +L160 +R53 +R72 +L43 +L12 +R97 +L36 +L6 +L62 +R598 +R9 +R1 +R426 +L41 +R484 +R30 +L72 +L51 +R62 +L39 +R78 +R38 +L91 +R75 +L97 +R18 +L604 +R34 +L85 +L7 +R41 +L6 +L81 +R87 +R9 +L39 +L2 +L48 +L46 +L391 +R917 +R10 +L83 +L31 +L978 +R144 +R42 +R96 +L44 +R56 +L3 +L40 +R23 +L75 +L17 +R61 +L57 +R396 +R41 +L96 +R13 +R33 +L72 +R81 +L29 +R26 +L97 +L33 +R44 +R526 +R12 +R44 +R12 +R36 +L87 +R546 +R67 +R91 +L52 +R184 +L90 +R99 +L47 +R26 +R22 +L84 +R67 +L83 +R21 +L293 +L176 +R66 +R53 +R77 +R31 +L44 +L47 +L588 +L974 +L226 +L86 +L32 +R84 +L966 +L99 +L852 +L9 +R48 +R74 +R28 +L68 +L22 +L4 +L54 +R60 +L81 +L921 +R62 +R38 +R67 +L79 +L18 +R430 +R52 +L86 +L45 +L92 +L129 +R69 +R88 +R98 +R70 +L25 +L60 +L840 +R629 +L29 +R86 +L86 +L44 +R75 +L23 +R92 +L626 +R26 +R26 +L26 +L42 +L818 +R860 +R50 +R40 +L90 +L509 +L391 +R14 +R51 +L655 +L10 +R38 +L38 +R63 +R63 +L20 +R97 +R97 +R87 +L45 +R395 +L37 +L34 +R41 +L90 +L417 +L94 +R76 +R18 +L69 +R79 +L323 +L79 +L97 +L49 +R23 +L385 +L63 +L37 +L1 +L99 +R85 +R15 +L91 +R91 +L93 +R10 +L74 +R85 +L47 +R19 +R20 +R83 +L64 +L897 +L272 +L370 +R59 +R41 +R80 +L80 +R63 +R337 +L5 +L95 +R31 +R28 +R337 +L58 +R18 +R26 +R61 +R602 +L145 +L47 +R29 +R90 +L72 +L67 +R11 +R92 +R871 +R893 +R25 +R75 +R9 +L9 +R5 +L5 +L461 +L869 +L570 +R82 +L46 +L36 +R25 +L538 +L87 +L479 +R79 +L49 +R16 +R44 +R589 +L576 +R735 +R41 +L832 +R32 +L71 +R471 +L17 +L982 +R74 +L75 +L723 +L77 +R33 +R67 +L27 +R27 +R84 +L84 +R64 +L58 +L73 +R67 +L32 +R82 +R14 +R8 +R74 +R316 +R8 +L70 +L811 +R11 +R54 +R46 +L32 +R29 +R17 +L14 +R11 +R89 +R85 +L24 +R8 +R50 +R81 +L923 +R23 +L37 +L63 +R16 +L16 +R494 +R6 +L73 +L68 +L637 +R78 +L93 +L107 +L733 +R33 +L838 +R31 +R7 +L53 +L47 +R490 +R17 +R93 +R43 +R17 +L8 +R37 +R11 +L56 +R67 +L40 +R67 +L54 +L284 +L959 +L41 +R87 +R13 +L18 +L131 +R49 +L264 +R27 +R80 +R957 +L121 +R919 +L20 +L78 +L74 +R56 +R18 +L70 +L30 +R74 +R31 +L18 +L31 +L51 +L36 +L69 +R19 +R70 +R201 +L71 +R81 +L17 +R88 +R29 +L479 +R14 +R65 +R21 +R74 +R5 +R12 +L12 +L45 +L55 +R79 +L79 +R243 +L90 +L14 +L39 +L41 +L299 +L99 +R39 +L36 +L78 +L41 +L14 +R13 +L77 +R50 +R583 +L851 +R19 +R93 +R239 +R568 +L68 +L572 +L28 +L20 +L77 +L59 +R56 +R99 +L99 +R745 +L45 +L19 +R19 +L21 +R885 +L74 +R10 +R911 +R38 +L49 +L431 +R231 +R57 +R43 +R12 +R88 +L36 +L39 +L887 +R62 +R72 +R528 +R426 +R74 +R77 +L77 +R32 +R72 +R796 +R16 +R2 +R5 +R77 +L43 +R43 +L94 +R71 +L732 +R72 +R626 +R57 +L495 +R28 +R70 +R88 +R9 +L64 +R564 +L38 +R38 +R620 +R82 +R80 +R63 +L826 +L19 +L23 +L81 +L55 +L741 +L77 +R36 +L59 +L33 +R33 +L99 +L72 +L20 +L9 +R241 +L41 +R86 +L86 +L93 +L36 +R435 +L6 +L38 +L20 +L55 +R69 +R70 +R44 +R30 +R81 +R86 +L64 +R74 +R80 +R545 +L1 +L627 +L23 +R60 +R189 +L86 +R86 +R8 +R804 +R627 +R71 +L57 +R48 +L84 +R87 +L83 +R179 +L97 +R36 +L12 +R960 +L45 +L48 +L67 +R462 +R711 +L39 +R539 +R666 +L31 +L35 +R8 +L79 +R50 +L879 +R61 +R62 +R177 +R47 +L47 +L82 +L45 +L73 +R17 +R49 +L18 +L98 +R250 +L57 +L15 +L28 +L94 +R36 +L194 +R52 +L269 +L931 +L939 +L161 +R193 +R41 +L42 +L92 +L12 +L88 +R831 +L731 +R85 +R58 +R41 +R64 +R122 +R5 +L6 +R8 +R23 +R11 +L14 +R103 +L7 +L45 +L43 +R95 +R47 +R94 +R779 +R86 +R43 +L20 +L60 +L69 +R128 +R827 +L55 +L26 +R28 +R710 +L12 +L332 +L68 +R14 +L77 +R12 +L12 +R328 +R935 +L412 +R28 +L456 +R97 +R67 +L24 +R87 +R913 +R98 +R502 +L840 +L56 +L54 +R450 +L88 +R94 +L68 +R38 +R38 +R88 +R98 +R28 +R72 +R83 +R69 +R5 +L57 +R53 +L389 +R636 +R89 +L89 +R504 +R10 +R986 +R42 +R458 +R75 +L16 +L94 +L65 +R76 +R724 +R14 +L14 +L60 +L88 +R87 +R47 +R57 +R57 +L13 +L772 +R16 +R51 +L82 +L74 +R74 +L54 +L74 +L77 +R5 +L408 +R50 +R12 +R46 +L62 +R44 +L54 +R772 +L4 +L96 +L17 +L30 +R56 +R39 +R92 +R460 +R5 +L5 +L51 +R351 +L84 +L347 +R37 +R863 +R233 +L45 +R543 +R74 +L874 +L45 +R45 +L149 +R49 +L85 +L14 +L26 +L75 +L34 +L573 +R85 +L78 +L13 +L92 +L95 +R252 +L11 +L469 +L72 +L98 +L20 +R30 +L312 +L711 +R4 +R120 +R69 +R85 +R33 +R72 +R74 +L46 +R95 +L295 +L87 +L96 +R94 +R78 +L95 +L52 +L22 +L260 +L23 +L137 +R507 +R793 +L96 +L4 +R27 +L527 +R70 +R30 +R61 +R75 +R56 +R83 +L17 +R58 +L916 +L31 +L19 +L50 +L70 +R2 +R68 +L16 +L3 +R69 +L84 +R8 +L267 +R93 +R88 +L88 +L76 +R578 +R708 +R23 +L74 +R41 +R38 +L38 +R857 +R43 +R13 +L432 +L15 +R99 +R43 +L4 +L87 +R40 +L644 +R379 +R81 +R65 +L96 +R58 +R98 +R5 +L80 +R77 +R70 +L24 +L60 +R53 +L39 +R66 +L344 +L1 +R56 +L77 +L90 +R775 +R15 +R16 +R84 +L41 +R41 +L8 +R98 +L890 +R9 +R3 +R54 +L80 +L83 +R65 +R33 +R1 +L356 +L108 +L10 +L851 +R27 +R42 +R46 +L692 +L817 +L83 +R58 +R42 +R51 +L74 +R23 +R957 +R86 +R70 +R724 +R14 +L851 +L42 +R42 +R83 +L83 +L38 +R438 +R724 +L17 +R938 +L45 +R50 +R50 +R118 +R82 +L22 +R856 +L86 +L48 +R96 +R78 +R36 +R95 +R3 +R92 +L11 +L52 +L57 +R76 +L56 +R85 +R15 +R6 +L21 +L61 +R21 +R86 +L43 +L66 +R46 +L30 +L689 +R12 +L11 +R57 +R66 +R41 +L69 +L45 +R18 +R679 +L37 +L652 +R31 +L96 +L80 +L963 +L24 +R24 +R99 +L4 +L9 +L86 +L74 +R78 +L38 +R34 +L21 +R21 +L554 +R20 +R133 +L99 +R56 +L556 +R539 +L77 +L1 +L19 +R380 +R78 +R870 +L368 +L85 +R86 +R97 +L47 +R47 +R981 +R59 +R75 +R25 +R60 +L87 +L14 +R501 +L9 +R53 +R56 +R97 +R57 +R921 +L175 +L822 +R22 +L908 +L92 +L45 +R45 +R28 +L28 +L84 +L85 +L613 +L85 +L33 +L20 +L964 +L386 +R70 +L6 +R6 +R553 +R73 +R12 +L13 +L25 +R66 +L45 +L77 +R56 +L4 +R3 +R97 +R4 +L73 +R72 +L19 +R16 +L96 +L91 +R76 +R915 +L20 +R78 +R12 +L70 +L35 +R93 +R99 +R82 +R61 +R70 +L41 +L94 +L35 +L98 +R370 +R84 +L28 +L283 +L991 +R46 +L2 +L34 +L16 +L12 +R283 +L840 +L47 +R31 +L26 +L89 +L857 +R53 +R64 +L208 +L28 +L72 +R1 +R99 +L16 +R633 +R4 +L21 +R91 +R609 +L704 +L1 +R98 +L93 +L848 +L32 +L620 +R807 +R793 +R64 +R36 +L21 +R21 +R70 +L70 +R49 +R251 +R31 +R69 +R93 +R87 +R20 +R58 +R234 +R8 +R74 +R1 +L160 +L669 +R54 +R43 +R96 +R40 +R588 +L264 +R97 +L17 +R617 +R66 +L9 +L59 +R3 +R99 +L58 +R53 +R68 +L63 +L48 +R39 +R85 +R70 +L80 +R34 +L516 +R686 +R45 +L15 +R63 +R37 +L428 +R94 +R68 +L53 +L81 +L956 +L46 +L59 +R261 +L807 +L77 +L80 +L23 +L35 +R22 +L20 +L480 +L493 +R23 +L30 +R96 +L29 +R133 +L90 +R30 +R89 +R71 +R42 +R73 +L385 +R870 +L3 +R3 +L13 +R6 +L493 +R22 +L15 +L7 +R51 +R49 +R585 +L185 +L37 +R77 +R123 +L87 +R24 +L26 +R16 +L374 +R23 +L892 +R17 +R36 +R12 +L181 +R44 +L54 +R79 +R4 +R26 +L95 +L35 +R296 +R4 +L22 +L78 +R80 +R39 +L55 +R66 +R89 +L719 +L448 +L638 +R337 +R49 +L99 +R138 +R52 +R83 +L96 +L13 +R17 +R27 +R91 +R667 +R91 +L58 +L759 +L41 +R97 +R231 +L65 +L71 +L76 +L22 +R6 +L90 +R51 +L28 +R30 +L63 +R8 +R43 +R334 +R94 +L33 +R75 +L472 +L5 +R14 +R28 +R914 +L717 +L55 +L89 +R68 +L55 +L776 +R75 +R49 +R99 +R99 +R4 +R898 +R67 +L34 +R67 +R758 +R90 +L92 +R43 +L79 +R114 +L22 +R687 +R78 +R23 +R63 +R95 +R27 +R5 +R10 +R86 +L67 +R30 +L7 +R42 +L949 +L35 +L14 +R292 +L371 +R93 +R43 +R57 +R52 +L92 +R318 +L17 +L73 +L88 +R14 +L518 +R72 +R724 +R10 +L80 +R74 +R145 +L92 +L99 +R98 +L48 +R85 +L85 +L440 +L5 +R7 +R663 +L125 +L92 +L8 +L26 +R26 +R96 +R79 +R25 +R50 +L50 +R32 +L32 +R71 +R72 +R2 +R42 +R13 +L84 +L23 +L47 +L337 +R91 +R66 +L66 +L17 +L318 +L46 +R316 +R52 +R70 +L135 +L22 +R34 +L34 +L41 +L18 +R86 +L426 +L84 +R513 +L1 +R22 +L16 +R298 +L33 +R39 +L639 +R68 +L134 +R66 +L62 +R79 +L17 +R42 +R58 +R82 +L82 +L76 +L207 +L9 +R92 +R99 +R1 +L41 +R79 +R351 +R11 +R730 +R70 +R18 +L18 +R19 +R61 +R976 +L137 +R834 +L53 +L741 +R763 +L15 +R48 +L90 +R52 +L550 +L90 +R23 +R184 +R953 +L37 +R89 +L89 +L775 +R8 +R67 +R78 +R22 +L392 +L80 +L28 +L30 +L41 +L82 +L372 +L175 +R69 +L69 +L90 +R71 +L52 +R49 +L878 +R76 +L57 +L23 +L85 +R82 +L73 +L20 +R81 +L18 +R17 +R46 +L44 +L82 +L67 +R2 +L10 +R9 +R66 +L680 +L39 +R60 +R59 +L65 +R479 +L73 +R59 +R51 +L57 +R206 +L89 +L65 +L88 +R31 +R39 +L28 +R135 +R665 +L36 +R37 +L95 +R20 +R38 +L853 +R89 +L298 +L2 +L6 +R6 +L49 +R5 +L56 +R27 +R73 +R249 +R56 +L120 +R23 +R97 +L105 +R28 +R389 +R49 +L36 +R76 +L6 +R43 +L543 +R366 +R76 +R57 +L61 +R62 +R554 +R96 +R250 +L27 +R82 +R745 +L266 +L34 +R2 +R51 +R5 +R42 +L21 +L480 +R101 +R932 +R810 +L5 +R232 +R373 +L42 +R68 +L12 +L30 +R74 +L35 +L65 +R63 +R452 +L67 +L95 +R465 +L75 +L23 +R62 +L82 +L877 +R90 +R53 +L60 +L6 +R81 +R926 +L192 +R85 +L10 +L17 +L97 +L98 +R59 +L49 +R73 +L61 +L25 +R84 +L59 +R76 +R79 +L6 +L69 +L99 +L38 +R64 +L7 +L49 +L93 +L58 +R59 +R41 +R77 +L86 +R9 +R68 +R32 +R20 +L20 +R44 +R95 +R83 +R89 +L14 +L97 +L15 +R68 +R69 +L7 +R73 +L15 +L56 +R74 +L91 +R43 +R47 +L40 +R50 +R44 +R56 +L61 +L18 +L21 +R69 +R31 +L71 +L29 +L27 +L73 +L61 +R75 +R86 +L90 +R32 +L26 +L3 +R46 +L38 +L18 +R36 +R7 +R21 +R6 +R19 +R43 +R1 +R17 +R13 +L17 +R3 +L35 +L31 +L45 +L1 +L31 +L44 +L43 +L23 +L2 +R9 +R7 +L35 +L12 +L5 +R35 +R5 +R23 +R32 +L43 +L23 +L36 +R8 +R23 +R4 +L25 +L49 +R43 +R37 +R47 +L38 +L9 +R18 +R10 + diff --git a/mark/day1/part1.rb b/mark/day1/part1.rb new file mode 100644 index 0000000..65fda80 --- /dev/null +++ b/mark/day1/part1.rb @@ -0,0 +1,29 @@ +class RotationDecoder + def initialize(file_path) + @file_path = file_path + @mapping = { + 'L' => :-, + 'R' => :+ + } + end + + def decode(debug: false) + code = 0 + current_num = 50 + puts "The dial starts by pointing at #{current_num}" if debug + File.readlines(@file_path, chomp: true).map do |line| + next if line.nil? || line.empty? + + direction, *number_arr = line.split('') + number = Integer(number_arr.join) + current_num = current_num.send(@mapping[direction], number) % 100 + code += 1 if current_num == 0 + puts "The dial is rotaded #{line} to point at #{current_num}" if debug + end + + code + end +end + +rd = RotationDecoder.new('input.txt') +puts "The code is: #{rd.decode}" diff --git a/mark/day1/part2.rb b/mark/day1/part2.rb new file mode 100644 index 0000000..b77d577 --- /dev/null +++ b/mark/day1/part2.rb @@ -0,0 +1,53 @@ +require 'debug' + +class RotationDecoder + def initialize(file_path) + @file_path = file_path + @mapping = { + 'L' => :-, + 'R' => :+ + } + end + + def decode(debug: false) + code = 0 + current_num = 50 + puts "The dial starts by pointing at #{current_num}" if debug + File.readlines(@file_path, chomp: true).map do |line| + next if line.nil? || line.empty? + direction, *number_arr = line.split('') + number = Integer(number_arr.join) + + full_rotations = number / 100 + rest = number - full_rotations * 100 + + raw_num = current_num.send(@mapping[direction], rest) + + # include 100 since that does not pass *through* zero but becomes exactly zero. + passes_zero = 0 + + if current_num != 0 + passes_zero = (0 <= raw_num && raw_num <= 100) ? 0 : 1 + end + + current_num = raw_num % 100 + print "The dial is rotaded #{line} to point at #{current_num}" if debug + print "; during this rotation, it points at 0 #{full_rotations + passes_zero} times" if debug && full_rotations + passes_zero > 0 + print "\n" if debug + + code += full_rotations + passes_zero + code += 1 if current_num == 0 + end + + code + end +end + +if ARGV[0].nil? || ARGV[0].empty? + puts "Usage: ruby part2.rb [debug]" + exit 1 +end + +debug = (ARGV[1] == "debug") +rd = RotationDecoder.new(ARGV[0]) +puts "The code is: #{rd.decode(debug:)}" diff --git a/mark/day2/example.txt b/mark/day2/example.txt new file mode 100644 index 0000000..bd04584 --- /dev/null +++ b/mark/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 \ No newline at end of file diff --git a/mark/day2/input.txt b/mark/day2/input.txt new file mode 100644 index 0000000..34b9d7b --- /dev/null +++ b/mark/day2/input.txt @@ -0,0 +1 @@ +1090286-1131879,3259566-3404881,138124-175118,266204727-266361099,16765-24272,7657360692-7657593676,88857504-88926597,6869078-6903096,48444999-48532270,61427792-61580535,71-103,8077-10421,1920-2560,2-17,951-1259,34-50,28994-36978,1309-1822,9393918461-9393960770,89479-120899,834641-988077,5389718924-5389797353,34010076-34214499,5063-7100,607034-753348,19098586-19261191,125085556-125188689,39839-51927,3246-5037,174-260,439715-473176,187287-262190,348-535,58956-78301,4388160-4505757,512092-584994,13388753-13534387 \ No newline at end of file diff --git a/mark/day2/part1.rb b/mark/day2/part1.rb new file mode 100644 index 0000000..8b8dce0 --- /dev/null +++ b/mark/day2/part1.rb @@ -0,0 +1,57 @@ +require 'debug' + +class ValidIdFilter + def initialize(file_path) + @file_path = file_path + end + + def sum_invalid_ids(debug: false) + ranges = parse_input(File.read(@file_path)) + invalid_ids = ranges.flat_map {|range| get_invalid_ids_from_range(range)} + invalid_ids.sum + end + + private + + # @param [Range] e.g., 11-22 + # @return [] array of invalid ids in range + def get_invalid_ids_from_range(range) + range.select {|element| invalid_id?(element)} + end + + def invalid_id?(integer) + # ID is invalid if it is made only of some sequence of digits repeated twice + string = integer.to_s + num_digits = string.length + + # some sequence repeated twice => number of digits must be even + return false if num_digits % 2 != 0 + + half_length = num_digits / 2 + + string[0...half_length] == string[half_length..-1] + end + + # @param [String] full input e.g., "11-22,33-604,..." + # @return [] e.g., [11..22, 33..604, ...] + def parse_input(input) + input.split(',').map {|range| to_range(range)} + end + + # @param [String] e.g., "11-22" + # @return [Range] e.g., 11..22 (inclusive) + def to_range(string) + boundaries = string.split('-').map(&:to_i) + raise "Invalid boundaries for #{string}, got #{boundaries.inspect}" if boundaries.length != 2 + Range.new(boundaries[0], boundaries[1]) + end +end + +if ARGV[0].nil? || ARGV[0].empty? + puts "Usage: ruby part1.rb [debug]" + exit 1 +end + +debug = (ARGV[1] == "debug") +filter = ValidIdFilter.new(ARGV[0]) +puts "The answer is: #{filter.sum_invalid_ids(debug:)}" diff --git a/mark/day2/part2.rb b/mark/day2/part2.rb new file mode 100644 index 0000000..8b8e0d9 --- /dev/null +++ b/mark/day2/part2.rb @@ -0,0 +1,74 @@ +require 'debug' +require 'prime' + +class ValidIdFilter + def initialize(file_path, debug: false) + @file_path = file_path + @debug = debug + end + + def sum_invalid_ids + ranges = parse_input(File.read(@file_path)) + invalid_ids = ranges.flat_map {|range| get_invalid_ids_from_range(range)} + puts invalid_ids.inspect if @debug + invalid_ids.sum + end + + private + + # @param [Range] e.g., 11-22 + # @return [] array of invalid ids in range + def get_invalid_ids_from_range(range) + range.select do |element| + invalid_id?(element) + end + end + + def invalid_id?(integer) + # ID is invalid if it is made only of some sequence of digits repeated AT LEAST twice + string = integer.to_s + num_digits = string.length + + puts "is #{string} an invalid ID?" if @debug + + (1...num_digits).each do |n| + next if num_digits % n != 0 + + slices = string.chars.each_slice(n).map(&:join) + puts "...trying divisior #{n}: #{slices} ..." if @debug + return true if slices.uniq.length == 1 && slices.length > 1 + end + + false + end + + # @param [String] full input e.g., "11-22,33-604,..." + # @return [] e.g., [11..22, 33..604, ...] + def parse_input(input) + input.split(',').map {|range| to_range(range)} + end + + # @param [String] e.g., "11-22" + # @return [Range] e.g., 11..22 (inclusive) + def to_range(string) + boundaries = string.split('-').map(&:to_i) + raise "Invalid boundaries for #{string}, got #{boundaries.inspect}" if boundaries.length != 2 + Range.new(boundaries[0], boundaries[1]) + end +end + +if ARGV[0].nil? || ARGV[0].empty? + puts "Usage: ruby part2.rb [debug]" + exit 1 +end + +debug = (ARGV[1] == "debug") +filter = ValidIdFilter.new(ARGV[0], debug:) +puts "The answer is: #{filter.sum_invalid_ids}" + +# The answer is: 41662374059 + +# real 0m24,122s +# user 0m24,049s +# sys 0m0,070s + diff --git a/mark/day3/example.txt b/mark/day3/example.txt new file mode 100644 index 0000000..7255fca --- /dev/null +++ b/mark/day3/example.txt @@ -0,0 +1,4 @@ +987654321111111 +811111111111119 +234234234234278 +818181911112111 diff --git a/mark/day3/input.txt b/mark/day3/input.txt new file mode 100644 index 0000000..fc7c422 --- /dev/null +++ b/mark/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/mark/day3/part1.rb b/mark/day3/part1.rb new file mode 100644 index 0000000..888d405 --- /dev/null +++ b/mark/day3/part1.rb @@ -0,0 +1,49 @@ +require 'debug' + +module FileHandler + def self.read_lines(file_path) + File.readlines(file_path, chomp: true).map do |line| + yield(line) + end + end + + def self.read_file(file_path) + File.read(file_path) + end +end + +class JoltageCalculator + def initialize(file_path, debug: false) + @file_path = file_path + @debug = debug + end + + def calculate_total_joltage + total = 0 + FileHandler.read_lines(@file_path) do |line| + int_array = line.split('').map(&:to_i) + length = int_array.length + first_digit = int_array.slice(0, length - 1).max + first_pos = int_array.find_index(first_digit) + second_digit = int_array.slice(first_pos + 1, length).max + total += "#{first_digit}#{second_digit}".to_i + end + total + end +end + +if ARGV[0].nil? || ARGV[0].empty? + puts "Usage: ruby part1.rb [debug]" + exit 1 +end + +debug = (ARGV[1] == "debug") +calculator = JoltageCalculator.new(ARGV[0], debug:) +puts "The answer is: #{calculator.calculate_total_joltage}" + +# The answer is: 17166 + +# real 0m0,256s +# user 0m0,207s +# sys 0m0,049s + diff --git a/mark/day3/part1_prep_for_2.rb b/mark/day3/part1_prep_for_2.rb new file mode 100644 index 0000000..637f281 --- /dev/null +++ b/mark/day3/part1_prep_for_2.rb @@ -0,0 +1,67 @@ +require 'debug' + +module FileHandler + def self.read_lines(file_path) + File.readlines(file_path, chomp: true).map do |line| + yield(line) + end + end + + def self.read_file(file_path) + File.read(file_path) + end +end + +class JoltageCalculator + def initialize(file_path, debug: false) + @file_path = file_path + @debug = debug + end + + def calculate_total_joltage + total = 0 + FileHandler.read_lines(@file_path) do |line| + int_array = line.split('').map(&:to_i) + total += calculate_joltage(int_array) + end + total + end + + # @param [] bank + def calculate_joltage(bank) + joltage = '' + + first_digit, first_pos = max_and_index_from_slice(bank, 1) + + joltage += first_digit.to_s + + + sub_bank = bank.slice(first_pos + 1, bank.length) + second_digit, _ = max_and_index_from_slice(sub_bank, 0) + + joltage += second_digit.to_s + + joltage.to_i + end + + private + + # Get max and index from the first part of the array. Ignore the last `offset` + # number of digits. + # @param [] array + # @param [integer] offset + def max_and_index_from_slice(array, offset) + maximum = array.slice(0, array.length - offset).max + index = array.find_index(maximum) + [maximum, index] + end +end + +if ARGV[0].nil? || ARGV[0].empty? + puts "Usage: ruby part2.rb [debug]" + exit 1 +end + +debug = (ARGV[1] == "debug") +calculator = JoltageCalculator.new(ARGV[0], debug:) +puts "The answer is: #{calculator.calculate_total_joltage}" diff --git a/mark/day3/part2.rb b/mark/day3/part2.rb new file mode 100644 index 0000000..56cb1a1 --- /dev/null +++ b/mark/day3/part2.rb @@ -0,0 +1,91 @@ +require 'debug' + +module FileHandler + def self.read_lines(file_path) + File.readlines(file_path, chomp: true).map do |line| + yield(line) + end + end + + def self.read_file(file_path) + File.read(file_path) + end +end + +class JoltageCalculator + def initialize(file_path, debug: false) + @file_path = file_path + @debug = debug + end + + def calculate_total_joltage + total = 0 + FileHandler.read_lines(@file_path) do |line| + int_array = line.split('').map(&:to_i) + total += calculate_joltage(int_array) + end + total + end + + # @param [] bank + def _calculate_joltage(bank) + joltage = '' + + first_digit, first_pos = max_and_index_from_slice(bank, 1) + + joltage += first_digit.to_s + + + sub_bank = bank.slice(first_pos + 1, bank.length) + second_digit, _ = max_and_index_from_slice(sub_bank, 0) + + joltage += second_digit.to_s + + joltage.to_i + end + + # @param [] bank + def calculate_joltage(bank, total_digits: 12) + joltage = '' + + current_offset = total_digits - 1 + + while current_offset >= 0 + maximum, i = max_and_index_from_slice(bank, current_offset) + + joltage += maximum.to_s + + bank = bank.slice(i + 1, bank.length) + current_offset -= 1 + end + + joltage.to_i + end + + private + + # Get max and index from the first part of the array. Ignore the last `offset` + # number of digits. + # @param [] array + # @param [integer] offset + def max_and_index_from_slice(array, offset) + maximum = array.slice(0, array.length - offset).max + index = array.find_index(maximum) + [maximum, index] + end +end + +if ARGV[0].nil? || ARGV[0].empty? + puts "Usage: ruby part2.rb [debug]" + exit 1 +end + +debug = (ARGV[1] == "debug") +calculator = JoltageCalculator.new(ARGV[0], debug:) +puts "The answer is: #{calculator.calculate_total_joltage}" + +# The answer is: 169077317650774 + +# real 0m0,260s +# user 0m0,222s +# sys 0m0,038s