From f8a5fb20bf76d854ed7303b966ab48089a2890c8 Mon Sep 17 00:00:00 2001 From: mmaury2727 Date: Wed, 15 Nov 2023 15:27:08 +0100 Subject: [PATCH 1/6] commit d'office ( c'est un test ) --- __main__.py | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/__main__.py b/__main__.py index 53c2c43..dbf5901 100644 --- a/__main__.py +++ b/__main__.py @@ -1,5 +1,74 @@ + + def main() -> None: - print("Hello world") + """fonction principale du projet""" + date = str(input("Donner un date au format YYYY-MM-DD \n")) + + if (len(date) != 10): + print("ERREUR : Le format n'a pas été respecté") + return None + yearStr = str(date[0]+date[1]+date[2]+date[3]) + monthStr = str(date[5]+date[6]) + dayStr = str(date[8]+date[9]) + + try: + year = int(yearStr) + month = int(monthStr) + day = int(dayStr) + except ValueError: + print("ERREUR : Nous attendons des chiffres") + return None + + is_valid_date(date, year, month, day) + print("Date Valide ! ") + + anchor_day(year) + + + + + + + + +def is_valid_date(date :str, year: int, month: int, day: int) -> bool: + """Permet de savoir si la date ne présente aucune erreur""" + + + + is_leap_year = year_is_leap_year(year) + + if(year < 1583): + print("ERREUR : l'année est invalide") + return False + + if(month < 0 or month > 12): + print("ERREUR : Le mois est invalides") + return False + + if(day < 0 or (day > 31 and (month == 1 or month == 3 or month == 5 or + month == 7 or month == 8 or month == 10 or month == 12)) or + day > 30 and (month == 4 or month == 6 or month == 9 or month == 11) or + (day > 28 and not is_leap_year) or (day > 29 and is_leap_year)): + print("ERREUR : Le jour est invalide") + return False + + return True + +def year_is_leap_year(year: int) -> bool: + """Permet de savoir si une année est bisextille""" + if(year % 4 != 0): + return False + elif(year % 100 == 0 and year % 400 != 0): + return False + else: + return True + +def anchor_day(year: int) -> int: + two_last_numbers_year = str(year)[2]+str(year)[3] + print(two_last_numbers_year) + anchor = int(two_last_numbers_year) + return anchor main() From d7b9c391ef7aa2d8635846901ebb2063505c1439 Mon Sep 17 00:00:00 2001 From: mmaury2727 Date: Thu, 16 Nov 2023 21:54:15 +0100 Subject: [PATCH 2/6] v2 --- __main__.py | 100 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 96 insertions(+), 4 deletions(-) diff --git a/__main__.py b/__main__.py index dbf5901..c4017ac 100644 --- a/__main__.py +++ b/__main__.py @@ -1,6 +1,6 @@ -def main() -> None: +def main() -> None: """fonction principale du projet""" date = str(input("Donner un date au format YYYY-MM-DD \n")) @@ -22,7 +22,7 @@ def main() -> None: is_valid_date(date, year, month, day) print("Date Valide ! ") - anchor_day(year) + anchor_calc(year, month, day) @@ -39,7 +39,7 @@ def is_valid_date(date :str, year: int, month: int, day: int) -> bool: is_leap_year = year_is_leap_year(year) - if(year < 1583): + if(year < 1583 or year < 2200): print("ERREUR : l'année est invalide") return False @@ -65,10 +65,102 @@ def year_is_leap_year(year: int) -> bool: else: return True -def anchor_day(year: int) -> int: +def anchor_calc(year: int, month: int, day: int) -> int: two_last_numbers_year = str(year)[2]+str(year)[3] print(two_last_numbers_year) anchor = int(two_last_numbers_year) + anchor = first_stage(anchor) + anchor = seven_multiple(anchor) + year_anchor = get_year_anchor(anchor, year) + month_anchor = get_month_anchor(year_anchor, month, year) + final_day = last_stage(year_anchor,month_anchor, day) + return anchor +def first_stage(two_last_numbers: int) -> int: + if(two_last_numbers % 2 != 0): + two_last_numbers += 11 + two_last_numbers = two_last_numbers // 2 + if(two_last_numbers % 2 != 0): + two_last_numbers += 11 + two_last_numbers = two_last_numbers // 2 + + return two_last_numbers + +def seven_multiple(anchor: int) -> int: + test_number = anchor + counter = 0 + while(True): + anchor -= 7 + if(anchor < 0 ): + break + counter += 1 + test_number = test_number - 7 * counter + return test_number + +def get_year_anchor(anchor: int, year: int) -> int: + if(1600 <= year <= 1699 or 2000 <= year <= 2099): + return anchor + 2 + if(1700 <= year <= 1799 or 2100 <= year <= 2199): + return anchor + 0 + if(1800 <= year <= 1899 or 2200 <= year <= 2299): + return anchor + 5 + else: + return anchor + 3 + +def get_month_anchor(anchor: int, month: int, year: int) -> int: + is_leap_year = year_is_leap_year(year) + if (month == 1): + if (is_leap_year): + return 11 + else : return 10 + + if (month == 2): + if(is_leap_year): + return 22 + else : return 21 + + if (month == 3): + return 0 + + if (month == 4): + return 4 + + if (month == 5): + return 9 + + if (month == 6): + return 6 + + if (month == 7): + return 11 + + if (month == 8): + return 8 + + if (month == 9): + return 5 + + if (month == 10): + return 10 + + if (month == 11): + return 7 + + else: + return 12 + + +#à finir faut rajouter le else bonne chance mon reuf +def last_stage(year_anchor: int, month_anchor: int, day) -> int: + if(month_anchor - year_anchor >= 0): + if(month_anchor - year_anchor <= 7): + return month_anchor - year_anchor + else: + while(month_anchor - year_anchor >= 7): + month_anchor = month_anchor - 7 + if ( month_anchor - year_anchor <= 7 ): + return month_anchor - year_anchor + + return 0 main() From 7a5288566334d5a6fdb49d949718224349697bc6 Mon Sep 17 00:00:00 2001 From: mmaury2727 Date: Fri, 17 Nov 2023 15:01:26 +0100 Subject: [PATCH 3/6] presque fini on voit le bout --- __main__.py | 174 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 137 insertions(+), 37 deletions(-) diff --git a/__main__.py b/__main__.py index c4017ac..f8431b8 100644 --- a/__main__.py +++ b/__main__.py @@ -1,7 +1,7 @@ def main() -> None: - """fonction principale du projet""" + """fonction principale du TP""" date = str(input("Donner un date au format YYYY-MM-DD \n")) if (len(date) != 10): @@ -19,11 +19,17 @@ def main() -> None: print("ERREUR : Nous attendons des chiffres") return None - is_valid_date(date, year, month, day) - print("Date Valide ! ") + can_launch_algo = is_valid_date(date, year, month, day) - anchor_calc(year, month, day) + if(can_launch_algo): + print("Date Valide ! ") + anchor_calc(year, month, day) + + else: + + print("Date invalide, veuillez recommencer") + return @@ -39,18 +45,19 @@ def is_valid_date(date :str, year: int, month: int, day: int) -> bool: is_leap_year = year_is_leap_year(year) - if(year < 1583 or year < 2200): + if(year < 1583 or year > 2200): print("ERREUR : l'année est invalide") return False if(month < 0 or month > 12): - print("ERREUR : Le mois est invalides") + print("ERREUR : Le mois est invalide") return False if(day < 0 or (day > 31 and (month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or month == 10 or month == 12)) or day > 30 and (month == 4 or month == 6 or month == 9 or month == 11) or - (day > 28 and not is_leap_year) or (day > 29 and is_leap_year)): + ((day > 28 and not is_leap_year) or + (day > 29 and is_leap_year))) and month == 2: print("ERREUR : Le jour est invalide") return False @@ -67,36 +74,49 @@ def year_is_leap_year(year: int) -> bool: def anchor_calc(year: int, month: int, day: int) -> int: two_last_numbers_year = str(year)[2]+str(year)[3] - print(two_last_numbers_year) + print("2 derniers chiffre de l'année : "+two_last_numbers_year) anchor = int(two_last_numbers_year) anchor = first_stage(anchor) - anchor = seven_multiple(anchor) + print("premier calcul impair pair : "+str(anchor)) + anchor = seven_multiple(anchor) + print("distance avec le plus grand multipe de 7 : " + str(anchor)) + # donne le jour ancre de l'année year_anchor = get_year_anchor(anchor, year) + if ( year_anchor >= 7 ): + year_anchor -= 7 + print("jour ancre de l'année : " + str(year_anchor)) + # donne le jour sur lequel tombera le jour ancre en focntion du mois et de l'année month_anchor = get_month_anchor(year_anchor, month, year) + print("jour ancre du mois : "+ str(month_anchor)) final_day = last_stage(year_anchor,month_anchor, day) + print("écart entre le jour de l'utilisateur et le jour ancre : " + str(final_day)) + final_day = abs(final_day) + year_anchor + if (final_day >= 7): + final_day = final_day - 7 + print("le jour final est : " +str(final_day)) + print_result(year, month, day, (final_day)) return anchor def first_stage(two_last_numbers: int) -> int: - if(two_last_numbers % 2 != 0): + # si il est impair + if(two_last_numbers % 2 != 0): + # on ajoute 11 et on divise par 2 + two_last_numbers += 11 + two_last_numbers = two_last_numbers // 2 + if(two_last_numbers % 2 != 0): + # si le nombre est de nouveau impaire on réajoute 11 + two_last_numbers += 11 + else: + two_last_numbers = two_last_numbers // 2 + if (two_last_numbers % 2 != 0): two_last_numbers += 11 - two_last_numbers = two_last_numbers // 2 - if(two_last_numbers % 2 != 0): - two_last_numbers += 11 - two_last_numbers = two_last_numbers // 2 - + return two_last_numbers -def seven_multiple(anchor: int) -> int: - test_number = anchor - counter = 0 - while(True): - anchor -= 7 - if(anchor < 0 ): - break - counter += 1 - test_number = test_number - 7 * counter - return test_number +def seven_multiple(anchor: int) -> int: + anchor = 7 - anchor % 7 + return anchor def get_year_anchor(anchor: int, year: int) -> int: if(1600 <= year <= 1699 or 2000 <= year <= 2099): @@ -150,17 +170,97 @@ def get_month_anchor(anchor: int, month: int, year: int) -> int: else: return 12 - -#à finir faut rajouter le else bonne chance mon reuf def last_stage(year_anchor: int, month_anchor: int, day) -> int: - if(month_anchor - year_anchor >= 0): - if(month_anchor - year_anchor <= 7): - return month_anchor - year_anchor - else: - while(month_anchor - year_anchor >= 7): - month_anchor = month_anchor - 7 - if ( month_anchor - year_anchor <= 7 ): - return month_anchor - year_anchor - - return 0 + """year = jour ancre de l'année month = jour sur lequel tombera le jour + ancre en fonction de l'année day = jour demandé par l'utilisateur""" + + + final_day = month_anchor - day # 0 - 18 = -18 + print("test :") + print(final_day) + + if (0 <= final_day <= 7): + return final_day + elif ( -7 <= final_day < 0 ): + return final_day * -1 + elif (final_day < 0): + while ( final_day <= -7 ): + final_day += 7 + print(final_day) + return final_day * -1 + else: + while ( final_day > 0 ): + final_day -= 7 + return final_day + + #if(month_anchor - day >= 0): # m = 12 d = 16 + # if(month_anchor - day <= 7): + # return month_anchor - day + # else: + # while(month_anchor - day >= 7): + # month_anchor = month_anchor - 7 + # if ( month_anchor - day <= 7 ): + # return month_anchor - day + # else: # m = 0 d = 2 + # if(month_anchor + day <= 7): + # return month_anchor + day + # else: + # while(month_anchor + day >= 7): + # month_anchor = month_anchor + 7 + # if ( month_anchor + day <= 7 ): + # return month_anchor + day + + + return 0 + +def print_result(year: int, month: int, day: int, final_day: int): + print("Le "+ str(day) + " " + get_month_str(month) + " " + str(year) + + " est un " + get_day_str(final_day)) + + +def get_month_str(month: int) -> str: + if (month == 1): + return "Janvier" + if (month == 2): + return "Fevrier" + if (month == 3): + return "Mars" + if (month == 4): + return "Avril" + if (month == 5): + return "Mai" + if (month == 6): + return "Juin" + if (month == 7): + return "Juillet" + if (month == 8): + return "Aout" + if (month == 9): + return "Septembre" + if (month == 10): + return "Octobre" + if (month == 11): + return "Novembre" + if (month == 12): + return "Decembre" + + return "" + +def get_day_str(day: int) -> str: + if (day == 0): + return "Dimanche" + if (day == 1): + return "Lundi" + if (day == 2): + return "Mardi" + if (day == 3): + return "Mercredi" + if (day == 4): + return "Jeudi" + if (day == 5): + return "Vendredi" + if (day == 6): + return "Samedi" + return "" + main() From bd66dd13ee42ffc91f9ea4a7b1463c5cca714936 Mon Sep 17 00:00:00 2001 From: mmaury2727 Date: Fri, 17 Nov 2023 16:03:11 +0100 Subject: [PATCH 4/6] c'est fini jcrois --- __main__.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/__main__.py b/__main__.py index f8431b8..a2edfed 100644 --- a/__main__.py +++ b/__main__.py @@ -90,7 +90,7 @@ def anchor_calc(year: int, month: int, day: int) -> int: print("jour ancre du mois : "+ str(month_anchor)) final_day = last_stage(year_anchor,month_anchor, day) print("écart entre le jour de l'utilisateur et le jour ancre : " + str(final_day)) - final_day = abs(final_day) + year_anchor + final_day = -1 * final_day + year_anchor if (final_day >= 7): final_day = final_day - 7 print("le jour final est : " +str(final_day)) @@ -187,7 +187,7 @@ def last_stage(year_anchor: int, month_anchor: int, day) -> int: while ( final_day <= -7 ): final_day += 7 print(final_day) - return final_day * -1 + return final_day else: while ( final_day > 0 ): final_day -= 7 @@ -262,5 +262,11 @@ def get_day_str(day: int) -> str: if (day == 6): return "Samedi" return "" + +def get_doomsday(day: int, day_anchor: int, step: int) -> int: + # + if(day % 7 == day_anchor ): + return day + return 0 main() From 4ef85d2bfd058539355c4a8c971621f8f22c0196 Mon Sep 17 00:00:00 2001 From: mmaury2727 Date: Sat, 18 Nov 2023 21:17:36 +0100 Subject: [PATCH 5/6] =?UTF-8?q?tests=20pass=C3=A9s,=20manque=20plus=20que?= =?UTF-8?q?=20finir=20les=20convention?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __main__.py | 166 +++++++++++-------------- doomsday/algorithm.py | 283 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 354 insertions(+), 95 deletions(-) diff --git a/__main__.py b/__main__.py index a2edfed..8ffc8b3 100644 --- a/__main__.py +++ b/__main__.py @@ -1,12 +1,10 @@ - - -def main() -> None: +def main(date: str) -> str: """fonction principale du TP""" - date = str(input("Donner un date au format YYYY-MM-DD \n")) + #date = str(input("Donner un date au format YYYY-MM-DD \n")) if (len(date) != 10): print("ERREUR : Le format n'a pas été respecté") - return None + return "" yearStr = str(date[0]+date[1]+date[2]+date[3]) monthStr = str(date[5]+date[6]) dayStr = str(date[8]+date[9]) @@ -17,27 +15,22 @@ def main() -> None: day = int(dayStr) except ValueError: print("ERREUR : Nous attendons des chiffres") - return None + return "" - can_launch_algo = is_valid_date(date, year, month, day) + can_launch_algo = is_valid_date(year, month, day) if(can_launch_algo): print("Date Valide ! ") - anchor_calc(year, month, day) + doomsday = anchor_calc(year, month, day) + return doomsday else: print("Date invalide, veuillez recommencer") - return - - - + return "" - - - -def is_valid_date(date :str, year: int, month: int, day: int) -> bool: +def is_valid_date(year: int, month: int, day: int) -> bool: """Permet de savoir si la date ne présente aucune erreur""" @@ -72,31 +65,40 @@ def year_is_leap_year(year: int) -> bool: else: return True -def anchor_calc(year: int, month: int, day: int) -> int: +def anchor_calc(year: int, month: int, day: int) -> str: two_last_numbers_year = str(year)[2]+str(year)[3] - print("2 derniers chiffre de l'année : "+two_last_numbers_year) anchor = int(two_last_numbers_year) anchor = first_stage(anchor) - print("premier calcul impair pair : "+str(anchor)) + # print("premier calcul impair pair : "+str(anchor)) anchor = seven_multiple(anchor) - print("distance avec le plus grand multipe de 7 : " + str(anchor)) # donne le jour ancre de l'année year_anchor = get_year_anchor(anchor, year) if ( year_anchor >= 7 ): year_anchor -= 7 print("jour ancre de l'année : " + str(year_anchor)) # donne le jour sur lequel tombera le jour ancre en focntion du mois et de l'année - month_anchor = get_month_anchor(year_anchor, month, year) + month_anchor = get_month_anchor(month, year) print("jour ancre du mois : "+ str(month_anchor)) - final_day = last_stage(year_anchor,month_anchor, day) - print("écart entre le jour de l'utilisateur et le jour ancre : " + str(final_day)) - final_day = -1 * final_day + year_anchor - if (final_day >= 7): - final_day = final_day - 7 - print("le jour final est : " +str(final_day)) - print_result(year, month, day, (final_day)) + + final_day = get_user_requested_day(year_anchor, month_anchor, day) - return anchor + return get_day_str(final_day) + +def get_user_requested_day(year_anchor: int, month_anchor: int, day: int) -> int: + # Calcul du Jour de l'Ancre du Mois + month_anchor_day = (year_anchor + month_anchor) % 7 + + # Calcul de l'Écart de Jours + day_difference = day - month_anchor_day + + # Normalisation de l'Écart de Jours + user_requested_day = (day_difference % 7 + 7) % 7 + + return user_requested_day + + + + def first_stage(two_last_numbers: int) -> int: # si il est impair @@ -118,6 +120,7 @@ def seven_multiple(anchor: int) -> int: anchor = 7 - anchor % 7 return anchor + def get_year_anchor(anchor: int, year: int) -> int: if(1600 <= year <= 1699 or 2000 <= year <= 2099): return anchor + 2 @@ -128,7 +131,9 @@ def get_year_anchor(anchor: int, year: int) -> int: else: return anchor + 3 -def get_month_anchor(anchor: int, month: int, year: int) -> int: + + +def get_month_anchor(month: int, year: int) -> int: is_leap_year = year_is_leap_year(year) if (month == 1): if (is_leap_year): @@ -170,48 +175,6 @@ def get_month_anchor(anchor: int, month: int, year: int) -> int: else: return 12 -def last_stage(year_anchor: int, month_anchor: int, day) -> int: - """year = jour ancre de l'année month = jour sur lequel tombera le jour - ancre en fonction de l'année day = jour demandé par l'utilisateur""" - - - final_day = month_anchor - day # 0 - 18 = -18 - print("test :") - print(final_day) - - if (0 <= final_day <= 7): - return final_day - elif ( -7 <= final_day < 0 ): - return final_day * -1 - elif (final_day < 0): - while ( final_day <= -7 ): - final_day += 7 - print(final_day) - return final_day - else: - while ( final_day > 0 ): - final_day -= 7 - return final_day - - #if(month_anchor - day >= 0): # m = 12 d = 16 - # if(month_anchor - day <= 7): - # return month_anchor - day - # else: - # while(month_anchor - day >= 7): - # month_anchor = month_anchor - 7 - # if ( month_anchor - day <= 7 ): - # return month_anchor - day - # else: # m = 0 d = 2 - # if(month_anchor + day <= 7): - # return month_anchor + day - # else: - # while(month_anchor + day >= 7): - # month_anchor = month_anchor + 7 - # if ( month_anchor + day <= 7 ): - # return month_anchor + day - - - return 0 def print_result(year: int, month: int, day: int, final_day: int): print("Le "+ str(day) + " " + get_month_str(month) + " " + str(year) + @@ -243,30 +206,45 @@ def get_month_str(month: int) -> str: return "Novembre" if (month == 12): return "Decembre" - return "" -def get_day_str(day: int) -> str: - if (day == 0): - return "Dimanche" - if (day == 1): - return "Lundi" - if (day == 2): - return "Mardi" - if (day == 3): - return "Mercredi" - if (day == 4): - return "Jeudi" - if (day == 5): - return "Vendredi" - if (day == 6): - return "Samedi" +def get_day_str(day: int) -> str: + """permet de convertir notre int en un jour de la semaine""" + if day == 0: + return "Sunday" + if day == 1: + return "Monday" + if day == 2: + return "Tuesday" + if day == 3: + return "Wednesday" + if day == 4: + return "Thursday" + if day == 5: + return "Friday" + if day == 6: + return "Saturday" return "" -def get_doomsday(day: int, day_anchor: int, step: int) -> int: - # - if(day % 7 == day_anchor ): - return day +def if_step_negative(step: int) -> int: + if step == -1 : + return 6 + if step == -2 : + return 5 + if step == -3 : + return 4 + if step == -4 : + return 3 + if step == -5 : + return 2 + if step == -6 : + return 1 return 0 - -main() + +def get_weekday_for_date(date: str) -> str: + print(main(date)) + return main(date) + +# get_weekday_for_date("2021-02-20") +# get_weekday_for_date("2021-03-10") +get_weekday_for_date("2000-01-10") diff --git a/doomsday/algorithm.py b/doomsday/algorithm.py index cf81d60..50c6a54 100644 --- a/doomsday/algorithm.py +++ b/doomsday/algorithm.py @@ -1,2 +1,283 @@ +def main(date: str) -> str: + """fonction principale du TP""" + #date = str(input("Donner un date au format YYYY-MM-DD \n")) + + if (len(date) != 10): + print("ERREUR : Le format n'a pas été respecté") + return "" + yearStr = str(date[0]+date[1]+date[2]+date[3]) + monthStr = str(date[5]+date[6]) + dayStr = str(date[8]+date[9]) + + try: + year = int(yearStr) + month = int(monthStr) + day = int(dayStr) + except ValueError: + print("ERREUR : Nous attendons des chiffres") + return "" + + can_launch_algo = is_valid_date(year, month, day) + + if(can_launch_algo): + + print("Date Valide ! ") + doomsday = anchor_calc(year, month, day) + return doomsday + + else: + + print("Date invalide, veuillez recommencer") + return "" + +def is_valid_date(year: int, month: int, day: int) -> bool: + """Permet de savoir si la date ne présente aucune erreur""" + + + + is_leap_year = year_is_leap_year(year) + + + if(year < 1583 or year > 2399): + print("ERREUR : l'année est invalide") + return False + + if(month < 0 or month > 12): + print("ERREUR : Le mois est invalide") + return False + + if(day < 0 or (day > 31 and (month == 1 or month == 3 or month == 5 or + month == 7 or month == 8 or month == 10 or month == 12)) or + day > 30 and (month == 4 or month == 6 or month == 9 or month == 11) or + ((day > 28 and not is_leap_year) or + (day > 29 and is_leap_year))) and month == 2: + print("ERREUR : Le jour est invalide") + return False + + return True + +def year_is_leap_year(year: int) -> bool: + """Permet de savoir si une année est bisextille""" + if(year % 4 != 0): + return False + elif(year % 100 == 0 and year % 400 != 0): + return False + else: + return True + +# def anchor_calc(year: int, month: int, day: int) -> str: +# two_last_numbers_year = str(year)[2]+str(year)[3] +# anchor = int(two_last_numbers_year) +# anchor = first_stage(anchor) +# # print("premier calcul impair pair : "+str(anchor)) +# anchor = seven_multiple(anchor) +# # donne le jour ancre de l'année +# year_anchor = get_year_anchor(anchor, year) +# if ( year_anchor >= 7 ): +# year_anchor -= 7 +# print("jour ancre de l'année : " + str(year_anchor)) +# # donne le jour sur lequel tombera le jour ancre en focntion du mois et de l'année +# month_anchor = get_month_anchor(month, year) +# print("jour ancre du mois : "+ str(month_anchor)) + +# final_day = get_user_requested_day(year_anchor, month_anchor, day) + +# return get_day_str(final_day) + +def anchor_calc(year: int, month: int, day: int) -> str: + two_last_numbers_year = str(year)[2] + str(year)[3] + anchor = int(two_last_numbers_year) + anchor = first_stage(anchor) + anchor = seven_multiple(anchor) + + # Donne le jour ancre de l'année + year_anchor = get_year_anchor(anchor, year) + if year_anchor >= 7: + year_anchor -= 7 + print("Jour ancre de l'année : " + str(year_anchor)) + + # Donne le jour sur lequel tombera le jour ancre en fonction du mois et de l'année + month_anchor = get_month_anchor(month, year) + print("Jour ancre du mois : " + str(month_anchor)) + + final_day = get_user_requested_day(year_anchor, month_anchor, day) + print("Jour final : " + str(final_day)) + + return get_day_str(final_day) + + +def get_user_requested_day(year_anchor: int, month_anchor: int, day: int) -> int: + final_day = ( day - month_anchor ) % 7 + + final_day = ( year_anchor + final_day) % 7 + + return final_day + # # Calcul du Jour de l'Ancre du Mois + # month_anchor_day = (year_anchor + month_anchor) % 7 + + # # Calcul de l'Écart de Jours + # day_difference = day - month_anchor_day + + # # Normalisation de l'Écart de Jours + # user_requested_day = (day_difference + 14) % 7 + + # return user_requested_day + + + + + + + + + + +def first_stage(two_last_numbers: int) -> int: + # si il est impair + if(two_last_numbers % 2 != 0): + # on ajoute 11 et on divise par 2 + two_last_numbers += 11 + two_last_numbers = two_last_numbers // 2 + if(two_last_numbers % 2 != 0): + # si le nombre est de nouveau impaire on réajoute 11 + two_last_numbers += 11 + else: + two_last_numbers = two_last_numbers // 2 + if (two_last_numbers % 2 != 0): + two_last_numbers += 11 + + return two_last_numbers + +def seven_multiple(anchor: int) -> int: + anchor = 7 - anchor % 7 + return anchor + + +def get_year_anchor(anchor: int, year: int) -> int: + if(1600 <= year <= 1699 or 2000 <= year <= 2099): + return anchor + 2 + if(1700 <= year <= 1799 or 2100 <= year <= 2199): + return anchor + 0 + if(1800 <= year <= 1899 or 2200 <= year <= 2299): + return anchor + 5 + else: + return anchor + 3 + + + +def get_month_anchor(month: int, year: int) -> int: + is_leap_year = year_is_leap_year(year) + if (month == 1): + if (is_leap_year): + return 11 + else : return 10 + + if (month == 2): + if(is_leap_year): + return 22 + else : return 21 + + if (month == 3): + return 0 + + if (month == 4): + return 4 + + if (month == 5): + return 9 + + if (month == 6): + return 6 + + if (month == 7): + return 11 + + if (month == 8): + return 8 + + if (month == 9): + return 5 + + if (month == 10): + return 10 + + if (month == 11): + return 7 + + else: + return 12 + + +def print_result(year: int, month: int, day: int, final_day: int): + print("Le "+ str(day) + " " + get_month_str(month) + " " + str(year) + + " est un " + get_day_str(final_day)) + + +def get_month_str(month: int) -> str: + if (month == 1): + return "Janvier" + if (month == 2): + return "Fevrier" + if (month == 3): + return "Mars" + if (month == 4): + return "Avril" + if (month == 5): + return "Mai" + if (month == 6): + return "Juin" + if (month == 7): + return "Juillet" + if (month == 8): + return "Aout" + if (month == 9): + return "Septembre" + if (month == 10): + return "Octobre" + if (month == 11): + return "Novembre" + if (month == 12): + return "Decembre" + return "" + +def get_day_str(day: int) -> str: + """permet de convertir notre int en un jour de la semaine""" + if day == 0: + return "Sunday" + if day == 1: + return "Monday" + if day == 2: + return "Tuesday" + if day == 3: + return "Wednesday" + if day == 4: + return "Thursday" + if day == 5: + return "Friday" + if day == 6: + return "Saturday" + return "" + +def if_step_negative(step: int) -> int: + if step == -1 : + return 6 + if step == -2 : + return 5 + if step == -3 : + return 4 + if step == -4 : + return 3 + if step == -5 : + return 2 + if step == -6 : + return 1 + return 0 + def get_weekday_for_date(date: str) -> str: - return "Sunday" + print(main(date)) + return main(date) + +# get_weekday_for_date("2021-02-20") +# get_weekday_for_date("2021-03-10") +#get_weekday_for_date("2000-01-10") +get_weekday_for_date("2259-01-10") From cf4cb74cc4cb6c91a4a5169831da6fd1de94ffe8 Mon Sep 17 00:00:00 2001 From: mmaury2727 Date: Sun, 19 Nov 2023 14:26:53 +0100 Subject: [PATCH 6/6] fin du tp --- __main__.py | 250 ------------------------------------ doomsday/algorithm.py | 286 +++++++++++++----------------------------- doomsday/date.py | 71 +++++++++++ 3 files changed, 156 insertions(+), 451 deletions(-) diff --git a/__main__.py b/__main__.py index 8ffc8b3..e69de29 100644 --- a/__main__.py +++ b/__main__.py @@ -1,250 +0,0 @@ -def main(date: str) -> str: - """fonction principale du TP""" - #date = str(input("Donner un date au format YYYY-MM-DD \n")) - - if (len(date) != 10): - print("ERREUR : Le format n'a pas été respecté") - return "" - yearStr = str(date[0]+date[1]+date[2]+date[3]) - monthStr = str(date[5]+date[6]) - dayStr = str(date[8]+date[9]) - - try: - year = int(yearStr) - month = int(monthStr) - day = int(dayStr) - except ValueError: - print("ERREUR : Nous attendons des chiffres") - return "" - - can_launch_algo = is_valid_date(year, month, day) - - if(can_launch_algo): - - print("Date Valide ! ") - doomsday = anchor_calc(year, month, day) - return doomsday - - else: - - print("Date invalide, veuillez recommencer") - return "" - -def is_valid_date(year: int, month: int, day: int) -> bool: - """Permet de savoir si la date ne présente aucune erreur""" - - - - is_leap_year = year_is_leap_year(year) - - - if(year < 1583 or year > 2200): - print("ERREUR : l'année est invalide") - return False - - if(month < 0 or month > 12): - print("ERREUR : Le mois est invalide") - return False - - if(day < 0 or (day > 31 and (month == 1 or month == 3 or month == 5 or - month == 7 or month == 8 or month == 10 or month == 12)) or - day > 30 and (month == 4 or month == 6 or month == 9 or month == 11) or - ((day > 28 and not is_leap_year) or - (day > 29 and is_leap_year))) and month == 2: - print("ERREUR : Le jour est invalide") - return False - - return True - -def year_is_leap_year(year: int) -> bool: - """Permet de savoir si une année est bisextille""" - if(year % 4 != 0): - return False - elif(year % 100 == 0 and year % 400 != 0): - return False - else: - return True - -def anchor_calc(year: int, month: int, day: int) -> str: - two_last_numbers_year = str(year)[2]+str(year)[3] - anchor = int(two_last_numbers_year) - anchor = first_stage(anchor) - # print("premier calcul impair pair : "+str(anchor)) - anchor = seven_multiple(anchor) - # donne le jour ancre de l'année - year_anchor = get_year_anchor(anchor, year) - if ( year_anchor >= 7 ): - year_anchor -= 7 - print("jour ancre de l'année : " + str(year_anchor)) - # donne le jour sur lequel tombera le jour ancre en focntion du mois et de l'année - month_anchor = get_month_anchor(month, year) - print("jour ancre du mois : "+ str(month_anchor)) - - final_day = get_user_requested_day(year_anchor, month_anchor, day) - - return get_day_str(final_day) - -def get_user_requested_day(year_anchor: int, month_anchor: int, day: int) -> int: - # Calcul du Jour de l'Ancre du Mois - month_anchor_day = (year_anchor + month_anchor) % 7 - - # Calcul de l'Écart de Jours - day_difference = day - month_anchor_day - - # Normalisation de l'Écart de Jours - user_requested_day = (day_difference % 7 + 7) % 7 - - return user_requested_day - - - - - -def first_stage(two_last_numbers: int) -> int: - # si il est impair - if(two_last_numbers % 2 != 0): - # on ajoute 11 et on divise par 2 - two_last_numbers += 11 - two_last_numbers = two_last_numbers // 2 - if(two_last_numbers % 2 != 0): - # si le nombre est de nouveau impaire on réajoute 11 - two_last_numbers += 11 - else: - two_last_numbers = two_last_numbers // 2 - if (two_last_numbers % 2 != 0): - two_last_numbers += 11 - - return two_last_numbers - -def seven_multiple(anchor: int) -> int: - anchor = 7 - anchor % 7 - return anchor - - -def get_year_anchor(anchor: int, year: int) -> int: - if(1600 <= year <= 1699 or 2000 <= year <= 2099): - return anchor + 2 - if(1700 <= year <= 1799 or 2100 <= year <= 2199): - return anchor + 0 - if(1800 <= year <= 1899 or 2200 <= year <= 2299): - return anchor + 5 - else: - return anchor + 3 - - - -def get_month_anchor(month: int, year: int) -> int: - is_leap_year = year_is_leap_year(year) - if (month == 1): - if (is_leap_year): - return 11 - else : return 10 - - if (month == 2): - if(is_leap_year): - return 22 - else : return 21 - - if (month == 3): - return 0 - - if (month == 4): - return 4 - - if (month == 5): - return 9 - - if (month == 6): - return 6 - - if (month == 7): - return 11 - - if (month == 8): - return 8 - - if (month == 9): - return 5 - - if (month == 10): - return 10 - - if (month == 11): - return 7 - - else: - return 12 - - -def print_result(year: int, month: int, day: int, final_day: int): - print("Le "+ str(day) + " " + get_month_str(month) + " " + str(year) + - " est un " + get_day_str(final_day)) - - -def get_month_str(month: int) -> str: - if (month == 1): - return "Janvier" - if (month == 2): - return "Fevrier" - if (month == 3): - return "Mars" - if (month == 4): - return "Avril" - if (month == 5): - return "Mai" - if (month == 6): - return "Juin" - if (month == 7): - return "Juillet" - if (month == 8): - return "Aout" - if (month == 9): - return "Septembre" - if (month == 10): - return "Octobre" - if (month == 11): - return "Novembre" - if (month == 12): - return "Decembre" - return "" - -def get_day_str(day: int) -> str: - """permet de convertir notre int en un jour de la semaine""" - if day == 0: - return "Sunday" - if day == 1: - return "Monday" - if day == 2: - return "Tuesday" - if day == 3: - return "Wednesday" - if day == 4: - return "Thursday" - if day == 5: - return "Friday" - if day == 6: - return "Saturday" - return "" - -def if_step_negative(step: int) -> int: - if step == -1 : - return 6 - if step == -2 : - return 5 - if step == -3 : - return 4 - if step == -4 : - return 3 - if step == -5 : - return 2 - if step == -6 : - return 1 - return 0 - -def get_weekday_for_date(date: str) -> str: - print(main(date)) - return main(date) - -# get_weekday_for_date("2021-02-20") -# get_weekday_for_date("2021-03-10") -get_weekday_for_date("2000-01-10") diff --git a/doomsday/algorithm.py b/doomsday/algorithm.py index 50c6a54..06f673b 100644 --- a/doomsday/algorithm.py +++ b/doomsday/algorithm.py @@ -1,90 +1,32 @@ +"""Algo permettant de trouver le doomsday""" +from doomsday.date import is_valid_date, year_is_leap_year + + def main(date: str) -> str: - """fonction principale du TP""" - #date = str(input("Donner un date au format YYYY-MM-DD \n")) - - if (len(date) != 10): - print("ERREUR : Le format n'a pas été respecté") - return "" - yearStr = str(date[0]+date[1]+date[2]+date[3]) - monthStr = str(date[5]+date[6]) - dayStr = str(date[8]+date[9]) - - try: - year = int(yearStr) - month = int(monthStr) - day = int(dayStr) - except ValueError: - print("ERREUR : Nous attendons des chiffres") - return "" - - can_launch_algo = is_valid_date(year, month, day) - - if(can_launch_algo): - + """Fonction principale du TP""" + can_launch_algo = is_valid_date(date) + + if can_launch_algo: print("Date Valide ! ") - doomsday = anchor_calc(year, month, day) - return doomsday - - else: - - print("Date invalide, veuillez recommencer") - return "" - -def is_valid_date(year: int, month: int, day: int) -> bool: - """Permet de savoir si la date ne présente aucune erreur""" - - - - is_leap_year = year_is_leap_year(year) - - - if(year < 1583 or year > 2399): - print("ERREUR : l'année est invalide") - return False - - if(month < 0 or month > 12): - print("ERREUR : Le mois est invalide") - return False - - if(day < 0 or (day > 31 and (month == 1 or month == 3 or month == 5 or - month == 7 or month == 8 or month == 10 or month == 12)) or - day > 30 and (month == 4 or month == 6 or month == 9 or month == 11) or - ((day > 28 and not is_leap_year) or - (day > 29 and is_leap_year))) and month == 2: - print("ERREUR : Le jour est invalide") - return False - - return True - -def year_is_leap_year(year: int) -> bool: - """Permet de savoir si une année est bisextille""" - if(year % 4 != 0): - return False - elif(year % 100 == 0 and year % 400 != 0): - return False - else: - return True - -# def anchor_calc(year: int, month: int, day: int) -> str: -# two_last_numbers_year = str(year)[2]+str(year)[3] -# anchor = int(two_last_numbers_year) -# anchor = first_stage(anchor) -# # print("premier calcul impair pair : "+str(anchor)) -# anchor = seven_multiple(anchor) -# # donne le jour ancre de l'année -# year_anchor = get_year_anchor(anchor, year) -# if ( year_anchor >= 7 ): -# year_anchor -= 7 -# print("jour ancre de l'année : " + str(year_anchor)) -# # donne le jour sur lequel tombera le jour ancre en focntion du mois et de l'année -# month_anchor = get_month_anchor(month, year) -# print("jour ancre du mois : "+ str(month_anchor)) - -# final_day = get_user_requested_day(year_anchor, month_anchor, day) - -# return get_day_str(final_day) + + date_list = date.split("-") + + year_str = date_list[0] + month_str = date_list[1] + day_str = date_list[2] + + year = int(year_str) + month = int(month_str) + day = int(day_str) + + + doomsday = anchor_calc(year, month, day) + return doomsday + + def anchor_calc(year: int, month: int, day: int) -> str: + """Fonction rassemblant toute les étapes de calcul du doomsday""" two_last_numbers_year = str(year)[2] + str(year)[3] anchor = int(two_last_numbers_year) anchor = first_stage(anchor) @@ -94,154 +36,115 @@ def anchor_calc(year: int, month: int, day: int) -> str: year_anchor = get_year_anchor(anchor, year) if year_anchor >= 7: year_anchor -= 7 - print("Jour ancre de l'année : " + str(year_anchor)) - # Donne le jour sur lequel tombera le jour ancre en fonction du mois et de l'année + # Donne le jour sur lequel tombera le jour ancre en + # fonction du mois et de l'année month_anchor = get_month_anchor(month, year) - print("Jour ancre du mois : " + str(month_anchor)) final_day = get_user_requested_day(year_anchor, month_anchor, day) - print("Jour final : " + str(final_day)) return get_day_str(final_day) -def get_user_requested_day(year_anchor: int, month_anchor: int, day: int) -> int: - final_day = ( day - month_anchor ) % 7 - - final_day = ( year_anchor + final_day) % 7 - - return final_day - # # Calcul du Jour de l'Ancre du Mois - # month_anchor_day = (year_anchor + month_anchor) % 7 - - # # Calcul de l'Écart de Jours - # day_difference = day - month_anchor_day - - # # Normalisation de l'Écart de Jours - # user_requested_day = (day_difference + 14) % 7 - - # return user_requested_day - - - - - - +def get_user_requested_day(year_anchor: int, + month_anchor: int, day: int) -> int: + """Permet d'obtenir la version finale normalisée du jour entré + par l'utilisateur""" + final_day = (day - month_anchor) % 7 + final_day = (year_anchor + final_day) % 7 + return final_day def first_stage(two_last_numbers: int) -> int: + """Premère étape de l'algo avec les addition de 11 et division + par 2""" # si il est impair - if(two_last_numbers % 2 != 0): + if two_last_numbers % 2 != 0: # on ajoute 11 et on divise par 2 two_last_numbers += 11 - two_last_numbers = two_last_numbers // 2 - if(two_last_numbers % 2 != 0): - # si le nombre est de nouveau impaire on réajoute 11 + two_last_numbers = two_last_numbers // 2 + if two_last_numbers % 2 != 0: + # si le nombre est de nouveau impair on réajoute 11 two_last_numbers += 11 else: two_last_numbers = two_last_numbers // 2 - if (two_last_numbers % 2 != 0): + if two_last_numbers % 2 != 0: two_last_numbers += 11 - + return two_last_numbers -def seven_multiple(anchor: int) -> int: + +def seven_multiple(anchor: int) -> int: + """Permet de trouver le mutiple de 7 supérieur le plus proche""" anchor = 7 - anchor % 7 return anchor - + def get_year_anchor(anchor: int, year: int) -> int: - if(1600 <= year <= 1699 or 2000 <= year <= 2099): + """Permet de connaitre le jour ancre de l'année en fonction + du siecle et de le distance au prochain multiple de 7 + calculé précedement""" + if 1600 <= year <= 1699 or 2000 <= year <= 2099: return anchor + 2 - if(1700 <= year <= 1799 or 2100 <= year <= 2199): + if 1700 <= year <= 1799 or 2100 <= year <= 2199: return anchor + 0 - if(1800 <= year <= 1899 or 2200 <= year <= 2299): + if 1800 <= year <= 1899 or 2200 <= year <= 2299: return anchor + 5 else: return anchor + 3 - - + def get_month_anchor(month: int, year: int) -> int: + """Permet savoir sur quel jour va tomber le jour ancre + en fonction du mois""" is_leap_year = year_is_leap_year(year) - if (month == 1): - if (is_leap_year): + if month == 1: + if is_leap_year: return 11 - else : return 10 - - if (month == 2): - if(is_leap_year): + else: + return 10 + + if month == 2: + if is_leap_year: return 22 - else : return 21 - - if (month == 3): + else: + return 21 + + if month == 3: return 0 - - if (month == 4): + + if month == 4: return 4 - - if (month == 5): + + if month == 5: return 9 - - if (month == 6): + + if month == 6: return 6 - - if (month == 7): + + if month == 7: return 11 - - if (month == 8): + + if month == 8: return 8 - if (month == 9): + if month == 9: return 5 - - if (month == 10): + + if month == 10: return 10 - - if (month == 11): + + if month == 11: return 7 - + else: return 12 - - -def print_result(year: int, month: int, day: int, final_day: int): - print("Le "+ str(day) + " " + get_month_str(month) + " " + str(year) + - " est un " + get_day_str(final_day)) - - -def get_month_str(month: int) -> str: - if (month == 1): - return "Janvier" - if (month == 2): - return "Fevrier" - if (month == 3): - return "Mars" - if (month == 4): - return "Avril" - if (month == 5): - return "Mai" - if (month == 6): - return "Juin" - if (month == 7): - return "Juillet" - if (month == 8): - return "Aout" - if (month == 9): - return "Septembre" - if (month == 10): - return "Octobre" - if (month == 11): - return "Novembre" - if (month == 12): - return "Decembre" - return "" + def get_day_str(day: int) -> str: - """permet de convertir notre int en un jour de la semaine""" + """Permet de convertir notre int en un jour de la semaine""" if day == 0: return "Sunday" if day == 1: @@ -258,26 +161,7 @@ def get_day_str(day: int) -> str: return "Saturday" return "" -def if_step_negative(step: int) -> int: - if step == -1 : - return 6 - if step == -2 : - return 5 - if step == -3 : - return 4 - if step == -4 : - return 3 - if step == -5 : - return 2 - if step == -6 : - return 1 - return 0 def get_weekday_for_date(date: str) -> str: - print(main(date)) + """Fonction à laquelle les test feront appel""" return main(date) - -# get_weekday_for_date("2021-02-20") -# get_weekday_for_date("2021-03-10") -#get_weekday_for_date("2000-01-10") -get_weekday_for_date("2259-01-10") diff --git a/doomsday/date.py b/doomsday/date.py index 0f8e737..1f86c07 100644 --- a/doomsday/date.py +++ b/doomsday/date.py @@ -1,2 +1,73 @@ +"""Verification de la validité de la date""" def is_valid_date(date: str) -> bool: + """Permet de savoir si la date ne présente aucune erreur""" + + date_list = date.split("-") + + if len(date_list) != 3 : + return False + + year_str = date_list[0] + month_str = date_list[1] + day_str = date_list[2] + + try: + year = int(year_str) + month = int(month_str) + day = int(day_str) + except ValueError: + print("ERREUR : Nous attendons des chiffres") + return False + + + is_leap_year = year_is_leap_year(year) + + if year < 1583 or year > 2400: + print("ERREUR : l'année est invalide") + return False + + if month < 0 or month > 12: + print("ERREUR : Le mois est invalide") + return False + + if ( + day < 0 + or ( + day > 31 + and ( + month == 1 + or month == 3 + or month == 5 + or month == 7 + or month == 8 + or month == 10 + or month == 12 + ) + ) + or ( + day > 30 + and ( + month == 4 or month == 6 or month == 9 or month == 11 + ) + ) + or ( + ( + (day > 28 and not is_leap_year) + or (day > 29 and is_leap_year) + ) + and month == 2 + ) + ): + print("ERREUR : Le jour est invalide") + return False + return True + +def year_is_leap_year(year: int) -> bool: + """Permet de savoir si une année est bissextile""" + if year % 4 != 0: + return False + elif year % 100 == 0 and year % 400 != 0: + return False + else: + return True