Problem:


マヤの大予言

真也君はテレビで「マヤの大予言！2012年で世界が終る？」という番組を見ました。結局、世界が終るかどうかはよくわかりませんでしたが、番組で紹介されていたマヤの「長期暦」という暦に興味を持ちました。その番組では以下のような説明をしていました。

マヤ長期暦は、右の表のような単位からなる、全部で13バクトゥン(187万2000日)で構成される非常に長い暦である。ある計算法では、この暦は紀元前3114年8月11日に始まり2012年12月21日に終わると考えられていて、このため今年の12月21日で世界が終るという説が唱えられている。しかし、13バクトゥンで１サイクルとなり、今の暦が終わったら新しいサイクルに入るだけという考えもある。

１キン＝１日

１ウィナル＝２０キン

１トゥン＝１８ウィナル

１カトゥン＝２０トゥン

１バクトゥン＝２０カトゥン

 

「ぼくの二十歳の誕生日はマヤ暦だと何日になるのかな？」真也君はいろいろな日をマヤ長期暦で表してみたくなりました。

では、真也君の代わりに、西暦とマヤ長期暦とを相互変換するプログラムを作成してください。

入力

入力は複数のデータセットからなる。入力の終わりは#１つの行で示される。各データセットは以下の形式で与えられる。

b.ka.t.w.ki

または

y.m.d

データセットは１つの文字列を含む１行からなる。b.ka.t.w.ki はマヤ長期暦の日付、y.m.d は西暦の日付である。与えられる単位は以下の通りである。

マヤ長期暦

b
バクトゥン
(0 ≤ b< 13)

ka
カトゥン
(0 ≤ ka < 20)

t
トゥン
(0 ≤ t< 20)

w
ウィナル
(0 ≤ w < 18)

ki
キン
(0 ≤ ki < 20)

西暦

y
年
(2012 ≤ y ≤ 10,000,000)

m
月
(1 ≤ m ≤ 12)

d
日
(1 ≤ d ≤ 31)

西暦の日の最大値は、大の月、小の月、うるう年かどうかで変わる(うるう年は 4 の倍数の年のうち、100 で割り切れない年か、400 で割り切れる年である)。マヤ長期暦の日付の範囲は 0.0.0.0.0 から 12.19.19.17.19 までとする。ただし、マヤ長期暦の 0.0.0.0.0 は西暦の 2012.12.21 に対応する。また、西暦の日付の範囲は 2012.12.21から 10000000.12.31 までとする。

データセットの数は 500 を超えない。

出力

入力が西暦のときはマヤ長期暦を、マヤ長期暦のときは西暦を、それぞれ入力と同じ形式で出力する。
入力された西暦を換算した結果、マヤ長期暦の次のサイクルに入った場合でも b.ka.t.w.ki の形式で出力してよい。

入力例

2012.12.31
2.12.16.14.14
7138.5.13
10.5.2.1.5
10000000.12.31
#

出力例

0.0.0.0.10
3054.8.15
0.0.0.0.10
6056.2.29
8.19.3.13.2



Sample input:
2012.12.31
2.12.16.14.14
7138.5.13
10.5.2.1.5
10000000.12.31
#


Sample output:
0.0.0.0.10
3054.8.15
0.0.0.0.10
6056.2.29
8.19.3.13.2

Submission status: Runtime Error

Solution code:
KI = 1
W = 20 * KI
T = 18 * W
KA = 20 * T
B = 20 * KA
MAX_MAYA = 12 * B + 19*KA + 19*T + 17*W + 19

month = (31,28,31,30,31,30,31,31,30,31,30,31)


def is_uruu(y):
    return y % 4 == 0 and (y % 100 != 0 or y % 400 == 0)
def y_d(y):
    return 365 if not is_uruu(y) else 366
def m_d(y,m):
    return 29 if (m == 2 and is_uruu(y)) else month[m-1]

while 1:
    inp = input().split('.')
    if inp[0] == '#':break

    inp = list(map(int,inp))
    if len(inp) == 5:#maya
        val = inp[0] * B + inp[1] * KA + inp[2] * T + inp[3] * W + inp[4] * KI
        y,m,d = 2012,12,21
        if val <= 10:
            print('%d.%d.%d' % (y,m,d+val))
        else:
            val -=11
            y,m,d = 2013,1,1

            while val >= y_d(y): 
                val -= y_d(y)
                y += 1
            while val >= m_d(y,m):
                val -= m_d(y,m)
                m += 1

            d += val
            print('%d.%d.%d' % (y,m,d))
    else:
        if inp[0] == 2012:
            print('0.0.0.0.%d' % (inp[2] - 21))
        else:
            val = 11
            for y in range(2013,inp[0]):
                val += y_d(y)
            for m in range(1,inp[1]):
                val += m_d(inp[0],m)
            val += inp[2]-1
            if val > MAX_MAYA:
                val = val % (MAX_MAYA+1)
            val = val % (MAX_MAYA+1)
            b=val // B
            val %= B
            ka = val // KA
            val %= KA
            t = val //T
            val %= T
            w = val //W
            val %= W
            print('%d.%d.%d.%d.%d'%(b,ka,t,w,val))

