Skip to content

Commit a2166e1

Browse files
committed
feat: add day14 part1
1 parent e42fcfe commit a2166e1

File tree

2 files changed

+116
-0
lines changed

2 files changed

+116
-0
lines changed

src/2024/days.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use day10::Day10;
66
use day11::Day11;
77
use day12::Day12;
88
use day13::Day13;
9+
use day14::Day14;
910
use day2::Day2;
1011
use day3::Day3;
1112
use day4::Day4;
@@ -21,6 +22,7 @@ pub mod day10;
2122
pub mod day11;
2223
pub mod day12;
2324
pub mod day13;
25+
pub mod day14;
2426
pub mod day2;
2527
pub mod day3;
2628
pub mod day4;
@@ -54,6 +56,8 @@ pub fn get_days() -> HashMap<u8, Box<dyn Day>> {
5456
(12, Box::new(Day12::default()) as Box<dyn Day>),
5557
(12, Box::new(Day12::default()) as Box<dyn Day>),
5658
(13, Box::new(Day13::default()) as Box<dyn Day>),
59+
(13, Box::new(Day13::default()) as Box<dyn Day>),
60+
(14, Box::new(Day14::default()) as Box<dyn Day>),
5761
]);
5862

5963
all_days

src/2024/days/day14.rs

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
use std::error::Error;
2+
3+
use regex::Regex;
4+
5+
use super::{baseday::DayResult, Day};
6+
7+
#[derive(Default)]
8+
pub struct Day14 {}
9+
10+
impl Day14 {
11+
fn parse_input(&self, input: String) -> Vec<[isize; 4]> {
12+
let re = Regex::new(r"p=(\d+),(\d+) v=(-?\d+),(-?\d+)").unwrap();
13+
14+
let mut robots = vec![];
15+
16+
for capture in re.captures_iter(&input) {
17+
let (_, digits) = capture.extract();
18+
19+
robots.push(digits.map(|d| d.parse::<isize>().unwrap()));
20+
}
21+
22+
robots
23+
}
24+
25+
fn part1(&self, parsed: &mut Vec<[isize; 4]>, width: isize, height: isize) -> usize {
26+
let seconds = 100;
27+
28+
let robots = parsed;
29+
30+
for _ in 0..seconds {
31+
for robot in &mut *robots {
32+
let [px, py, vx, vy] = robot;
33+
34+
*px = (*px + *vx + width) % width;
35+
*py = (*py + *vy + height) % height;
36+
}
37+
}
38+
39+
let mut quadrant_count = vec![0, 0, 0, 0];
40+
41+
let mid_x = (width - 1) / 2;
42+
let mid_y = (height - 1) / 2;
43+
44+
for [px, py, _, _] in &mut *robots {
45+
if *px < mid_x && *py < mid_y {
46+
quadrant_count[0] += 1;
47+
} else if *px > mid_x && *py < mid_y {
48+
quadrant_count[1] += 1;
49+
} else if *px < mid_x && *py > mid_y {
50+
quadrant_count[2] += 1;
51+
} else if *px > mid_x && *py > mid_y {
52+
quadrant_count[3] += 1;
53+
}
54+
}
55+
56+
quadrant_count.iter().product()
57+
}
58+
59+
fn part2(&self, _parsed: Vec<[isize; 4]>) -> usize {
60+
0
61+
}
62+
}
63+
64+
impl Day for Day14 {
65+
fn exec(&self, input: String) -> Result<DayResult, Box<dyn Error>> {
66+
let mut parsed = self.parse_input(input);
67+
68+
let p1 = self.part1(&mut parsed, 101, 103);
69+
let p2 = self.part2(parsed);
70+
71+
Ok(DayResult {
72+
part1: p1.to_string(),
73+
part2: p2.to_string(),
74+
})
75+
}
76+
}
77+
78+
#[test]
79+
fn test_day14_p1() {
80+
let input = String::from(
81+
"p=0,4 v=3,-3
82+
p=6,3 v=-1,-3
83+
p=10,3 v=-1,2
84+
p=2,0 v=2,-1
85+
p=0,0 v=1,3
86+
p=3,0 v=-2,-2
87+
p=7,6 v=-1,-3
88+
p=3,0 v=-1,-2
89+
p=9,3 v=2,3
90+
p=7,3 v=-1,2
91+
p=2,4 v=2,-3
92+
p=9,5 v=-3,-3
93+
",
94+
);
95+
96+
let day = Day14::default();
97+
let mut parsed = day.parse_input(input);
98+
let res = day.part1(&mut parsed, 11, 7);
99+
100+
assert_eq!(res, 12)
101+
}
102+
103+
#[test]
104+
fn test_day14_p2() {
105+
let input = String::from("");
106+
107+
let day = Day14::default();
108+
let parsed = day.parse_input(input);
109+
let res = day.part2(parsed);
110+
111+
assert_eq!(res, 0)
112+
}

0 commit comments

Comments
 (0)