(In reply to
re: computer solution -- the JavaScript code by Charlie)
I just remembered that I had the Chinese New Year program also in Basic (Mintoris Basic, whose interpreter is an Android App). I made the same modification there, and the results were the same:
degree
Open 1,"chinese ny puzz.txt","w"
DIM animal$(12) = "","Rat", "Ox", "Tiger", "Rabbit(Hare)", "Dragon", "Snake", "Horse", "Sheep(Goat)", "Monkey", "Rooster", "Dog", "Boar(Pig)"
dim mName$(12) = "","Jan.","Feb.","March","April","May","June","July","Aug.","Sept.","Oct.","Nov.","Dec."
yr0=val(formattime$(time(),"yyyy"))
edit yr0
for y=yr0-1 to yr0+2000
jdn = chineseNY(y)
mdy(jdn, &m, &d, &y)
c = (y - 3) MOD 12
IF c = 0 THEN c = 12
if m=2 and d>19 then writeln 1, "Year of the "+animal$(c)+ " begins "+mName$(m)+str$(d)+ ", "+str$(y)
next y
close 1
print "done"
end
sub chineseNY(y)
IF y < 1928 THEN
chTZ = -(465 + 40 / 60) / 60
ELSE
chTZ = -8
endif
s1 = wSolst(y - 1, chTZ)
s2 = wSolst(y, chTZ)
solT1 = solTerm(y, chTZ, 300)
solT2 = solTerm(y, chTZ, 330)
m1 = nextNewMoon(s1, chTZ)
m2 = nextNewMoon(m1, chTZ)
m3 = nextNewMoon(m2, chTZ)
m11 = nextNewMoon(nextNewMoon(s2, chTZ) - 33, chTZ)
chinNY = m2
IF INT((m11 - m1) / 29.530588 + .5) = 12 THEN
IF solT1 >= m2 OR solT2 >= m3 THEN chinNY = m3
endif
return chinNY
END sub
SUB mdy(jdNum, m, d, y)
DIM cw(8)
IF jdNum > 2299160 THEN
GOTO 10200
ELSE
GOTO 10250
ENDIF
10200 REM noon jd-->greg mo/da/ye
10210 cw(0) = INT((jdNum - 1867216.25) / 36524.25)
10220 cw(0) = jdNum + 1 + cw(0) - INT(cw(0) / 4)
10230 GOTO 10260
10240 REM noon jd-->jul mo/da/ye
10250 cw(0) = jdNum
10260 cw(0) = cw(0) + 1524
10265 cw(1) = INT((cw(0) - 122.1) / 365.25)
10270 cw(2) = INT(365.25 * cw(1))
10275 cw(3) = INT((cw(0) - cw(2)) / 30.6001)
10280 da = cw(0) - cw(2) - INT(30.61 * cw(3))
10285 ye = cw(1) - 4716
10290 mo = cw(3) - 1
IF mo > 12 THEN
mo = mo - 12
ye = ye + 1
endif
10295 m = mo
d = da
y = ye
END SUB
sub nextNewMoon(j1, chTZ)
d = j1 - 2415020
t = d / 36525
k = (j1 - 2415020.759) / 29.53058868
k = INT(k) - 1
DO
m = fnnm(359.22 + 29.10535608 * k)
mp = fnnm(306.03 + 385.8169181 * k + .01073 * t * t + .00001236 * t * t * t)
F = fnnm(21.2964 + 390.67050646 * k - .0016528 * t * t)
jdNo = 2415020.75933 + 29.53058868 * k + .0001178 * t * t
jdNo = jdNo + .1734 * sin(m)
jdNo = jdNo + .0021 * sin(2 * m)
jdNo = jdNo - .4068 * sin(mp)
jdNo = jdNo + .0161 * sin(2 * mp)
jdNo = jdNo + .0104 * sin(2 * F)
jdNo = jdNo - .0051 * sin(m + mp)
jdNo = jdNo - .0074 * sin(m - mp)
jdNo = jdNo + .001 * sin(2 * F - mp)
jdNo = jdNo - (.41 + 1.2053 * t + .4992 * t * t) / 1440
jdNo = jdNo - chTZ / 24
jdNo = INT(jdNo + .5)
k = k + 1
LOOP UNTIL jdNo > j1
return jdNo
END sub
sub solTerm(y, chTZ, LO)
IF LO >= 270 THEN
ys = y - 1
ELSE
ys = y
endif
t = (365.2422 * (ys + LO / 360) - 693878.7) / 36525
PE = .00134 * cos(22518.7541 * t + 153)
PE = PE + .00154 * cos(45037.5082 * t + 217) + .002 * cos(32964.3577 * t + 313) + .00178 * sin(20.2 * t + 231)
DO
L = 279.6967 + 36000.76892 * t + .0003025 * t * t
m = 358.476 + 35999.04975 * t - .00015 * t * t - .0000033 * t * t * t
L = L + (1.91946 - .004789 * t - .000014 * t * t) * sin(m) + (.020094 - .0001 * t) * sin(2 * m) + .000293 * sin(3 * m)
L = L - .00479 * sin(fnnm(259.18 - 1934.142 * t)) - .00569 + PE + .00179 * sin(351 + 445267.1142 * t - .00144 * t * t)
L = fnnm(L)
DT = (fnnm(LO - L + 180) - 180) / 36525
t = t + DT
LOOP WHILE ABS(DT * 36525) > .001
chJD = t * 36525 + 2415020 - (.41 + 1.2053 * t + .4992 * t * t) / 1440 - chTZ / 24
return INT(chJD + .5)
END sub
sub wSolst(ys, chTZ) 'chTZ in hours; + = west
LO = 270
t = (365.2422 * (ys + LO / 360) - 693878.7) / 36525
PE = .00134 * cos(22518.7541 * t + 153)
PE = PE + .00154 * cos(45037.5082 * t + 217) + .002 * cos(32964.3577 * t + 313) + .00178 * sin(20.2 * t + 231)
DO
L = 279.6967 + 36000.76892 * t + .0003025 * t * t
m = 358.476 + 35999.04975 * t - .00015 * t * t - .0000033 * t * t * t
L = L + (1.91946 - .004789 * t - .000014 * t * t) * sin(m) + (.020094 - .0001 * t) * sin(2 * m) + .000293 * sin(3 * m)
L = L - .00479 * sin(fnnm(259.18 - 1934.142 * t)) - .00569 + PE + .00179 * sin(351 + 445267.1142 * t - .00144 * t * t)
L = fnnm(L)
DT = (fnnm(LO - L + 180) - 180) / 36525
t = t + DT
LOOP WHILE ABS(DT * 36525) > .001
chJD = t * 36525 + 2415020 - (.41 + 1.2053 * t + .4992 * t * t) / 1440 - chTZ / 24
return INT(chJD + .5)
END sub
sub fnnm(x)
return x - 360 * INT(x / 360)
end sub
Year of the Monkey begins Feb.20, 1920
Year of the Ox begins Feb.20, 1985
Year of the Monkey begins Feb.20, 2148
Year of the Rabbit(Hare) begins Feb.20, 2167
Year of the Snake begins Feb.20, 2205
Year of the Rat begins Feb.20, 2224
Year of the Sheep(Goat) begins Feb.20, 2243
Year of the Boar(Pig) begins Feb.21, 2319
Year of the Sheep(Goat) begins Feb.20, 2615
Year of the Ox begins Feb.20, 2729
Year of the Rabbit(Hare) begins Feb.20, 2911
Year of the Dog begins Feb.20, 2930
Year of the Boar(Pig) begins Feb.20, 3063
Year of the Horse begins Feb.20, 3082
Year of the Rat begins Feb.20, 3112
Year of the Sheep(Goat) begins Feb.20, 3131
Year of the Monkey begins Feb.20, 3264
Year of the Dog begins Feb.20, 3302
Year of the Rat begins Feb.20, 3340
Year of the Dragon begins Feb.21, 3416
Year of the Horse begins Feb.20, 3454
Year of the Sheep(Goat) begins Feb.20, 3503
Year of the Tiger begins Feb.20, 3522
Year of the Monkey begins Feb.20, 3636
Year of the Rat begins Feb.20, 3712
Year of the Sheep(Goat) begins Feb.20, 3731
Year of the Dragon begins Feb.20, 3788
Year of the Boar(Pig) begins Feb.20, 3807
Year of the Horse begins Feb.20, 3826
|
Posted by Charlie
on 2015-01-17 12:14:08 |