diff --git a/src/bin/07_weird_assembly_machine.rs b/src/bin/07_weird_assembly_machine.rs index f8170ac..3747551 100644 --- a/src/bin/07_weird_assembly_machine.rs +++ b/src/bin/07_weird_assembly_machine.rs @@ -1,3 +1,5 @@ +use lib::compute_async; + // https://button.qedaka.de/07_weird_assembly_machine.html?name=Jonah&n=10000000000000070&x=4410539207075887818 const DATA: &[i64] = &[ 6563504930575804778, 3177554099846544556, -3586873697942480512, 2361978668621667923, @@ -66,129 +68,49 @@ const DATA: &[i64] = &[ -6650717971996725481, 2668163399826034890, 1114227485540495868, -6400696048289486953, ]; +const N: u64 = 10000000000000070; +const X: u64 = 4410539207075887818; + fn main() { + compute_async(|tx| { + let mut n = N; + let mut x = X; + loop { + for _ in 0..1_000_000 { + n += 1; + x = func1(x as i64, n as i64) as u64; + } + + tx.send((n, x)).unwrap(); + } + }); } -/* - -(module - (export "f" (func $func0)) - (func $func0 (param $var0 i64) (param $var1 i64) (result i64) - (local $var2 i64) - i64.const 0 - loop $label0 (param i64) (result i64) - local.get $var0 - local.get $var1 - i64.ctz - local.tee $var2 - i64.rotl - i64.xor - local.get $var1 - i64.const 1 - local.get $var2 - i64.rotl - i64.xor - local.tee $var1 - i64.eqz - i32.eqz - br_if $label0 - end $label0 - ) -) - */ fn func0(a: i64, mut b: i64) -> i64 { - let mut c: i64; let mut x: i64 = 0; - loop { - c = b.trailing_zeros() as i64; - b = b ^ 1i64.rotate_left(c as u32); - x = x ^ a.rotate_left(c as u32); - - if b == 0 { - break; - } + while b != 0 { + let c = b.trailing_zeros(); + b = b ^ 1i64.rotate_left(c); + x = x ^ a.rotate_left(c); } x } -/* - (func $func1 (param $var0 i64) (param $var1 i64) (result i64) - (local $var2 i32) - i64.const 0 - loop $label0 (param i64) (result i64) - local.get $var0 - call $func0 - local.get $var2 - i64.load - i64.xor - i32.const 1016 - i32.const 8 - local.get $var2 - i32.add - local.tee $var2 - i32.and - br_if $label0 - local.tee $var0 - local.get $var1 - i64.le_u - if - i64.const 1 - local.get $var1 - i64.add - local.set $var1 - end - local.get $var0 - i32.const 2040 - local.get $var2 - i32.and - if (param i64) (result i64) - local.get $var1 - i64.sub - local.set $var0 - i64.const 0 - br $label0 - end - end $label0 - ) - */ -fn func1(mut var0: i64, mut var1: i64) -> i64 { - let mut var2: usize = 0; - - let mut x = 0; - 'label0: loop { - println!("{var0} {var1} {var2}"); - x = func0(x, var0) ^ DATA[var2]; - - var2 += 1; - if var2 & 127 != 0 { - continue 'label0; - } - - var0 = x; - - if var0 as u64 <= var1 as u64 { - var1 += 1; - } - - println!("b{var0} {var1} {var2}"); - if var2 < 256 { - var0 -= var1; - x = 0; - } else { - break; - } +fn func1(x: i64, mut n: i64) -> i64 { + let x = func2(x, &DATA[0..128]); + if x as u64 <= n as u64 { + n += 1; } - var0 + func2(x.wrapping_sub(n), &DATA[128..256]) } -/* - -(module - (memory $memory0 1 1) - (export "f" (func $func1)) - (data (i32.const 0) "j\e9~\9c\f5@\16[\ac|\f0O\9e\f0\18,\80Y\f23`\dd8\ceS\9e>\b6\15o\c7 \22\97\8dRF\c6\9e+Q\f4`\b1\df\82\9d\c3p\86\1fQ\17~\b5_\a4\88\87\a8\ffK\ec=\d8\13\a8Z\9a\8e\e7\5c\06\efz\d3\ff\cc\e98@L\12\03\c5\ea\cd\ea#\e3q$R\e3\dbh7Tg\99\95\94z$F\ab)\94\016M\89+]\8e^\1a\04v\04\e8e\f4\cb\17\c5\eb\93SS\81\e8\fe\abT\1c\97\bc`\e2\b2Z\d1\8d\a6\c2!\fa k:\e9\85\f3\e7\1b(\80X\8bL\88<\a6\aa\bb\87W;=WN<%\dfh\cdg\da5\fcs\d7\8f\8a\1e\e2\adl\f2\919Q\c6\ddE\0d\d0{\96\c1\f0\89\dc\e38\d9\97\c0\81D\8483Q\a9\c7\9c*G\8b\04o\b8\e34K\cd\ec(\83\89#S\ce\da\bb\bcn\9b\bbl\1eh\f3@\d7yp^\fc\81\fbh\17x\bb\aa\f8x?\95@I\86\a6T\9c\15qDP\e4\1a.\bb\88\d1\c2p\d9C?\ca{\17\1f\1f\e2,\a6\0fK\c4\977EH5#\a4:\d9\e5\0c\c8/c\91h\ac\13\90\5c;B\b6\8f\18\f9\c0\84g\d9\d4\d6\83\a1\e9\98\f8\f8\a9\af2\16\f14\f0\b4Z\22#+\fa\17\d0i\82\b3\df:\97\07\b2qq\8b\b9D\f8^\cb\05\18\05\c9t@h\8ap\d4\09\b5\ec\09\10}\fc\1e\e3?*\0e>I\10\22\86\d8\89\95\9f$}\d2\b4f\f5\abF\90Bu\fc\c6!\ac\89\ea\f8\c7(Q\a6\80\cfqXs1\abL\ca\ea\0c\0c\cd\c2g\fd\fbMc\9e%\ed\ac7\cb+\11>E\89\cf\bf\cbc\f9\ac6\8f\87\ce\1bwT\bfv_;\14\8dL\c2\ae\10E\f6\83T\0cn\83\d7\92\aa\ce\c9\07\c8\8e\5c_\ca\9a\8d\ae\e5P\c8\c58\a0,\ddVSZ]\c1KK\ad;\fe\f5\cf&\ba\bc\99\02\d5f\e0\07\ac\ad\e6\ca\b5\eb\0d\f3;xsD\9a\bb\e6\a6B\e91\e7\dd\12\9c\9eL\0d\8e\96\c3*0=I\f43\bf4\1c\cb\ff\dd\15\88\b8pj\97\15\a2\f8Xl\8b\05\9a\fc\ad\cc\93(\c6\7fq\db\fe\16\13\d3\8ac\16F/\09\0d'\d9\d9\f0\86l:\9e\1f\f2\ef\92\06\b5\e8\92\c7a\a2\c4\5c\e3:\0f\f1<\d6E\0aw \8e\fa[S\aa\a2\125\1a\a8\1f\bc\93\0fJ\b0\96n\ba\85\9e\ba\8b\e6K\1c2]JGT\cb\ec\0a\03>\1d%\06\18d^d\8bY\a0\a2b\f5\a8\c8\f1[\ed<\b6\c5\c0D\f1*d,j{\17OVk\00h\90a\a7p\f7\b0!Ns\c9\10\8c\c7\e3\ae\1f1\0fw\a5u\16\94\caK\088\80\989\0e|4mE%w~B\a6\dd\81\dd\9b\b9E\e1P\ceJ\8dF\9bP\94\b2}\c2\fc\ec\e3\c8\f4N\ac\fe%a\91\e4~|\e5K\b0P\7f\f2\c8\19\eb+4\ae\a9+}2Q?\cez \8b-\b5t\80\07\17\84-k?\cb\15\b8\9a\93\f8r\17\03\dbtA*0\ca\b9z\af\d3\94@\8b\88\f3\fb\06\d1\8a\88\d6\95!\0cw\08\c37[)\d1\b4\a1\a1\03\e4\f4\88\a3\8c\ec'\c9\b3\22(\0e\ce\18\f1\04\e9\c4!\e4\d3\c6+\bf\c7\a5\84\fd\af\93\b3F\b4\b9\e7\e9}\8c@'\bc\c5\81\ecQ\d02\a3\d5\cb\98\b8\ba\d8\ad\cc\14\e3\e8\cb\19\09\f1W\ca\05\be\5c\80\dc\d0\ab\c0z\b7\9d:\cax\849\da\bb\7f\d5d\1a[\fb\05\05\f5\91W*\f0\91#\97\af\c8?\c57\89\1e\83\88G_\19~\bb\c6\c1\a5\14\c4O\e7\1d\90\85(\92\8a\c4\d2\8f\ff\15\95\c1\1b\1f\05\f2\e8ehd\cb\b8f\9d\f5\8c\9b\dc\ff\00W\a7\af&\cb\f4LX\b4\c8\e6}U5J\f59\a3\99J7\c0\a2\f4|\bfp\d6\c1\c7b\12:\ccj\00\91G\d6\06(b\e2\c6\01r\cc\0d\17$\10\15\d5;v3s\cac**\8d\b1/8@h/E\02\c2T\b9k\05\b8t5\cf%\c1j\fb\dd\ce\d4f\f7\95y\cf\9a\a7\d7\f1S\e8\89>\bd}\ea%\b0\bbf \bc\aeFF\d8M=>\aa)\a6E\c0\c8\0d-\10EF\9e\ec\e6\84\04\e8\04\d0T8b\c5\a2\e4\9d\c7\bb\7f8\85\11t!\e8\1a\11\cf\a4\9cK\f1t8M\cb\e6\93A\a9\8c\e2z\5c:\a7\be\cc\93A\d5R\afy\d4\e2\a1~\e0\c9}t{-\ea\a2\d6S\0dASkL\e1|ZI`W|\b3w\138g\01\1a\d6HD\1b\15\eat8W\1f\1f\f8\96\cd\14\abPw\92\c3<\c9~\19cf\02\fd\e3\d1\a0\8bx0\f5\8c-\a8H\e02\98(\de2j\d1s*:W#\8bQvt\14\96\88(\bf>\89\aa\b6n\90Q\e1\16!\e55f\12d\17\05\04\d1\fd\09\918\0b\e1-U\d4\87k!|iH \8e\d8o\00(@4\22-!d\e5\8a\15U(X\a6\a4\1b)~C\9e\e7\98\f5o)\f6\16\a1d\ae[\fc4\b8\d9\81\1e\d5\fd\bb\11\cc\9dV@h:\be\d6\a6P\14\f2\b0B=\003\85\9d\bf\8dWx\fd7\8cm\91\ba\d2\b64\af}\86\c2\e7\c2\f1p\c9\0eDc=\b5Q\c2uZ4W~\da\b6L\ea\a0\0az'\b9\ae\87l\f4\da\1c\c0\e4#Xr\bdgKurV,\9e\1d)e0\ae6\aa\bf\ff\ea\08\12\f9\bb\cf\f2\f7\86\1d\a8\82\d7\a0\d2\a1\bbyZ\e5\a8\05o.\98\d8\d1m\be\ce\00\a8!}\ccT\cb\19\0e\a6I\e8\c4\00$\c6\91n.\04a\d3\fe\c4\ae|\17>\96K1\12\fb^%\d9\b0(\fc\e5\09b\a5U\92;sl\b7X\a2\abf\02n\fbG_\06\cf\ee\84O\be\f6\c3Q\1d\8fc\8d[\9c\af\05\0d#q\80\ec\87\07Y\c7\10\cd]sS\a1\f49\225\b1\a8!\0f:Q\9f\82\b1P\8cE\864\82\972dt\9e\90B\a0\bbi(!\cdN\a2Ti\84k\e3c\b1\f7\c1g(\5c\b2\1a0\9dRO\1f\15\a6\e9\bc\13\95\ab\b7)\a4\a6\a1\cd\f5l\d8x\7f9\a3\86\08\9d~\bd57\15F\83\af\f8g\5c\18\06\f5\b7a\1cY-\84\f8!=]H\a9\f9\bd\e0\e3$\a1\0eZM\a4w\b7/E\ddi1\03\f1r\9c\ddCR\ce\df\d0\aaYOK\fd\baO\99\a7\05b\22\a3\1dn\00A\de\f1\f3\a6\adp\ef\fa\d3\d2K;\09d\80\d5\96[M\d6\b9}2[\d45\0a\91D\dd\07e\d4a*$\e4H\87\f1\0d\e2\d4\e5\8d\c9W\a8\c3\e1yI\99p\ff\ad\a1\e8\b8\999v\e6\c0\dc\a6\af\f2\b6\1a\d7_\07\17/\d4\d1=\e7\b3\a3\caPT\c1y8\07%\fc1\9e\a2\fe\87v\0f\97gu>\db(,\a7") -) - */ +fn func2(x: i64, data: &[i64]) -> i64 { + let mut out = 0; + for i in 0..data.len() { + out = func0(out, x) ^ data[i]; + } + out +} #[cfg(test)] mod tests {