MPO 102 : nombres ondulants carrés
Modérateur : Politburo
- pir2
- Fonctionne à 9600 bauds
- Messages : 4647
- Enregistré le : 31 oct. 2006 15:08
- Localisation : 67310 Westhoffen
- Contact :
Re: MPO 102 : nombres ondulants carrés
J'avais commencé à jouer sur ma DM41X, mais vous avez été bien plus rapide et efficaces que moi, je n'ai d'ailleurs pas fini puisque la solution est maintenant sous mes yeux (pour une fois que je participe).
Merci gege pour le sujet, et aux autres pour les solutions
Merci gege pour le sujet, et aux autres pour les solutions
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3422
- Enregistré le : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: MPO 102 : nombres ondulants carrés
Je suis justement en train d'essayer quelque chose sur mon HP-41C.
Dommage que tu ne publie rien, j'aurais bien volontiers comparés nos jeux d'instructions
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.
- gege
- Fonctionne à 14400 bauds
- Messages : 7148
- Enregistré le : 31 janv. 2008 14:24
- Localisation : Banlieue Paârisienne
- Contact :
Re: MPO 102 : nombres ondulants carrés
Bonjour,
Il y a encore de la place pour d'autres machines !
Tiens sur la Lexibook GC2000 :
Avec ¶ étant le petit triangle d'affichage de résultat et =/= le symbole "différent".
On remarque que ce code pourrait être compacté en mettant tout dans une seule boucle, mais on n'a droit qu'à 111 octets par programme...
Et en plus la machine est buggée :
Lbl1:Prog 1:Goto 1
plante sur le Goto, apparemment l'appel de sous-programmes détruit les labels situés avant lui...
Sinon ça va très vite, genre 10 secondes (j'ai eu la flemme de retirer les Disp pour chronométrer, il faut taper EXE à chaque affichage).
G.E.
Il y a encore de la place pour d'autres machines !
Tiens sur la Lexibook GC2000 :
Code : Tout sélectionner
P0 :
Prog 3:Prog 4:Prog 5
P3 :
9->I:Lbl 1:I+1->I:10*I+Int(I/10)->J:0=/=Frac Rac I=>Goto 2:J¶Lbl 2:99>I=>Goto 1
P4 :
9->I:Lbl 1:I+1->I:101*I->J:0=/=Frac Rac I=>Goto 2:J¶Lbl 2:99>I=>Goto 1
P5 :
9->I:Lbl 1:I+1->I:1010*I+Int(I/10)->J:0=/=Frac Rac I=>Goto 2:J¶Lbl 2:99>I=>Goto 1
On remarque que ce code pourrait être compacté en mettant tout dans une seule boucle, mais on n'a droit qu'à 111 octets par programme...
Et en plus la machine est buggée :
Lbl1:Prog 1:Goto 1
plante sur le Goto, apparemment l'appel de sous-programmes détruit les labels situés avant lui...
Sinon ça va très vite, genre 10 secondes (j'ai eu la flemme de retirer les Disp pour chronométrer, il faut taper EXE à chaque affichage).
G.E.
Re: MPO 102 : nombres ondulants carrés
Version Python pour les calculatrices actuelles :
L'idée est de partir des carrés et de vérifier s'ils sont ondulants (comme C.Ret), mon "astuce" est de me ramener systématiquement à un nombre de 6 chiffres car alors il doit être égal aux 2 derniers chiffres * 10101. Pour ça on ajoute l'avant dernier chiffre à la fin : 323 -> 3232 -> 32323 etc.
Spoiler : https://my.numworks.com/python/schraf/nbmysteres
Code : Tout sélectionner
for n in range(10,316):
c = str(n * n)
while len(c) < 6 : c += c[-2]
if int(c) == int(c[-2:]) * 10101: print(n * n)
Spoiler : https://my.numworks.com/python/schraf/nbmysteres
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3422
- Enregistré le : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: MPO 102 : nombres ondulants carrés
@gege
Interressant comme algorithme, surtout la manipulation que tu fais pour fabriquer la valeur J. Du coup, tu viens de me donner la clef pour mettre dans l'ordre les listes que créent mes codes !
Dommage que l'on ne puisse pas réduire le code sur cette Lexibook GC200 boguée, car sinon, mon nouvel algorithme donnerai le code suivant:
Je n'ai pas de Lexibook, merci de corriger et de me signaler les éventuelles erreurs de syntaxe ou de retranscription de ce code improvisé.
Je n'ai toujours pas réparer mon imprimante SHARP CE-122 (j'attends des condos et un pont de diode), mais voici ce que ce nouvel algorithme donne sur un SHARP PC-1211. L'affichage est compatible avec les 16 caractères de l'imprimante (d'où le USING ):
C'est exactement l'algorithme du code ci-dessus pour la Lexibook.
L'astuce est d'utiliser un facteur fractionnaire contenant le motif 10101 afin de générer facilement (grâce au compteur FOR ab =12 TO 98 ) les nombres ondulants ababab. Leur mise à la bonne échelle se fait à l'aide d'une fonction INT en lieu et place de l'instruction MOD absente ici.
Ce facteur F évite les manipulations de variable I et J du code de gege.
Quand ma CE-122 daignera bien à nouveau s'alimenter convenablement et fonctionner, elle affichera la liste dans le bon ordre (contrairement aux code précédemment publiés dans mes précédents messages !
@Schraf
Oui, la transformation utilisée pour détecter les nombres ondulants en ajoutant les deux derniers afin d'avoir un séquence complète plus facile à tester est effectivement l'idée initiale de mon dernier code pour HP-71B. Mais, on composant le code, je me suis rendu compte qu'il était plus facile et plus direct de vérifier que le nombre à tester R$ est bien inscrit dans la séquence complète S$&S$&S$.
D'où l'utilisation du test POS(S$&S$&S$,R$)=1.
Je ne sais toujours pas ce qui est le plus efficace:
Interressant comme algorithme, surtout la manipulation que tu fais pour fabriquer la valeur J. Du coup, tu viens de me donner la clef pour mettre dans l'ordre les listes que créent mes codes !
Dommage que l'on ne puisse pas réduire le code sur cette Lexibook GC200 boguée, car sinon, mon nouvel algorithme donnerai le code suivant:
Code : Tout sélectionner
P0:
1.0101→F: Prog 1: Prog 1: Prog 1: Prog 1
P1:
11→A: Lbl 1: 1+A→A: Int(F*A)→N: 0=Frac √ N ⇒ N◢: 98>A ⇒ Goto 1: 10*F→F
Je n'ai toujours pas réparer mon imprimante SHARP CE-122 (j'attends des condos et un pont de diode), mais voici ce que ce nouvel algorithme donne sur un SHARP PC-1211. L'affichage est compatible avec les 16 caractères de l'imprimante (d'où le USING ):
Code : Tout sélectionner
1:USING "######":F=1.0101:GOSUB 2:GOSUB 2:GOSUB 2:GOSUB 2:END
2:FOR A=12TO 98:N=INT FA,R=√N:IF R=INT R PRINT N;"=";R;"^2"
3:NEXT A:F=10F:RETURN
L'astuce est d'utiliser un facteur fractionnaire contenant le motif 10101 afin de générer facilement (grâce au compteur FOR ab =12 TO 98 ) les nombres ondulants ababab. Leur mise à la bonne échelle se fait à l'aide d'une fonction INT en lieu et place de l'instruction MOD absente ici.
Ce facteur F évite les manipulations de variable I et J du code de gege.
Quand ma CE-122 daignera bien à nouveau s'alimenter convenablement et fonctionner, elle affichera la liste dans le bon ordre (contrairement aux code précédemment publiés dans mes précédents messages !
@Schraf
Oui, la transformation utilisée pour détecter les nombres ondulants en ajoutant les deux derniers afin d'avoir un séquence complète plus facile à tester est effectivement l'idée initiale de mon dernier code pour HP-71B. Mais, on composant le code, je me suis rendu compte qu'il était plus facile et plus direct de vérifier que le nombre à tester R$ est bien inscrit dans la séquence complète S$&S$&S$.
D'où l'utilisation du test POS(S$&S$&S$,R$)=1.
Je ne sais toujours pas ce qui est le plus efficace:
- vérifier si les 316 carrés sont des nombres ondulants
OU - trouver parmi les 400 nombres ondulants ceux qui sont un carré parfait
Code : Tout sélectionner
1:F=10.101:FOR I=1TO 3:FOR A=12TO 98:R=√INT FA:IF R=INT RPRINT RR,R
2:NEXT A:F=10F:NEXT I ( 59+32 octets dont 4 registres de 8bits)
Modifié en dernier par C.Ret le 26 juil. 2021 19:46, 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.
Re: MPO 102 : nombres ondulants carrés
@C.Ret, je n'avais regardé en détail toutes les versions proposées, effectivement rien d'original avec ma version Python.
Pour le fun, transcription en APL de ta dernière version :
A copier-coller ici : https://tryapl.org/
Ou encore en précision multiple Cliquez pour voir le résultat
Avec 20 35046 47156 13109 09942 93668 ^ 2 = 414 14141 41414 14141 41414 14141 64188 01318 49613 82248 94224 qui n'est donc pas ondulant.
Pour le fun, transcription en APL de ta dernière version :
Code : Tout sélectionner
n/⍨0=1|.5*⍨n←,⌊(1.0101×10*⍳4)∘.×10+⍳88
Ou encore en précision multiple Cliquez pour voir le résultat
Code : Tout sélectionner
⎕FR ← 1287 ⍝ Floating-point Representation: 128-bit decimal
MPO102 ← {n /⍨ 0 = 1|.5 *⍨ n ← ,⌊((100 ÷ 99) × 10 * ⍳⍵) ∘.× 10 + ⍳88}
Code : Tout sélectionner
MPO102 4
121 484 676 69696
MPO102 51
121 484 676 69696 4.141414141E52 7.878787879E52 7.97979798E52 8.787878788E52
9.090909091E52
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3422
- Enregistré le : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: MPO 102 : nombres ondulants carrés
Au contraire, ce qui est important c'est que ta version a le mérite d'exister et sa structure m'a donnée l'idée pour un code cas-PPL qui va me permettre de rechercher d'éventuels nombres ondulant carrés beaucoup plus grands. je ne suis pas sûr qu'ils existent d'ailleurs, pas pris le temps de chercher une résolution formelle.
L'idée de la chasse aux grands ondulants carrés vient d'ailleurs des résultats de tes essais en APL ! Je suis par ailleurs complètement rouillé en APL, je pratique pas assez régulièrement.
Ensuite, ce doit être l'âge ou la bière, mais même sur mes antiquités je commence à être gâteux, je fais des MOP maintenant. C'est pas grave et je ne suis pas encore assez mûr pour l'HEPAD, le seul truc qui me gêne c'est que j'avais enclanché le mode TRACE de mon HP-82240A et le module IR a bien fonctionné, on comprend vite ce qui c'est passé en parcourant le ruban de papier
(j'ai flouté la fin du papier pour ne pas spoiler les résultats !):
Modifié en dernier par C.Ret le 14 juil. 2021 15:08, 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.
Re: MPO 102 : nombres ondulants carrés
@C.Ret, c'est pareil, même si je me force à faire quelques exos en APL, j'oublie vite et je reste avec des techniques de base.
D'ailleurs, pour ne pas être trop hors sujet (car j'ai utilisé une écriture APL actuelle), je mets également ci-dessous un programme qui tournerait sur un IBM 5110 de 1978 (un petit pocket de 25 kg si vous préférez )
Je n'ai hélas pas cette machine en vrai, par contre j'ai trouvé cette bête là (Terminal Texas Instrument Silent 700 : https://fr.wikipedia.org/wiki/Silent_700)
D'ailleurs, pour ne pas être trop hors sujet (car j'ai utilisé une écriture APL actuelle), je mets également ci-dessous un programme qui tournerait sur un IBM 5110 de 1978 (un petit pocket de 25 kg si vous préférez )
Je n'ai hélas pas cette machine en vrai, par contre j'ai trouvé cette bête là (Terminal Texas Instrument Silent 700 : https://fr.wikipedia.org/wiki/Silent_700)
Re: MPO 102 : nombres ondulants carrés
Hello... Bon faut que je me dérouille avec 602/603P.
Pour la question 1, réponse instantanée :
Pour la question 1, réponse instantanée :
Code : Tout sélectionner
9 Min00
LBL0
60606 + MR00 * 1010 = Min01
√ FRAC x=0 GOTO9
DSZ GOTO0
LBL9 MR01
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
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3422
- Enregistré le : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: MPO 102 : nombres ondulants carrés
Ah! Zut tiens ! Voilà un code bien astucieux.
C'est en analysant ce code de Gilles59 que je me suis rendu compte que je n'avais pas tenu compte d'une information primordiale donné par l'énoncé initial de gégé :
Je dois donc pouvoir faire bien plus court pour répondre à la première question !
Et pour gagner trois pas sur CASIO fx-602p, j'utilise le registre Alpha et je me dispense d'arrêter le programme lorsqu'il a trouvé la solution
Une fois la solution affichée, l'utilisateur a le temps de la noter et d'arrêter mon code en pressant la touche HLT ou AC avant que sa fx-602p n'affiche autre chose !
Oui, c'est pas très sérieux comme mode d'utilisation, mais c'est le seul moyen que j'ai trouvé pour faire plus courts (et moins rapide) que le code de Gilles59. Je fais ce comme je peux...
C'est en analysant ce code de Gilles59 que je me suis rendu compte que je n'avais pas tenu compte d'une information primordiale donné par l'énoncé initial de gégé :
Le plus grand nombre ondulant qui est aussi un carré connu comporte 5 chiffres et commence par 6.
Je dois donc pouvoir faire bien plus court pour répondre à la première question !
Code : Tout sélectionner
CAT MPO102 BASIC 53 07/26/21 21:09
10 N=60606 @ WHILE FP(SQRT(N)) @ N=N+1010 @ END WHILE @ DISP N;"=";SQRT(N);"^2"
Code : Tout sélectionner
P0 60606 MinF :006:
LBL0 1010 M+F MRF √ FRAC :015:
x=0 " arF " Goto0 :020:
Oui, c'est pas très sérieux comme mode d'utilisation, mais c'est le seul moyen que j'ai trouvé pour faire plus courts (et moins rapide) que le code de Gilles59. Je fais ce comme je peux...
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.