diff options
author | Starfall <us@starfall.systems> | 2023-12-05 12:22:10 -0600 |
---|---|---|
committer | Starfall <us@starfall.systems> | 2023-12-05 12:25:49 -0600 |
commit | cfda64d4e0ac69eac5fcc3898f126d3b505b8426 (patch) | |
tree | 101920c07da59da4802d73c9906885efa1f996a5 /aoc2023/day1/src/main.rs | |
parent | 90058697439ee3f048f0f42b61ca5ea677e9b5cc (diff) |
aoc2023: day 1 solution
Diffstat (limited to 'aoc2023/day1/src/main.rs')
-rw-r--r-- | aoc2023/day1/src/main.rs | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/aoc2023/day1/src/main.rs b/aoc2023/day1/src/main.rs new file mode 100644 index 0000000..723d632 --- /dev/null +++ b/aoc2023/day1/src/main.rs @@ -0,0 +1,110 @@ +/* + --- 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? + + --- Part Two --- + + Your calculation isn't quite right. It looks like some of the digits are actually spelled out with letters: one, two, three, four, five, six, seven, eight, and nine also count as valid "digits". + + Equipped with this new information, you now need to find the real first and last digit on each line. For example: + + two1nine + eightwothree + abcone2threexyz + xtwone3four + 4nineeightseven2 + zoneight234 + 7pqrstsixteen + + In this example, the calibration values are 29, 83, 13, 24, 42, 14, and 76. Adding these together produces 281. + + What is the sum of all of the calibration values? + */ +use std::fs; + +fn main() { + let input = fs::read_to_string("input") + .unwrap(); + let total = input.lines() + .map(|line| 10 * line.chars().nth(line.find(|c:char| c.is_ascii_digit()).unwrap()).unwrap().to_digit(10).unwrap() + + line.chars().nth(line.rfind(|c:char| c.is_ascii_digit()).unwrap()).unwrap().to_digit(10).unwrap()) + .reduce(|acc, e| acc + e) + .unwrap(); + + println!("Part one total: {total}"); + + let second = input.lines() + .map(|line| 10 * get_num(line) + get_rnum(line)) + .reduce(|acc, e| acc + e) + .unwrap(); + + println!("Part two total: {second}"); +} + +fn get_num(str: &str) -> usize { + let pattern = ["1", "2", "3", "4", "5", "6", "7", "8", "9", + "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]; + + let mut earliest = 255; + let mut val = 0; + + for (i, e) in pattern.iter().enumerate() { + let loc = str.find(e).or(Some(255)).unwrap(); + if loc.lt(&earliest) { + earliest = loc; + val = (i % 9) + 1; + } + } + + val +} + +fn get_rnum(str: &str) -> usize { + let pattern = ["1", "2", "3", "4", "5", "6", "7", "8", "9", + "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]; + + let mut earliest:Option<usize> = None; + let mut val = 0; + + for (i, e) in pattern.iter().enumerate() { + let loc = str.rfind(e); + if loc.is_none() { continue; } + if earliest.is_none() || loc.unwrap().gt(&earliest.unwrap()) { + earliest = loc; + val = (i % 9) + 1; + } + } + + val +} |