
『百万年暦』 プログラム編
少し前から勉強を始めたJulia言語で、『百万年暦』のプログラムを作ってみました。最初の関数 day_week は、改良版Zellerの公式で、西暦、月、日をパラメータとして、曜日の計算をします。この計算式で出てきた数(0,1,・・・,6)が日曜から土曜に対応します。また、次の関数 isleap は閏年の判定を行ないます。100万年超の計算精度を保つため、3200年、345600年毎に閏年の補正を行ないます。
このプログラムを実行すると、来年(2024年)の2月のカレンダーが表示されます。来年は閏年ですので、2月が29日まであります。閏年は1年が366日なので、少しだけ得をした気分です。なお、プログラムでは日にちの表示にPrintfモジュールを使っていますので、事前に”add Printf”などを使って、インストールしてください。(わからない人はJuliaを勉強してね♡)
あまり洗練されたコードではありませんが、動くことは動きます。なお現状では実用上、このような計算は必要ありませんが、あと1000年ほど人類が生存し続けると、役に立つ日がやってきます。
1000年後の子孫に、このプログラムを捧げます。なんちゃって。
function day_Week(year, month, day)
if(month <= 2)
month2=month+12
year2=year-1
else
month2=month
year2=year
end
# iflag=year2+floor(year2/4.0)-floor(year2/100.0)+floor(year2/400.0) # Zeller
iflag=year2+floor(year2/4)-floor(year2/100)+floor(year2/400)-floor(year2/3200)+floor(year2/345600) # Denjiro
iflag=iflag+floor((13*month2+8)/5)+day
iflag=mod(Int64(iflag),7)
return iflag
end
function isleap(year)
if mod(year,4) == 0
if mod(year,100) == 0
if mod(year,400) == 0
if mod(year,3200) == 0
if mod(year,345600) == 0
leap=true
else
leap=false
end
else
leap=true
end
else
leap=false
end
else
leap=true
end
else
leap=false
end
return leap
end
# Main program
using Printf
mday=[31 28 31 30 31 30 31 31 30 31 30 31]
year=2024
month=2
day=1
println(" Year: ",year," Month: ",month)
println(" ")
println(" Sun Mon Tue Wed Thu Fri Sat")
skip=day_week(year,month,day)
#println(isleap(year))
if isleap(year) && month==2
days=29
else
days=mday[month]
end
#println(days)
nline=div(days+skip,7)+1
#println(nline)
# The first line of Calendar
if skip > 0
for i=1:skip
print(" ")
end
end
for i=1:7-skip
@printf "%5d" i
end
println("")
# Other lines
st=8-skip
for i=1:nline-1
for j=st+7*(i-1):min(st+7*(i-1)+6,days)
@printf "%5d" j
end
println("")
end