Skip to content

Commit 3f3b123

Browse files
committed
feat(14/2015): solve second part
1 parent 76fc1c2 commit 3f3b123

File tree

1 file changed

+62
-3
lines changed

1 file changed

+62
-3
lines changed

src/solutions/year2015/day14.rs

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::solutions::Solution;
22
use itertools::Itertools;
3+
use std::collections::HashMap;
34
use std::num::ParseIntError;
45
use std::str::FromStr;
56

@@ -17,18 +18,47 @@ impl Solution for Day14 {
1718
.to_string()
1819
}
1920

20-
fn part_two(&self, _input: &str) -> String {
21-
String::from("0")
21+
fn part_two(&self, input: &str) -> String {
22+
let reindeers = self.parse(input);
23+
let points = self.points(&reindeers, TIME);
24+
25+
points
26+
.iter()
27+
.max_by_key(|(_, distance)| *distance)
28+
.unwrap()
29+
.1
30+
.to_string()
2231
}
2332
}
2433

2534
impl Day14 {
2635
fn parse(&self, input: &str) -> Vec<Reindeer> {
2736
input.lines().map(|line| line.parse().unwrap()).collect()
2837
}
38+
39+
fn points<'a>(&self, reindeers: &'a [Reindeer], time: u64) -> HashMap<&'a Reindeer, u64> {
40+
let mut points: HashMap<&Reindeer, u64> = HashMap::new();
41+
42+
for reindeer in reindeers {
43+
points.insert(reindeer, 0);
44+
}
45+
46+
for second in 1..=time {
47+
let leading = reindeers
48+
.iter()
49+
.map(|reindeer| (reindeer, reindeer.distance(second)))
50+
.max_set_by_key(|(_, distance)| *distance);
51+
52+
for (lead_reindeer, _) in leading {
53+
*points.entry(lead_reindeer).or_default() += 1;
54+
}
55+
}
56+
57+
points
58+
}
2959
}
3060

31-
#[derive(Debug)]
61+
#[derive(Debug, Eq, Hash, PartialEq, Copy, Clone)]
3262
struct Reindeer {
3363
fly_speed: u64,
3464
fly_time: u64,
@@ -96,4 +126,33 @@ mod tests {
96126
assert_eq!(comet.distance(THOUSAND_SECONDS), 1120);
97127
assert_eq!(dancer.distance(THOUSAND_SECONDS), 1056);
98128
}
129+
130+
#[test]
131+
fn points() {
132+
let comet = Reindeer {
133+
fly_speed: 14,
134+
fly_time: 10,
135+
rest_time: 127,
136+
};
137+
138+
let dancer = Reindeer {
139+
fly_speed: 16,
140+
fly_time: 11,
141+
rest_time: 162,
142+
};
143+
144+
let reindeers = &[comet, dancer];
145+
146+
const ONE_SECOND: u64 = 1;
147+
148+
let points = Day14.points(reindeers, ONE_SECOND);
149+
assert_eq!(*points.get(&dancer).unwrap(), 1);
150+
assert_eq!(*points.get(&comet).unwrap(), 0);
151+
152+
const THOUSANDS_SECOND: u64 = 1000;
153+
154+
let points = Day14.points(reindeers, THOUSANDS_SECOND);
155+
assert_eq!(*points.get(&dancer).unwrap(), 689);
156+
assert_eq!(*points.get(&comet).unwrap(), 312);
157+
}
99158
}

0 commit comments

Comments
 (0)