読者です 読者をやめる 読者になる 読者になる

ひるあんどんブログ

色々なことに手を出してみるブログ

Weekend counter


ソフィアはあなたに予定と二つの日付を与え、週末の計画を建てるのを助けて欲しいとあなたに言いました。 彼女はあなたに最初の日付から最後の日付までの休日 (土曜日、日曜日) の数を数えるよう頼みました。 あなたは与えられた最初と最後の日付が土曜日または日曜日に含まれるならば、最初と最後の日付を含めて数えなければなりません。

日付は datetime.date (このモジュールについてはリンク先を読んでください) 型として与えられます。 結果は整数で返します。

入力: 開始と終了の日付がdatetime.date型で与えられる

出力: 休日の数を整数で返す

例:

checkio(date(2013, 9, 18), date(2013, 9, 23)) == 2

checkio(date(2013, 1, 1), date(2013, 2, 1)) == 8

checkio(date(2013, 2, 2), date(2013, 2, 3)) == 2

どのように使われるか: 日付を操作する方法を学ぶのに、今がいい時期です。 ここでのこれらのアイデアはカレンダーアプリ、顧客関係管理ソフトウェア、 自動化したメッセージングスケジューラなど多くのものでしばしば出てきます。

事前条件: start_date < end_date.

from datetime import date, timedelta


def checkio(from_date, to_date):
    count = 0
    d = from_date
    while d <= to_date:  
        if d.weekday() == 5 or d.weekday() == 6:  
            count += 1
        d += timedelta(days = 1)  
    return count
    

#These "asserts" using only for self-checking and not necessary for auto-testing
if __name__ == '__main__':
    assert checkio(date(2013, 9, 18), date(2013, 9, 23)) == 2, "1st example"
    assert checkio(date(2013, 1, 1), date(2013, 2, 1)) == 8, "2nd example"
    assert checkio(date(2013, 2, 2), date(2013, 2, 3)) == 2, "3rd example"

dateオブジェクトの日付の計算の仕方がわからなかった。

pythonでは日付の計算はtimedeltaオブジェクトが受け持つようだ。例えばコンソールでやってみる

from datetime import date
>>> a=date(2013,9,18)
>>> b=date(2013,9,22)
>>> b-a
datetime.timedelta(4)
>>> c = b-a
>>> c
datetime.timedelta(4)
>>> from datetime import timedelta
>>> c + timedelta(1)
datetime.timedelta(5)
>>> c
datetime.timedelta(4)
>>> d= c +timedelta(2)
>>> d
datetime.timedelta(6)
>>> print(d)
6 days, 0:00:00

このようにdateオブジェクトの計算の裏ではtimedeltaオブジェクトが働いている。

class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

全てキーワード引数なので、キーワード指定して思い通りの計算ができる。(今回はdaysだから必ずしもキーワードを指定する必要はないけれど…)


他の人のコード

from datetime import date, timedelta

<200b>

<200b>

def checkio(from_date, to_date):

    return len([1 for d in range((to_date - from_date).days + 1)

                if (from_date + timedelta(d)).weekday() in [5, 6]])

weekday == 5 or weekday == 6 とするよりも

weekday in [5,6]としたほうがスマートですね。あとweekday in (5,6)としても良いようだ。