Guest User

Untitled

a guest
Feb 21st, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.72 KB | None | 0 0
  1. module RubySudoku
  2. class Solver
  3. def initialize(input)
  4.  
  5. end
  6.  
  7. def solution
  8. end
  9. end
  10.  
  11. class Game
  12. def initialize(input)
  13. @input = input
  14. end
  15.  
  16. def cell(x)
  17. @input[x]
  18. end
  19.  
  20. def cell_at(col_idx, row_idx)
  21. cell(cell_index(col_idx, row_idx))
  22. end
  23.  
  24. def row_at(cell_idx)
  25. cell_idx / 9
  26. end
  27.  
  28. def column_at(cell_idx)
  29. cell_idx % 9
  30. end
  31.  
  32. def box_at(cell_idx)
  33. row = row_at(cell_idx)
  34. col = column_at(cell_idx)
  35.  
  36. (row/3)*3 + (col/3)
  37. end
  38.  
  39. def row(row_number)
  40. row_indices(row_number).collect { |idx| cell(idx) }
  41. end
  42.  
  43. def column(column_number)
  44. column_indices(column_number).collect { |idx| cell(idx) }
  45. end
  46.  
  47. def box(box_number)
  48. box_indices(box_number).collect { |idx| cell(idx) }
  49. end
  50.  
  51. def possible_values(cell_idx)
  52. row_num = row_at(cell_idx)
  53. col_num = column_at(cell_idx)
  54. box_num = box_at(cell_idx)
  55.  
  56. row_vals = row(row_num)
  57. col_vals = column(col_num)
  58. box_vals = box(box_num)
  59.  
  60. (1..9).to_a - row_vals - col_vals - box_vals
  61. end
  62.  
  63. def fill_constrained_cells
  64. cell_idxs = (0..80).collect do |cell_idx|
  65. poss = possible_values(cell_idx)
  66. if cell(cell_idx) == 0 && poss.size == 1
  67. puts poss
  68. set_cell(cell_idx, poss)
  69. cell_idx
  70. end
  71. end
  72. cell_idxs.compact
  73. end
  74.  
  75. def solve_attempt
  76. cons_cells = fill_constrained_cells
  77. while cons_cells.size > 0
  78. cons_cells = fill_constrained_cells
  79. end
  80.  
  81. if not solved?
  82. puts 'Failed the puzzle'
  83. end
  84. end
  85.  
  86. def solved?
  87. @input.each do |cell|
  88. if cell == 0
  89. return false
  90. end
  91. end
  92. return true
  93. end
  94.  
  95. protected
  96.  
  97. def set_cell(x, y)
  98. @input[x] = y
  99. end
  100.  
  101. def column_indices(column_number)
  102. (0..8).collect { |x| x * 9 + column_number }
  103. end
  104.  
  105. def cell_index(col_idx, row_idx)
  106. cell_index = row_idx * 9 + col_idx
  107. end
  108.  
  109. def row_indices(row_number)
  110. start_idx = row_number * 9
  111. end_idx = start_idx + 8
  112. (start_idx..end_idx).to_a
  113. end
  114.  
  115. def box_indices(box_number)
  116. start_row = (box_number / 3) * 3
  117. start_col = (box_number % 3) * 3
  118.  
  119. indices = []
  120.  
  121. (start_row..start_row + 2).each do |row_idx|
  122. (start_col..start_col + 2).each do |col_idx|
  123. indices << cell_index(col_idx, row_idx)
  124. end
  125. end
  126.  
  127. indices
  128. end
  129. end
  130. end
Add Comment
Please, Sign In to add comment