-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday10.rs
58 lines (47 loc) · 1.2 KB
/
day10.rs
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
//! [Day 10: Elves Look, Elves Say](https://adventofcode.com/2015/day/10)
pub fn main() {
let args = aoc::parse_args();
args.run(solve);
}
/// # Panics
#[must_use]
pub fn solve(data: &str) -> (usize, usize) {
let data = data.trim_ascii();
(calc(data, 40), calc(data, 50))
}
fn calc(start_sequence: &str, turns: u32) -> usize {
let mut look = start_sequence.bytes().collect::<Vec<_>>();
for _ in 0..turns {
let mut say: Vec<_> = Vec::new();
let mut count = 0;
let mut previous = 0;
for current in &look {
if previous != 0 && previous != *current {
extend(&mut say, count);
say.push(previous);
count = 0;
}
count += 1;
previous = *current;
}
extend(&mut say, count);
say.push(previous);
look.clone_from(&say);
}
look.len()
}
fn extend(say: &mut Vec<u8>, num: u32) {
let mut tmp: u32 = num;
let mut base = 1;
loop {
tmp /= 10;
if tmp == 0 {
break;
}
base *= 10;
}
while base != 0 {
say.push(b'0' + ((num / base) % 10) as u8);
base /= 10;
}
}