よくよく考えると365mod7が1なので1曜日ずつずれていって、閏年がかかわってきても5曜日スキップするなんて事態にはならないので、特定の日付けが土日になるのは高々2年連続。7/7は祝日にならないっぽい(曖昧)のでそこは考えていない。
import datetime
import os
output_path = os.path.join(os.path.dirname(__file__), "tanabata_weekdays.md")
with open(output_path, "w", encoding="utf-8") as f:
for year in range(1800, 2026):
date = datetime.date(year, 7, 7)
weekday = date.strftime('%A') # 英語の曜日
# 曜日を漢字一文字に変換
weekday_kanji = {
'Monday': '月',
'Tuesday': '火',
'Wednesday': '水',
'Thursday': '木',
'Friday': '金',
'Saturday': '**土**',
'Sunday': '**日**'
}[weekday]
f.write(f"{year}:{weekday_kanji} ")
if (year - 1899) % 10 == 0:
f.write("\n")
実行結果
1800:月 1801:火 1802:水 1803:木 1804:土 1805:日 1806:月 1807:火 1808:木 1809:金
1810:土 1811:日 1812:火 1813:水 1814:木 1815:金 1816:日 1817:月 1818:火 1819:水
1820:金 1821:土 1822:日 1823:月 1824:水 1825:木 1826:金 1827:土 1828:月 1829:火
1830:水 1831:木 1832:土 1833:日 1834:月 1835:火 1836:木 1837:金 1838:土 1839:日
1840:火 1841:水 1842:木 1843:金 1844:日 1845:月 1846:火 1847:水 1848:金 1849:土
1850:日 1851:月 1852:水 1853:木 1854:金 1855:土 1856:月 1857:火 1858:水 1859:木
1860:土 1861:日 1862:月 1863:火 1864:木 1865:金 1866:土 1867:日 1868:火 1869:水
1870:木 1871:金 1872:日 1873:月 1874:火 1875:水 1876:金 1877:土 1878:日 1879:月
1880:水 1881:木 1882:金 1883:土 1884:月 1885:火 1886:水 1887:木 1888:土 1889:日
1890:月 1891:火 1892:木 1893:金 1894:土 1895:日 1896:火 1897:水 1898:木 1899:金
1900:土 1901:日 1902:月 1903:火 1904:木 1905:金 1906:土 1907:日 1908:火 1909:水
1910:木 1911:金 1912:日 1913:月 1914:火 1915:水 1916:金 1917:土 1918:日 1919:月
1920:水 1921:木 1922:金 1923:土 1924:月 1925:火 1926:水 1927:木 1928:土 1929:日
1930:月 1931:火 1932:木 1933:金 1934:土 1935:日 1936:火 1937:水 1938:木 1939:金
1940:日 1941:月 1942:火 1943:水 1944:金 1945:土 1946:日 1947:月 1948:水 1949:木
1950:金 1951:土 1952:月 1953:火 1954:水 1955:木 1956:土 1957:日 1958:月 1959:火
1960:木 1961:金 1962:土 1963:日 1964:火 1965:水 1966:木 1967:金 1968:日 1969:月
1970:火 1971:水 1972:金 1973:土 1974:日 1975:月 1976:水 1977:木 1978:金 1979:土
1980:月 1981:火 1982:水 1983:木 1984:土 1985:日 1986:月 1987:火 1988:木 1989:金
1990:土 1991:日 1992:火 1993:水 1994:木 1995:金 1996:日 1997:月 1998:火 1999:水
2000:金 2001:土 2002:日 2003:月 2004:水 2005:木 2006:金 2007:土 2008:月 2009:火
2010:水 2011:木 2012:土 2013:日 2014:月 2015:火 2016:木 2017:金 2018:土 2019:日
2020:火 2021:水 2022:木 2023:金 2024:日 2025:月
環境構築
windowsでpython環境を作るなら
- アプリ版
- とてもらく
- インストーラー
- 野暮ったい
- powershellのiwrコマンドでとってきて云々
- 怖い
- WSL(実質linuxで作るのと同じような手順)
uvを導入。参考 https://dev.classmethod.jp/articles/i-like-uv/
-
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
←iex怖すぎ -
$env:Path = "C:\Users\「ユーザ」\.local\bin;$env:Path"
←この案内がでるけどターミナル切るたびにリセットされるので、恒久的に変えたい。というか、なんでこんなとこに入れてしまったんだ$oldPath = [System.Environment]::GetEnvironmentVariable("PATH", "Machine"); $newPath = "C:\Users\「ユーザ」\.local\bin;$oldPath"; [System.Environment]::SetEnvironmentVariable("PATH", $newPath, "Machine")
uv init mytanabata
-> uv run python .\mytanabata\tanabata.py
おまけ
windowsでpython触るのやめよう
vscode + copilotのインラインチャット履歴は自動保存されないっぽいので手動保存するのがいいのかもしれない
コンソール色付き出力
python
と真逆の環境で作業をしており、そこで手軽にコンソールに色付きの文字を出したかったが、無理筋だった(カーネル云々、コンソールプロセスの設定変更を云々だったのであまりにも面倒)。
文芸プログラミングとか、可視化とかしたいなら素直にjupyternotebookを使おう。
import datetime
import os
output_path = os.path.join(os.path.dirname(__file__), "tanabata_weekdays.ps1")
with open(output_path, "w", encoding="utf-8-sig") as f:
for year in range(1800, 2026):
date = datetime.date(year, 7, 7)
weekday = date.strftime('%A') # 英語の曜日
# 曜日を漢字一文字に変換
weekday_kanji = {
'Monday': 'Write-Host "月 " -NoNewline',
'Tuesday': 'Write-Host "火 " -NoNewline',
'Wednesday': 'Write-Host "水 " -NoNewline',
'Thursday': 'Write-Host "木 " -NoNewline',
'Friday': 'Write-Host "金 " -NoNewline',
'Saturday': 'Write-Host "土 " -ForegroundColor Red -NoNewline',
'Sunday': 'Write-Host "日 " -ForegroundColor Red -NoNewline'
}[weekday]
f.write(f'Write-Host "{year}:" -NoNewline; {weekday_kanji}\n')
if (year - 1799) % 10 == 0:
f.write('Write-Host "";')
Write-Host "1800:" -NoNewline; Write-Host "月 " -NoNewline
Write-Host "1801:" -NoNewline; Write-Host "火 " -NoNewline
Write-Host "1802:" -NoNewline; Write-Host "水 " -NoNewline
Write-Host "1803:" -NoNewline; Write-Host "木 " -NoNewline
Write-Host "1804:" -NoNewline; Write-Host "土 " -ForegroundColor Red -NoNewline
Write-Host "1805:" -NoNewline; Write-Host "日 " -ForegroundColor Red -NoNewline
Write-Host "1806:" -NoNewline; Write-Host "月 " -NoNewline
Write-Host "1807:" -NoNewline; Write-Host "火 " -NoNewline
Write-Host "1808:" -NoNewline; Write-Host "木 " -NoNewline
Write-Host "1809:" -NoNewline; Write-Host "金 " -NoNewline
Write-Host "";Write-Host "1810:" -NoNewline; Write-Host "土 " -ForegroundColor Red -NoNewline
Write-Host "1811:" -NoNewline; Write-Host "日 " -ForegroundColor Red -NoNewline
Write-Host "1812:" -NoNewline; Write-Host "火 " -NoNewline
Write-Host "1813:" -NoNewline; Write-Host "水 " -NoNewline
Write-Host "1814:" -NoNewline; Write-Host "木 " -NoNewline
Write-Host "1815:" -NoNewline; Write-Host "金 " -NoNewline
Write-Host "1816:" -NoNewline; Write-Host "日 " -ForegroundColor Red -NoNewline
Write-Host "1817:" -NoNewline; Write-Host "月 " -NoNewline
Write-Host "1818:" -NoNewline; Write-Host "火 " -NoNewline
Write-Host "1819:" -NoNewline; Write-Host "水 " -NoNewline
# ...
Write-Host "";Write-Host "2020:" -NoNewline; Write-Host "火 " -NoNewline
Write-Host "2021:" -NoNewline; Write-Host "水 " -NoNewline
Write-Host "2022:" -NoNewline; Write-Host "木 " -NoNewline
Write-Host "2023:" -NoNewline; Write-Host "金 " -NoNewline
Write-Host "2024:" -NoNewline; Write-Host "日 " -ForegroundColor Red -NoNewline
Write-Host "2025:" -NoNewline; Write-Host "月 " -NoNewline