グレゴリオ暦の日付をマヤ暦の日付に変換できるプログラムをコンパイルする必要があります。また、基準日として 1970 年 1 月 1 日を使用する必要があります。
以下の補助機能はそれに応じて動作し、間違いはありません。
# turns dates into tuples
def dmj(date):
"""
>>> dmj('01/01/1970')
(1, 1, 1970)
>>> dmj('00012+00012+02012')
(12, 12, 2012)
"""
tup = ()
for i in date:
if i.isdigit() == False and i != ' ':
date = date.replace(i, ' ')
number_str = ''
for i in date:
number_str += i
if i == ' ':
number = int(number_str)
tup += (number,)
number_str = ''
tup += (int(number_str),)
return tup
# counts days that have passed since 01/01/1970
def daysPassed(date):
"""
>>> daysPassed('01/01/1970')
0
>>> daysPassed('20-7-1988')
6775
>>> daysPassed('00012+00012+02012')
15686
"""
from datetime import date
tup = dmj(date)
begin = date(1970, 1, 1)
end = date(tup[2], tup[1], tup[0])
passed = abs(end - begin)
return passed.days
私の考えは、まず 1970 年 1 月 1 日にこの pictun (長さ 20 バクトゥン) が始まってから何日経過したかを計算し、それから指定された日付に従って経過日数を加算することでした。
マヤ暦では、1 日をキンと呼びます。それらの期間 (1 pictun 内) は次のとおりです。
20 キン = 1 ウイナル; 18 uinal = 1 tun; 20 トゥン = 1 カトゥン; 20 カトゥン = 1 バクトゥン
長いカウント表記では、1970 年 1 月 1 日のマヤ暦は「12.17.16.7.5」です。バクトゥンが最初に書かれ、次にカトゥンなどが書かれます. マヤの日付は0から始まります.
私は最初に以下をコンパイルしました:
def mayanDate(date, separation='')
"""
>>> mayanDate('01/01/1970')
'12/17/16/7/5'
>>> mayaDate('20-7-1988', separator='/')
'12/18/15/4/0'
>>> mayaDate('00012+00012+02012', separator='-')
'12-19-19-17-11'
>>> mayaDate('21 12 2012', separator='+')
'13+0+0+0+0'
>>> mayaDate('26.03.2407')
'14.0.0.0.0'
"""
days = daysPassed(date) + 13 * 144000 + 18 * 7200\
+ 17 * 400 + 8 * 20 + 6
baktun = str((days //((20 **3) * 18)) - 1)
days = days % ((20 **3) * 18)
katun = str((days //((20 **2) * 18)) - 1)
days = days % ((20 **2) * 18)
tun = str((days // (20 **2)) - 1)
days = days % (20 **2)
uinal = str((days // 20) - 1)
days = days % 20 - 1
kin = str(days)
mayanlist = [baktun, katun, tun, uinal, kin]
for i in date:
if i.isdigit() == False and separator == '':
separator = i
break
mayandate = separator.join(mayanlist)
return mayandate
いくつかの奇妙な理由で、1970 年 1 月 1 日だけが、pictun 全体 (7,900 年の長さ!) の最初から数えているにもかかわらず、正しいマヤの長い表記法を返します。他のすべての日付では、2 番目の補助関数が正しい値を返しているにもかかわらず (数千年先の未来でも)、カレンダーの進行が速すぎるようです。
どこが間違っているのかしら。たとえば、の代わりにmayanDate('20-7-1988')
戻り、の代わりに戻ります。'12-18-15-6-0'
'12-18-15-4-0'
mayanDate('21 12 2012')
'13 0 1 12 0'
'13 0 0 0 0'