1時間以内に解けなければプログラマ失格となってしまう

という問題があったので最後の問題だけRubyで解いてみた。



https://blog.svpino.com/2015/05/07/five-programming-problems-every-software-engineer-should-be-able-to-solve-in-less-than-1-hourblog.svpino.com

問題5
1,2,…,9の数をこの順序で、”+”、”-“、またはななにもせず結果が100となるあらゆる組合せを出力するプログラムを記述せよ。
とのこと

書いたコードはこんな感じ。

def make_num(now_num, sum, result)
  now_num.times do |n|
    num = ((now_num - n)..now_num).to_a.join.to_i

    if n + 1 == now_num
      print_result ([num] + result) if sum + num == 100
    else
      make_num(now_num - n - 1, sum + num, ['+', num] + result)
      make_num(now_num - n - 1, sum - num, ['-', num] + result)
    end
  end
end

def print_result(result)
  puts result.join(' ')
end

make_num(9, 0, [])

かかった時間は28分。トップにマイナス使っちゃいけないってこと知らずに作って後で手直ししたとか言い訳はある。