Add first half of first day's solution for 2023
This commit is contained in:
parent
e95aa25c40
commit
b372fd0213
8
2023/day1/Cargo.toml
Normal file
8
2023/day1/Cargo.toml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
[package]
|
||||||
|
name = "day1"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
42
2023/day1/README.md
Normal file
42
2023/day1/README.md
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
# Day 1: Trebuchet?!
|
||||||
|
|
||||||
|
Something is wrong with global snow production, and you've been selected to take a look.
|
||||||
|
The Elves have even given you a map; on it, they've used stars to mark the top fifty
|
||||||
|
locations that are likely to be having problems.
|
||||||
|
|
||||||
|
You've been doing this long enough to know that to restore snow operations, you need to
|
||||||
|
check all *fifty stars* by December 25th.
|
||||||
|
|
||||||
|
Collect stars by solving puzzles. Two puzzles will be made available on each day in
|
||||||
|
the Advent calendar; the second puzzle is unlocked when you complete the first. Each
|
||||||
|
puzzle grants *one star*. Good luck!
|
||||||
|
|
||||||
|
You try to ask why they can't just use a weather machine ("not powerful enough") and where
|
||||||
|
they're even sending you ("the sky") and why your map looks mostly blank ("you sure ask a
|
||||||
|
lot of questions") and hang on did you just say the sky ("of course, where do you think
|
||||||
|
snow comes from") when you realize that the Elves are already loading you into a
|
||||||
|
trebuchet ("please hold still, we need to strap you in").
|
||||||
|
|
||||||
|
As they're making the final adjustments, they discover that their calibration
|
||||||
|
document (your puzzle input) has been **amended** by a very young Elf who was apparently
|
||||||
|
just excited to show off her art skills. Consequently, the Elves are having trouble
|
||||||
|
reading the values on the document.
|
||||||
|
|
||||||
|
The newly-improved calibration document consists of lines of text; each line originally
|
||||||
|
contained a specific **calibration value** that the Elves now need to recover. On each line,
|
||||||
|
the calibration value can be found by combining the **first digit** and the **last digit**
|
||||||
|
(in that order) to form a single **two-digit number**.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
```
|
||||||
|
1abc2
|
||||||
|
pqr3stu8vwx
|
||||||
|
a1b2c3d4e5f
|
||||||
|
treb7uchet
|
||||||
|
```
|
||||||
|
|
||||||
|
In this example, the calibration values of these four lines are 12, 38, 15, and 77.
|
||||||
|
Adding these together produces 142.
|
||||||
|
|
||||||
|
Consider your entire calibration document. **What is the sum of all of the calibration values?**
|
1000
2023/day1/src/input.txt
Normal file
1000
2023/day1/src/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
49
2023/day1/src/main.rs
Normal file
49
2023/day1/src/main.rs
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
use std::collections::VecDeque;
|
||||||
|
|
||||||
|
fn get_lines(raw: &str) -> Vec<Vec<char>> {
|
||||||
|
raw.split('\n').map(|line| line.chars().collect()).collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn filter_lines(raw: &Vec<Vec<char>>) -> Vec<VecDeque<char>> {
|
||||||
|
raw.iter()
|
||||||
|
.map(|line| {
|
||||||
|
let line: Vec<char> = line
|
||||||
|
.into_iter()
|
||||||
|
.filter(|c| c.is_digit(10))
|
||||||
|
.map(|c| c.to_owned())
|
||||||
|
.collect();
|
||||||
|
VecDeque::from(line)
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_values(raw: &mut Vec<VecDeque<char>>) -> Vec<usize> {
|
||||||
|
raw.iter_mut()
|
||||||
|
.map(|line| {
|
||||||
|
let first = match line.pop_front() {
|
||||||
|
Some(c) => c,
|
||||||
|
None => '0',
|
||||||
|
};
|
||||||
|
let last = match line.pop_back() {
|
||||||
|
Some(c) => c,
|
||||||
|
None => first,
|
||||||
|
};
|
||||||
|
let str: String = Vec::from([first, last]).into_iter().collect();
|
||||||
|
|
||||||
|
return usize::from_str_radix(&str, 10).unwrap();
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn sum(raw: Vec<usize>) -> usize {
|
||||||
|
raw.into_iter().reduce(|accum, item| accum + item).unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let file_str = include_str!("input.txt");
|
||||||
|
let lines = get_lines(file_str);
|
||||||
|
let mut lines = filter_lines(&lines);
|
||||||
|
let values = get_values(&mut lines);
|
||||||
|
|
||||||
|
println!("Total: {}", sum(values));
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user