Skip to content

Commit 5086ce6

Browse files
committed
Day 15 rust
(and fix test suite)
1 parent 77bf29e commit 5086ce6

File tree

5 files changed

+56
-3
lines changed

5 files changed

+56
-3
lines changed

data/day15.txt

Whitespace-only changes.

libaoc/aoc_attr/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ pub fn aoc(attr: TokenStream, item: TokenStream) -> TokenStream {
8484
let solution = libaoc::get_solution(&*crate::SOLUTIONS, #day_number)?;
8585
let mut timer = Timer::new();
8686
let res = #fn_name::#provided_name(&mut timer, solution.file.to_string())?;
87-
assert_eq!(res.part1, #part1);
87+
assert_eq!(res.results[0].1, #part1);
8888
Ok(())
8989
}
9090

@@ -93,7 +93,7 @@ pub fn aoc(attr: TokenStream, item: TokenStream) -> TokenStream {
9393
let solution = libaoc::get_solution(&*crate::SOLUTIONS, #day_number)?;
9494
let mut timer = Timer::new();
9595
let res = #fn_name::#provided_name(&mut timer, solution.file.to_string())?;
96-
assert_eq!(res.part2, #part2);
96+
assert_eq!(res.results[1].1, #part2);
9797
Ok(())
9898
}
9999
}

libaoc/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ pub fn get_solution(solutions: &'static [Solution], day: usize) -> Result<&Solut
3939

4040
/// generic result container for each day
4141
pub struct AocResult {
42-
results: Vec<(&'static str, String)>,
42+
pub results: Vec<(&'static str, String)>,
4343
}
4444

4545
impl AocResult {

src/days/day15.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
use anyhow::Result;
2+
use libaoc::{aoc, AocResult, Timer};
3+
use hashbrown::HashMap;
4+
5+
fn run(numbers: &[usize], max: usize) -> usize{
6+
let mut spoken = 0;
7+
let len = numbers.len();
8+
let mut numbers_map = HashMap::new();
9+
for i in 0..max {
10+
let num = numbers[i % len];
11+
if i < numbers.len() {
12+
numbers_map.insert(num, (1, i, 0));
13+
spoken = num;
14+
} else {
15+
if let Some(last) = numbers_map.get_mut(&spoken) {
16+
if last.0 == 1 {
17+
spoken = 0;
18+
let num = numbers_map.get_mut(&0).unwrap();
19+
num.0 += 1;
20+
num.2 = num.1;
21+
num.1 = i;
22+
} else {
23+
spoken = last.1 - last.2;
24+
let temp = (1,i,0);
25+
let mut num = *numbers_map.get(&spoken).unwrap_or(&temp);
26+
num.0 += 1;
27+
num.2 = num.1;
28+
num.1 = i;
29+
numbers_map.insert(spoken, num);
30+
}
31+
} else {
32+
numbers_map.insert(spoken, (1, i, 0));
33+
spoken = 0;
34+
}
35+
}
36+
}
37+
spoken
38+
}
39+
40+
#[aoc("1015", "201")]
41+
pub fn solve(timer: &mut Timer, _input: String) -> Result<AocResult> {
42+
let numbers = vec![19,0,5,1,10,13];
43+
timer.lap("Parse");
44+
45+
let part1 = run(&numbers, 2020);
46+
timer.lap("Part 1");
47+
48+
let part2 = run(&numbers, 30000000);
49+
timer.lap("Part 2");
50+
51+
Ok(AocResult::new(part1, part2))
52+
}

src/days/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ mod day11;
1212
mod day12;
1313
mod day13;
1414
mod day14;
15+
mod day15;

0 commit comments

Comments
 (0)