chocosbar a écrit:Bonsoir à tous !
Tout d'abord, je tiens à tous vous remercier pour l'engouement dont vous faites preuve pour résoudre mon problème.
Il me fait plaisir de voir qu'il existe de véritables passionnés, qui sont capables de prendre sur leur temps, pour répondre aux questions de parfaits inconnus.
Et encore, t'as pas tout vu !!!
chocosbar a écrit:Tout ça pour dire que le cadeau tient plus du clin d'oeil : voir la maitresse désemparée tous les jeudis pour savoir comment elle va faire, m'a fait pensé à ce petit geste, entre cadeau et plaisanterie.
Je m'étais donc dit qu'il serait sympathique de lui donner une jolie formule mathématique, du nombre de combinaison possibles, cachées derrières ce simple geste qu'est d'attribuer des groupes dans des ateliers.
Ok, t'as dû te rendre compte que la formule ne fait pas tout. Une formule donnant trop de résultats ne sert pas à grand chose.
De mon coté, je suis aussi un programmeur fou. Et donc je me suis dit "au lieu de donner une formule inutile, autant donner un programme qui propose des choix".
Et donc j'ai écrit ce programme en Python. Python est un langage de script gratuit, objet et utilisable aussi bien sous Linux que sous Windows. On peut le télécharger ici
http://www.python.org/ftp/python/2.7/python-2.7.msi. Il est très connu dans le milieu de la prog.
Voici le code Python
- Code: Tout sélectionner
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import sys
# Fonction qui vérifie la cohérence des groupes déjà établis
def verif(grp):
# Traitement de chaque groupe
for g in grp:
# Chaque groupe doit avoir "1234"
for i in range(1, 5):
if str(i) not in g: return False
# for
# for
# S'il n'y a qu'un groupe, alors il est cohérent
if len(grp) == 1: return True
# Il y a donc ici plusieurs groupes à vérifier
# Examen de chaque groupe
for (i,_) in enumerate(grp):
# Examen de chaque chiffre du groupe
for (c,_) in enumerate(grp[i]):
# Le chiffre ne doit pas se retrouver à la même place dans les autres groupes
for j in range(i + 1, len(grp)):
if grp[i][c] == grp[j][c]: return False
# for
# for
# for
# Les groupes sont cohérents
return True
#verif()
# Extrapolation des groupes possibles à partir des groupes donnés
def extrapolation(grp):
# On va pas se casser le noeud. Boucle de 1111 jusqu'à 4444. Tant pis pour les doublons, ils seront giclés à la vérif
for i in range(1, 5):
for j in range(1, 5):
for k in range(1, 5):
for l in range(1, 5):
# Créationdu nouveau groupe possible
new="%s%s%s%s" % (i, j, k, l)
# Maintenant, il faut juste que le groupe soit cohérent avec lui-même et avec les autres
if not verif(grp + [new,]): continue
# Ok, le nouveau groupe est cohérent - On affiche la possibilité
print "%s, %s" % (str([x for x in grp]).replace("'", "")[1:-1], new)
# for
# for
# for
# for
# extrapolation()
if __name__ == "__main__":
if len(sys.argv) <= 1:
print "Il faut donner au-moins le groupe de base"
sys.exit(1)
if not verif(sys.argv[1:]):
print "Désolé, les groupes %s ne sont pas cohérents - Abandon" % sys.argv[1:]
sys.exit(2)
extrapolation(sys.argv[1:])
# if
Et voici comment on s'en sert
On l'appelle en lui donnant les groupes déjà faits. Et lui, il analyse et vérifie les groupes déjà passés et propose une liste de possibilités pour le groupe du jour.
Donc si on lui donne seulement le groupe du lundi il proposera toutes les possibilités pour le mardi. Si on lui donne les groupes du lundi et du mardi il proposera alors toutes les possibilités restantes pour mercredi. Et si on lui donne lundi, mardi et mercredi alors il propose la seule possibilité restante pour le jeudi
Voici qq exemples
Exemple 1: on l'appelle avec un groupe incohérent car le même chiffre est dupliqué
groupes.py 1233
Désolé, les groupes ['1233'] ne sont pas cohérents - Abandon
Il informe que le groupe 1233 n'est pas possible
Exemple 2: on l'appelle avec deux groupes dont un chiffrese retrouve 2 fois à la même place
groupes.py 1234 4132
Désolé, les groupes ['1234', '4132'] ne sont pas cohérents - Abandon
Il informe que l'association 1234 et 4132 n'est pas possible
Exemple 3: on l'appelle avec la disposition 1234 du lundi
groupes.py 1234
1234, 2143
1234, 2341
1234, 2413
1234, 3142
1234, 3412
1234, 3421
1234, 4123
1234, 4312
1234, 4321
Il donne en retour toutes les possibilités incluant la disposition du lundi suivie d'une proposition pour le mardi.
Exemple 4: on l'appelle en lui donnant la disposition 1234 du lundi et 2341 du mardi
groupes.py 1234 2341
1234, 2341, 3412
1234, 2341, 4123
Il donne en retour toutes les possibilités incluant les dispositions du lundi et du mardi suivi d'une proposition pour le mercredi
Exemple 5: on l'appelle en lui donnant la disposition 1234 du lundi, 2341 du mardi et 4123 du mercredi
groupes.py 1234 2341 4123
1234, 2341, 4123, 3412
Il donne en retour toutes les possibilités incluant les dispositions du lundi, du mardi et du mercredi suivi de la seule proposition possible pour le jeudi
:zen: :zen: :zen: