2015-03-01
- correction cosmétique
   du modèle du Blog
  ° diaporama occupant
     tout l'écran
  ° message défilant
     démarrant du bord
     droit sous Chrome

Trognon le chaton

En lumière..

Des articles Lesbiens: Camellia Rose ,
Lipsticks [:* Fanny] , Lisa
et des Histoires signées MyLzz59: Mylène écrit (http://mylene-ecrit.blogspot.fr)

Des articles Trans-*: Ma Vie En Rose ,
Wawa's Smile , FtM ? , Thomas Beatie 2

Des Coups de Coeur: EXL ,
Kashimashi ~Girl meets Girl~ ,
Sa Majesté Freddie , Mon Côté Midinette
des Coups de Gueule: Karol relève-toi ,
BlondeBox , 1 pub 2 mR2 [bon courage :D]
et des Coups de Blues: Pile 1 an ,
Baisser de Rideau , Interlude

Du Visual Basic (VB6-VBA): Mlle Hanoï
Boules , Bombes , AnaClock , DigiClock ,
Tris (tetris) ,
et de la Bricologie: Real Barbie Girl

Pis pour les plus grand(e)s, des
S*X TOYS:
DildoBike , Tech To Nique

Et même parfois de la vraie vie:
Impressions de Voyage (Maroc) ,
Chez Mickey , La Tonnelle ,
Nous Nous Sommes Rencontrées

.

La vraie Taunie ..


... Tu me manques :'(


Notre Taz :*




Clock & Zik..

Idée Cadeau..


Attrape-Mouches

dyke goudou gouine homo homoaffectivité homoaffectivity homosexual homosexualité homosexuality homosexuel homosexuelle inverti invertie lesbian lesbianism lesbianisme lesbien lesbienne lez néovagin neovagina réassignation saphique saphisme sapphic sapphism trans transgender transgenre transidentité transidentity transsexalité transsexality transsexual transsexualism transsexualisme transsexuel transsexuelle tribade tribadisme vaginoplastie ...

Le combat continue..

MyLzz59..

.. @gmail.com

Blog français

Ca va encore mieux en le disant.. Important
## Comment "marche" ce Blog / Comment laisser un Commentaire ##

Et pour finir,
Mylène écrit (http://mylene-ecrit.blogspot.fr)N'oubliez pas de visiter aussi
mon blog d'histoires ====>



-MyLzz59-

samedi 21 mars 1970

BF_LCEB: "Le Compte Est Bon !"

Aujourd'hui je vous propose de rouvrir une Rubrique restée en sommeil depuis un certain temps, la Rubrique VB-VBA, avec un Programme sous MS Excel qui génère des tirages façon "Le Compte Est Bon", mais surtout les résout !

Rem: Devrait suivre prochainement la version MS Word, plus répandu chez les particuliers
;)

0) Présentation :

"Le Compte Est Bon" (janvier 1972) est, avec "Le Mot Le Plus Long" (septembre 1965), l'une des deux phases du plus ancien Jeu Télévisé encore existant de nos jours, "Des Chiffres Et Des Lettres", un concept simple et intelligent en même temps, aux antipodes de ces jeux où il faut estimer le prix d'une machine à laver, puis classer du moins cher au plus cher une conserve de raviolis, un paquet de rasoirs jetables, un tube de vaseline et une botte de poireaux, pour espérer remporter la fifille dans la vitrine, ou quelque chose comme ça.. :P


Un Jeu inventé par Armand Jammot, présenté à l'origine par Patrice Laffont, et toujours à l'antenne sur France Télévisions. De temps à autre, nous ressortons la boîte de jeu de l'époque (voir photo..), et faisons des parties (non chronométrées) avec la Miss, histoire de changer du Scrabble, autre jeu de société intelligent.

1) Principe du Jeu :

24 Plaques sont disposées aléatoirement, face retournée, en 4 rangées de 6, sur un présentoir. L'un après l'autre, les deux candidats qui s'affrontent énoncent "Première", "Seconde", "Troisième", ou "Quatrième, désignant la rangée où est prélevée la Plaque. 6 sont ainsi collectées, puis dévoilées l'une après l'autre à mesure qu'elles sont enquillées en haut de l'ardoise murale où sera écrite la solution. Ces Plaques portent chacune un nombre, comme suit: chaque nombre de 1 à 10 existe sur deux Plaques, les quatre restantes portent 25, 50, 75, et 100.

