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 de l’utilisateur
Paul Tergeist
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2417
Inscription : 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 » 25 févr. 2013 23:35

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

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

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

Message par tyann » 25 févr. 2013 23:56

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) 41CX, 28S, 48g, 50g, 39gII, Prime, Casio(s) fx 602P, 702p, 4500P, 8500g, PB-700, CG-20, Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, El 9200, 9600

Avatar de l’utilisateur
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2760
Inscription : 06 sept. 2011 14:57
Localisation : Normandie / Antwerpen

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

Message par Hobiecat » 25 févr. 2013 23:57

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 de l’utilisateur
Paul Tergeist
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2417
Inscription : 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 » 26 févr. 2013 00:52

Ca fait plusieurs fois que j'essaye et ça marche pas. Je pense que c'est un tour de magie.

Avatar de l’utilisateur
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2760
Inscription : 06 sept. 2011 14:57
Localisation : Normandie / Antwerpen

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

Message par Hobiecat » 26 févr. 2013 00:57

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 de l’utilisateur
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6485
Inscription : 12 févr. 2007 19:36
Localisation : Pas très loin de Lyon
Contact :

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

Message par badaze » 26 févr. 2013 01:05

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 : 1201
Inscription : 27 oct. 2010 20:46

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

Message par Gilles59 » 26 févr. 2013 01:19

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 / TI66 / TI74 Basicalc / TI95 Procalc/ HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49G+ / 50G / 50G NewRPL / HP Prime / Amstrad CPC 6128+

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

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

Message par tyann » 26 févr. 2013 08:21

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) 41CX, 28S, 48g, 50g, 39gII, Prime, Casio(s) fx 602P, 702p, 4500P, 8500g, PB-700, CG-20, Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, El 9200, 9600

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

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

Message par Gilles59 » 26 févr. 2013 10:41

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 / TI66 / TI74 Basicalc / TI95 Procalc/ HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49G+ / 50G / 50G NewRPL / HP Prime / Amstrad CPC 6128+

Avatar de l’utilisateur
C.Ret
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1862
Inscription : 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 » 26 févr. 2013 15:26

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 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803. | TI-57 LCD | TI-74 BasiCalc | TI-92 II | HP-15C | HP-28S + HP82240A | HP-41C + (2 memory + stat + IR) modules. | HP Prime Wireless Graphing Calculator . .Sommaire des M.P.O.. . Sommaire du P.C.T.M. .

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

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

Message par Gilles59 » 26 févr. 2013 15:45

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 / TI66 / TI74 Basicalc / TI95 Procalc/ HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49G+ / 50G / 50G NewRPL / HP Prime / Amstrad CPC 6128+

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

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

Message par tyann » 26 févr. 2013 22:17

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) 41CX, 28S, 48g, 50g, 39gII, Prime, Casio(s) fx 602P, 702p, 4500P, 8500g, PB-700, CG-20, Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, El 9200, 9600

Avatar de l’utilisateur
Paul Tergeist
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2417
Inscription : 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 » 26 févr. 2013 22:27

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...

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

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

Message par tyann » 26 févr. 2013 22:55

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) 41CX, 28S, 48g, 50g, 39gII, Prime, Casio(s) fx 602P, 702p, 4500P, 8500g, PB-700, CG-20, Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, El 9200, 9600

Avatar de l’utilisateur
C.Ret
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1862
Inscription : 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 » 27 févr. 2013 00:21

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
Dernière édition par C.Ret le 27 févr. 2013 00:35, édité 1 fois.
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803. | TI-57 LCD | TI-74 BasiCalc | TI-92 II | HP-15C | HP-28S + HP82240A | HP-41C + (2 memory + stat + IR) modules. | HP Prime Wireless Graphing Calculator . .Sommaire des M.P.O.. . Sommaire du P.C.T.M. .

Répondre

Revenir vers « Tous les Pockets »