Misez p'tit, Optimisez - N°39 (Nombres de Keith)

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

Avatar du membre
Paul Tergeist
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2417
Enregistré le : 15 oct. 2007 15:50
Localisation : 3ème planète après le soleil

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par Paul Tergeist »

C'est incroyable ça. J'ai jamais pensé à faire ça et je ne savais pas qu'on pouvait.
Je vais essayer tout de suite. Merci C.Ret
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 845
Enregistré le : 06 oct. 2012 14:37

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par tyann »

Extraire une racine, ça me fait penser que la semaine prochaine
je vais chez le dentiste Brrrr!!!!
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) 35s, 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, E500, El 5120, 9200, 9600
Canon X-07
Avatar du membre
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3625
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par Hobiecat »

C.Ret a écrit :J'ai trouvé mieux pour expliquer comment extraire une racine carrée sans calculette : après les slow computing, le paper and pencil computing ! :D
Joli ! Peut-être une idée du futur de nos calculatrices ? :mrgreen:
Avatar du membre
Paul Tergeist
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2417
Enregistré le : 15 oct. 2007 15:50
Localisation : 3ème planète après le soleil

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par Paul Tergeist »

Ca fait plusieurs fois que j'essaye et ça marche pas. Je pense que c'est un tour de magie.
Avatar du membre
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3625
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par Hobiecat »

Paul Tergeist a écrit :Ca fait plusieurs fois que j'essaye et ça marche pas. Je pense que c'est un tour de magie.
J'ai essayé aussi et j'ai indiqué en haut en m'appliquant bien : "TI-88"... ça n'a pas fonctionné non plus ! :wink:
Avatar du membre
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 8372
Enregistré le : 12 févr. 2007 18:36
Localisation : Pas très loin de Lyon
Contact :

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par badaze »

