Day 3: Lobby
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


Rust
My first version worked with numbers, but since I was still sick of yesterday’s pow(10) calls, I changed it to use ascii for the second half - the nice thing is that means it can work with hex input with no modification!
Clippy was complaining about “needless_range_loops”, but it’s way more readable this way.
struct PowerSource(Vec<Bank>); impl FromStr for PowerSource { type Err = Report; fn from_str(s: &str) -> Result<Self> { let banks = s.lines().map(|l| Bank(l.to_owned())).collect(); Ok(Self(banks)) } } impl PowerSource { fn max_joltage(&self, num_digits: usize) -> usize { self.0.iter().map(|b| b.max_joltage(num_digits)).sum() } } struct Bank(String); impl Bank { fn max_joltage(&self, num_digits: usize) -> usize { let batts = self.0.as_bytes(); let mut digits = vec![b'0'; num_digits]; let mut start = 0; for d in 0..num_digits { for i in start..=batts.len() - num_digits + d { if batts[i] > digits[d] { digits[d] = batts[i]; start = i + 1; } } } usize::from_str(str::from_utf8(&digits).unwrap()).unwrap() } }