···11+use super::Day;
22+use crate::day;
33+44+day!(Day3, 3, Vec<&'static str>);
55+66+fn find_joltage(n: &str) -> i64 {
77+ let (max1, max2) = n
88+ .as_bytes()
99+ .iter()
1010+ .enumerate()
1111+ .fold((0, 0), |acc, (i, &d)| {
1212+ if i < n.len() - 1 && d > acc.0 {
1313+ (d, b'0')
1414+ } else {
1515+ (acc.0, d.max(acc.1))
1616+ }
1717+ });
1818+ ((max1 - b'0') * 10 + (max2 - b'0')) as i64
1919+}
2020+2121+fn find_override_joltage(n: &str) -> i64 {
2222+ let digits = n
2323+ .as_bytes()
2424+ .iter()
2525+ .enumerate()
2626+ .fold([0u8; 12], |mut acc, (i, &d)| {
2727+ for j in 0..12 {
2828+ // if there's enough digits left to construct a full number
2929+ if i < n.len() - (11 - j) && d > acc[j] {
3030+ acc[j] = d;
3131+ for k in j + 1..12 {
3232+ acc[k] = b'0';
3333+ }
3434+ break;
3535+ }
3636+ }
3737+ acc
3838+ });
3939+ digits
4040+ .iter()
4141+ .fold(0, |acc, &d| acc * 10 + (d - b'0') as i64)
4242+}
4343+4444+impl Day for Day3 {
4545+ type Parsed = Vec<&'static str>;
4646+4747+ fn parse(input: &'static str) -> Self::Parsed {
4848+ input.lines().collect()
4949+ }
5050+5151+ fn part1(&self) -> i64 {
5252+ self.data.iter().map(|&x| find_joltage(x)).sum()
5353+ }
5454+5555+ fn part2(&self) -> i64 {
5656+ self.data.iter().map(|&x| find_override_joltage(x)).sum()
5757+ }
5858+}
+2
src/solutions/mod.rs
···11pub mod day;
22pub mod day1;
33pub mod day2;
44+pub mod day3;
45pub use day::Day;
56pub use day1::Day1;
67pub use day2::Day2;
88+pub use day3::Day3;