Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 32 additions & 1 deletion src/lib/sudoku-model.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ const difficultyLevels = [
];

const MAX_SAVED_PUZZLES = 5;
const ALL_CANDIDATES_SUM = 1022;

const emptySet = Set();
const charCodeOne = '1'.charCodeAt(0);
Expand Down Expand Up @@ -951,7 +952,37 @@ export const modelHelpers = {
return grid.set('modalState', {
modalType: MODAL_TYPE_SOLVER,
initialDigits: grid.get('initialDigits'),
allDigits: grid.get('cells').map(c => c.get('digit')).join(''),
allDigits: grid.get('cells')
.map(c => {
const encode_as_str = (encoded_cell) => {
let encoded_str = encoded_cell.toString(32);
if (encoded_str.length < 2) {
encoded_str = '0' + encoded_str;
}
return encoded_str;
};

const digit = parseInt(c.get('digit'));
if (c.get('isGiven')) {
// increment to set 'clue' flag
const encoded_cell = Math.pow(2, digit) + 1;
return encode_as_str(encoded_cell);
}

// cell based on user input
if (digit === 0) {
const candidates = c.get('innerPencils').toArray();
const encoded_cell = candidates.length !== 0
? candidates.map(c => Math.pow(2, parseInt(c)))
.reduce((a, b) => a + b, 0)
: ALL_CANDIDATES_SUM;
return encode_as_str(encoded_cell);
} else {
// return digit as is
const encoded_cell = Math.pow(2, digit);
return encode_as_str(encoded_cell);
}
}).join(''),
passProgressSetting,
escapeAction: 'close',
});
Expand Down
97 changes: 97 additions & 0 deletions src/lib/sudoku-model.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1039,3 +1039,100 @@ test('check digits', () => {
},
});
});

test('check modal solver', () => {
let grid = newSudokuModel({initialDigits: initialDigitsComplete, skipCheck: true});
let result = modelHelpers.showSolverModal(grid).get('modalState');
expect(result['allDigits']).toBe(
'vuvuvuvuvu030509vu' +
'030509vuvu81vu0hvu' +
'81vu0hvuvu412111vu' +
'412111vuvuvuvuvuvu' +
'vuvuvuvuvuvuvuvuvu' +
'vuvuvuvuvuvu030509' +
'vu030509vuvu81vu0h' +
'vu81vu0hvuvu412111' +
'vu412111vuvuvuvuvu'
);

grid = modelHelpers.showCalculatedCandidates(grid);
expect(grid.get('currentSnapshot')).toBe(
'11N569,12N59,13N79,14N69,15N4569,19N789,' +
'24N69,25N569,27N9,29N79,' +
'32N9,34N29,35N239,39N19,' +
'44N1289,45N123489,46N2349,47N49,48N89,49N89,' +
'51N2349,52N349,53N189,54N126789,55N123456789,56N234569,57N459,58N789,59N6789,' +
'61N49,62N49,63N89,64N6789,65N456789,66N4569,' +
'71N59,75N679,76N69,78N9,' +
'81N39,83N9,85N129,86N29,' +
'91N349,95N1289,96N29,97N39,98N19,99N129'
);
result = modelHelpers.showSolverModal(grid).get('modalState');
expect(result['allDigits']).toBe(
'j0h0k0i0jg030509s0' +
'030509i0j081g00hk0' +
'81g00hg4gc412111g2' +
'412111o6ougsggo0o0' +
'gsgoo2u6vujshgs0u0' +
'ggggo0u0vgjg030509' +
'h0030509m0i081g00h' +
'g881g00hg6g4412111' +
'go412111o6g4g8g2g6'
);

grid = modelHelpers.applySelectionOp(grid, 'setSelection', 72);
grid = modelHelpers.updateSelectedCells(grid, 'setDigit', 4);
grid = modelHelpers.applySelectionOp(grid, 'setSelection', 34);
grid = modelHelpers.updateSelectedCells(grid, 'setDigit', 8);
expect(grid.get('currentSnapshot')).toBe(
'11N569,12N59,13N79,14N69,15N4569,19N789,' +
'24N69,25N569,27N9,29N79,' +
'32N9,34N29,35N239,39N19,' +
'44N129,45N12349,46N2349,47N49,48D8,49N9,' +
'51N239,52N349,53N189,54N126789,55N123456789,56N234569,57N459,58N79,59N679,' +
'61N9,62N49,63N89,64N6789,65N456789,66N4569,' +
'71N59,75N679,76N69,78N9,' +
'81N39,83N9,85N129,86N29,' +
'91D4,95N1289,96N29,97N39,98N19,99N129'
);
result = modelHelpers.showSolverModal(grid).get('modalState');
expect(result['allDigits']).toBe(
'j0h0k0i0jg030509s0' +
'030509i0j081g00hk0' +
'81g00hg4gc412111g2' +
'412111g6gugsgg80g0' +
'gcgoo2u6vujshgk0m0' +
'g0ggo0u0vgjg030509' +
'h0030509m0i081g00h' +
'g881g00hg6g4412111' +
'0g412111o6g4g8g2g6'
);

grid = modelHelpers.applySelectionOp(grid, 'setSelection', 13);
grid = modelHelpers.updateSelectedCells(grid, 'clearCell');
grid = modelHelpers.applySelectionOp(grid, 'setSelection', 50);
grid = modelHelpers.updateSelectedCells(grid, 'clearCell');
expect(grid.get('currentSnapshot')).toBe(
'11N569,12N59,13N79,14N69,15N4569,19N789,' +
'24N69,27N9,29N79,' +
'32N9,34N29,35N239,39N19,' +
'44N129,45N12349,46N2349,47N49,48D8,49N9,' +
'51N239,52N349,53N189,54N126789,55N123456789,56N234569,57N459,58N79,59N679,' +
'61N9,62N49,63N89,64N6789,65N456789,' +
'71N59,75N679,76N69,78N9,' +
'81N39,83N9,85N129,86N29,' +
'91D4,95N1289,96N29,97N39,98N19,99N129'
);
result = modelHelpers.showSolverModal(grid).get('modalState');
expect(result['allDigits']).toBe(
'j0h0k0i0jg030509s0' +
'030509i0vu81g00hk0' +
'81g00hg4gc412111g2' +
'412111g6gugsgg80g0' +
'gcgoo2u6vujshgk0m0' +
'g0ggo0u0vgvu030509' +
'h0030509m0i081g00h' +
'g881g00hg6g4412111' +
'0g412111o6g4g8g2g6'
);
});