Submission status: Runtime Error

Solution code:
from datetime import date
from datetime import timedelta
import datetime

def is_leap_year(y):
    return y % 4 == 0 and (y % 100 != 0 or y % 400 == 0)

def leap_year_count(target_y,benchmark_y):
    target = target_y // 4 - target_y // 100 + target_y // 400
    benchmark = benchmark_y // 4 - benchmark_y // 100 + benchmark_y // 400
    return target - benchmark

def ad2mayan(y, m, d):
    diff = 0
    if datetime.MAXYEAR < y:
        day_of_2012 = (date(2013, 1, 1) - date(2012, 12, 21)).days
        day_of_the_year = (date(1, m, d) - date(1, 1, 1)).days if is_leap_year(y) else (date(4, m, d) - date(4, 1, 1)).days
        
        days = (y - 2013) * 365 + leap_year_count(y, 2013)

        diff = day_of_2012 + days + day_of_the_year
    else:
        benchmark = date(2012, 12, 21)
        diff = (date(y, m, d) - benchmark).days
    
    ki, diff = diff % 20, diff // 20
    w, diff = diff % 18, diff // 18
    t, diff = diff % 20, diff // 20
    ka, diff = diff % 20, diff // 20
    b = diff % 13
    
    return b,ka,t,w,ki

def mayan2ad(b, ka, t, w, ki):
    ka += b * 20
    t += ka * 20
    w += t * 18
    ki += w * 20
    time = date(2012, 12, 21) + timedelta(ki)
    return time.year, time.month, time.day


import sys
f = sys.stdin

for line in f:
    if line == '#':
        continue
    t = list(map(int, line.split('.')))
    if len(t) == 3:
        print('.'.join(map(str, ad2mayan(*t))))
    else:
        print('.'.join(map(str, mayan2ad(*t))))

Submission status: Runtime Error

Solution code:
import datetime

def is_leap_year(y):
    return y % 4 == 0 and (y % 100 != 0 or y % 400 == 0)

def leap_year_count(target_y,benchmark_y):
    target = target_y // 4 - target_y // 100 + target_y // 400
    benchmark = benchmark_y // 4 - benchmark_y // 100 + benchmark_y // 400
    return target - benchmark

def ad2mayan(y, m, d):
    diff = 0
    if datetime.MAXYEAR < y:
        day_of_2012 = (datetime.date(2013, 1, 1) - datetime.date(2012, 12, 21)).days
        day_of_the_year = (datetime.date(1, m, d) - datetime.date(1, 1, 1)).days if is_leap_year(y) else (datetime.date(4, m, d) - datetime.date(4, 1, 1)).days
        
        days = (y - 2013) * 365 + leap_year_count(y, 2013)

        diff = day_of_2012 + days + day_of_the_year
    else:
        benchmark = datetime.date(2012, 12, 21)
        diff = (datetime.date(y, m, d) - benchmark).days
    
    ki, diff = diff % 20, diff // 20
    w, diff = diff % 18, diff // 18
    t, diff = diff % 20, diff // 20
    ka, diff = diff % 20, diff // 20
    b = diff % 13
    
    return b,ka,t,w,ki

def mayan2ad(b, ka, t, w, ki):
    ka += b * 20
    t += ka * 20
    w += t * 18
    ki += w * 20
    time = datetime.date(2012, 12, 21) + datetime.timedelta(ki)
    return time.year, time.month, time.day


import sys
f = sys.stdin

for line in f:
    if line == '#':
        continue
    t = list(map(int, line.split('.')))
    if len(t) == 3:
        print('.'.join(map(str, ad2mayan(*t))))
    else:
        print('.'.join(map(str, mayan2ad(*t))))

Submission status: Runtime Error

Solution code:
import datetime

def is_leap_year(y):
    return y % 4 == 0 and (y % 100 != 0 or y % 400 == 0)

def leap_year_count(target_y,benchmark_y):
    target = target_y // 4 - target_y // 100 + target_y // 400
    benchmark = benchmark_y // 4 - benchmark_y // 100 + benchmark_y // 400
    return target - benchmark

