前提
python3の勉強中の身です。
文章を公開するのも練習中です。
-
環境
- windows10 WSL ubuntu
- python3.6
カレンダー整形問題とは
会社の同僚が教えてくれた問題。
ネットで調べると ここが出てきた。
問題
次のような形式でカレンダーを表示させてください
April 2013
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
どうもRubyの練習問題らしい。
しかしRubyは勉強してないし、ちょうどpythonを独学で始めたのでやってみた。
私の解答
最初は配列とか準備しようかと思ったけれど、
配列で処理しようと思うと、1週間の週数で増減が必要だし、もっとスマートにしたかった。
結局、初日の曜日と月の日数がわかれば後は開始位置を決めて7単位で改行入れたらいいと
気が付いたので、こうなった。
import calendar
import datetime
gyo = ''
span, last_day = calendar.monthrange(datetime.date.today().year, datetime.date.today().month)
print('{:^20}'.format(calendar.month_name[datetime.date.today().month] + '.' + f'{datetime.date.today().year}'))
print('')
print('Su Mo Tu We Th Fi St')
print('')
for i in range(span + 1):
gyo = gyo + ' '
for day in range(1, last_day + 1):
gyo = gyo + '{:>3}'.format(day)
if (day + span + 1) % 7 == 0:
print(gyo[1:])
print('')
gyo = ''
print(gyo[1:])
ヘッダ部分はロジック化してない。
2019.09.24追記
コメントでいろいろご教授いただきました。
shiracamus さん、konandoiruasa さん ありがとうございます
3行で解決するpython!
なんとたった3行でカレンダーをきれいに表示できる
import calendar
calendar.setfirstweekday(6)
print(calendar.month(2019, 9, l=2))
よりよいと思われる回答
さすがに3行が回答です!って言ってもアルゴリズム問題に対する回答としては不適切かと思うので、
コメントでもらった内容を取り入れつつ再チャレンジ。
import calendar
import datetime
gyo = ''
today = datetime.date.today()
span, last_day = calendar.monthrange(today.year, today.month)
print(f'{today:%B.%Y}'.center(20))
print('')
print('Su Mo Tu We Th Fi St')
print('')
for i in range((span + 1) % 7):
gyo += ' '
for day in range(1, last_day + 1):
gyo += f'{day:>3}'
if (day + span + 1) % 7 == 0:
print(gyo[1:])
print('')
gyo = ''
print(gyo[1:])
paizaで実行確認。
無事に日曜始まりにも対応できていますね。
shiracamusさんによる回答(コメントより)
import calendar
import datetime
today = datetime.date.today()
span, last_day = calendar.monthrange(today.year, today.month)
span = (span + 1) % 7 # set the first week a day Sunday
print(f'{today:%B.%Y}'.center(20))
print()
print('Su Mo Tu We Th Fi St')
print()
line = ' ' * span
for column, day in enumerate(range(1, last_day + 1), span):
line += f'{day:>2} '
if column % 7 == 6:
print(line)
print()
line = ''
line and print(line)
全体的にpython使いこなしている感がありますね・・・!
教えていただきありがとうございました。