summaryrefslogtreecommitdiff
path: root/aoc2/src/main.rs
blob: e3188e7286f67c2cf23f65cba5d2a170b89d7058 (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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
use std::io::BufReader;
use std::io::prelude::*;
use std::fs::File;

fn main() {
    let lines = read_file();
    let mut current = '5';
    for line in lines {
        current = line.chars().fold(current, |current, dir| move_char_2(current, dir));
        println!("{}", current);
    }
}

fn read_file() -> Vec<String> {
    let file = BufReader::new(File::open("input.txt").unwrap());
    file.lines()
        .map(|line| line.unwrap().trim().to_string())
        .filter(|line| line.len() > 0)
        .collect()
}


//assume current in 1-9 range, and char is in UDLR
fn move_char(current: i32, dir: char) -> i32 {
    match dir {
        'U' => if current <= 3 { current } else { current - 3},
        'D' => if current >= 7 { current } else { current + 3},
        'L' => if current%3 == 1 { current } else { current - 1},
        'R' => if current%3 == 0 { current } else { current + 1},
        _ => panic!("Bad direction character")
    }
}

//     1
//   2 3 4
// 5 6 7 8 9
//   A B C
//     D
fn move_char_2(current: char, dir: char) -> char {
    match dir {
        'U' => match current {
            '1'|'2'|'4'|'5'|'9' => current,
            '3' => '1',
            '6' => '2',
            '7' => '3',
            '8' => '4',
            'A' => '6',
            'B' => '7',
            'C' => '8',
            'D' => 'B',
            _ => panic!("Bad current char")
        },
        'D' => match current {
            'A'|'D'|'C'|'5'|'9' => current,
            '1' => '3',
            '2' => '6',
            '3' => '7',
            '4' => '8',
            '6' => 'A',
            '7' => 'B',
            '8' => 'C',
            'B' => 'D',
            _ => panic!("Bad current char")
        },
        'L' => match current {
            '1'|'2'|'5'|'A'|'D' => current,
            '3' => '2',
            '4' => '3',
            '6' => '5',
            '7' => '6',
            '8' => '7',
            '9' => '8',
            'B' => 'A',
            'C' => 'B',
            _ => panic!("Bad current char")
        },
        'R' => match current {
            '1'|'4'|'9'|'C'|'D' => current,
            '2' => '3',
            '3' => '4',
            '5' => '6',
            '6' => '7',
            '7' => '8',
            '8' => '9',
            'A' => 'B',
            'B' => 'C',
            _ => panic!("Bad current char")
        },
        _ => panic!("Bad direction character")
    }
}