challenge 除算・余剰を使わずに閏年

ある西暦が閏年か否かを判定するプログラムを書いてください。 ただし、除算・余剰を求める演算子、組み込み関数、ライブラリ関数等を使用してはいけません。 また、閏年は以下のように定義されています。 1. 西暦年が4で割り切れる年は閏年 2. ただし、西暦年が100で割り切れる年は平年 3. ただし、西暦年が400で割り切れる年は閏年

Posted feedbacks - Python

とても素朴な書き方。剰余の計算を禁止しても引き算の繰り返しでできてしまいますね。一応、大きい順に引くことで繰り返しの回数を減らしてあります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
>>> def leap(x, d=400):
    if x < 0:
        return leap(-x, d)

    if x == 0:
        if d == 400:
            return True
        if d == 100:
            return False
        if d == 4:
            return True

    if x < d:
        if d == 400:
            return leap(x, 100)
        if d == 100:
            return leap(x, 4)
        if d == 4:
            return False

    return leap(x - d, d)

>>> leap(1900)
False
>>> leap(2000)
True
>>> leap(2008)
True
>>> leap(2100)
False

ついにゅっとなってやってしまった。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def leap(x, d=400):
    return (
        not d and [d]
        or
        x == 0 and [[1, 0, 1][d >> 6 & 3]]
        or
        x < d and [leap(x, [0, 4, 100][d >> 6 & 3])]
        or
        [leap(x - d, d)]
    )[0]

str使っていいのかなぁと。
strで100で割るを実現しています。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def div4(n):
    return (n >> 2 , n & 3)

def div100(n):
    m = str(n)
    return (int(m[:-2]), int(m[-2:]))

def uruudoshi(year):
    n = div4(year)
    if n[1] == 0:
        m = div100(year)
        if m[1] == 0:
            if div4(m[0])[1] == 0:
                return 1
            else:
                return 0
        return 1
    else:
        return 0
    
if __name__=="__main__":
    print uruudoshi(1900)
    print uruudoshi(2000)
    print uruudoshi(2008)
    print uruudoshi(2100)

Index

Feed

Other

Link

Pathtraq

loading...