Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?

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
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3356
Inscription : 06 sept. 2011 14:57
Localisation : Normandie

Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?

Message par Hobiecat » 27 sept. 2020 21:27

cgh a écrit :
27 sept. 2020 21:13
Excellent ! Toute la puissance des machines specialisees :geek:
Il n'y a pas cette fonction sur les 48/49/50 ?
Oui, la 16C est imparable pour ce genre d'exercice ! :wink: La fonction n'existe pas sur 48, mais je ne suis pas sûr sur les 49 et 50.

Avatar de l’utilisateur
bernouilli92
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4580
Inscription : 21 nov. 2012 14:03
Localisation : Ile de France

Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?

Message par bernouilli92 » 27 sept. 2020 21:29

Des simulateurs de voyager sont dispo ici :
https://stendec.io/ctb/
HP, Casio, Sharp, Psion, quelques TI et divers autres

cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2235
Inscription : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?

Message par cgh » 27 sept. 2020 21:30

Hobiecat a écrit :
27 sept. 2020 21:27
cgh a écrit :
27 sept. 2020 21:13
Excellent ! Toute la puissance des machines specialisees :geek:
Il n'y a pas cette fonction sur les 48/49/50 ?
Oui, la 16C est imparable pour ce genre d'exercice ! :wink: La fonction n'existe pas sur 48, mais je ne suis pas sûr sur les 49 et 50.
J'avais regarde a tout hasard si le TIprogrammeur LED avait cette fonction, mais non.
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 de l’utilisateur
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3356
Inscription : 06 sept. 2011 14:57
Localisation : Normandie

Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?

Message par Hobiecat » 27 sept. 2020 21:41

bernouilli92 a écrit :
27 sept. 2020 21:29
Des simulateurs de voyager sont dispo ici :
https://stendec.io/ctb/
Et sur l'excellent Pockemul aussi. :wink:

cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2235
Inscription : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?

Message par cgh » 27 sept. 2020 21:56

J'ai une autre version en 22 octets (sans le label) sur HP41C sans aucun registre, qui n'utilise que le pile. Qui dit mieux ?
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 de l’utilisateur
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2411
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?

Message par C.Ret » 28 sept. 2020 11:36

Gilles59 a écrit :
27 sept. 2020 19:06
Quel dommage qu'il n'y ait pas de x<>0 , x<0 etc. On s'en sort toujours parfois en jonglant comme ici le double test x=0 x>=F pour éviter les doubles GOTO... A part ce défaut je trouve que c'est une série de calculatrices (surtout les 602-603) hyper agréable à utiliser!
Je suis 100% d'accord avec toi, ce son des machines très agréable à utiliser et le manque de tests n'est qu'un défaut mineur et non blocquant car il y a toujours moyen de passer outre avec un jeu plus ou moins enchevêtré de GOTO et LBL.
Je n'ai découvert ces machines que sur le tard, elles sont très pratiques et l'alpha numérique de la fx-602p est très bien intégré et ne fait qu'apporté un plus pour afficher unité, labels en clair etc. Contrairement à l'HP-41C, l'alpha n'alourdi pas l'utilisation très efficace de cette gamme.
dprtl a écrit :
27 sept. 2020 20:00
Attention, la somme des bits d'un nombre codé en BCD, ça ne donne pas le même résultat ! Pour 182130867283365, je trouve 24 avec le programme ci-dessous en Basic 1000D :

Ah! Oui zut, je suis allé trop vite et j'ai pas pas vu le problème. Autant cela marche avec les bases multiples, hexadécimal, octal , etc du bianire, autant ça ne va pas avec la base décimale.

Bon, j'édite mon précèdent emessage pour indiquer mon erreur.
dprtl a écrit :
27 sept. 2020 20:00

Code : Tout sélectionner

input n
s$=bin$(n)
t$=change$(s$,"0","","11","1+1","11","1+1")
print val(t$)
Faut que j'analyse cela plus en détail, il doit y avoir de quoi faire de même sur d'autres systèmes qui ont de quoi modifier le contenu des chaines.
Bon, effacer les zéros par "0"→"" ça c'est OK
Mais pourquoi il n'y a que deux fois la substitution des doublons "11" → "1+1", je m'attendais à ce qu'il faille en programmer plus ??
Faut que j'y repense au calme…
cgh a écrit :
27 sept. 2020 20:14

Code : Tout sélectionner

