Last friday one of my friend gave me a math challenge. You've given four numbers 6, 6, 5 and 2, you need to find 3 math operations to get 17 as a result. You have to use all four numbers and only once each. Order of numbers can be any.
I couldn't figure it out in my head so have to write a ruby script to iterate over all combinations, which turned out as a great coding exercise.
Solution
final_result = 17
numbers = [6, 6, 5, 2]
numbers.map!(&:to_f)
operations = [:+, :-, :*, :/]
operation_combinations = []
4.times do |a|
4.times do |b|
4.times do |c|
operation_combinations << [operations[a-1], operations[b-1], operations[c-1]]
end
end
end
iteration_count = 0
results = []
numbers.permutation do |nums|
operation_combinations.each do |ops|
iteration_count += 1
begin
result = nums.each.with_index.reduce(nil) do |memo, (num, index)|
if memo.nil?
num
else
op = ops[index - 1]
memo.send(op, num)
end
end
if result == final_result
results << [nums, ops]
end
rescue ZeroDivisionError
0
end
end
end
puts iteration_count
puts results
Final Result
(5 / 6 + 2) * 6 = 17