Time-stamp: <03/09/07 18:07:51 kawasan>

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


概要

/.Jだったと思うが、「1と1と9と9を適当に四則演算して10を求める」という問題の話がありそれを探すのにプログラムでシラミ潰しに探したとか書いてあった。 これはそれの後追い企画です。(笑

取り合えず、自分なりに適当にプログラムして探した。 でも、これでちゃんと探索プログラムになっているのかは、超不明。(^^;)


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

取り合えず、Rubyで作りました。
file : search1199.rb
#!/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
が答えとなりました。(笑