local Y=require("yaru.core") local gfx=require("yaru.gfx") local ui=require("yaru.ui") local computer=require("computer") local M={} local LEVELS={{"Easy",36},{"Medium",46},{"Hard",53}} local function solve(g,i) i=i or 1 while i<=81 and g[i]~=0 do i=i+1 end if i>81 then return true end local r,c=(i-1)//9,(i-1)%9 local used={} for k=0,8 do used[g[r*9+k+1]]=true used[g[k*9+c+1]]=true used[g[((r//3)*3+k//3)*9+(c//3)*3+k%3+1]]=true end local digits={1,2,3,4,5,6,7,8,9} for k=9,2,-1 do local j=math.random(k)digits[k],digits[j]=digits[j],digits[k]end for _,d in ipairs(digits)do if not used[d]then g[i]=d if solve(g,i+1)then return true end end end g[i]=0 return false end function M.open() local st={sel=41} local win=Y.newWindow{app="sudoku",title="Sudoku",w=62,h=33,fixed=true} local function new(li) st.level=li or st.level or 1 local sol={} for i=1,81 do sol[i]=0 end solve(sol) st.sol,st.g,st.given=sol,{},{} for i=1,81 do st.g[i]=sol[i]end local removed=0 while removed9 and st.sel-9 or st.sel elseif code==K.down then st.sel=st.sel<=72 and st.sel+9 or st.sel elseif code==K.del or code==K.back or char==48 then set(0) elseif char and char>=49 and char<=57 then set(char-48)end end new(1) return win end return M