summaryrefslogtreecommitdiff
path: root/day01/src/main.rs
blob: f391c2eb5266019b560b8b1f444f174993435b9b (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
use std::io;

fn rotate(dial: i32, change: i32, all_zeros: &mut i32) -> i32 {
    /*
    let mut ret = dial + change;
    if ret == 0 {
        *all_zeros += 1;
    }
    while ret < 0 {
        ret += 100;
        if dial > 0 {
            *all_zeros += 1;
        }
    }
    while ret > 99 {
        ret -= 100;
        if dial > 0 {
            *all_zeros += 1;
        }
    }
    return ret;
     */
    let mut ret = dial;
    let mut change = change;
    loop {
        if change < 0 {
            ret -= 1;
            change += 1;
            if ret == -1 {
                ret = 99;
            }
        } else {
            ret += 1;
            change -= 1;
            if ret == 100 {
                ret = 0;
            }
        }
        if ret == 0 {
            *all_zeros += 1;
        }
        if change == 0 {
            break;
        }
    }
    ret
}

fn main() {
    let mut dial = 50;
    let mut zeros = 0;
    let mut all_zeros = 0;

    loop {
        let mut buffer = String::new();
        let bytes = io::stdin().read_line(&mut buffer).unwrap();
        if bytes == 0 {
            break;
        }
        let (dir, value_str) = buffer.trim_end().split_at(1);
        let left = match dir {
            "L" => true,
            "R" => false,
            _ => panic!(),
        };
        let mut value = value_str.parse::<i32>().unwrap();
        if left {
            value = -value;
        }
        if value != 0 {
            dial = rotate(dial, value, &mut all_zeros);
        }
        if dial == 0 {
            zeros += 1;
        }
    }

    println!("Zeros {}", zeros);
    println!("All zeros {}", all_zeros);
}