除算・余剰を使わずに閏年
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)
|




greentea #5245() Rating-1/13=-0.08
see: Wikipedia 閏年
[ reply ]