|
|
|
Ruby Вопрос по судоку
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, уважаемые форумчане. Может, кто-то сможет понять, почему код не работает, где ошибка? Надеюсь, код более-менее читабельный. Заранее спасибо. Ошибка где-то в методе create_field Sudoku class Sudoku def initialize @field = Hash.new() @visited_nums = Hash.new() end def empty_field # creating empty sudoku 9x9 field i = 1 while i<10 j = 1 while j<10 cell_key = [i,j] @field[cell_key] = nil j+=1 end i+=1 end end def visited_numbers # creating empty arrays for already checked & invalid numbers for each cell i = 1 while i<10 j = 1 while j<10 cell_key = [i,j] @visited_nums[cell_key] = [] j+=1 end i+=1 end end def check_column(pick, row) # checking the column for c in 1..9 if @field[[row, c]] == pick return false end end return true end def check_row(pick, column) # checking the row for r in 1..9 if @field[[r, column]] == pick return false end end return true end def check_segment(pick, row, column) # checking the 3x3 square if column<=3 if row<=3 for i in 1..3 for j in 1..3 if @field[[i, j]] == pick return false end end end elsif row>3 && row<=6 for i in 3..6 for j in 1..3 if @field[[i, j]] == pick return false end end end elsif row>6 && row<=9 for i in 6..9 for j in 1..3 if @field[[i, j]] == pick return false end end end end elsif column>3 && column<=6 if row<=3 for i in 1..3 for j in 3..6 if @field[[i, j]] == pick return false end end end elsif row>3 && row<=6 for i in 3..6 for j in 3..6 if @field[[i, j]] == pick return false end end end elsif row>6 && row<=9 for i in 6..9 for j in 3..6 if @field[[i, j]] == pick return false end end end end elsif column>6 && column<=9 if row<=3 for i in 1..3 for j in 6..9 if @field[[i, j]] == pick return false end end end elsif row>3 && row<=6 for i in 3..6 for j in 6..9 if @field[[i, j]] == pick return false end end end elsif row>6 && row<=9 for i in 6..9 for j in 6..9 if @field[[i, j]] == pick return false end end end end end return true end def create_field # generating solved puzzle empty_field visited_numbers i = 1 while i<=9 # i - row counter j = 1 marks_index = 8 marks = [1,2,3,4,5,6,7,8,9] while j<=9 # j - column counter pick = marks[rand(0..marks_index)] if check_column(pick, i) && check_row(pick, j) && check_segment(pick, i, j) @field[[i,j]] = pick @visited_nums[[i,j]].push(pick) j+=1 end end i+=1 puts '' end end def show_field i = 1 while i<10 j = 1 while j<10 #if @field[[i,j]] == nil # @field[[i,j]] == ' ' #end if j==4 || j==7 print '| ' end if j%9==0 print "#{@field[[i,j]]} " puts '' if i==3 || i==6 for k in 0..8 print '--' end print '---' puts "\n" end else print "#{@field[[i,j]]} " end j+=1 end i+=1 end end end sudoku = Sudoku.new puts '' sudoku.create_field puts '' sudoku.show_field ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2013, 04:41 |
|
||
|
Ruby Вопрос по судоку
|
|||
|---|---|---|---|
|
#18+
leolНадеюсь, код более-менее читабельный.И не надейся ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2013, 04:55 |
|
||
|
Ruby Вопрос по судоку
|
|||
|---|---|---|---|
|
#18+
Рабочий код можно взять в книге Д. Флэнаган, Ю. Мацумото. "Язык программирования Ruby", стр.37 Также тут еще можно посомтреть: http://rosettacode.org/wiki/Sudoku#Ruby ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2013, 10:44 |
|
||
|
|

start [/forum/topic.php?fid=16&fpage=58&tid=1341884]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
75ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 404ms |

| 0 / 0 |
