取り合えず、自分なりに適当にプログラムして探した。 でも、これでちゃんと探索プログラムになっているのかは、超不明。(^^;)
#!/usr/bin/ruby -Ke # # 問題「1と1と9と9、この4つを適当に四則演算して10を作れ。」を # 力業で導くスクリプト # # Usage : search1199.rb | sort | uniq | grep " = 10.0" dat1 = "1199" dat2 = "+-*/" for ka in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] dat1.each_byte {|d1| dat2.each_byte {|d2| dat1.each_byte {|d3| dat2.each_byte {|d4| dat1.each_byte {|d5| dat2.each_byte {|d6| dat1.each_byte {|d7| if ( ( d1 + d3 + d5 + d7 - ( ?0 * 4 ) ) == 20 ) then case ka when 0 str = sprintf( "%c.0 %c %c.0 %c %c.0 %c %c.0", d1, d2, d3, d4, d5, d6, d7 ) when 1 str = sprintf( "( %c.0 %c %c.0 ) %c %c.0 %c %c.0", d1, d2, d3, d4, d5, d6, d7 ) when 2 str = sprintf( "%c.0 %c ( %c.0 %c %c.0 ) %c %c.0", d1, d2, d3, d4, d5, d6, d7 ) when 3 str = sprintf( "%c.0 %c %c.0 %c ( %c.0 %c %c.0 )", d1, d2, d3, d4, d5, d6, d7 ) when 4 str = sprintf( "( %c.0 %c %c.0 %c %c.0 ) %c %c.0", d1, d2, d3, d4, d5, d6, d7 ) when 5 str = sprintf( "%c.0 %c ( %c.0 %c %c.0 %c %c.0 )", d1, d2, d3, d4, d5, d6, d7 ) when 6 str = sprintf( "( ( %c.0 %c %c.0 ) %c %c.0 ) %c %c.0", d1, d2, d3, d4, d5, d6, d7 ) when 7 str = sprintf( "( %c.0 %c ( %c.0 %c %c.0 ) ) %c %c.0", d1, d2, d3, d4, d5, d6, d7 ) when 8 str = sprintf( "%c.0 %c ( ( %c.0 %c %c.0 ) %c %c.0 )", d1, d2, d3, d4, d5, d6, d7 ) when 9 str = sprintf( "%c.0 %c ( %c.0 %c ( %c.0 %c %c.0 ) )", d1, d2, d3, d4, d5, d6, d7 ) end printf( "%s = %s\n", str, "#{eval(str)}" ); else end } } } } } } } end
$ search1199.rb | sort | uniq | grep " = 10.0" ( ( 1.0 / 9.0 ) + 1.0 ) * 9.0 = 10.0 ( 1.0 + ( 1.0 / 9.0 ) ) * 9.0 = 10.0 ( 1.0 + 1.0 / 9.0 ) * 9.0 = 10.0 ( 1.0 / 9.0 + 1.0 ) * 9.0 = 10.0 9.0 * ( ( 1.0 / 9.0 ) + 1.0 ) = 10.0 9.0 * ( 1.0 + ( 1.0 / 9.0 ) ) = 10.0 9.0 * ( 1.0 + 1.0 / 9.0 ) = 10.0 9.0 * ( 1.0 / 9.0 + 1.0 ) = 10.0
と、いうわけで、
( 1 / 9 + 1 ) * 9 = 10
が答えとなりました。(笑