LoginSignup
0
1

More than 3 years have passed since last update.

python3の勉強がてら、カレンダー整形問題を解いてみた話

Last updated at Posted at 2019-09-24

前提

  • 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単位で改行入れたらいいと
気が付いたので、こうなった。

todayCalendar.py
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行が回答です!って言ってもアルゴリズム問題に対する回答としては不適切かと思うので、
コメントでもらった内容を取り入れつつ再チャレンジ。

todayCalendar.py
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で実行確認。

image.png

無事に日曜始まりにも対応できていますね。

shiracamusさんによる回答(コメントより)

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使いこなしている感がありますね・・・!
教えていただきありがとうございました。

0
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1