「1時間以内に解けなければソフトウェアエンジニア失格という5つの問題」に挑戦してみた。
数年前に話題となった「問題」なのだが、こういう「腕試し」は嫌いじゃない。
特殊なライブラリやモジュールは極力使わず、どの言語でも実装可能なシンプルかつエレガント(?)なアルゴリズムを目指してみた。
実演動画はコチラ
以下、今回書いた各問題のコードを掲載しておきます。
問題1
forループ、whileループ、および再帰を使用して、リスト内の数字の合計を計算する3つの関数を記述せよ。
##### リスト内の数を合計する関数3種
numList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def totalFor(): # for
sum = 0
for i in numList:
sum += i
return sum
def totalWhile(): # while
sum = 0
i = 0
while i<len(numList):
sum += numList[i]
i += 1
return sum
def totalRecursion(i): # 再帰
if i>len(numList)-1 :
return 0
return numList[i]+totalRecursion(i+1)
##### 実行
print(totalFor(), "For")
print(totalWhile(), "While")
print(totalRecursion(0), "再帰")
問題2
交互に要素を取ることで、2つのリストを結合する関数を記述せよ。例えば [a, b, c]と[1, 2, 3]という2つのリストを与えると、関数は [a, 1, b, 2, c, 3]を返す。
##### 2つのリストを交互に結合する #####
arrayA = ["apple", "banana", "cherry"]
arrayB = ["りんご", "バナナ", "さくらんぼ", "柿", "桃"]
def join():
arrayJoin = []
count = max(len(arrayA), len(arrayB))
for i in range(count):
if i<len(arrayA):
arrayJoin.append(arrayA[i])
if i<len(arrayB):
arrayJoin.append(arrayB[i])
return arrayJoin
# 実行
print(join())
問題3
最初の100個のフィボナッチ数のリストを計算する関数を記述せよ。定義では、フィボナッチ数列の最初の2つの数字は0と1で、次の数は前の2つの合計となる。例えば最初の10個のフィボナッチ数列は、0, 1, 1, 2, 3, 5, 8, 13, 21, 34となる。
##### フィボナッチ数100番目までのリスト #####
def fibonacci(a, b):
fibo = [a, b]
for i in range(2, 100):
fibo.append(fibo[i-2] + fibo[i-1])
return fibo
# 実行
array = fibonacci(0, 1)
j = 1
for i in array:
print(j, "番目:", i)
j += 1
問題4
正の整数のリストを与えられたとき、数を並び替えて可能な最大数を返す関数を記述せよ。例えば、[50, 2, 1, 9]が与えられた時、95021が答えとなる。
##### 並べ替えて最大数を作る #####
numList = [50, 2, 1, 9, 53]
def maximum():
strList = []
for i in numList:
strList.append(str(i))
strList = sorted(strList, reverse=True)
for i in range(len(strList)-1):
if strList[i]+strList[i+1]<strList[i+1]+strList[i]:
strList[i],strList[i+1] = strList[i+1],strList[i]
maxNum = ""
for i in strList:
maxNum += i
return int(maxNum)
# 実行
print(maximum())
問題5
1,2,…,9の数をこの順序で、“+”、“-”、または何もせず結果が100となるあらゆる組合せを出力するプログラムを記述せよ。例えば、1 + 2 + 34 – 5 + 67 – 8 + 9 = 100となる。
※正直、このコードは・・・ダサい((+_+))
まぁ、総当たりです。
時間無制限だったら、再帰とか使ってもっとエレガントなコードでやれた・・・かも?
##### 100を作る #####
def makeNumber(target):
result = []
for i in range(3**8):
temp = [1]
for j in range(2, 10):
if i%3==0 :
lastNum = temp[-1]
temp[-1] = lastNum*10 + (j if (lastNum>0) else -j)
elif i%3==1 :
temp.append(j)
elif i%3==2 :
temp.append(-j)
i //= 3
if sum(temp)==target :
ans = ""
for num in temp:
ans += str(num) if (num<0 or num==temp[0]) else "+"+str(num)
result.append(ans)
return result
# 実行
result = makeNumber(100)
for i in result:
print(i)