見出し画像

『百万年暦』 プログラム編

少し前から勉強を始めた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


いいなと思ったら応援しよう!