Skip to content

Commit 080eeb1

Browse files
committed
Make everything unsafe
1 parent 203d10a commit 080eeb1

File tree

1 file changed

+60
-62
lines changed

1 file changed

+60
-62
lines changed

src/day17.rs

Lines changed: 60 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use core::str;
2+
use std::hint::unreachable_unchecked;
23

34
use aoc_runner_derive::aoc;
45

@@ -13,43 +14,39 @@ use aoc_runner_derive::aoc;
1314

1415
#[aoc(day17, part1)]
1516
pub fn part1(s: &str) -> &'static str {
16-
#[expect(unused_unsafe)]
17-
unsafe {
18-
inner_part1(s.as_bytes())
19-
}
17+
unsafe { inner_part1(s.as_bytes()) }
2018
}
2119

2220
static mut RESULT: [u8; 128] = [0; 128];
2321

24-
// #[target_feature(enable = "avx2,bmi1,bmi2,cmpxchg16b,lzcnt,movbe,popcnt")]
25-
fn inner_part1(s: &[u8]) -> &'static str {
22+
#[target_feature(enable = "avx2,bmi1,bmi2,cmpxchg16b,lzcnt,movbe,popcnt")]
23+
unsafe fn inner_part1(s: &[u8]) -> &'static str {
2624
let mut i = 13;
27-
let mut a = (s[12] - b'0') as u64;
28-
while s[i] != b'\n' {
25+
let mut a = (*s.get_unchecked(12) - b'0') as u64;
26+
while *s.get_unchecked(i) != b'\n' {
2927
a *= 10;
30-
a += (s[i] - b'0') as u64;
28+
a += (*s.get_unchecked(i) - b'0') as u64;
3129
i += 1;
3230
}
31+
i += 39;
3332

34-
let i = memchr::memchr(b',', s).unwrap() - 1;
35-
36-
let x = (s[i + 6] - b'0') as u64;
33+
let x = (*s.get_unchecked(i + 6) - b'0') as u64;
3734

38-
let o1 = s[i + 12];
39-
let o2 = s[i + 16];
40-
let o3 = s[i + 20];
41-
let o4 = s[i + 24];
35+
let o1 = *s.get_unchecked(i + 12);
36+
let o2 = *s.get_unchecked(i + 16);
37+
let o3 = *s.get_unchecked(i + 20);
38+
let o4 = *s.get_unchecked(i + 24);
4239

4340
let y = match (o1, o2, o3, o4) {
44-
(b'1', b'4', b'0', b'5') => s[i + 14] - b'0',
45-
(b'1', b'4', b'5', b'0') => s[i + 14] - b'0',
46-
(b'1', b'0', b'4', b'5') => s[i + 14] - b'0',
47-
(b'0', b'1', b'4', b'5') => s[i + 18] - b'0',
48-
(b'4', b'1', b'0', b'5') => s[i + 18] - b'0',
49-
(b'4', b'1', b'5', b'0') => s[i + 18] - b'0',
50-
(b'0', b'4', b'1', b'5') => s[i + 22] - b'0',
51-
(b'4', b'0', b'1', b'5') => s[i + 22] - b'0',
52-
_ => unreachable!(),
41+
(b'1', b'4', b'0', b'5') => *s.get_unchecked(i + 14) - b'0',
42+
(b'1', b'4', b'5', b'0') => *s.get_unchecked(i + 14) - b'0',
43+
(b'1', b'0', b'4', b'5') => *s.get_unchecked(i + 14) - b'0',
44+
(b'0', b'1', b'4', b'5') => *s.get_unchecked(i + 18) - b'0',
45+
(b'0', b'4', b'1', b'5') => *s.get_unchecked(i + 22) - b'0',
46+
(b'4', b'1', b'0', b'5') => *s.get_unchecked(i + 18) - b'0',
47+
(b'4', b'1', b'5', b'0') => *s.get_unchecked(i + 18) - b'0',
48+
(b'4', b'0', b'1', b'5') => *s.get_unchecked(i + 22) - b'0',
49+
_ => unreachable_unchecked(),
5350
} as u64;
5451

5552
let result_ptr = (&raw mut RESULT).cast::<u8>();
@@ -148,65 +145,66 @@ static LUT: [u64; 8 * 8 * 8 * 8] = const {
148145

149146
#[aoc(day17, part2)]
150147
pub fn part2(s: &str) -> u64 {
151-
#[expect(unused_unsafe)]
152-
unsafe {
153-
inner_part2(s.as_bytes())
154-
}
148+
unsafe { inner_part2(s.as_bytes()) }
155149
}
156150

157-
// #[target_feature(enable = "avx2,bmi1,bmi2,cmpxchg16b,lzcnt,movbe,popcnt")]
158-
fn inner_part2(s: &[u8]) -> u64 {
159-
let i = memchr::memchr(b',', s).unwrap() - 1;
151+
#[target_feature(enable = "avx2,bmi1,bmi2,cmpxchg16b,lzcnt,movbe,popcnt")]
152+
unsafe fn inner_part2(s: &[u8]) -> u64 {
153+
let mut i = 13;
154+
while *s.get_unchecked(i) != b'\n' {
155+
i += 1;
156+
}
157+
i += 39;
160158

161-
let x = (s[i + 6] - b'0') as usize;
159+
let x = (*s.get_unchecked(i + 6) - b'0') as usize;
162160

163-
let o1 = s[i + 12];
164-
let o2 = s[i + 16];
165-
let o3 = s[i + 20];
166-
let o4 = s[i + 24];
161+
let o1 = *s.get_unchecked(i + 12);
162+
let o2 = *s.get_unchecked(i + 16);
163+
let o3 = *s.get_unchecked(i + 20);
164+
let o4 = *s.get_unchecked(i + 24);
167165

168166
let a = match (o1, o2, o3, o4) {
169167
(b'1', b'4', b'0', b'5') => {
170-
let y = (s[i + 14] - b'0') as usize;
171-
let z = (s[i + 18] - b'0') as usize;
172-
LUT[x * 512 + y * 64 + z * 8 + 0]
168+
let y = (*s.get_unchecked(i + 14) - b'0') as usize;
169+
let z = (*s.get_unchecked(i + 18) - b'0') as usize;
170+
*LUT.get_unchecked(x * 512 + y * 64 + z * 8 + 0)
173171
}
174172
(b'1', b'4', b'5', b'0') => {
175-
let y = (s[i + 14] - b'0') as usize;
176-
let z = (s[i + 18] - b'0') as usize;
177-
LUT[x * 512 + y * 64 + z * 8 + 1]
173+
let y = (*s.get_unchecked(i + 14) - b'0') as usize;
174+
let z = (*s.get_unchecked(i + 18) - b'0') as usize;
175+
*LUT.get_unchecked(x * 512 + y * 64 + z * 8 + 1)
178176
}
179177
(b'1', b'0', b'4', b'5') => {
180-
let y = (s[i + 14] - b'0') as usize;
181-
let z = (s[i + 22] - b'0') as usize;
182-
LUT[x * 512 + y * 64 + z * 8 + 2]
178+
let y = (*s.get_unchecked(i + 14) - b'0') as usize;
179+
let z = (*s.get_unchecked(i + 22) - b'0') as usize;
180+
*LUT.get_unchecked(x * 512 + y * 64 + z * 8 + 2)
183181
}
184182
(b'0', b'1', b'4', b'5') => {
185-
let y = (s[i + 18] - b'0') as usize;
186-
let z = (s[i + 22] - b'0') as usize;
187-
LUT[x * 512 + y * 64 + z * 8 + 3]
183+
let y = (*s.get_unchecked(i + 18) - b'0') as usize;
184+
let z = (*s.get_unchecked(i + 22) - b'0') as usize;
185+
*LUT.get_unchecked(x * 512 + y * 64 + z * 8 + 3)
188186
}
189187
(b'0', b'4', b'1', b'5') => {
190-
let y = (s[i + 22] - b'0') as usize;
191-
let z = (s[i + 18] - b'0') as usize;
192-
LUT[x * 512 + y * 64 + z * 8 + 4]
188+
let y = (*s.get_unchecked(i + 22) - b'0') as usize;
189+
let z = (*s.get_unchecked(i + 18) - b'0') as usize;
190+
*LUT.get_unchecked(x * 512 + y * 64 + z * 8 + 4)
193191
}
194192
(b'4', b'1', b'0', b'5') => {
195-
let y = (s[i + 18] - b'0') as usize;
196-
let z = (s[i + 14] - b'0') as usize;
197-
LUT[x * 512 + y * 64 + z * 8 + 5]
193+
let y = (*s.get_unchecked(i + 18) - b'0') as usize;
194+
let z = (*s.get_unchecked(i + 14) - b'0') as usize;
195+
*LUT.get_unchecked(x * 512 + y * 64 + z * 8 + 5)
198196
}
199197
(b'4', b'1', b'5', b'0') => {
200-
let y = (s[i + 18] - b'0') as usize;
201-
let z = (s[i + 14] - b'0') as usize;
202-
LUT[x * 512 + y * 64 + z * 8 + 6]
198+
let y = (*s.get_unchecked(i + 18) - b'0') as usize;
199+
let z = (*s.get_unchecked(i + 14) - b'0') as usize;
200+
*LUT.get_unchecked(x * 512 + y * 64 + z * 8 + 6)
203201
}
204202
(b'4', b'0', b'1', b'5') => {
205-
let y = (s[i + 22] - b'0') as usize;
206-
let z = (s[i + 14] - b'0') as usize;
207-
LUT[x * 512 + y * 64 + z * 8 + 7]
203+
let y = (*s.get_unchecked(i + 22) - b'0') as usize;
204+
let z = (*s.get_unchecked(i + 14) - b'0') as usize;
205+
*LUT.get_unchecked(x * 512 + y * 64 + z * 8 + 7)
208206
}
209-
_ => unreachable!(),
207+
_ => unreachable_unchecked(),
210208
};
211209
a
212210
}

0 commit comments

Comments
 (0)