Day 7: Laboratories
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465


QIR (Quantum Intermediate Representation)
Nah, just kidding - I used Rust. The only tricky part seemed to be finding time on a Sunday to get it coded!
Part 1 I swept down with a bool array for beams and part 2 I swept up with a score array and summed when it split (joined).
struct Teleporter(String); impl Teleporter { fn new(s: String) -> Self { Self(s) } fn start_pos(line: &str) -> Result<usize> { line.find('S').ok_or_eyre("Start not found") } fn splits(&self) -> Result<usize> { let mut input = self.0.lines(); let start_line = input.next().ok_or_eyre("No start line")?; let start = Self::start_pos(start_line)?; let mut beams = vec![false; start_line.len()]; beams[start] = true; let mut splits = 0; for line in input { for (i, ch) in line.bytes().enumerate() { if beams[i] && ch == b'^' { splits += 1; beams[i] = false; beams[i - 1] = true; beams[i + 1] = true; } } } Ok(splits) } fn timelines(&self) -> Result<usize> { let mut input = self.0.lines(); let start_line = input.next().ok_or_eyre("No start line")?; let start = Self::start_pos(start_line)?; let mut num_paths = vec![1; start_line.len()]; for line in input.rev() { for (i, c) in line.bytes().enumerate() { if c == b'^' || c == b'S' { num_paths[i] = num_paths[i - 1] + num_paths[i + 1]; } } } Ok(num_paths[start]) } }