Tue Feb 11 23:59:39 2014

1と1と5と8を適当に四則演算して10を求める


概要

GoolgeのCMで「1158で10を作る」という問題の話がありそれを探すプログラム。
相変わらず、適当なアルゴリズムだ。(笑


探索に使用したプログラム

またRubyで作りました。
file : search1158.rb
#!/usr/bin/ruby -Ke
#time-stamp: <03/09/02 17:30:57 kawasan>
#Time-stamp: <03/09/03 01:48:40 kawasan>
#
# 問題「1と1と5と8、この4つを適当に四則演算して10を作れ。」を
# 力業で導くスクリプト
#
# Usage : search1158.rb | sort | uniq | grep ' = 10'

def math_(d1, m1, d2, m2, d3, m3, d4)
  str = sprintf( "%s %s %s %s %s %s %s", d1, m1, d2, m2, d3, m3, d4 )
  printf("%s = ", str)
  str_cmd = sprintf( "echo 'scale=2; %s' | bc", str )
  puts `#{str_cmd}`

  str = sprintf( "(%s %s %s) %s %s %s %s", d1, m1, d2, m2, d3, m3, d4 )
  printf("%s = ", str)
  str_cmd = sprintf( "echo 'scale=2; %s' | bc", str )
  puts `#{str_cmd}`

  str = sprintf( "(%s %s %s %s %s) %s %s", d1, m1, d2, m2, d3, m3, d4 )
  printf("%s = ", str)
  str_cmd = sprintf( "echo 'scale=2; %s' | bc", str )
  puts `#{str_cmd}`

  str = sprintf( "%s %s (%s %s %s) %s %s", d1, m1, d2, m2, d3, m3, d4 )
  printf("%s = ", str)
  str_cmd = sprintf( "echo 'scale=2; %s' | bc", str )
  puts `#{str_cmd}`

  str = sprintf( "%s %s (%s %s %s %s %s)", d1, m1, d2, m2, d3, m3, d4 )
  printf("%s = ", str)
  str_cmd = sprintf( "echo 'scale=2; %s' | bc", str )
  puts `#{str_cmd}`

  str = sprintf( "%s %s %s %s (%s %s %s)", d1, m1, d2, m2, d3, m3, d4 )
  printf("%s = ", str)
  str_cmd = sprintf( "echo 'scale=2; %s' | bc", str )
  puts `#{str_cmd}`
end

def math(str)
  pat = "+-*/"

  d1 = str[0] - ?0
  d2 = str[1] - ?0
  d3 = str[2] - ?0
  d4 = str[3] - ?0

  pat.each_byte {|p1|
    pat.each_byte {|p2|
      pat.each_byte {|p3|
        m1 = sprintf("%c", p1)
        m2 = sprintf("%c", p2)
        m3 = sprintf("%c", p3)
        math_(d1, m1, d2, m2, d3, m3, d4)
      }
    }
  }
end

math("1158")
math("1185")
math("1581")
math("1851")
math("5811")
math("8511")
math("5118")
math("8115")

puts("--- EOF ---")


実行結果

cyobi2:~/tmp$ search1158.rb | sort | uniq | grep ' = 10'
Runtime error (func=(main), adr=16): Divide by zero
Runtime error (func=(main), adr=16): Divide by zero
Runtime error (func=(main), adr=17): Divide by zero
Runtime error (func=(main), adr=17): Divide by zero
Runtime error (func=(main), adr=16): Divide by zero
Runtime error (func=(main), adr=16): Divide by zero
Runtime error (func=(main), adr=17): Divide by zero
Runtime error (func=(main), adr=17): Divide by zero
Runtime error (func=(main), adr=13): Divide by zero
Runtime error (func=(main), adr=13): Divide by zero
Runtime error (func=(main), adr=13): Divide by zero
Runtime error (func=(main), adr=13): Divide by zero
Runtime error (func=(main), adr=13): Divide by zero
Runtime error (func=(main), adr=13): Divide by zero
Runtime error (func=(main), adr=13): Divide by zero
Runtime error (func=(main), adr=13): Divide by zero
5 / (1 + 1) + 8 = 10.50
8 + 5 / (1 + 1) = 10.50
8 / (1 - 1 / 5) = 10.00

と、いうわけで、
8 / (1 - 1 / 5) = 10
が答えとなりました。(笑