用 Nim 编程语言生成《皇年表》

2024-06-13 - 甲辰年 庚午月 戊申日 - 农历五月初八 多云

《皇极经世 5000 年元会运世干支纪年表》简称《皇年表》,此表可用来推算上下共 5000 年的中国国运。原表是用 Javascript 编程语言自动生成的,我个人更喜欢使用 Nim 编程语言,下面是完整的 Nim 源码:

# Nim 编程语言 计算《皇年表》
# 作者 海云青飞 https://www.tuenhai.com
# 2024-06-13 - 甲辰年 庚午月 戊申日 - 农历五月初八 多云

import std/strformat

# 定义基础数据
let
  baseYear = -67017 ## 公元 -67017 年 为皇年元年
  startYear = -2457 # 第一世的第一年,应为甲子年
  endYear = 2494 # 末世的第一年,应为甲午年
  interval = 30  # 每行包含 30 年

# 创建60甲子数组
let jiazi = [
  "甲子", "乙丑", "丙寅", "丁卯", "戊辰", "己巳", "庚午", "辛未", "壬申", "癸酉",
  "甲戌", "乙亥", "丙子", "丁丑", "戊寅", "己卯", "庚辰", "辛巳", "壬午", "癸未",
  "甲申", "乙酉", "丙戌", "丁亥", "戊子", "己丑", "庚寅", "辛卯", "壬辰", "癸巳",
  "甲午", "乙未", "丙申", "丁酉", "戊戌", "己亥", "庚子", "辛丑", "壬寅", "癸卯",
  "甲辰", "乙巳", "丙午", "丁未", "戊申", "己酉", "庚戌", "辛亥", "壬子", "癸丑",
  "甲寅", "乙卯", "丙辰", "丁巳", "戊午", "己未", "庚申", "辛酉", "壬戌", "癸亥"
]

# 计算皇年、会、运、世、年的函数
proc calculateHuangYear(year: int): tuple[huangYear: int, hui: string, yun: string, shi: string, nian: string] =
  let
    huangYear = if year < 0: year - baseYear + 1 else: year - baseYear
    hui = (huangYear div 10800)
    yun = (huangYear div 360)
    shi = (huangYear div 30)
    nian = (huangYear - 1) mod 60 # 数组索引要从 0 开始,而皇年从 1 开始

  (huangYear: huangYear,
   hui: $(hui + 1) & jiazi[hui mod 60], # 会、运、世序数要从 1 开始,故 + 1
   yun: $(yun + 1) & jiazi[yun mod 60],
   shi: $(shi + 1) & jiazi[shi mod 60],
   nian: jiazi[nian])

# 打印Markdown表格的头部
echo "|皇年 |公元 |   会  |  运  |  世  |  年  |"
echo "|:----|:----|:----:|:----:|:----:|:----:|"

# 循环打印每隔30年的皇年、会、运、世、年
var year = startYear
while year <= endYear:
  if year >= 0 and year < interval: inc(year) # 公元 -1年到 1年数学差值 2,实际应 1,故首次跨越公元 -1年时年要增1
  let
    t = calculateHuangYear(year)
    yearSign = if year > 0: "+" else: ""
  echo &"|{$t.huangYear} |{yearSign}{$year} | {t.hui} | {t.yun} | {t.shi} | {t.nian} |"
  inc(year, interval)

相关内容


独立思考最难得,赞赏支持是美德!(微信扫描下图)