cgi sudokumatic; // -*-C-*-ish import sudoku; import CGI; Void PreContent() { content("Sudokumatic"); content("

Sudokumatic

"); } Void Default() { x = blank([1..9]); setValue(x,1,0,6); setValue(x,3,0,1); setValue(x,5,0,4); setValue(x,7,0,5); setValue(x,2,1,8); setValue(x,3,1,3); setValue(x,5,1,5); setValue(x,6,1,6); setValue(x,0,2,2); setValue(x,8,2,1); setValue(x,0,3,8); setValue(x,3,3,4); setValue(x,5,3,7); setValue(x,8,3,6); setValue(x,2,4,6); setValue(x,6,4,3); setValue(x,0,5,7); setValue(x,3,5,9); setValue(x,5,5,1); setValue(x,8,5,4); setValue(x,0,6,5); setValue(x,8,6,2); setValue(x,2,7,7); setValue(x,3,7,2); setValue(x,5,7,6); setValue(x,6,7,9); setValue(x,1,8,4); setValue(x,3,8,5); setValue(x,5,8,8); setValue(x,7,8,7); showGrid(x); } Void PostContent() { content(""); } Void showGrid(Sudoku s) { content(formHandler(OnRefine,s)); content(""); for row in [0..8] { content(""); for col in [0..8] { content(""); } content(""); } content("
"); case getValue(s,col,row) of { nothing -> text = ""; | just(val) -> text = String(val); } content(textBox(("x"+col)+row,text,3)+"
"); content(submit("One step refinement")); content(submit("Complete refinement")); content(closeForm); } Void OnRefine(Sudoku s) { // Add the values in the form try { for row in [0..8] { for col in [0..8] { varn = ("x"+row)+col; if (!equalStr(incomingValue(varn,DataPost),"")) { val = httpInt(varn); setValue(s,row,col,val); } } } onestep = submitUsed=="One step refinement"; do { mod = addSimple(s); p = mkPossibles(s); mod2 = refinePossibles(s,p); if (onestep) break; } while(mod || mod2); // content("

After "+n+" refinements:

"); showGrid(s); } catch(e) { CGI::flushAll(); content("

Invalid entry: "+exceptionMessage(e)+"

"); } }