2025年9月21日日曜日

9月20日(2)

Juliaの日時処理からの続き

5年前の国勢調査の記事がないかと調べていたら,それはなくて5年前の自分の誕生日の記事が発掘された。誕生日の曜日を調べるJuliaプログラムの話だ。5年も経っているからもう一度実行してみようと,Jupyterではすぐ動いたが,コマンドラインでどうするのか迷った。

プログラムを実行形式にchmodして,頭に#!/usr/bin/env julia(あるいはjuliaの絶対パス)を書けばいいだけなのだけれど,!に気がつかず,シェルスクリプトのコメントと解釈されてエラーがでた。しかし耄碌しているのですぐに原因に気付けずChatGPT-5にたよることになる。

そんなこんなで,過去の習作コードをChatGPT-5に投げてバイブコーディングして得られたのが次の結果とコードである。プログラミングとはAIとの対話のことだった。

 koshi@mba2020 ~ % ./birth.jl

【基礎情報】

今日                : 2025年9月21日(日曜日)

誕生日              : 1953年9月20日(日曜日)


【差分と年齢】

生誕からの経過日数 : 26299日

満年齢              : 72歳


【年ごとの誕生日一覧】(*は日曜)  ※最終年:2025年

1953年9月20日(日曜日)  0歳  *

1954年9月20日(月曜日)  1歳  

1955年9月20日(火曜日)  2歳  

1956年9月20日(木曜日)  3歳  

1957年9月20日(金曜日)  4歳  

1958年9月20日(土曜日)  5歳  

1959年9月20日(日曜日)  6歳  *

1960年9月20日(火曜日)  7歳  

1961年9月20日(水曜日)  8歳  

1962年9月20日(木曜日)  9歳  

1963年9月20日(金曜日)  10歳  

1964年9月20日(日曜日)  11歳  *

1965年9月20日(月曜日)  12歳  

1966年9月20日(火曜日)  13歳  

1967年9月20日(水曜日)  14歳  

1968年9月20日(金曜日)  15歳  

1969年9月20日(土曜日)  16歳  

1970年9月20日(日曜日)  17歳  *

1971年9月20日(月曜日)  18歳  

1972年9月20日(水曜日)  19歳  

1973年9月20日(木曜日)  20歳  

1974年9月20日(金曜日)  21歳  

1975年9月20日(土曜日)  22歳  

1976年9月20日(月曜日)  23歳  

1977年9月20日(火曜日)  24歳  

1978年9月20日(水曜日)  25歳  

1979年9月20日(木曜日)  26歳  

1980年9月20日(土曜日)  27歳  

1981年9月20日(日曜日)  28歳  *

1982年9月20日(月曜日)  29歳  

1983年9月20日(火曜日)  30歳  

1984年9月20日(木曜日)  31歳  

1985年9月20日(金曜日)  32歳  

1986年9月20日(土曜日)  33歳  

1987年9月20日(日曜日)  34歳  *

1988年9月20日(火曜日)  35歳  

1989年9月20日(水曜日)  36歳  

1990年9月20日(木曜日)  37歳  

1991年9月20日(金曜日)  38歳  

1992年9月20日(日曜日)  39歳  *

1993年9月20日(月曜日)  40歳  

1994年9月20日(火曜日)  41歳  

1995年9月20日(水曜日)  42歳  

1996年9月20日(金曜日)  43歳  

1997年9月20日(土曜日)  44歳  

1998年9月20日(日曜日)  45歳  *

1999年9月20日(月曜日)  46歳  

2000年9月20日(水曜日)  47歳  

2001年9月20日(木曜日)  48歳  

2002年9月20日(金曜日)  49歳  

2003年9月20日(土曜日)  50歳  

2004年9月20日(月曜日)  51歳  

2005年9月20日(火曜日)  52歳  

2006年9月20日(水曜日)  53歳  

2007年9月20日(木曜日)  54歳  

2008年9月20日(土曜日)  55歳  

2009年9月20日(日曜日)  56歳  *

2010年9月20日(月曜日)  57歳  

2011年9月20日(火曜日)  58歳  

2012年9月20日(木曜日)  59歳  

2013年9月20日(金曜日)  60歳  

2014年9月20日(土曜日)  61歳  

2015年9月20日(日曜日)  62歳  *

2016年9月20日(火曜日)  63歳  

2017年9月20日(水曜日)  64歳  

2018年9月20日(木曜日)  65歳  

2019年9月20日(金曜日)  66歳  

2020年9月20日(日曜日)  67歳  *

2021年9月20日(月曜日)  68歳  

2022年9月20日(火曜日)  69歳  

2023年9月20日(水曜日)  70歳  

2024年9月20日(金曜日)  71歳  

2025年9月20日(土曜日)  72歳    

ChatGPT-5 Thinking が提案してきたコードは以下のとおりである。かなり修正してもらった。

#!/usr/bin/env julia

# birth.jl


using Dates


# --- ヘルパ ---

const WDAY_SHORT = ["月","火","水","木","金","土","日"]

const WDAY_LONG  = ["月曜日","火曜日","水曜日","木曜日","金曜日","土曜日","日曜日"]


fmt_date_ja(d::Date; long_wday::Bool=true) = string(

    Dates.format(d, dateformat"yyyy年m月d日"), "(",

    (long_wday ? WDAY_LONG : WDAY_SHORT)[dayofweek(d)], ")"

)


# 引数: [YYYY MM DD [ENDYEAR]]

function parse_args()

    if length(ARGS) == 0

        return Date(1953, 9, 20), year(Dates.today())

    elseif length(ARGS) == 3 || length(ARGS) == 4

        b = Date(parse(Int, ARGS[1]), parse(Int, ARGS[2]), parse(Int, ARGS[3]))

        lasty = (length(ARGS) == 4) ? parse(Int, ARGS[4]) : year(Dates.today())

        return b, lasty

    else

        error("使い方: ./birth.jl  または  ./birth.jl YYYY M D  [ENDYEAR]")

    end

end


function list_birthdays(birth::Date, last_year::Int)

    last_year = max(last_year, year(birth))  # 下限は誕生年

    for y in year(birth):last_year

        d = Date(y, month(birth), day(birth))

        age = y - year(birth)

        star = (dayofweek(d) == 7) ? "*" : ""   # 7 = 日曜

        println(fmt_date_ja(d; long_wday=true), "  ", age, "歳  ", star)

    end

end


# --- 本体 ---

birthday, list_until = parse_args()

today = Dates.today()


println("【基礎情報】")

println("今日                : ", fmt_date_ja(today; long_wday=true))

println("誕生日              : ", fmt_date_ja(birthday; long_wday=true))


println("\n【差分と年齢】")

days_elapsed = Dates.value(today - birthday)

age_years = year(today) - year(birthday) - (Date(year(today), month(birthday), day(birthday)) > today ? 1 : 0)

println("生誕からの経過日数 : ", days_elapsed, "日")

println("満年齢              : ", age_years, "歳")


println("\n【年ごとの誕生日一覧】(*は日曜)  ※最終年:", list_until, "年")

list_birthdays(birthday, list_until)

0 件のコメント: