Skip to content

Commit cd23303

Browse files
committed
Faster day 15
1 parent fd88885 commit cd23303

File tree

2 files changed

+32
-34
lines changed

2 files changed

+32
-34
lines changed

day15a/src/main.rs

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,26 @@ fn main() {
44
let mut input = String::new();
55
io::stdin().read_line(&mut input).unwrap();
66

7-
const ITERATIONS: usize = 2020;
7+
const ITERATIONS: i32 = 2020;
88

99
let numbers: Vec<_> = input.trim().split(',').map(|x| x.parse().unwrap()).collect();
10-
let (&last_number, rest) = numbers.split_last().unwrap();
11-
let mut number_timestamps = vec![None; ITERATIONS];
10+
let (&last_number, rest): (&i32, _) = numbers.split_last().unwrap();
11+
let mut last_number = last_number;
12+
let mut number_timestamps = vec![-1; ITERATIONS as usize];
1213
for (&i, n) in rest.iter().zip(1..) {
13-
number_timestamps[i] = Some(n);
14+
number_timestamps[i as usize] = n;
15+
}
16+
17+
for curr_time in numbers.len() as i32..ITERATIONS {
18+
let last_time = number_timestamps[last_number as usize];
19+
let new_number = if last_time >= 0 {
20+
curr_time - last_time
21+
} else {
22+
0
23+
};
24+
number_timestamps[last_number as usize] = curr_time;
25+
last_number = new_number;
1426
}
15-
16-
let (_, last_number) = (numbers.len()..ITERATIONS).fold(
17-
(number_timestamps, last_number),
18-
|(mut number_timestamps, last_number), curr_time| {
19-
let new_number = if let Some(last_time) = number_timestamps[last_number] {
20-
curr_time - last_time
21-
} else {
22-
0
23-
};
24-
number_timestamps[last_number] = Some(curr_time);
25-
(number_timestamps, new_number)
26-
},
27-
);
2827

2928
println!("{}", last_number);
3029
}

day15b/src/main.rs

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,26 @@ fn main() {
44
let mut input = String::new();
55
io::stdin().read_line(&mut input).unwrap();
66

7-
const ITERATIONS: usize = 30000000;
7+
const ITERATIONS: i32 = 30000000;
88

99
let numbers: Vec<_> = input.trim().split(',').map(|x| x.parse().unwrap()).collect();
10-
let (&last_number, rest) = numbers.split_last().unwrap();
11-
let mut number_timestamps = vec![None; ITERATIONS];
10+
let (&last_number, rest): (&i32, _) = numbers.split_last().unwrap();
11+
let mut last_number = last_number;
12+
let mut number_timestamps = vec![-1; ITERATIONS as usize];
1213
for (&i, n) in rest.iter().zip(1..) {
13-
number_timestamps[i] = Some(n);
14+
number_timestamps[i as usize] = n;
15+
}
16+
17+
for curr_time in numbers.len() as i32..ITERATIONS {
18+
let last_time = number_timestamps[last_number as usize];
19+
let new_number = if last_time >= 0 {
20+
curr_time - last_time
21+
} else {
22+
0
23+
};
24+
number_timestamps[last_number as usize] = curr_time;
25+
last_number = new_number;
1426
}
15-
16-
let (_, last_number) = (numbers.len()..ITERATIONS).fold(
17-
(number_timestamps, last_number),
18-
|(mut number_timestamps, last_number), curr_time| {
19-
let new_number = if let Some(last_time) = number_timestamps[last_number] {
20-
curr_time - last_time
21-
} else {
22-
0
23-
};
24-
number_timestamps[last_number] = Some(curr_time);
25-
(number_timestamps, new_number)
26-
},
27-
);
2827

2928
println!("{}", last_number);
3029
}

0 commit comments

Comments
 (0)