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::>(); 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::>() }) .collect::>(); let mut cvorovi: Vec = 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); }