From dbf65fecbaa86335d4beb44c87ad2638e8a2f80d Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Thu, 29 Oct 2026 14:03:28 +0100 Subject: Fixing lights_out --- c++/.nix/derivation.nix | 4 ++-- c++/lights_out.cpp | 48 +++++++++++++++++++++++++++++++++++------------- 2 files changed, 37 insertions(+), 15 deletions(-) (limited to 'c++') diff --git a/c++/.nix/derivation.nix b/c++/.nix/derivation.nix index a47b023..e3f712d 100644 --- a/c++/.nix/derivation.nix +++ b/c++/.nix/derivation.nix @@ -15,8 +15,8 @@ stdenv.mkDerivation { EM_CACHE=$TMPDIR/emscripten_cache emcc lights_out.cpp \ -s WASM=1 \ - -s EXPORTED_FUNCTIONS='["_fake_main"]' \ - -s EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]' \ + -s EXPORTED_FUNCTIONS='["_solve_lights_out_dispatch","_malloc","_free"]' \ + -s EXPORTED_RUNTIME_METHODS='["ccall","cwrap","HEAPU8"]' \ -o lights_out.js ''; diff --git a/c++/lights_out.cpp b/c++/lights_out.cpp index 7dc8dc1..b35c4ee 100644 --- a/c++/lights_out.cpp +++ b/c++/lights_out.cpp @@ -155,20 +155,42 @@ int solve_lights_out(const Vec& b, Vec& x){ return 0; } -extern "C"{ -int solve_lights_out_dispatch(int8_t* b, int m, int n){ - if ( m == 3 and n == 3){ - Vec<3,3> b_raw; - Vec<3,3> x; - - auto rc = solve_lights_out<3,3>(b_raw,x); - if(rc == 0) { - for(point<3,3> i{}; i.x < 3 && i.y < 3; i.inc()){ - auto is = i.stride(); - b[is] = x[is]; - } +template +int solve_lights_out_interconnect(int8_t* b_raw){ + Vec b; + + for(point i{}; i.x < M && i.y < N; i.inc()){ + auto is = i.stride(); + b[is] = b_raw[is]; + } + + Vec x; + + auto rc = solve_lights_out(b,x); + if(rc == 0) { + for(point i{}; i.x < M && i.y < N; i.inc()){ + auto is = i.stride(); + b_raw[is] = x[is]; } - return rc; + } + return rc; +} + +extern "C"{ +int solve_lights_out_dispatch(int8_t* b_raw, int m, int n){ + + if ( m == 1 and n == 1){ + return solve_lights_out_interconnect<1,1>(b_raw); + }else if( m == 2 and n == 2){ + return solve_lights_out_interconnect<2,2>(b_raw); + }else if( m == 3 and n == 3){ + return solve_lights_out_interconnect<3,3>(b_raw); + }else if( m == 6 and n == 6){ + return solve_lights_out_interconnect<6,6>(b_raw); + }else if( m == 7 and n == 7){ + return solve_lights_out_interconnect<7,7>(b_raw); + }else if( m == 8 and n == 8){ + return solve_lights_out_interconnect<8,8>(b_raw); } return -2; } -- cgit v1.3.1