def mask \ s, m; (0 ... s.size).find_all {|k| 0 != m[k] }.map {|k| s[k] } end; def poss2 \ v1, v2, s1, s2; yield v1 + v2, "(" + s1 + " + " + s2 + ")"; yield v1 - v2, "(" + s1 + " - " + s2 + ")"; yield v1 * v2, "(" + s1 + " * " + s2 + ")"; 1e-8 < v2.abs and yield Float(v1) / v2, "(" + s1 + " / " + s2 + ")"; s1 =~ /^\d+$/ && s2 =~ /^\d$/ and yield v1 + 10*v2, s1 + s2; end; def poss \ v, s; if 1 == v.size; yield v.first, s.first; else (1 ... (1<## -10 = (4 - (2 + (5 + 7))) -10 = (4 - (2 + (7 + 5))) -10 = (4 - (5 + (2 + 7))) -10 = (4 - (5 + (7 + 2))) -10 = (4 - ((2 + 5) + 7)) -10 = (4 - ((5 + 2) + 7)) -10 = (4 - (7 + (2 + 5))) -10 = (4 - (7 + (5 + 2))) -10 = (4 - ((2 + 7) + 5)) -10 = (4 - ((7 + 2) + 5)) -10 = (4 - ((5 + 7) + 2)) -10 = (4 - ((7 + 5) + 2)) -10 = ((4 - 2) - (5 + 7)) -10 = ((4 - 2) - (7 + 5)) -10.0 = ((4 / 2) - (5 + 7)) -10.0 = ((4 / 2) - (7 + 5)) -10 = (5 - ((2 * 4) + 7)) -10 = (5 - ((4 * 2) + 7)) -10 = (5 - (7 + (2 * 4))) -10 = (5 - (7 + (4 * 2))) -10.0 = (5 / ((7 / 2) - 4)) -10 = ((4 - 5) - (2 + 7)) -10 = ((4 - 5) - (7 + 2)) -10 = ((4 - (2 + 5)) - 7) -10 = ((4 - (5 + 2)) - 7) -10 = (((4 - 2) - 5) - 7) -10.0 = (((4 / 2) - 5) - 7) -10 = ((5 - (2 * 4)) - 7) -10 = ((5 - (4 * 2)) - 7) -10 = (((4 - 5) - 2) - 7) -10 = ((4 - 7) - (2 + 5)) -10 = ((4 - 7) - (5 + 2)) -10 = ((4 - (2 + 7)) - 5) -10 = ((4 - (7 + 2)) - 5) -10 = (((4 - 2) - 7) - 5) -10.0 = (((4 / 2) - 7) - 5) -10 = (((4 - 7) - 2) - 5) -10 = ((5 - 7) - (2 * 4)) -10 = ((5 - 7) - (4 * 2)) -10 = ((4 - (5 + 7)) - 2) -10 = ((4 * (5 - 7)) - 2) -10 = ((4 - (7 + 5)) - 2) -10 = (((4 - 5) - 7) - 2) -10 = (((4 - 7) - 5) - 2) -10 = (((5 - 7) * 4) - 2)