Thanks for another fun Ruby Quiz. Here is my take on it, I did not
see other solutions that used String formatting to generate the
expressions.
class String
def unique_permutations
# modified to get unique permutations
# from http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/139858
# which says it was inspired by a RubyQuiz! :)
return [self] if self.length < 2
perms = Hash.new
0.upto(self.length - 1) do |n|
#rest = self.split('')
rest = self.split(//u) # for UTF-8 encoded strings
picked = rest.delete_at(n)
rest.join.unique_permutations.each { |x| perms[picked + x] =
nil }
end
perms.keys
end
end
digits = ARGV[0]
ops = ARGV[1]
target = ARGV[2].to_i
# pad ops list with spaces to match the number of slots between the
digits
ops = ops + " " * (digits.size - ops.size - 1)
# build a format string with slots between the digits
digits = digits.split("").join("%s")
operator_perms = ops.unique_permutations
operator_perms.each do |p|
# build expression by inserting the ops into the format string,
# after converting spaces to empty strings
exp = digits % p.split("").map{|x|x.chomp(" ")}
val = eval(exp)
puts "*******************" if val==target
puts exp + " = " + val.to_s
puts "*******************" if val==target
end
puts
puts "%d possible equations tested" % operator_perms.size
Regards,
Paul