2025年9月21日日曜日

9月20日(2)

Juliaの日時処理からの続き

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

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

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

 % ./birth.jl --ja

[基礎情報]

今日                : 2025年9月21日(日曜日)(うるう年?否)

誕生日              : 1953年9月20日(日曜日)(うるう年?否)


[差分と年齢]

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

満年齢              : 72歳


[次の誕生日]

次の誕生日          : 2026年9月20日(日曜日)

次の誕生日まで      : 364日


[年ごとの誕生日一覧](*は日曜)

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

using Dates


# ---------- helpers ----------

weekday_name(d::Date; ja::Bool=false, long::Bool=false) = if ja

    long ?

        ["月曜日","火曜日","水曜日","木曜日","金曜日","土曜日","日曜日"][Int(dayofweek(d))] :

        ["月","火","水","木","金","土","日"][Int(dayofweek(d))]

else

    dayname(d)  # English

end


month_name(d::Date; ja::Bool=false) = ja ? string(month(d), "月") : monthname(d)

to_jp_bool(b::Bool) = b ? "可" : "否"


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

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

           weekday_name(d; ja=true, long=long_wday), ")")


function parse_args()

    ja = any(x->x=="--ja", ARGS)

    xs = filter(x->x != "--ja", ARGS)

    if length(xs) == 3

        y = parse(Int, xs[1]); m = parse(Int, xs[2]); d = parse(Int, xs[3])

        return Date(y,m,d), ja

    else

        return Date(1953,9,20), ja

    end

end


function next_birthday(bday::Date, today::Date)

    y = year(today)

    cand = Date(y, month(bday), day(bday))

    cand >= today ? cand : Date(y+1, month(bday), day(bday))

end


function list_birthdays(birth::Date; ja::Bool=false)

    today_ = Dates.today()

    for y in year(birth):year(today_)

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

        age = y - year(birth)

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

        if ja

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

        else

            println(d, "  age=", rpad(string(age), 3), "  ", weekday_name(d; ja=false), " ", star)

        end

    end

end


# ---------- main ----------

birthday, ja = parse_args()

today_ = Dates.today()


if ja

    println("[基礎情報]")

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

            "(うるう年?", to_jp_bool(isleapyear(today_)), ")")

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

            "(うるう年?", to_jp_bool(isleapyear(birthday)), ")")


    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, "歳")


    nb = next_birthday(birthday, today_)

    println("\n[次の誕生日]")

    println("次の誕生日          : ", fmt_date_ja(nb; long_wday=true))

    println("次の誕生日まで      : ", Dates.value(nb - today_), "日")


    println("\n[年ごとの誕生日一覧](*は日曜)")

    list_birthdays(birthday; ja=true)


else

    println("[Basic Info]")

    println("today               : ", today_, " (leap year? ", isleapyear(today_), ")")

    println("birthday            : ", birthday, " (leap year? ", isleapyear(birthday), ")")

    println("month/day           : ", month(birthday), "/", day(birthday),

            "  ", month_name(birthday; ja=false), " ", weekday_name(birthday; ja=false))


    println("\n[Difference & Age]")

    println("days since birth    : ", Dates.value(today_ - birthday), " days")

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

    println("age (full years)    : ", age_years)


    nb = next_birthday(birthday, today_)

    println("\n[Next Birthday]")

    println("next birthday date  : ", nb, " (", weekday_name(nb; ja=false), ")")

    println("days until next     : ", Dates.value(nb - today_), " days")


    println("\n[Birthdays by Year] (*=Sunday)")

    list_birthdays(birthday; ja=false)

end

0 件のコメント: