Skip to content

Commit 800e0f0

Browse files
committed
feat: upload day 7
1 parent d144396 commit 800e0f0

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-0
lines changed

2024/day-7/Cargo.lock

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

2024/day-7/Cargo.toml

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[package]
2+
name = "day-7"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]

2024/day-7/src/main.rs

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// ╭─────────────────────────────────────────────────────────╮
2+
// │ Advent of Code 2024 - Day 7 │
3+
// ╰─────────────────────────────────────────────────────────╯
4+
5+
fn main() {
6+
let input = include_str!("../input.txt");
7+
8+
// ── Part 1 ──────────────────────────────────────────────────────────
9+
let result_part1 = input.lines().map(|line| {
10+
let (unparsed_result, unparsed_numbers) = line.split_once(": ").expect("Invalid input");
11+
let result = unparsed_result.parse::<usize>().unwrap();
12+
let numbers = unparsed_numbers.split(" ")
13+
.map(|unparsed_number| unparsed_number.parse::<usize>().unwrap())
14+
.collect::<Vec<_>>();
15+
if try_numbers(&numbers[1..], result, numbers[0]) { result } else { 0 }
16+
}).sum::<usize>();
17+
println!("Result: {result_part1}");
18+
// ── Part 2 ──────────────────────────────────────────────────────────
19+
let result_part2 = input.lines().map(|line| {
20+
let (unparsed_result, unparsed_numbers) = line.split_once(": ").expect("Invalid input");
21+
let result = unparsed_result.parse::<usize>().unwrap();
22+
let numbers = unparsed_numbers.split(" ")
23+
.map(|unparsed_number| unparsed_number.parse::<usize>().unwrap())
24+
.collect::<Vec<_>>();
25+
if try_numbers2(&numbers[1..], result, numbers[0]) { result } else { 0 }
26+
}).sum::<usize>();
27+
println!("Result: {result_part2}");
28+
}
29+
30+
fn try_numbers(numbers: &[usize], result: usize, current: usize) -> bool {
31+
if numbers.is_empty() {
32+
result == current
33+
} else if current > result {
34+
false
35+
} else {
36+
try_numbers(&numbers[1..], result, current + numbers[0]) || try_numbers(&numbers[1..], result, current * numbers[0])
37+
}
38+
}
39+
40+
fn try_numbers2(numbers: &[usize], result: usize, current: usize) -> bool {
41+
if numbers.is_empty() {
42+
result == current
43+
} else if current > result {
44+
false
45+
} else {
46+
try_numbers2(&numbers[1..], result, current + numbers[0]) || try_numbers2(&numbers[1..], result, current * numbers[0]) || try_numbers2(&numbers[1..], result, current * 10usize.pow(numbers[0].ilog10() + 1) + numbers[0])
47+
}
48+
}

0 commit comments

Comments
 (0)