Skip to content

Commit ce9c959

Browse files
committed
day 15.
part two is slow.
1 parent a8d6b01 commit ce9c959

File tree

6 files changed

+98
-0
lines changed

6 files changed

+98
-0
lines changed

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,16 @@ Part Two: 2002
5050
--- Day 12: Rain Risk ---
5151
Part One: 1007
5252
Part Two: 41212
53+
54+
--- Day 13: Shuttle Search ---
55+
Part One: 1835
56+
Part Two: 247086664214628
57+
58+
--- Day 14: Docking Data ---
59+
Part One: 7477696999511
60+
Part Two: 3687727854171
61+
62+
--- Day 15: Rambunctious Recitation ---
63+
Part One: 1111
64+
Part Two: 48568
5365
```

inputs/15-example.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
0,3,6

inputs/15-input.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
20,9,11,0,1,2

src/day15.rs

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
use std::collections::HashMap;
2+
3+
fn parse_input(input: &str) -> Vec<usize> {
4+
input
5+
.trim()
6+
.split(',')
7+
.map(|s| s.parse().unwrap())
8+
.collect()
9+
}
10+
11+
fn target_number(numbers: Vec<usize>, target: usize) -> usize {
12+
let n = numbers.len();
13+
let mut visited = numbers
14+
.iter()
15+
.take(n - 1)
16+
.enumerate()
17+
.map(|(i, &num)| (num, vec![i + 1]))
18+
.collect::<HashMap<_, _>>();
19+
let mut last = numbers[n - 1];
20+
for i in numbers.len()..target {
21+
if let Some(prev) = visited.get_mut(&last) {
22+
let j = *prev.last().unwrap();
23+
*prev = vec![j, i];
24+
last = i - j;
25+
} else {
26+
visited.insert(last, vec![i]);
27+
last = 0;
28+
}
29+
}
30+
last
31+
}
32+
33+
pub fn part_one(input: &str) -> usize {
34+
let numbers = parse_input(input);
35+
target_number(numbers, 2020)
36+
}
37+
38+
pub fn part_two(input: &str) -> usize {
39+
let numbers = parse_input(input);
40+
target_number(numbers, 30000000)
41+
}
42+
43+
#[cfg(test)]
44+
mod tests {
45+
use super::*;
46+
use crate::read_example;
47+
48+
#[test]
49+
fn example() {
50+
let input = read_example(15);
51+
assert_eq!(part_one(&input), 436);
52+
assert_eq!(part_two(&input), 175594);
53+
}
54+
55+
#[test]
56+
fn more_examples() {
57+
for (input, expected) in vec![
58+
("1,3,2", 1),
59+
("2,1,3", 10),
60+
("1,2,3", 27),
61+
("2,3,1", 78),
62+
("3,2,1", 438),
63+
("3,1,2", 1836),
64+
] {
65+
assert_eq!(part_one(input), expected);
66+
}
67+
}
68+
69+
#[test]
70+
fn more_examples_part_two() {
71+
for (input, expected) in vec![
72+
("1,3,2", 2578),
73+
("2,1,3", 3544142),
74+
("1,2,3", 261214),
75+
("2,3,1", 6895259),
76+
("3,2,1", 18),
77+
("3,1,2", 362),
78+
] {
79+
assert_eq!(part_two(input), expected);
80+
}
81+
}
82+
}

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pub mod day11;
1414
pub mod day12;
1515
pub mod day13;
1616
pub mod day14;
17+
pub mod day15;
1718

1819
pub fn read_as_string(day: u8, filename: &str) -> String {
1920
let filename = format!("inputs/{:02}-{}.txt", day, filename);

src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ fn main() {
3030
puzzle!(day12, "Rain Risk"),
3131
puzzle!(day13, "Shuttle Search"),
3232
puzzle!(day14, "Docking Data"),
33+
puzzle!(day15, "Rambunctious Recitation"),
3334
];
3435

3536
let filename = match env::args().find(|a| a == "--example") {

0 commit comments

Comments
 (0)