「1時間以内に解けなければソフトウェアエンジニア失格という5つの問題」に挑戦

「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)