Article et sources mis à jour le 16/12/2018
Je ne suis pas passionné de généalogie, mais je m’intéresse à la façon de numéroter ses ancêtres (Le côté mathématique de la chose).
Ainsi à la trentième génération vous avez plus de cinq cents millions d’aïeuls !
Les généalogistes utilisent pour leur associer un code différents à chacun, la méthode SOSA :
La personne dont on dresse l’ascendance porte le numéro 1.
Son père porte le numéro 2 et sa mère le numéro 3.
Ainsi on associe toujours au père le double du code de l’enfant, et à la mère le code du père augmenté de 1.
Ainsi à part la première personne qui peut-être un homme ou une femme, chaque individu de code pair est un homme et chaque individu de code impair est une femme.
Le problème c’est qu’un nombre est peu parlant. Qui est l’ancêtre numéro 54 ?
J’ai développé une petite application en Python qui nous en dit plus !
Cette application vous permet de trouver également le code SOSA du père de la mère du grand-père d’un individu :
Téléchargement :
setup.exeCe programme vous intéresse ? Voici le code :
Code Python traduit en HTML:# -*- coding: UTF-8 -*-
#Wouf 16/12/2018
# Autour du SOSA
#Fonctions principales chaine() et sosa()
def chaine(n):
""" n est un entier (code SOSA) la fonction renvoie une chaîne
formée de M et P"""
if n==1:
return ""
else:
if n%2==0:
return "P" +chaine(n//2)
else:
return "M" +chaine((n-1)//2)
def sosa(chaine):
""" renvoie le SOSA d'une chaine de la forme PPM
pour le père du père de la mère"""
code=1
for lettre in chaine[::-1]:
code*=2
if lettre=="M" :
code+=1
return code
#Fonctions entrée/sortie : ecrire() et francais()
def ecrire():
q="""Entrez un code SOSA (entier)
ou une chaine formée de P et de M (pour père/mère)
(Entrée pour quitter)
"""
print(q)
reponse=input("> " ).upper()
print()
nb=set("0123456789" )
digit=set("PM" )
if reponse=="" or reponse=="0" :
return False
elif set(reponse) <= nb:
print(chaine(int(reponse)))
print(francais(chaine(int(reponse))))
return True
elif set(reponse)<= digit:
print("Le code SOSA est " ,sosa(reponse))
print(francais(reponse))
return True
else:
return False #pour quitter l'appli
def francais(chaine):
"""Reçois une chaine genre PPMPM et la traduit en français"""
arriere_grand_parent=len(chaine)//3
reste=len(chaine)%3
grand_parent=reste//2
parent=reste%2
reponse=""
for i in range(arriere_grand_parent):
if i==0:
if chaine[0]=="P" :
reponse="L'arrière grand-père"
else:
reponse="L'arrière grand-mère"
else:
if chaine[i*3]=="P" :
reponse+=" de l'arrière grand-père"
else:
reponse+=" de l'arrière grand-mère"
for i in range(grand_parent):
if arriere_grand_parent==0 and i==0:
if chaine[0]=="P" :
reponse="Le grand-père"
else:
reponse="La grand-mère"
else:
if chaine[arriere_grand_parent*3+i*2]=="P" :
reponse+=" du grand-père"
else:
reponse+=" de la grand-mère"
for i in range(parent):
if arriere_grand_parent==0 and grand_parent==0 and i==0:
if chaine[0]=="P" :
reponse="Le père"
else:
reponse="La mère"
else:
if chaine[arriere_grand_parent*3+grand_parent*2+i]=="P" :
reponse+=" du père"
else:
reponse+=" de la mère"
if chaine=="" :
reponse="L'individu"
else:
reponse+=" de l'individu"
reponse+="\n Génération :" +str(len(chaine))+"\n ______________________________"
return reponse
#__________________________________________ le corps du prog
if ecrire():
print()
while ecrire():
print()
Laisser un commentaire