Aller au contenu
  • 0

Premier jour d'un mois


Question

Posté(e)

Salut à tous !

 

J'ai un peu besoin d'aide ^^

Je suis à la recherche d'un algorithme qui calcule le premier jour d'un mois (pour savoir par exemple si le 1 février 2017 était un lundi, mardi, mercredi etc...)

J'ai cherché, et j'ai principalement trouvé des algorithmes en C ou C++, mais je ne comprends pas totalement ce langage... J'ai du moins réussi a trouver cet algorithme :

[spoiler=Algorithme]1510948888-capture-d-ecran-2017-11-17-a-21-01-02.png

 

 

Que j'ai traduit en skript : [spoiler=Algorithme]

function firstDayOfMonth(y: integer, m: integer) :: text:
   set {_base} to ((14 - {_m}) / 12)
   set {_annee} to ({_y} - {_base})
   set {_mois} to ({_m} + (12 * {_base}) - 2)
   set {_d} to floor((day + {_annee} + ({_annee} / 4) - ({_annee} / 100) + ({_annee} / 400) + ((31 * {_mois}) / 12)) mod 7)
   if {_d} is 0:
       set {_j} to "dimanche"
   else if {_d} is 1:
       set {_j} to  "lundi"
   else if {_d} is 2:
       set {_j} to  "mardi"
   else if {_d} is 3:
       set {_j} to  "mercredi"
   else if {_d} is 4:
       set {_j} to  "jeudi"
   else if {_d} is 5:
       set {_j} to  "vendredi"
   else if {_d} is 6:
       set {_j} to  "samedi"
   return {_j}

 

 

Mais malheureusement il ne fonctionne pas tout le temps... (et je n'ai pas vérifié si il fonctionnait avec les années bissextiles...)

 

Donc si quelqu'un pouvait me le corriger ou m'en donner un qui fonctionne, je le prend à coeur-joie !

 

Merci d'avance

23 réponses à cette question

Messages recommandés

  • 0
Posté(e)

Bon du coup j'imagine que ce n'est pas possible en skript ^^

 

Dommage j'avais fait un skript de calendrier :) (enfin j'avais commencé)

Je vous mets le code, et si vous l'utilisez quelquepart, citez-moi svp, parce que j'ai mis beaucoup de temps (pas trop pour le script, mais surtout pour toute la recherche)

Ce n'est pas du tout le code finis, donc il y a plein de message de debug etc...

 

Si quelqu'un trouve quand même la solution pour le premier jour d'un mois, je suis bien évidemment toujours prenneur !

 

EDIT: ups, j'ai laissé les syntaxes de mon add-ons, donc il faudra que vous remplaciez les "bc" par "broadcast"

  • 0
Posté(e)

Il y a une erreur dans ta traduction : le a = .. ce n'est pas des crochets/parenthèses mais une fonction = fonction partie entière (E[x]).

E[x] = n

avec n<=x<n+1, n étant un entier relatif.

C'est pour ça que dans l'exemple il trouve que E[(14-8)/12) = 0

14-8 = 6 __ 6/12 = 0.5 la partie entière de 0.5 est bien 0.

Je ne sais pas si la fonction Partie entière est déjà programmée dans Skript, mais tu peux l'avoir en faisait:

set {_base} to ((14 - {_m}) / 12)
set {_base} to a random integer between  {_base}-0.9999 and  {_base}
#Bon j'ai pas vraiment réfléchis longtemps pour ça, mais elle devrait marcher.

 

Et pour tous les autres calculs qui suivent c'est toujours la même chose : fonction E[x]

Voila voila :D

  • 0
Posté(e)

Je n'ai pas tout compris ^^ je suis en seconde, alors j'ai vu les fonctions, les fonctions dans les graphiques etc, etc, mais la je t'avoues que je ne comprends pas tout xD

 

EDIT: Du coup, par exemple, quand il y a marqué [y/4], ca veut dire que c'est

(année - ( (14 / mois) / 12) ) / 4

  • 0
Posté(e)
Je n'ai pas tout compris ^^ je suis en seconde, alors j'ai vu les fonctions, les fonctions dans les graphiques etc, etc, mais la je t'avoues que je ne comprends pas tout xD

Ok ok je vois, je vais t'expliquer ça plus simplement alors ahah !

En gros, dans tes calculs, tu as :

