Skip to content

Commit d0fc512

Browse files
committed
look who is back at rust, da 14 part 1, and gave up at part 2
1 parent e994b8c commit d0fc512

File tree

5 files changed

+155
-0
lines changed

5 files changed

+155
-0
lines changed

2015/day14/.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/target

2015/day14/Cargo.lock

+42
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2015/day14/Cargo.toml

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[package]
2+
name = "day14"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7+
8+
[dependencies]
9+
regex = "1.6.0"

2015/day14/input.txt

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Dancer can fly 27 km/s for 5 seconds, but then must rest for 132 seconds.
2+
Cupid can fly 22 km/s for 2 seconds, but then must rest for 41 seconds.
3+
Rudolph can fly 11 km/s for 5 seconds, but then must rest for 48 seconds.
4+
Donner can fly 28 km/s for 5 seconds, but then must rest for 134 seconds.
5+
Dasher can fly 4 km/s for 16 seconds, but then must rest for 55 seconds.
6+
Blitzen can fly 14 km/s for 3 seconds, but then must rest for 38 seconds.
7+
Prancer can fly 3 km/s for 21 seconds, but then must rest for 40 seconds.
8+
Comet can fly 18 km/s for 6 seconds, but then must rest for 103 seconds.
9+
Vixen can fly 18 km/s for 5 seconds, but then must rest for 84 seconds.

2015/day14/src/main.rs

+94
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
use std::fs::File;
2+
use std::io::{self, prelude::*, BufReader};
3+
4+
use regex::Regex;
5+
6+
use std::cmp;
7+
8+
#[derive(Default,Debug)]
9+
struct Reindeer {
10+
name: String,
11+
speed: u32,
12+
sprint: u32,
13+
rest: u32,
14+
15+
current_position: u32,
16+
points: u32,
17+
}
18+
19+
impl Reindeer {
20+
fn move_for(&mut self, seconds: u32) -> u32 {
21+
let step = self.sprint + self.rest;
22+
23+
let cycles = seconds / step;
24+
let rest = seconds % step;
25+
26+
let mut movingtime = cycles * self.sprint;
27+
28+
if rest < self.sprint { movingtime += rest; } else { movingtime += self.sprint; }
29+
30+
self.current_position = movingtime * self.speed;
31+
32+
self.current_position
33+
}
34+
}
35+
36+
fn race(reindeers: &mut Vec<Reindeer>, seconds: u32) -> u32 {
37+
let mut max = 0;
38+
39+
for i in 1..=seconds {
40+
max = 0;
41+
for deer in &mut *reindeers {
42+
max = cmp::max(max, deer.move_for(i));
43+
}
44+
45+
for deer in &mut *reindeers {
46+
if deer.current_position == max {
47+
deer.points += 1;
48+
49+
// println!("{} winner is {}", i, deer.name);
50+
}
51+
}
52+
}
53+
max
54+
}
55+
56+
fn main() -> io::Result<()> {
57+
let file = File::open("input.txt")?;
58+
let reader = BufReader::new(file);
59+
60+
let re = Regex::new(r"(?P<reindeer>\w+) can fly (?P<speed>\d+) km/s for (?P<sprint>\d+) seconds, but then must rest for (?P<rest>\d+) seconds\.").unwrap();
61+
62+
let mut reindeers: Vec<Reindeer> = Vec::new();
63+
64+
for row in reader.lines() {
65+
let instruction = row.unwrap();
66+
let cap = re.captures(instruction.as_str()).expect("Cannot parse instruction");
67+
68+
let reindeer = cap.name("reindeer").expect("Failed to get reindeer").as_str();
69+
let speed = cap.name("speed").expect("Failed to get speed").as_str();
70+
let sprint = cap.name("sprint").expect("Failed to get sprint").as_str();
71+
let rest = cap.name("rest").expect("Failed to get reset").as_str();
72+
73+
// println!("{} - speed: {} - sprint: {} - rest: {}", reindeer, speed, sprint, rest);
74+
75+
reindeers.push(Reindeer {
76+
name: reindeer.to_string(),
77+
speed: speed.parse().unwrap(),
78+
sprint: sprint.parse().unwrap(),
79+
rest: rest.parse().unwrap(),
80+
..Default::default()
81+
});
82+
}
83+
84+
let result = race(&mut reindeers, 2503);
85+
println!("P1> Max distance: {}", result);
86+
87+
//let winner = reindeers.iter().max_by_key(|r| r.current_position).unwrap();
88+
//println!("P2> Winner is: {} wit {} pts", winner.name, winner.points);
89+
90+
// println!("{:?}", winner);
91+
// println!("{:?}", reindeers);
92+
93+
Ok(())
94+
}

0 commit comments

Comments
 (0)