Position dans un cycle

Bonjour,

Je suis développeur WEB et je me suis heurté à un petit problème:
J'ai un régime horaire qui peut être décrit sur 7, 14, 21... jours. On va partir du principe que c'est toujours un multiple de 7.
Ça permet de modéliser le fait qu'un mardi sur trois un salarié doit faire 3h au lieu de 7..

Pour l'exemple on prendra un régime sur 21 jours.
J'ai une date de début de contrat par exemple le 01/01/2016 (qui est un vendredi).
A partir des éléments décrits ci-dessus j'aimerais savoir si le 18/10/2018 (par exemple) est un jeudi de ma première semaine (retour 4), de ma deuxième semaine(retour 11) ou de ma troisième semaine (retour 18).

J'ai réussi, un petit peu par hasard, a résoudre mon problème:
function num_jour_bh( int nbJourRH, Date dateDepart, Date dateATest) {
   var numJour   = dateDepart.getDayOfWeek(); // Je récupère le jour de la semaine de ma date de début de contrat (lundi =1 et dimanche 7)
   var cycle     = nbJourRH;                  // Le nombre de jour de mon régime horaire
   var nbIterate = (dateATest - dateDepart);  // Le nombre de jour d'écart entre ma date a tester et ma date de début

   return numJour+nbIterate %cycle
}
Avec notre exemple ça donnerait:
function num_jour_bh( 21, 01/01/2016, 18/10/2018) {
   var numJour   = 5;   // Je récupère le jour de la semaine de ma date de début de contrat (5 pour vendredi)
   var cycle     = 21;  // Le nombre de jour de mon régime horaire
   var nbIterate = 1021;// Le nombre de jour d'écart entre ma date a tester et ma date de début

   (5+1021)%21 = 18;    // Je sais donc, que je suis au 18ème jour de mon cycle soit un jeudi de 3ème semaine
}
Avec un if pour que 0 soit considéré comme le premier dimanche ça passe.

Bref j'aimerais comprendre comment c'est possible ? Quels principes mathématiques sont à l’œuvre ?
Avant pour faire ce traitement je faisait une boucle allant de ma date début à ma date a tester. Le problème est que plus mes dates sont éloignées plus j'ai d'itérations et mes performances en pâtissent, avec la formule c'est instantané quelque soit l'écart de date... peut-être que d'autre boucles sont optimisables comme cela...

Réponses

  • Bonjour.

    m % n semble ici être simplement le reste de la division de m par n. Division entière, comme on fait à l'école primaire.

    Cordialement.
  • Oui effectivement ça je le sais en informatique on appelle ça modulo.

    Mais comment se fait-il qu'avec un modulo on peut retrouver une position dans un cycle...
  • Ben ... la position dans un cycle est justement le reste de la division. Quand tu divise 1021+5 par 21, le reste est simplement ce qui reste après avoir soustrait autant de fois 21 que possible de 1026. Ce qui reste à faire dans le cycle pour arriver au bon jour.
  • Bonsoir,

    On peut visualiser le mécanisme avec un cadran d'horloge. Une heure, 13 heures, 25 heures... après le départ il est 01h.
    2 heures, 14 heures, 26 heures... après, il est 02h.
    C'est le reste de la division du nombre par 12.
    Ici ce serait un cadran de sept chiffres de 0 à 7, les dimanches se trouvant aux positions 0, 7, 14... Les lundis, aux positions 1, 8, 15...sont tous 1 modulo 7, les mardis 2 modulo 7, etc. C'est aussi le principe de la "preuve par 9", qu'on pratiquait assidument en primaire autrefois. Mais que tu es peut-être trop jeune pour avoir rencontrée ?

    Amicalement
  • Merci messieurs, j'y vois beaucoup plus clair, pour l'instant je ne vois pas d'autre optimisations que je pourrais faire grâce à cela mais le fait de comprendre le principe devrait m'aider à être plus réactif si je rencontre le cas à nouveau.
    La "preuve par 9" ça ne me dit absolument rien donc je ne pense pas l'avoir étudié, je vais faire des recherches là dessus, merci.
Connectez-vous ou Inscrivez-vous pour répondre.