L’autre bogue de l’an 2000 et plus tard 4000…
Introduction :
Quand on parle du bogue de l’an 2000, on parle
surtout du passage à l’an 2000 du 31 décembre 1999 au 1er Janvier
2000.
Si les ordinateurs avaient
existé en 1900 il aurait fallu tenir compte que cette année là, comme les
autres années divisibles par 100, n’était pas bissextile.
Mais il y a exception, les années divisibles par 400 comme l’an 2000 redeviennent bissextiles et cela durera jusqu’à l’an 3999 car à nouveau, l’an 4000 ne sera pas bissextile.
Le 1er Mars 2000 : Seuls les cancres et les bons auront
raison !
Ceux (les cancres) qui
n’auront programmé que la divisibilité par 4 pour le calcul des années
bissextiles seront justes : effectivement, l’an 2000 est une exception
dans les années multiples de 100, elle est bissextile.
Ceux (les moyens) qui
n’auront retenu que les années multiples de 4 sauf celles multiples de 100 pour
le même calcul, se trouveront avec une année non bissextile et le 1er
mars 2000 sera pour eux un mardi au lieu d’être un mercredi !
Ceux (les bons) qui auront
retenu le paramètre 400 comme test de divisibilité, auront raison comme les
cancres, mais à juste titre et cela jusqu’à l’an 3999.
En l’an 4000, il faudra être
très bon pour avoir programmé en plus le test de divisibilité par 4000 pour
considérer 4000 comme une année non bissextile.
Un peu de pédagogie :
La programmation du calcul des années bissextiles
est triviale en
APL, déjà connu pour sa clarté et sa concision.
La première fois que j’ai rencontré cette fonction, bien qu’assez mal programmée, elle reflétait remarquablement déjà l’absence de bruit de fond.
On ne trouvait dans cette
fonction que les 4 paramètres 4 100 400 4000 entourés de fonctions : difficile
de faire moins de bruit de fond !
Voici la fonction en
notation
¸
¾ :
BIM:
0¬.=4 100 400 4000|¾
NB : autre
écriture :
BIS:
-/0=4 100 400 4000|¾
Mais on peut faire
mieux :
Nous sommes en face d’une fonction
qui change de véracité chaque fois qu’une nouvelle condition est vraie et
qui commence par être vraie: à quoi cela vous fait penser ?
Solution : c’est xor
scan bien sûr et comme c’est le résultat à la fin qui compte pour nous, dans la
fonction, il n’y aura plus que xor slash.
Rappelons que xor scan sur
une chaîne de bits tous à 1 donne la suite alternée 1 0 1 0 1 0 etc…car xor
donne la parité de la chaîne en nombres de bits à 1.
Nous pouvons tout de suite écrire
la fonction de calcul des années bissextiles en notation
¸
¾:
BI: ¬/0=4
100 400 4000|¾
Essayons-la :
BI 1940
1
BI 1900
0
BI 2000
1
BI 4000
0
BI 1996
1
NB : comme ici, il n’y
a que la parité qui compte, nous pourrions nous amuser à permuter les 4
données, le résultat serait le même c’est-à-dire que la fonction BI pourrait s’écrire :
BI:
¹/0= 400
100 4000 4
|¾
(Il n’en serait pas de même
si on faisait subir le même sort à la fonction BIS !).
En prime, donnons ici une
fonction qui donne le jour de la semaine correspondant à une date donnée, vous
pourrez ainsi connaître (ou vérifier) le jour de votre naissance ou d’un
événement quelconque…
Calcul de l’indice du premier jour de l’année X:
(voir
commentaire)
ZDA
X
Z7|X+-/(X-1)÷4
100 400 4000
©
0=DIMANCHE, 1=LUNDI, SUR LEQUEL COMMENCE L'ANNEE
GREGORIENNE
Quel jour débutera l’an
2000 ?
DA 2000
6
Ce sera donc un samedi.
Calcul du nombre de jours de
chaque mois de l’année X :
ZJM
X
Z28+3,(BI
X),10½5½3 2
© NB DE
JOURS DANS 12 MOIS DE L'ANNEE GREGORIENNE X
Calcul du jour de l’année :
ZJOUR
X;D;M;A;IO;J;S
IO0
ª DX[0] ª MX[1] ª AX[2]
J(DA
A) + (+/(¯1+M)JM A)+D-1
S7
2½'DILUMAMEJEVESA' ª ZS[7|J;]
Exemple : Le jour de ma
naissance est un vendredi : vérifions-le :
JOUR 25
10 1940
VE
Vérifions si le 1er
mars 2000 est bien un mercredi :
JOUR 1
3 2000
ME
Et n’oubliez pas de faire
intervenir le paramètre 400 dans vos ordinateurs pour l’an 2000… sinon, gare
aux surprises du 1er mars ! (pour une
fois que ce n’est pas le 1er avril !).
Puisque nous sommes en fin
d’année, voici la fonction qui permet de faire un calendrier pour une année
quelconque et qui tient compte d’un bon calcul des années bissextiles !
ZM CAL X;A;S;I;J;K;L;D;N
A'JAVFEVMARAVRMAIJUNJULAUTSEPOCTNOVDEC'
S'DILUMAMEJEVESA'
J12 6 21½3 0(-7|(DA
X)+0,+\¯1MD X)²((MD X)°.¼42)×12 42½¼42
I(12 21½' ',7 2½S),[2]J
Z2 1 3³(8,M,264÷M)½8 12 222
1 3³(12 2112 ¯1212 3½A),[2]I
D½Z ª N×/D ª Z,Z
ª
L1+((Z SS ' 0') IOTA
1) ª Z[L]' ' ª ZD½Z
La fonction IOTA
se trouve à la page 87 du
N°29 des Nouvelles d’APL.
Nous la reproduisons quand même ici :
ZX
IOTA Y
Z(X=Y)/¼½X
Voici maintenant le calendrier de l’an 2000 par trimestre : l’argument gauche de CAL désigne la division de l’année (par exemple, en divisant par 6, on aurait 6 bimestres).
4 CAL
2000
JAV FEV
MAR
DI LU MA ME JE VE SA DI LU MA ME JE VE SA DI LU MA ME JE VE SA
1 1 2 3 4 5
1 2
3 4
2 3 4
5 6 7
8 6 7 8 9 10 11 12 5 6 7
8 9 10 11
9 10 11
12 13 14 15 13 14 15 16 17 18 19 12 13 14 15 16 17 18
16 17 18 19 20 21 22 20 21 22 23 24 25 26 19 20 21 22 23 24 25
23 24 25 26 27 28 29 27 28 29 26 27 28 29 30 31
30 31
AVR MAI
JUN
DI LU MA ME JE VE SA DI LU MA ME JE VE SA DI LU MA ME JE VE SA
1 1 2
3 4 5
6 1 2 3
2 3 4
5 6 7
8 7 8 9 10
11 12 13 4 5
6 7 8 9 10
9 10 11
12 13 14 15 14 15 16 17 18 19 20 11 12 13 14 15 16 17
16 17 18 19 20 21 22 21 22 23 24 25 26 27 18 19 20 21 22 23 24
23 24 25 26 27 28 29 28 29 30 31 25 26
27 28 29 30
30
JUL AUT
SEP
DI LU MA ME JE VE SA DI LU MA ME JE VE SA DI LU MA ME JE VE SA
1 1 2 3 4 5
1 2
2 3 4
5 6 7
8 6 7 8 9 10 11 12 3 4 5
6 7 8
9
9 10 11
12 13 14 15 13 14 15 16 17 18 19 10 11 12 13 14 15 16
16 17 18 19 20 21 22 20 21 22 23 24 25 26 17 18 19 20 21 22 23
23 24 25 26 27 28 29 27 28 29 30 31 24 25 26 27 28 29 30
30 31
OCT NOV
DEC
DI LU MA ME JE VE SA DI LU MA ME JE VE SA DI LU MA ME JE VE SA
1 2 3
4 5 6
7 1 2
3 4 1 2
8 9 10 11 12 13 14 5 6 7
8 9 10 11 3 4 5
6 7 8
9
15 16 17 18 19 20 21 12 13 14 15 16 17 18 10 11 12 13 14 15 16
22 23 24 25 26 27 28 19 20 21 22 23 24 25 17 18 19 20 21 22 23
29 30 31 26 27 28 29 30 24 25 26 27 28 29 30
31
Pour les débutants : Si vous voulez imprimer par semestre, n’oubliez pas
de mettre le PW
à 132, d’utiliser une police
de taille 8 à l’écran et d’imprimer en mode paysage.
Quand on dit que mettre
l’origine des indices à 0 permet la plupart du temps de simplifier les calculs,
ce ne sont pas des paroles en l'air (je n’en dirai pas autant pour certaines
autres prétendues simplifications jamais démontrées…), voici un exemple de
plus: le résultat de N|X
(indépendant de l’origine des
indices) est un nombre compris entre 0 et
N-1. Si on se sert de cet
indice pour désigner le jour de la semaine, 1 correspond à lundi, 2 à mardi… 6
à samedi et 0 pour dimanche, d’où l’intérêt ,
pour avoir un accès direct au jour calculé, de mettre dimanche en premier.
Sinon, si on est en origine 1, lundi devra être le premier jour du tableau
S contenant les jours de la semaine pour que
S[I;] désigne le bon jour mais
comme 0 correspond à dimanche l’expression S[I;]
ne fonctionnera pas, I
devra être modifié ainsi : II+(7×I=0).
Si la langue anglaise est
reconnue comme simple et précise, il n’est pas étonnant que leur pensée
scientifique le soit aussi : c’est pourquoi dimanche est le 1er
jour de la semaine et que les dates s’écrivent en poids décroissant : an,
mois, jour.
Dernière nouvelle : Dans la revue APL Quote Quad que je viens de recevoir (Vol 29
N° 1, page 17) en même temps que celle du congrès APL99 (Vol 29 N° 2), on donne
aussi une fonction telle que
BI, je la livre telle quelle : (0¬4000
100°.|year)^0=400 4°.|yearyear
Par exemple,
appelons-la BQQ.
BQQ:Z(0¬4000 100°.|¾)^0=400
4°.|¾¾
Exemple
d’emploi :
,BQQ 7
1½1999.9 2000.1 1900.5 4000.75 1984 1700 1968.4
0 1 0 0
1 0 1
N.B. :
j’ai linéarisé pour ne pas avoir un résultat sur 7 lignes.
Pour un tableau :
T3
4½1234.5 600 800 1900.5 3456.7 3212.9 5432.1 7654.3 2000.4 4000.5 1212 1515
1234.5 600 800 1900.5
3456.7 3212.9 5432.1 7654.3
2000.4 4000.5 1212 1515
BQQ T
0 0 1 0
1 1 1 0
1 0 1 0
Remarque: Pour répondre à
l'enquête de satisfaction, on ne peut quand même pas demander aux auteurs
d'expliquer de fond en comble chaque ligne de leurs programmes! Ici il faudrait
dire à quoi sert
¾¾
, pourquoi
, pourquoi
séparer 0¬4000 100°.|¾ et
0=400 4°.|¾
par
contre c'est en répondant à toutes ces questions que j'ai trouvé les intentions
de l'auteur, et par conséquent comment fonctionnait cette ligne. OK, on ne peut
pas demander aux lecteurs de faire cet effort, par contre, on pourrait au moins
donner des exemples d'utilisation comme je l'ai fait ci-dessus en guise
d'explication. (Sachez que même en donnant plein d'exemples d'utilisation d'une
fonction, il y en a encore (je ne citerai pas de noms!) qui n'ont pas compris
comment on l'utilise, à quoi elle sert, etc…)
Sur ce, je tiens à préciser
que dans la revue APL Quote Quad, il n'y avait aucune explication et pas même
un seul exemple d'utilisation.