diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/day8pt1.rs | 36 | ||||
| -rw-r--r-- | src/day8pt2.rs | 72 | ||||
| -rw-r--r-- | src/main.rs | 8 |
3 files changed, 112 insertions, 4 deletions
diff --git a/src/day8pt1.rs b/src/day8pt1.rs new file mode 100644 index 0000000..ece5fd9 --- /dev/null +++ b/src/day8pt1.rs @@ -0,0 +1,36 @@ +use regex::Regex; + +pub fn main() { + let txt = std::fs::read_to_string("./input/day8.txt").unwrap(); + let input = txt.lines().collect::<Vec<_>>(); + + let instr = input[0]; + let graf = (&input[2..input.len()]) + .into_iter() + .map(|s| { + let re = Regex::new(r"=\s*|\(|\)|,").unwrap(); + re.replace_all(s, "") + .split_whitespace() + .map(String::from) + .collect::<Vec<_>>() + }) + .collect::<Vec<_>>(); + + let mut cnt: u32 = 0; + let mut trn = "AAA"; + while trn != "ZZZ" { + for cvor in &graf { + if cvor[0] == trn { + if instr.chars().nth(cnt as usize % instr.len()).unwrap() == 'L' { + trn = cvor[1].as_str(); + } else { + trn = cvor[2].as_str(); + } + cnt += 1; + break; + } + } + } + + println!("{}", cnt); +} diff --git a/src/day8pt2.rs b/src/day8pt2.rs new file mode 100644 index 0000000..506a6b9 --- /dev/null +++ b/src/day8pt2.rs @@ -0,0 +1,72 @@ +use num::integer::lcm; +use regex::Regex; + +#[derive(Debug)] +struct Indeks<'a> { + trn: &'a str, + do_kraja1: u64, + do_kraja2: u64, +} + +pub fn main() { + let txt = std::fs::read_to_string("./input/day8.txt").unwrap(); + let input = txt.lines().collect::<Vec<_>>(); + + let instr = input[0]; + let graf = (&input[2..input.len()]) + .into_iter() + .map(|s| { + let re = Regex::new(r"=\s*|\(|\)|,").unwrap(); + re.replace_all(s, "") + .split_whitespace() + .map(String::from) + .collect::<Vec<_>>() + }) + .collect::<Vec<_>>(); + + let mut cvorovi: Vec<Indeks> = vec![]; + for cvor in &graf { + if cvor[0].chars().nth(2).unwrap() == 'A' { + cvorovi.push(Indeks { + trn: (cvor[0].as_str()), + do_kraja1: (0), + do_kraja2: (0), + }); + } + } + + let mut cnt: usize; + for i in 0..cvorovi.len() { + cnt = 0; + loop { + for cvor in &graf { + if cvor[0] == cvorovi[i].trn { + if cvorovi[i].do_kraja2 > 0 || cvorovi[i].trn.chars().last().unwrap() == 'Z' { + cvorovi[i].do_kraja2 += 1; + } else { + cvorovi[i].do_kraja1 += 1; + } + + if instr.chars().nth(cnt).unwrap() == 'L' { + cvorovi[i].trn = &cvor[1]; + } else { + cvorovi[i].trn = &cvor[2]; + } + break; + } + } + cnt = (cnt + 1) % instr.len(); + + if cvorovi[i].do_kraja2 != 0 && cvorovi[i].trn.chars().last().unwrap() == 'Z' { + break; + } + } + } + + let mut a = 1; + for cvor in cvorovi { + a = lcm(a, cvor.do_kraja2); + } + + println!("{}", a); +} diff --git a/src/main.rs b/src/main.rs index dfe1351..1749ed4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ -mod day7pt1; -mod day7pt2; +mod day8pt1; +mod day8pt2; fn main() { - day7pt1::main(); - day7pt2::main(); + day8pt1::main(); + day8pt2::main(); } |