Hobiecat a écrit :
C.Ret a écrit :J'ai trouvé mieux pour expliquer comment extraire une racine carrée sans calculette : après les slow computing, le paper and pencil computing ! :D
Joli ! Peut-être une idée du futur de nos calculatrices ? :mrgreen:
Il y a plusieurs années, j'avais fait un rêve dans lequel je tenais une feuille de papier et sur cette feuille il y avait des smileys animés.
Tout est bon dans le pocket.
Moi j'aime tout.... Casio, HP, Sharp, TI et les autres sauf que les TI semblent ne pas m'aimer :(
http://www.emmella.fr
Mes Casio - HP - Sharp - TI
Homme invisible.
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par Gilles59 »

tyann a écrit :Bonjour à tous

Pour élargir un peu l'horizon je vous propose une version Lua pour nspire toujours !

Code : Tout sélectionner

var.monitor("n")
r,nt=0,0
function sum(l)
    local s,d=0,0
    for i,d in ipairs(l) do
        s=s+d
    end
    return s
end
function keith(n)
 while 1 do
      local s,l,i,li
       li={}
       s=tostring(n)
       l=string.len(s)
       for i=1,l do
           li[i]=tonumber(string.sub(s,i,i))
       end
       while li[l]<n do
           li[l+1]=sum(li)
           table.remove(li,1)
       end
       if li[l]==n then
           return li[l]
       else
           n=n+1
       end
   end
end
function on.varChange(n)
 nt=var.recall("n")
 r=keith(nt)
 platform.window:invalidate()
end
function on.paint(gc)
    gc:drawString("R="..r,10,20)
end
Voilà comme vous pouvez le voir y a des airs de famille avec le Basic.
Pour l'utilisation, une page de classeur est divisée en 2,une partie calcul et l'autre script Lua
On demande au script de surveiller les changements de la variable n
Il suffit donc de rentrer une valeur dans n <> de la précèdente dans la partie calcul pour déclencher le script et afficher le résultat dans la partie Lua.

Ha j'allais oublier: temps d'exécution pour n=70000 = 31 s 30 pas mal pour un langage interprété non ?
Vraiment très rapide !!

Une version plus courte pour 39gII mais beaucoup plus lente ! Peut etre le MAKEMAT ??

Code : Tout sélectionner

EXPORT Keith(n)
BEGIN
 REPEAT
  S:=FLOOR(LOG(n)+1);
  M1:=MAKEMAT(INT(10*FRAC(n/10^I)),1,S);
  REPEAT
   T:=ROWNORM(M1); DELCOL(M1,S) ; ADDCOL(M1,[0],1);M1(1,1):=T;
   IF T==n THEN BREAK(2); END;
  UNTIL T>n END;
  n:=n+1;
 UNTIL 0 END;
 T;
END;
A noter que si je met un RETURN T à la place du BREAK(2) çà ne fonctionne pas ... Encore du travail sur la ROM !
De même ADDCOL(M1,[T],1) ne fonctionne pas ... ADDCOL(M1,[0],1);M1(1,1):=T;
et ADDCOL(M1,T,1) n'est pas permis d'après la doc.

Pas trouvé de commande pour supprimer des éléments dans une liste :( c'est pour cela que j'utilise une matrice
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+ CM14 et MM12 / Alice 32
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 845
Enregistré le : 06 oct. 2012 14:37

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par tyann »

Merci Gilles59 pour cette version hp39gii
Pas trouvé de commande pour supprimer des éléments dans une liste c'est pour cela que j'utilise une matrice
Et les fonctions left, mid et right , ne fonctionnent pas sur les listes, contrairement au Ti Basic :( :(
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) 35s, 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, E500, El 5120, 9200, 9600
Canon X-07
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par Gilles59 »

Pour extraitre un sous-objet d'un objet (matrice, liste, graphique), la commande est SUB.
Mais ca déconne avec les liste => prochaine ROM

Nouvelle version, plus rapide :

Code : Tout sélectionner

EXPORT Keith(n)
BEGIN
 LOCAL s;
 REPEAT
  s:=string(n); N:=SIZE(s); M:=0;
  L1:=MAKELIST(expr(mid(s,I,1)),I,1,N); 
  REPEAT
   T:=ΣLIST(L1);
   M:=M+1; IF M>N THEN M:=1; END;
   L1(M):=T;
   IF T==n THEN BREAK(2); END
  UNTIL T>n END;
  n:=n+1;
 UNTIL 0 END;
T;
END;
Mais çà reste plus lent que LUA, Temps = 175 sec
Le même algo sur LUA (qui évite de 'bidouiller' les listes) devrait améliorer la vitesse.
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+ CM14 et MM12 / Alice 32
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3400
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par C.Ret »

Gilles59 a écrit :[...]Nouvelle version, plus rapide :[...]

Oui, cette dernière version correspond grosso-modo au brouillon de ce que j'étais en train d'échafauder pour cette machine. En fait surtout l'utilisation de ΣLIST.

Par contre, je ne connaissais pas MAKELIST ou MAKEMAT et donc je construisais à l'aide d'une boucle FOR/NEXT.

Par contre, j'évite (autant que possible) de sortir d'une boucle WHILE/UNTIL avec ce qui correspond à EXIT(ici si j'ai bien compris c'est BREAK) et le RETURN ne fonctionne pas. C'est peut-être lié à la ROM, mais peut-être aussi à la logique interne: comment sortir de la procèdure ou fonction alors que l'on est encore dans une (ou plusieurs) niveau de boucle ? Situation pas facile à gérer si l'on veut que son language permette la récurrence.

Code : Tout sélectionner

EXPORT NKEITH(n)
BEGIN
   LOCAL d,s,k;
   REPEAT
      d:=SIZE(string(n)); k:=d;
      L1:=MAKELIST(FLOOR(n/10^(I-1)) MOD 10,I,1,d); 
      REPEAT
         s:=ΣLIST(L1);  k:=(k MOD d)+1;  L1(k):=s;
      UNTIL s>=n END;
      n:=n+1;
   UNTIL n=1+s END;
  RETURN s;
END;
Pss sûr que ce soit plus rapide ni plus léger d'aileurs,....
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par Gilles59 »

Hello C.ret , sur la 39GII logiquement :

RETURN permet de sortir d'une fonction depuis n'importe où, dans une boucle ou pas.
On peut préciser RETURN NomVariable (ou valeur)

BREAK permet de quitter une boucle (quelle qu'elle soit, FOR, REPEAT ou WHILE) en cours
BREAK(n) permet de sortir de 'n' boucles imbriquées (par exemple BREAK(3) )

Code : Tout sélectionner

FOR
 FOR
  FOR
   ...  blabla...
   IF .... THEN BREAK(3); END;  // va en (a)
  END
 END
END
(a)
CONTINUE est ausi bien pratique : permet d'aller au début de la boucle ( Apres le FOR avec la valeur suivante par exemple)

Un truc sympa aussi (ou presque)

asc("abs")

renvoie [ 97 98 99 ]

par contre curieux que çà rencoie une matrice au lieu d'une liste ...

sinon asc(123)-49 aurait renvoyé {1,2,3}

Je pense que c'est une erreur de conception, une liste en retour serait bien plus logique
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+ CM14 et MM12 / Alice 32
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 845
Enregistré le : 06 oct. 2012 14:37

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par tyann »

Bonsoir à tous
Je consulte à l'instant, j'ai rien vérifié, rien testé
mais je vois que Gilles59 passe par une conversion en chaine de caractères pour extraire
chaque chiffre au lieu des divisions par 10 :wink:
Par contre je croyais que SIZE s'appliquait aux listes et que pour les chaines c'était dim(?
175 secondes , donc la nSpire grace à au Lua n'a pas dit son dernier mot, je répète ce que je dis
depuis longtemps si Ti nous offrait un Basic digne de ce nom, elle brillerai bien plus qu'actuellement :x :x
Ha oui sur Ti Basic CONT se dit Cycle.
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) 35s, 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, E500, El 5120, 9200, 9600
Canon X-07
Avatar du membre
Paul Tergeist
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2417
Enregistré le : 15 oct. 2007 15:50
Localisation : 3ème planète après le soleil

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par Paul Tergeist »

Gilles59 a écrit :Pour extraitre un sous-objet d'un objet (matrice, liste, graphique), la commande est SUB.
Mais ca déconne avec les liste => prochaine ROM
Zut ça m'arrange pas ça, je voulais me faire la main sur un simulateur HP41 en rentrant
les instructions dans une liste. Ex : {"LBL ESSAI" , "LBL 00" , "1" , "+" , "R/S" , "GTO 00" }

Et donc là d'après ce que tu me dis je dois attendre la prochaine ROM... snif...
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 845
Enregistré le : 06 oct. 2012 14:37

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par tyann »

Le même algo sur LUA (qui évite de 'bidouiller' les listes) devrait améliorer la vitesse.
Je vais essayé ça demain, une somme circulaire, pas mal Gilles59, c'était pas mal du tout , "merci Mr le président"
Bon je m"égare là, désolé mais je sors d'une petite fête :slime: :slime:
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) 35s, 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, E500, El 5120, 9200, 9600
Canon X-07
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3400
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit, Optimisez - N°39 (Nombres de Keith)

Message par C.Ret »

Paul Tergeist a écrit :[...]
Et donc là d'après ce que tu me dis je dois attendre la prochaine ROM... snif...
Ou coder différemment le simulateur.

Par exemple en utilisant une matrice ou un vecteur. Les programmes de l'HP-41c ne sont-il pas codés byte par byte dans sa mémoire ? Utiliser les codes token fera que ton simulateur s'approche un peu plus d'un émulateur et en plus prêt à permettre la Programmation Synthétique!!

Par exemple, GTO "TEST" se code dans la mémoire des HP-41 par les codes hexa 1D, F4, 54, 45, 53, 54.
Où :
1D est le Token pour GTO
F4 est le préfixe pour 4 caractères alpha
54 45 et 53 sont donc ici les codes caractères respectifs des T E S

Pourquoi ne pas utiliser un simulateur conforme qui mémorise cette séquence dans un vecteur [ 29 244 84 69 83 84 ]

Code : Tout sélectionner

LBL "ESSAI       CF F5 45 53 53 41 49    [ 207 245 69 83 83 65 73
  LBL 00         01                          1
    1            11                         17
    +            40                         64
    STOP         84                        132
  GTO 00         B1 C6°                    177 198°              ° ou zero si encore jamais exécuté
.END.            C? ?? ??                    ?   ?  ? ?  ]
Voilà, si j'avais l'idée de faire un simulateur d'HP-41, pour représenter le programme ESSAI, j'utiliserais un vecteur (tableau de nombres) qui serait : [ 207 245 69 83 83 65 73 1 17 64 132 177 00 ? ? ? ]

Image

Source: http://www.hpmuseum.org/prog/synth41.htm#ins
Modifié en dernier par C.Ret le 26 févr. 2013 23:35, modifié 1 fois.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Répondre

Retourner vers « Tous les Pockets »