I am wondering how to solve this problem with basic Python (no libraries to be used): How to calculate when one's 10000 day after their birthday will be (/would be). For instance, given Monday 19/05/2008 the desired day is Friday 05/10/2035 (according to https://www.durrans.com/projects/calc/10000/index.html?dob=19%2F5%2F2008&e=mc2)
What I have done so far is the following script:
years = range(2000, 2050)
lst_days = []
count = 0
tot_days = 0
for year in years:
if((year % 400 == 0) or (year % 100 != 0) and (year % 4 == 0)):
lst_days.append(366)
else:
lst_days.append(365)
while tot_days <= 10000:
tot_days = tot_days + lst_days[count]
count = count+1
print(count)
which estimates the person's age after 10'000 days from their birthday (for people born after 2000). But I am puzzled how to proceed.
If you import library datetime
import datetime
your_date = "01/05/2000"
(day, month, years) = your_date.split("/")
date = datetime.date(int(years), int(month), int(day))
date_10000 = date+datetime.timedelta(days=10000)
print(date_10000)
No library script
your_date = "20/05/2000"
(day, month, year) = your_date.split("/")
days = 10000
year = int(year)
month = int(month)
day = int(day)
end=False
#m1,m3,m5,m7,m8,m10,m12=31
#m2=28
#m4,m6,m9,m11=30
m=[31,28,31,30,31,30,31,31,30,31,30,31]
while end!=True:
if(((year % 400 == 0) or (year % 100 != 0) and (year % 4 == 0)) and(days-366>=0)):
days-=366
year+=1
elif(((year % 400 != 0) or (year % 100 != 0) and (year % 4 != 0)) and(days-366>=0)):
days-=365
year+=1
else:
end=True
end=False
if(((year % 400 == 0) or (year % 100 != 0) and (year % 4 == 0))):
m[1]=29
else:
m[1]=28
while end!=True:
if(days-m[month]>=0):
days-=m[month]
if(month+1!=12):
month+=1
else:
year+=1
if(((year % 400 == 0) or (year % 100 != 0) and (year % 4 == 0))):
m[1]=29
else:
m[1]=28
month=0
else:
end=True
if(day+days>m[month]):
day=day+days-m[month]+1
if(month+1!=12):
month+=1
else:
year+=1
if(((year % 400 == 0) or (year % 100 != 0) and (year % 4 == 0))):
m[1]=29
else:
m[1]=28
month=0
else:
day=day+days
print(day,"/",month,"/",year)
Here's a solution I came up with that involves no libraries or packages, just loops and conditionals (accounts for leap years):
def isLeapYear(years):
if years % 4 == 0:
if years % 100 == 0:
if years % 400 == 0:
return True
else:
return False
else:
return True
else:
return False
monthDays = [31,28,31,30,31,30,31,31,30,31,30,31]
sum = 0
sumDays = []
for i in monthDays:
sumDays.append(365 - sum)
sum += i
timeInp = input("Please enter your birthdate in the format dd/mm/yyyy\n")
timeInp = timeInp.split("/")
days = int(timeInp[0])
months = int(timeInp[1])
years = int(timeInp[2])
totDays = 10000
if totDays > 366:
if isLeapYear(years):
if months == 1 or months == 2:
totDays -= (sumDays[months - 1] + 1 - days) + 1
else:
totDays -= (sumDays[months - 1] - days) + 1
else:
totDays -= (sumDays[months - 1] - days) + 1
months = 1
days = 1
years += 1
while totDays > 366:
if isLeapYear(years):
totDays -= 366
else:
totDays -= 365
years += 1
i = 0
while totDays != 0:
if isLeapYear(years):
monthDays[1] = 29
else:
monthDays[1] = 28
if totDays >= monthDays[i]:
months += 1
totDays -= monthDays[i]
elif totDays == monthDays[i]:
months += 1
totDays = 0
else:
days += totDays
if days % (monthDays[i] + 1)!= days:
days %= monthDays[i] + 1
months += 1
totDays = 0
if months == 13:
months = 1
years += 1
i += 1
if i == 12:
i = 0
print(str(days) + "/" + str(months) + "/" + str(years))
As the name suggests, isLeapYear() takes in a parameter years, and returns a boolean value.
Our first step to this problem, to make it easier, is to just first "translate" our date to the next year. This makes our future calculations easier. To do this, we can define an array sumDays that stores the amount of days each month takes to finish the year (go to new years). Then, we subtract this amount from totDays, account for leap years, and update our variables.
Next, is the easy part, just skipping forward by the years while we have enough days for a complete year.
Once we can not add another full year, we just go month by month until we run out of days.
I hope this helped! Please let me know if you need any further details or clarification (or if I made a mistake) :)
Sample Test Cases:
Input #1:
19/05/2008
Output #1:
5/10/2035
Input #2:
05/05/2020
Output #2:
21/9/2047
Input #3:
29/02/2020
Output #3:
17/7/2047
I checked most of my solutions with this website: https://www.countcalculate.com/calendar/birthday-in-days/result