cgi sudokumatic; // -*-C-*-ish import sudoku; import CGI; Void PreContent() { content("<html><head><title>Sudokumatic</title></head>"); content("<body><h1>Sudokumatic</h1>"); } 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("</body>"); } Void showGrid(Sudoku<Int> s) { content(formHandler(OnRefine,s)); content("<table>"); for row in [0..8] { content("<tr>"); for col in [0..8] { content("<td>"); case getValue(s,col,row) of { nothing -> text = ""; | just(val) -> text = String(val); } content(textBox(("x"+col)+row,text,3)+"</td>"); } content("</tr>"); } content("</table>"); content(submit("One step refinement")); content(submit("Complete refinement")); content(closeForm); } Void OnRefine(Sudoku<Int> 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("<p>After "+n+" refinements:</p>"); showGrid(s); } catch(e) { CGI::flushAll(); content("<p>Invalid entry: "+exceptionMessage(e)+"</p>"); } }