#P1431. Calendar of Maya

Calendar of Maya

描述

古典玛雅文明发展于今天的墨西哥南部、危地马拉、伯利兹和洪都拉斯北部地区。在其鼎盛时期,玛雅人发展出了一套复杂的时间记录系统,用于记录历史和占卜仪式。他们的历法由三个部分组成:卓尔金历(Tzolkin)、哈布历(Haab)和长纪历(Long Count)。

玛雅人出于占卜目的使用卓尔金历,该历法由20个日名组成,每个日名附带从1到13的系数,共260种独特的组合。这就是卓尔金年或仪式年的大小。根据西班牙殖民时期的资料,我们知道了这些日子的名称:

伊米克(Imix)、伊克(Ik)、阿克巴尔(Akbal)、坎(Kan)、奇克昌(Chikchan)、基米(Kimi)、马尼克(Manik)、拉马特(Lamat)、穆鲁克(Muluk)、奥克(Ok)、楚恩(Chuen)、埃布(Eb)、本(Ben)、伊克斯(Ix)、门(Men)、基布(Kib)、卡班(Kaban)、埃茨纳布(Etznab)、卡瓦克(Kawak)、阿哈乌(Ajaw)

日子的序列按以下方式排列(例如从9伊米克开始):9伊米克、10伊克、11阿克巴尔、12坎、13奇克昌、1基米、2马尼克……

哈布历是一个天文历法。它共有365天,分为19个月,其中前18个月每月20天,最后一个月只有5天。与卓尔金历类似,每个月份名称附带一个从1到20的数字,表示该月中的第几天。同样根据西班牙殖民时期的资料,我们知道了这些月份的名称:

波普(Pohp)、沃(Wo)、西普(Sip)、索茨(Zotz)、塞克(Sek)、苏尔(Xul)、亚克斯金(Yaxkin)、莫尔(Mol)、陈(Chen)、亚克斯(Yax)、萨克(Sak)、克赫(Keh)、马克(Mak)、坎金(Kankin)、穆安(Muan)、帕克斯(Pax)、卡亚布(Kayab)、库姆库(Kumku)、瓦耶布(Wayeb)

瓦耶布月只有5天,被认为是一年中不吉利的时间。

在铭文中,卓尔金历和哈布历被结合使用,形成了“历法循环”(Calendar Round),将卓尔金历的260天周期与哈布历的365天周期结合起来。铭文中一个典型的历法循环日期可能是:3拉马特 6帕克斯。需要注意的是,并非所有的日名、月份和系数的组合都是可能的。

历法循环中日期的典型序列(例如从3拉马特 6帕克斯开始):
3拉马特 6帕克斯、4穆鲁克 7帕克斯、5奥克 8帕克斯、6楚恩 9帕克斯、7埃布 10帕克斯、8本 11帕克斯、9伊克斯 12帕克斯、10门 13帕克斯、11基布 14帕克斯、12卡班 15帕克斯、13埃茨纳布 16帕克斯、1卡瓦克 17帕克斯、2阿哈乌 18帕克斯、3伊米克 19帕克斯、4伊克 20帕克斯、5阿克巴尔 1卡亚布、6坎 2卡亚布……

在古典时期(公元200年至900年)初期,玛雅人发展了一种称为长纪历的绝对历法,从一个固定的过去日期(根据玛雅信仰,这是当前世界被创造的日期)开始计算天数。长纪历的日期(为简化起见)以5元组的形式给出,例如:9.2.3.4.5。这样的日期读作“自零日期以来的9伯克盾(baktun)、2卡盾(katun)、3盾(tun)、4维纳尔(winal)、5金(kin)”。1金就是1天。1维纳尔是20天。1盾是18维纳尔(因此1盾有20×18=36020 \times 18 = 360天,比一年少5天)。从这里开始,所有单位都是20的倍数。因此,1卡盾等于20盾(约20年),1伯克盾等于20卡盾(约400年)。因此,9.2.3.4.5实际上表示“自零日期以来的$9 \times 144000 + 2 \times 7200 + 3 \times 360 + 4 \times 20 + 5$天”。

需要注意的是,对于每个长纪历日期b.k.t.w.i,我们有:0k<200 \leq k < 200t<200 \leq t < 200w<180 \leq w < 180i<200 \leq i < 20

由于历法循环的周期性,像3拉马特 6帕克斯这样的合法日期在长纪历中会出现多次。因此,在解读铭文时的一个难点是,当日期仅以历法循环的形式给出时(这种情况很常见),如何确定铭文的具体日期。在这种情况下,必须计算与该历法循环日期对应的所有可能的长纪历日期,并根据其他上下文信息(例如,铭文提到了一位已知其他日期的国王)推断出适用的日期。

我们将研究范围限定在伯克盾8和9的长纪历日期(它们涵盖了整个古典时期)。我们知道,长纪历日期8.0.0.0.0对应的历法循环日期是9阿哈乌 3西普。

任务
编写一个程序,对于每个数据集:
读取一个历法循环日期;
如果该日期合法,计算伯克盾8和9中与该历法循环日期对应的所有长纪历日期;
输出结果。

输入

输入的第一行包含一个正整数d,表示数据集的数量,1d301 \leq d \leq 30。接下来是数据集。

每个数据集由一行组成,包含一个历法循环日期(可能是非法的):卓尔金历日数、卓尔金历日名、哈布历日数和哈布历月名,用空格分隔。

输出

对于每个数据集,程序必须输出一个升序排列的长纪历日期序列,对应于给定的历法循环日期。

如果输入日期非法,输出的第一行应为0。否则,第一行应为序列的长度n,接下来的n行每行包含一个长纪历日期,由5个用点分隔的整数表示(分别表示伯克盾、卡盾、盾、维纳尔和金的数量)。

输入数据 1

2  
3 Lamat 6 Pax  
1 Ajaw 9 Chen

输出数据 1

15  
8.0.17.17.8  
8.3.10.12.8  
8.6.3.7.8  
8.8.16.2.8  
8.11.8.15.8  
8.14.1.10.8  
8.16.14.5.8  
8.19.7.0.8  
9.1.19.13.8  
9.4.12.8.8  
9.7.5.3.8  
9.9.17.16.8  
9.12.10.11.8  
9.15.3.6.8  
9.17.16.1.8  
0

来源

中欧地区 2001年