# [x] PEP8 check
from datetime import datetime
aymd = datetime(2019, 7, 18, 12, 30, 45)
def getWeekDay(adate):
return (adate.weekday() + 1) % 7 # for 0:Sunday[Delphi]
def getYearDay(adate):
return (adate.timetuple().tm_yday)
def dispCal(alist):
for idx in range(len(alist)):
print(alist[idx], end='')
if idx % 7 == 6:
print() # CRLF
# 1. preparation -------------------------
NUM_YEAR = 366 # maximum number of days in a year (including leap-year)
yrs = [[]]*NUM_YEAR
for idx in range(NUM_YEAR):
yrs[idx] = 0
yrs[getYearDay(datetime(2019, 1, 1, 0, 0, 0))] = 1 # Jan
yrs[getYearDay(datetime(2019, 2, 1, 0, 0, 0))] = 1 # Feb.
yrs[getYearDay(datetime(2019, 3, 1, 0, 0, 0))] = 1 # Mar.
NUM_MONTH = 37 # 6 lines in calendar ( 7 * 5 lines + 2 [30, 31 days])
mts = [[]]*NUM_MONTH
for idx in range(NUM_MONTH):
mts[idx] = 0
# 2. main part -------------------------
adt = datetime(2019, 2, 1, 0, 0, 0) # ymdhns
awday = getWeekDay(adt)
ayday = getYearDay(adt)
for idx in range(31): # 31: maximum for one month
mts[awday + idx] = yrs[ayday + idx]
print('Feb')
dispCal(mts)
IyBbeF0gUEVQOCBjaGVjawoKZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKCmF5bWQgPSBkYXRldGltZSgyMDE5LCA3LCAxOCwgMTIsIDMwLCA0NSkKCgpkZWYgZ2V0V2Vla0RheShhZGF0ZSk6CiAgICByZXR1cm4gKGFkYXRlLndlZWtkYXkoKSArIDEpICUgNyAgIyBmb3IgMDpTdW5kYXlbRGVscGhpXQoKCmRlZiBnZXRZZWFyRGF5KGFkYXRlKToKICAgIHJldHVybiAoYWRhdGUudGltZXR1cGxlKCkudG1feWRheSkKCgpkZWYgZGlzcENhbChhbGlzdCk6CiAgICBmb3IgaWR4IGluIHJhbmdlKGxlbihhbGlzdCkpOgogICAgICAgIHByaW50KGFsaXN0W2lkeF0sIGVuZD0nJykKICAgICAgICBpZiBpZHggJSA3ID09IDY6CiAgICAgICAgICAgIHByaW50KCkgICMgQ1JMRgoKIyAxLiBwcmVwYXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk5VTV9ZRUFSID0gMzY2ICAjIG1heGltdW0gbnVtYmVyIG9mIGRheXMgaW4gYSB5ZWFyIChpbmNsdWRpbmcgbGVhcC15ZWFyKQp5cnMgPSBbW11dKk5VTV9ZRUFSCmZvciBpZHggaW4gcmFuZ2UoTlVNX1lFQVIpOgogICAgeXJzW2lkeF0gPSAwCnlyc1tnZXRZZWFyRGF5KGRhdGV0aW1lKDIwMTksIDEsIDEsIDAsIDAsIDApKV0gPSAxICAjIEphbgp5cnNbZ2V0WWVhckRheShkYXRldGltZSgyMDE5LCAyLCAxLCAwLCAwLCAwKSldID0gMSAgIyBGZWIuCnlyc1tnZXRZZWFyRGF5KGRhdGV0aW1lKDIwMTksIDMsIDEsIDAsIDAsIDApKV0gPSAxICAjIE1hci4KTlVNX01PTlRIID0gMzcgICMgNiBsaW5lcyBpbiBjYWxlbmRhciAoIDcgKiA1IGxpbmVzICsgMiBbMzAsIDMxIGRheXNdKQptdHMgPSBbW11dKk5VTV9NT05USApmb3IgaWR4IGluIHJhbmdlKE5VTV9NT05USCk6CiAgICBtdHNbaWR4XSA9IDAKCiMgMi4gbWFpbiBwYXJ0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmFkdCA9IGRhdGV0aW1lKDIwMTksIDIsIDEsIDAsIDAsIDApICAjIHltZGhucwoKYXdkYXkgPSBnZXRXZWVrRGF5KGFkdCkKYXlkYXkgPSBnZXRZZWFyRGF5KGFkdCkKCmZvciBpZHggaW4gcmFuZ2UoMzEpOiAgIyAzMTogbWF4aW11bSBmb3Igb25lIG1vbnRoCiAgICBtdHNbYXdkYXkgKyBpZHhdID0geXJzW2F5ZGF5ICsgaWR4XQoKcHJpbnQoJ0ZlYicpCmRpc3BDYWwobXRzKQo=