fork download
  1. process.stdin.resume();
  2. process.stdin.setEncoding('utf8');
  3.  
  4. // your code goes here
  5. Array.prototype.全て = Array.prototype.every;
  6. Array.prototype.どれか = Array.prototype.some;
  7. const 切捨 = Math.floor;
  8.  
  9. // Wikipediaより引用
  10. // https://j...content-available-to-author-only...a.org/wiki/%E6%95%B0%E7%8B%AC
  11. const 数独の問題例 = `
  12. 5 3 . . 7 . . . .
  13. 6 . . 1 9 5 . . .
  14. . 9 8 . . . . 6 .
  15. 8 . . . 6 . . . 3
  16. 4 . . 8 . 3 . . 1
  17. 7 . . . 2 . . . 6
  18. . 6 . . . . 2 8 .
  19. . . . 4 1 9 . . 5
  20. . . . . 8 . . 7 9
  21. `;
  22. const 盤面 = 数独の問題例.replace(/\s/g,'').replace('.','0').split('').map(e=>parseInt(e));
  23. const= 9; 高さ = 9;
  24. const マスの数 =* 高さ;
  25. const ブロック幅 = 3;
  26. const 入る数字 = [1,2,3,4,5,6,7,8,9];
  27. // 左上から0,1,2,...,80で表されるマスIdを行,列,太枠グループに対応
  28. const= (マスId) => 切捨(マスId /);
  29. const= (マスId) => (マスId %);
  30. // 左上から数えて何番目のブロックか
  31. const ブロック = (マスId) => 切捨((マスId)/ブロック幅)*ブロック幅+ 切捨((マスId)/ブロック幅);
  32. const 次の = マス => マス + 1;
  33. const 記入済の = マスId => 盤面[マスId] > 0;
  34.  
  35. // 条件グループ(列, 行, ブロック)のどれかにnが入っている
  36. const 重複 = (指定マスId, 入れる数字) => [,, ブロック].どれか(g =>
  37. 盤面.どれか((マスの数字, マスId) => g(指定マスId) === g(マスId) && マスの数字 === 入れる数字)
  38. );
  39.  
  40. const 解答作成 = マスId => {
  41. // 盤面が完成している
  42. if (マスId === マスの数) { return true; }
  43. // 最初から記入済の場合, 次のマスをチェック
  44. if (記入済の(マスId)) { return 解答作成(次の(マスId)); }
  45.  
  46. // どれかの数字を入れて重複せず, それ以降も数字を記入することができれば
  47. if (入る数字.どれか(数字 => !重複(マスId, 数字) && (盤面[マスId] = 数字, 解答作成(次の(マスId))))) {
  48. // 正しい盤面
  49. return true;
  50. }
  51. else {
  52. // そうでなければ盤面を消して一つ戻し, 他の数字をチェック
  53. 盤面[マスId] = 0;
  54. return false;
  55. }
  56. }
  57.  
  58. console.log(数独の問題例);
  59. 解答作成(0);
  60. console.log(盤面.join('').replace(/(.{9})/g,'$1\n').replace(/(.)/g,' $1'));
Success #stdin #stdout 0.15s 34264KB
stdin
Standard input is empty
stdout
 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

 5 3 4 6 7 8 9 1 2
 6 7 2 1 9 5 3 4 8
 1 9 8 3 4 2 5 6 7
 8 5 9 7 6 1 4 2 3
 4 2 6 8 5 3 7 9 1
 7 1 3 9 2 4 8 5 6
 9 6 1 5 3 7 2 8 4
 2 8 7 4 1 9 6 3 5
 3 4 5 2 8 6 1 7 9