Bonjour, pas testé mais joli programme en tous cas ! Pour quelqu'un qui n'a pas de pocket, c'est pas malCéline a écrit :Je n'ai pas encore de pocket mais j'ai étudié le manuel du sharp pc-1500, et j'ai essayé de programmer la suite de Syracuse en Basic. Quelqu'un pourrait-il le vérifier et me dire si il tourne correctement ? Bien sûr, aucune optimisation, je n'en suis pas là. Mais je me rends bien compte que même s'il tourne, mon programme est vraiment lourdingue !Code : Tout sélectionner
10 : INPUT "ENTRER U(0) ";A 20 : C=1 : M=A 30 : IF A=1 THEN GOTO 100 40 : IF INT(A/2)-A/2=0 THEN GOTO 70 50 : A=3*A+1 : M=A 60 : GOTO 80 70 : A=A/2 80 : C=C+1 90 : GOTO 30 100 : PRINT "ALTITUDE : ";M;"VOL : ";C
Misez p'tit Optimisez n°53 : la suite de Syracuse
Modérateur : Politburo
Re: Misez p'tit Optimisez n°53 : la suite de Syracuse
Dominique
- Marge
- 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°53 : la suite de Syracuse
Testé, ça tourne sur 1500. Mais U(1310) renvoie 16 et 146, l'altitude max. devrait être 1310, non ?
Pareil pour 27 : 16, 112.
A revoir, je crois.
Pareil pour 27 : 16, 112.
A revoir, je crois.
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é. ♥ ♠
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é. ♥ ♠
Re: Misez p'tit Optimisez n°53 : la suite de Syracuse
Ah zut. Je savais que je serais embêtée par l'absence de fonction MAX. Je le fait tourner manuellement mais je ne vois pas ce qui cloche.
TI-30 Galaxy
fx-180P, fx-4000P
HP 11c, 12c, 12c le, 15c, 15c le
HP 32s, 32s ii, 42s, 17b ii, 30b, 35s
HP 28s, 48s, 48sx, 48g, 50g, prime
fx-180P, fx-4000P
HP 11c, 12c, 12c le, 15c, 15c le
HP 32s, 32s ii, 42s, 17b ii, 30b, 35s
HP 28s, 48s, 48sx, 48g, 50g, prime
- bernouilli92
- Fonctionne à 14400 bauds
- Messages : 5269
- Enregistré le : 21 nov. 2012 13:03
- Localisation : Ile de France
Re: Misez p'tit Optimisez n°53 : la suite de Syracuse
Il suffit de remplacer à la ligne 50, M=A par IF M<A THEN M=ACéline a écrit :Ah zut. Je savais que je serais embêtée par l'absence de fonction MAX. Je le fait tourner manuellement mais je ne vois pas ce qui cloche.
Par ailleurs, pour être strict, pour n=1, la temps de vol est 0, or le programme précédent donne 1.
HP, Casio, Sharp, Psion, quelques TI et divers autres
- 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°53 : la suite de Syracuse
HP-28S/C et autres RPL :Céline a écrit :Je vous propose d'écrire un programme qui prend u(0) et renvoie
- le temps de vol : plus petit indice n tel que u(n)=1
- l'altitude maximale : valeur maximale de la suite.
Code : Tout sélectionner
« 1 0 @ Initialise MAX et TOF
WHILE ROT DUP 1 > @ Boucle jusqu'à obtenir 1
REPEAT
IF 2 / DUP FP THEN 6 * 1 + END @ Calcule terme suivant de la suite
ROT OVER MAX @ Remet à jour MAX
ROT 1 + @ Incrémente TOF
END
DROP @ Laisse dans la pile MAX et TOF
»
Code : Tout sélectionner
10:" " AREAD N:T=0:M=N
20:IF N=1 PRINT "MAX:";M;"TOF:";T : END
30:PAUSE N:T=T+1:N=N/2:IF N<>INT N LET N=6N+1:IF N>M LET M=N
40:GOTO 20
BASIC Microsoft
Code : Tout sélectionner
10 INPUT " N = ";N:T=0:M=N
20 DO WHILE N>1
30 : T=T+1 : IF MOD(N,2) THEN N=3*N+1 : M=MAX(M,N) : ELSE N=N/2
50 LOOP
60 PRINT "MAX:";M,"TOF:";T : END
Modifié en dernier par C.Ret le 28 mars 2014 22:03, 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.
- bernouilli92
- Fonctionne à 14400 bauds
- Messages : 5269
- Enregistré le : 21 nov. 2012 13:03
- Localisation : Ile de France
Re: Misez p'tit Optimisez n°53 : la suite de Syracuse
@C.Ret : comme d'habitude, tu m'épates, 87,5 octets, soit 15 de moins que mon programme. Chapeau!
EDIT : par contre il ne donne pas la bonne altitude pour les valeurs comme 2, 4 ou 8.
C'est facilement corrigeable en remplaçant le 1 du tout début par DUP
EDIT : par contre il ne donne pas la bonne altitude pour les valeurs comme 2, 4 ou 8.
C'est facilement corrigeable en remplaçant le 1 du tout début par DUP
HP, Casio, Sharp, Psion, quelques TI et divers autres
- babaorhum
- Fonctionne à 1200 bauds
- Messages : 454
- Enregistré le : 13 janv. 2013 19:44
- Localisation : Marseille-est
Re: Misez p'tit Optimisez n°53 : la suite de Syracuse
Hello,
chouettes propositions, pleins d'dées, super !
pour faire différent, on peut remarquer que la conjecture de Syracuse se prète assez bien à un traitement en binaire ; une occasion de faire travailler ma HP-16C (et mes neurones, je ne la pratique pas beaucoup celle là !). donc, donc :
en binaire lorsqu'un nombre est divisible par 2, il se termine par un 0 (évident), en utilisant la fonction "SR" je provoque un décalage (shift) à droite et pousse le digit de droite dans la retenue (carry). Si la carry est nulle, le nombre est divisé par 2 (je viens de retirer le 0 à droite).
Sinon, il faut que je le muliplie par 3 puis lui ajouter 1, pour ce faire, en binaire, le plus simple est d'ajouter au nombre d'origine, lui même décalé une fois à gauche avec "SL" (ce qui revient à le multiplier par 2) ...
en complétant avec les tests de temps de vol et d'altitude, ca donne un truc comme ca :
utilisation :
En mode DEC (décimal), on lance le programme avec R/S, sortie temps de vol en y, altitude max en x.
Ca sent le traitement en assembleur non ?
Qui s'y colle ?
chouettes propositions, pleins d'dées, super !
pour faire différent, on peut remarquer que la conjecture de Syracuse se prète assez bien à un traitement en binaire ; une occasion de faire travailler ma HP-16C (et mes neurones, je ne la pratique pas beaucoup celle là !). donc, donc :
en binaire lorsqu'un nombre est divisible par 2, il se termine par un 0 (évident), en utilisant la fonction "SR" je provoque un décalage (shift) à droite et pousse le digit de droite dans la retenue (carry). Si la carry est nulle, le nombre est divisé par 2 (je viens de retirer le 0 à droite).
Sinon, il faut que je le muliplie par 3 puis lui ajouter 1, pour ce faire, en binaire, le plus simple est d'ajouter au nombre d'origine, lui même décalé une fois à gauche avec "SL" (ce qui revient à le multiplier par 2) ...
en complétant avec les tests de temps de vol et d'altitude, ca donne un truc comme ca :
Code : Tout sélectionner
CLR REG (initialisation, j'efface les registres)
BIN (bascule en binaire pour le calucl)
LBL 1 (boucle principale)
ISZ (incrément du registre I, temps de vol)
1
X<>Y
x=y (test de fin de boucle : atteinte du 1)
GTO 3
RCL 0
x<>y
x>y (test de l'altitude max en registre 0)
STO 0
ENTER
SHOW DEC (affichage fugitif du chiffre en traitement, en décimal)
SR (décalage à droite, pousse digit de droite dans la 'carry')
F? 4 (test de la 'carry' ; c'est le flag n°4 de la 16C)
GTO 2
GTO 1 (carry = 0 c'était un nombre pair)
LBL 2 (carry = 1 traitement nombre impair)
R Down
ENTER
SL (décalage à gauche = x2)
+ (ajouté au nombre initial = x3)
1
+ (+1)
GTO 1
LBL 3 (sortie du programme)
RCL I (rappel temps de vol)
RCL 0 (rappel altitude max)
DEC (passage en décimal)
RTN
En mode DEC (décimal), on lance le programme avec R/S, sortie temps de vol en y, altitude max en x.
Ca sent le traitement en assembleur non ?
Qui s'y colle ?
Modifié en dernier par babaorhum le 28 mars 2014 22:40, modifié 1 fois.
BaBaoRhum
HP J728,200LX,1000CX,75C,71B,48GX,42s,41CX,32E,32Sii,28S,22s,21,16C,11C
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74,92,95 ; Canon X-07 ; TANDY EC-4026 ; Wp34S
HP J728,200LX,1000CX,75C,71B,48GX,42s,41CX,32E,32Sii,28S,22s,21,16C,11C
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74,92,95 ; Canon X-07 ; TANDY EC-4026 ; Wp34S
- 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°53 : la suite de Syracuse
@bernouilli92
Pas sûr qu'il faille corriger, j'obtiens bien les temps de vols même pour les puissances de 2. Contrairement au programme BASIC, le MAX dans le prmg RPL est mis à jour à chaque itération et donc sa valeur initiale n'a pas d'importance.
Contrairement au cas de l'astuce du programme BASIC qui ne teste la validité du max. lors de valeurs impaires !
P.S.: J'ai une autre version RPL qui permet éventuellement de conserver les valeurs intermédiaires (il suffit d'insérer un DUP avant l'instruction LIST-> :
A utiliser sur les HP48/50 pour tracer la courbe !
Pas sûr qu'il faille corriger, j'obtiens bien les temps de vols même pour les puissances de 2. Contrairement au programme BASIC, le MAX dans le prmg RPL est mis à jour à chaque itération et donc sa valeur initiale n'a pas d'importance.
Contrairement au cas de l'astuce du programme BASIC qui ne teste la validité du max. lors de valeurs impaires !
P.S.: J'ai une autre version RPL qui permet éventuellement de conserver les valeurs intermédiaires (il suffit d'insérer un DUP avant l'instruction LIST-> :
Code : Tout sélectionner
« {}
WHILE OVER 1 >
REPEAT
OVER + @ Ajoute élément à la liste
OVER 3 * 1 + @ Cas élément impair
ROT 2 / @ Cas élément pair
LAST MOD ROT ROT IFTE @ Test parité et choix du cas
END
LIST-> ->ARRY RNRM LAST SIZE + @ Affiche { max tof }
»
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.
- bernouilli92
- Fonctionne à 14400 bauds
- Messages : 5269
- Enregistré le : 21 nov. 2012 13:03
- Localisation : Ile de France
Re: Misez p'tit Optimisez n°53 : la suite de Syracuse
C'est le max qui n'est pas bon, par exemple pour 8 en entrée, le max donné est 4.C.Ret a écrit :@bernouilli92
Pas sûr qu'il faille corriger, j'obtiens bien les temps de vols même pour les puissances de 2. Contrairement au programme BASIC, le MAX dans le prmg RPL est mis à jour à chaque itération et donc sa valeur initiale n'a pas d'importance.
Le max est calculé à chaque iteration mais après le calcul du terme suivant, d'où la nécessité d'initialiser sa valeur avec la valeur en entrée.
HP, Casio, Sharp, Psion, quelques TI et divers autres
- 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°53 : la suite de Syracuse
Ah! OK merci effectivement il y a un décallage et le max est faux !
Heureusement que je comprends vite quand on m'explique longtemps !
Donc, voici le programme correct grâce à bernouilli92
Heureusement que je comprends vite quand on m'explique longtemps !
Donc, voici le programme correct grâce à bernouilli92
Code : Tout sélectionner
« DUP 0 @ Initialise MAX et TOF
WHILE ROT DUP 1 > @ Boucle jusqu'à obtenir 1
REPEAT
IF 2 / DUP FP THEN 6 * 1 + END @ Calcule terme suivant de la suite
ROT OVER MAX @ Remet à jour MAX
ROT 1 + @ Incrémente TOF
END
DROP @ Laisse dans la pile MAX et TOF
»
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.
- babaorhum
- Fonctionne à 1200 bauds
- Messages : 454
- Enregistré le : 13 janv. 2013 19:44
- Localisation : Marseille-est
Re: Misez p'tit Optimisez n°53 : la suite de Syracuse
Bô !!!
BaBaoRhum
HP J728,200LX,1000CX,75C,71B,48GX,42s,41CX,32E,32Sii,28S,22s,21,16C,11C
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74,92,95 ; Canon X-07 ; TANDY EC-4026 ; Wp34S
HP J728,200LX,1000CX,75C,71B,48GX,42s,41CX,32E,32Sii,28S,22s,21,16C,11C
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74,92,95 ; Canon X-07 ; TANDY EC-4026 ; Wp34S
- Marge
- 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°53 : la suite de Syracuse
"WHILE ROT DUP 1"
C'est ça qui m'handicape dans le RPL... je comprends l'anglais mais rien n'y fait.
C'est ça qui m'handicape dans le RPL... je comprends l'anglais mais rien n'y fait.
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é. ♥ ♠
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é. ♥ ♠
- Hobiecat
- Fonctionne à 9600 bauds
- Messages : 3644
- Enregistré le : 06 sept. 2011 14:57
- Localisation : Normandie
Re: Misez p'tit Optimisez n°53 : la suite de Syracuse
+1 !Marge a écrit :"WHILE ROT DUP 1"
C'est ça qui m'handicape dans le RPL... je comprends l'anglais mais rien n'y fait.
La solution est élégante, mais heureusement qu'il y a les commentaires à côté !
Re: Misez p'tit Optimisez n°53 : la suite de Syracuse
Bravo à tous pour vos propositions.
Le traitement en binaire sur hp16c il fallait y penser.
Reste plus qu'à démontrer la conjecture maintenant.
Est-ce que deux instructions séparées par deux points après un THEN font partie du IF THEN ou seulement la première ?
Oh là là j'ai vraiment hâte d'avoir un pocket moi
Le traitement en binaire sur hp16c il fallait y penser.
Reste plus qu'à démontrer la conjecture maintenant.
En voyant ce programme il me semble que la syntaxe sur les sharp a l'air assez souple : pas besoin de THEN après IF par exemple.C.Ret a écrit :SHARP PC-1211 (et autres TANDY ou SHARP PC-1210/1211/1212 avec trois ou quatre pile d'aileurs !)Code : Tout sélectionner
10:" " AREAD N:T=0:M=N 20:IF N=1 PRINT "MAX:";M;"TOF:";T : END 30:PAUSE N:T=T+1:N=N/2:IF N<>INT N LET N=6N+1:IF N>M LET M=N 40:GOTO 20
Est-ce que deux instructions séparées par deux points après un THEN font partie du IF THEN ou seulement la première ?
Oh là là j'ai vraiment hâte d'avoir un pocket moi
TI-30 Galaxy
fx-180P, fx-4000P
HP 11c, 12c, 12c le, 15c, 15c le
HP 32s, 32s ii, 42s, 17b ii, 30b, 35s
HP 28s, 48s, 48sx, 48g, 50g, prime
fx-180P, fx-4000P
HP 11c, 12c, 12c le, 15c, 15c le
HP 32s, 32s ii, 42s, 17b ii, 30b, 35s
HP 28s, 48s, 48sx, 48g, 50g, prime
- 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°53 : la suite de Syracuse
OUi Céline, c'est bien cela, le BASIC des SHARP possède quelques spécificités. D'aileurs c'était courant à l'époque, tous les BASIC avaient quelques variations et régles de syntaxe qui rendaient d'ailleurs parfois l'adaptation d'un programme assez compliqué d'une machine à l'autre !
En plus, dans un MPO, on utilise justement ce type de "comportement spécifique" pour gagner quelques octets et parfois une astuce ou deux.
Pour ce qui est du SHARP, iln'y a pas de clause ELSE dans les structures IF ... THEN ... et si la condition est fausse, le BASIC continu à la ligne suivante. Ce qui fait que à la suite d'un THEN (ou autre instruction placée après un IF) toutes les instructions sont exécutées. Y compris les autres clauses IF ... THEN
Ainsi, 10:IF A=1 IF B=2 PRINT A,B est équivalent à la version "microsoft" de 10:IF (A=1) AND (B=2) THEN PRINT A,B
Lors de mon précèdent post, j'ai oublié la version pour HP-41C et autre RPN avec gestion "évoluée" de la pile. Le programme n'utilise pas d'autres registres que ceux de la pile.
A la fin de l'éxecution, le programme affiche MAX, il faut presser sur la touche [x<>y] pour lire le temps de vol TOF.
En plus, dans un MPO, on utilise justement ce type de "comportement spécifique" pour gagner quelques octets et parfois une astuce ou deux.
Pour ce qui est du SHARP, iln'y a pas de clause ELSE dans les structures IF ... THEN ... et si la condition est fausse, le BASIC continu à la ligne suivante. Ce qui fait que à la suite d'un THEN (ou autre instruction placée après un IF) toutes les instructions sont exécutées. Y compris les autres clauses IF ... THEN
Ainsi, 10:IF A=1 IF B=2 PRINT A,B est équivalent à la version "microsoft" de 10:IF (A=1) AND (B=2) THEN PRINT A,B
Lors de mon précèdent post, j'ai oublié la version pour HP-41C et autre RPN avec gestion "évoluée" de la pile. Le programme n'utilise pas d'autres registres que ceux de la pile.
Code : Tout sélectionner
t: z: y: x: t: z: y: x:
001 LBL "SYRACUSE n 016 x==0 ? n even ?
002 0 n 0 017 GTO 00
003 X<> Y 0 n 018 Clx t+1 m n/2 0
004 ENTER^ 0 n n 019 6 t+1 m n/2 6
005 ENTER^ 0 n n n 020 * t+1 t+1 m 3n
021 1 t+1 m 3n 1
006 LBL 00 t m n ~ 022 + t+1 t+1 m 3n+1
007 Clx t m n 0 023 x>y ? n'>m' ?
008 1 t m n 1 024 STO Y m'
009 x==y ? 1==n ? 025 ENTER^ t+1 m' n' n'
010 GTO 01 026 PSE Affiche n
011 ST+ T t+1 m n 1 027 GTO 00
012 ST+ X t+1 m n 2
013 / t+1 t+1 m n/2 028 LBL 01 t m 1 1
014 ENTER^ t+1 m n/2 n/2 029 RDN
015 FRC t+1 m n/2 f 030 RDN
.END. t m
Modifié en dernier par C.Ret le 29 mars 2014 09:30, 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.