add 01, 02
This commit is contained in:
Generated
+14
@@ -0,0 +1,14 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "aoc"
|
||||
version = "0.1.0"
|
||||
|
||||
[[package]]
|
||||
name = "aoc2024-01"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"aoc",
|
||||
]
|
||||
@@ -0,0 +1,9 @@
|
||||
[package]
|
||||
name = "aoc2024-01"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
aoc = {version = "*", path = "../lib/aoc"}
|
||||
@@ -0,0 +1,7 @@
|
||||
two1nine
|
||||
eightwothree
|
||||
abcone2threexyz
|
||||
xtwone3four
|
||||
4nineeightseven2
|
||||
zoneight234
|
||||
7pqrstsixteen
|
||||
+117
@@ -0,0 +1,117 @@
|
||||
use aoc::read_file;
|
||||
|
||||
const NUMBERS_AS_DIGITS: [&str; 10] = [
|
||||
"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
|
||||
];
|
||||
|
||||
enum Direction {
|
||||
Forward,
|
||||
Reverse,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let content = read_file("a.txt");
|
||||
|
||||
part_a(&content);
|
||||
part_b(&content);
|
||||
}
|
||||
|
||||
fn part_a(content: &[String]) {
|
||||
let mut sum = 0;
|
||||
let mut line_value;
|
||||
|
||||
for line in content {
|
||||
line_value = 0;
|
||||
|
||||
'inner: for ch in line.chars() {
|
||||
if ch.is_ascii_digit() {
|
||||
line_value += ch.to_digit(10).unwrap() * 10;
|
||||
break 'inner;
|
||||
}
|
||||
}
|
||||
'inner: for ch in line.chars().rev() {
|
||||
if ch.is_ascii_digit() {
|
||||
line_value += ch.to_digit(10).unwrap();
|
||||
break 'inner;
|
||||
}
|
||||
}
|
||||
sum += line_value;
|
||||
}
|
||||
println!("{sum}");
|
||||
}
|
||||
|
||||
fn part_b(content: &[String]) {
|
||||
let mut sum = 0;
|
||||
let mut line_value;
|
||||
|
||||
for line in content {
|
||||
line_value = 0;
|
||||
let chars: Vec<_> = line.chars().collect();
|
||||
|
||||
'inner: for i in 0..chars.len() {
|
||||
if chars[i].is_ascii_digit() {
|
||||
line_value = chars[i].to_digit(10).unwrap();
|
||||
break 'inner;
|
||||
} else if let Some(digit) = contains_digit_as_string(&chars, i, Direction::Forward) {
|
||||
line_value = digit;
|
||||
break 'inner;
|
||||
}
|
||||
}
|
||||
|
||||
line_value *= 10;
|
||||
|
||||
'inner: for i in (0..chars.len()).rev() {
|
||||
if chars[i].is_ascii_digit() {
|
||||
line_value += chars[i].to_digit(10).unwrap();
|
||||
break 'inner;
|
||||
} else if let Some(digit) = contains_digit_as_string(&chars, i, Direction::Reverse) {
|
||||
line_value += digit;
|
||||
break 'inner;
|
||||
}
|
||||
}
|
||||
|
||||
sum += line_value;
|
||||
}
|
||||
|
||||
println!("{sum}");
|
||||
}
|
||||
|
||||
fn contains_digit_as_string(chars: &[char], start: usize, direction: Direction) -> Option<u32> {
|
||||
match direction {
|
||||
Direction::Forward => {
|
||||
for possible_len in [3, 4, 5] {
|
||||
let end = start + possible_len;
|
||||
if end >= chars.len() {
|
||||
return None;
|
||||
}
|
||||
|
||||
let s: String = chars.get(start..end).unwrap().iter().collect();
|
||||
|
||||
for (i, number) in NUMBERS_AS_DIGITS.iter().enumerate() {
|
||||
if *number == s {
|
||||
return Some(i as u32);
|
||||
}
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
Direction::Reverse => {
|
||||
let end = start + 1;
|
||||
for possible_len in [3, 4, 5] {
|
||||
let (start, overflow) = end.overflowing_sub(possible_len);
|
||||
if overflow {
|
||||
return None;
|
||||
}
|
||||
|
||||
let s: String = chars.get(start..end).unwrap().iter().collect();
|
||||
|
||||
for (i, number) in NUMBERS_AS_DIGITS.iter().enumerate() {
|
||||
if *number == s {
|
||||
return Some(i as u32);
|
||||
}
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user