joursemaine.py

Created by schraf

Created on October 24, 2022

1.01 KB

Comment trouver mentalement un jour de la semaine pour une date au 20e ou 21e siècle ?
C’est en fait assez simple, il suffit de quelques additions et l’apprentissage de 12 chiffres.

L’explication en vidéo est donnée ici, et je vous propose la transcription de la méthode sur la calculatrice Numworks.

>> jour(6,10,2018)
'Sa'

Le 6 octobre 2018 était donc un samedi.
>> jour(6,6,1945)
'Me'

Évidemment, l’idéal serait que le module time soit incorporé dans la calculatrice mais ce n’est hélas pas le cas pour le moment.

Application de la fonction jour: Deux années sont identiques lorsque les 1er janvier et les 1er mars tombent les mêmes jours de la semaine.
Ecrire une fonction idem qui admet en paramètre une année et donne en retour toutes les années strictement identiques entre 1901 et 2050 (1900 n’était pas une année bissextile, on l’a exclue pour simplifier le programme). Par exemple :
>> idem(1968)
1912, 1940, 1968, 1996, 2024,

Faire les calculs de tête

Avec la version 2 du programme, vous avez exactement le cheminement à suivre pour faire les calculs de tête. La seule différence est que l’on fera les %7 (reste de la division par 7) au fur et à mesure et pas à la fin. Il faut bien entendu apprendre par cœur les 12 chiffres 144 025 036 146

def jour(j, m, a):
  return (j+int("144025036146"[m-1])+(a%100)//4+a%100-1-(a>=2000)-(a%4==0)*(m<3))%7


Exemple : 20 juillet 1969 (1er pas sur la lune) j=20, m=7, a=1969

  • Le reste de la division de 20 par 7 est 6 (il suffit de se dire que l’on soustrait 2*7 = 14 de 20)
  • le 7e code de “144025036146” est 0, j’ai donc 6+0=6
  • a%100 vaut 69 (2 derniers chiffres), pour calculer (a%100)//4 on divise par 2 et encore par 2 sans tenir compte des virgules, ce qui donne 69 –> 34 –> 17. J’en


from random import *

def jour(j, m, a):
  jour = "DiLuMaMeJeVeSa"
  code = "144025036146"
  biss = a%4==0 and m<3
  siecle = 2 if a>=2000 else 1
  return jour[(j+int(code[m-1])+(a%100)//4 \
  + a%100 - siecle - 1*biss)%7*2:][:2]
  
def idem(annee):
  for a in range(1901, 2050):
    if jour(1,1,a)==jour(1,1,annee) and jour(1,3,a)==jour(1,3,annee):
      print(a,end=",")

# Version 2 en une ligne...
# 1->Lundi, 2->Mardi... 0->Dimanche

def jour2(j, m, a):
  return (j+int("144025036146"[m-1])+(a%100)//4+a%100-1-(a>=2000)-(a%4==0)*(m<3))%7

# Jeu avec ou il faut trouver le jour de la semaine
# pour 5 dates au hasard
  
def sl(l):
  return "/".join([str(v) for v in l])    

def jeu():
  score=0
  nb=5
  for i in range(nb):
    a = randint(1901,2099)
    m = randint(1,12)
    j = randint(1,31 - int("030101001010"[m-1]))
    d = sl([j,m,a])
    r = input("Q"+str(i+1)+" : "+d+" > ")
    if int(r)%7==jour2(j,m,a): score+=1
    else: print("Reponse : "+str(jour2(j,m,a)))
  return "Score = "+sl([score,nb])