Puis trois roues sont lancées, fournissant chacune l'un des trois chiffres d'un nombre compris entre 100 et 999. C'est le Total à Trouver, en effectuant (dans un temps limité) des Additions, Soustractions, Multiplications, et Divisions à partir de ces Plaques et/ou des résultats intermédiaires, auquel cas les candidats annoncent "Le Compte Est Bon", ou à défaut essaient de s'en approcher au mieux, en 5 Equations maximum, avec comme contraintes de ne générer ni nombre négatif ni nombre à virgule, et de n'utiliser qu'une fois maximum chaque Plaque ou résultat intermédiaire.

Prenons l'exemple du Tirage sur l'illustration ci-dessous:
[ 25 ] , [ 3 ] , [ 10 ] , [ 5 ] , [ 8 ] , [ 2 ] ==> [ 483 ]

Ce Compte est trouvable de plusieurs façons, examinons la première solution proposée (ligne 5)
*) [ 25 ] x [ 3 ] = { 75 } (premier résultat intermédiaire)
*) [ 10 ] x [ 2 ] = { 20 } (second résultat intermédiaire)
*) { 75 } + { 20 } = { 95 } (réemploi de ces deux résultats)
*) [ 5 ] x { 95 } = { 475 } (mix entre Plaque et résultat)
*) [ 8 ] + { 475 } = 483 ==> "Le Compte Est Bon"

2) Ma version ("BF_LCEB") :

Acronyme de "BruteForce - Le Compte Est Bon", ce programme utilise le principe "bourrin" de tester toutes les combinaisons qu'il est possible de former avec le Tirage proposé, d'élaguer (abandonner) en cours de route les combinaisons qui n'aboutissent pas (nombres négatifs ou à virgule, divisions par zéro..) et de lister celles dont le Résultat ne s'écarte pas plus du Total à Trouver que Delta Maxi (au dessus ou en dessous), triées par proximité décroissante.

Les deux inconvénients de cette méthode sont tout d'abord le temps de calcul qui peut atteindre les quelques centaines de secondes, et d'autre part la quantité de solutions retenues qui peut chatouiller les limites de la feuille Excel. Attention donc à ne pas exagérer la valeur de ce Delta Maxi, j'ai choisi de ne rien coder pour s'en prémunir, ce n'était pas l'objectif de ce Programme.


L'interface se compose de deux zones, la partie haute (essentiellement la ligne 2) présentant le Tirage, le Total à Trouver, et le Delta Maxi, la partie basse se refermant lors d'un nouveau Tirage, et s'ouvrant pour lister les solutions. Un bouton "Tirer" génère ..un nouveau Tirage, et referme la partie basse. Enfin, un autre bouton "Chercher" effectue la recherche des solutions et les affiche en partie basse. Vous trouverez l'article connexe avec le code de construction du Décor ICI

Il est possible de rentrer ses propres Tirages, par exemple ceux en direct pendant l'émission télévisée, car les huit cellules de la ligne 2 ne sont pas verrouillées contre la saisie, et ce sont les valeurs qui y figurent qui sont récupérées lors de la résolution. Attention ici encore à n'y faire figurer que des valeurs correctes, aucun contrôle n'y est fait non plus !

3) Principe de la Résolution :

*) Un Tirage génère 6 Plaques, nommées "Plaque(1)" à "Plaque(6)". Pour les identifier plus aisément, nous allons les "tagger" avec une lettre majuscule dans le même ordre, soit "A" à "F". Au départ du Jeu, le choix se résume à ces 6 Plaques, soit à "ABCDEF".

*) Etape 0: Le Total à Trouver (au Delta Maxi près) est-il simplement formé de l'une de ces 6 Plaques ?

*) Etape 1: La Première Equation sera formée d'une Première Plaque, "au hasard" parmi ces 6. Exemple, la 2ème, la "B". Ensuite d'un Opérateur, parmi les 4 possibles, "+", "-", "*", ou "/". Enfin, d'une Seconde Plaque, parmi les 5 restantes, autrement dit parmi "ACDEF". Par exemple, la 4ème, la "E".

*) Si cette Equation "[ Première Plaque ] Op [ Deuxième Plaque ]" fournit un résultat validé (ni négatif ni à virgule, ni une division par zéro), ce { Résultat 1 } va être assimilé à une Septième Plaque "Plaque(7)", autrement dit "G", qui s'ajoute aux 4 restantes, dans notre exemple "ACDFG".

*) Si ce Résultat n'est pas plus éloigné du Total à Trouver qu'un Delta Maxi, ce calcul sera ajouté à la liste des solutions, en partie basse.

