Le compte est bon HP39gII

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Répondre
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1428
Inscription : 27 oct. 2010 20:46

Le compte est bon HP39gII

Message par Gilles59 » 19 août 2012 20:06

Hello,

un exemple de programme 39gII.

Code : Tout sélectionner

//================================
// Le compte est bon - HP39gII
//--------------------------------

// Variables globales
 LOp:={" plus "," moins "," fois ", " divisé par "};
 Sol; Cible; Ecart;MeilleurCoup,Tirage;

// Génére une liste contenant la meilleure solution
AffSol (n1,Op,n2,n3)
 BEGIN
  Sol:=CONCAT(Sol, ""+MAX(n1,n2)+LOp(Op)+MIN(n1,n2)+"->"+n3);
 END;

// Le coeur du programme
LCB(Tab,Nb)
BEGIN
 LOCAL  i,j,Op,T1,r:=0;
 FOR i FROM 1 TO Nb-1 DO
  FOR j FROM i+1 TO Nb DO
   FOR Op FROM 1 TO 4 DO
    Tab=>T1;                                                 
    IF Op==1 THEN                                                       // To avoid CASE problem
     T1(i)+T1(j)=>T1(i);
    ELSE 
     IF Op==2 THEN
      ABS(T1(i)-T1(j))=>T1(i);
     ELSE 
      IF Op==3 THEN
       T1(i)*T1(j)=>T1(i);
      ELSE
       IF (T1(j)<>0) AND (T1(i) MOD T1(j)==0) THEN 
        T1(i)/T1(j)=>T1(i);
       ELSE
        IF (T1(i)<>0) AND (T1(j) MOD T1(i)==0) THEN 
         T1(j)/T1(i)=>T1(i);
        ELSE
         BREAK;
        END;
       END;    
      END; 
     END; 
    END; 
    IF T1(i)==Cible THEN AffSol(Tab(i),Op,Tab(j),T1(i)); r:=1; BREAK(3); END; // RETURN(1) don't work
    IF ABS(T1(i)-Cible)<Ecart THEN                                    
     MeilleurCoup:=T1(i);
     Ecart:=ABS(Cible-MeilleurCoup);
    END;
    T1(Nb)=>T1(j);
    IF LCB(T1,Nb-1) THEN AffSol(Tab(i),Op,Tab(j),T1(i)); r:=1; BREAK(3); END;
   END;
  END; 
 END;
 RETURN r;
END;
 

// Le programme principal

EXPORT Compte(t,c)
 BEGIN
  LOCAL n;
  Cible:=c;
  Ecart:=999;
  MeilleurCoup:=0;
  Tirage:=t;
  Sol:={};
  PRINT ("***** LE COMPTE EST BON *****");
  PRINT (Tirage);
  PRINT ("Nombre à trouver : " + Cible);
  PRINT ("");  
  IF NOT(LCB(Tirage,6)) THEN
   PRINT("Solution la plus proche :" + MeilleurCoup);
   Cible:=MeilleurCoup;
   Ecart:=999;
   LCB(Tirage,6)
  END;
  REVERSE(Sol)=>Sol;

  FOR n FROM 1 TO SIZE(Sol) DO 
   PRINT("   " + Sol(n));
  END;
  RETURN Sol;
 END;
Pour lancer une recherche, par exemple :

Compte({6,6,25,4,100,9}, 923}

->
Image

Image

Testé sur l'émulateur (en attentant le kit PC). Les temps de réponse vont de qqes secondes à qqes minutes (ce sera forcement plus lent sur la calc)...

Reste quelques bugs sur lesquelles HP bosse (j'ai du virer les CASE, les RETURN sans BREAK, mais le programme en l'état fonctionne parfaitement. Le programme serait plus 'beau' avec des CASE au lieu d'affreux IF imbriqués

Bref machine avec un gros potentiel mais à finaliser

Pour s'entrainer http://www.woodlands-junior.kent.sch.uk ... ntdown.swf
Dernière édition par Gilles59 le 19 août 2012 20:38, édité 2 fois.
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49G+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+

Tipoucet
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3767
Inscription : 10 janv. 2009 14:47

Re: Le compte est bon HP39gII

Message par Tipoucet » 19 août 2012 20:32

Eh bien chapeau au couple calculatrice/programmeur ! 8O
Dominique

Avatar de l’utilisateur
spacemax
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 85
Inscription : 05 nov. 2011 13:45
Localisation : Alpes de Haute Provence
Contact :

Re: Le compte est bon HP39gII

Message par spacemax » 22 sept. 2012 20:55

Bonjour,

Effectivement bravo. Pas simple à comprendre, encore moins à écrire.
Encore un matheux !
:wink:
Don't forget the spirit of the game...

Canon X-07 / Casio fx-850P / TI74 / Casio fx-8500G / Psion 3 / Psion 3a / Psion II XP / Psion II Lz / Psion Revo / Fx-4000p / Dell Axim x50V / Spiga Sagem / Casio fx-3900p / Casio fc-200 / Sharp 1403

Mic
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 386
Inscription : 27 mai 2012 09:31
Contact :

Re: Le compte est bon HP39gII

Message par Mic » 23 sept. 2012 10:29

Impressionnant !

Y a-t-il un moyen de le partager en fichier (pour éviter de tout recopier) avec cette méthode ?
http://www.calc-bank.com/index.php?mod= ... es&id=1652

Merci :wink:

Avatar de l’utilisateur
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7180
Inscription : 31 janv. 2008 15:24
Localisation : Banlieue Paârisienne
Contact :

Re: Le compte est bon HP39gII

Message par gege » 23 sept. 2012 23:04

Chouette, mais ce n'est plus de la force brute, mais de la force brutale ! ;-)
Comment trouver mieux, je ne sais.
G.E.

Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1428
Inscription : 27 oct. 2010 20:46

Re: Le compte est bon HP39gII

Message par Gilles59 » 25 sept. 2012 23:15

Oui c'est brutal lol !

L'émulateur officiel est sorti.

La présentation en 'paysage' est tres sympa.
Le bug sur la fonction CASE n'est pas corrigé :(

Pour partager (et packager!) le fichier j'aimerai bien que la function CASE fonctionne car ces affreux IF ELSE imbriqués me dépriment (! oui je sais c'est grave :D

Code : Tout sélectionner


    CASE
     IF Op==1 THEN T1(i)+T1(j)=>T1(i);      END;
     IF Op==2 THEN ABS(T1(i)-T1(j))=>T1(i); END;
     IF Op==3 THEN T1(i)*T1(j)=>T1(i);      END;
     IF Op==4 THEN 
      CASE
       IF (T1(j)<>0) AND (T1(i) MOD T1(j)==0) THEN T1(i)/T1(j)=>T1(i); END;
       IF (T1(i)<>0) AND (T1(j) MOD T1(i)==0) THEN T1(j)/T1(i)=>T1(i); END;
       DEFAULT BREAK;
      END;
    END;
 ...
C'est quand même mieux non ... Mais çà ne 'compile' pas (check du programme). Bug connu de hp en cours de résolution
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49G+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+

Mic
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 386
Inscription : 27 mai 2012 09:31
Contact :

Re: Le compte est bon HP39gII

Message par Mic » 01 oct. 2012 18:38

Sais-tu comment stocker une chaine de caractères dans une variable ?
Un simple "texte">A ne marche pas...

Et la fonction EVAL s'utilise comment ?

Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1428
Inscription : 27 oct. 2010 20:46

Re: Le compte est bon HP39gII

Message par Gilles59 » 01 oct. 2012 18:51

Sais-tu comment stocker une chaine de caractères dans une variable ?
Un simple "texte">A ne marche pas...
Comme il n'existe pas de variable globale 'texte' , Il faut déclarer la variable avant avec LOCAL

Code : Tout sélectionner

EXPORT Essai()
 BEGIN
   LOCAL t;
   t:="Bonjour";  t:=t+" le monde !"
   MSGBOX(t);
 END;
Pour affecter une variable, on peut faire indifféremment :

t:="blabla"
"blabla" => t ( => est le triangle noir de STO)

Dans ce cas, la variable n'existe qu'à l'intérieur du programme (entre BEGIN et END)

Pour définir une nouvelle variable globale, c'est juste un prgramme

EXPORT f:="Valeur initiale";

ensuite f peut être utilisée et modifiée partout, y compris en intéractif :

f:='blabla" (ou "blabla" STO>f )
f
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49G+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+

Mic
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 386
Inscription : 27 mai 2012 09:31
Contact :

Re: Le compte est bon HP39gII

Message par Mic » 01 oct. 2012 19:18

Super, merci beaucoup. j'avais zappé cette déclaration en local et le EXPORT.

tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 756
Inscription : 06 oct. 2012 14:37

Re: Le compte est bon HP39gII

Message par tyann » 07 oct. 2012 09:57

J'ai adapté ce prog qui est super en Ti Basic.
Pour un calcul donné : temps d'exécution sur Voyage 200 : 1100 et quelques secondes, sur nSpire cx : 39 secondes.
Faudra que j'essaie en Lua un de ces quatres.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, El 5120, 9200, 9600

Canon X-07

Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1428
Inscription : 27 oct. 2010 20:46

Re: Le compte est bon HP39gII

Message par Gilles59 » 07 oct. 2012 10:43

tyann a écrit :J'ai adapté ce prog qui est super en Ti Basic.
Pour un calcul donné : temps d'exécution sur Voyage 200 : 1100 et quelques secondes, sur nSpire cx : 39 secondes.
Faudra que j'essaie en Lua un de ces quatres.
Super ! le temps de calcul est tres variable en fait. Le pire est quand il n'y a pas de solution exacte.

J'ai pas essayé d'optimiser à ce stade. J'attends une version déboguée de la ROM (fonction CASE et RETURN ) pour 'packager' tout cela et optimiser . En plus là je n'arrive plus à synchroniser ma 39gII avec le PC, je dois avoir des version incompatibles de ROM et emulateur

Au passage, encore un truc pas évoqué dans la doc. Pour faire une boucle avec un pas négatif la syntaxe est :

Code : Tout sélectionner

  FOR n FROM SIZE(Sol) DOWNTO 1 DO 
   PRINT("   " + Sol(n));
  END;
La syntaxe de a 39gII est _très_ proche (mais pas toujours identique) à celle du langage de XCAS (mais sans le CAS)
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49G+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+

tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 756
Inscription : 06 oct. 2012 14:37

Re: Le compte est bon HP39gII

Message par tyann » 07 oct. 2012 11:05

Salut Gilles59.
Tout d'abord félicitations pour ce prog.
Pour l'optimisation si ça peut t'aidé voici un calcul que j'ai entré avec la solution:
compte({2,3,10,1,75,6},432)
soluc=3+2=5, 10/5=2, 75-2=73, 73-1=72, 72*6=432
Comme tu peux le voir les 2 premières opérations sont inutiles.
Y a peut être à creuser de ce coté là.
Ceci dit cela reste quand même bluffant.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, El 5120, 9200, 9600

Canon X-07

Mic
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 386
Inscription : 27 mai 2012 09:31
Contact :

Re: Le compte est bon HP39gII

Message par Mic » 07 oct. 2012 20:41

Moi aussi j'ai des problèmes de synchro PC <> HP39gII...

Mic
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 386
Inscription : 27 mai 2012 09:31
Contact :

Re: Le compte est bon HP39gII

Message par Mic » 20 oct. 2012 11:28

Gilles, tu as des nouvelles sur la réparation des bugs actuels ?

Répondre

Revenir vers « Tous les Pockets »