day10-part1: small refactor

master
Avril 3 years ago
parent 569a3bd2ae
commit d6725a3eec
Signed by: flanchan
GPG Key ID: 284488987C31F630

@ -7,7 +7,8 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[features] [features]
test=[]
test = []
[dependencies] [dependencies]
ad-hoc-iter = "0.2.2" ad-hoc-iter = "0.2.2"

@ -0,0 +1,75 @@
use super::*;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
pub struct Diffs([usize; 3]);
impl ops::Add for Diffs
{
type Output = Self;
fn add(self, other: Self) -> Self::Output{
Self([
self.0[0] + other.0[0],
self.0[1] + other.0[1],
self.0[2] + other.0[2],
])
}
}
impl Sum for Diffs
{
fn sum<I>(iter: I) -> Self
where I: Iterator<Item=Self>
{
iter.fold(Default::default(), |x, y| x + y)
}
}
impl ops::AddAssign for Diffs
{
fn add_assign(&mut self, rhs: Self) {
self.0[0] += rhs.0[0];
self.0[1] += rhs.0[1];
self.0[2] += rhs.0[2];
}
}
impl Diffs
{
#[inline] pub fn jd1(&self) -> usize
{
self.0[0]
}
#[inline] pub fn jd2(&self) -> usize
{
self.0[1]
}
#[inline] pub fn jd3(&self) -> usize
{
self.0[2]
}
#[inline] pub fn at(&self, idx: usize) -> &usize
{
&self.0[idx]
}
#[inline] pub fn at_mut(&mut self, idx: usize) -> &mut usize
{
&mut self.0[idx]
}
}
impl From<(usize,usize,usize)> for Diffs
{
fn from((f0,f1,f2): (usize,usize,usize)) -> Self
{
Self([f0,f1,f2])
}
}
impl From<Diffs> for (usize,usize,usize)
{
fn from(from: Diffs) -> Self
{
(from.jd1(), from.jd2(), from.jd3())
}
}

@ -10,55 +10,18 @@ use std::{
num::NonZeroU8, num::NonZeroU8,
ops, ops,
iter, iter,
iter::Sum,
}; };
use smallmap::Map; use smallmap::Map;
mod input; mod input;
mod diff;
use diff::Diffs;
const INPUT: &str = "input"; const INPUT: &str = "input";
type Adaptors = Map<NonZeroU8, ()>; type Adaptors = Map<NonZeroU8, ()>;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
struct Diffs([usize; 3]);
impl ops::Add for Diffs
{
type Output = Self;
fn add(self, other: Self) -> Self::Output{
Self([
self.0[0] + other.0[0],
self.0[1] + other.0[1],
self.0[2] + other.0[2],
])
}
}
impl ops::AddAssign for Diffs
{
fn add_assign(&mut self, rhs: Self) {
self.0[0] += rhs.0[0];
self.0[1] += rhs.0[1];
self.0[2] += rhs.0[2];
}
}
impl Diffs
{
pub fn jd1(&self) -> usize
{
self.0[0]
}
pub fn jd2(&self) -> usize
{
self.0[1]
}
pub fn jd3(&self) -> usize
{
self.0[2]
}
}
fn parse_input(file: &str) -> Result<impl Iterator<Item = input::Int>, io::Error> fn parse_input(file: &str) -> Result<impl Iterator<Item = input::Int>, io::Error>
{ {
let file = OpenOptions::new().read(true).open(file)?; let file = OpenOptions::new().read(true).open(file)?;
@ -77,13 +40,13 @@ fn find_smallest(map: &Adaptors, finding: impl Into<u8>) -> (Option<u8>, Diffs)
{ {
let shim = finding + $l; let shim = finding + $l;
debug_assert!(shim > 0); debug_assert!(shim > 0);
//eprintln!("Looking up {}", shim);
match map.get(&unsafe { match map.get(&unsafe {
NonZeroU8::new_unchecked(shim) NonZeroU8::new_unchecked(shim)
}).map(|_| shim) { }).map(|_| shim) {
Some(yes) if !set => { Some(yes) if !set => {
set = true; set = true;
diffs.0[($l-1)] += 1; *diffs.at_mut($l-1) += 1;
Some(yes) Some(yes)
}, },
x => x x => x
@ -124,21 +87,15 @@ fn main() -> Result<(), Box<dyn std::error::Error>>
map map
}; };
debug_assert_eq!(all_jolts.num_pages(), 1); // Assert we have space efficiency. debug_assert_eq!(all_jolts.num_pages(), 1); // Assert we have space efficiency.
let mut current = 0; let diffs: Diffs = std::iter::successors(Some((0, Diffs::default())), |&(next, _)| {
#[allow(unused_variables)] if let (Some(next), d) = find_smallest(&all_jolts, next) {
let mut sum=0; Some((next, d))
let mut whole_diffs = Diffs::default();
loop {
if let (Some(next), diffs) = find_smallest(&all_jolts, current) {
current = next;
sum+=1;
whole_diffs += diffs;
} else { } else {
break; None
} }
} }).map(|(_, d)| d).sum();
println!("{}", whole_diffs.jd1() * whole_diffs.jd3()); println!("{}", diffs.jd1() * diffs.jd3());
Ok(()) Ok(())
} }

Loading…
Cancel
Save