*) Récursivité (souvenez-vous, les factorielles..)
La construction de la Seconde Equation consiste à répéter strictement le cheminement de la Première Equation, avec comme choix de départ les 4 Plaques restantes, ainsi que le résultat généré, autrement dit "ACDFG". Elle consommera deux de ces 5 Plaques (dont peut-être "G"), et génèrera un nouveau résultat "H" ("Plaque(8)"). Idem pour les Equations 3 à 5, cette dernière finissant de consommer les Plaques, et générant juste "K" ("Plaque(11)"). C'est un cas typique de récursivité, d'où une procédure qui s'appelle elle-même, jusqu'à génération de la dernière (11ème) Plaque.

Sub Calcule_Etape(ByVal Lst_Plaq$, ByVal Chaine_Src$)
*) Dernière astuce, l'élimination des Equations Inutilisées. Dans une solution formée de moins de 5 Equations, peu(ven)t être insérée(s) n'importe quelle(s) Equation(s) parasite(s) dont le résultat n'est pas utilisé dans la suite du calcul. C'est le rôle du (faux) booléen "Bool_OK" de les détecter. Un exemple sera plus parlant qu'un long baratin ;)

Supposons une solution en deux Equations. Cette solution a pour Résultat "H", et doit avoir au minimum consommé "G", sinon la première Equation est inutilisée. En clair, "G" ne doit plus figurer dans les Plaques restantes. A la troisième Equation ni "G" ni "H", et à la quatrième ni "G" ni "H" ni "I". A la cinquième le "problème" ne se pose plus, vu que "mécaniquement" tout a été consommé.

Détaillons simplement les Variables..
NbRep: compteur de réponses (solutions) affichées
         Total: le Résultat à Trouver
      DeltaMax: écart maximum admissible par rapport à 'Total'
 Plaque(1 à 6): les 6 nombres du Tirage (autrement dit "A" à "F")
Plaque(7 à 11): les 5 résultats des Equations (ou "G" à "K")
     Lst_Plaq$: la chaîne des Lettres des Plaques restantes
   Chaine_Src$: passée à (cf.) l'affichage d'une ligne de solution
        NbPlaq: nombre de Plaques dans 'Lst_Plaq$' (de 6 à 2)
        NoPlaq: numéro de la Plaque en cours de calcul (de 7 à 11)
          Cpt1: compteur de parcours séquentiel de la Première Plaque
          Cpt2: compteur de parcours séquentiel de la Seconde Plaque
          Cpt3: compteur de parcours séquentiel des 4 Opérateurs
       VPlaq1$: Lettre de la Première Plaque sélectionnée
         Lst1$: Lst_Plaq$ moins la Première Plaque
       VPlaq2$: Lettre de la Deuxième Plaque sélectionnée
         Lst2$: Lst1$ moins la Deuxième Plaque mais avec le Résultat
         Oper$: Opérateur sélectionné parmi les 4
  Chaine_Rest$: Chaine_Src$ après traitement de l'Etape
           Cpt: un compteur associé à Bool_OK
       Bool_OK: (faux) booléen, élimine la solution si Faux
4) Démarrage de la Résolution :

Le Sub Calcule_Etape(..) est invoqué par le Sub Calcule().

- Celui-ci commence par invoquer la récupération des 6 Plaques, du Total à Trouver, ainsi que du Delta Maxi:
Sub Relecture_Depart()
- Puis il initialise le Tirage aux 6 Plaques "ABCDEF".

- K! capture l'heure courante, elle servira à afficher le temps mis pour la Résolution.

- Enfin, pour grapiller quelques secondes ;) , le rafraîchissement de l'Onglet est désactivé durant les Etapes de Calcul. Notez que l'Affichage court-circuite cette désactivation toutes les 10 Réponses trouvées.

*) Etape 0: Les 6 Plaques de départ sont comparées au Total à Trouver. Celles dont l'écart n'excède pas Delta Maxi sont affichées en partie basse, mais sans générer d'Equation.

*) Etape 1: Simple invocation du Sub Calcule_Etape(..), avec les 6 Plaques et une Chaîne Source vide.

- Puis les Solutions sont triées par écart croissant au Total à Trouver.

- Enfin, le rafraîchissement est réactivé, et un Message ainsi que la Ligne d'Etat d'Excel signalent le temps mis pour la Résolution, ainsi que le nombre de Solutions trouvées.

5) Affichage des Solutions :

Le Sub Affiche_Reponse(..) est invoqué par les Sub Calcule() (Etape 0) et Calcule_Etape(..) (Etapes 1 à 5) .

- La Chaîne qui lui est passée contient soit une Lettre seule, représentant une Plaque (Etape 0), soit une liste d'Equations concaténées, chacune sous la forme "Lettre" "Opérateur" "Lettre" ";" .

- Le Nombre de Solutions est incrémenté, et une nouvelle ligne vide est insérée au-dessus de la ligne "témoin" (celle avec les "nnn", à ne surtout pas effacer: elle sert de repère pour l'effacement).

- La valeur "Res" est pré-alimentée via la première Lettre de la Chaîne (en cas d'Etape 0), puis la Chaîne est dépilée en s'appuyant sur les ";" en quatrième position, matérialisant séqueltiellement les Etapes 1 à 5. Pour chacune d'elles, l'Equation est affichée dans ses colonnes, et "Res" est mis à jour.

- Au final, "Res" est affiché, ainsi que l'écart (calculé) en valeur absolue.

- Enfin, toutes les 10 Solutions, un rafraîchissement est forcé, et la Ligne d'Etat d'Excel affiche cette quantité.

6) Nettoyage de la partie basse (Zone des Solutions) :

- Un balayage est lancé vers le bas, depuis la ligne 5 jusqu'à trouver le marquage "nnn" en colonne "C". C'est pourquoi il est indispensable de conserver la ligne témoin. Les lignes balayées sont alors supprimées, pour ramener le témoin sous les en-têtes.

- Les 6 premières lignes deviennent les seules visibles, les autres sont masquées. Le "Mid$(ActiveSheet.Cells.Address, 4) permet de s'affranchir de la taille de la Feuille Excel (65536 lignes en ".xls", 1048576 en ".xlsM"). Le "Cells(5, 1).Select" a pour fonction de ramener l'ascenseur vertical en haut de Feuille..

7) "Affiche_Tirage()" et "Relecture_Depart()" :

- Rien de spécial à en dire, notez que chacun appelle le Sub de Nettoyage de la partie basse (Efface_Reponses()).

- Rappel: aucun contrôle n'est fait par "Relecture_Depart()" sur les valeurs relues sur la ligne 2 de la Feuille Excel !!

8) Le Tirage proprement dit ("Tirage()") :

- L'on constitue une chaîne de 24 triplets correspondant aux 24 Plaques du jeu. Chaque triplet est la valeur sur 3 chiffres d'une Plaque, d'où la chaîne suivante:
"001001002002003003 [..] 009010010025050075100"".

- A 6 reprises on prélève aléatoirement une de ces Plaques, la retire de la chaîne, pour inscrire sa valeur dans "Plaque(1 à 6)".

- Enfin, le Total à Traiter est tiré lui aussi aléatoirement, entre 100 et 999, et le Delta Maxi remis à zéro (recherche exacte). Un message sur la Ligne d'Etat confirme la fin de la procédure.

9) Interface :

- Au plus simple, chacun des 2 boutons "Tirer" et "Chercher" déverrouille (UnProtect) la Feuille Excel, appelle sa procédure (respectivement les Subs "Tirage()" et "Calcule()"), puis reverrouille (Protect) la Feuille Excel (sans mot de passe).

Avant tout appel de résolution "Chercher", pensez à effectuer un premier Tirage (et à sauvegarder le Classeur) !! ;)

Le code complet de ce programme est disponible ICI. Collez-le intégralement dans la Zone de Code de la Feuille Excel (a priori "Feuil1" dans l'Explorateur de Projets VBA). Les manipulations utiles figurent dans l'article connexe de construction du Décor..

-MyLzz59-

2 Commentaire(s):

Stéphane a dit…
COUCOU!
bon, j ai plus rien qui puisse digerer du VBA à la maison....
et je me vois mal attaquer ça au boulot...
Mais je me rend vaguement compte du travail pour creer un truc pareil! :-)
Chapeau miss!

(pour revenir sur mon absence: mon nouveau job me bouffe plus de temps que prévu.... :p mais bon, pas eu trop le choix!)
Bonjour à toutes et tous...
Bises à Toi Mylène (et toute ta ptite famille) ainsi qu à Delph'!
:*


Mylène (MyLzz59) a dit…
Coucou Taz :)

Me croirais-tu si je te disais que le plus long dans tout ça, c'est ..de rédiger l'article ? :P

Ben mon pôvre, je me doute bien de ce que ça signifie, pour l'avoir vécu.. Courage, ça finira par se stabiliser. L'essentiel, par ces temps qui courent, reste quand même d'avoir du boulot (si ça continue l'on parlera un jour de "privilège" :( )

Merci d'avoir apprécié, même si tu n'as pu l'essayer, et si tu trouves quelques autres minutes, n'hésite pas à te balader sur les autres articles, ici, comme sur l'autre blog, ("Mylène écrit"), où de nouvelles histoires sont en ligne ;)

Bisous :*, ainsi qu'à la Taz Family !
-MyLzz59-