-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathd09.rs
More file actions
70 lines (56 loc) · 1.72 KB
/
d09.rs
File metadata and controls
70 lines (56 loc) · 1.72 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
use lazy_static::lazy_static;
use regex::Regex;
use crate::Day;
pub struct Day09 {}
impl Day for Day09 {
fn year(&self) -> u16 {
2016
}
fn day(&self) -> u8 {
9
}
fn part_one(&self) -> String {
decompress(self.read_default_input(), false).to_string()
}
fn part_two(&self) -> String {
decompress(self.read_default_input(), true).to_string()
}
}
lazy_static! {
static ref RE_RANGE: Regex = Regex::new(r"\((\d+)x(\d+)\)").unwrap();
}
fn decompress(string: String, nested: bool) -> usize {
let chars: Vec<_> = string.chars().collect();
let mut size = 0;
let mut i = 0;
while i < chars.len() {
if chars[i] == '(' {
let mut end: usize = 0;
let mut repeat_size: usize = 0;
let mut repeat_count: usize = 0;
for (j, item) in chars.iter().enumerate().skip(i) {
if *item == ')' {
end = j;
break;
}
}
let range_str = String::from_iter(&chars[i..=end]);
for cap in RE_RANGE.captures_iter(&range_str) {
repeat_size = cap[1].parse::<usize>().unwrap();
repeat_count = cap[2].parse::<usize>().unwrap();
}
let repeat_str = String::from_iter(&chars[end + 1..=end + repeat_size]);
if repeat_str.contains("(") && nested {
let deep_size = decompress(repeat_str, nested);
size += deep_size * repeat_count;
} else {
size += repeat_str.len() * repeat_count;
}
i = end + 1 + repeat_size;
} else {
size += 1;
i += 1;
}
}
size
}