mirror of
https://github.com/Smaug123/advent-of-code-2017
synced 2025-10-20 10:18:40 +00:00
Move up to day 11 to the lib/main format, and benchmark day 5 (#3)
This commit is contained in:
@@ -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
|
||||
|
15
day_5/benches/day_5_part_2.rs
Normal file
15
day_5/benches/day_5_part_2.rs
Normal 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
73
day_5/src/lib.rs
Normal 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);
|
||||
}
|
||||
}
|
@@ -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));
|
||||
}
|
||||
|
Reference in New Issue
Block a user