[QUIZ] Getting to 100 (#119)

# http://davidtran.doublegifts.com/blog/?p=11

# Reuse permutations method on my Ruby Quiz (#106) Chess960 solution.
def permutations(elements)
  return [elements] if elements.size <= 1
  result = []
  elements.uniq.each do |p|
    _elements = elements.dup
    _elements.delete_at(elements.index(p))
    permutations(_elements).each do |perm|
      result << (perm << p)
    end
  end
  result
end

def find(digits, operators, target)
  raise "Error: More operators than digits." if (digits.size <= operators.size)
  operators[digits.size - 2] = nil if (operators.size != digits.size - 1)
  found = 0
  stars = "*" * 25
  perm = permutations(operators)
  perm.each do |operator|
    expression = digits.zip(operator).flatten.join
    value = eval(expression)
    if value == target
      found += 1
      puts stars
      puts "#{expression} = #{value}"
      puts stars
    else
      puts "#{expression} = #{value}"
    end
  end
  puts "#{perm.size} possible equations tested."
  puts "#{found} equations satisfied."
end

if ($0 == __FILE__)
  digits = ARGV[0] || "123456789"
  operators = ARGV[1] || "+--"
  target = ARGV[2] || "100"

  if (digits =~ /[^1-9]/ || operators =~ /[^-+*\/]/)
    puts "Usage: #$0 digits operators target"
    exit
  end

  find(digits.split(//), operators.split(//), target.to_i)
end

for pretty output: change the line which call find method to be:

find(digits.split(//), operators.split(//).map{|e| " #{e} "}, target.to_i)

···

On 4/10/07, David Tran <email55555@gmail.com> wrote:

# http://davidtran.doublegifts.com/blog/?p=11

# Reuse permutations method on my Ruby Quiz (#106) Chess960 solution.
def permutations(elements)
  return [elements] if elements.size <= 1
  result =
  elements.uniq.each do |p|
    _elements = elements.dup
    _elements.delete_at(elements.index(p))
    permutations(_elements).each do |perm|
      result << (perm << p)
    end
  end
  result
end

def find(digits, operators, target)
  raise "Error: More operators than digits." if (digits.size <= operators.size)
  operators[digits.size - 2] = nil if (operators.size != digits.size - 1)
  found = 0
  stars = "*" * 25
  perm = permutations(operators)
  perm.each do |operator|
    expression = digits.zip(operator).flatten.join
    value = eval(expression)
    if value == target
      found += 1
      puts stars
      puts "#{expression} = #{value}"
      puts stars
    else
      puts "#{expression} = #{value}"
    end
  end
  puts "#{perm.size} possible equations tested."
  puts "#{found} equations satisfied."
end

if ($0 == __FILE__)
  digits = ARGV[0] || "123456789"
  operators = ARGV[1] || "+--"
  target = ARGV[2] || "100"

  if (digits =~ /[^1-9]/ || operators =~ /[^-+*\/]/)
    puts "Usage: #$0 digits operators target"
    exit
  end

  find(digits.split(//), operators.split(//), target.to_i)
end