about summary refs log tree commit diff
path: root/aoc2023/day1/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'aoc2023/day1/src/main.rs')
-rw-r--r--aoc2023/day1/src/main.rs110
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
+}