def f(r, c, label = 0) (0..r + c - 2).each_with_object((1..r).map{[]}) do |k, a| (0...r).method([:reverse_each, :each][k % 2]).call do |i| (0...c).each {|j| a[i][j] = (label += 1) if i + j == k} end end end p [[3, 3], [4, 2], [3, 5], [1, 8]].map{|r, c| [r, c, f(r, c)]}
Standard input is empty
[[3, 3, [[1, 2, 6], [3, 5, 7], [4, 8, 9]]], [4, 2, [[1, 2], [3, 5], [4, 6], [7, 8]]], [3, 5, [[1, 2, 6, 7, 12], [3, 5, 8, 11, 13], [4, 9, 10, 14, 15]]], [1, 8, [[1, 2, 3, 4, 5, 6, 7, 8]]]]