Skip to content

Commit 211b739

Browse files
committed
feat(10/2024): solve first part with the easiest way
1 parent 36e6243 commit 211b739

File tree

2 files changed

+69
-5
lines changed

2 files changed

+69
-5
lines changed

readme.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
| [Day 8: Resonant Collinearity](src/solutions/year2024/day08.rs) | ⭐⭐ | 0.883 | 1.238 |
2222
| [Day 9: Disk Fragmenter](src/solutions/year2024/day09.rs) | ⭐⭐ | 199.930 | 98.860 |
2323
| [Day 10: Hoof It](src/solutions/year2024/day10.rs) | ⭐⭐ | 1.678 | 1.148 |
24+
| [Day 11: Plutonian Pebbles](src/solutions/year2024/day11.rs) || 28.225 | - |
2425

2526
# 2023
2627

src/solutions/year2024/day11.rs

Lines changed: 68 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,88 @@ use crate::solutions::Solution;
22

33
pub struct Day11;
44

5+
type Number = usize;
6+
57
impl Solution for Day11 {
6-
fn part_one(&self, _input: &str) -> String {
7-
String::from('0')
8+
fn part_one(&self, input: &str) -> String {
9+
let mut numbers = self.parse(input);
10+
11+
for _ in 0..25 {
12+
numbers = self.blink(numbers)
13+
}
14+
15+
numbers.len().to_string()
816
}
917

1018
fn part_two(&self, _input: &str) -> String {
1119
String::from('0')
1220
}
1321
}
1422

23+
impl Day11 {
24+
fn parse(&self, input: &str) -> Vec<Number> {
25+
input
26+
.split_whitespace()
27+
.map(|x| x.parse::<usize>().unwrap())
28+
.collect()
29+
}
30+
31+
fn blink(&self, numbers: Vec<Number>) -> Vec<Number> {
32+
numbers
33+
.into_iter()
34+
.flat_map(|n| self.blink_for_number(n))
35+
.collect()
36+
}
37+
38+
fn blink_for_number(&self, number: Number) -> Vec<Number> {
39+
if number == 0 {
40+
return vec![1];
41+
}
42+
43+
let number_str = number.to_string();
44+
let len = number_str.len();
45+
if len % 2 == 0 {
46+
let middle = len / 2;
47+
48+
return vec![
49+
number_str[..middle].parse::<Number>().unwrap(),
50+
number_str[middle..].parse::<Number>().unwrap(),
51+
];
52+
}
53+
54+
vec![number * 2024]
55+
}
56+
}
57+
1558
#[cfg(test)]
1659
mod tests {
17-
use crate::solutions::year2024::day11::Day11;
60+
use crate::solutions::year2024::day11::{Day11, Number};
1861
use crate::solutions::Solution;
62+
use itertools::Itertools;
1963

20-
const EXAMPLE: &str = r#""#;
64+
const EXAMPLE: &str = r#"0 1 10 99 999"#;
65+
const EXAMPLE_2: &str = r#"125 17"#;
2166

2267
#[test]
2368
fn part_one_example_test() {
24-
assert_eq!("0", Day11.part_one(EXAMPLE));
69+
assert_eq!("55312", Day11.part_one(EXAMPLE_2));
70+
}
71+
72+
#[test]
73+
fn blink_for_number() {
74+
assert_eq!(vec![1], Day11.blink_for_number(0));
75+
assert_eq!(vec![2024], Day11.blink_for_number(1));
76+
assert_eq!(vec![1, 0], Day11.blink_for_number(10));
77+
assert_eq!(vec![9, 9], Day11.blink_for_number(99));
78+
assert_eq!(vec![2021976], Day11.blink_for_number(999));
79+
assert_eq!(vec![253, 0], Day11.blink_for_number(253000));
80+
}
81+
82+
#[test]
83+
fn blink() {
84+
let blink_result: Vec<Number> = Day11.blink(Day11.parse(EXAMPLE));
85+
let result_str = blink_result.iter().map(|n| n.to_string()).join(" ");
86+
87+
assert_eq!("1 2024 1 0 9 9 2021976", result_str);
2588
}
2689
}

0 commit comments

Comments
 (0)