summaryrefslogtreecommitdiff
path: root/2023/Rust/src/day1.rs
blob: c8fae400df3b37497aab402698555a064c6991a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
fn solve_part_one(data: &str) -> u32 {
    data.lines()
        .map(|x| x.chars().filter(|ch| ch.is_digit(10)).collect::<String>())
        .collect::<Vec<_>>()
        .iter()
        .map(|x| {
            format!("{}{}", x.chars().next().unwrap(), x.chars().last().unwrap())
                .parse::<u32>()
                .unwrap()
        })
        .sum()
}

fn solve_part_two(data: &str) -> u32 {
    let nums = vec![
        ("one", "1"),
        ("two", "2"),
        ("three", "3"),
        ("four", "4"),
        ("five", "5"),
        ("six", "6"),
        ("seven", "7"),
        ("eight", "8"),
        ("nine", "9"),
    ];
    let mut sum = 0;
    for line in data.lines() {
        let mut v = vec![];
        for (lit, dig) in nums.iter() {
            if let Some(idx) = line.find(lit) {
                v.push((idx, dig));
            }
            if let Some(idx) = line.find(dig) {
                v.push((idx, dig));
            }
            let line_rev = line.chars().rev().collect::<String>();
            let lit_rev = lit.chars().rev().collect::<String>();
            if let Some(idx) = line_rev.find(lit_rev.as_str()) {
                v.push((line_rev.len() - idx - lit_rev.len(), dig));
            }
            if let Some(idx) = line_rev.find(dig) {
                v.push((line_rev.len() - idx - 1, dig));
            }
        }
        v.sort();
        sum += format!("{}{}", v.first().unwrap().1, v.last().unwrap().1)
            .parse::<u32>()
            .unwrap();
    }
    sum
}

fn main() {
    let test_1 = include_str!("../input/day1_1.test");
    let test_2 = include_str!("../input/day1_2.test");
    let prod = include_str!("../input/day1.prod");
    println!("part_1 test: {:?}", solve_part_one(test_1));
    println!("part_1 prod {:?}", solve_part_one(prod));
    println!("part_2 test: {:?}", solve_part_two(test_2));
    println!("part_2 prod {:?}", solve_part_two(prod));
}