Move up to day 11 to the lib/main format, and benchmark day 5 (#3)

This commit is contained in:
Patrick Stevens
2021-05-14 23:14:43 +00:00
committed by GitHub
parent 5959cb8ecd
commit 54f03d6f71
23 changed files with 2236 additions and 1554 deletions

View File

@@ -7,3 +7,9 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
[dev_dependencies]
criterion = "0.3"
[[bench]]
name = "day_5_part_2"
harness = false

View File

@@ -0,0 +1,15 @@
use criterion::{criterion_group, criterion_main, Criterion};
use day_5::day_5::{input, part_2};
fn criterion_benchmark(c: &mut Criterion) {
c.bench_function("part 2", |b| {
let input = input();
b.iter(|| {
let mut input = input.to_vec();
part_2(&mut input);
})
});
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);

73
day_5/src/lib.rs Normal file
View File

@@ -0,0 +1,73 @@
pub mod day_5 {
use std::convert::TryFrom;
pub fn input() -> Vec<i32> {
let input = include_str!("../input.txt");
input
.lines()
.map(|l| {
l.parse()
.unwrap_or_else(|_| panic!("{} wasn't a valid u32", l))
})
.collect::<Vec<i32>>()
}
pub fn part_1(v: &mut Vec<i32>) -> u32 {
let mut count = 0;
let mut index: usize = 0;
while index < v.len() {
let bounce = v[index];
v[index] = bounce + 1;
let test = i32::try_from(index).unwrap() + bounce;
if test < 0 {
return count;
}
index = usize::try_from(test).unwrap();
count += 1;
}
count
}
pub fn part_2(v: &mut Vec<i32>) -> u32 {
let mut count = 0;
let mut index: usize = 0;
while index < v.len() {
let bounce = v[index];
if bounce >= 3 {
v[index] = bounce - 1;
} else {
v[index] = bounce + 1;
}
let test = i32::try_from(index).unwrap() + bounce;
if test < 0 {
return count;
}
index = usize::try_from(test).unwrap();
count += 1;
}
count
}
}
#[cfg(test)]
mod tests {
use super::day_5::*;
#[test]
fn part1_known() {
assert_eq!(part_1(&mut vec![0, 3, 0, 1, -3]), 5);
}
#[test]
fn part2_known() {
assert_eq!(part_2(&mut vec![0, 3, 0, 1, -3]), 10);
}
#[test]
fn test_day_5() {
let input = input();
assert_eq!(part_1(&mut input.clone()), 391540);
let mut input = input;
assert_eq!(part_2(&mut input), 30513679);
}
}

View File

@@ -1,78 +1,8 @@
use std::convert::TryFrom;
fn input() -> Vec<i32> {
let input = include_str!("../input.txt");
input
.lines()
.map(|l| {
l.parse()
.unwrap_or_else(|_| panic!("{} wasn't a valid u32", l))
})
.collect::<Vec<i32>>()
}
pub fn part_1(v: &mut Vec<i32>) -> u32 {
let mut count = 0;
let mut index: usize = 0;
while index < v.len() {
let bounce = v[index];
v[index] = bounce + 1;
let test = i32::try_from(index).unwrap() + bounce;
if test < 0 {
return count;
}
index = usize::try_from(test).unwrap();
count += 1;
}
count
}
pub fn part_2(v: &mut Vec<i32>) -> u32 {
let mut count = 0;
let mut index: usize = 0;
while index < v.len() {
let bounce = v[index];
if bounce >= 3 {
v[index] = bounce - 1;
} else {
v[index] = bounce + 1;
}
let test = i32::try_from(index).unwrap() + bounce;
if test < 0 {
return count;
}
index = usize::try_from(test).unwrap();
count += 1;
}
count
}
use day_5::day_5;
fn main() {
let input = input();
println!("part 1 => {}", part_1(&mut input.clone()));
let input = day_5::input();
println!("part 1 => {}", day_5::part_1(&mut input.clone()));
let mut input = input;
println!("part 2 => {}", part_2(&mut input));
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn part1_known() {
assert_eq!(part_1(&mut vec![0, 3, 0, 1, -3]), 5);
}
#[test]
fn part2_known() {
assert_eq!(part_2(&mut vec![0, 3, 0, 1, -3]), 10);
}
#[test]
fn test_day_5() {
let input = input();
assert_eq!(part_1(&mut input.clone()), 391540);
let mut input = input;
assert_eq!(part_2(&mut input), 30513679);
}
println!("part 2 => {}", day_5::part_2(&mut input));
}