lunes, 30 de marzo de 2009

La semana santa

Yo no soy católico. Tal vez pudiera decir que soy apóstata, pero para poder renunciar a una fe, es necesario haber tenido esa fe, y no es mi caso. Sin embargo, siendo un haragán de tiempo completo, los días festivos son de especial importancia para mi. Y de entre los días festivos que se celebran en nuestro católico país, la semana santa siempre me ha parecido el más interesante, no por sus connotaciones religiosas, sino porque nunca he sabido cómo calcular su fecha. Hasta hoy.

Me di a la tarea de traducir a shell script de unix un pequeño programa en java que se encarga de este cálculo. Si alguien se pregunta por qué, la respuesta es sencilla: porque no tengo ningún compilador en mi máquina, sólo un cliente de ssh que uso para conectarme a un servidor de HP-UX. Si a alguien le interesa, pruébenlo. Sí jala :)

A propósito, lo que se calcula es el domingo pascual, no el jueves/viernes santo.

#!/usr/bin/sh
function Constants(){
if [ "$1" -ge 1583 -a "$1" -lt 1700 ];then
M=22
N=2
elif [ "$1" -ge 1700 -a "$1" -lt 1800 ];then
M=23
N=3
elif [ "$1" -ge 1800 -a "$1" -lt 1900 ];then
M=23
N=4
elif [ "$1" -ge 1900 -a "$1" -lt 2100 ];then
M=24
N=5
elif [ "$1" -ge 2100 -a "$1" -lt 2200 ];then
M=24
N=6
elif [ "$1" -ge 2200 -a "$1" -lt 2300 ];then
M=25
N=0
fi
}

function Pascua(){
Constants "$1"
typeset -i ANIO="$1"

A=$(( ANIO%19 ))
B=$(( ANIO%4 ))
C=$(( ANIO%7 ))
D=$(( (19*A+M)%30 ))
E=$(( (2*B+4*C+6*D+N)%7 ))

if [ $(( D+E )) -lt 10 ];then
DIA=$(( D+E+22 ))
MES="MARZO"
else
DIA=$(( D+E-9 ))
MES="ABRIL"

if [ $DIA -eq 26 ];then
let DIA=19
fi

if [ $DIA -eq 25 -a $D -eq 28 -a $E -eq 6 -a $A -gt 10 ];then
let DIA=18
fi
fi

echo "$DIA de $MES"
}
############ MAIN ############
Pascua $1