From b987ec6481ea40e257dc81a8b3ebfc5f0483afe5 Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Fri, 15 Dec 2023 00:57:58 +0100 Subject: day10 & day11 --- src/day10pt2.rs | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 src/day10pt2.rs (limited to 'src/day10pt2.rs') diff --git a/src/day10pt2.rs b/src/day10pt2.rs new file mode 100644 index 0000000..c05402f --- /dev/null +++ b/src/day10pt2.rs @@ -0,0 +1,149 @@ +fn mogu_levo(c: char) -> bool { + return c == 'S' || c == 'L' || c == 'F' || c == '-'; +} + +fn mogu_desno(c: char) -> bool { + return c == 'S' || c == '7' || c == 'J' || c == '-'; +} + +fn mogu_gore(c: char) -> bool { + return c == 'S' || c == '7' || c == 'F' || c == '|'; +} + +fn mogu_dole(c: char) -> bool { + return c == 'S' || c == 'L' || c == 'J' || c == '|'; +} + +fn bfs(input: &Vec, was: &mut Vec>, x: i32, y: i32, s: u32) -> u32 { + if s > 2 && input[y as usize].chars().nth(x as usize).unwrap() == 'S' { + return s; + } + + if was[y as usize][x as usize] { + return 0; + } + + was[y as usize][x as usize] = true; + + for (dx, dy) in [(-1, 0), (1, 0), (0, -1), (0, 1)] { + let nx = x + dx; + let ny = y + dy; + if nx >= 0 && nx < input[y as usize].len() as i32 && ny >= 0 && ny < input.len() as i32 { + let t = input[y as usize].chars().nth(x as usize).unwrap(); + let n = input[ny as usize].chars().nth(nx as usize).unwrap(); + + let ind: bool; + if dx == 1 { + ind = mogu_levo(t) && mogu_desno(n); + } else if dx == -1 { + ind = mogu_desno(t) && mogu_levo(n); + } else if dy == 1 { + ind = mogu_gore(t) && mogu_dole(n); + } else { + ind = mogu_dole(t) && mogu_gore(n); + } + + if !ind { + continue; + } + + let ret = bfs(input, was, nx, ny, s + 1); + // was[ny as usize][nx as usize] = false; + + if ret != 0 { + return ret; + } + } + } + return 0; +} + +fn set_s(input: &mut Vec, xs: i32, ys: i32) { + let levi = mogu_levo(input[ys as usize].chars().nth(xs as usize - 1).unwrap()); + let gornji = mogu_gore(input[ys as usize - 1].chars().nth(xs as usize).unwrap()); + let donji = mogu_dole(input[ys as usize + 1].chars().nth(xs as usize).unwrap()); + let desni = mogu_desno(input[ys as usize].chars().nth(xs as usize + 1).unwrap()); + + if donji && gornji { + input[ys as usize] = input[ys as usize].replace("S", "|"); + } else if donji && levi { + input[ys as usize] = input[ys as usize].replace("S", "7"); + } else if donji && desni { + input[ys as usize] = input[ys as usize].replace("S", "F"); + } else if gornji && levi { + input[ys as usize] = input[ys as usize].replace("S", "J"); + } else if gornji && desni { + input[ys as usize] = input[ys as usize].replace("S", "L"); + } else if levi && desni { + input[ys as usize] = input[ys as usize].replace("S", "-"); + } else { + panic!(); + } +} + +fn part2(input: &Vec, was: Vec>) -> u32 { + let mut s: u32 = 0; + let mut en: bool; + let mut lc: char; + + for i in 0..input.len() { + en = false; + lc = 'S'; + + for j in 0..input[i].len() { + let c = input[i].chars().nth(j).unwrap(); + + if !was[i][j] { + s += en as u32; + continue; + } + + if c == '-' { + continue; + } else if c == '|' { + en = !en; + continue; + } + + if lc == 'S' { + lc = c; + if lc == 'J' || lc == '7' { + panic!(); + } + } else { + if (lc == 'F' && c == 'J') || (lc == 'L' && c == '7') { + en = !en; + } + lc = 'S'; + } + } + } + + return s; +} + +pub fn main() { + let txt = std::fs::read_to_string("./input/day10.txt").unwrap(); + let mut input: Vec<_> = vec![]; + for line in txt.lines() { + input.push(line.to_string()); + } + + let mut xs = 0; + let mut ys = 0; + + for i in 0..input.len() { + for j in 0..input[i].len() { + if input[i].chars().nth(j).unwrap() == 'S' { + xs = j as i32; + ys = i as i32; + } + } + } + + let mut was = vec![vec![false; input[0].len()]; input.len()]; + bfs(&input, &mut was, xs, ys, 0); + set_s(&mut input, xs, ys); + + println!("{}", part2(&input, was)); +} -- cgit v1.2.3