0017-玛雅历

问题描述

上周末,M.A 教授对古老的玛雅有了一个重大发现。从一个古老的节绳(玛雅人用于记事的工具)中,教授发现玛雅人使用了一个一年有 365 的叫做 Haab 的日历。这个Haab 日历拥有 19 个月, 在开始的 18 个月,一个月有 20 天, 月份的名字分别是 pop, no,zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu.这些月份中的日期用 0 到 19 表示。Haab 历的最后一个月叫做 uayet,它只有 5 天,用 0到 4 表示。玛雅人认为这个日期最少的月份是不吉利的,在这个月法庭不开庭,人们不从事交易,甚至没有人打扫屋中的走廊。
因为宗教的原因,玛雅人还使用了另一个日历,在这个日历中年被称为 Tzolkin(holly年),一年被分成 13 个不同的时期,每个时期有 20 天,每一天用一个数字和一个单词相组合的形式来表示。使用的数字是 1~13,使用的单词共有 20 个,它们分别是:imix,ik, akbal, kan, chicchan, cimi, manik, lamat, muluk, ok, chuen, eb, ben, ix, mem, cib, caban,eznab, canac, ahau。注意:年中的每一天都有着明确的描述,比如,在一年的开始,日期如下描述: 1 imix, 2 ik, 3 akbal, 4 kan, 5 chicchan, 6 cimi, 7 manik, 8 lamat, 9 muluk, 10 ok, 11 chuen, 12 eb, 13 ben, 1 ix, 2 mem, 3 cib, 4 caban, 5 eznab, 6 canac, 7 ahau, ,8 imix, 9 ik, 10 akbal . . . 。也就是说数字和单词各自独立循环使用。

Haab 历和 Tzolkin 历中的年都用数字 0,1,...表示,数字 0 表示世界的开始。所以第一天被表示成:
Haab: 0. pop 0
Tzolkin: 1 imix 0
请帮助 M.A.教授写一个程序可以把 Haab 历转化成 Tzolkin 历。

输入

Haab 历中的数据由如下的方式表示:
日期. 月份 年数
第一行表示要转化的 Haab 历的数据量。下面的每一行表示一个日期,年数小于5000。

输出

Tzolkin 历中的数据由如下的方式表示:
天数字 天名称 年数
第一行表示需要转化的 Haab 历的数据量。下面的每一行表示一个日期。

输入样列

3
10. zac 0
0. pop 0
10. zac 1995

输出样例

3
3 chuen 0
1 imix 0
9 cimi 2801

算法实现

using System;

namespace Questions{
    class Program{
        public static void Main(string[] args){
            string[] tzolkin = {
                "imix","ik","akbal","kan","chicchan",
                "cimi","manik","lamat","muluk","ok",
                "chuen","eb","ben","ix","mem","cib",
                "caban","eznab","canac","ahau" };
            string[] haab = { 
                "pop","no","zip","zotz","tzec",
                "xul","yoxkin","mol","chen","yax",
                "zac","ceh","mac","kankin","muan",
                "pax","koyab","cumh" }; 

            int n = int.Parse(Console.ReadLine());
            while(n > 0){
                n--;
                string input = Console.ReadLine();
                string[] data = input.Split();
                int sum = int.Parse(data[2])*365;
                for (int i = 0; i < 19; i++) {
                    if (data[1].Equals(haab[i])) {
                        break;
                    }
                    sum += 20;
                }
                int dayHaab = 0;
                int j = 0;
                while (true) {
                    if (data[0][j] == '.')
                        break;
                    dayHaab = dayHaab * 10 + data[0][j++] - '0';
                }
                sum += dayHaab;
                int year = sum / 260;
                sum = sum % 260;
                string moon = tzolkin[sum % 20];
                //在Haab中0是每个月第一天所有,而Tzolkin1是每个月的第一天
                int day = (sum+1) % 13;
                if (day == 0)
                    day = 13;
                Console.WriteLine("{0} {1} {2}", day, moon, year);
            }
            Console.ReadKey();
        }
    }
}

你可能感兴趣的:(0017-玛雅历)