#!/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
が答えとなりました。(笑