-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path11.rs
More file actions
73 lines (63 loc) · 2.07 KB
/
11.rs
File metadata and controls
73 lines (63 loc) · 2.07 KB
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
advent_of_code::solution!(11);
fn part_all(input_str: &str, galaxy_age: usize) -> Option<usize> {
let mut effective_row = 0;
let mut last_row = 0;
let mut coordinates_to_value: Vec<(usize, usize)> = vec![];
for (i, row) in input_str.lines().enumerate() {
for (j, item) in row.chars().enumerate() {
if item == '#' {
let ecart_row = i - last_row;
last_row = i;
if ecart_row > 1 {
effective_row += 1 + (galaxy_age * (ecart_row - 1));
} else {
effective_row += ecart_row;
}
coordinates_to_value.push((j, effective_row));
}
}
}
coordinates_to_value.sort_by_key(|&(first, _)| first);
let (mut effective_col, mut last_col) = (0usize, 0usize);
let (mut coords, mut total) = (vec![], 0usize);
for (new_col, row) in coordinates_to_value.iter() {
let ecart_col = new_col - last_col;
last_col = *new_col;
if ecart_col > 1 {
effective_col += 1 + (galaxy_age * (ecart_col - 1));
} else {
effective_col += ecart_col;
}
let new_coord = (*row, effective_col);
for &(r, c) in coords.iter() {
total += new_coord.0.abs_diff(r) + new_coord.1.abs_diff(c)
}
coords.push(new_coord);
}
Some(total)
}
pub fn part_one(input: &str) -> Option<usize> {
part_all(input, 2)
}
pub fn part_two(input: &str) -> Option<usize> {
part_all(input, 1000000)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_one() {
let result = part_all(&advent_of_code::template::read_file("examples", DAY), 2);
assert_eq!(result, Some(374));
}
#[test]
fn test_two() {
let result = part_all(&advent_of_code::template::read_file("examples", DAY), 10);
assert_eq!(result, Some(1030));
}
#[test]
fn test_three() {
let result = part_all(&advent_of_code::template::read_file("examples", DAY), 100);
assert_eq!(result, Some(8410));
}
}