TGDZ Calc的mathmatica script实现
之前简单学习过Matlab,觉得很好用,但要记的命令比较多;这两天看到一个网友说,mathmatica比Excel要好用得多,我很好奇,虽然平时用不上,也还是想学习一下。 同时发现它也有一个叫wolfram script的东西,大概就是mathmatica命令构成的脚本吧。
尝试用它写个脚本来实现一下TGDZ Calc, 结果是可行的。只是好象它没有function这样的定义,用module来做也是可以的。
点击查看代码
YearToTGDZ[y_]:=Module[{year=y}, (* year为局部变量,y为传入的参数 *)
year = If[year > 0, year - 4, year - 3]; (*年前减三年后4*)
While[year<0, year+=60]; (* 负数花甲变正数 *)
tg = Mod[year, 10]; (* 天干除干数,即对十即余 *)
dz = Mod[year, 12]; (* 地去除支数,对12取余 *)
tgArr = "甲乙丙丁戊已庚辛壬癸";
dzArr = "子丑寅卯辰已午未申酉戌亥";
tgdz = StringTake[tgArr, {tg + 1}] <> StringTake[dzArr, {dz + 1}]; (*余数加1找汉字*)
tgdz]
TGDZToYear[t_,bY_]:=Module[{tgdz,baseYear}, (* 两个参数对应两个局部变量*)
tgdz=t; baseYear=bY;
tg = StringTake[tgdz, {1}]; (* 取第一个字符,下同 *)
dz = StringTake[tgdz, {2}];
tgArr = "甲乙丙丁戊已庚辛壬癸";
dzArr = "子丑寅卯辰已午未申酉戌亥";
tgi = StringPosition[tgArr, tg]; (*取字符串的位置,得到的是一个列表的列表(可能有多组命中) *)
dzi = StringPosition[dzArr, dz];
ti = tgi[[1, 1]] ;(* 取列表的列表的第二层中的第1项,相当于First[First[tgi]]*)
di = dzi[[1, 1]];
m = If[ti - di >= 0, ti - di, 12 + ti - di];
Result = baseYear + 5*m + ti - 1;
Result]
CalcBaseYear[y_]:=Module[{year=y},
bY = If[year > 0, 4, -57];
While[bY > year, bY = bY - 60;];
While[bY + 60 < year, bY = bY + 60;];
bY]
(* 测试过程 *)
i=1800;
While[i<2100,
{tgdz=YearToTGDZ[i];
b=CalcBaseYear[i];
year=TGDZToYear[tgdz,b];
Print[i," --> ",tgdz," --based: ",b, " --> ", year]}
i++]
(* Mathmatica 还是非常强大的,表达能力也很强.在wolfram script中测试通过. 2025-5-26 *)
测试结果如下:


浙公网安备 33010602011771号