Skip to content

Commit e999318

Browse files
committed
Reduce needed checks
1 parent f3b38dd commit e999318

File tree

1 file changed

+45
-24
lines changed

1 file changed

+45
-24
lines changed

src/day17.rs

Lines changed: 45 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,12 @@ pub fn part1(s: &str) -> &'static str {
3030
let x = (*s.get_unchecked(i + 6) - b'0') as u64;
3131

3232
let o1 = *s.get_unchecked(i + 12);
33-
let o2 = *s.get_unchecked(i + 16);
3433
let o3 = *s.get_unchecked(i + 20);
35-
let o4 = *s.get_unchecked(i + 24);
36-
37-
let y = match (o1, o2, o3, o4) {
38-
(b'1', b'4', b'0', b'5') => *s.get_unchecked(i + 14) - b'0',
39-
(b'1', b'4', b'5', b'0') => *s.get_unchecked(i + 14) - b'0',
40-
(b'1', b'0', b'4', b'5') => *s.get_unchecked(i + 14) - b'0',
41-
(b'0', b'1', b'4', b'5') => *s.get_unchecked(i + 18) - b'0',
42-
(b'0', b'4', b'1', b'5') => *s.get_unchecked(i + 22) - b'0',
43-
(b'4', b'1', b'0', b'5') => *s.get_unchecked(i + 18) - b'0',
44-
(b'4', b'1', b'5', b'0') => *s.get_unchecked(i + 18) - b'0',
45-
(b'4', b'0', b'1', b'5') => *s.get_unchecked(i + 22) - b'0',
46-
_ => unreachable_unchecked(),
34+
35+
let y = match (o1, o3) {
36+
(b'1', _) => *s.get_unchecked(i + 14) - b'0',
37+
(_, b'1') => *s.get_unchecked(i + 22) - b'0',
38+
_ => *s.get_unchecked(i + 18) - b'0',
4739
} as u64;
4840

4941
let result_ptr = (&raw mut RESULT).cast::<u8>();
@@ -153,47 +145,45 @@ pub fn part2(s: &str) -> u64 {
153145
let x = (*s.get_unchecked(i + 6) - b'0') as usize;
154146

155147
let o1 = *s.get_unchecked(i + 12);
156-
let o2 = *s.get_unchecked(i + 16);
157148
let o3 = *s.get_unchecked(i + 20);
158-
let o4 = *s.get_unchecked(i + 24);
159149

160-
let a = match (o1, o2, o3, o4) {
161-
(b'1', b'4', b'0', b'5') => {
150+
let a = match (o1, o3) {
151+
(b'1', b'0') => {
162152
let y = (*s.get_unchecked(i + 14) - b'0') as usize;
163153
let z = (*s.get_unchecked(i + 18) - b'0') as usize;
164154
*LUT.get_unchecked(x * 512 + y * 64 + z * 8 + 0)
165155
}
166-
(b'1', b'4', b'5', b'0') => {
156+
(b'1', b'5') => {
167157
let y = (*s.get_unchecked(i + 14) - b'0') as usize;
168158
let z = (*s.get_unchecked(i + 18) - b'0') as usize;
169159
*LUT.get_unchecked(x * 512 + y * 64 + z * 8 + 1)
170160
}
171-
(b'1', b'0', b'4', b'5') => {
161+
(b'1', b'4') => {
172162
let y = (*s.get_unchecked(i + 14) - b'0') as usize;
173163
let z = (*s.get_unchecked(i + 22) - b'0') as usize;
174164
*LUT.get_unchecked(x * 512 + y * 64 + z * 8 + 2)
175165
}
176-
(b'0', b'1', b'4', b'5') => {
166+
(b'0', b'4') => {
177167
let y = (*s.get_unchecked(i + 18) - b'0') as usize;
178168
let z = (*s.get_unchecked(i + 22) - b'0') as usize;
179169
*LUT.get_unchecked(x * 512 + y * 64 + z * 8 + 3)
180170
}
181-
(b'0', b'4', b'1', b'5') => {
171+
(b'0', b'1') => {
182172
let y = (*s.get_unchecked(i + 22) - b'0') as usize;
183173
let z = (*s.get_unchecked(i + 18) - b'0') as usize;
184174
*LUT.get_unchecked(x * 512 + y * 64 + z * 8 + 4)
185175
}
186-
(b'4', b'1', b'0', b'5') => {
176+
(b'4', b'0') => {
187177
let y = (*s.get_unchecked(i + 18) - b'0') as usize;
188178
let z = (*s.get_unchecked(i + 14) - b'0') as usize;
189179
*LUT.get_unchecked(x * 512 + y * 64 + z * 8 + 5)
190180
}
191-
(b'4', b'1', b'5', b'0') => {
181+
(b'4', b'5') => {
192182
let y = (*s.get_unchecked(i + 18) - b'0') as usize;
193183
let z = (*s.get_unchecked(i + 14) - b'0') as usize;
194184
*LUT.get_unchecked(x * 512 + y * 64 + z * 8 + 6)
195185
}
196-
(b'4', b'0', b'1', b'5') => {
186+
(b'4', b'1') => {
197187
let y = (*s.get_unchecked(i + 22) - b'0') as usize;
198188
let z = (*s.get_unchecked(i + 14) - b'0') as usize;
199189
*LUT.get_unchecked(x * 512 + y * 64 + z * 8 + 7)
@@ -203,3 +193,34 @@ pub fn part2(s: &str) -> u64 {
203193
a
204194
}
205195
}
196+
197+
#[cfg(test)]
198+
mod test {
199+
use super::*;
200+
201+
#[test]
202+
fn test1() {
203+
let s = r"Register A: 45483412
204+
Register B: 0
205+
Register C: 0
206+
207+
Program: 2,4,1,3,7,5,0,3,4,1,1,5,5,5,3,0
208+
";
209+
210+
assert_eq!(part1(s), "1,5,0,5,2,0,1,3,5");
211+
assert_eq!(part2(s), 236581108670061);
212+
}
213+
214+
#[test]
215+
fn test2() {
216+
let s = r"Register A: 64751475
217+
Register B: 0
218+
Register C: 0
219+
220+
Program: 2,4,1,2,7,5,4,5,1,3,5,5,0,3,3,0
221+
";
222+
223+
assert_eq!(part1(s), "3,1,4,3,1,7,1,6,3");
224+
assert_eq!(part2(s), 37221270076916);
225+
}
226+
}

0 commit comments

Comments
 (0)