IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lua Discussion :

Date de Pâques par l'algorithme d'Oudin


Sujet :

Lua

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut Date de Pâques par l'algorithme d'Oudin
    Bonjour !

    Je vous propose un script qui calcule la date de Pâques pour l'année courante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    --------------------------------------------------------------------------------
    -- Nom du fichier : oudin.lua
    -- Date de Pâques par l'algorithme d'Oudin
    -- Roland Chastain 26/02/2014
    --------------------------------------------------------------------------------
     
    function div(a, b)
      return math.floor(a / b)
    end
     
    Y = os.date("*t").year
     
    G = Y % 19
    C = div(Y, 100)
    C4 = div(C, 4)
    E = div(8 * C + 13, 25)
    H = (19 * G + C - C4 - E + 15) % 30
    K = div(H, 28)
    P = div(29, H + 1)
    Q = div(21 - G, 11)
    I = (K * P * Q - 1) * K + H
    B = Y + div(Y, 4)
    J1 = B + I + 2 + C4 - C
    J2 = J1 - 7 * div(J1, 7)
    R = 28 + I - J2
     
    if R < 32 then
      D = R
      M = "mars"
    else
      D = R - 31
      if D == 1 then
        D = "1er"
      end
      M = "avril"
    end
     
    print("En " .. Y .. ", le dimanche de P" .. string.char(131) .. "ques est le "
      .. D .. " " .. M .. ".")
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Suite de mes efforts pour apprendre le langage Lua.

    Voici une table de nombres entiers, qui sont les dates de Pâques de 1900 à 2199 (tirées de cette table). Le programme compare le contenu de la table avec le résultat de l'algorithme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    --------------------------------------------------------------------------------
    -- comparaison.lua
    -- Vérification de la concordance entre les résultats de la fonction basée sur
    -- l'algorithme d'Oudin et une table.
    -------------------------------------------------------------------------------- 
     
    -- Date de Pâques de 1900 à 2199
    -- Extrait de : http://www.merlyn.demon.co.uk/estr-tbl.txt
     
    T = {
      46,38,30,43,34,54,46,31,50,42,
      27,47,38,23,43,35,54,39,31,51,
      35,27,47,32,51,43,35,48,39,31,
      51,36,27,47,32,52,43,28,48,40,
      24,44,36,56,40,32,52,37,28,48,
      40,25,44,36,49,41,32,52,37,29,
      48,33,53,45,29,49,41,26,45,37,
      29,42,33,53,45,30,49,41,26,46,
      37,50,42,34,53,38,30,50,34,26,
      46,31,50,42,34,47,38,30,43,35,
      54,46,31,51,42,27,47,39,23,43,
      35,55,39,31,51,36,27,47,32,52,
      43,35,48,40,31,51,36,28,47,32,
      52,44,28,48,40,25,44,36,56,41,
      32,52,37,29,48,40,25,45,36,49,
      41,33,52,37,29,49,33,53,45,30,
      49,41,26,46,37,29,42,34,53,45,
      30,50,41,26,46,38,50,42,34,54,
      38,30,50,35,26,46,31,51,42,34,
      47,39,30,43,35,55,46,31,51,43,
      28,48,40,25,44,36,49,41,32,52,
      37,29,48,33,53,45,29,49,41,26,
      45,37,29,42,33,53,45,30,49,41,
      26,46,37,50,42,34,53,38,30,50,
      34,26,46,31,50,42,34,47,38,30,
      43,35,54,46,31,51,42,27,47,39,
      23,43,35,55,39,31,51,36,27,47,
      32,52,43,35,48,40,31,51,36,28,
      47,32,52,44,28,48,40,25,44,36,
      56,41,32,52,37,29,48,40,25,45
    };
     
    function div(A, B)
      return math.floor(A / B)
    end
     
    -- Date de Pâques par l'algorithme d'Oudin
     
    function R(Y)
      local G = Y % 19
      local C = div(Y, 100)
      local C4 = div(C, 4)
      local E = div(8 * C + 13, 25)
      local H = (19 * G + C - C4 - E + 15) % 30
      local K = div(H, 28)
      local P = div(29, H + 1)
      local Q = div(21 - G, 11)
      local I = (K * P * Q - 1) * K + H
      local B = Y + div(Y, 4)
      local J1 = B + I + 2 + C4 - C
      local J2 = J1 - 7 * div(J1, 7)
      return 28 + I - J2
    end
     
    N = 0
    for Y = 1900, 2199 do
      if R(Y) == T[Y - 1900 + 1] then  -- Le tableau commence à un.
        N = N + 1
      end  
    end
     
    print(N .. "/" .. 300)
     
    -- Résultat : 300/300
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Un troisième exercice : fabrication d'un fichier texte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    --------------------------------------------------------------------------------
    -- Nom du fichier : fabrique.lua
    -- Fabrique un fichier texte contenant les dates de Pâques de 2000 à 2299.
    --------------------------------------------------------------------------------
     
    function div(A, B)
      return math.floor(A / B)
    end
     
    -- Algorithme d'Oudin
     
    function paques(Y)
      local G = Y % 19
      local C = div(Y, 100)
      local C4 = div(C, 4)
      local E = div(8 * C + 13, 25)
      local H = (19 * G + C - C4 - E + 15) % 30
      local K = div(H, 28)
      local P = div(29, H + 1)
      local Q = div(21 - G, 11)
      local I = (K * P * Q - 1) * K + H
      local B = Y + div(Y, 4)
      local J1 = B + I + 2 + C4 - C
      local J2 = J1 - 7 * div(J1, 7)
      local R = 28 + I - J2
      return R
    end
     
    function paqueschaine(n)
      local aux
      if n < 32 then
        aux = 'Mar' .. string.format('%02s', tostring(n))
      else
        aux = 'Apr' .. string.format('%02s', tostring(n - 31))
      end
      return aux
    end
     
    local txt_head = table.concat{
      '                                                                 \n',
      '                       Dimanches de Pâques                       \n',
      '                                                                 \n',
      '    +   0     1     2     3     4     5     6     7     8     9  \n',
      '                                                                 \n'
    }
    local txt_date = ' %s'
    local txt_crlf = '\n'
     
    function maketable(cent, iox)
      for i = 1, 10 do
        iox:write(string.format(txt_date, tostring(cent + 10 * (i - 1))))
        for j = 1, 10 do
          iox:write(string.format(txt_date, paqueschaine(paques(cent + 10 * (i - 1) + j - 1))))
        end
        iox:write(txt_crlf)
      end
    end
     
    io.stdout:write(txt_head)
     
    for k, v in ipairs(arg) do
      local century = tonumber(v)
      if century >= 1583 then maketable(century, io.stdout) end
    end
    Code batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @echo off
     
    rem fabrique.bat
     
    Lua52\lua52 fabrique.lua 2000 2100 2200 > "Pƒques 2000-2299.txt"
     
    pause
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Bonjour ! Voici une version légèrement retouchée du script oudin.lua, laquelle exploite une nouveauté de Lua 5.3 (la division euclidienne au moyen de l'opérateur //).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    --------------------------------------------------------------------------------
    -- Nom du fichier : oudin.lua
    -- Date de Pâques pour l'année courante, par l'algorithme d'Oudin
    -- Roland Chastain 23/03/2015
    --------------------------------------------------------------------------------
     
    function R(Y)
      local G = Y % 19
      local C = Y // 100
      local C4 = C // 4
      local E = (8 * C + 13) // 25
      local H = (19 * G + C - C4 - E + 15) % 30
      local K = H // 28
      local P = 29 // (H + 1)
      local Q = (21 - G) // 11
      local I = (K * P * Q - 1) * K + H
      local B = Y + Y // 4
      local J1 = B + I + 2 + C4 - C
      local J2 = J1 % 7
      return 28 + I - J2
    end
     
    local Y = os.date("*t").year
    local M = "mars"
    local D = R(Y)
     
    if D > 31 then
      D = D - 31
      M = "avril"
      if D == 1 then
        D = "1er"
      end
    end
     
    print("En " .. Y .. ", le dimanche de P" .. string.char(131) .. "ques est le "
      .. D .. " " .. M .. ".")
    Soit dit en passant, voici le document dans lequel j'avais trouvé l'algorithme (j'ai conservé les noms des variables).
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    J'ai l'impression que plus grand monde ne passe dans ce forum.

    J'avais une heure à tuer (comme on dit). J'ai complété mon script calculant la date de Pâques. Désormais il donne aussi la date des fêtes dites mobiles (celles dont la date dépend de la date de Pâques). Nécessite Lua 5.3.

    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Fêtes catholiques dont la date dépend de celle de Pâques,
    pour l'année courante (2016).
    
      Septuagésime ... 24.01.2016
      Cendres ........ 10.02.2016
      Rameaux ........ 20.03.2016
      Pâques ......... 27.03.2016
      Ascension ...... 05.05.2016
      Pentecôte ...... 15.05.2016
      Trinité ........ 22.05.2016
      Fête-Dieu ...... 26.05.2016
    
    Appuyez sur une touche pour continuer...
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    La table des dates de Pâques de 2000 à 2299 que j'avais postée plus haut dans cette discussion était fausse.

    Voici une nouvelle version du code et de la table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    --------------------------------------------------------------------------------
    -- Nom du fichier : siecle.lua
    -- Dates de Pâques pour un siècle donné.
    --------------------------------------------------------------------------------
     
    -- Algorithme d'Oudin
     
    function Oudin(Y)
      local G = Y % 19
      local C = Y // 100
      local C4 = C // 4
      local E = (8 * C + 13) // 25
      local H = (19 * G + C - C4 - E + 15) % 30
      local K = H // 28
      local P = 29 // (H + 1)
      local Q = (21 - G) // 11
      local I = (K * P * Q - 1) * K + H
      local B = Y + Y // 4
      local J1 = B + I + 2 + C4 - C
      local J2 = J1 % 7
      return 28 + I - J2
    end
     
    function EasterToStr(n)
      if n < 32 then
        return string.format('%02sMar', tostring(n))
      else
        return string.format('%02sAvr', tostring(n - 31))
      end
    end
     
    local TXT_HEAD = table.concat(
      {
        '\n',
        '    +   0     1     2     3     4     5     6     7     8     9  \n',
        '                                                                 \n'
      }
    )
    local TXT_DATE = ' %s'
    local TXT_CRLF = '\n'
     
    function PrintTable(century, file)
      for i = 1, 10 do
        file:write(string.format(TXT_DATE, tostring(century + 10 * (i - 1))))
        for j = 1, 10 do
          file:write(string.format(TXT_DATE, EasterToStr(Oudin(century + 10 * (i - 1) + j - 1))))
        end
        file:write(TXT_CRLF)
      end
    end
     
    -- Dates de Pâques de 2000 à 2299
     
    io.stdout:write(TXT_HEAD)
     
    for i = 2000, 2200, 100 do
      PrintTable(i, io.stdout)
      io.stdout:write('\n')
    end
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
        +   0     1     2     3     4     5     6     7     8     9  
                                                                     
     2000 23Avr 15Avr 31Mar 20Avr 11Avr 27Mar 16Avr 08Avr 23Mar 12Avr
     2010 04Avr 24Avr 08Avr 31Mar 20Avr 05Avr 27Mar 16Avr 01Avr 21Avr
     2020 12Avr 04Avr 17Avr 09Avr 31Mar 20Avr 05Avr 28Mar 16Avr 01Avr
     2030 21Avr 13Avr 28Mar 17Avr 09Avr 25Mar 13Avr 05Avr 25Avr 10Avr
     2040 01Avr 21Avr 06Avr 29Mar 17Avr 09Avr 25Mar 14Avr 05Avr 18Avr
     2050 10Avr 02Avr 21Avr 06Avr 29Mar 18Avr 02Avr 22Avr 14Avr 30Mar
     2060 18Avr 10Avr 26Mar 15Avr 06Avr 29Mar 11Avr 03Avr 22Avr 14Avr
     2070 30Mar 19Avr 10Avr 26Mar 15Avr 07Avr 19Avr 11Avr 03Avr 23Avr
     2080 07Avr 30Mar 19Avr 04Avr 26Mar 15Avr 31Mar 20Avr 11Avr 03Avr
     2090 16Avr 08Avr 30Mar 12Avr 04Avr 24Avr 15Avr 31Mar 20Avr 12Avr
    
     2100 28Mar 17Avr 09Avr 25Mar 13Avr 05Avr 18Avr 10Avr 01Avr 21Avr
     2110 06Avr 29Mar 17Avr 02Avr 22Avr 14Avr 29Mar 18Avr 10Avr 26Mar
     2120 14Avr 06Avr 29Mar 11Avr 02Avr 22Avr 14Avr 30Mar 18Avr 10Avr
     2130 26Mar 15Avr 06Avr 19Avr 11Avr 03Avr 22Avr 07Avr 30Mar 19Avr
     2140 03Avr 26Mar 15Avr 31Mar 19Avr 11Avr 03Avr 16Avr 07Avr 30Mar
     2150 12Avr 04Avr 23Avr 15Avr 31Mar 20Avr 11Avr 27Mar 16Avr 08Avr
     2160 23Mar 12Avr 04Avr 24Avr 08Avr 31Mar 20Avr 05Avr 27Mar 16Avr
     2170 01Avr 21Avr 12Avr 04Avr 17Avr 09Avr 31Mar 20Avr 05Avr 28Mar
     2180 16Avr 01Avr 21Avr 13Avr 28Mar 17Avr 09Avr 25Mar 13Avr 05Avr
     2190 25Avr 10Avr 01Avr 21Avr 06Avr 29Mar 17Avr 09Avr 25Mar 14Avr
    
     2200 06Avr 19Avr 11Avr 03Avr 22Avr 07Avr 30Mar 19Avr 03Avr 26Mar
     2210 15Avr 31Mar 19Avr 11Avr 27Mar 16Avr 07Avr 30Mar 12Avr 04Avr
     2220 23Avr 15Avr 31Mar 20Avr 11Avr 27Mar 16Avr 08Avr 23Mar 12Avr
     2230 04Avr 24Avr 08Avr 31Mar 20Avr 05Avr 27Mar 16Avr 01Avr 21Avr
     2240 12Avr 04Avr 17Avr 09Avr 31Mar 13Avr 05Avr 28Mar 16Avr 01Avr
     2250 21Avr 13Avr 28Mar 17Avr 09Avr 25Mar 13Avr 05Avr 25Avr 10Avr
     2260 01Avr 21Avr 06Avr 29Mar 17Avr 02Avr 25Mar 14Avr 05Avr 18Avr
     2270 10Avr 02Avr 21Avr 06Avr 29Mar 18Avr 02Avr 22Avr 14Avr 30Mar
     2280 18Avr 10Avr 26Mar 15Avr 06Avr 22Mar 11Avr 03Avr 22Avr 07Avr
     2290 30Mar 19Avr 10Avr 26Mar 15Avr 07Avr 19Avr 11Avr 03Avr 16Avr
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Date de Pâques par la méthode Oudin
    Par Roland Chastain dans le forum Contribuez
    Réponses: 12
    Dernier message: 21/03/2013, 08h56
  2. [Alerte] La blague du lundi de pâques 2013 - Algorithme d'oudin
    Par Lydéric dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 19/06/2012, 14h34
  3. [Flash Pascal] Oudin - Détermination de la date de Pâques
    Par Roland Chastain dans le forum Flash Pascal
    Réponses: 3
    Dernier message: 19/06/2012, 10h19
  4. Mettre la date du jour par défaut
    Par Oberown dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/03/2005, 16h35
  5. PL/SQL TROUVER DATES DE PÂQUES, ASCENSION et PENTECôTE
    Par mimi_été dans le forum PL/SQL
    Réponses: 4
    Dernier message: 21/10/2004, 16h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo