@@ -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