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)
I have updated my code for the leap year and month dates. Here is the code that I'm using:
n = input("Enter your DOB:(dd/mm/yyyy)")
d,m,y = n.split('/') #Splitting the DOB
d,m,y = int(d), int(m), int(y)
def if_leap(year): # Checking for leap year.
if year % 4 != 0:
return False
elif year % 100 == 0 and year % 400 != 0:
return False
else:
return True
target = 10000
while target > 364: # getting no.of years
if if_leap(y):
target -= 366
y += 1
else:
target -= 365
y += 1
while target > 27: # getting no. of months
if m == 2 :
if if_leap(y):
target -= 29
m += 1
if m >= 12: # Resetting the month to 1 if it's value is greater than 12
y += 1
m -= 12
else:
target -= 28
m += 1
if m >= 12:
y += 1
m -= 12
elif m in [1, 3, 5, 7, 8, 10, 12]:
target -= 31
m += 1
if m >= 12:
y += 1
m -= 12
elif m in [4, 6, 9, 11]:
target -= 30
m += 1
if m >= 12:
y += 1
m -= 12
d = d + target # getting the no. of days
if d > 27:
if m == 2:
if if_leap(y):
d -= 29
m += 1
else:
d -= 28
m += 1
elif m in [1, 3, 5, 7, 8, 10, 12]:
d -= 31
m += 1
else:
d -= 30
m += 1
print(f"The 10000th date will be {d}/{m}/{y}")
Output:
Enter your DOB:(dd/mm/yyyy): 06/01/2006
The 10000th date will be 24/5/2033
P.S: I am getting some slightly different outputs when checking with that website. Can anyone figure out the bug/mistake in the code? It'll be really helpful.
For eg. for the date 08/12/2004, it should be 25/4/2032 but my output is showing 24/4/2032.
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