summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2023-12-06 00:21:29 -0500
committerJesse Luehrs <doy@tozt.net>2023-12-06 00:21:29 -0500
commit1b7f4b19bc1b0867b62425624c48e50dcd00f70b (patch)
tree305c9d33a5c3e2d709e29379362e916804684993
parent26e5902e47a397b89a5fab3d2d2e81f32120b9be (diff)
downloadadvent-of-code-1b7f4b19bc1b0867b62425624c48e50dcd00f70b.tar.gz
advent-of-code-1b7f4b19bc1b0867b62425624c48e50dcd00f70b.zip
day 6
-rw-r--r--benches/2023.rs5
-rw-r--r--data/2023/6.txt2
-rw-r--r--src/bin/2023/day6.rs88
-rw-r--r--src/bin/2023/main.rs2
4 files changed, 97 insertions, 0 deletions
diff --git a/benches/2023.rs b/benches/2023.rs
index a9a610b..ebab90c 100644
--- a/benches/2023.rs
+++ b/benches/2023.rs
@@ -11,6 +11,8 @@ mod day3;
mod day4;
#[path = "../src/bin/2023/day5.rs"]
mod day5;
+#[path = "../src/bin/2023/day6.rs"]
+mod day6;
// NEXT MOD
day!(2023, 1, day1);
@@ -18,6 +20,7 @@ day!(2023, 2, day2);
day!(2023, 3, day3);
day!(2023, 4, day4);
day!(2023, 5, day5);
+day!(2023, 6, day6);
// NEXT DAY
fn bench_2023(c: &mut criterion::Criterion) {
@@ -28,6 +31,7 @@ fn bench_2023(c: &mut criterion::Criterion) {
day_combined!(2023, 3, day3);
day_combined!(2023, 4, day4);
day_combined!(2023, 5, day5);
+ day_combined!(2023, 6, day6);
// NEXT DAY COMBINED
})
});
@@ -41,5 +45,6 @@ criterion::criterion_main!(
bench_2023day3,
bench_2023day4,
bench_2023day5,
+ bench_2023day6,
// NEXT GROUP
);
diff --git a/data/2023/6.txt b/data/2023/6.txt
new file mode 100644
index 0000000..578cc39
--- /dev/null
+++ b/data/2023/6.txt
@@ -0,0 +1,2 @@
+Time: 40 81 77 72
+Distance: 219 1012 1365 1089
diff --git a/src/bin/2023/day6.rs b/src/bin/2023/day6.rs
new file mode 100644
index 0000000..209cfef
--- /dev/null
+++ b/src/bin/2023/day6.rs
@@ -0,0 +1,88 @@
+#![allow(dead_code)]
+#![allow(unused_variables)]
+
+use advent_of_code::prelude::*;
+
+#[derive(Debug)]
+pub struct Race {
+ time: i64,
+ distance: i64,
+}
+
+impl Race {
+ fn distance(&self, t: i64) -> i64 {
+ (self.time - t) * t
+ }
+}
+
+pub fn parse(fh: File) -> Result<Vec<Race>> {
+ let mut lines = parse::raw_lines(fh);
+ let time = lines.next().unwrap();
+ let distance = lines.next().unwrap();
+ let times: Vec<_> = time
+ .split(':')
+ .nth(1)
+ .unwrap()
+ .split_whitespace()
+ .map(|s| s.parse().unwrap())
+ .collect();
+ let distances: Vec<_> = distance
+ .split(':')
+ .nth(1)
+ .unwrap()
+ .split_whitespace()
+ .map(|s| s.parse().unwrap())
+ .collect();
+ Ok((0..times.len())
+ .map(|i| Race {
+ time: times[i],
+ distance: distances[i],
+ })
+ .collect())
+}
+
+pub fn part1(races: Vec<Race>) -> Result<i64> {
+ Ok(races
+ .into_iter()
+ .map(|race| -> i64 {
+ (0..race.time)
+ .map(|t| race.distance(t))
+ .filter(|d| *d > race.distance)
+ .count()
+ .try_into()
+ .unwrap()
+ })
+ .product())
+}
+
+pub fn part2(races: Vec<Race>) -> Result<i64> {
+ let mut real_race = Race {
+ time: 0,
+ distance: 0,
+ };
+ for race in races {
+ real_race.time =
+ real_race.time * 10i64.pow(race.time.ilog10() + 1) + race.time;
+ real_race.distance = real_race.distance
+ * 10i64.pow(race.distance.ilog10() + 1)
+ + race.distance;
+ }
+ Ok((0..real_race.time)
+ .map(|t| real_race.distance(t))
+ .filter(|d| *d > real_race.distance)
+ .count()
+ .try_into()
+ .unwrap())
+}
+
+#[test]
+fn test() {
+ assert_eq!(
+ part1(parse(parse::data(2023, 6).unwrap()).unwrap()).unwrap(),
+ 861300
+ );
+ assert_eq!(
+ part2(parse(parse::data(2023, 6).unwrap()).unwrap()).unwrap(),
+ 28101347
+ );
+}
diff --git a/src/bin/2023/main.rs b/src/bin/2023/main.rs
index 1b896b4..828a8a5 100644
--- a/src/bin/2023/main.rs
+++ b/src/bin/2023/main.rs
@@ -16,6 +16,7 @@ mod day2;
mod day3;
mod day4;
mod day5;
+mod day6;
// NEXT MOD
#[paw::main]
@@ -27,6 +28,7 @@ fn main(opt: Opt) -> Result<()> {
3 => advent_of_code::day!(2023, opt.day, opt.puzzle, day3),
4 => advent_of_code::day!(2023, opt.day, opt.puzzle, day4),
5 => advent_of_code::day!(2023, opt.day, opt.puzzle, day5),
+ 6 => advent_of_code::day!(2023, opt.day, opt.puzzle, day6),
// NEXT PART
_ => panic!("unknown day {}", opt.day),
}