File tree Expand file tree Collapse file tree 1 file changed +17
-10
lines changed
Expand file tree Collapse file tree 1 file changed +17
-10
lines changed Original file line number Diff line number Diff line change @@ -96,40 +96,47 @@ fn search_part2(target: u64, v: &[u64]) -> bool {
9696
9797#[ aoc( day7, part2) ]
9898pub fn part2 ( s : & str ) -> u64 {
99+ unsafe { part2_inner ( s) }
100+ }
101+
102+ unsafe fn part2_inner ( s : & str ) -> u64 {
99103 let s = s. as_bytes ( ) ;
100104
101105 let mut sum = 0 ;
102106
103107 let mut i = 0 ;
104- let mut v = Vec :: new ( ) ;
108+ let mut v = [ 0 ; 15 ] ;
109+ let mut v_len = 0 ;
110+
105111 while i < s. len ( ) {
106112 let mut target: u64 = 0 ;
107- while s [ i ] != b':' {
113+ while * s . get_unchecked ( i ) != b':' {
108114 target *= 10 ;
109- target += ( s [ i ] - b'0' ) as u64 ;
115+ target += ( * s . get_unchecked ( i ) - b'0' ) as u64 ;
110116 i += 1 ;
111117 }
112118 i += 2 ;
113119
114120 let mut num = 0 ;
115- while s [ i ] != b'\n' {
121+ while * s . get_unchecked ( i ) != b'\n' {
116122 num *= 10 ;
117- num += ( s [ i ] - b'0' ) as u64 ;
123+ num += ( * s . get_unchecked ( i ) - b'0' ) as u64 ;
118124 i += 1 ;
119- if !s[ i] . is_ascii_digit ( ) {
120- v. push ( num) ;
125+ if !s. get_unchecked ( i) . is_ascii_digit ( ) {
126+ * v. get_unchecked_mut ( v_len) = num;
127+ v_len += 1 ;
121128 num = 0 ;
122129 i += 1 ;
123- if s [ i - 1 ] == b'\n' {
130+ if * s . get_unchecked ( i - 1 ) == b'\n' {
124131 break ;
125132 }
126133 }
127134 }
128135
129- if search_part2 ( target, & v) {
136+ if search_part2 ( target, & v[ ..v_len ] ) {
130137 sum += target;
131138 }
132- v . clear ( ) ;
139+ v_len = 0 ;
133140 }
134141
135142 sum
You can’t perform that action at this time.
0 commit comments