def ad2mayan(y, m, d):
    diff = 0
    if datetime.MAXYEAR < y:
        day_of_2012 = (datetime.date(2013, 1, 1) - datetime.date(2012, 12, 21)).days
        day_of_the_year = (datetime.date(1, m, d) - datetime.date(1, 1, 1)).days if is_leap_year(y) else (datetime.date(4, m, d) - datetime.date(4, 1, 1)).days
        
        days = (y - 2013) * 365 + leap_year_count(y, 2013)

        diff = day_of_2012 + days + day_of_the_year
    else:
        benchmark = datetime.date(2012, 12, 21)
        diff = (datetime.date(y, m, d) - benchmark).days
    
    ki, diff = diff % 20, diff // 20
    w, diff = diff % 18, diff // 18
    t, diff = diff % 20, diff // 20
    ka, diff = diff % 20, diff // 20
    b = diff % 13
    
    return b,ka,t,w,ki

def mayan2ad(b, ka, t, w, ki):
    ka += b * 20
    t += ka * 20
    w += t * 18
    ki += w * 20
    time = datetime.date(2012, 12, 21) + datetime.timedelta(ki)
    return time.year, time.month, time.day

import sys
f = sys.stdin

for line in f:
    t = list(map(int, line.split('.')))
    if len(t) == 3:
        print('.'.join(map(str, ad2mayan(*t))))
    elif len(t) == 5:
        print('.'.join(map(str, mayan2ad(*t))))

Submission status: Runtime Error

Solution code:
# Aizu Problem 0261: Mayan Crucial Prediction

import sys, math, os, datetime

# read input:
PYDEV = os.environ.get('PYDEV')
#if PYDEV=="True":
sys.stdin = open("sample-input.txt", "rt")

dpm = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] # day per month

 
def get_day(year, month, day):
    if month <= 2:
        year -= 1
        month += 12
    dy = 365 * (year - 1)
    c = year // 100
    dl = (year >> 2) - c + (c >> 2)
    dm = (month * 979 - 1033) >> 5
    return dy + dl + dm + day - 1

offset = get_day(2012, 12, 21)
maya= [144000, 7200, 360, 20, 1]
    
while True:
    inp = input().strip()
    if inp == "#":
        break
    inp = [int(_) for _ in inp.split('.')]
    if len(inp) == 3:
        # christian to mayan:
        n = (get_day(inp[0], inp[1], inp[2]) - offset) % 1872000
        out = ""
        for k in range(4):
            out += str(n // maya[k]) + '.'
            n %= maya[k]
        out += str(n)
        print(out)
    else:
        # mayan to christian:
        n = sum([maya[k] * inp[k] for k in range(5)])
        date = datetime.date.fromordinal(offset + n + 1)        
        print(str(date.year) + "." + str(date.month) + "." + str(date.day))

Submission status: Runtime Error

Solution code:
# Aizu Problem 0261: Mayan Crucial Prediction

import sys, math, os, datetime

# read input:
PYDEV = os.environ.get('PYDEV')
#if PYDEV=="True":
sys.stdin = open("sample-input.txt", "rt")

dpm = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] # day per month

 
def get_day(year, month, day):
    if month <= 2:
        year -= 1
        month += 12
    dy = 365 * (year - 1)
    c = year // 100
    dl = (year >> 2) - c + (c >> 2)
    dm = (month * 979 - 1033) >> 5
    return dy + dl + dm + day - 1

def from_day(n):
    a = n + 32044;
    b = (4 * n + 3) // 146097
    c = a - (146097 * b) // 4
    d = (4 * c + 3) // 1461
    e = c - (1461 * d) // 4
    m = (5 * e + 2) // 153
    m1 = m // 10
    day = e - (153 * m + 2) // 5 + 1
    month = m + 3 - 12 * m1
    year = 100 * b + d - 4800 + m1
    if year <= 0:
        year = -year + 1
    return year, month, day


offset = get_day(2012, 12, 21)
maya= [144000, 7200, 360, 20, 1]
    
while True:
    inp = input().strip()
    if inp == "#":
        break
    inp = [int(_) for _ in inp.split('.')]
    if len(inp) == 3:
        # christian to mayan:
        n = (get_day(inp[0], inp[1], inp[2]) - offset) % 1872000
        out = ""
        for k in range(4):
            out += str(n // maya[k]) + '.'
            n %= maya[k]
        out += str(n)
        print(out)
    else:
        # mayan to christian:
        n = sum([maya[k] * inp[k] for k in range(5)])
        #date = datetime.date.fromordinal(offset + n + 1)
        year, month, day = from_day(n + 2456283 + 1)
        print(str(year) + "." + str(month) + "." + str(day))