From 9964446e5e77c789ab5b3e100ff1c0c3caee71ea Mon Sep 17 00:00:00 2001 From: Oschly Date: Mon, 1 Dec 2025 23:02:00 +0100 Subject: [PATCH] Day 1 --- .gitignore | 2 + Cargo.toml | 6 + mise.toml | 2 + src/day1/dial_position.rs | 177 ++ src/day1/input.txt | 4753 +++++++++++++++++++++++++++++++++++++ src/day1/mod.rs | 29 + src/main.rs | 5 + 7 files changed, 4974 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 mise.toml create mode 100644 src/day1/dial_position.rs create mode 100644 src/day1/input.txt create mode 100644 src/day1/mod.rs create mode 100644 src/main.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..96ef6c0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..7a244f5 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "rust-aoc-2025" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/mise.toml b/mise.toml new file mode 100644 index 0000000..95d23b8 --- /dev/null +++ b/mise.toml @@ -0,0 +1,2 @@ +[tools] +rust = "latest" diff --git a/src/day1/dial_position.rs b/src/day1/dial_position.rs new file mode 100644 index 0000000..4c2da1d --- /dev/null +++ b/src/day1/dial_position.rs @@ -0,0 +1,177 @@ +pub struct DialPosition { + pub current_position: i16, + pub zero_hits_count: u32, +} + +impl DialPosition { + const DIAL_MAX: i16 = 99; + const DIAL_COUNT: i16 = 100; + + pub fn new(current_position: i16) -> Self { + Self { + current_position, + zero_hits_count: 0, + } + } + + pub fn rotated_left(&self, rotation: u64) -> Self { + let (remaining, reduce_hits_count) = DialPosition::reduce_rotation(rotation); + let current_position_u64 = self.current_position; + let (result, clamp_hits_count) = self.clamp(current_position_u64 - remaining); + + Self { + current_position: result, + zero_hits_count: self.zero_hits_count + clamp_hits_count + reduce_hits_count, + } + } + + pub fn rotated_right(&self, rotation: u64) -> Self { + let (remaining, reduce_hits_count) = DialPosition::reduce_rotation(rotation); + let (result, clamp_hits_count) = self.clamp(self.current_position + remaining); + + Self { + current_position: result, + zero_hits_count: self.zero_hits_count + clamp_hits_count + reduce_hits_count, + } + } + + fn reduce_rotation(rotation: u64) -> (i16, u32) { + let mut remaining = rotation; + let mut zero_hits_count = 0; + while remaining > u64::try_from(DialPosition::DIAL_MAX).unwrap() { + remaining -= u64::try_from(DialPosition::DIAL_COUNT).unwrap(); + zero_hits_count += 1; + } + + (i16::try_from(remaining).unwrap(), zero_hits_count) + } + + fn clamp(&self, value: i16) -> (i16, u32) { + if value > DialPosition::DIAL_MAX { + (value - 100, 1) + } else if value < 0 { + (100 + value, if self.current_position != 0 { 1 } else { 0 }) + } else { + (value, if value == 0 { 1 } else { 0 }) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn dial_rotated_right_from_0_by_2_gives_2() { + let result = DialPosition::new(0).rotated_right(2); + assert_eq!(result.current_position, 2); + } + + #[test] + fn dial_rotated_right_from_0_by_102_gives_2() { + let result = DialPosition::new(0).rotated_right(102); + assert_eq!(result.current_position, 2); + } + + #[test] + fn dial_rotated_left_from_0_by_2_gives_98() { + let result = DialPosition::new(0).rotated_left(2); + assert_eq!(result.current_position, 98); + } + + #[test] + fn dial_rotated_left_from_0_by_102_gives_98() { + let result = DialPosition::new(0).rotated_left(102); + assert_eq!(result.current_position, 98); + } + + #[test] + fn dial_rotated_left_from_5_by_105_gives_0() { + let result = DialPosition::new(5).rotated_left(105); + assert_eq!(result.current_position, 0); + } + + #[test] + fn dial_rotated_right_from_5_by_105_gives_10() { + let result = DialPosition::new(5).rotated_right(105); + assert_eq!(result.current_position, 10); + } +} + +// part 2 +#[test] +fn dial_from_50_right_1000_hits_zero_10_times() { + let result = DialPosition::new(50).rotated_right(1000); + assert_eq!(result.current_position, 50); + assert_eq!(result.zero_hits_count, 10); +} + +#[test] +fn dial_from_50_left_68_hits_zero_once() { + let result = DialPosition::new(50).rotated_left(68); + assert_eq!(result.current_position, 82); + assert_eq!(result.zero_hits_count, 1); +} + +#[test] +fn dial_from_82_left_30_no_zero_hit() { + let result = DialPosition::new(82).rotated_left(30); + assert_eq!(result.current_position, 52); + assert_eq!(result.zero_hits_count, 0); +} + +#[test] +fn dial_from_52_right_48_lands_on_zero() { + let result = DialPosition::new(52).rotated_right(48); + assert_eq!(result.current_position, 0); + assert_eq!(result.zero_hits_count, 1); +} + +#[test] +fn dial_from_0_left_5_no_zero_hit() { + let result = DialPosition::new(0).rotated_left(5); + assert_eq!(result.current_position, 95); + assert_eq!(result.zero_hits_count, 0); +} + +#[test] +fn dial_from_95_right_60_hits_zero_once() { + let result = DialPosition::new(95).rotated_right(60); + assert_eq!(result.current_position, 55); + assert_eq!(result.zero_hits_count, 1); +} + +#[test] +fn dial_from_55_left_55_lands_on_zero() { + let result = DialPosition::new(55).rotated_left(55); + assert_eq!(result.current_position, 0); + assert_eq!(result.zero_hits_count, 1); +} + +#[test] +fn dial_from_0_left_1_no_zero_hit() { + let result = DialPosition::new(0).rotated_left(1); + assert_eq!(result.current_position, 99); + assert_eq!(result.zero_hits_count, 0); +} + +#[test] +fn dial_from_99_left_99_lands_on_zero() { + let result = DialPosition::new(99).rotated_left(99); + assert_eq!(result.current_position, 0); + assert_eq!(result.zero_hits_count, 1); +} + +#[test] +fn dial_from_0_right_14_no_zero_hit() { + let result = DialPosition::new(0).rotated_right(14); + assert_eq!(result.current_position, 14); + assert_eq!(result.zero_hits_count, 0); +} + +#[test] +fn dial_from_14_left_82_hits_zero_once() { + let result = DialPosition::new(14).rotated_left(82); + assert_eq!(result.current_position, 32); + assert_eq!(result.zero_hits_count, 1); +} diff --git a/src/day1/input.txt b/src/day1/input.txt new file mode 100644 index 0000000..85f1d86 --- /dev/null +++ b/src/day1/input.txt @@ -0,0 +1,4753 @@ +R29 +R6 +L43 +L6 +R28 +L42 +L34 +L32 +L13 +L15 +R29 +L50 +R1 +L26 +L28 +L16 +L23 +R11 +L41 +L37 +R48 +R21 +L48 +L15 +L14 +L2 +L29 +L30 +R18 +L6 +R6 +R7 +R20 +L23 +L47 +L11 +L2 +R34 +L14 +L7 +L33 +R10 +R16 +L9 +R30 +L49 +R17 +R35 +L20 +R49 +L65 +R65 +R29 +R10 +R14 +L54 +L83 +L75 +L41 +R44 +L44 +R54 +R69 +R43 +R98 +R36 +R43 +L43 +R50 +R50 +L85 +R61 +R24 +R97 +L97 +R96 +R72 +R32 +R45 +L45 +R84 +L84 +R37 +R63 +L28 +R13 +L28 +L39 +L18 +L21 +R50 +L69 +L49 +L21 +R36 +L26 +L21 +R5 +L84 +R41 +R304 +R29 +L68 +L6 +R33 +R89 +L14 +R718 +L54 +R74 +L14 +L32 +L757 +R62 +R16 +L21 +L1 +L99 +L63 +L829 +R24 +L32 +L16 +R95 +L79 +R14 +R491 +R7 +L153 +R3 +L62 +L247 +R43 +L770 +R49 +R30 +R236 +R770 +L51 +R41 +R99 +L90 +R90 +R36 +R64 +L95 +R95 +R25 +R99 +L94 +R736 +L314 +R48 +R11 +L6 +L5 +R26 +L26 +L77 +R77 +L180 +L20 +L92 +L8 +L33 +R33 +L10 +R10 +R79 +R73 +L24 +L70 +L29 +L69 +L28 +R68 +R45 +L12 +R66 +L26 +R5 +L478 +L21 +L679 +L70 +L99 +L30 +L1 +R60 +R38 +L30 +R32 +L35 +L12 +L19 +L789 +L45 +R33 +L802 +L75 +L10 +L21 +L4 +R44 +R55 +L940 +L56 +L9 +L28 +R77 +L20 +R10 +R402 +R233 +L889 +R60 +L92 +R5 +L84 +L78 +L11 +L86 +L214 +R59 +R41 +R22 +L22 +L28 +L12 +R24 +R52 +L41 +L94 +L32 +L69 +R34 +R66 +L49 +L51 +R9 +R91 +L68 +R73 +L81 +R694 +R15 +R9 +L9 +L33 +R86 +R190 +R320 +L73 +R12 +R14 +L95 +L545 +R36 +L27 +R94 +R347 +R56 +L51 +L64 +R46 +L73 +R44 +L17 +L83 +R2 +L65 +R46 +L74 +R35 +L91 +R36 +L6 +L780 +R34 +R74 +L43 +L85 +R82 +R18 +L46 +L26 +L41 +L89 +L16 +L39 +R31 +R8 +L682 +R359 +R138 +R63 +L692 +L12 +R722 +R38 +L17 +L99 +R86 +L886 +L69 +R69 +L61 +R33 +R28 +R29 +R71 +L937 +L967 +L96 +L84 +R95 +R89 +L49 +R965 +R84 +R194 +L11 +L12 +R29 +R850 +R50 +R3 +L703 +L74 +L26 +R35 +L135 +R8 +L71 +R88 +R31 +R402 +R42 +R67 +R81 +L48 +R84 +R37 +R390 +R89 +L77 +R47 +L85 +L35 +L7 +R31 +R26 +R84 +R16 +L603 +R17 +R545 +R76 +L82 +L16 +L16 +R612 +R67 +R793 +R15 +L8 +L46 +L27 +L75 +R94 +L15 +L62 +L69 +R37 +L278 +R41 +R2 +L21 +L81 +R13 +R97 +R43 +L135 +R98 +R27 +L26 +R83 +L94 +R940 +L340 +R39 +R55 +L58 +R58 +R10 +R21 +R78 +L328 +R119 +R30 +R66 +L740 +L84 +R90 +L62 +L92 +L8 +L38 +R138 +R375 +R33 +L8 +L40 +R11 +R25 +L28 +L68 +R17 +R52 +R75 +L444 +L92 +L337 +R29 +R386 +R14 +L48 +L52 +R44 +L22 +L22 +L531 +R52 +R35 +R58 +R48 +L62 +R59 +L75 +R17 +L1 +L7 +R36 +L11 +R71 +R11 +L99 +L554 +R76 +R51 +L18 +R44 +L94 +L6 +R639 +R37 +R72 +L84 +R12 +R72 +L64 +R16 +R35 +R765 +L92 +R92 +R24 +R14 +L38 +R523 +R84 +L698 +R591 +R74 +L649 +R75 +R82 +R80 +R538 +L32 +R84 +R79 +L328 +R823 +R974 +R96 +R668 +R55 +R29 +R52 +R45 +L45 +L64 +L36 +L696 +R96 +R65 +R56 +L94 +L27 +R26 +R74 +R77 +R823 +L32 +L3 +L843 +R78 +L54 +R75 +L81 +L88 +R948 +L17 +R44 +R73 +R87 +L6 +R93 +L71 +R47 +L12 +R963 +L51 +R83 +L90 +R14 +L57 +R19 +R92 +R189 +R93 +L93 +R75 +R25 +R31 +R524 +L984 +L71 +R68 +R85 +L53 +R209 +R86 +R5 +R21 +L27 +R97 +R248 +L58 +R65 +L32 +R84 +R76 +R26 +L10 +L290 +L68 +R68 +R8 +R79 +R23 +L410 +L993 +R46 +R715 +R32 +R18 +L10 +L749 +R241 +R286 +R14 +R63 +R97 +L60 +R92 +L392 +L91 +R91 +L1 +R11 +L49 +L61 +L36 +L90 +L74 +L38 +R38 +L8 +L69 +L89 +R35 +R31 +R97 +R63 +R40 +R11 +R93 +R980 +R64 +L548 +L62 +R62 +R80 +R78 +L39 +L19 +R996 +R862 +L536 +L64 +R13 +L51 +L50 +L70 +L59 +L920 +L321 +R81 +R19 +L85 +L10 +L27 +L54 +R76 +R84 +R79 +R46 +R376 +L17 +R94 +L79 +R317 +L9 +L91 +L80 +L920 +L52 +L48 +L28 +L72 +L20 +L745 +L24 +R89 +L37 +R137 +R161 +L361 +L22 +L848 +R70 +R73 +L79 +L94 +L37 +L583 +L80 +L537 +R637 +L6 +L94 +R698 +L976 +R78 +R4 +R773 +L77 +R12 +R43 +R18 +L73 +R85 +L756 +L44 +R21 +R82 +L623 +R3 +R90 +L4 +L13 +L91 +L350 +L54 +L46 +L70 +R27 +L62 +R501 +L32 +L64 +R3 +R68 +L71 +L769 +R31 +L62 +R812 +R57 +L69 +L62 +R43 +R558 +R61 +L177 +L83 +R760 +L36 +L66 +R50 +R53 +L35 +L569 +R39 +L36 +R57 +L57 +L55 +L31 +R32 +R54 +R99 +R89 +L88 +R45 +R55 +R35 +L90 +R716 +L14 +L647 +R74 +L379 +L27 +L85 +L333 +R650 +L1 +L99 +L80 +L44 +R54 +R70 +L2 +R2 +L8 +R964 +L62 +R106 +L71 +R22 +R20 +L63 +L49 +R47 +L6 +R59 +L27 +R68 +R32 +L89 +L13 +L79 +R41 +L92 +R51 +R49 +R11 +R689 +L12 +R12 +L71 +L61 +L875 +L81 +L12 +R908 +L8 +L38 +R38 +R56 +R62 +R933 +R49 +L2 +L326 +R28 +R773 +L71 +R282 +L165 +L22 +L97 +L788 +L50 +R814 +L10 +R34 +L88 +R95 +R743 +R577 +R92 +L71 +L48 +R44 +L44 +L3 +R3 +R71 +L690 +R19 +L8 +R31 +L38 +L49 +L558 +L46 +R988 +L1 +R22 +L41 +L89 +L635 +L80 +R88 +L58 +R56 +L68 +R86 +R76 +R24 +L98 +R82 +R270 +R227 +R79 +L65 +R16 +L11 +L4 +R17 +R82 +L95 +R31 +R92 +R97 +R80 +L13 +L92 +R65 +L60 +R51 +R49 +R38 +L38 +L84 +L716 +R21 +L721 +R59 +R741 +R59 +L75 +R8 +L192 +R599 +L99 +R10 +R90 +L676 +R76 +L745 +L55 +L349 +L73 +L78 +L40 +R43 +R42 +L46 +R87 +R76 +R68 +L30 +R79 +R23 +R98 +L10 +R54 +R59 +L81 +L74 +R49 +R34 +L825 +R52 +R242 +R58 +L58 +R89 +R28 +L17 +L35 +R83 +L13 +R65 +L72 +R72 +L98 +R34 +L49 +R13 +L9 +R9 +R14 +L73 +L41 +L81 +R81 +L18 +R818 +L21 +R21 +R69 +L4 +L34 +L4 +R91 +R42 +L461 +R559 +L58 +L60 +R24 +R36 +L46 +R33 +R766 +L53 +L839 +R39 +R37 +L937 +R59 +R41 +L29 +L81 +L90 +R832 +L40 +R8 +R87 +L694 +R7 +R64 +R90 +R43 +L97 +L11 +R911 +L75 +R175 +R5 +L22 +L83 +L449 +R662 +L13 +L61 +L50 +R77 +L21 +R55 +L62 +R36 +R34 +R14 +L49 +R21 +L673 +R72 +L93 +R84 +R16 +L59 +L41 +L75 +L46 +R52 +R83 +R7 +L21 +L48 +L22 +R70 +L78 +R778 +R50 +R71 +L25 +R83 +R21 +R47 +L198 +L28 +R503 +L85 +R623 +R50 +R88 +L624 +L896 +R20 +R94 +L94 +R84 +R16 +R12 +R288 +L77 +R5 +R27 +L3 +L203 +R51 +L23 +L508 +L13 +L10 +R54 +L1 +R1 +R48 +L9 +R34 +L94 +R21 +L81 +R968 +R13 +R91 +L91 +R48 +L15 +R499 +L34 +L98 +R167 +L19 +R76 +L22 +R98 +L48 +R48 +R43 +L2 +L29 +R12 +R24 +R35 +R17 +R90 +L90 +R917 +R39 +L71 +L885 +R35 +L35 +R47 +L88 +L55 +L33 +L571 +L389 +R3 +R47 +R29 +L59 +L28 +R56 +L259 +R405 +R95 +L4 +R93 +L89 +R67 +L93 +L269 +L47 +L58 +R54 +L60 +R6 +L40 +R91 +L51 +L79 +R804 +R74 +L46 +R16 +L80 +L46 +L43 +L90 +R25 +L35 +R78 +L78 +R48 +L98 +R723 +R27 +R71 +R42 +R87 +L341 +L59 +R29 +R4 +R64 +R42 +R68 +L79 +L9 +R54 +L618 +L71 +R916 +L97 +L3 +R10 +L10 +L37 +L58 +L46 +R28 +L66 +L63 +R33 +R770 +L4 +R43 +L26 +R59 +R83 +R84 +R18 +L35 +R23 +R94 +L85 +L15 +R52 +R60 +L332 +L98 +L51 +L29 +L47 +R5 +L60 +L5 +R705 +R7 +R10 +L5 +L77 +L60 +R83 +R542 +L2 +R2 +R29 +R71 +R79 +R292 +L49 +R18 +L99 +R459 +L13 +R13 +L91 +L7 +L2 +L44 +R44 +L98 +L643 +L40 +L19 +L40 +L12 +R52 +R26 +R18 +L41 +L3 +R64 +L64 +R841 +L164 +L437 +R60 +L87 +L10 +R865 +R84 +L952 +L4 +R4 +L62 +R34 +L18 +R37 +R76 +L37 +L30 +L86 +R84 +R83 +R19 +L82 +R82 +R398 +R2 +R19 +R81 +R82 +R290 +R80 +L52 +L5 +L95 +L87 +L37 +R24 +L60 +R60 +L71 +L29 +L32 +R32 +R66 +L47 +L21 +R902 +L18 +L12 +R30 +L43 +L22 +R39 +L74 +R62 +R38 +L77 +L22 +L662 +R46 +R15 +L31 +L69 +R47 +L575 +R82 +L54 +L36 +L40 +R76 +R70 +R30 +L93 +L27 +R20 +L28 +R14 +L822 +L53 +L11 +L46 +L54 +R57 +L157 +R347 +R96 +L88 +R45 +R11 +L81 +L35 +L88 +R66 +R68 +R36 +L83 +L78 +L98 +L18 +R42 +L680 +R273 +L66 +R31 +R81 +L75 +L52 +R94 +L5 +L43 +R1 +R52 +L49 +L69 +R229 +L650 +L95 +L19 +L490 +R92 +R50 +R25 +L77 +L2 +R55 +L87 +R34 +R99 +R101 +R225 +L225 +R181 +R86 +L67 +L14 +L44 +R58 +L72 +R36 +L57 +R693 +L55 +R255 +R857 +L57 +L41 +L59 +L66 +L603 +R69 +L66 +L81 +L45 +L94 +R85 +L999 +R84 +R58 +R58 +L44 +R53 +L17 +L11 +L81 +L868 +L932 +L72 +R43 +R6 +L77 +L29 +L25 +L64 +R82 +L21 +L43 +L1 +R54 +R398 +L14 +R46 +R17 +R16 +L80 +R64 +L362 +L53 +L74 +R18 +L29 +R47 +R77 +R83 +R95 +R898 +R27 +R97 +L89 +L37 +L84 +L14 +L99 +L5 +R41 +L910 +R73 +R33 +L37 +L96 +R94 +R6 +L14 +R43 +R90 +R57 +R6 +R18 +R68 +R419 +R21 +L23 +L85 +L51 +L12 +L37 +L70 +R485 +L44 +R95 +R34 +R51 +L351 +R64 +L64 +R130 +L309 +L821 +R64 +R27 +R109 +R33 +L33 +R59 +R69 +L29 +L55 +L416 +L55 +R90 +L63 +R42 +L942 +R658 +R70 +L28 +R2 +L402 +L48 +R90 +R58 +L332 +L43 +L4 +L85 +R46 +L682 +R65 +R35 +L22 +L30 +L5 +R57 +L22 +R522 +R781 +R519 +L830 +L259 +L11 +L53 +L3 +L99 +L41 +R11 +L83 +R568 +L88 +L512 +L78 +L96 +L44 +R18 +R6 +R94 +R618 +L244 +L74 +L10 +R66 +R87 +R27 +L70 +L50 +L90 +L62 +L27 +L85 +R70 +R441 +L97 +R23 +R84 +R473 +L44 +L379 +L6 +L541 +L42 +L34 +R451 +L16 +R88 +L30 +L27 +L3 +L86 +L66 +R1 +L37 +R737 +L64 +L57 +L844 +R19 +L53 +L9 +R682 +L20 +R51 +L51 +L84 +L6 +R93 +R52 +R45 +L692 +R68 +L67 +R944 +R824 +R23 +R943 +R67 +L27 +L196 +R23 +R84 +L91 +L447 +L793 +L211 +R48 +L134 +L66 +L50 +L50 +L778 +L49 +L5 +R48 +L16 +R191 +R75 +R22 +R98 +R652 +R62 +R22 +L690 +R68 +L9 +L7 +R16 +L93 +R93 +R945 +R55 +L86 +R68 +L25 +L27 +L7 +L23 +L93 +L64 +L166 +L76 +R99 +L13 +L31 +R10 +L24 +L51 +R89 +R20 +R16 +L16 +R15 +R19 +R79 +R48 +L339 +L22 +L742 +R621 +R21 +L24 +L18 +R13 +R29 +R18 +L16 +L2 +L19 +L421 +L78 +L82 +L12 +R12 +R36 +R61 +L97 +R88 +L99 +R75 +R36 +L19 +L81 +R49 +R22 +L73 +L33 +R35 +L88 +L12 +R31 +R39 +L70 +L73 +L27 +R32 +R186 +R67 +L797 +L601 +R57 +L46 +R36 +L48 +R14 +L45 +L12 +L43 +L867 +L44 +L89 +R30 +R865 +R305 +R42 +L481 +R39 +R508 +L990 +L15 +R570 +L898 +L4 +R29 +R56 +R724 +R40 +L120 +L33 +R831 +L27 +R29 +L51 +L349 +L91 +L94 +R65 +R220 +R8 +L65 +R57 +L6 +L94 +L32 +L68 +R67 +R33 +R711 +R96 +L807 +R9 +R76 +R315 +L69 +L31 +R88 +L61 +R87 +R86 +R32 +L48 +R10 +L13 +R51 +L27 +L58 +L74 +L47 +R69 +L39 +R34 +L85 +R289 +L54 +L49 +L771 +R50 +R279 +R60 +L9 +R37 +L76 +L776 +L47 +R57 +R87 +R85 +R33 +R663 +L781 +L43 +R51 +R759 +L15 +R631 +L465 +R67 +L15 +L252 +L266 +R66 +L18 +R818 +R684 +L19 +R235 +L46 +L46 +L5 +R77 +R20 +L85 +L1 +L27 +R6 +L67 +R74 +L58 +R77 +L79 +L7 +R24 +R79 +L25 +R54 +L8 +R6 +L794 +R82 +L86 +L65 +L24 +R224 +R9 +R91 +L24 +R824 +L458 +R58 +L934 +L19 +L62 +L85 +L82 +L18 +L68 +L353 +R35 +L14 +R35 +L35 +R62 +R4 +R59 +L15 +R42 +R48 +R49 +R51 +R86 +R55 +L85 +L90 +L83 +L89 +L451 +L23 +L68 +L52 +L78 +R48 +R746 +L16 +R604 +R658 +L62 +R40 +R223 +L86 +R23 +R20 +L56 +L683 +L81 +R227 +R71 +L279 +L33 +L80 +R12 +R82 +R880 +R20 +R17 +R83 +R821 +R79 +R59 +R72 +L42 +L93 +L96 +R378 +L78 +R89 +L89 +R65 +L465 +L80 +L20 +L811 +R57 +L67 +R21 +L62 +R390 +R70 +L57 +L41 +L7 +L93 +R74 +R93 +L70 +R3 +R54 +R96 +R50 +L47 +L53 +L124 +L45 +L65 +R34 +L25 +R31 +R994 +R34 +L20 +L514 +L198 +R98 +L50 +R50 +L502 +R97 +R91 +L47 +L25 +L14 +R57 +R43 +L42 +L40 +R282 +R26 +L26 +R64 +L64 +L57 +L35 +R14 +L22 +R60 +R813 +L57 +R53 +R187 +R632 +R4 +L86 +L67 +L63 +L41 +L11 +R976 +R44 +R141 +L85 +R34 +L34 +R15 +L9 +R88 +L57 +R92 +R171 +L54 +L34 +R364 +L23 +L19 +L16 +L46 +R40 +R4 +R52 +L68 +R78 +L24 +R46 +R4 +L4 +R311 +R89 +R46 +L646 +L66 +R2 +R5 +R78 +R45 +R704 +L57 +L77 +L34 +L95 +L42 +L95 +R32 +R60 +L74 +L26 +L60 +L814 +L71 +L15 +R68 +R68 +L57 +L79 +R975 +R99 +L31 +R66 +R91 +R39 +R521 +R40 +R155 +R332 +R11 +R8 +L40 +L33 +L38 +R48 +L71 +R61 +R67 +L26 +R21 +R67 +R38 +L56 +L44 +R23 +R677 +R11 +L6 +R440 +R6 +R72 +R66 +R43 +L66 +R37 +L76 +L27 +L50 +R50 +R75 +L97 +L26 +L89 +R37 +R45 +L29 +L16 +L12 +R85 +L90 +L183 +R10 +L10 +R76 +L93 +L783 +R40 +L231 +L78 +L229 +R98 +L85 +R63 +R48 +L26 +L74 +L80 +R106 +L52 +R475 +R25 +L813 +R93 +L78 +R30 +R68 +L36 +L44 +R82 +L81 +R52 +R26 +R94 +R11 +R96 +R66 +R12 +L42 +R27 +R35 +R74 +L625 +L96 +L55 +L31 +R35 +R73 +R46 +R587 +R94 +R19 +L19 +L46 +R393 +L39 +R91 +R44 +L99 +R20 +R77 +R17 +L82 +R454 +L85 +L133 +L57 +L863 +R8 +L39 +R15 +R21 +L155 +R80 +L485 +R63 +L50 +R79 +R971 +R405 +R42 +R59 +R994 +L202 +L10 +R42 +R391 +R801 +R82 +R76 +L52 +L64 +R444 +R90 +L97 +L756 +R38 +R1 +L84 +L82 +R82 +R70 +L852 +R19 +L6 +R75 +R25 +R57 +R13 +L83 +L18 +L2 +L698 +L67 +L33 +L308 +L946 +L46 +L28 +R28 +L803 +L91 +R94 +R28 +R22 +R50 +R91 +L73 +R20 +R723 +L40 +L21 +L76 +L52 +L72 +L364 +R64 +L987 +R87 +L20 +L60 +L20 +R78 +L353 +L25 +R85 +L73 +L12 +R70 +L470 +L26 +R26 +R96 +R53 +L49 +R439 +L14 +L14 +R1 +R96 +R992 +R29 +R71 +R468 +L93 +L19 +L26 +L25 +L91 +R86 +R118 +R82 +L17 +R450 +R7 +L440 +L628 +L52 +R80 +L25 +L33 +L42 +L559 +L929 +L67 +R97 +L54 +L88 +R83 +L14 +R80 +R851 +R41 +R58 +L399 +R625 +L97 +R7 +R65 +R75 +L675 +L75 +R75 +R372 +L74 +L68 +L30 +L84 +R84 +L79 +L921 +L91 +L553 +L41 +R85 +L42 +R71 +R71 +R54 +R699 +R96 +L41 +L8 +R12 +L34 +L90 +L93 +L53 +L38 +L42 +R38 +L41 +L98 +R89 +R50 +R396 +R42 +R62 +L9 +L112 +R75 +L54 +L49 +R20 +R71 +R585 +L22 +R10 +L614 +R1 +L221 +L65 +L307 +L9 +L447 +L925 +L63 +L65 +R99 +L99 +L39 +R346 +L207 +R58 +L758 +R37 +R766 +L638 +L525 +L40 +L9 +L85 +L596 +L706 +L19 +L22 +L91 +L14 +L25 +L20 +L713 +R343 +L43 +R2 +L68 +R41 +R68 +R22 +L333 +R968 +R80 +L63 +L73 +R56 +L89 +R889 +L317 +R17 +L62 +R129 +R780 +L64 +L94 +R11 +R78 +R78 +L67 +L8 +R37 +L70 +R12 +R62 +L922 +L28 +R33 +R95 +R20 +R80 +L80 +L40 +R69 +L49 +L46 +R61 +L15 +R20 +L20 +L81 +R81 +R89 +R11 +L65 +L75 +L50 +L10 +L78 +R78 +R38 +R94 +L732 +R914 +R86 +L79 +L21 +L11 +R107 +R704 +R54 +R46 +L669 +L79 +R130 +L82 +L28 +R628 +L63 +L18 +L19 +R26 +R74 +L13 +R13 +L65 +R9 +R756 +L33 +L67 +L178 +R298 +L914 +L91 +L915 +R25 +L31 +R20 +R51 +R517 +L82 +L16 +R85 +R31 +R35 +L35 +R91 +L43 +L67 +L81 +R888 +L5 +L18 +L76 +L757 +L32 +R99 +R92 +R9 +R489 +L89 +L20 +R120 +R54 +L77 +L41 +L39 +L97 +L64 +L6 +L30 +L27 +L47 +L26 +L867 +R67 +R123 +L23 +R77 +R980 +R69 +L94 +L84 +L48 +R446 +L19 +R24 +L51 +R13 +R187 +R555 +R545 +R97 +L63 +L639 +R105 +L95 +L45 +R40 +R99 +L16 +R17 +R538 +R53 +L123 +L873 +L95 +L46 +R46 +R7 +R622 +L348 +R33 +L76 +L38 +R82 +R829 +L34 +L29 +L48 +L453 +L25 +R78 +R986 +R14 +R17 +R13 +L55 +R625 +L8 +L92 +L23 +R23 +L56 +R56 +L53 +R732 +L10 +L4 +R28 +L93 +R60 +L60 +R82 +R14 +R98 +R813 +L380 +L1 +L426 +L80 +R28 +L48 +R47 +L49 +R2 +L69 +L31 +R897 +R47 +L7 +L37 +L413 +R30 +L65 +R55 +R457 +R83 +L590 +R16 +R96 +L99 +R92 +L11 +L51 +R541 +R59 +R664 +R16 +R3 +R742 +L70 +L95 +R238 +L598 +R743 +R57 +L83 +L3 +R86 +L35 +R35 +L89 +R98 +L9 +L27 +L474 +R7 +R94 +R13 +L75 +R27 +L28 +L17 +L17 +R56 +L4 +R8 +R76 +R61 +R1 +L1 +R20 +R80 +L15 +R49 +L67 +R33 +L4 +R4 +L9 +R9 +R252 +L52 +R83 +L83 +R598 +L98 +L89 +L256 +R90 +R72 +R92 +L9 +R74 +L396 +L84 +L86 +R230 +L99 +L47 +R8 +L78 +L6 +R38 +R46 +L39 +R98 +R66 +L25 +L31 +R26 +L995 +L11 +L85 +L123 +L32 +R954 +R7 +R25 +L779 +L71 +L498 +L87 +R93 +R467 +L81 +R6 +L895 +R281 +L634 +L21 +R184 +L79 +R305 +L758 +R736 +L46 +L7 +L673 +L3 +L77 +L98 +R36 +R85 +R20 +R5 +L28 +L18 +L47 +R47 +L12 +R12 +L837 +L96 +R33 +R49 +L890 +R6 +L65 +R93 +L2 +L24 +L55 +L35 +R48 +L63 +R38 +R37 +R325 +R126 +L94 +R6 +L91 +R919 +R460 +L94 +L631 +L63 +R20 +R6 +R473 +L55 +L51 +L636 +R143 +L692 +R92 +R444 +L16 +R52 +L6 +R40 +L596 +R23 +L58 +L83 +R802 +R98 +L67 +L62 +L13 +R28 +R229 +R547 +R695 +L57 +R87 +L47 +R60 +R65 +L87 +L278 +R76 +R24 +L79 +R823 +L83 +R2 +L27 +L5 +L31 +R19 +L339 +L80 +R63 +R37 +R92 +R755 +L30 +L97 +L686 +R49 +L83 +R84 +R16 +L27 +L58 +L24 +R9 +L48 +L716 +L13 +R30 +R47 +R30 +R13 +R43 +L34 +R748 +R134 +L25 +R54 +R37 +L60 +R22 +R38 +R69 +L75 +L81 +L13 +L3 +R22 +R96 +L68 +R15 +L62 +L65 +L835 +R36 +R64 +L20 +L80 +L70 +R70 +L22 +L878 +L38 +R38 +L63 +L13 +L158 +R34 +L43 +R43 +L29 +L244 +R73 +R952 +L52 +R14 +R35 +R53 +L2 +R50 +L538 +L59 +L53 +R40 +R38 +R22 +R396 +R66 +R38 +R764 +R36 +R19 +L496 +L23 +R33 +R65 +L989 +R699 +L89 +L34 +R59 +R53 +R80 +R59 +L36 +R41 +R73 +R79 +R70 +R27 +L90 +L62 +L38 +R27 +L16 +R830 +L90 +R479 +L14 +R81 +L30 +R831 +L98 +R819 +R81 +R89 +R41 +L14 +R82 +R702 +R60 +L60 +L1 +L7 +R8 +L88 +R788 +L999 +R20 +L24 +R80 +R23 +L58 +R58 +R43 +L143 +L680 +L45 +L51 +R88 +L44 +R71 +R960 +L99 +R336 +R6 +L891 +R14 +R34 +R4 +L3 +R217 +R78 +L302 +L329 +L264 +R835 +R34 +L53 +R5 +L99 +R9 +R386 +R494 +R24 +L77 +R42 +L382 +L634 +L84 +L36 +L64 +R86 +L93 +L626 +L343 +R96 +L20 +R65 +R33 +L98 +R68 +L67 +R8 +R91 +R43 +L46 +R303 +R2 +L2 +R26 +L90 +R57 +R307 +L17 +R717 +R731 +L31 +L206 +R6 +L284 +R84 +R92 +R8 +R1 +L1 +R188 +R89 +L55 +L22 +L98 +L2 +R93 +R77 +L52 +R48 +R5 +L71 +L80 +L97 +R40 +L345 +R82 +R27 +R3 +R59 +R11 +L48 +L352 +R23 +R209 +L930 +L102 +R34 +R70 +R96 +R15 +R50 +L78 +R59 +L46 +L73 +L27 +L28 +L272 +L35 +R16 +R19 +L78 +R278 +R76 +R22 +L98 +R91 +R24 +L307 +R92 +L29 +L20 +L71 +R87 +L438 +R534 +L63 +L778 +R16 +L838 +R664 +L84 +L221 +R8 +L367 +R630 +L33 +R34 +L61 +R30 +R48 +R52 +R12 +R58 +R30 +R64 +R732 +L50 +L21 +R47 +L372 +L75 +L959 +L66 +L848 +R629 +L81 +L792 +R92 +R4 +L4 +L64 +L99 +L37 +R51 +R749 +R854 +R146 +L89 +R10 +R48 +R11 +R620 +R226 +L624 +L81 +L21 +R26 +L96 +R93 +L58 +R63 +R19 +L510 +L7 +L68 +R83 +L25 +R86 +L306 +L22 +R67 +L45 +L86 +R614 +R31 +R268 +L3 +R86 +R290 +L83 +R87 +L90 +L741 +R9 +L90 +L44 +R27 +L275 +R7 +L7 +L76 +R76 +L78 +L71 +L51 +R15 +L43 +R62 +R66 +R25 +L3 +R78 +L13 +R77 +L64 +L65 +L16 +L39 +R4 +L14 +L56 +L81 +L33 +R39 +R56 +L95 +L77 +R28 +R19 +L174 +L58 +R50 +L88 +R4 +R21 +L72 +R401 +R13 +L99 +R39 +L607 +L698 +L84 +L723 +R94 +R39 +L57 +L39 +L98 +R266 +R98 +L46 +L547 +R63 +R32 +L90 +L10 +L86 +R76 +L64 +L434 +L92 +L70 +L39 +L92 +R1 +L77 +L39 +L95 +R911 +R5 +L803 +L19 +R29 +R118 +R90 +R880 +L65 +R678 +R87 +R11 +R89 +L51 +R51 +R12 +L364 +R652 +R245 +R55 +L1 +L72 +R142 +L34 +L757 +L78 +L333 +R33 +R70 +R30 +R42 +L342 +R96 +R85 +L81 +L455 +R39 +L18 +R98 +R21 +R49 +L34 +R25 +R75 +R64 +R71 +R89 +R76 +R5 +R30 +R65 +R90 +R33 +L23 +R9 +R22 +R536 +R669 +R64 +L22 +R53 +L66 +L65 +R88 +R12 +L49 +R11 +R16 +L989 +R11 +L89 +R41 +R73 +R75 +L476 +R731 +L455 +R1 +L51 +R50 +L61 +R86 +L29 +R804 +R45 +L45 +R695 +R55 +L66 +L93 +L291 +R71 +L40 +L131 +R16 +L4 +L894 +L61 +R80 +R63 +R431 +R169 +R68 +R46 +R86 +L66 +L34 +L46 +R46 +R15 +L15 +R9 +L30 +L79 +R49 +R951 +R15 +L15 +L75 +L20 +L3 +L502 +L27 +R56 +R3 +R83 +L15 +R79 +R23 +R5 +L7 +R856 +R44 +R397 +L92 +R68 +L39 +L34 +R67 +R38 +R95 +R54 +L64 +L8 +L98 +R67 +R15 +L460 +L44 +R38 +R126 +R90 +R57 +L30 +R33 +L76 +R8 +L63 +L45 +R92 +R8 +R74 +R26 +R37 +L73 +L17 +L20 +L27 +L79 +L340 +R68 +R26 +R25 +R65 +L65 +R146 +R21 +L25 +L934 +L88 +L520 +R36 +L36 +L76 +L24 +R25 +L25 +L65 +L22 +L57 +L44 +R18 +R670 +L61 +R61 +L49 +L65 +L86 +L46 +L22 +R6 +R162 +R497 +L46 +L51 +L95 +R55 +R40 +R796 +L4 +R36 +L28 +R18 +L18 +R43 +R29 +L72 +R42 +R358 +R67 +L1 +R34 +L31 +R31 +R86 +R72 +L69 +R89 +R28 +L370 +L3 +R67 +R53 +L25 +R75 +L47 +L776 +L358 +L4 +L53 +L47 +L418 +L88 +L12 +L954 +R193 +R661 +R71 +R44 +R68 +L14 +L369 +R38 +L140 +R37 +L35 +L23 +R3 +R20 +L64 +R70 +L6 +L51 +R285 +R89 +L53 +R83 +L453 +L810 +L1 +R602 +L3 +L88 +R96 +L17 +L379 +R95 +R29 +R55 +L79 +L282 +R40 +R42 +R439 +L74 +L56 +R52 +R78 +L39 +R96 +R77 +L873 +L41 +L50 +R91 +L48 +L361 +R59 +R12 +L71 +L822 +L85 +R90 +R26 +R50 +R3 +R12 +L765 +L98 +L58 +R68 +R83 +L8 +L82 +R58 +L68 +L94 +L33 +L80 +L588 +R1 +L101 +R29 +R59 +L151 +L37 +L69 +R40 +R29 +L383 +L58 +L95 +L264 +L26 +R79 +L88 +R5 +L37 +L98 +R65 +L26 +L58 +L16 +R67 +R366 +R991 +R39 +R37 +R34 +L91 +L143 +R58 +R46 +R96 +L833 +R820 +L733 +R46 +L142 +L683 +R25 +L86 +L56 +R65 +R83 +R27 +L16 +L1 +L16 +R3 +R36 +R361 +R42 +L52 +L90 +L93 +R49 +R44 +R91 +L91 +R65 +L65 +L577 +L953 +L754 +R98 +L83 +L577 +L54 +L686 +L921 +R7 +L31 +R81 +R930 +L52 +L14 +L714 +L99 +L401 +R64 +L359 +L18 +L79 +L16 +R8 +L33 +L67 +R11 +R4 +L649 +L392 +R73 +L254 +R85 +L78 +R52 +L67 +R33 +R99 +R83 +L33 +R833 +L43 +L94 +L70 +R7 +R548 +R53 +L4 +R12 +L12 +R458 +R45 +L97 +R95 +R2 +L36 +R36 +L80 +R516 +R97 +R23 +L43 +R58 +R257 +R19 +L79 +L63 +R95 +L34 +L17 +L7 +L81 +L61 +R87 +R13 +R65 +R72 +R5 +R95 +L74 +R768 +R3 +L13 +L50 +R81 +R96 +R51 +R1 +L82 +L18 +L1 +R952 +R2 +R964 +L13 +R96 +L93 +R28 +R79 +L975 +L10 +R571 +L40 +L33 +L410 +R501 +L53 +L86 +R4 +R17 +R98 +L47 +R94 +L45 +L3 +R3 +R9 +L53 +L56 +R454 +L32 +R78 +R68 +R927 +L595 +R186 +R219 +R85 +L690 +R52 +L49 +R97 +L40 +R40 +R61 +R339 +L54 +R54 +L25 +R120 +R5 +R79 +R21 +R52 +L63 +R55 +R94 +L838 +R84 +L67 +L37 +L45 +L756 +L6 +L15 +L58 +L39 +R39 +L52 +L48 +R59 +R84 +R57 +L601 +R446 +L22 +R27 +R50 +L83 +L17 +L43 +L30 +R11 +R9 +R28 +L10 +R16 +L994 +L87 +R509 +L39 +R68 +R24 +R326 +L788 +L84 +L662 +R80 +R67 +R231 +L32 +R47 +L75 +L5 +R34 +R14 +L24 +L25 +L14 +R65 +R34 +L678 +L673 +L92 +R54 +R95 +L64 +R59 +L77 +R34 +L16 +R42 +L533 +R53 +L659 +L96 +L59 +R63 +R96 +R819 +R81 +L35 +R93 +L58 +R54 +R43 +R3 +L1 +L70 +L60 +L1 +L97 +L71 +R24 +R68 +R48 +L14 +R74 +R51 +R49 +R27 +L18 +R59 +L68 +R133 +L36 +L97 +L35 +L30 +R54 +L38 +R67 +L46 +L61 +L740 +L55 +R915 +R551 +R18 +R88 +R12 +R77 +R23 +L47 +L45 +R15 +L144 +R43 +L85 +R48 +L85 +L67 +L33 +L70 +L99 +L45 +L5 +L70 +R39 +L50 +L98 +R329 +L67 +R36 +R47 +L47 +L98 +L437 +R63 +R86 +R86 +L55 +L45 +R74 +L56 +L6 +L6 +L97 +R715 +L24 +L12 +R73 +L59 +L2 +L7 +L93 +R53 +R47 +L499 +L3 +L77 +R27 +L3 +L12 +L33 +R52 +R30 +R18 +L39 +R4 +L665 +R56 +L77 +L90 +R711 +L77 +L65 +R547 +R895 +L41 +L59 +R42 +R32 +R726 +R27 +L564 +R65 +R94 +L297 +L25 +L10 +L89 +R99 +R1 +R99 +L58 +L71 +R95 +L66 +R29 +R72 +L1 +R19 +L994 +R604 +R71 +L72 +L11 +R21 +L83 +R954 +L9 +L541 +L59 +R58 +L66 +L92 +R67 +L67 +L11 +R70 +L268 +R63 +R59 +L74 +L39 +L66 +R66 +L567 +L33 +L698 +R437 +L894 +L645 +L6 +L28 +L66 +L9 +R44 +L603 +L32 +R69 +L69 +R70 +L970 +L59 +L41 +R92 +L8 +L77 +L7 +L29 +L271 +L88 +L48 +R12 +L99 +L77 +L32 +L68 +R9 +L9 +L69 +R48 +L476 +R897 +L88 +L49 +R40 +R897 +L355 +R655 +L11 +L16 +L73 +L92 +L8 +L88 +R88 +R28 +L82 +R54 +L69 +R69 +R94 +R43 +R88 +L117 +L8 +L7 +R81 +L86 +R24 +L782 +L79 +R88 +L918 +L21 +R356 +L56 +R96 +R98 +R706 +R81 +L81 +R19 +L519 +L724 +R97 +R27 +L20 +R56 +L9 +R454 +R19 +L70 +R64 +L94 +R37 +R63 +R69 +L625 +R56 +R19 +R481 +L52 +R52 +R42 +R1 +R90 +R67 +R35 +R612 +L747 +L50 +R50 +L17 +L83 +L71 +L29 +L38 +L71 +R9 +L69 +L177 +R48 +L2 +L10 +L26 +R36 +L74 +L26 +L17 +R43 +L726 +L734 +R37 +L3 +R45 +L88 +R76 +R67 +R36 +R37 +R84 +L78 +R21 +R34 +R66 +R81 +L75 +L606 +L466 +R21 +R35 +L90 +L94 +R94 +R5 +R901 +L6 +L414 +R70 +L92 +L12 +L53 +R205 +R896 +R59 +L60 +R1 +R232 +L932 +R454 +R2 +L56 +R943 +L1 +R594 +R64 +R3 +R363 +L34 +L32 +R22 +R97 +L19 +R42 +L42 +L17 +L49 +R462 +L1 +L716 +L79 +R12 +L24 +R12 +L398 +R898 +R3 +R97 +R57 +L73 +R52 +R43 +R6 +R15 +L70 +R68 +R35 +R41 +R26 +L57 +L44 +R93 +R8 +R95 +R5 +R57 +L14 +L29 +L84 +L35 +L937 +R92 +L20 +L75 +L55 +R74 +R26 +L18 +R18 +R5 +R60 +L65 +L142 +L23 +R684 +L19 +R34 +L34 +R65 +L467 +L98 +R48 +L35 +L150 +L74 +R11 +R74 +L61 +R9 +R378 +R41 +L44 +L85 +L8 +L20 +L96 +R12 +R61 +L99 +R37 +R32 +R27 +L33 +R75 +L97 +L63 +L353 +L78 +L44 +L14 +R549 +R53 +R24 +L77 +R84 +L84 +R31 +R14 +L57 +L88 +L53 +L47 +L754 +L46 +L9 +L3 +L601 +L87 +L556 +L33 +L411 +L11 +L89 +R276 +L276 +R94 +R354 +L47 +L82 +R84 +L76 +R28 +R609 +R39 +R510 +L13 +L76 +L80 +L993 +R725 +R81 +L32 +L25 +R78 +L78 +L709 +L97 +L85 +L75 +L279 +L42 +R50 +R7 +R30 +R481 +L81 +R39 +L85 +L54 +L55 +R55 +L73 +L38 +L389 +L899 +L1 +L515 +L85 +R711 +L72 +L11 +L72 +L59 +R94 +R9 +R88 +L88 +L90 +R25 +R15 +R50 +R84 +R93 +L4 +L63 +L10 +R424 +R968 +R31 +L23 +L29 +R666 +R32 +R3 +L72 +L59 +R59 +L19 +L335 +L89 +L77 +L42 +R62 +L9 +R93 +R66 +R24 +R31 +L5 +R47 +R14 +R23 +R16 +L513 +R88 +L75 +R14 +R94 +L68 +L56 +R16 +L853 +L17 +L80 +L67 +L24 +R89 +L58 +R310 +R59 +L135 +R41 +R35 +R560 +R40 +R29 +L51 +R404 +R28 +R15 +L25 +L946 +L54 +R59 +L51 +R226 +R40 +L537 +R51 +R34 +R20 +R58 +L36 +L22 +R58 +L52 +R552 +R41 +L632 +R81 +R10 +R42 +L27 +R13 +R69 +R50 +L47 +R48 +L70 +R85 +L5 +R42 +L44 +L56 +R47 +R53 +L8 +L85 +L84 +L96 +L227 +R347 +R58 +L5 +L62 +L56 +L82 +L663 +R20 +R943 +R45 +R215 +R40 +L67 +R38 +L506 +R37 +L2 +L10 +L59 +R819 +L10 +L91 +L14 +L992 +L25 +L424 +L970 +R76 +R43 +L83 +R12 +L72 +L774 +L39 +R13 +R42 +R4 +R79 +R521 +L46 +L95 +R54 +L159 +R67 +R33 +L181 +R97 +R584 +L20 +R25 +R33 +R62 +R78 +L730 +L448 +R43 +L47 +R204 +L7 +R79 +R39 +L12 +R1 +L18 +L82 +R74 +R33 +L45 +R45 +L886 +L75 +R1 +R57 +L4 +L51 +R451 +R53 +L54 +R1 +R19 +R81 +L503 +L70 +R44 +R3 +L29 +L42 +R97 +L11 +R56 +R55 +R50 +L66 +L84 +R31 +L31 +R822 +L28 +R436 +R70 +R71 +L59 +R30 +R56 +R2 +R6 +L6 +R32 +L19 +R187 +R989 +R11 +L1 +L73 +R31 +R453 +R60 +L92 +R64 +R63 +L5 +L88 +L12 +L495 +L5 +R10 +L510 +R76 +L489 +L87 +R80 +L80 +L16 +L84 +L21 +R48 +L1 +L25 +L3 +L15 +L83 +L620 +R420 +R92 +R18 +R60 +R29 +L812 +L50 +L56 +R70 +R49 +L3 +L97 +R59 +L40 +L763 +R87 +L95 +R52 +L77 +R271 +L94 +L52 +R70 +R50 +R32 +L46 +R3 +L57 +R14 +R35 +L49 +R58 +R158 +R18 +L38 +L96 +R73 +R70 +L43 +R881 +L250 +R37 +L16 +L79 +R27 +R63 +R830 +R64 +L50 +R93 +R7 +R94 +L1 +L63 +R14 +R6 +R38 +R303 +L26 +L972 +R37 +R17 +R46 +L33 +R33 +L21 +R413 +L92 +R95 +L95 +L83 +R37 +L76 +L78 +L66 +L734 +R74 +R615 +L58 +L94 +R84 +L47 +L630 +L99 +L45 +R22 +R78 +L963 +L37 +R56 +R44 +L5 +L858 +R63 +L76 +L24 +R82 +L96 +R82 +L25 +R771 +R86 +L54 +L46 +R73 +R27 +L23 +L67 +R61 +R29 +R132 +R608 +R92 +L22 +L10 +R79 +L79 +L6 +R706 +L49 +R46 +L1 +R4 +L7 +R33 +L8 +R85 +L821 +R6 +L64 +L974 +L16 +R14 +L48 +L50 +L28 +L72 +L50 +L76 +R3 +R413 +L40 +L61 +L43 +R4 +L68 +L7 +R62 +R31 +R1 +L19 +L63 +R25 +L90 +L92 +L73 +L5 +R31 +R26 +L97 +R38 +L73 +L4 +L13 +L10 +R83 +L2 +R19 +L27 +L70 +L96 +R20 +L27 +R91 +R91 +L37 +L50 +L95 +R58 +R42 +L96 +R51 +R31 +L86 +R41 +R79 +L76 +L83 +R39 +R45 +R46 +R8 +L50 +L40 +R31 +R3 +L6 +L33 +R25 +R7 +R30 +L10 +R48 +L44 +R15 +L49 +L34 +L44 +R3 +R32 +R16 +L28 +L50 +L19 +R42 +R49 +R27 +L40 +L20 +R3 +L11 +L35 +R11 +R44 +L29 +R20 +L16 +R50 +L14 +L17 +L27 +L3 +R19 +R24 +R42 +R45 +L2 +R27 +L41 +L46 +R16 +R30 +R2 diff --git a/src/day1/mod.rs b/src/day1/mod.rs new file mode 100644 index 0000000..c133abb --- /dev/null +++ b/src/day1/mod.rs @@ -0,0 +1,29 @@ +use std::fs; + +mod dial_position; + +pub fn solve_part1() { + let file = fs::read_to_string("src/day1/input.txt").expect("You didn't provide input.txt."); + + let mut dial = dial_position::DialPosition::new(50); + let mut zero_position_occurences = 0; + for line in file.lines() { + let mut chars = line.chars(); + if let Some(direction_string) = chars.nth(0) { + let value = String::from(chars.as_str()) + .parse::() + .expect("This value is not a number"); + if direction_string == 'L' { + dial = dial.rotated_left(value); + } else { + dial = dial.rotated_right(value); + } + if dial.current_position == 0 { + zero_position_occurences += 1 + } + }; + } + + println!("The solution for part 1 is {}", zero_position_occurences); + println!("The solution for part 2 is {}", dial.zero_hits_count); +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..8025c36 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,5 @@ +mod day1; + +fn main() { + day1::solve_part1(); +}