Assuntos relacionados à programação, pedaços de códigos, pequenas dicas, pequenos tutoriais, alguns vídeos, algumas fotos e etc.

Ruby calculando o dia da Páscoa

Posted: abril 10th, 2009 | Author: Carlan Calazans | Tags: , , , , , | No Comments »

A Páscoa é uma data comemorativa que serve de referência para datas comemorativas móveis como Carnaval, Quaresma, Corpus Christ e outras. Por isso é importante saber quando a Páscoa vai ser comemorada. Além de interessante, serve como uma brincadeira para os garotos(as) de programa de plantão que não tem nada para fazer no feriado.

Cálculo

No total são três formas de calcular a data da Páscoa. A primeira é recorrendo a uma tabela, a segunda é através ao algorítimo de Gauss para o intervalo de anos que se inicia em 1900 e termina em 2099 e a terceira com o algorítimo de Meeus / Jones / Butcher. Como exemplo, optei pela segunda forma por ter umas condições e por ela ser mais elaborada. Para quem se interessar, os algorítimos serão relacionados no final deste texto.

#!/usr/bin/env ruby

require 'date'

FIELDS = %w{Carnaval Pascoa Corpus\ Christ}

ano = 2009 #change me

x = 24
y = 5

a = ano % 19
b = ano % 4
c = ano % 7
d = (19 * a + x) % 30
e = (2 * b + 4 * c + 6 * d + y) % 7

if (d + e > 9)
  #april
  dia = d + e - 9
  mes = 4

  #exceptions  
  dia = 19 if (dia == 26)
  dia = 18 if (dia == 25 && d == 28 && a > 10)
else
  #march
  dia = d + e + 22
  mes = 3
end

dt = Date.new(ano, mes, dia)

result = []
result << dt - 47
result << dt
result << dt + 60

FIELDS.each do |d|
  puts "#{d}: #{result.shift.strftime("%d-%m-%Y")}"
end

Este texto tem uma pegadinha. Na verdade, meu intuito com ele não é ensinar Ruby nem mostrar como se calcula o dia da Páscoa. Foi uma forma que encontrei de mostrar como a linguagem chega perto do idioma, como poucas linguagens o fazem. Qualquer pessoa é capaz de entender as fórmulas matemáticas e relacioná-las com o exemplo mostrado. Sim, existe um açúcar, mas é fácil de entendê-lo também.

A maior parte do tempo, parece que estamos conversando com um editor de textos.

Referências:



Leave a Reply