process.stdin.resume();
process.stdin.setEncoding('utf8');
// your code goes here
Array.prototype.全て = Array.prototype.every;
Array.prototype.どれか = Array.prototype.some;
const 切捨 = Math.floor;
// Wikipediaより引用
// https://j...content-available-to-author-only...a.org/wiki/%E6%95%B0%E7%8B%AC
const 数独の問題例 = `
5 3 . . 7 . . . .
6 . . 1 9 5 . . .
. 9 8 . . . . 6 .
8 . . . 6 . . . 3
4 . . 8 . 3 . . 1
7 . . . 2 . . . 6
. 6 . . . . 2 8 .
. . . 4 1 9 . . 5
. . . . 8 . . 7 9
`;
const 盤面 = 数独の問題例.replace(/\s/g,'').replace('.','0').split('').map(e=>parseInt(e));
const 幅 = 9; 高さ = 9;
const マスの数 = 幅 * 高さ;
const ブロック幅 = 3;
const 入る数字 = [1,2,3,4,5,6,7,8,9];
// 左上から0,1,2,...,80で表されるマスIdを行,列,太枠グループに対応
const 列 = (マスId) => 切捨(マスId / 幅);
const 行 = (マスId) => (マスId % 幅);
// 左上から数えて何番目のブロックか
const ブロック = (マスId) => 切捨(列(マスId)/ブロック幅)*ブロック幅+ 切捨(行(マスId)/ブロック幅);
const 次の = マス => マス + 1;
const 記入済の = マスId => 盤面[マスId] > 0;
// 条件グループ(列, 行, ブロック)のどれかにnが入っている
const 重複 = (指定マスId, 入れる数字) => [列, 行, ブロック].どれか(g =>
盤面.どれか((マスの数字, マスId) => g(指定マスId) === g(マスId) && マスの数字 === 入れる数字)
);
const 解答作成 = マスId => {
// 盤面が完成している
if (マスId === マスの数) { return true; }
// 最初から記入済の場合, 次のマスをチェック
if (記入済の(マスId)) { return 解答作成(次の(マスId)); }
// どれかの数字を入れて重複せず, それ以降も数字を記入することができれば
if (入る数字.どれか(数字 => !重複(マスId, 数字) && (盤面[マスId] = 数字, 解答作成(次の(マスId))))) {
// 正しい盤面
return true;
}
else {
// そうでなければ盤面を消して一つ戻し, 他の数字をチェック
盤面[マスId] = 0;
return false;
}
}
console.log(数独の問題例);
解答作成(0);
console.log(盤面.join('').replace(/(.{9})/g,'$1\n').replace(/(.)/g,' $1'));
cHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTsKcHJvY2Vzcy5zdGRpbi5zZXRFbmNvZGluZygndXRmOCcpOwoKLy8geW91ciBjb2RlIGdvZXMgaGVyZQpBcnJheS5wcm90b3R5cGUu5YWo44GmID0gQXJyYXkucHJvdG90eXBlLmV2ZXJ5OwpBcnJheS5wcm90b3R5cGUu44Gp44KM44GLID0gQXJyYXkucHJvdG90eXBlLnNvbWU7CmNvbnN0IOWIh+aNqCA9IE1hdGguZmxvb3I7CgovLyBXaWtpcGVkaWHjgojjgorlvJXnlKgKLy8gaHR0cHM6Ly9qLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5hLm9yZy93aWtpLyVFNiU5NSVCMCVFNyU4QiVBQwpjb25zdCDmlbDni6zjga7llY/poYzkvosgPSBgCiA1IDMgLiAuIDcgLiAuIC4gLgogNiAuIC4gMSA5IDUgLiAuIC4KIC4gOSA4IC4gLiAuIC4gNiAuCiA4IC4gLiAuIDYgLiAuIC4gMwogNCAuIC4gOCAuIDMgLiAuIDEKIDcgLiAuIC4gMiAuIC4gLiA2CiAuIDYgLiAuIC4gLiAyIDggLgogLiAuIC4gNCAxIDkgLiAuIDUKIC4gLiAuIC4gOCAuIC4gNyA5CmA7CmNvbnN0IOebpOmdoiA9IOaVsOeLrOOBruWVj+mhjOS+iy5yZXBsYWNlKC9ccy9nLCcnKS5yZXBsYWNlKCcuJywnMCcpLnNwbGl0KCcnKS5tYXAoZT0+cGFyc2VJbnQoZSkpOwpjb25zdCDluYUgPSA5OyDpq5jjgZUgPSA5Owpjb25zdCDjg57jgrnjga7mlbAgPSDluYUgKiDpq5jjgZU7CmNvbnN0IOODluODreODg+OCr+W5hSA9IDM7CmNvbnN0IOWFpeOCi+aVsOWtlyA9IFsxLDIsMyw0LDUsNiw3LDgsOV07Ci8vIOW3puS4iuOBi+OCiTAsMSwyLC4uLiw4MOOBp+ihqOOBleOCjOOCi+ODnuOCuUlk44KS6KGMLOWIlyzlpKrmnqDjgrDjg6vjg7zjg5fjgavlr77lv5wKY29uc3Qg5YiXID0gKOODnuOCuUlkKSA9PiDliIfmjago44Oe44K5SWQgLyDluYUpOwpjb25zdCDooYwgPSAo44Oe44K5SWQpID0+ICjjg57jgrlJZCAlIOW5hSk7Ci8vIOW3puS4iuOBi+OCieaVsOOBiOOBpuS9leeVquebruOBruODluODreODg+OCr+OBiwpjb25zdCDjg5bjg63jg4Pjgq8gPSAo44Oe44K5SWQpID0+IOWIh+aNqCjliJco44Oe44K5SWQpL+ODluODreODg+OCr+W5hSkq44OW44Ot44OD44Kv5bmFKyDliIfmjago6KGMKOODnuOCuUlkKS/jg5bjg63jg4Pjgq/luYUpOwpjb25zdCDmrKHjga4gPSDjg57jgrkgPT4g44Oe44K5ICsgMTsKY29uc3Qg6KiY5YWl5riI44GuID0g44Oe44K5SWQgPT4g55uk6Z2iW+ODnuOCuUlkXSA+IDA7CgovLyDmnaHku7bjgrDjg6vjg7zjg5co5YiXLCDooYwsIOODluODreODg+OCrynjga7jganjgozjgYvjgatu44GM5YWl44Gj44Gm44GE44KLCmNvbnN0IOmHjeikhyA9ICjmjIflrprjg57jgrlJZCwg5YWl44KM44KL5pWw5a2XKSA9PiBb5YiXLCDooYwsIOODluODreODg+OCr10u44Gp44KM44GLKGcgPT4gCiAg55uk6Z2iLuOBqeOCjOOBiygo44Oe44K544Gu5pWw5a2XLCDjg57jgrlJZCkgPT4gZyjmjIflrprjg57jgrlJZCkgPT09IGco44Oe44K5SWQpICYmIOODnuOCueOBruaVsOWtlyA9PT0g5YWl44KM44KL5pWw5a2XKQopOwoKY29uc3Qg6Kej562U5L2c5oiQID0g44Oe44K5SWQgPT4gewogIC8vIOebpOmdouOBjOWujOaIkOOBl+OBpuOBhOOCiwogIGlmICjjg57jgrlJZCA9PT0g44Oe44K544Gu5pWwKSB7IHJldHVybiB0cnVlOyB9CiAgLy8g5pyA5Yid44GL44KJ6KiY5YWl5riI44Gu5aC05ZCILCDmrKHjga7jg57jgrnjgpLjg4Hjgqfjg4Pjgq8KICBpZiAo6KiY5YWl5riI44GuKOODnuOCuUlkKSkgeyByZXR1cm4g6Kej562U5L2c5oiQKOasoeOBrijjg57jgrlJZCkpOyB9CgogIC8vIOOBqeOCjOOBi+OBruaVsOWtl+OCkuWFpeOCjOOBpumHjeikh+OBm+OBmiwg44Gd44KM5Lul6ZmN44KC5pWw5a2X44KS6KiY5YWl44GZ44KL44GT44Go44GM44Gn44GN44KM44GwCiAgaWYgKOWFpeOCi+aVsOWtly7jganjgozjgYso5pWw5a2XID0+ICHph43opIco44Oe44K5SWQsIOaVsOWtlykgJiYgKOebpOmdolvjg57jgrlJZF0gPSDmlbDlrZcsIOino+etlOS9nOaIkCjmrKHjga4o44Oe44K5SWQpKSkpKSB7CiAgICAvLyDmraPjgZfjgYTnm6TpnaIKICAgIHJldHVybiB0cnVlOwogIH0KICBlbHNlIHsKICAgIC8vIOOBneOBhuOBp+OBquOBkeOCjOOBsOebpOmdouOCkua2iOOBl+OBpuS4gOOBpOaIu+OBlywg5LuW44Gu5pWw5a2X44KS44OB44Kn44OD44KvCiAgICDnm6TpnaJb44Oe44K5SWRdID0gMDsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KCmNvbnNvbGUubG9nKOaVsOeLrOOBruWVj+mhjOS+iyk7Cuino+etlOS9nOaIkCgwKTsKY29uc29sZS5sb2co55uk6Z2iLmpvaW4oJycpLnJlcGxhY2UoLyguezl9KS9nLCckMVxuJykucmVwbGFjZSgvKC4pL2csJyAkMScpKTs=