1時間以内に解けなければプログラマ失格となってしまう5つの問題なんてのがあるんですね。
確かに1,2,3に比べて4,5の差は大きいような気がします。
rubyでやってみました。
問題4
echo 5 2 1 9 50 56 | ruby -e "puts gets.split(/\s+/).permutation.map(&:join).max"
問題5
def gen_pattern(depth, size, acc = [])
if depth >= size
exp = (1 .. (size + 1)).zip(acc).flatten.join.gsub(/ /, "").gsub(/(\+|-)/, ' \1 ')
puts exp if eval(exp) == 100
else
[" ", "+", "-"].each do |op|
gen_pattern(depth + 1, size, acc + [op])
end
end
end
gen_pattern(0, 8)
2015/05/23追記
問題4でpermutation使ってる時点で反則気味なので、問題5も同じ方針で。
puts [" ", "+", "-"].repeated_permutation(8).map{|e|
(1 .. 9).zip(e).flatten.join.gsub(/ /, '').gsub(/(\+|-)/, ' \1 ')
}.select {|e|
eval(e) == 100
}
2015/05/26追記
teratailでこの問題の解き方を質問している人がいてて、問題5に関して、
私とほぼ同じ方針で解いておられた方が、入れ子の配列をjoinするときにflattenは不要、と
書いてあって試してみると
[["1", "2", ["3"]], ["4", "5"]].join
#=> "12345"
と、確かに不要でした。
どうやってるんだろうと思ってRubyのソースを確認してみると、
要素が配列だと再帰的に潜っていくというような処理になってるみたいですね。
処理を追ってみると、再帰的な配列になってるとエラーにする処理が書かれてた(array.c)ので、
そんな配列どう作るんだ?と思っていろいろ試してみると、こんなことが出来るんですね。
irb(main):001:0> ary = [1, 2, 3]
=> [1, 2, 3]
irb(main):002:0> ary[0] = ary
=> [[...], 2, 3]
[...]
なる表記は初めて見ました。確かに永遠に潜って行けるようです。
joinすると確かにエラーになりました。
irb(main):003:0> ary[0][1]
=> 2
irb(main):004:0> ary[0][0][1]
=> 2
irb(main):005:0> ary[0][0][0][1]
=> 2
irb(main):006:0> ary.join
ArgumentError: recursive array join
from (irb):6:in `join'
from (irb):6
from D:/Ruby21-x64/bin/irb:11:in `<main>'
あまり使いどころは思いつきませんでしたが、面白いですね。
というわけで、問題5はこう書けますね。
puts [" ", "+", "-"].repeated_permutation(8).map{|e|
(1 .. 9).zip(e).join.gsub(/ /, '').gsub(/(\+|-)/, ' \1 ')
}.select {|e|
eval(e) == 100
}