for (var y=0; y<9; y++) {
for (var x=0; x<9; x++) {
mat[y].push([1,2,3,4,5,6,7,8,9])
createCanvas(windowWidth, windowHeight);
ox = windowWidth/2 - cw*4.5;
oy = windowHeight/2 - ch*4.5;
mx = floor((mouseX-ox)/cw)
my = floor((mouseY-oy)/ch)
for (var y=0; y<9; y++) {
for (var x=0; x<9; x++) {
if (selx == x && sely == y) fill(200);
rect(cx, cy, cx+cw, cy+ch);
text(formatCellText(x,y), cx+cw/2, cy+ch*0.3);
for (var y=0; y<3; y++) {
for (var x=0; x<3; x++) {
rect(sx, sy, sx+3*cw, sy+3*ch);
if (keyCode >= 49 && keyCode <= 57) {
} else if (keyCode == 37) {
} else if (keyCode == 38) {
} else if (keyCode == 39) {
} else if (keyCode == 40) {
} else if (keyCode == 32) {
function formatCellText(x,y) {
for (var y=0; y<9; y++) {
var possibles = [[],[],[],[],[],[],[],[],[]];
for (var x=0; x<9; x++) {
for (var n of mat[y][x]) possibles[n-1].push(x);
for (var k=0; k<9; k++) {
if (arr.length == 1) updateCell(arr[0],y,k+1);
function checkColumns() {
for (var x=0; x<9; x++) {
var possibles = [[],[],[],[],[],[],[],[],[]];
for (var y=0; y<9; y++) {
for (var n of mat[y][x]) possibles[n-1].push(y);
for (var k=0; k<9; k++) {
if (arr.length == 1) updateCell(x,arr[0],k+1);
function checkSquares() {
function checkSquare(sx, sy) {
var possibles = [[],[],[],[],[],[],[],[],[]];
var y = sy + Math.floor(i/3);
for (var n of mat[y][x]) possibles[n-1].push(i);
for (var k=0; k<9; k++) {
var y = sy + Math.floor(i/3);
function removeNumberFromColumn(n,x) {
removeNumberFromCell(x,y,n);
function removeNumberFromRow(n,y) {
removeNumberFromCell(x,y,n);
function removeNumberFromSquare(sx,sy,n) {
for (var x=0; x<3; x++) {
for (var y=0; y<3; y++) {
removeNumberFromCell(sx+x, sy+y, n);
function removeNumberFromCell(x, y, n) {
if (arr.length == 1) return;
if (index != -1) arr.splice(index,1);
if (arr.length == 1) updateCell(x,y,arr[0])
function updateCell(x,y,n) {
removeNumberFromColumn(n,x);
removeNumberFromRow(n,y);
removeNumberFromSquare(sx,sy,n);