Rust - dag 4
Rust-traggladet gÄr lite lÀttare för varje dag, men om man kör AoC för att lÀra sig ett sprÄk kan det nog vara bÀttre att inte göra det i december. KÀnner en viss frustration över att saker har en idé om hur de ska lösas snubblar pÄ att man inte kan sprÄket. Tror den aspekten kanske bli mindre om man sitter i lugn och ro vid senare tillfÀlle.
Men nog om det, sagt att jag ska köra Rust sÄ fÄr hÄlla mig till det
use super::Solution;
use std::ops::RangeInclusive;
const PIN_DIGITS: usize = 6;
type Pin = u32;
// State required for solve day 4
pub struct State {
candidate_pins: RangeInclusive<Pin>,
}
fn fill_digits(digits: &mut [u8; PIN_DIGITS], pin: &Pin, depth: usize) -> Pin {
if depth < digits.len() {
let d = fill_digits(digits, pin, depth + 1);
digits[depth] = (d % 10) as u8;
d / 10
} else {
*pin
}
}
// Transforms 123456 into [1, 2, 3, 4, 5, 6]
fn to_digits(pin: &Pin) -> [u8; PIN_DIGITS] {
let mut digits = [0; PIN_DIGITS];
fill_digits(&mut digits, pin, 0);
digits
}
fn has_pair(pin: &Pin) -> bool {
to_digits(pin)
.iter()
.fold((false, 10), |acc, &digit| (acc.0 || acc.1 == digit, digit))
.0
}
fn not_descending(pin: &Pin) -> bool {
to_digits(pin)
.iter()
.fold((true, 0), |acc, &digit| (acc.0 && acc.1 <= digit, digit))
.0
}
fn has_strict_pair(pin: &Pin) -> bool {
to_digits(pin)
.iter()
.fold(&mut [0; 10], |cnt, &digit| {
cnt[digit as usize] = cnt[digit as usize] + 1;
cnt
})
.iter()
.any(|&count| count == 2)
}
impl Solution for State {
fn part1(&self) -> String {
self.candidate_pins
.clone()
.filter(not_descending)
.filter(has_pair)
.count()
.to_string()
}
fn part2(&self) -> String {
self.candidate_pins
.clone()
.filter(not_descending)
.filter(has_strict_pair)
.count()
.to_string()
}
}
pub fn solution(lines: Vec<&str>) -> Box<dyn Solution> {
let mut it = lines[0].split("-").map(|s| s.parse::<Pin>().unwrap());
Box::new(State {
candidate_pins: it.next().unwrap()..=it.next().unwrap(),
})
}
Tid att köra hela programmet (bÄda lösningarna)
18 ms pÄ 9900K
23 ms pÄ 3900X
kjonsson@ryzen:~/advent-of-code-2019$ ./target/release/aoc2019 4 src/day4/input.txt
đŻïž Part 1: 2050
đŻïž Part 2: 1390
â Took : 23 ms
---
kjonsson@coffee-lake:~/advent-of-code-2019$ ./target/release/aoc2019 4 src/day4/input.txt
đŻïž Part 1: 2050
đŻïž Part 2: 1390
â Took : 18 ms
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer