Misez p'tit Optimisez n°93 : somme récursive des chiffres d'un entier (racine digitale)

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
Danny
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1248
Enregistré le : 28 déc. 2013 16:34

Misez p'tit Optimisez n°93 : somme récursive des chiffres d'un entier (racine digitale)

Message par Danny »

Hello,

Je propose un petit sujet sympa qui n'a pas déjà été traité a priori :

Le calcul de la somme des chiffres composant un entier, de façon récursive jusqu'à n'obtenir plus qu'un chiffre.
Par exemple f(1337) = 5 , car 1 + 3 + 3 + 7 = 14 , puis 1 + 4 = 5.

Comme d'hab, essayez d'éviter de chercher sur les internets sinon vous allez vite trouver la méga astuce pour calculer ça super rapidement :D

(même ma Casio fx-3900P avec ses 100 pas peut le faire 8))


Sommaire des MPO
Modifié en dernier par Danny le 20 juin 2020 13:15, modifié 2 fois.
? Apple, Atari, Canon, Casio, ????????????, HP, Psion, Sharp, Tandy... même TI.
cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2143
Enregistré le : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: Misez p'tit Optimisez n°93 : somme récursive des chiffres d'un entier

Message par cgh »

Hyper rapido, pas trop optimise non plus !
Pour HP41:

Code : Tout sélectionner

   01 LBL "SN"
   02 LBL 00
   03 STO 00
   04 LBL 01
   05 CLX
   06 STO 01
   07 LBL 02
   08 RCL 00
   09 X=0?
   10 GTO 03
   11 10
   12 /
   13 INT
   14 STO 00
   15 LASTX
   16 FRC
   17 10
   18 *
   19 ST+ 01
   20 GTO 02
   21 LBL 03
   22 9
   23 RCL 01
   24 X>Y?
   25 GTO 00
   26 END
Il suffit de faire NNNNNN dans X, XEQ SN, et X contient la somme des chiffres de l'entier sur 1 chiffre.
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2143
Enregistré le : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: Misez p'tit Optimisez n°93 : somme récursive des chiffres d'un entier

Message par cgh »

Une version sans registre (juste la pile) pour HP41. Meme mode operatoire que le programme precedent:

Code : Tout sélectionner

   01 LBL 01
   02 0
   03 X<>Y
   04 LBL 02
   05 X=0?
   06 GTO 00
   07 10
   08 /
   09 INT
   10 LASTX
   11 FRC
   12 10
   13 *
   14 ST+ Z
   15 RDN
   16 GTO 02
   17 LBL 00
   18 RDN
   19 LBL "SN"
   20 9
   21 X<>Y
   22 X>Y?
   23 GTO 01
   24 END
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
Avatar du membre
Danny
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1248
Enregistré le : 28 déc. 2013 16:34

Re: Misez p'tit Optimisez n°93 : somme récursive des chiffres d'un entier

Message par Danny »

Méthode de bourrin, c’est un bon début 8)
? Apple, Atari, Canon, Casio, ????????????, HP, Psion, Sharp, Tandy... même TI.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3421
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°93 : somme récursive des chiffres d'un entier

Message par C.Ret »

Danny a écrit : 12 juin 2020 14:32 Le calcul de la somme des chiffres composant un entier, de façon récursive jusqu'à n'obtenir plus qu'un chiffre.
Par exemple f(1337) = 5 , car 1 + 3 + 3 + 7 = 14 , puis 1 + 4 = 5.
Sympa ce petit MPO, je n'ai pas besoin d'aller sur un quelconque Internet pour me souvenir du principe d'une preuve par neuf ! :)
Je suis donc allé pomper sur le MPO n°9 qui a un sujet assez semblable.
Mais l'idée ici est d'être récursif. Je sors donc mon HP-28S.

Code : Tout sélectionner

SRdC: « → n « IF n 10 < THEN n  ELSE n MPO9 SRdC » » 
L'idée est que la somme des chiffres des nombres ne comprenant qu'un seul chiffre est justement ce nombre/chiffre.
La récurrence est que l'on utilise la méthode du MPO n°9 jusqu'à obtenir un nombre suffisamment petit

Per exemple, on peut prendre pour méthode du MPO n°9 le code que nous avait proposé Gilles59 le 22 octobre 2011 à 13:30 ou le code suivant que j'ai composé, à l'instant, en m'inspirant de celui que Gilles.59 proposait pour CASIO fx-602p :

Code : Tout sélectionner

MPO9: « CL∑ WHILE DUP REPEAT 10 MOD LAST ROT ∑+ / IP END DROP TOT »


On a alors 1337 SRdC qui renvoie bien 5 (et qui laisse une matrice '∑DAT' contenant [[ 4 ][ 1 ]] )

On peut aussi combiner les deux codes pour obtenir quelque chose de plus court, mais c'est alors une méthode itérative.

Code : Tout sélectionner

« DO CL∑ WHILE DUP REPEAT 10 MOD LAST ROT ∑+ / IP END DROP TOT UNTIL DUP 10 < END »
Evidemment, on peut aussi faire encore « bien BienBienBien » plus court avec une méthode algébrique. C'est prouvé ! Le seul problème est lorsque l'on obtient un résultat nul qu'il faut interpréter comme étant bien neuf. Mais c'est hors sujet :)
Modifié en dernier par C.Ret le 15 sept. 2020 19: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.
cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2143
Enregistré le : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: Misez p'tit Optimisez n°93 : somme récursive des chiffres d'un entier

Message par cgh »

Nouvelle version optimisee... Je ne me souvenais plus que MOD etait disponible...

Code : Tout sélectionner

   01 LBL "SN"
   02 LBL 01
   03 0
   04 X<>Y
   05 LBL 02
   06 STO Z
   07 10
   08 MOD
   09 ST+ Y
   10 ST- Z
   11 RDN
   12 X<>Y
   13 LASTX
   14 /
   15 X#0?
   16 GTO 02
   17 9
   18 RCL Z
   19 X>Y?
   20 GTO 01
   21 END
En ligne 15 X#0? est X different 0?
Modifié en dernier par cgh le 13 juin 2020 00:11, modifié 1 fois.
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
Avatar du membre
Danny
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1248
Enregistré le : 28 déc. 2013 16:34

Re: Misez p'tit Optimisez n°93 : somme récursive des chiffres d'un entier

Message par Danny »

Ah oui, je me disais aussi qu’il doit bien y avoir un MOD sur une HP-41 :P

Bon pour l’instant personne ne triche, ça fait plaisir 8)
? Apple, Atari, Canon, Casio, ????????????, HP, Psion, Sharp, Tandy... même TI.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3421
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°93 : somme récursive des chiffres d'un entier

Message par C.Ret »

cgh a écrit : 12 juin 2020 18:54 Une version sans registre (juste la pile) pour HP41. Meme mode operatoire que le programme precedent:
C'est une bonne idée de n'utiliser que la pile. Ensuite, l'HP-41C connait l'instruction MOD (*), on peut donc comme sur l'HP-28S simplifier le code.
La notion de récurrence pose cependant problème. Les HP-41 ne supportent que 6 niveaux d'appel de sous-procédures.

Voici donc une version itérative :

Code : Tout sélectionner

01  LBL "SIdC"  0
03  LBL 01  ALOG  ALOG  x>y?  GTO 03  CLX
09  LBL 02  RCL Y  INT  x=0?  GTO 01  10  ST/ T  MOD  +  GTO 02
19  LBL 03  RDN  END
Utilisation 1337 [XEQ][alpha]SRdC[alpha] affiche 5,0000

On peut simplifier un peu en réorganisant la séquence. Ce qui en fait presque une méthode par récurrence, en fait récurrence de queue car l'appel se fait par la dernière instruction. J'ai donc remplacé XEQ "SRdC" RTN par un simple GTO "SRdC"

Code : Tout sélectionner

01  LBL "SRdC
02    0  X<>Y
04    LBL 01  STO Z  10  ST/ T  MOD  ST+ Y  X<> L  X<> Z  INT  x>0?  GTO 01
15    RDN  x>y?  GTO "SRdC
18  END
Dont la TRACE avec pour exemple 1337 donne bien le principe de fonctionnement et met en évidence l'appel récursif de "SRdC" en bas de la seconde page:
MPO93 HP41C Trace 1337.gif
MPO93 HP41C Trace 1337.gif (102.44 Kio) Vu 11281 fois

(*) Le temps que je rédige et mon post a croisé les votres :)
Modifié en dernier par C.Ret le 13 juin 2020 15:26, modifié 4 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.
Avatar du membre
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 8409
Enregistré le : 12 févr. 2007 18:36
Localisation : Pas très loin de Lyon
Contact :

Re: Misez p'tit Optimisez n°93 : somme récursive des chiffres d'un entier

Message par badaze »

Ca doit être faisable sur TI 57 LED en 33 pas. J’ai écrit le programme mais j’ai la flemme de le taper ! :|
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.
Avatar du membre
Danny
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1248
Enregistré le : 28 déc. 2013 16:34

Re: Misez p'tit Optimisez n°93 : somme récursive des chiffres d'un entier

Message par Danny »

C.Ret a écrit : 12 juin 2020 22:09 Dont la TRACE avec pour exemple 1337 donne bien le principe de fonctionnement et met en évidence l'appel récursif de "SRdC" en bas de la seconde page:
MPO93 HP41C Trace 1337.gif
Pas mal ta trace, c’est fait avec quoi ? :)
? Apple, Atari, Canon, Casio, ????????????, HP, Psion, Sharp, Tandy... même TI.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3421
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°93 : somme récursive des chiffres d'un entier

Message par C.Ret »

Avec mon imprimante. je mets mon HP-41C en mode TRACE et s'imprime sur le papier thermique chaque opération que je saisie ou chaque instruction d'un programme.
MPO93 HP82240A Trace of 1337 SRdC (part of).jpg
MPO93 HP82240A Trace of 1337 SRdC (part of).jpg (62.74 Kio) Vu 11269 fois
L'exécution avec 1337 produit alors un enregistrement papier qui fait bien 37 cm de long. Mais ça permet d'avoir sous les yeux tout le déroulement du code. C'est pratique pour les dé-buggages et mises au point.

Par contre, scanner les 37 cm de ruban c'est un peu fastidieux, j'ai donc recopier dans un bon traitement de texte (Excel en fait :D ) et y ajoutant les valeurs des registres T: Z: et Y: ainsi que le listing du programme. Sur le papier ne s'imprime que le contenu du registre X ou ALPHA, mes saisies et les instructions de la colonne Cmd:
Les fontes permettent d'avoir un bon rendu des différents éléments et indique où les trouver (fonte ROMAN pource qui est imprimé et fontes 14-segments pour ce qui s'affiche sur l'HP-41C. Le reste c'est du HP Simplified Light pour pas se prendre trop la tête.
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.
Avatar du membre
Danny
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1248
Enregistré le : 28 déc. 2013 16:34

Re: Misez p'tit Optimisez n°93 : somme récursive des chiffres d'un entier

Message par Danny »

Wow, je pensais que ça venait d’un émulateur :o
? Apple, Atari, Canon, Casio, ????????????, HP, Psion, Sharp, Tandy... même TI.
Avatar du membre
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 8409
Enregistré le : 12 févr. 2007 18:36
Localisation : Pas très loin de Lyon
Contact :

Re: Misez p'tit Optimisez n°93 : somme récursive des chiffres d'un entier

Message par badaze »

Pour la TI 57. A peine testé. Plante si j'ai des nombres de plus de 6 chiffres. Admirez la TI 57. Peu sont aussi pimpantes au bout de 40 ans !

Image

EDIT : Oopps. J’ai oublié RCL 0 après le second xy.
Modifié en dernier par badaze le 14 juin 2020 17:56, modifié 1 fois.
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.
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6189
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez p'tit Optimisez n°93 : somme récursive des chiffres d'un entier

Message par Marge »

:o

:D

:wink:
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
Avatar du membre
Ythunder
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4562
Enregistré le : 09 août 2008 17:46
Localisation : 03

Re: Misez p'tit Optimisez n°93 : somme récursive des chiffres d'un entier

Message par Ythunder »

C'est quel langage ce code ?
Quand je lis ça "oui des passionnées qui modifie des machines pour en faire des moutons a 5 pattes qui n'ont plus rien a voir avec la machine d'origine afin de faire la video choc sur youtube..."

Ca me fait rire. Perso, je n'ai ni chaine youtube sur les machines et je n'ai aucun mouton à 5 pattes qui n'a pàlus rien a voir avec des machines d'origine. Mais à qui s'adressait on ?
Répondre

Retourner vers « Tous les Pockets »