001*LBL "MPO96"
002   ∑REG 11
003   CL∑                                                    
004*  LBL 00                                                
005     RCL X  2  ST/ Z  MOD  ∑+  X<>Y  INT  X>0?  GTO 00   
013   RCL 12                                                   
014*END                                                     
Modifications acceptées, c'est comme à l'usine, mieux vaut ajouter quelques équipements pour la sécurité et éviter qu'un des gars soit broyer, écraser ou couper en deux ...
En plus, je n'ai pas vérifié, mais je crois que je me sui trompé de registre , le RCL 12 doit correspondre à ∑x² alors que je voulais renvoyer ∑x
C'est pas grave, 1² fait toujours 1, c'est pas comme si mon opérateur avait eut deux doigts arrachés par la machine ...
cgh a écrit :
27 sept. 2020 21:04

Code : Tout sélectionner

10 "A"AREAD A:C=0
20 IF A LET A=A/2:C=C+(A<>INT A):A=INT A:GOTO 20
30 PRINT C
Ah! Oui, c'est presque ce que j'ai sur mon SHARP PC-1211:

Code : Tout sélectionner

1:" "AREAD N:B=0
2:IF NLET N=INT N/2,B=B+(N>INT N:GOTO 2
3:PRINT B
Je laisse la partie fractionnaire dans N avant le test, il y a donc un tours de boucle supplémentaire (et inutile car B n'est pas incrémenté), mais cela fait gagner quelques octets. De toute façon, étant donné la lenteur historique de cet engin, je ne suis pas à un tours de roue près...
Hobiecat a écrit :
27 sept. 2020 21:07

Code : Tout sélectionner

LBL 0
#B
RTN
Bon ben voilà cet MPO est terminé, c'est réglé, coupé et emballé...
Je savais bien qu'il y avait un moyen de faire simple, rapide et précis...
Toutes les autres machines ne sont que des traitements de textes, seule l' HP-16C fait de l'arithmétique binaire en vraie !

Mais, encore faut-il avoir placé son HP-16C en mode DEC, il manque donc une instruction à ce programme.
MPO96 - HP-16C no program solution.gif
MPO96 - HP-16C no program solution.gif (82.3 Kio) Consulté 1994 fois
En plus, il est facile de vérifier que 182130867283365 contient 24 bits à un. Les flèches bleues et la fonction WINDOW permet de vérifier que l'on a bien saisi correctement tous les chiffres de l'entier.

cgh a écrit :
27 sept. 2020 21:56
J'ai une autre version en 22 octets (sans le label) sur HP41C sans aucun registre, qui n'utilise que le pile. Qui dit mieux ?

Code : Tout sélectionner

002   0  X<>Y                            ::       :       0       N       1 1 
004*  LBL 00                             ::       :      ∑b      nn       1
005     2  /  ENTER↑ FRC                  :      ∑b    nn/2      .n       1 1 1 1 
009     ST+ Z  ST+ Z -                    :       :    ∑b+b      nn       2 2 1  
012     x>0?  GTO 00                      :       :    ∑b+b      nn       1 2 
014   RDN                                 0       :       :     ∑b"       1 
                                                                         16 octets

Code : Tout sélectionner

002   0  X<>Y                            ::       :       0       N       1 1 
004*  LBL 00                             ::       :      ∑b      nn       1
005     STO Z  2  ST/ T                nn/2      ∑b      nn       2       2 1 2 
008     MOD  +  R↑                     nn/2     nn/2   ∑b+b    nn/2       1 1 1  
011     INT  x>0?  GTO 00                 :       :    ∑b+b       n       1 1 2 
014   RDN                                 0       :       :     ∑b"       1 
                                                                         16 octets
Moins de 22 octets , c'est facile, mes décomptes sont peut-être faux, merci de me le signaler .
Dernière édition par C.Ret le 28 sept. 2020 13:12, édité 2 fois.
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..

pcscote
Fonctionne à 75 bauds
Fonctionne à 75 bauds
Messages : 71
Inscription : 11 juil. 2018 01:06

Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?

Message par pcscote » 28 sept. 2020 12:30

C.Ret a écrit :
28 sept. 2020 11:36
Moins de 22 octets , c'est facile, mes décomptes sont peut-être faux, merci de me le signaler .
Félicitations!
Le compte de 16 octets est bon.
Normalement il faudrait ajouter un label global (min. 5 octets) et le end (3 octets).

cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2235
Inscription : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?

Message par cgh » 28 sept. 2020 13:04

C.Ret a écrit :
28 sept. 2020 11:36
cgh a écrit :
27 sept. 2020 21:56
J'ai une autre version en 22 octets (sans le label) sur HP41C sans aucun registre, qui n'utilise que le pile. Qui dit mieux ?

Code : Tout sélectionner

002   0  X<>Y                            ::       :       0       N       1 1 
004*  LBL 00                             ::       :      ∑b      nn       1
005     2  /  ENTER↑ FRC                  :      ∑b    nn/2      .n       1 1 1 1 
009     ST+ Z  ST+ Z -                    :       :    ∑b+b      nn       2 2 1  
012     x>0?  GTO 00                      :       :    ∑b+b      nn       1 2 
014   RDN                                 0       :       :     ∑b"       1 
                                                                         16 octets

Code : Tout sélectionner

002   0  X<>Y                            ::       :       0       N       1 1 
004*  LBL 00                             ::       :      ∑b      nn       1
005     STO Z  2  ST/ T                nn/2      ∑b      nn       2       2 1 2 
008     MOD  +  R↑                     nn/2     nn/2   ∑b+b    nn/2       1 1 1  
011     INT  x>0?  GTO 00                 :       :    ∑b+b       n       1 1 2 
014   RDN                                 0       :       :     ∑b"       1 
                                                                         16 octets
Moins de 22 octets , c'est facile, mes décomptes sont peut-être faux, merci de me le signaler .
Ah oui. Excellent. Jolie la boucle avec le X>0?. Je ne me souvenais plus de l'existence de ce test :oops:
En fait, toute l'optimisation est la :geek: (et j'aurais du percute car les differrents codes de C.Ret embarquaient deja cette solution).
@C.Ret : Tu vas faire des merveilles avec ton HP71B ;)
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 de l’utilisateur
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2411
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?

Message par C.Ret » 17 oct. 2020 16:29

Je suis surpris, personne n'a envisager d'utiliser une méthode par récurrence :

D'après l'idée originale, qui nécessite de laisser actif le mode de récupération par LAST:

Code : Tout sélectionner

« 2 MOD LAST / IP DUP « MPO96 » IFT + » 'MPO96' STO
Utilisation 1968 MPO96 renvoi 6.

Sur l'idée de Gilles59 en utilisant la division comme Bernouilli92 par deux et FP :

Code : Tout sélectionner

« 2 / FP LAST IP DUP « MPO96 » IFT DUP + + » 'MPO96' STO
Utilisation 1968 MPO96 renvoi 6.


Et sur l'idée de Gege32, son pendant utilisant les entiers de type binaire :

Code : Tout sélectionner

« DUP #1b AND SWAP SR B→R DUP « R→B  bMPO96 » IFT + »  'bMPO96' STO
Utilisation en mode DEC : #1968d bMPO96 renvoi # 6d.
Utilisation # 2305843009213693953d bMPO96 renvoi # 4d.
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..

Avatar de l’utilisateur
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2411
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?

Message par C.Ret » 23 oct. 2020 23:07

dprtl a écrit :
27 sept. 2020 14:51
Ce programme fonctionne sur PB-1000 pour des valeurs de N jusqu'à 2^32-1 (avec 8 itérations) :

Code : Tout sélectionner

10 INPUT N:N1=INT(N/65536):N2=N-65536*N1:N=0
20 N$=HEX$(N1):GOSUB 50
30 N$=HEX$(N2):GOSUB 50
40 PRINT N:GOTO 10
50 FOR I=1 TO 4:C$=MID$(N$,I,1)
60 IF C$="0" THEN 110
70 IF C$="F" THEN N=N+4:GOTO 110
80 IF C$="1" OR C$="2" OR C$="4" OR C$="8" THEN N=N+1:GOTO 110
90 IF C$="7" OR C$="B" OR C$="D" OR C$="E" THEN N=N+3:GOTO 110
100 N=N+2
110 NEXT: RETURN
Bonne idée, qui m'a bien inspirée ET que j'ai un peu "comprimée" ce qui donne un bout de code plus court:
MPO96 - C128D BASIC 7.0 solution.gif
MPO96 - C128D BASIC 7.0 solution.gif (36.72 Kio) Consulté 1596 fois
Mais, je me suis dit, c'est bien pour les BASIC qui ont des instruction HEX$() , DEC(), etc.

Mais pour du BASIC plus primitif ?? Alors j'ai redonné un petit coup de "compresseur" :
MPO96 - C128D BASIC 2.0 solution.gif
MPO96 - C128D BASIC 2.0 solution.gif (36.92 Kio) Consulté 1596 fois
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..

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

Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?

Message par Gilles59 » 27 oct. 2020 00:12

bernouilli92 a écrit :
27 sept. 2020 12:02
@Gilles59 pourquoi pas un while au lieu d’un do? Cela permet d’éviter le not.
Il me semble que ça ne marche pas dans ce sens là...
J'avoue que je jongle de moins en moins avec la pile car en NewRPL ca ralentit (un peu) versus des variables :O...
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+

Répondre

Revenir vers « Tous les Pockets »