Вот моя тестилка: (Я еще там тестировал неповторяемость
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta name="robots" content="noindex"> <title> Sudoku </title> <script src='http://code.jquery.com/jquery-1.11.0.js'></script> <style> #out td{ width:34px; height:34px; text-align:center; vaertical-align: middle; } #out, #out tr, #out td{ padding: 0px; margin: 0px; border:none 0; border-collapse:collapse; } #out td{ border: rgba(0,0,0,.2) solid 1px; color: rgba(0,0,204,.611) } #out td:nth-child(3n+1) { border-left: rgba(0,0,0,.2) solid 3px; } #out tr:nth-child(3n) { border-bottom: rgba(0,0,0,.2) solid 3px; } #out{ table-layout:fixed; border-top: rgba(0,0,0,.2) solid 3px; border-right: rgba(0,0,0,.2) solid 3px; } </style> </head> <body> <div id=wrap><table id=out><tbody> <tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> </tbody></table></div> <p></p> <p></p> <input type="button" value="Запустить!" onclick="getSudoku ()"> <p id=ut></p> <script> function indexRandom(lng){ var a = {},i,out=[],n=0; while (n!=lng){ i = Math.floor(lng*Math.random()); if(typeof(a[i])=='undefined'){ a[i]=i; out.push(i); n++; } } return out; } //Cдвиг группы из N строк на n-ячеек влево; function shiftLinetoN(Nstart,N,n,arr){ var j,x; for(j=Nstart;j<Nstart+N;j++){ for(x=0;x<n;x++)arr[j].unshift(arr[j].pop()); } } //Поворот матрицы на 90°; function rotateMatrix90 (arr){ var RotArr = [],j,i; for(j=0;j<9;j++){ for(i=0;i<9;i++){ if(j==0) RotArr[i]=[]; RotArr[i][8-j]=arr[j][i]; }; }; return RotArr; } //Рандомная перестановка в группе(триаде) из трёх строк; function swap3nLines (Nstart,arr){ var i,del,index = indexRandom(3); del = arr.slice(Nstart,Nstart+3); for(i=0;i<3;i++) arr[Nstart+index[i]]=del[i]; } //Рандомная перестановка триад меж собой function triadsSwap (arr){ var i,out=[],ind = indexRandom(3); for(i=0;i<9;i++) out[ind[parseInt(i/3)]*3 + i%3] = arr[i]; return out; } var obj={}; obj.a = 0; obj.b = +new Date(); var busy = false; getSudoku = function () {++obj.a; $('#ut').html(obj.a); //if(busy) return; busy = true; var i,j,ind, arr = []; //Таблица; //Рандом-Перестановка элементов первой строки; var ind = indexRandom(9);for(i=0;i<9;i++){ if(!i){arr[0]=[];} arr[0][i]=ind[i]+1; }; arr[1] = arr[0].slice(0); shiftLinetoN(1,1,3,arr); arr[2] = arr[1].slice(0); shiftLinetoN(2,1,3,arr); //Cоздаём остальные cтроки таблицы; for(j=3;j<9;j++){ arr[j]=arr[j%3].slice(0); if(j%3==2) shiftLinetoN(j-2,3,parseInt(j/3),arr); } //Рандом-Перестановка строк в триадах строк; //arr = swap3nLines(arr); for(j=3;j<9;j++){ arr[j]=arr[j%3].slice(0); if(j%3==2) shiftLinetoN(j-2,3,parseInt(j/3),arr); } //Рандомная перестановка триад меж собой arr = triadsSwap (arr) //Поворот матрицы на 90° arr = rotateMatrix90 (arr); //Рандомная перестановка триад меж собой(бывшие тройки столбцов) arr = triadsSwap (arr) //Рандомный поворот матрицы: 0/90° if(indexRandom(2)[1])arr = rotateMatrix90 (arr); var b=JSON.stringify(arr); if(typeof obj[b]=='undefined')obj[b]=1; else obj[b]++ /* //Записываем в таблу $('#out td').each(function (j){ $(this).html(arr[parseInt(j/9)][j%9]); }); busy = false; */ if(obj.a==10000){clearTimeout(TimId);alert((+new Date-obj.b)/1000); alert(JSON.stringify(obj).replace(/"\[\[.*?\]\]":/gim,'a:'));} else {TimId = setTimeout(getSudoku,0);} } </script> </body> </html> |
Deff,
генерация 1 000 000 время 400s повторов нет. |
Цитата:
И тогда массовое появление 2, 3 - максимум 4 На 1000 000 обычно не более 10 000 (при такой фиче) А так не более 2000; Неповторяемости мон добиться если ток программировать неповторяющиеся псевдослучайные последовательности ===================================== Вообщем Вариант более менее: Есть Возможность с его помощью получить все возможные Варианты... Слегка увеличилась повторяемость (но это свойство дополнительные рандомы дают возможность трансформации таблы в когда то бывшую в списке. Но зато алгоритм обнаружения начальной идеи создания снижается... И да, полуинтуитивно нашёл приблизительный алгоритм решения таблички по массиву заданных цифр, их должно более 16 для однозначного решения Для начала нужны девять масок с "прорезями" которые устанавливаются для каждого элемента первого нижнего квадрата, и остальные "отверстия" для возможного положения этой цифры в сдвинутой строке в остальных таблах 3х3 Но пока устал от табличек... Займусь тем, от чего лынил... АPI ========== C Наступающим! ![]() <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta name="robots" content="noindex"> <title> Sudoku </title> <script src='http://code.jquery.com/jquery-1.11.0.js'></script> <style> #out td{ width:34px; height:34px; text-align:center; vaertical-align: middle; } #out, #out tr, #out td{ padding: 0px; margin: 0px; border:none 0; border-collapse:collapse; } #out td{ border: rgba(0,0,0,.2) solid 1px; color: rgba(0,0,204,.611) } #out td:nth-child(3n+1) { border-left: rgba(0,0,0,.2) solid 3px; } #out tr:nth-child(3n) { border-bottom: rgba(0,0,0,.2) solid 3px; } #out{ table-layout:fixed; border-top: rgba(0,0,0,.2) solid 3px; border-right: rgba(0,0,0,.2) solid 3px; } </style> </head> <body> <div id=wrap><table id=out><tbody> <tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr> </tbody></table></div> <p></p> <p></p> <input type="button" value="Запустить!" onclick="getSudoku ();"> <p id=ut></p> <script> function indexRandom(lng){ var a = {},i,out=[],n=0; while (n!=lng){ i = Math.floor(lng*Math.random()); if(typeof(a[i])=='undefined'){ a[i]=i; out.push(i); n++; } } return out; } //Cдвиг группы из N строк на n-ячеек влево; function shiftLinetoN(Nstart,N,n,arr){ var j,x; for(j=Nstart;j<Nstart+N;j++){ for(x=0;x<n;x++)arr[j].unshift(arr[j].pop()); } } //Поворот матрицы на 90°; function rotateMatrix90 (arr){ var RotArr = [],j,i; for(j=0;j<9;j++){ for(i=0;i<9;i++){ if(j==0) RotArr[i]=[]; RotArr[i][8-j]=arr[j][i]; }; }; return RotArr; } //Рандомная перестановка в группе(триаде) из трёх строк; function swap3nLines (Nstart,arr){ var i,del,index = indexRandom(3); del = arr.slice(Nstart,Nstart+3); for(i=0;i<3;i++) arr[Nstart+index[i]]=del[i]; } //Рандомная перестановка триад меж собой function triadsSwap (arr){ var i,out=[],ind = indexRandom(3); for(i=0;i<9;i++) out[ind[parseInt(i/3)]*3 + i%3] = arr[i]; return out; } var busy = false; getSudoku = function () { if(busy) return; busy = true; var i,j,ind, arr = []; //Таблица; //Рандом-Перестановка элементов первой строки; var ind = indexRandom(9);for(i=0;i<9;i++){ if(!i){arr[0]=[];} arr[0][i]=ind[i]+1; }; arr[1] = arr[0].slice(0); shiftLinetoN(1,1,3,arr);//2-я строка arr[2] = arr[1].slice(0); shiftLinetoN(2,1,3,arr);//3-я строка //Cоздаём остальные cтроки таблицы; for(j=3;j<9;j++){ arr[j]=arr[j%3].slice(0); if(j%3==2) shiftLinetoN(j-2,3,parseInt(j/3),arr); } //Рандом-Перестановка строк в триадах строк; for(j=3;j<9;j++){ arr[j]=arr[j%3].slice(0); if(j%3==2) shiftLinetoN(j-2,3,parseInt(j/3),arr); } //Рандомная перестановка триад меж собой arr = triadsSwap (arr) //Поворот и рандомная перестановка триад бывших столбцов arr = rotateMatrix90 (arr); arr = triadsSwap (arr) //Рандомный поворот матрицы: 0/90° if(indexRandom(2)[1])arr = rotateMatrix90 (arr); //Записываем в таблу $('#out td').each(function (j){ $(this).html(arr[parseInt(j/9)][j%9]); }); busy = false; } </script> </body> </html> |
Deff,
:dance: :thanks: |
Часовой пояс GMT +3, время: 07:15. |