add 01, 02

This commit is contained in:
timeshifter
2024-01-31 14:25:08 +01:00
parent aae899c552
commit d49022f310
14 changed files with 1426 additions and 0 deletions
Generated
+14
View File
@@ -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",
]
+9
View File
@@ -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"}
+1000
View File
File diff suppressed because it is too large Load Diff
+7
View File
@@ -0,0 +1,7 @@
two1nine
eightwothree
abcone2threexyz
xtwone3four
4nineeightseven2
zoneight234
7pqrstsixteen
+117
View File
@@ -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
}
}
}