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

へっぽこびんぼう野郎のnewbie日記

けろけーろ(´・ω・`)!

曜日計算を暗算でやる方法と実装

Python 数学

曜日計算を求める方法にツェラーの公式というものがある。
試しに代入して解いたところ
ぴたりと一致したのでおっふとなってしまった。

だが少し待ってほしい。
サヴァン症候群の人はこんな計算をやっていないらしいのだ。

というか公式を眺めていて気づいた。
「なんで最後にmod7してるの?」って。

毎回mod7すればいいじゃないか。

 

以下ツェラーの公式を見たものとして話を続ける。

 

まず重要なこと。
日数について
1から31までの7でわったときのあまりをすぐに算出できるようにすること。

list = [""] * 7

for i in range(1, 32):

 list[i % 7] += ( ( ( "0" + str(i) ) if i < 10 else str(i)) + "日:" + str(i%7) + " " )


for l in list:
 print(l)

07日:0 14日:0 21日:0 28日:0
01日:1 08日:1 15日:1 22日:1 29日:1
02日:2 09日:2 16日:2 23日:2 30日:2
03日:3 10日:3 17日:3 24日:3 31日:3
04日:4 11日:4 18日:4 25日:4
05日:5 12日:5 19日:5 26日:5
06日:6 13日:6 20日:6 27日:6

次に1月から12月までのときの7で割ったときのあまりを覚えること。

for i in range(3, 15):
 print(str(i if i<13 else i%12) + "月:" + str(((26 * (i+1) / 10) % 7)))

3月:3
4月:6
5月:1
6月:4
7月:6
8月:2
9月:5
10月:0
11月:3
12月:5
1月:1
2月:4

 そこはかとなく円周率に似ている。

 

年について

下2桁を4で割ったときの整数部分と、

下2桁の7で割ったときのあまりを足す。

 

たとえば2014年なら、下2桁が14で、

4で割ったときの整数部分が14 / 4 = 3 ... 2 だから3

3を7でわったときのあまりは3

14を7でわったときのあまりは0

 

最後のΓの部分は2000年代なら0

1900年代なら6

2100年代は5

 

以上のことから、例えば2000〜2999年に限ってしまえば

日 + 月を変換したやーつ +  年の下2桁 + (年の下2桁 / 4 )の整数部分

を7でわったときのあまりが、曜日となる。

 

21世紀の時間について実装してみた。

Macでは2038年までしかカレンダー見れないからこれで求めることができるよっ

 

list = [1, 4, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5]


dayList = ["Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri"]


dayOfWeek = (lambda day, month, year : dayList[((lambda dayPlus : day + list[month - 1] + dayPlus)((lambda plusChanged : plusChanged + plusChanged / 4)((lambda monthChanged : year if monthChanged % 12 > 2 else year - 1)(month)))) % 7])

 

dayOfWeek(23, 9, 14)
'Tue'

 

 ワンライナーして思ったことは

あ、これ関数型言語だっていうこと。