25.12.2015, 00:02
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Вот моя тестилка: (Я еще там тестировал неповторяемость
<!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, 25.12.2015 в 17:03.
|
|
25.12.2015, 00:55
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Deff,
генерация 1 000 000 время 400s повторов нет.
|
|
25.12.2015, 01:04
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Сообщение от рони
|
генерация 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, 25.12.2015 в 22:35.
|
|
25.12.2015, 01:14
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Deff,
|
|
|
|