ちょっと、というか結構古いけど 「ソフトウェアエンジニアならば1時間以内に解けなければいけない5つの問題」 というのを見つけた。
cf. 1時間以内に解けなければプログラマ失格となってしまう5つの問題が話題に – SOFTANTENNA BLOG
大元のページはもうなくなっているようだけど、上のページに問題が載っているので Ruby でやってみた。
問題1
forループ、whileループ、および再帰を使用して、リスト内の数字の合計を計算する3つの関数を記述せよ。
def solv1(ary)
result = 0
for i in ary
result += i
end
result
end
def solv2(ary)
result = 0
while ary.size > 0
result += ary.shift
end
result
end
def solv3(ary)
if ary.empty?
0
else
x = ary.shift
x + solv3(ary)
end
end
puts solv1([1,2,3,4,5])
puts solv2([1,2,3,4,5])
puts solv3([1,2,3,4,5])
問題2
交互に要素を取ることで、2つのリストを結合する関数を記述せよ。例えば [a, b, c]と[1, 2, 3]という2つのリストを与えると、関数は [a, 1, b, 2, c, 3]を返す。
def solv(a1, a2)
result = []
until a1.empty?
result << a1.shift
result << a2.shift
end
result
end
p solv(['a', 'b', 'c'], [1, 2, 3])
問題3
最初の100個のフィボナッチ数のリストを計算する関数を記述せよ。定義では、フィボナッチ数列の最初の2つの数字は0と1で、次の数は前の2つの合計となる。例えば最初の10個のフィボナッチ数列は、0, 1, 1, 2, 3, 5, 8, 13, 21, 34となる。
require 'pp'
def fib(a, b, acc, n)
if n == 0
acc
else
acc << a
fib(b, a + b, acc, n - 1)
end
end
def solv
fib(0, 1, [], 100)
end
pp solv
問題4
正の整数のリストを与えられたとき、数を並び替えて可能な最大数を返す関数を記述せよ。例えば、[50, 2, 1, 9]が与えられた時、95021が答えとなる。
def solv(ary)
ary.map{|x| x.to_s }.sort.reverse.join("").to_i
end
puts solv([50, 2, 1, 9])
問題5
1,2,…,9の数をこの順序で、”+”、”-“、またはななにもせず結果が100となるあらゆる組合せを出力するプログラムを記述せよ。例えば、1 + 2 + 34 – 5 + 67 – 8 + 9 = 100となる 。
def combi(ary)
if ary.size == 1
ary
else
result = []
x = ary.shift
c = combi(ary)
["+", "-", ""].each do |op|
result += c.map{|e| x + op + e }
end
result
end
end
def solv
a = [1,2,3,4,5,6,7,8,9].map{|n| n.to_s }
result = []
combi(a).each do |e|
if eval(e) == 100
result << e
end
end
result
end
solv.each do |e|
puts e + " = 100"
end
俺はソフトウェアエンジニアじゃないけど、どうにか1時間以内に5問ともできた。一番難しかったのは問題5だけど、意外にてこずったのは問題1。Ruby の for の使い方(というか for があること自体)を忘れていて、結局ここだけググった。