2

私はこの関数を書きました。うまくいくと思いますが、100%確実ではありません。しかし、これは非常に複雑です。これを簡単にする方法はありますか?

3 つのパラメーターは「HH:MM」の形式の時間で、00 <= HH <= 23 および 00 <= MM <= 59 です。最初の 2 つの時間は推定時間で、3 番目は実際の時間です。実際の時間に最も近い、最初の 2 つのパラメーターの 1 つである時間の見積もりを返します。それらが等しく近い場合は、最初に戻ります。

(str, str, str) -> str  


def closest_time(guess1, guess2, answer):
    if abs((int(answer[:2])) - (int(guess1[:2])) > ((int(answer[:2])) - int(guess2[:2]))):
        return guess2
    if abs((int(answer[:2])) - (int(guess1[:2])) < ((int(answer[:2])) - int(guess2[:2]))):
        return guess1
    if abs((int(answer[:2])) - (int(guess1[:2])) == ((int(answer[:2])) - int(guess2[:2]))):
        if abs((int(answer[3:])) - (int(guess1[3:])) > ((int(answer[3:])) - int(guess2[3:]))):
            return guess2
        if abs((int(answer[3:])) - (int(guess1[3:])) < ((int(answer[3:])) - int(guess2[3:]))):
            return guess1
        if abs((int(answer[3:])) - (int(guess1[3:])) == ((int(answer[3:])) - int(guess2[3:]))):
            return guess1
4

1 に答える 1

5

HH:MMを使用してフォームから分に変換しm = int(HH) * 60 + int(MM)ます。これにより、問題が大幅に簡素化されるはずです。

すべてを一緒に入れて:

>>> def to_minutes(s):
        return int(s[:2]) * 60 + int(s[-2:])

>>> def closest_time(guess1, guess2, answer):
        g1, g2, a = map(to_minutes, [guess1, guess2, answer])
        return guess1 if abs(g1 - a) <= abs(g2 - a) else guess2

>>> closest_time('08:05', '10:30', '08:10')
'08:05'
>>> closest_time('08:05', '10:30', '10:05')
'10:30'
于 2013-01-27T18:15:54.137 に答える