def get_week_from_yyyymmdd(y, m, d):
''' 年月日から曜日を算出
1582年~(グレゴリオ暦)に限る
戻り値 int
0: 日曜日
6: 土曜日
'''
# 1月、2月は、前年の13月、14月として扱う
if m <= 2:
y -= 1
m += 12
# print('{}年{}月{}日'.format(y, m, d))
x = y + y // 4
x -= y // 100
x += y // 400
x += (m * 13 + 8) // 5
x += d
w = x % 7
weeks = '日月火水木金土'
# print('{}曜日'.format(weeks[w]))
return w
def make_days_in_months(year):
def is_leapyear(y):
''' うるう年判定
'''
result = False
if y % 4 == 0:
result = True
if y % 100 == 0 and y % 400 != 0:
result = False
return result
days_in_months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if is_leapyear(year) is True:
days_in_months.remove(28)
days_in_months.insert(1, 29)
return days_in_months
def main(year, month):
days_in_months = make_days_in_months(year)
days = list(range(1, days_in_months[month - 1] + 1))
day = 1
week = get_week_from_yyyymmdd(year, month, day)
dumy = [0] * week
days = dumy + days
print()
print(' {}年{}月'.format(year, month))
print('---------------------')
print(' 日 月 火 水 木 金 土')
print('---------------------')
for count, i in enumerate(days, start=1):
if i == 0:
print(' ', end='')
continue
print(' {:2}'.format(i), end='')
if count % 7 == 0 and i != days[-1]:
print('')
print('\n---------------------')
if __name__ == '__main__':
while True:
y = int(input('Year (1582~): '))
if 1582 <= y:
break
while True:
m = int(input('Month: '))
if 0 < m < 13:
break
main(y, m)
ZGVmIGdldF93ZWVrX2Zyb21feXl5eW1tZGQoeSwgbSwgZCk6CiAgICAnJycg5bm05pyI5pel44GL44KJ5puc5pel44KS566X5Ye6CiAgICAgICAgMTU4MuW5tO+9nu+8iOOCsOODrOOCtOODquOCquaapu+8ieOBq+mZkOOCiwoKICAgICAgICDmiLvjgorlgKQgaW50CiAgICAgICAgICAgIDA6IOaXpeabnOaXpQogICAgICAgICAgICA2OiDlnJ/mm5zml6UKICAgICcnJwoKICAgICMgMeaciOOAgTLmnIjjga/jgIHliY3lubTjga4xM+aciOOAgTE05pyI44Go44GX44Gm5omx44GGCiAgICBpZiBtIDw9IDI6CiAgICAgICAgeSAtPSAxCiAgICAgICAgbSArPSAxMgojICAgcHJpbnQoJ3t95bm0e33mnIh7feaXpScuZm9ybWF0KHksIG0sIGQpKQoKICAgIHggPSB5ICsgeSAvLyA0CiAgICB4IC09IHkgLy8gMTAwCiAgICB4ICs9IHkgLy8gNDAwCiAgICB4ICs9IChtICogMTMgKyA4KSAvLyA1CiAgICB4ICs9IGQKICAgIHcgPSB4ICUgNwoKICAgIHdlZWtzID0gJ+aXpeaciOeBq+awtOacqOmHkeWcnycKIyAgIHByaW50KCd7feabnOaXpScuZm9ybWF0KHdlZWtzW3ddKSkKCiAgICByZXR1cm4gdwoKCmRlZiBtYWtlX2RheXNfaW5fbW9udGhzKHllYXIpOgogICAgZGVmIGlzX2xlYXB5ZWFyKHkpOgogICAgICAgICcnJyDjgYbjgovjgYblubTliKTlrpoKICAgICAgICAnJycKICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGlmIHkgJSA0ID09IDA6CiAgICAgICAgICAgIHJlc3VsdCA9IFRydWUKICAgICAgICAgICAgaWYgeSAlIDEwMCA9PSAwIGFuZCB5ICUgNDAwICE9IDA6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkYXlzX2luX21vbnRocyA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXQogICAgaWYgaXNfbGVhcHllYXIoeWVhcikgaXMgVHJ1ZToKICAgICAgICBkYXlzX2luX21vbnRocy5yZW1vdmUoMjgpCiAgICAgICAgZGF5c19pbl9tb250aHMuaW5zZXJ0KDEsIDI5KQogICAgcmV0dXJuIGRheXNfaW5fbW9udGhzCgoKZGVmIG1haW4oeWVhciwgbW9udGgpOgogICAgZGF5c19pbl9tb250aHMgPSBtYWtlX2RheXNfaW5fbW9udGhzKHllYXIpCiAgICBkYXlzID0gbGlzdChyYW5nZSgxLCBkYXlzX2luX21vbnRoc1ttb250aCAtIDFdICsgMSkpCgogICAgZGF5ID0gMQogICAgd2VlayA9IGdldF93ZWVrX2Zyb21feXl5eW1tZGQoeWVhciwgbW9udGgsIGRheSkKICAgIGR1bXkgPSBbMF0gKiB3ZWVrCiAgICBkYXlzID0gZHVteSArIGRheXMKCiAgICBwcmludCgpCiAgICBwcmludCgnICAgICB7feW5tHt95pyIJy5mb3JtYXQoeWVhciwgbW9udGgpKQogICAgcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLScpCiAgICBwcmludCgnIOaXpSDmnIgg54GrIOawtCDmnKgg6YeRIOWcnycpCiAgICBwcmludCgnLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKICAgIGZvciBjb3VudCwgaSBpbiBlbnVtZXJhdGUoZGF5cywgc3RhcnQ9MSk6CiAgICAgICAgaWYgaSA9PSAwOgogICAgICAgICAgICBwcmludCgnICAgJywgZW5kPScnKQogICAgICAgICAgICBjb250aW51ZQogICAgICAgIHByaW50KCcgezoyfScuZm9ybWF0KGkpLCBlbmQ9JycpCiAgICAgICAgaWYgY291bnQgJSA3ID09IDAgYW5kIGkgIT0gZGF5c1stMV06CiAgICAgICAgICAgIHByaW50KCcnKQogICAgcHJpbnQoJ1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgd2hpbGUgVHJ1ZToKICAgICAgICB5ID0gaW50KGlucHV0KCdZZWFyICgxNTgy772eKTogJykpCiAgICAgICAgaWYgMTU4MiA8PSB5OgogICAgICAgICAgICBicmVhawogICAgd2hpbGUgVHJ1ZToKICAgICAgICBtID0gaW50KGlucHV0KCdNb250aDogJykpCiAgICAgICAgaWYgMCA8IG0gPCAxMzoKICAgICAgICAgICAgYnJlYWsKICAgIG1haW4oeSwgbSkK