aboutsummaryrefslogtreecommitdiff
path: root/src/day14pt2.rs
blob: 04db818a53166d92e45d95a114acccdb806fb36e (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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
fn cycle(input: &mut Vec<Vec<char>>) {
    let mut sl: usize;

    // north
    for j in 0..input[0].len() {
        sl = 0;
        for i in 0..input.len() {
            if input[i][j] == 'O' {
                if sl != i {
                    input[sl][j] = 'O';
                    input[i][j] = '.';
                }
                sl += 1;
            } else if input[i][j] == '#' {
                sl = i + 1;
            }
        }
    }

    // west
    for i in 0..input.len() {
        sl = 0;
        for j in 0..input[0].len() {
            if input[i][j] == 'O' {
                if sl != j {
                    input[i][sl] = 'O';
                    input[i][j] = '.';
                }
                sl += 1;
            } else if input[i][j] == '#' {
                sl = j + 1;
            }
        }
    }

    // south
    for j in 0..input[0].len() {
        sl = input.len() - 1;
        for i in (0..input.len()).rev() {
            if input[i][j] == 'O' {
                if sl != i {
                    input[sl][j] = 'O';
                    input[i][j] = '.';
                }
                if i != 0 {
                    sl -= 1;
                }
            } else if input[i][j] == '#' {
                if i != 0 {
                    sl = i - 1;
                }
            }
        }
    }

    // east
    for i in 0..input.len() {
        sl = input[0].len() - 1;
        for j in (0..input[0].len()).rev() {
            if input[i][j] == 'O' {
                if sl != j {
                    input[i][sl] = 'O';
                    input[i][j] = '.';
                }
                if j != 0 {
                    sl -= 1;
                }
            } else if input[i][j] == '#' {
                if j != 0 {
                    sl = j - 1;
                }
            }
        }
    }
}

fn sum(input: &Vec<Vec<char>>) -> u64 {
    let mut sum: u64 = 0;

    for i in 0..input.len() {
        for j in 0..input[0].len() {
            if input[i][j] == 'O' {
                sum += (input.len() - i) as u64;
            }
        }
    }

    return sum;
}

fn cycle_len(a: &Vec<u64>) -> u64 {
    for cl in 2..(a.len() / 3) {
        let mut ind = true;
        for i in 0..cl {
            if a[i] != a[cl + i] || a[cl + i] != a[cl * 2 + i] {
                ind = false;
                break;
            }
        }
        if ind {
            return cl as u64;
        }
    }
    return 0;
}

pub fn main() {
    let txt = std::fs::read_to_string("./input/day14.txt").unwrap();
    let mut input = txt
        .lines()
        .map(|s| s.chars().collect::<Vec<char>>())
        .collect::<Vec<Vec<char>>>();

    let mut a = vec![];
    for i in 0..1000 {
        cycle(&mut input);
        if i > 500 {
            a.push(sum(&input));
        }
    }

    let cl = cycle_len(&a);
    assert_ne!(cl, 0);

    let c = 1000000000 - 501 - 1;
    println!("{}", a[(c % cl) as usize]);
}