a = [(14-month/12] 

Mais dans ton image qui explique les calculs à faire, ce n'est pas juste des crochets, mais une fonction : la fonction "Partie entière".

 

Cette fonction, elle renvoie l'entier le plus proche et inférieur au nombre que tu lui donnes.

Avec des exemples pour que ça soit plus explicite :

E[0.5] = 0 car 0 est la "partie entière" de 0.5

E[0.7] = 0

E[1.2] = 1

E[5] = 5

E[5.99999999] = 5

Pour les nombres négatifs c'est un peu plus chaud, mais t'en as pas besoin là.

 

Et pour trouver ce nombre entier, qu'on va appeler " n ", on le trouve comme ça :

n <= x < n+1

 

Et ça, en version Skript, tu l'as à peu près comme ça :

set {_x} to ((14 - {_m}) / 12) 
#Ton premier calcul que j'ai pas toucher
set {_n} to a random integer between  {_x}-0.9999 and  {_x}

 

Et voilà, le {_n} remplace le {_base}

Et pour toutes les autres fractions en bas, c'est la même chose qu'il faut faire.

Si c'est toujours pas assez clair, hésites pas x) !

  • 0
Posté(e)

Bonjour bonjour,

 

Je viens de refaire ta fonction et tout semble marcher, je t'envois ça et tu me dis si cela te convient ;)

 

function firstDayOfMonth(year: integer, month: integer, day: integer) :: text:
   if {_month} == 1:
       set {_month} to 13
   else if {_month} == 2:
       set {_month} to 14

   set {_century} to ceil(year / 100)
   set {_year.century} to mod({_year}, 100)

   set {_result} to ceil(mod(({_day} + ((26*({_month} + 1)) / 10) + {_year.century} + ({_year.century} / 4) + ({_century} / 4) + (5 * {_century})), 7))

   if {_result} == 0:
       set {_final} to "Samedi" parsed as text
   else if {_result} == 1:
       set {_final} to "Dimanche" parsed as text
   else if {_result} == 2:
       set {_final} to "Lundi" parsed as text
   else if {_result} == 3:
       set {_final} to "Mardi" parsed as text
   else if {_result} == 4:
       set {_final} to "Mercredi" parsed as text
   else if {_result} == 5:
       set {_final} to "Jeudi" parsed as text
   else if {_result} == 6:
       set {_final} to "Vendredi" parsed as text

   return {_final}

command /aaa:
   trigger:
       set {_msg} to firstDayOfMonth(2001, 7, 22)
       send "%{_msg}%" to player

 

EDIT : Aïe, les années bissextiles ne sont pas prises en compte... Bon j'y retourne voir comment gérer ça :mad:

  • 0
Posté(e)
Bonjour bonjour,

 

Je viens de refaire ta fonction et tout semble marcher, je t'envois ça et tu me dis si cela te convient ;)

 

function firstDayOfMonth(year: integer, month: integer, day: integer) :: text:
   if {_month} == 1:
       set {_month} to 13
   else if {_month} == 2:
       set {_month} to 14

   set {_century} to ceil(year / 100)
   set {_year.century} to mod({_year}, 100)

   set {_result} to ceil(mod(({_day} + ((26*({_month} + 1)) / 10) + {_year.century} + ({_year.century} / 4) + ({_century} / 4) + (5 * {_century})), 7))

   if {_result} == 0:
       set {_final} to "Samedi" parsed as text
   else if {_result} == 1:
       set {_final} to "Dimanche" parsed as text
   else if {_result} == 2:
       set {_final} to "Lundi" parsed as text
   else if {_result} == 3:
       set {_final} to "Mardi" parsed as text
   else if {_result} == 4:
       set {_final} to "Mercredi" parsed as text
   else if {_result} == 5:
       set {_final} to "Jeudi" parsed as text
   else if {_result} == 6:
       set {_final} to "Vendredi" parsed as text

   return {_final}

command /aaa:
   trigger:
       set {_msg} to firstDayOfMonth(2001, 7, 22)
       send "%{_msg}%" to player

wow merci beaucoup ^^

Je ne sais pas si ca fonctionne (je ne peux pas tester actuellement), mais si ca fonctionne c'est super !

  • 0
Posté(e)
Bonjour bonjour,

 

Je viens de refaire ta fonction et tout semble marcher, je t'envois ça et tu me dis si cela te convient ;)

 

function firstDayOfMonth(year: integer, month: integer, day: integer) :: text:
   if {_month} == 1:
       set {_month} to 13
   else if {_month} == 2:
       set {_month} to 14

   set {_century} to ceil(year / 100)
   set {_year.century} to mod({_year}, 100)

   set {_result} to ceil(mod(({_day} + ((26*({_month} + 1)) / 10) + {_year.century} + ({_year.century} / 4) + ({_century} / 4) + (5 * {_century})), 7))

   if {_result} == 0:
       set {_final} to "Samedi" parsed as text
   else if {_result} == 1:
       set {_final} to "Dimanche" parsed as text
   else if {_result} == 2:
       set {_final} to "Lundi" parsed as text
   else if {_result} == 3:
       set {_final} to "Mardi" parsed as text
   else if {_result} == 4:
       set {_final} to "Mercredi" parsed as text
   else if {_result} == 5:
       set {_final} to "Jeudi" parsed as text
   else if {_result} == 6:
       set {_final} to "Vendredi" parsed as text

   return {_final}

command /aaa:
   trigger:
       set {_msg} to firstDayOfMonth(2001, 7, 22)
       send "%{_msg}%" to player

 

EDIT : Aïe, les années bissextiles ne sont pas prises en compte... Bon j'y retourne voir comment gérer ça :mad:

Il y a pas un pb ? :

:: text:

Et sinon que fait le code ceil ?

  • 0
Posté(e)
Il y a pas un pb ? :
:: text:

Et sinon que fait le code ceil ?

C'est l'inverse de floor. Floor prend le nombre en dessous, par exemple floor(3,93) = 3 mais ceil(3,93) = 4

 

Et le :: text: est normal. Vu que c'est une fonction avec return, cet ajout va dire que le return est de type text

  • 0
Posté(e)
C'est l'inverse de floor. Floor prend le nombre en dessous, par exemple flormor(3,93) = 3 mais ceil(3,93) = 4

 

Et le :: text: est normal. Vu que c'est une fonction avec rerurn, cet ajout va dire que le rerurn est de type text

Ok bah la fonction partie entière que je te disais en gros c'est flormor, si tu veux utiliser l'algo que t'as envoyé en premier, tu peux essayer avec

Ah ok, c'est la première fois que je vois une fonction avec return, je me disais aussi que ça devait bien exister !

  • 0
Posté(e)

command /now:
   trigger:
       broadcast "%day name from date now%"
       broadcast "%now%"
       set {_a} to "27/11/17 09:55" parsed as date #change juste la date et laisse l'heure comme ça
       broadcast "%day name from date {_a}%"

Pas très joli le code mais dans l'idée c'est ça

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.