[Perl] Question de logique mathématique

Question de logique mathématique [Perl] - Perl - Programmation

Marsh Posté le 18-09-2004 à 20:31:18    

Bonjour;
 
Je viens de créer un programme de mailling-list (privé), en perl, qui permet d'envoyer un message aux membres de mon site (et uniquement aux membres). Ce programme est exécuté dans le répertoire /cgi-bin/ d'un serveur Unix.
 
Ce programme permet d'exclure de l'envoi certains membres, car une question ou un sujet peut ne pas concerner tout le monde.  :o  
 
Dans le message envoyé, il existe un lien pour répondre. Je souhaiterais que ce lien contienne un paramètre permettant d'identifier les membres concernés par l'envoi et ceux qui en sont exclus.
 
Ainsi, les cases concernant les membres exclus de l'envoi original seront automlatiquement décochés quand on cliquera sur "répondre".
 
J'ai pensé à un système, mais mon experience en programmation informatique est encore un peu réduite et je ne parviens pas à finaliser mon idée. :D  
 
Sachant que chaque membre est identifié par un numéro (membre 1, membre 2, membre 3 etc...), je peux attribuer une valeur croissante multipliée par 2 pour chaques membres.
 
Exemple :
 
membre 1 -> valeur 1
membre 2 -> valeur 2
membre 3 -> valeur 4
membre 4 -> valeur 8
membre 5 -> valeur 16
etc...
 
Il suffirait d'additionner les valeurs des membres concernés.
Si un message concerne le membre 1, 3 et 5, alors on fait 1 + 4 + 16, et on obtient 21.
 
Il suffirait d'ajouter dans le paramètre du lien (dans le message envoyé) le nombre 21.
/cgi-bin/repondre.cgi?membres=21 (par exemple)
 
Le problème, et vous l'avez vite compris, c'est que je n'arrive pas à trouver la logique qui me permettrais d'aller dans le sens inverse.
 
A partir de 21, comment revenir à membre1+membre3+membre5 ?
Vous avez une idée ? Je suis sûr que c'est trés simple, mais là je dois dire qu'aprés des heures de test, je jette l'éponge..
 
Merci


Message édité par Ethan_carter le 18-09-2004 à 20:33:12
Reply

Marsh Posté le 18-09-2004 à 20:31:18   

Reply

Marsh Posté le 18-09-2004 à 21:44:24    

Ethan_carter a écrit :

Bonjour;
 
Je viens de créer un programme de mailling-list (privé), en perl, qui permet d'envoyer un message aux membres de mon site (et uniquement aux membres). Ce programme est exécuté dans le répertoire /cgi-bin/ d'un serveur Unix.
 
Ce programme permet d'exclure de l'envoi certains membres, car une question ou un sujet peut ne pas concerner tout le monde.  :o  
 
Dans le message envoyé, il existe un lien pour répondre. Je souhaiterais que ce lien contienne un paramètre permettant d'identifier les membres concernés par l'envoi et ceux qui en sont exclus.
 
Ainsi, les cases concernant les membres exclus de l'envoi original seront automlatiquement décochés quand on cliquera sur "répondre".
 
J'ai pensé à un système, mais mon experience en programmation informatique est encore un peu réduite et je ne parviens pas à finaliser mon idée. :D  
 
Sachant que chaque membre est identifié par un numéro (membre 1, membre 2, membre 3 etc...), je peux attribuer une valeur croissante multipliée par 2 pour chaques membres.
 
Exemple :
 
membre 1 -> valeur 1
membre 2 -> valeur 2
membre 3 -> valeur 4
membre 4 -> valeur 8
membre 5 -> valeur 16
etc...
 
Il suffirait d'additionner les valeurs des membres concernés.
Si un message concerne le membre 1, 3 et 5, alors on fait 1 + 4 + 16, et on obtient 21.
 
Il suffirait d'ajouter dans le paramètre du lien (dans le message envoyé) le nombre 21.
/cgi-bin/repondre.cgi?membres=21 (par exemple)
 
Le problème, et vous l'avez vite compris, c'est que je n'arrive pas à trouver la logique qui me permettrais d'aller dans le sens inverse.
 
A partir de 21, comment revenir à membre1+membre3+membre5 ?
Vous avez une idée ? Je suis sûr que c'est trés simple, mais là je dois dire qu'aprés des heures de test, je jette l'éponge..
 
Merci


> A partir de 21, comment revenir à membre1+membre3+membre5 ?  
tu effectues des divisions successives par 2...
 
Ca serait pas plus simple d'avoir une table avec des entrées
No de message - liste de diffusion restreinte (avec eventuellement une indirection entre deux, si tu veux pas avoir trop de repetitione de memes listes de diffusion restreinte)
(et si pas de numero dans ta table, alors diffusion generale)
et de recuperer le numero du message lors d'une reponse?
A+,


Message édité par gilou le 18-09-2004 à 21:47:11

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 19-09-2004 à 00:30:39    

Oui, en effet, je pourrais faire ça aussi...Merci pour l'astuce... Toutefois, par curiosité, peux-tu STP m'expliquer ce que tu entends par division successive par 2 ? En effet, 21/2 = 10.5 , je ne vois pas ce que ça apporte ?
 
a+

Reply

Marsh Posté le 19-09-2004 à 04:37:25    

Ce qu'il veut dire c'est que pour savoir le membre n est concerné par le message dont le « nombre » est N, tu peux faire (N>>(n-1) & 1).

Reply

Marsh Posté le 19-09-2004 à 11:57:29    

tu pars de a plus petite puissance de 2 inférieure ou égale à ton nombre (21), tu en tires 2^4 d'où le membre numéro 5 et le reste 5, ensuite tu réitères :
 
21 => 16 + 5 => 2^4 + 5 => n°5+1
05 => 04 + 1 => 2^2 + 1 => n°3+1
01 => 01 + 0 => 2^0 + 0 => n°0+1 STOP
 
voili

Reply

Marsh Posté le 20-09-2004 à 13:57:58    

Euh ... Question stupide, sous Perl il n'y a pas une fonction qui passe du décimal en binaire ?
Nan, parce que (21)10 = (00010101)bin.
Et tu sais que tu dois envoyer aux membres 1, 3 et 5 (là où tu as des 1)

Reply

Marsh Posté le 30-09-2004 à 14:30:35    

Citation :

Euh ... Question stupide, sous Perl il n'y a pas une fonction qui passe du décimal en binaire ?


Je suis pas sur mais je crois que les fonctions pack/unpack sont destinées à ça. (http://www.perldoc.com/perl5.6.1/pod/func/pack.html)


Message édité par seccas le 30-09-2004 à 14:31:52
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed