Skip to content

Commit 4eb4575

Browse files
committed
Year 2015 Day 14
1 parent 2a4db83 commit 4eb4575

File tree

8 files changed

+86
-0
lines changed

8 files changed

+86
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,3 +249,4 @@ pie
249249
| 11 | [Corporate Policy](https://adventofcode.com/2015/day/11) | [Source](src/year2015/day11.rs) | 1 |
250250
| 12 | [JSAbacusFramework.io](https://adventofcode.com/2015/day/12) | [Source](src/year2015/day12.rs) | 80 |
251251
| 13 | [Knights of the Dinner Table](https://adventofcode.com/2015/day/13) | [Source](src/year2015/day13.rs) | 39 |
252+
| 14 | [Reindeer Olympics](https://adventofcode.com/2015/day/14) | [Source](src/year2015/day14.rs) | 28 |

benches/benchmark.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ mod year2015 {
4949
benchmark!(year2015, day11);
5050
benchmark!(year2015, day12);
5151
benchmark!(year2015, day13);
52+
benchmark!(year2015, day14);
5253
}
5354

5455
mod year2019 {

input/year2015/day14.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Vixen can fly 8 km/s for 8 seconds, but then must rest for 53 seconds.
2+
Blitzen can fly 13 km/s for 4 seconds, but then must rest for 49 seconds.
3+
Rudolph can fly 20 km/s for 7 seconds, but then must rest for 132 seconds.
4+
Cupid can fly 12 km/s for 4 seconds, but then must rest for 43 seconds.
5+
Donner can fly 9 km/s for 5 seconds, but then must rest for 38 seconds.
6+
Dasher can fly 10 km/s for 4 seconds, but then must rest for 37 seconds.
7+
Comet can fly 3 km/s for 37 seconds, but then must rest for 76 seconds.
8+
Prancer can fly 9 km/s for 12 seconds, but then must rest for 97 seconds.
9+
Dancer can fly 37 km/s for 1 seconds, but then must rest for 36 seconds.

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ pub mod year2015 {
173173
pub mod day11;
174174
pub mod day12;
175175
pub mod day13;
176+
pub mod day14;
176177
}
177178

178179
/// # Rescue Santa from deep space with a solar system adventure.

src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ fn all_solutions() -> Vec<Solution> {
8989
solution!(year2015, day11),
9090
solution!(year2015, day12),
9191
solution!(year2015, day13),
92+
solution!(year2015, day14),
9293
// 2019
9394
solution!(year2019, day01),
9495
solution!(year2019, day02),

src/year2015/day14.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
//! # Reindeer Olympics
2+
//!
3+
//! In order to make things easier we create a function to calculate the distance travelled by a
4+
//! reindeer at any arbitrary time.
5+
use crate::util::iter::*;
6+
use crate::util::parse::*;
7+
8+
type Reindeer = [u32; 3];
9+
10+
pub fn parse(input: &str) -> Vec<Reindeer> {
11+
input.iter_unsigned().chunk::<3>().collect()
12+
}
13+
14+
pub fn part1(input: &[Reindeer]) -> u32 {
15+
part1_testable(input, 2503)
16+
}
17+
18+
pub fn part2(input: &[Reindeer]) -> u32 {
19+
part2_testable(input, 2503)
20+
}
21+
22+
pub fn part1_testable(input: &[Reindeer], time: u32) -> u32 {
23+
input.iter().map(|&r| distance(r, time)).max().unwrap()
24+
}
25+
26+
pub fn part2_testable(input: &[Reindeer], time: u32) -> u32 {
27+
let mut score = vec![0; input.len()];
28+
let mut distances = vec![0; input.len()];
29+
30+
for minute in 1..time {
31+
let mut lead = 0;
32+
33+
for (index, &reindeer) in input.iter().enumerate() {
34+
let next = distance(reindeer, minute);
35+
distances[index] = next;
36+
lead = lead.max(next);
37+
}
38+
39+
for (index, &distance) in distances.iter().enumerate() {
40+
if distance == lead {
41+
score[index] += 1;
42+
}
43+
}
44+
}
45+
46+
*score.iter().max().unwrap()
47+
}
48+
49+
fn distance([speed, fly, rest]: Reindeer, time: u32) -> u32 {
50+
let total = fly + rest;
51+
let complete = time / total;
52+
let partial = (time % total).min(fly);
53+
54+
speed * (fly * complete + partial)
55+
}

tests/test.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ mod year2015 {
4242
mod day11_test;
4343
mod day12_test;
4444
mod day13_test;
45+
mod day14_test;
4546
}
4647

4748
mod year2019 {

tests/year2015/day14_test.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
use aoc::year2015::day14::*;
2+
3+
const EXAMPLE: &str = "\
4+
Comet can fly 14 km/s for 10 seconds, but then must rest for 127 seconds.
5+
Dancer can fly 16 km/s for 11 seconds, but then must rest for 162 seconds.";
6+
7+
#[test]
8+
fn part1_test() {
9+
let input = parse(EXAMPLE);
10+
assert_eq!(part1_testable(&input, 1000), 1120);
11+
}
12+
13+
#[test]
14+
fn part2_test() {
15+
let input = parse(EXAMPLE);
16+
assert_eq!(part2_testable(&input, 1000), 689);
17+
}

0 commit comments

Comments
 (0)