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