Oui, la 16C est imparable pour ce genre d'exercice ! La fonction n'existe pas sur 48, mais je ne suis pas sûr sur les 49 et 50.
Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Modérateur : Politburo
- bernouilli92
- Fonctionne à 14400 bauds
- Messages : 5270
- Enregistré le : 21 nov. 2012 13:03
- Localisation : Ile de France
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Des simulateurs de voyager sont dispo ici :
https://stendec.io/ctb/
https://stendec.io/ctb/
HP, Casio, Sharp, Psion, quelques TI et divers autres
-
- Fonctionne à 2400 bauds
- Messages : 2143
- Enregistré le : 30 août 2011 12:23
- Localisation : Vous êtes ici -> .
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
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
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
- Hobiecat
- Fonctionne à 9600 bauds
- Messages : 3644
- Enregistré le : 06 sept. 2011 14:57
- Localisation : Normandie
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Et sur l'excellent Pockemul aussi.bernouilli92 a écrit : ↑27 sept. 2020 21:29 Des simulateurs de voyager sont dispo ici :
https://stendec.io/ctb/
-
- Fonctionne à 2400 bauds
- Messages : 2143
- Enregistré le : 30 août 2011 12:23
- Localisation : Vous êtes ici -> .
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
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
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
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3422
- Enregistré le : 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 ?
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.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 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.
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.dprtl a écrit : ↑27 sept. 2020 20:00Code : Tout sélectionner
input n s$=bin$(n) t$=change$(s$,"0","","11","1+1","11","1+1") print val(t$)
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…
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 ...cgh a écrit : ↑27 sept. 2020 20:14Code : 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
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 ...
Ah! Oui, c'est presque ce que j'ai sur mon SHARP PC-1211:cgh a écrit : ↑27 sept. 2020 21:04Code : 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
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
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. 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.
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
Modifié en dernier par C.Ret le 28 sept. 2020 13:12, modifié 2 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.
- pcscote
- Fonctionne à 300 bauds
- Messages : 164
- Enregistré le : 11 juil. 2018 01:06
- Localisation : Québec/Canada
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Félicitations!
Le compte de 16 octets est bon.
Normalement il faudrait ajouter un label global (min. 5 octets) et le end (3 octets).
Sylvain
Calculatrices et Pockets HP > J'ai tous les modèles, manuels, accessoires et périphériques, mes préférés: 41, 71 & 75.
Techno : 41 > 41CL, MLDL2K, Clonix-d, NoV-64d, MAXX | 71 > FRAM71, MultiMod | IL > PIL-Box, PIL-IO, GPIO | ...
Calculatrices et Pockets HP > J'ai tous les modèles, manuels, accessoires et périphériques, mes préférés: 41, 71 & 75.
Techno : 41 > 41CL, MLDL2K, Clonix-d, NoV-64d, MAXX | 71 > FRAM71, MultiMod | IL > PIL-Box, PIL-IO, GPIO | ...
-
- Fonctionne à 2400 bauds
- Messages : 2143
- Enregistré le : 30 août 2011 12:23
- Localisation : Vous êtes ici -> .
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Ah oui. Excellent. Jolie la boucle avec le X>0?. Je ne me souvenais plus de l'existence de ce testC.Ret a écrit : ↑28 sept. 2020 11:36Code : 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
Moins de 22 octets , c'est facile, mes décomptes sont peut-être faux, merci de me le signaler .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
En fait, toute l'optimisation est la (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
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
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3422
- Enregistré le : 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 ?
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:
Utilisation 1968 MPO96 renvoi 6.
Sur l'idée de Gilles59 en utilisant la division comme Bernouilli92 par deux et FP :
Utilisation 1968 MPO96 renvoi 6.
Et sur l'idée de Gege32, son pendant utilisant les entiers de type binaire :
Utilisation en mode DEC : #1968d bMPO96 renvoi # 6d.
Utilisation # 2305843009213693953d bMPO96 renvoi # 4d.
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
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
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 # 2305843009213693953d bMPO96 renvoi # 4d.
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.
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3422
- Enregistré le : 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 ?
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: Mais, je me suis dit, c'est bien pour les BASIC qui ont des instruction HEX$() , DEC(), etc.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
Mais pour du BASIC plus primitif ?? Alors j'ai redonné un petit coup de "compresseur" :
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.
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Il me semble que ça ne marche pas dans ce sens là...bernouilli92 a écrit : ↑27 sept. 2020 12:02 @Gilles59 pourquoi pas un while au lieu d’un do? Cela permet d’éviter le not.
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+ CM14 et MM12 / Alice 32
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Je continue à reprendre tranquillement d'anciens MPO, c'est vraiment intéressant de lire tous ces fils de discussion (enfin là je ne vous apprends rien).
Par rapport à ce MPO, on voit que le calculateur HP-16C avec son #B semble imbattable mais est limité au nombre entré en paramètre. Je propose ici l'inverse, à savoir pouvoir entrer des nombres jusqu'à 300 chiffres et en sortie obtenir le nombre de 1 en écriture binaire.
Un nombre de 300 chiffres s'écrit sur un peu moins de 1000 bits soit la taille maximale d'une liste sur les Ti-83 Plus, Ti-84 Plus ou les Premium CE.
Voici l'idée du programme :
Exemple avec 31415926535897932384626433832795 qui visiblement à 52 bits à 1...
Par rapport à ce MPO, on voit que le calculateur HP-16C avec son #B semble imbattable mais est limité au nombre entré en paramètre. Je propose ici l'inverse, à savoir pouvoir entrer des nombres jusqu'à 300 chiffres et en sortie obtenir le nombre de 1 en écriture binaire.
Un nombre de 300 chiffres s'écrit sur un peu moins de 1000 bits soit la taille maximale d'une liste sur les Ti-83 Plus, Ti-84 Plus ou les Premium CE.
Voici l'idée du programme :
Code : Tout sélectionner
{0}→L₁ Initialisation de la liste qui contiendra les bits 0 ou 1
Repeat 0
Input N On entre les chiffres un par un en partant de la gauche
If N=-1:Stop
augmenter({0,0},L₁→L₂ Ajouter 2 zéros revient à multiplier par 4 en binaire
augmenter(L₁,{0,0}→L₁ On s'arrange pour que l'autre liste ait la même dimension
L₁+L₂→L₁ Ajouter ces 2 listes revient à multiplier par 1 + 4 = 5
augmenter({0},L₁→L₁ On multiplie la liste par 2 soit par 2 * 5 = 10 au total
For(K,1,dim(L₁ On parcourt la liste
reste(N,2)+L₁(K→A Calcul de la nouvelle valeur de L₁(K) qui peut être 0,1 ou 2
reste(A,2→L₁(K Valeur finale sans retenue
If A>1 S'il y a une retenue :
Then
If K=dim(L₁ Est-on à l'extrémité de la liste ?
Then
augmenter(L₁,{1}→L₁ Ajouter un 1
Else
1+L₁(K+1→L₁(K+1 Ajouter 1 à L₁(K+1)
End
End
ent(N/2→N Actualisation de N (divisions successives par 2 pour la décomposition en binaire)
End
Disp som(L₁ Nombre de bits à 1
End
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Version pour les calculatrices compatibles Python.
Code : Tout sélectionner
n = int(input())
print('Bits 1 =', bin(n).count("1"))
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3422
- Enregistré le : 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 ?
Ah!Ah! Je débute en Python, j'ai réussi à faire tourner ton programme sur mon HP Prime !!
Je confirme, il y a bien 52 bits à un dans ce nombre ! La ligne qui indique qu'il n'y en a que 40 provient du fait que j'avais laissé mon HP Prime en mode 32 bits. En mode 64 bits, je trouve le bon résultat
Comme c'est sur une HP, j'ai remplacé ton label " Bits 1 = " par "#B =" comme sur une HP-16C (Je vais pas réinventer des fonction qui existe déjà !!
Je confirme, il y a bien 52 bits à un dans ce nombre ! La ligne qui indique qu'il n'y en a que 40 provient du fait que j'avais laissé mon HP Prime en mode 32 bits. En mode 64 bits, je trouve le bon résultat
Comme c'est sur une HP, j'ai remplacé ton label " Bits 1 = " par "#B =" comme sur une HP-16C (Je vais pas réinventer des fonction qui existe déjà !!
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.
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
C.Ret, comme j'ai eu plusieurs fois la remarque par rapport à mes vidéos consacrées à Python, je te donne l'autre façon de formater une sortie :
Code : Tout sélectionner
n = int(input())
print('#B({0})={1}'.format(n, bin(n).count("1")))