Completed day one
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
**/target/*
|
||||||
7
day_01/Cargo.lock
generated
Normal file
7
day_01/Cargo.lock
generated
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "day_01"
|
||||||
|
version = "0.1.0"
|
||||||
8
day_01/Cargo.toml
Normal file
8
day_01/Cargo.toml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
[package]
|
||||||
|
name = "day_01"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
1000
day_01/input.txt
Normal file
1000
day_01/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
50
day_01/src/lib.rs
Normal file
50
day_01/src/lib.rs
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
use std::iter::zip;
|
||||||
|
|
||||||
|
const WORD_LIST: [&str; 9] = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
|
||||||
|
const DIGIT_LIST: [&str; 9] = ["one1one", "two2two", "three3three", "four4four", "five5five", "six6six", "seven7seven", "eight8eight", "nine9nine"];
|
||||||
|
|
||||||
|
fn find_first_digit(line: &str) -> u32 {
|
||||||
|
match line.chars().find(|character| { character.is_digit(10) }) {
|
||||||
|
Some(x) => x.to_digit(10).unwrap(),
|
||||||
|
None => 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn find_last_digit(line: &str) -> u32 {
|
||||||
|
match line.chars().rev().find(|character| { character.is_digit(10) }) {
|
||||||
|
Some(x) => x.to_digit(10).unwrap(),
|
||||||
|
None => 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn replace_with_digits(input: &str) -> String {
|
||||||
|
let mut output = input.to_string();
|
||||||
|
for (word, digit) in zip(WORD_LIST, DIGIT_LIST) {
|
||||||
|
output = output.replace(word, digit).to_string();
|
||||||
|
}
|
||||||
|
output
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part1(input: &str) -> String {
|
||||||
|
let calibration_lines = input
|
||||||
|
.split("\n")
|
||||||
|
.map(|line| {
|
||||||
|
let first = find_first_digit(line);
|
||||||
|
let last = find_last_digit(line);
|
||||||
|
format!("{}{}", first, last).parse::<u32>().unwrap()
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
format!("{}", calibration_lines.into_iter().sum::<u32>())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part2(input: &str) -> String {
|
||||||
|
let parsed_inputs = &replace_with_digits(input);
|
||||||
|
dbg!(parsed_inputs);
|
||||||
|
part1(parsed_inputs)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub mod prelude {
|
||||||
|
pub use super::part1;
|
||||||
|
pub use super::part2;
|
||||||
|
}
|
||||||
|
|
||||||
34
day_01/src/main.rs
Normal file
34
day_01/src/main.rs
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
use day_01::prelude::*;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let input = include_str!("../input.txt");
|
||||||
|
println!("{}", part1(input));
|
||||||
|
println!("{}", part2(input));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_part1() {
|
||||||
|
let test_input = "1abc2
|
||||||
|
pqr3stu8vwx
|
||||||
|
a1b2c3d4e5f
|
||||||
|
treb7uchet";
|
||||||
|
assert_eq!(part1(test_input), "142".to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_part2() {
|
||||||
|
let test_input = "two1nine
|
||||||
|
eightwothree
|
||||||
|
abcone2threexyz
|
||||||
|
xtwone3four
|
||||||
|
4nineeightseven2
|
||||||
|
zoneight234
|
||||||
|
7pqrstsixteen";
|
||||||
|
assert_eq!(part2(test_input), "281".to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user