heh
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 170 |
1 files changed, 26 insertions, 144 deletions
diff --git a/src/main.rs b/src/main.rs index 39f14a3..74ca80c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -37,154 +37,36 @@ use atools::CollectArray; use std::cmp::Reverse; pub use util::prelude::*; -const SIZE: usize = 141; - -fn exec(program: &[u8], [mut a, mut b, mut c]: [u128; 3]) -> Vec<u8> { - let mut pointer = 0; - let mut out = vec![]; - while let Some(opcode) = program.get(pointer) { - let operand = program[pointer + 1]; - let combo = || match operand { - 0..=3 => operand as u128, - 4 => a, - 5 => b, - 6 => c, - _ => panic!(), - }; - match opcode { - 0 => { - a = a / (2u128.pow(combo() as u32)); - pointer += 2; - } - 1 => { - b ^= operand as u128; - pointer += 2; - } - 2 => { - b = combo() & 7; - pointer += 2; - } - 3 => { - if a == 0 { - pointer += 2; - } else { - pointer = operand.into(); - } - } - 4 => { - b ^= c; - pointer += 2; - } - 5 => { - out.push((combo() & 7) as u8); - pointer += 2; - } - 6 => { - b = a / (1 << combo() as u32); - pointer += 2; - } - 7 => { - c = a / (1 << combo() as u32); - pointer += 2; - } - _ => unreachable!(), +const WIDTH: usize = 70; +pub unsafe fn run(x: &str) -> impl Display { + let mut grid = [[0; WIDTH + 1]; WIDTH + 1]; + let mut add = x.行().map(|x| { + let (x, y) = x.μ(',').mb(|x| x.λ::<u8>()); + (x, y) + }); + loop { + let x = add.next().unwrap(); + grid[x.1.nat()][x.0.nat()] = 1; + if util::dijkstra( + |x: (usize, usize)| { + [Dir::N + x, Dir::E + x, Dir::S + x, Dir::W + x] + .into_iter() + .filter(|&(x, y)| grid.get(y).and_then(|y| y.get(x)) == Some(&0)) + .map(|x| (x, 1)) + }, + (0, 0), + |x| x == (WIDTH, WIDTH), + ) + .is_none() + { + return format!("{x:?}"); } - // println!("{a} {b} {c}"); } - out -} -#[no_mangle] -pub unsafe fn run(i: &str) -> impl Display { - let i = i.as_bytes(); - let mut i = i.行(); - let regi = i - .by_ref() - .take_while(|x| !x.is_empty()) - .map(|x| x.μ1(':').trim_ascii_start().λ::<u128>()) - .carr(); - let program = i - .nth(1) - .ψ() - .μ1(':') - .trim_ascii_start() - .split(|x| *x == b',') - .map(|x| x.λ::<u8>()) - .collect_vec(); - exec(&program, regi).into_iter().join(",") + // 0 } - fn main() { - let i = include_str!("inp.txt"); - let mut i = i.行(); - let regi: [u128; 3] = i - .by_ref() - .take_while(|x| !x.is_empty()) - .map(|x| x.μ1(':').trim_ascii_start().λ::<u128>()) - .carr(); - let program = i - .nth(1) - .ψ() - .μ1(':') - .trim_ascii_start() - .split(|x| *x == b',') - .map(|x| x.λ::<u8>()) - .collect_vec(); - println!( - r#" -from z3 import * -solver = Optimize() -s = BitVec("s", 64) -a = s -b, c = (0, 0)"# - ); - println!("for x in {program:?}:"); - for &[opcode, operand] in program.array_chunks::<2>() { - let combo = || match operand { - 0..=3 => format!("{operand}"), - 4 => "a".to_string(), - 5 => "b".to_string(), - 6 => "c".to_string(), - _ => panic!(), - }; - match opcode { - 0 => println!(" a >>= {}", combo()), - 1 => println!(" b ^= {operand}"), - 2 => println!(" b = {} & 7", combo()), - 3 => {} // println!(" a == 0 ? {operand}"), - 4 => println!(" b ^= c"), - 5 => println!(" solver.add({} % 8 == x)", combo()), - 6 => println!(" b = a >> {}", combo()), - 7 => println!(" c = a >> {}", combo()), - _ => unreachable!(), - } - } - println!( - r#" -solver.add(a == 0) -solver.minimize(s) -assert str(solver.check()) == "sat" -print(solver.model().eval(s))"# - ); - assert_eq!( - exec(&[0, 1, 5, 4, 3, 0], [729, 0, 0]), - [4, 6, 3, 5, 6, 3, 5, 2, 1, 0] - ); - assert_eq!(exec(&[5, 0, 5, 1, 5, 4], [10, 0, 0]), [0, 1, 2]); - assert_eq!( - exec(&[0, 1, 5, 4, 3, 0], [2024, 0, 0],), - [4, 2, 5, 6, 7, 7, 7, 7, 3, 1, 0] - ); + let s = include_str!("inp.txt"); + println!("{}", unsafe { run(s) }); // dbg!(exec(&program, regi)); } - -#[bench] -fn bench(b: &mut test::Bencher) { - let i = boxd(include_str!("inp.txt")); - b.iter(|| unsafe { - exec( - boxd(&[2, 4, 1, 7, 7, 5, 0, 3, 1, 7, 4, 1, 5, 5, 3, 0]), - [64012472, 0, 0], - ) - }); -} |