課題1

1900年から2200年までのうるう年を教えてくれるプログラムを書いてください。
ただし、うるう年は下記のルールで決定されるものとします。

西暦が4で割り切れる年は閏年である。  
ただし、100で割り切れる年は閏年ではない。  
ただし、400で割り切れる年は閏年である。

課題2

任意の西暦年を渡すと、うるう年か否かを判定してくれる関数を、def機能を使って実装してください。

※課題2を先に解いて、そのプログラムを課題1に用いる


In [35]:
def leap_year(y):
    if y < 0:
        print("Please input positive number.")
        return
    if  y%4 == 0:
        if y%400 == 0:
            print("%d is leap year."%y)
            return 
        elif y%100 == 0:
            print("%d is NOT leap year."%y)
            return
        print("%d is leap year."%y)
        return
    else:
        print("%d is NOT leap year."%y)
        return

課題2への回答として1900年から2001年までのうるう年を探してみる。


In [31]:
for i in range(1900,2001):
    leap_year(i)


1900 is NOT leap year.
1901 is NOT leap year.
1902 is NOT leap year.
1903 is NOT leap year.
1904 is leap year.
1905 is NOT leap year.
1906 is NOT leap year.
1907 is NOT leap year.
1908 is leap year.
1909 is NOT leap year.
1910 is NOT leap year.
1911 is NOT leap year.
1912 is leap year.
1913 is NOT leap year.
1914 is NOT leap year.
1915 is NOT leap year.
1916 is leap year.
1917 is NOT leap year.
1918 is NOT leap year.
1919 is NOT leap year.
1920 is leap year.
1921 is NOT leap year.
1922 is NOT leap year.
1923 is NOT leap year.
1924 is leap year.
1925 is NOT leap year.
1926 is NOT leap year.
1927 is NOT leap year.
1928 is leap year.
1929 is NOT leap year.
1930 is NOT leap year.
1931 is NOT leap year.
1932 is leap year.
1933 is NOT leap year.
1934 is NOT leap year.
1935 is NOT leap year.
1936 is leap year.
1937 is NOT leap year.
1938 is NOT leap year.
1939 is NOT leap year.
1940 is leap year.
1941 is NOT leap year.
1942 is NOT leap year.
1943 is NOT leap year.
1944 is leap year.
1945 is NOT leap year.
1946 is NOT leap year.
1947 is NOT leap year.
1948 is leap year.
1949 is NOT leap year.
1950 is NOT leap year.
1951 is NOT leap year.
1952 is leap year.
1953 is NOT leap year.
1954 is NOT leap year.
1955 is NOT leap year.
1956 is leap year.
1957 is NOT leap year.
1958 is NOT leap year.
1959 is NOT leap year.
1960 is leap year.
1961 is NOT leap year.
1962 is NOT leap year.
1963 is NOT leap year.
1964 is leap year.
1965 is NOT leap year.
1966 is NOT leap year.
1967 is NOT leap year.
1968 is leap year.
1969 is NOT leap year.
1970 is NOT leap year.
1971 is NOT leap year.
1972 is leap year.
1973 is NOT leap year.
1974 is NOT leap year.
1975 is NOT leap year.
1976 is leap year.
1977 is NOT leap year.
1978 is NOT leap year.
1979 is NOT leap year.
1980 is leap year.
1981 is NOT leap year.
1982 is NOT leap year.
1983 is NOT leap year.
1984 is leap year.
1985 is NOT leap year.
1986 is NOT leap year.
1987 is NOT leap year.
1988 is leap year.
1989 is NOT leap year.
1990 is NOT leap year.
1991 is NOT leap year.
1992 is leap year.
1993 is NOT leap year.
1994 is NOT leap year.
1995 is NOT leap year.
1996 is leap year.
1997 is NOT leap year.
1998 is NOT leap year.
1999 is NOT leap year.
2000 is leap year.

少し書き換えて課題1を解いてみる。


In [41]:
def leap_year2(y):
    if y < 0:
        return 0
    if  y%4 == 0:
        if y%400 == 0:
            return 1
        elif y%100 == 0:
            return 0
        return 1
    else:
        return 0

In [42]:
leap_years = [leap_year2(i) for i in range(1900,2201)]
print(sum(leap_years))


73

課題3

お笑いアンケートで観客の生まれた年も聞いてみた結果、以下のデータが集められました。

名前  誕生年
田中花子    1980
鈴木一郎    2000
山田太郎    1989
佐藤恵子    1992
石井あや    1978

うるう年に生まれた観客の平均評価点と、うるう年以外に生まれた観客の平均評価点を求めるプログラムを書いてください。(小数点以下も出力してください。)

例えば、次のような形で聴衆のデータが与えられたとする。


In [44]:
audience = {"tanaka":(1980, 1), "suzuki":(2000, 3), "yamada":(1989, 2), "sato":(1992, 5), "ishii":(1978, 5)}

In [53]:
def ave_by_ly(a):
    x = a.values()
    num_ly = 0
    point_ly = 0
    num_not_ly = 0
    point_not_ly = 0
    
    for y, p in x:
        if y < 0:
            print("Please input positive number.")
            return
        if  y%4 == 0:
            if y%400 == 0:
                num_ly += 1
                point_ly += p 
            elif y%100 == 0:
                num_not_ly += 1
                point_not_ly += p 
            num_ly += 1
            point_ly += p 
        else:
            num_not_ly += 1
            point_not_ly += p 
        print(y, p)
    ave_ly = point_ly/num_ly
    ave_not_ly = point_not_ly/num_not_ly
    print("The average point of those who were born in leap year is {ave_ly}".format(**locals()))
    print("The average point of those who were NOT born in leap year is {ave_not_ly}".format(**locals()))
    return

In [54]:
ave_by_ly(audience)


1989 2
1992 5
1978 5
1980 1
2000 3
The average point of those who were born in leap year is 3.0
The average point of those who were NOT born in leap year is 3.5

In [ ]: