TGDZ Calc 的仓颉语言实现

仓颉语言是华为开发的一门新语言,初步学习的感觉是有点像C++,同时语法上又比较优雅一点,有点像kotlin. 用的是Windows版本,在CodeArts中调试写出来的。

点击查看代码
package TGDZcalc

func CalcBaseYear(year: Int64): Int64 {
    if (year == 0) {
        return 0
    }
    var base = if (year > 0) {
        1984
    } else {
        -57
    }

    while (base > year) {
        base -= 60
    }
    while (base <= (year - 60)) {
        base += 60
    }
    return base
}

func TGDZtoYear(tgdz: String, baseYear: Int64): Int64 {
    if (tgdz.size != 6) {
        return 0
    }
    let myArr = tgdz.toRuneArray(); //toArray会生成字节系列,不是本意.
    let tg = myArr[0];
    let dz = myArr[1];
    let tgArr = [r'甲', r'乙', r'丙', r'丁', r'戊', r'己', r'庚', r'辛', r'壬', r'癸']; //加r表示一个字符,不是字串
    let dzArr = [r'子', r'丑', r'寅', r'卯', r'辰', r'巳', r'午', r'未', r'申', r'酉', r'戌', r'亥'];
    var ti = 0;
    var di = 0;
    //这个for in 循环比较奇怪,不包括后面的界,即0..10表示的是[0,10)
    for (i in 0..10) {
        if (tgArr[i] == tg) {
            ti = i
            break;
        }
    }
//同上,end界要表示为12.(这也比较符合习惯,即集合的大小 放在后界,但索引不会过界)
    for (i in 0..12) {
        if (dzArr[i] == dz) {
            di = i
            break;
        }
    }

    var m = ti - di;
    if (m < 0) {
        m += 12
    }
    return baseYear + 5 * m + ti;
}

func YearToTGDZ(CurYear: Int64): String {
    let tgArr = ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'];
    let dzArr = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'];

    var year = CurYear
    if (year == 0) {
        return "Error: year=0 "
    }
    year -= if (year < 0) {
        3
    } else {
        4
    }

    while (year < 0) {
        year += 60
    }

    var z1 = year % 10
    var z2 = year % 12
    let tg = tgArr[z1]
    let dz = dzArr[z2]
    return "${tg}${dz}";
}

main() {
    for (i in 1900..2101) {
        let bY = CalcBaseYear(i); //计算甲子元年
        let tgdz = YearToTGDZ(i); //计算当年的天干地支
        let reCalcedYear = TGDZtoYear(tgdz, bY);

        println("Year: ${i} 干支记年是${tgdz}, 甲子元年${bY}, 再算回来为 ${reCalcedYear}年.")
    }
    println("please wait here"); //加断点让它运行到这里暂停一下
}

//2025-5-23 在 仓颉 0.53.18 with CodeArts IDE中调试通过。

posted @ 2025-05-27 11:00  dingxianghuan  阅读(35)  评论(0)    收藏  举报