Correction: found a little bug on my script. The checking row <= 1 || col <= 1 is "too much". These two checking should remove, because it fail for doing something like fold( 1, 2, 'L' ) On 1/23/06, David Tran <email55555 / gmail.com> wrote: > def fold(row, col, operations) > > def t2b(table) > t1 = table[0...table.size/2].reverse > t2 = table[table.size/2..-1] > row = t1.size > col = t1[0].size > row.times { |r| col.times { |c| t2[r][c] = t1[r][c].reverse + t2[r][c] } } > t2 > end > > def b2t(table) > t2b(table.reverse).reverse > end > > def l2r(table) > t2b(table.transpose).transpose > end > > def r2l(table) > t2b(table.transpose.reverse).reverse.transpose > end > > if row <= 1 || > col <= 1 || > 2**operations.size != row * col || > operations =~ /[^TBLR]/ || > 2**operations.gsub(/[LR]/,'').size != row > raise "Error: parameters are not correct." > end > > index = 0 > table = Array.new(row) { Array.new(col) { [index += 1] } } > > operations.each_byte do |op| > table = case op > when ?T : t2b(table) > when ?B : b2t(table) > when ?L : l2r(table) > when ?R : r2l(table) > else raise "Error: Invalid fold operation." > end > end > > table[0][0] > end > > #========================================================================# > > def check_fold(row, col, result) > > # find all combinations with binary 0 for row and 1 for column operation > def all_orders(r, c) # > return [2**c - 1] if (r <= 0) # c bits of 1 is 2**c-1 > return [0] if (c <= 0) # r bits of 0 is 0 > table = [] > all_orders(r-1,c).each { |t| table << ((t << 1) + 0) } > all_orders(r,c-1).each { |t| table << ((t << 1) + 1) } > table > end > > if row <= 1 || > col <= 1 || > row * col != result.size || > 2 ** (Math.log(row)/Math.log(2)).to_i != row || > 2 ** (Math.log(col)/Math.log(2)).to_i != col > raise "Error: Parameters are not correct." > end > > r = Integer(Math.log(row) / Math.log(2)) > c = Integer(Math.log(col) / Math.log(2)) > all_rc_orders = all_orders(r,c) > > row.times do |tb_operation| > col.times do |lr_operation| > all_rc_orders.each do |order| > operations = '' > tb_op = tb_operation > lr_op = lr_operation > (r+c).times do > if (order & 1 == 0) > operations += (tb_op & 1 == 0) ? 'T' : 'B' > tb_op >>= 1 > else > operations += (lr_op & 1 == 0) ? 'L' : 'R' > lr_op >>= 1 > end > order >>= 1 > end > return operations if fold(row, col, operations) == result > end > end > end > "No solution." > end > -- www.doublegifts.com