From 09b165e070b3e522b9a2ccfb39750a2da7063b09 Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Fri, 12 Jan 2024 17:41:03 +0100 Subject: [PATCH 1/2] Reindent plb2 benchmarks with spaces to make the next commit diff more readable --- benchmarks/matmul.rb | 56 +++++----- benchmarks/nqueens.rb | 66 ++++++------ benchmarks/sudoku.rb | 236 +++++++++++++++++++++--------------------- 3 files changed, 179 insertions(+), 179 deletions(-) diff --git a/benchmarks/matmul.rb b/benchmarks/matmul.rb index 13458076..57f50443 100644 --- a/benchmarks/matmul.rb +++ b/benchmarks/matmul.rb @@ -1,43 +1,43 @@ require_relative '../harness/loader' def matgen(n) - tmp = 1.0 / n / n - a = Array.new(n) { Array.new(n) { 0 } } - for i in 0 .. n-1 - for j in 0 .. n-1 - a[i][j] = tmp * (i - j) * (i + j) - end - end - return a + tmp = 1.0 / n / n + a = Array.new(n) { Array.new(n) { 0 } } + for i in 0 .. n-1 + for j in 0 .. n-1 + a[i][j] = tmp * (i - j) * (i + j) + end + end + return a end def matmul(a, b) - m = a.length - n = a[0].length - p = b[0].length - c = Array.new(m) { Array.new(p) { 0 } } - for i in 0 .. m-1 - ci = c[i] - for k in 0 .. n-1 - aik = a[i][k] - bk = b[k] - for j in 0 .. p-1 - ci[j] += aik * bk[j] - end - end - end - return c + m = a.length + n = a[0].length + p = b[0].length + c = Array.new(m) { Array.new(p) { 0 } } + for i in 0 .. m-1 + ci = c[i] + for k in 0 .. n-1 + aik = a[i][k] + bk = b[k] + for j in 0 .. p-1 + ci[j] += aik * bk[j] + end + end + end + return c end n = 300 if ARGV.length >= 1 - n = ARGV[0].to_i + n = ARGV[0].to_i end n = n / 2 * 2 run_benchmark(20) do - a = matgen(n) - b = matgen(n) - c = matmul(a, b) - #puts c[n/2][n/2] + a = matgen(n) + b = matgen(n) + c = matmul(a, b) + #puts c[n/2][n/2] end diff --git a/benchmarks/nqueens.rb b/benchmarks/nqueens.rb index 28839bee..2a5d28b2 100644 --- a/benchmarks/nqueens.rb +++ b/benchmarks/nqueens.rb @@ -1,44 +1,44 @@ require_relative '../harness/loader' def nq_solve(n) - a = Array.new(n) { -1 } - l = Array.new(n) { 0 } - c = Array.new(n) { 0 } - r = Array.new(n) { 0 } - y0 = (1<= 0 do - y = (l[k] | c[k] | r[k]) & y0 - if (y ^ y0) >> (a[k] + 1) != 0 then - i = a[k] + 1 - while i < n and (y & 1<>1 - else - m += 1 - k -= 1 - end - else - a[k] = -1 - k -= 1 - end - end - return m + a = Array.new(n) { -1 } + l = Array.new(n) { 0 } + c = Array.new(n) { 0 } + r = Array.new(n) { 0 } + y0 = (1<= 0 do + y = (l[k] | c[k] | r[k]) & y0 + if (y ^ y0) >> (a[k] + 1) != 0 then + i = a[k] + 1 + while i < n and (y & 1<>1 + else + m += 1 + k -= 1 + end + else + a[k] = -1 + k -= 1 + end + end + return m end n = 12 if ARGV.length() > 0 then - n = ARGV[0].to_i + n = ARGV[0].to_i end run_benchmark(40) do - nq_solve(n) + nq_solve(n) end diff --git a/benchmarks/sudoku.rb b/benchmarks/sudoku.rb index dbf79576..8a95967d 100644 --- a/benchmarks/sudoku.rb +++ b/benchmarks/sudoku.rb @@ -1,135 +1,135 @@ require_relative '../harness/loader' def sd_genmat() - mr = Array.new(324) { [] } - mc = Array.new(729) { [] } - r = 0 - (0...9).each do |i| - (0...9).each do |j| - (0...9).each do |k| - mc[r] = [ 9 * i + j, (i/3*3 + j/3) * 9 + k + 81, 9 * i + k + 162, 9 * j + k + 243 ] - r += 1 - end - end - end - (0...729).each do |r| - (0...4).each do |c2| - mr[mc[r][c2]].push(r) - end - end - return mr, mc + mr = Array.new(324) { [] } + mc = Array.new(729) { [] } + r = 0 + (0...9).each do |i| + (0...9).each do |j| + (0...9).each do |k| + mc[r] = [ 9 * i + j, (i/3*3 + j/3) * 9 + k + 81, 9 * i + k + 162, 9 * j + k + 243 ] + r += 1 + end + end + end + (0...729).each do |r| + (0...4).each do |c2| + mr[mc[r][c2]].push(r) + end + end + return mr, mc end def sd_update(mr, mc, sr, sc, r, v) - min, min_c = 10, 0 - (0...4).each do |c2| - if v > 0 then sc[mc[r][c2]] += 128 - else sc[mc[r][c2]] -= 128 end - end - (0...4).each do |c2| - c = mc[r][c2] - if v > 0 then - (0...9).each do |r2| - rr = mr[c][r2] - sr[rr] += + 1 - if sr[rr] == 1 then - p = mc[rr] - sc[p[0]] -= 1; sc[p[1]] -= 1; sc[p[2]] -= 1; sc[p[3]] -= 1 - if sc[p[0]] < min then min, min_c = sc[p[0]], p[0] end - if sc[p[1]] < min then min, min_c = sc[p[1]], p[1] end - if sc[p[2]] < min then min, min_c = sc[p[2]], p[2] end - if sc[p[3]] < min then min, min_c = sc[p[3]], p[3] end - end - end - else - (0...9).each do |r2| - rr = mr[c][r2] - sr[rr] -= 1 - if sr[rr] == 0 then - p = mc[rr] - sc[p[0]] += 1; sc[p[1]] += 1; sc[p[2]] += 1; sc[p[3]] += 1 - end - end - end - end - return min, min_c + min, min_c = 10, 0 + (0...4).each do |c2| + if v > 0 then sc[mc[r][c2]] += 128 + else sc[mc[r][c2]] -= 128 end + end + (0...4).each do |c2| + c = mc[r][c2] + if v > 0 then + (0...9).each do |r2| + rr = mr[c][r2] + sr[rr] += + 1 + if sr[rr] == 1 then + p = mc[rr] + sc[p[0]] -= 1; sc[p[1]] -= 1; sc[p[2]] -= 1; sc[p[3]] -= 1 + if sc[p[0]] < min then min, min_c = sc[p[0]], p[0] end + if sc[p[1]] < min then min, min_c = sc[p[1]], p[1] end + if sc[p[2]] < min then min, min_c = sc[p[2]], p[2] end + if sc[p[3]] < min then min, min_c = sc[p[3]], p[3] end + end + end + else + (0...9).each do |r2| + rr = mr[c][r2] + sr[rr] -= 1 + if sr[rr] == 0 then + p = mc[rr] + sc[p[0]] += 1; sc[p[1]] += 1; sc[p[2]] += 1; sc[p[3]] += 1 + end + end + end + end + return min, min_c end def sd_solve(mr, mc, s) - ret, sr, sc, hints = [], Array.new(729) { 0 }, Array.new(324) { 9 }, 0 - (0...81).each do |i| - a = (s[i].chr >= '1' and s[i].chr <= '9')? s[i].ord - 49 : -1 - if a >= 0 then sd_update(mr, mc, sr, sc, i * 9 + a, 1); hints += 1 end - end - cr, cc = Array.new(81) { -1 }, Array.new(81) { 0 } - i, min, dir = 0, 10, 1 - loop do - while i >= 0 and i < 81 - hints do - if dir == 1 then - if min > 1 then - (0...324).each do |c| - if sc[c] < min then - min, cc[i] = sc[c], c - if min < 2 then break end - end - end - end - if min == 0 or min == 10 then cr[i], dir, i = -1, -1, i - 1 end - end - c = cc[i] - if dir == -1 and cr[i] >= 0 then sd_update(mr, mc, sr, sc, mr[c][cr[i]], -1) end - r2_ = 9 - (cr[i]+1...9).each do |r2| - if sr[mr[c][r2]] == 0 then r2_ = r2; break end - end - if r2_ < 9 then - min, cc[i+1] = sd_update(mr, mc, sr, sc, mr[c][r2_], 1) - cr[i], dir, i = r2_, 1, i + 1 - else cr[i], dir, i = -1, -1, i - 1 end - end - if i < 0 then break end - o = [] - (0...81).each do |j| o.push(s[j].ord - 48) end - (0...i).each do |j| - r = mr[cc[j]][cr[j]] - o[r/9] = r % 9 + 1 - end - ret.push(o) - i, dir = i - 1, -1 - end - return ret + ret, sr, sc, hints = [], Array.new(729) { 0 }, Array.new(324) { 9 }, 0 + (0...81).each do |i| + a = (s[i].chr >= '1' and s[i].chr <= '9')? s[i].ord - 49 : -1 + if a >= 0 then sd_update(mr, mc, sr, sc, i * 9 + a, 1); hints += 1 end + end + cr, cc = Array.new(81) { -1 }, Array.new(81) { 0 } + i, min, dir = 0, 10, 1 + loop do + while i >= 0 and i < 81 - hints do + if dir == 1 then + if min > 1 then + (0...324).each do |c| + if sc[c] < min then + min, cc[i] = sc[c], c + if min < 2 then break end + end + end + end + if min == 0 or min == 10 then cr[i], dir, i = -1, -1, i - 1 end + end + c = cc[i] + if dir == -1 and cr[i] >= 0 then sd_update(mr, mc, sr, sc, mr[c][cr[i]], -1) end + r2_ = 9 + (cr[i]+1...9).each do |r2| + if sr[mr[c][r2]] == 0 then r2_ = r2; break end + end + if r2_ < 9 then + min, cc[i+1] = sd_update(mr, mc, sr, sc, mr[c][r2_], 1) + cr[i], dir, i = r2_, 1, i + 1 + else cr[i], dir, i = -1, -1, i - 1 end + end + if i < 0 then break end + o = [] + (0...81).each do |j| o.push(s[j].ord - 48) end + (0...i).each do |j| + r = mr[cc[j]][cr[j]] + o[r/9] = r % 9 + 1 + end + ret.push(o) + i, dir = i - 1, -1 + end + return ret end hard20 = [ - "..............3.85..1.2.......5.7.....4...1...9.......5......73..2.1........4...9", - ".......12........3..23..4....18....5.6..7.8.......9.....85.....9...4.5..47...6...", - ".2..5.7..4..1....68....3...2....8..3.4..2.5.....6...1...2.9.....9......57.4...9..", - "........3..1..56...9..4..7......9.5.7.......8.5.4.2....8..2..9...35..1..6........", - "12.3....435....1....4........54..2..6...7.........8.9...31..5.......9.7.....6...8", - "1.......2.9.4...5...6...7...5.9.3.......7.......85..4.7.....6...3...9.8...2.....1", - ".......39.....1..5..3.5.8....8.9...6.7...2...1..4.......9.8..5..2....6..4..7.....", - "12.3.....4.....3....3.5......42..5......8...9.6...5.7...15..2......9..6......7..8", - "..3..6.8....1..2......7...4..9..8.6..3..4...1.7.2.....3....5.....5...6..98.....5.", - "1.......9..67...2..8....4......75.3...5..2....6.3......9....8..6...4...1..25...6.", - "..9...4...7.3...2.8...6...71..8....6....1..7.....56...3....5..1.4.....9...2...7..", - "....9..5..1.....3...23..7....45...7.8.....2.......64...9..1.....8..6......54....7", - "4...3.......6..8..........1....5..9..8....6...7.2........1.27..5.3....4.9........", - "7.8...3.....2.1...5.........4.....263...8.......1...9..9.6....4....7.5...........", - "3.7.4...........918........4.....7.....16.......25..........38..9....5...2.6.....", - "........8..3...4...9..2..6.....79.......612...6.5.2.7...8...5...1.....2.4.5.....3", - ".......1.4.........2...........5.4.7..8...3....1.9....3..4..2...5.1........8.6...", - ".......12....35......6...7.7.....3.....4..8..1...........12.....8.....4..5....6..", - "1.......2.9.4...5...6...7...5.3.4.......6........58.4...2...6...3...9.8.7.......1", - ".....1.2.3...4.5.....6....7..2.....1.8..9..3.4.....8..5....2....9..3.4....67....." + "..............3.85..1.2.......5.7.....4...1...9.......5......73..2.1........4...9", + ".......12........3..23..4....18....5.6..7.8.......9.....85.....9...4.5..47...6...", + ".2..5.7..4..1....68....3...2....8..3.4..2.5.....6...1...2.9.....9......57.4...9..", + "........3..1..56...9..4..7......9.5.7.......8.5.4.2....8..2..9...35..1..6........", + "12.3....435....1....4........54..2..6...7.........8.9...31..5.......9.7.....6...8", + "1.......2.9.4...5...6...7...5.9.3.......7.......85..4.7.....6...3...9.8...2.....1", + ".......39.....1..5..3.5.8....8.9...6.7...2...1..4.......9.8..5..2....6..4..7.....", + "12.3.....4.....3....3.5......42..5......8...9.6...5.7...15..2......9..6......7..8", + "..3..6.8....1..2......7...4..9..8.6..3..4...1.7.2.....3....5.....5...6..98.....5.", + "1.......9..67...2..8....4......75.3...5..2....6.3......9....8..6...4...1..25...6.", + "..9...4...7.3...2.8...6...71..8....6....1..7.....56...3....5..1.4.....9...2...7..", + "....9..5..1.....3...23..7....45...7.8.....2.......64...9..1.....8..6......54....7", + "4...3.......6..8..........1....5..9..8....6...7.2........1.27..5.3....4.9........", + "7.8...3.....2.1...5.........4.....263...8.......1...9..9.6....4....7.5...........", + "3.7.4...........918........4.....7.....16.......25..........38..9....5...2.6.....", + "........8..3...4...9..2..6.....79.......612...6.5.2.7...8...5...1.....2.4.5.....3", + ".......1.4.........2...........5.4.7..8...3....1.9....3..4..2...5.1........8.6...", + ".......12....35......6...7.7.....3.....4..8..1...........12.....8.....4..5....6..", + "1.......2.9.4...5...6...7...5.3.4.......6........58.4...2...6...3...9.8.7.......1", + ".....1.2.3...4.5.....6....7..2.....1.8..9..3.4.....8..5....2....9..3.4....67....." ] mr, mc = sd_genmat() run_benchmark(20) do - n = 4 - (0...n).each do |i| - hard20.each do |l| - ret = sd_solve(mr, mc, l) - ret.each do |s| s.join end - end - end + n = 4 + (0...n).each do |i| + hard20.each do |l| + ret = sd_solve(mr, mc, l) + ret.each do |s| s.join end + end + end end From ab3d391b14487597136d2fc542f90796303e0236 Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Fri, 12 Jan 2024 17:42:23 +0100 Subject: [PATCH 2/2] Update plb2 benchmarks to attractivechaos/plb2@a7e013882508 --- benchmarks/matmul.rb | 33 +++--- benchmarks/nqueens.rb | 32 +++--- benchmarks/sudoku.rb | 243 +++++++++++++++++++++++++++++------------- 3 files changed, 204 insertions(+), 104 deletions(-) diff --git a/benchmarks/matmul.rb b/benchmarks/matmul.rb index 57f50443..ce119a77 100644 --- a/benchmarks/matmul.rb +++ b/benchmarks/matmul.rb @@ -2,35 +2,38 @@ def matgen(n) tmp = 1.0 / n / n - a = Array.new(n) { Array.new(n) { 0 } } - for i in 0 .. n-1 - for j in 0 .. n-1 - a[i][j] = tmp * (i - j) * (i + j) - end - end - return a + Array.new(n) { |i| + Array.new(n) { |j| + tmp * (i - j) * (i + j) + } + } end def matmul(a, b) m = a.length n = a[0].length p = b[0].length - c = Array.new(m) { Array.new(p) { 0 } } - for i in 0 .. m-1 + c = Array.new(m) { Array.new(p, 0.0) } + for i in 0...m ci = c[i] - for k in 0 .. n-1 - aik = a[i][k] + ai = a[i] + k = 0 + while k < n + aik = ai[k] bk = b[k] - for j in 0 .. p-1 + j = 0 + while j < p ci[j] += aik * bk[j] + j += 1 end + k += 1 end end - return c + c end n = 300 -if ARGV.length >= 1 +if ARGV.length > 0 n = ARGV[0].to_i end n = n / 2 * 2 @@ -39,5 +42,5 @@ def matmul(a, b) a = matgen(n) b = matgen(n) c = matmul(a, b) - #puts c[n/2][n/2] + # puts c[n / 2][n / 2] end diff --git a/benchmarks/nqueens.rb b/benchmarks/nqueens.rb index 2a5d28b2..42505f64 100644 --- a/benchmarks/nqueens.rb +++ b/benchmarks/nqueens.rb @@ -1,27 +1,28 @@ require_relative '../harness/loader' def nq_solve(n) - a = Array.new(n) { -1 } - l = Array.new(n) { 0 } - c = Array.new(n) { 0 } - r = Array.new(n) { 0 } - y0 = (1<= 0 do + + while k >= 0 y = (l[k] | c[k] | r[k]) & y0 - if (y ^ y0) >> (a[k] + 1) != 0 then + if (y ^ y0) >> (a[k] + 1) != 0 i = a[k] + 1 - while i < n and (y & 1<>1 + l[k] = (l[k-1] | z) << 1 + c[k] = c[k-1] | z + r[k] = (r[k-1] | z) >> 1 else m += 1 k -= 1 @@ -31,11 +32,12 @@ def nq_solve(n) k -= 1 end end - return m + + m end n = 12 -if ARGV.length() > 0 then +if ARGV.length > 0 n = ARGV[0].to_i end diff --git a/benchmarks/sudoku.rb b/benchmarks/sudoku.rb index 8a95967d..2b90eb33 100644 --- a/benchmarks/sudoku.rb +++ b/benchmarks/sudoku.rb @@ -1,103 +1,191 @@ require_relative '../harness/loader' -def sd_genmat() +def sd_genmat mr = Array.new(324) { [] } - mc = Array.new(729) { [] } + mc = Array.new(729) { Array.new(4, 0) } r = 0 - (0...9).each do |i| - (0...9).each do |j| - (0...9).each do |k| - mc[r] = [ 9 * i + j, (i/3*3 + j/3) * 9 + k + 81, 9 * i + k + 162, 9 * j + k + 243 ] + + i = 0 + while i < 9 + j = 0 + while j < 9 + k = 0 + while k < 9 + mcr = mc[r] + mcr[0] = 9 * i + j + mcr[1] = (i / 3 * 3 + j / 3) * 9 + k + 81 + mcr[2] = 9 * i + k + 162 + mcr[3] = 9 * j + k + 243 r += 1 + k += 1 end + j += 1 end + i += 1 end - (0...729).each do |r| - (0...4).each do |c2| - mr[mc[r][c2]].push(r) + + r2 = 0 + while r2 < 729 + c2 = 0 + while c2 < 4 + mr[mc[r2][c2]] << r2 + c2 += 1 end + r2 += 1 end - return mr, mc + + [mr, mc] end -def sd_update(mr, mc, sr, sc, r, v) - min, min_c = 10, 0 - (0...4).each do |c2| - if v > 0 then sc[mc[r][c2]] += 128 - else sc[mc[r][c2]] -= 128 end +def sd_update_forward(mr, mc, sr, sc, r) + min = 10 + min_c = 0 + mcr = mc[r] + + c2 = 0 + while c2 < 4 + sc[mcr[c2]] += 128 + c2 += 1 end - (0...4).each do |c2| - c = mc[r][c2] - if v > 0 then - (0...9).each do |r2| - rr = mr[c][r2] - sr[rr] += + 1 - if sr[rr] == 1 then - p = mc[rr] - sc[p[0]] -= 1; sc[p[1]] -= 1; sc[p[2]] -= 1; sc[p[3]] -= 1 - if sc[p[0]] < min then min, min_c = sc[p[0]], p[0] end - if sc[p[1]] < min then min, min_c = sc[p[1]], p[1] end - if sc[p[2]] < min then min, min_c = sc[p[2]], p[2] end - if sc[p[3]] < min then min, min_c = sc[p[3]], p[3] end + + c2 = 0 + while c2 < 4 + mrc = mr[mcr[c2]] + r2 = 0 + while r2 < 9 + rr = mrc[r2] + if (sr[rr] += 1) == 1 + p = mc[rr] + cc2 = 0 + while cc2 < 4 + cc = p[cc2] + if (sc[cc] -= 1) < min + min = sc[cc] + min_c = cc + end + cc2 += 1 end end - else - (0...9).each do |r2| - rr = mr[c][r2] - sr[rr] -= 1 - if sr[rr] == 0 then - p = mc[rr] - sc[p[0]] += 1; sc[p[1]] += 1; sc[p[2]] += 1; sc[p[3]] += 1 - end + r2 += 1 + end + c2 += 1 + end + + [min, min_c] +end + +def sd_update_reverse(mr, mc, sr, sc, r) + c2 = 0 + while c2 < 4 + sc[mc[r][c2]] -= 128 + c2 += 1 + end + + c2 = 0 + while c2 < 4 + c = mc[r][c2] + r2 = 0 + while r2 < 9 + rr = mr[c][r2] + if (sr[rr] -= 1) == 0 + p = mc[rr] + + sc[p[0]] += 1 + sc[p[1]] += 1 + sc[p[2]] += 1 + sc[p[3]] += 1 end + r2 += 1 end + c2 += 1 end - return min, min_c end def sd_solve(mr, mc, s) - ret, sr, sc, hints = [], Array.new(729) { 0 }, Array.new(324) { 9 }, 0 - (0...81).each do |i| - a = (s[i].chr >= '1' and s[i].chr <= '9')? s[i].ord - 49 : -1 - if a >= 0 then sd_update(mr, mc, sr, sc, i * 9 + a, 1); hints += 1 end + sr = Array.new(729, 0) + sc = Array.new(324, 9) + hints = 0 + + i = 0 + while i < 81 + char = s[i] + a = (char >= '1' && char <= '9') ? char.ord - 49 : -1 + if a >= 0 + sd_update_forward(mr, mc, sr, sc, i * 9 + a) + hints += 1 + end + i += 1 end - cr, cc = Array.new(81) { -1 }, Array.new(81) { 0 } - i, min, dir = 0, 10, 1 - loop do - while i >= 0 and i < 81 - hints do - if dir == 1 then - if min > 1 then - (0...324).each do |c| - if sc[c] < min then - min, cc[i] = sc[c], c - if min < 2 then break end + + cr = Array.new(81, -1) + cc = Array.new(81, 0) + i = 0 + min = 10 + dir = 1 + + while true + while i >= 0 && i < 81 - hints + if dir == 1 + if min > 1 + c = 0 + while c < 324 + if sc[c] < min + min = sc[c] + cc[i] = c + break if min < 2 end + c += 1 end end - if min == 0 or min == 10 then cr[i], dir, i = -1, -1, i - 1 end + + if min == 0 || min == 10 + cr[i] = dir = -1 + i -= 1 + end end + c = cc[i] - if dir == -1 and cr[i] >= 0 then sd_update(mr, mc, sr, sc, mr[c][cr[i]], -1) end - r2_ = 9 - (cr[i]+1...9).each do |r2| - if sr[mr[c][r2]] == 0 then r2_ = r2; break end + if dir == -1 && cr[i] >= 0 + sd_update_reverse(mr, mc, sr, sc, mr[c][cr[i]]) + end + + r2 = cr[i] + 1 + while r2 < 9 && sr[mr[c][r2]] != 0 + r2 += 1 + end + + if r2 < 9 + min, cc[i + 1] = sd_update_forward(mr, mc, sr, sc, mr[c][r2]) + cr[i] = r2 + dir = 1 + i += 1 + else + cr[i] = -1 + dir = -1 + i -= 1 end - if r2_ < 9 then - min, cc[i+1] = sd_update(mr, mc, sr, sc, mr[c][r2_], 1) - cr[i], dir, i = r2_, 1, i + 1 - else cr[i], dir, i = -1, -1, i - 1 end end - if i < 0 then break end - o = [] - (0...81).each do |j| o.push(s[j].ord - 48) end - (0...i).each do |j| + + break if i < 0 + + o = Array.new(81, 0) + j = 0 + while j < 81 + o[j] = s[j].ord - 48 + j += 1 + end + + j = 0 + while j < i r = mr[cc[j]][cr[j]] - o[r/9] = r % 9 + 1 + o[r / 9] = r % 9 + 1 + j += 1 end - ret.push(o) - i, dir = i - 1, -1 + o.join # puts o.join + + i -= 1 + dir = -1 end - return ret end hard20 = [ @@ -122,14 +210,21 @@ def sd_solve(mr, mc, s) "1.......2.9.4...5...6...7...5.3.4.......6........58.4...2...6...3...9.8.7.......1", ".....1.2.3...4.5.....6....7..2.....1.8..9..3.4.....8..5....2....9..3.4....67....." ] -mr, mc = sd_genmat() + +mr, mc = sd_genmat + +n = 4 +if ARGV.length > 0 + n = ARGV[0].to_i +end run_benchmark(20) do - n = 4 - (0...n).each do |i| - hard20.each do |l| - ret = sd_solve(mr, mc, l) - ret.each do |s| s.join end + i = 0 + while i < n + hard20.each do |line| + sd_solve(mr, mc, line) + # puts "" end + i += 1 end end