- 论坛徽章:
- 7
|
回复 11# 523066680
Dancing Links tingshuo nashi zuikuaide.
Taifuzale xuebuhui ~~
Faxian rosetta you caiyong dancing links suanfa de javascript.
Yushi zuole 1 ge jiandan de xiaoceshi,
ceshile sudo9.
rosetta: javascript de bufen xiugai
- // [ SOME STRING ].forEach(reduceGrid);
-
- // Or of you want to create all the grids of a particular n-size.
- // I run out of stack space at n = 9
- //let n = 2;
- //let s = new Array(Math.pow(n, 4)).fill('.').join('');
- //reduceGrid(s);
- const sudo9 =
- "......8....2.7..4....3..6.16..1....5..9.4........57.....7..5.9.3.....1.8.8......."
- reduceGrid(sudo9);
复制代码
js: version 57
time js -b sudo.js
rosetta:
- +-------+-------+-------+
- | 5 9 3 | 4 1 6 | 8 2 7 |
- | 1 6 2 | 5 7 8 | 3 4 9 |
- | 7 4 8 | 3 2 9 | 6 5 1 |
- +-------+-------+-------+
- | 6 7 4 | 1 8 2 | 9 3 5 |
- | 8 5 9 | 6 4 3 | 7 1 2 |
- | 2 3 1 | 9 5 7 | 4 8 6 |
- +-------+-------+-------+
- | 4 1 7 | 8 6 5 | 2 9 3 |
- | 3 2 5 | 7 9 4 | 1 6 8 |
- | 9 8 6 | 2 3 1 | 5 7 4 |
- +-------+-------+-------+
- runtime = 602.870 ms
- real 0m0.750s
- user 0m0.748s
- sys 0m0.037s
复制代码
- 5 9 3 4 1 6 8 2 7
- 1 6 2 5 7 8 3 4 9
- 7 4 8 3 2 9 6 5 1
- 6 7 4 1 8 2 9 3 5
- 8 5 9 6 4 3 7 1 2
- 2 3 1 9 5 7 4 8 6
- 4 1 7 8 6 5 2 9 3
- 3 2 5 7 9 4 1 6 8
- 9 8 6 2 3 1 5 7 4
- runtime = 86.137 ms
- real 0m0.232s
- user 0m0.224s
- sys 0m0.033s
复制代码
sudo.js
- const ERROR = 1022; // 0b1111111110
- const OK = 0;
- const BEST = 1;
- const MIN = 10;
- const int = Math.floor;
- let Verti = [];
- let Horiz = [];
- let Bloke = [];
- let Hover = [];
- let Maybe = [];
- let Gimme = [];
- let Dit;
- let Dat;
- let sudo3 = [
- [8, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 3, 6, 0, 0, 0, 0, 0],
- [0, 7, 0, 0, 9, 0, 2, 0, 0],
- [0, 5, 0, 0, 0, 7, 0, 0, 0],
- [0, 0, 0, 0, 4, 5, 7, 0, 0],
- [0, 0, 0, 1, 0, 0, 0, 3, 0],
- [0, 0, 1, 0, 0, 0, 0, 6, 8],
- [0, 0, 8, 5, 0, 0, 0, 1, 0],
- [0, 9, 0, 0, 0, 0, 4, 0, 0],
- ];
- let sudo9 = [
- [0, 0, 0, 0, 0, 0, 8, 0, 0],
- [0, 0, 2, 0, 7, 0, 0, 4, 0],
- [0, 0, 0, 3, 0, 0, 6, 0, 1],
- [6, 0, 0, 1, 0, 0, 0, 0, 5],
- [0, 0, 9, 0, 4, 0, 0, 0, 0],
- [0, 0, 0, 0, 5, 7, 0, 0, 0],
- [0, 0, 7, 0, 0, 5, 0, 9, 0],
- [3, 0, 0, 0, 0, 0, 1, 0, 8],
- [0, 8, 0, 0, 0, 0, 0, 0, 0],
- ];
- init ();
- play (sudo9);
- /* ____________________SUB____________________ */
- function init (){
- for (let i = 0; i < 9; i++) {
- let i3 = 3 * int (i / 3);
- Hover[i] = [];
- for (let j = 0; j < 9; j++)
- Hover[i][j] = int (j / 3) + i3;
- }
- for (let n = 0; n < ERROR; n += 2) {
- Maybe[n] = [];
- for (let i = 1; i <= 9; i++) {
- if (n & 1 << i) continue;
- Maybe[n].push (i);
- }
- }
- }
- function play (sudoku){
- for (let i = 0; i < 9; i++)
- Horiz[i] = Verti[i] = Bloke[i] = 0;
- Gimme = [];
- for (let i = 0; i < 9; i++) {
- for (let j = 0; j < 9; j++) {
- let k = Hover[i][j];
- if (!sudoku[i][j]) {
- Gimme.push ([i, j, k]);
- continue;
- }
- Horiz[i] |= 1 << sudoku[i][j];
- Verti[j] |= 1 << sudoku[i][j];
- Bloke[k] |= 1 << sudoku[i][j];
- }
- }
- Dat = Gimme.length;
- Dit = 0;
- // FOR Gimme[Dit - 1] is undefined
- Gimme.push ([0, 0, 0])
- explore (sudoku);
- } /* play */
- function explore (sudoku) {
- if (Dit > Dat) return;
- let This = best ();
- if (This == ERROR) return;
- if (This == OK) echo (sudoku);
- let maybe = Maybe[This];
- let [h, v, b] = Gimme[Dit - 1];
- for (let it = 0; it < maybe.length; it++) {
- let n = 1 << maybe[it];
- sudoku[h][v] = maybe[it];
- Horiz[h] |= n;
- Verti[v] |= n;
- Bloke[b] |= n;
- explore (sudoku);
- Horiz[h] ^= n;
- Verti[v] ^= n;
- Bloke[b] ^= n;
- }
- sudoku[h][v] = 0;
- Dit--;
- } /* explore */
- function best (){
- let min = MIN;
- let best = OK;
- let posi = Dit;
- for (let it = Dit; it < Dat; it++) {
- let [h, v, b] = Gimme[it];
- let that = Horiz[h] | Verti[v] | Bloke[b];
- if (that == ERROR) return ERROR;
- let maybe = Maybe[that].length;
- if (min > maybe) {
- posi = it;
- best = that;
- if (maybe == BEST) break;
- min = maybe;
- }
- }
- let w = Gimme[posi];
- Gimme[posi] = Gimme[Dit];
- Gimme[Dit] = w;
- Dit++;
- return best;
- } /* best */
- function echo (sudoku){
- for (let i = 0; i < 9; i++) {
- if (!(i % 3)) print ();
- for (let j = 0; j < 9; j++) {
- if (!(j % 3)) putstr (' ');
- putstr (sudoku[i][j]), putstr (' ');
- }
- print ();
- }
- }
复制代码
js zhenshi kuai,
perl 0m0.532s
js1.85 0m0.092s
C 0m0.010s
time js -m -b sudo.js
- 5 9 3 4 1 6 8 2 7
- 1 6 2 5 7 8 3 4 9
- 7 4 8 3 2 9 6 5 1
- 6 7 4 1 8 2 9 3 5
- 8 5 9 6 4 3 7 1 2
- 2 3 1 9 5 7 4 8 6
- 4 1 7 8 6 5 2 9 3
- 3 2 5 7 9 4 1 6 8
- 9 8 6 2 3 1 5 7 4
- runtime = 71.417 ms
- real 0m0.092s
- user 0m0.076s
- sys 0m0.013s
复制代码
jsshell dl here:
https://archive.mozilla.org/pub/ ... st-mozilla-central/
jsshell-XXXXXX.zip
|
|