Misez p'tit Optimisez n°86 : la spirale d'Ulam

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
C.Ret
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1877
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par C.Ret » 25 nov. 2018 12:04

Excellent marge, alors sur la spirale du temps YYYYmmDD, nous devions être adversaire, car j'étais dans un carré opposé (-2218 , 11)

Pour faire plaisir à Badaze qui vient d'acquérir un magnifique HP-28S, je me permets de donner le code suivant:
MPO86_HP28S.png
MPO86_HP28S.png (109.58 Kio) Consulté 325 fois

Ce code n'effectue aucun test et n'utilise aucun GOTO, il se contente pour tout nombre n supérieur ou égal à 2 de calculer une approximation extrêmement proche du couple de coordonnées (x,y) correspondant à la position de n sur une spirale comme celle d'Ulam.

En fait, les coordonnées calculées sont même rigoureusement exactes pour tous les nombres entiers alignés sur les axes horizontaux, verticaux et les deux diagonales. Ce qui fait huit directions par tour de la spirale.

Et une version pour SHARP PC-1210/1211/1212 :

Code : Tout sélectionner

10:"N" AREAD N:DEGREE :K=(√N-1)/2,K=INT K+(K>INT K,T=(4KK+4K+1-N)/K,P=1-T+2*INT .5T,D=K*√(1+PP   73o
20:A=315-45T+SIN 180P*EXP √2:PRINT D*COS A,D*SIN A                                               33o
MEM: 1318STEPS   164MEMORIES                                                              Total 106o


EDIT: J'oubliais de vous donner la version pour HP-15C.

Pour rendre le code plus facile à lire, j'ai regrouper les instructions en une ligne pour chacune des valeurs intermédiaires calculées.
MPO86_HP-15C linestep.gif
MPO86_HP-15C linestep.gif (40.49 Kio) Consulté 290 fois
Il manque à cette machine les fonctions CEIL et MOD. Le code fait donc 61 instructions, mais il doit pouvoir être amélioré, notamment en utilisant des astuces plus efficaces pour palier à ce manque.
Dernière édition par C.Ret le 27 nov. 2018 18:54, édité 3 fois.
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803. | TI-57 LCD | TI-74 BasiCalc | TI-92 II | HP-15C | HP-28S + HP82240A | HP-41C + (2 memory + stat + IR) modules. | HP Prime Wireless Graphing Calculator . .Sommaire des M.P.O.. . Sommaire du P.C.T.M. .

Avatar de l’utilisateur
Marge
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4224
Inscription : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par Marge » 25 nov. 2018 18:30

alors sur la spirale du temps YYYYmmDD, nous devions être adversaire, car j'étais dans un carré opposé (-2218 , 11)
Bah... aujourd'hui : - 2246 ; - 814. Nous suivons le cours du temps, non ?

(édité grâce à l'intervention spatio-temporelle de C.Ret)
Dernière édition par Marge le 06 déc. 2018 21:39, édité 1 fois.
3 hommes, 3 demis, un 3a... Magnéto, Serge !

« Boris », c'est juste Maurice enrhumé.

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

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par C.Ret » 27 nov. 2018 21:38

C'est tout à fait cela :

Image
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803. | TI-57 LCD | TI-74 BasiCalc | TI-92 II | HP-15C | HP-28S + HP82240A | HP-41C + (2 memory + stat + IR) modules. | HP Prime Wireless Graphing Calculator . .Sommaire des M.P.O.. . Sommaire du P.C.T.M. .

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

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par C.Ret » 29 nov. 2018 22:43

J'ai eu du mal à trouver une fonction CEIL sur mon HP-41C, je l'ai noté en rouge.

Par contre, j'ai trouvé fortuitement un moyen de simplifier mon algorithme et de me passer des fonctions polaires/cartésiennes.
Il y a donc convergence des algorithmes avec ce dernier code qui, comme les méthodes de zpalm et marge exploite quatre cas distincts.

Par contre, la symétrie de la spirale me permet de traiter ces quatre orientations à l'aide d'une seule boucle de quelques instructions indicée par le registre T de la pile. La puissance de l'HP-41C s'avère alors une grande aide:

HP-41C mpo 86.png
HP-41C mpo 86.png (67.08 Kio) Consulté 229 fois

Le programme affiche d'abord la coordonnée x: ; comme pour l'HP-15C, il faut presser sur la touche [X:Y] pour voir la coordonnée y:


Ce nouvel algorithme ouvre des possibilités, la version SHARP PC-1211 devient donc un one-liner :

Code : Tout sélectionner

1:INPUT N:X=-INT (.5-√N/2,D=4XX+4X+1-N,Q=INT (D/2X,Y=X-D+2XQ:FOR I=0 TO Q:Z=-X,X=Y,Y=Z:NEXT I:PRINT X,Y
         78 octets 
La version HP Prime un enchantement:
HP-Prime mpo 86.png
HP-Prime mpo 86.png (17.17 Kio) Consulté 211 fois
La version RPL est un mono-block enflammé :

Code : Tout sélectionner

« DUP √ 1 - 2 / CEIL 				n , k=CEIL((√n-1)/2)
  DUP 2 * 1 + SQ ROT -				k , d=(2k+1)²-n
  OVER 2 * / LAST MOD				k , Q=d/2k , m=d MOD 2k
  ROT DUP ROT -  				Q , k , k-m 
  0 4 ROLL START				k , k-m , 0 , Q
     SWAP NEG					~  k-m,-k  ~  -k,m-k  ~  m-k,k  ~  k,k-m ~ 
  NEXT R→C »					(x,y)
La version HP-15C un peu plus énervante:
HP15C mpo 86.png
HP15C mpo 86.png (92.27 Kio) Consulté 206 fois

Je laisse à Marge le soin de faire les versions très énervantes et pénibles comme faut pour les spices, pionniers et autres classics dont il est le garant.


Ne reste plus qu'une version pour quelques CASIO, TI ou autres ?
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803. | TI-57 LCD | TI-74 BasiCalc | TI-92 II | HP-15C | HP-28S + HP82240A | HP-41C + (2 memory + stat + IR) modules. | HP Prime Wireless Graphing Calculator . .Sommaire des M.P.O.. . Sommaire du P.C.T.M. .

Avatar de l’utilisateur
Marge
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4224
Inscription : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par Marge » 07 déc. 2018 14:14

En attendant quelques versions énervantes pour HP, voici l'adaptation du programme de dprtl pour Casio PB-1000 sur Sharp PC-1403 :

Code : Tout sélectionner

10: X=0:Y=0:D=0:T=1:S=1:INPUT "N=";N
20: FOR I=1 TO N: PRINT I;X;Y:T=T-1
30: IF D=0 THEN LET X=X+1:GOTO 90
40: IF D=1 THEN LET Y=Y+1:GOTO 70
50: IF D=2 THEN LET X=X-1:GOTO 90
60: Y=Y-1
70: IF T=0 THEN LET D=D+1:T=S:D=D-(INT(D/4)*4)
80: GOTO 100
90: IF T=0 THEN LET D=D+1:T=S:S=S+1
100: NEXT I
Petites adaptations :
  • l'instruction LET est toujours nécessaire après un THEN ;
  • la fonction MOD n'existant pas, j'ai dû la taper in extenso.
Le plus drôle est que ça fonctionne sans que je sache comment. :lol: Mais je vais faire un effort. :wink:

Je travaille par ailleurs depuis longtemps sur une autre idée, mais j'ai vraiment du mal à l'appliquer...

J'ajoute que contrairement à ce que tu affirmes, C.ret, ("il y a donc convergence des algorithmes avec ce dernier code qui, comme les méthodes de zpalm et marge exploite quatre cas distincts."), ma méthode ne traite pas réellement de quatre cas distincts géométriques comme chez zpalm, mais plutôt de quatre conditions algébriques (pair, impair, etc.).
3 hommes, 3 demis, un 3a... Magnéto, Serge !

« Boris », c'est juste Maurice enrhumé.

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

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par C.Ret » 07 déc. 2018 21:32

J'attends avec impatience l'expression de cette nouvelle idée.

Et je me réjouis qu'il n'y ait pas convergence des solutions, c'est bien plus intéressant et amusant.


Quelle bonne idée une SHARP PC-1403 ! J'aime bien cette petite machine (ce n'est pas un Pocket car on y voit très clairement les touches SIN COS TAN et EXP en haut à droite). Cette calculatrice qui a le bon ton de se programmer en BASIC.

Par contre, j'ai voulu essayer de retrouver à l'aide de ton code les coordonnées spiralo-temporelles de nos dates de naissance, mais c'est bien fastidieux ! Combien de fois va-t-il me falloir appuyer sur la touche ENTER pour voir enfin s'afficher le résultat ? La PC-1403 égraine les résultats en s'arrêtant à chaque valeur de N (cf. le PRINT de la ligne 20).

Par ailleurs, l'avantage du PC-1403 est qu'il a une fonction (x MOD 4), il suffit d'utiliser (x AND 3). Bon d'accord, cette astuce ne fonctionne pas pour toutes les valeurs. Mais uniquement pour les entiers puissances de 2^n lorsque la fonction (X MOD 2^n) peut être remplacer avantageusement par un (X AND (2^n-1))

Comme nous nous affrontons ici au sein d'un MPO, je me suis donc permis de réécrire pour la SHARP PC-1403 le code de dprl, en abusant des astuces qu'offre le BASIC des SHARP, BASIC fort complet sur une PC-1403.

Code : Tout sélectionner

 1:CLEAR :INPUT "n=";N:FOR I=2 TO N
 2:T=T+1,X=X+(D=0)-(D=2),Y=Y+(D=1)-(D=3):IF T>L LET T=0,L=L+(D AND 1),D=(D+1) AND 3
 3:NEXT I:PRINT STR$ N;":";X;STR$ Y

Notons que le IF ... THEN se contente très naturellement (dans la famille des Pockets SHARP) d'un IF ... LET plus concis.
Que l'instruction CLEAR me permet en une seule instruction d'initialiser toutes mes variables (j'ai gardé les noms des variables du code initial)
Le spaghetti de GOTO et la myriade de structures IF … THEN qui permettaient d'incrémenter ou décrémenter X ou Y sont dissous en utilisant l'astuce des évaluations binaires (0:FAUX 1:TRUE)

J'aimais bien le jeu subtil des sauts en ligne 70 et 90 qui permettait, l'air de rien, d'incrémenter la taille de la spirale deux fois par tour, je l'ai malgré tout fait disparaitre et tirant profit du fait que la direction D est impaire une fois sur deux. Un (D AND 1) permet donc d'incrémenter L au bon rythme.
Enfin, comme je l'ai signalé ci-dessus, j'utilise ((D+1) AND 3) pour faire cycler D sur les quatre directions [ 0:droite 1:haut 2:gauche et 3:bas ].

Comme vous l'aurait très certainement remarqué, cette version ne fonctionne pas pour n=1 (elle donne le même résultat que pour n=2; Corriger cette imperfection est fort simple, mais je préfère économiser les précieux octets. Et ce petit défaut n'est rien par rapport au problème majeur suivant:


Il faut patienter un peu pour obtenir les coordonnées de 2018 :
PC1403_2018_mpo86_1.gif
PC1403_2018_mpo86_1.gif (63.76 Kio) Consulté 114 fois
PC1403_2018_mpo86_2.gif
PC1403_2018_mpo86_2.gif (65.15 Kio) Consulté 114 fois
Cette nouvelle bouture de l'algorithme de dprl et marge ne règle donc toujours pas mon problème. Je n'arrive pas à retrouver les coordonnées de nos dates de naissances dans un temps non infini.
Dernière édition par C.Ret le 08 déc. 2018 18:13, édité 2 fois.
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803. | TI-57 LCD | TI-74 BasiCalc | TI-92 II | HP-15C | HP-28S + HP82240A | HP-41C + (2 memory + stat + IR) modules. | HP Prime Wireless Graphing Calculator . .Sommaire des M.P.O.. . Sommaire du P.C.T.M. .

Avatar de l’utilisateur
Marge
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4224
Inscription : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par Marge » 07 déc. 2018 23:43

Bravo, C.ret, c'est en effet encore mieux ainsi. Je ne connaissais pas ces astuces de logique booléenne, ni d'ailleurs du THEN facultatif avec LET.

Alors certes, ce type de programme nécessite "un certain temps" pour arriver au résultat, mais l'idée procède d'un vrai bon sens : on imagine mal un mathématicien désœuvré dans une conférence commençant à dessiner une spirale d'entiers par le haut de la page !
Commencer par le centre est très logique, alors que chercher à connaître les coordonnées d'un entier quelconque demeure dans le domaine de l'amusement mathématique. Mais ce qui compte ici, c'est qu'on s'amuse.

Allez, promis, je donnerai quelque chose avant dimanche soir.
3 hommes, 3 demis, un 3a... Magnéto, Serge !

« Boris », c'est juste Maurice enrhumé.

Avatar de l’utilisateur
Marge
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4224
Inscription : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par Marge » 09 déc. 2018 21:24

La deuxième mi-temps !

Image

Cette impressionnante image nous mène bien loin des terrains de football... Qui sait si, à calculer un million de fois ce qui est représenté sur cette figure, et à le représenter sur un écran approprié, l'on ne découvrirait pas le sens de la vie ? Voilà une question pour quelques dimanches !

Il est assez surprenant que depuis le lancement de ce MPO, nous ayons dans l'ensemble depuis zpalm jusqu'à moi-même (avec peut-être l'exception de dprtl dont je n'ai toujours pas éclairci le programme...) en passant naturellement par C.Ret suivi des chemins plutôt géométriques pour obtenir le dessin de la spirale ; or quoi de plus naturel ? lorsqu'on évoque une spirale, on pense "escargot", "lavabo", "galaxie", "serpentin", "amorces de revolver" (oui, vous vous souvenez de votre panoplie de cow-boy ?), "ressort d'horloge" et même "boule de neige"...

Pourtant, dessiner à la main une spirale en escalier n'est pas exactement la même chose que d'observer la croissance d'un gastéropode. Cela exige de se conformer à des règles qui ne sont pas celles de Léonard de Vinci à Chambord, d'accord, mais qu'il faut suivre impérativement et sans erreur.

Image

Que se passe-t-il dans notre cerveau lorsque nous traçons ces nombres entiers ?
Peu seraient capables de le dire, et je serais le dernier de ceux-là. On peut éventuellement estimer que le cerveau va suivre au plus près la figure (fœtale ?) qui se dessine peu à peu, et ce sera une grosse approximation du processus réel.

Ce que je sais en revanche est que rendre compte de cela algébriquement n'est pas trop compliqué. À simplement noter certaines coordonnées successives des entiers et des opérations effectuées sur x et y pour les obtenir, on perçoit des régularités propices aux calculs qui nous intéressent. En effet :

Code : Tout sélectionner

| N  |  X  |  Y  | Opération 
| 1  |  0  |  0  | x=x+1            
| 2  |  1  |  0  | y=y+1     
| 3  |  1  |  1  | x=x-1      
| 4  |  0  |  1  | x=x-1 
| 5  | -1  |  1  | y=y-1
| 6  | -1  |  0  | 
Si vous avez déjà deviné l'opération exigée à partir de l'entier 6 pour obtenir les coordonnées de l'entier 7, vous avez fait l'essentiel du travail de compréhension !

Nous verrons plus tard qu'il est possible d'appliquer ce principe de détermination des coordonnées pour la recherche de celles d'un entier quelconque, mais pour l'instant, observons que nous devrons additionner alternativement à x et à y les valeurs 1 et -1 selon une progression arithmétique élémentaire puisqu'elle suit celle des entiers naturels eux-mêmes : 1, 2, 3, 4, etc.

Autrement dit :
  • Ajoutons 1 à X une fois,
  • ajoutons 1 à Y une fois,
  • ajoutons -1 à X deux fois,
  • ajoutons -1 à Y deux fois,
  • ajoutons 1 à X trois fois,
  • ajoutons 1 à Y trois fois,
  • etc.
À chaque modification de X ou de Y, naturellement, N varie.

C'est là que j'ai rencontré d'énormes difficultés à représenter la suite d'opérations nécessaires à une machine pour qu'elle réalise ce calcul. Je n'ai pas pu éviter l'organigramme relativement bâclé que voici :

Image

Je dois être honnête : j'ai réalisé des dizaines de tentatives sur une feuille (que dis-je ? une bonne dizaine de feuilles !) avant de me résoudre à l'évidence que le passage sur écran, comme nous y a habitué C.Ret avec ses magnifiques explications, était indispensable.
J'ai aussi essayé, dans un élan d'orgueil ridicule, d'immédiatement appliquer ce que je croyais être une trouvaille majeure sur une HP-41 en évitant scrupuleusement l'usage des registres ! Mais n'est pas zpalm qui veut... :wink:

Que se passe-t-il dans notre pauvre cerveau entre l'inscription de la spirale sur un bout de papier et l'adaptation de cette exécution à un ordinateur ?
Je sens que la réponse à cette question exigera des prolongations...

Revenons à notre schéma :

On initialise la machine avec :
  • La variable I (I pour Index), qui représentera les entiers successifs de 1 à N ;
  • X et Y les coordonnées classiques ;
  • U (U pour Unité) qui prendra les valeurs 1 et -1 alternativement ;
  • F qui représentera Fibonacci, c'est-à-dire les entiers successifs correspondant au nombre de boucles sur X puis sur Y ;
  • G qui gardera Fibonacci au chaud !


L'utilisateur entre la valeur N dont il doit trouver les coordonnées.


La machine vérifie si I égale N et dans ce cas, affiche le résultat immédiat et stoppe le programme.


1. C'est bien sûr ici que ça devient intéressant : on incrémente F pour commencer la boucle sur X. On note cette valeur dans G pour la ressortir éventuellement plus tard et l'appliquer sur Y, puis éventuellement sur le X suivant, etc.

2. Test de parité très lourd et très lent ; il suffit en réalité d'attribuer alternativement 1 et -1 à U, ce qui est faisable bien plus rapidement pour ce programme de recherche de TOUS les N. La recherche sur un N quelconque exigera néanmoins ce test, je le conserve donc ainsi (mais rien ne vous empêche de le changer !).

3.Travail sur X : tant que N n'est pas atteint et tant que F n'est pas à zéro, on continue à modifier X et par conséquent N.

4.Travail sur Y : tant que N n'est pas atteint et tant que F n'est pas à zéro, on continue à modifier Y et par conséquent N.

Voici un programme très grossier pour HP-41, je n'en suis pas fier mais il fonctionne : je le place ici pour vous donner de quoi vous occuper, n'hésitez pas à l'améliorer. Je m'intéresse plutôt à la version OPL pour l'instant !

Code : Tout sélectionner

01 LBL ULAM
02 CLRG
03 STO 00
04 1
05 STO 01
06 STO 04
07 X=Y?
08 GTO 00
09 LBL 01
10 1
11 ST+ 05
12 RCL 05
13 STO 06
14 2
15 /
16 FRC
17 X=0?
18 GTO 02
19 1
20 STO 04
21 GTO 03
22 LBL 02
23 1
24 CHS
25 STO 04
26 LBL 03
27 RCL 04
28 ST+ 02
29 1
30 ST+ 01
31 RCL 00
32 RCL 01
33 X=Y?
34 GTO 00
35 1
36 ST-05
37 RCL 05
38 X=0?
39 GTO 04
40 GTO 03
41 LBL 04
42 RCL 06
43 STO 05
44 LBL 06
45 RCL 04
46 ST+ 03
47 1
48 ST+ 01
49 RCL 00
50 RCL 01
51 X=Y?
52 GTO 00
53 1
54 ST- 05
55 RCL 05
56 X#0?
57 GTO 06
58 RCL 06
59 STO 05
60 GTO 01
61 LBL 00
62 RCL 00
63 PSE
64 RCL 02
65 PSE
66 RCL 03
67 PSE
68 RTN

Je pense que ce programme, largement amélioré, devrait être très rapide. :D

À bientôt.

PS : de manière surprenante, ma 41CX dont le voyant "BAT" était allumé depuis ce matin vient de totalement s'éteindre...
3 hommes, 3 demis, un 3a... Magnéto, Serge !

« Boris », c'est juste Maurice enrhumé.

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

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par C.Ret » 09 déc. 2018 23:07

Je me délecte, cette présentation est un délice.

Effectivement, cette méthode est bien différente des deux précédentes exploité précédemment.

Je viens de passer un peu de temps sur l'organigramme; c'est un délice, j'ai pu à la voler en faire un programme BASIC qui a fonctionné du premier coup.
mpo 86 - MARGE's C128D BASIC.gif
mpo 86 - MARGE's C128D BASIC.gif (40.64 Kio) Consulté 43 fois
C'est effectivement une bonne idée d'utiliser cette symétrie dans l'accroissement de X et Y puis le décroissement des deux mêmes X et Y.
J'ai moins aussi tracé des dizaine de spirale et rempli une bonne vingtaine de feuille Excel avant de maitriser convenablement le mouvement des coordonnées.

mais c'est un point crucial, car il y a plein de symétrie et de choses troublantes comme des propriété entre le nombres de nombres se trouvant entre deux carrés impairs successifs et le nombre d'octets de nombres que compose chaque boucle de la spirale.
mpo 86 -  8k spire structure.gif
mpo 86 - 8k spire structure.gif (53.39 Kio) Consulté 43 fois
Il y a là encore de quoi déceler d'autres symétries et périodicités, optimiser les algorithmes, simplifier tout cela et surtout pouvoir calculer x et y presque directement à partir d'un N donné.
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803. | TI-57 LCD | TI-74 BasiCalc | TI-92 II | HP-15C | HP-28S + HP82240A | HP-41C + (2 memory + stat + IR) modules. | HP Prime Wireless Graphing Calculator . .Sommaire des M.P.O.. . Sommaire du P.C.T.M. .

Avatar de l’utilisateur
Marge
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4224
Inscription : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par Marge » 10 déc. 2018 18:18

1.jpeg
1.jpeg (37.04 Kio) Consulté 16 fois
Voici un code pour les Psion 3, 3a et 3mx à partir de l'organigramme que j'ai donné hier ; a priori il doit aussi fonctionner pour les Serie 5, voire le Psion 7 :

Code : Tout sélectionner

Proc Uxy:
Local i%,x%,y%,n%,f%,g%,u%
Print "n= " :input n%
i%=1
IF i%=n%
	Print n%,x%,y%
	get
	STOP
Endif
Boucle1::
f%=f%+1 :g%=f%
IF f% AND 1
	u%=1
ELSE
	u%=-1
ENDIF
Boucle2::
x%=x%+u% :i%=i%+1
IF i%=n%
	Print n%,x%,y%
	get
	STOP
Endif
f%=f%-1
IF f<>0
	GOTO Boucle2
Endif
f%=g%
Boucle3::
y%=y%+u% :i%=i%+1
IF i%=n%
	Print n%,x%,y%
	get
	STOP
Endif
f%=f%-1
IF f%<>0
	GOTO Boucle3
ENDIF
f%=g%
GOTO Boucle1
ENDP
Pour l'affichage du résultat, je n'ai pas voulu avoir à transférer les paramètres entre les procédures (ce qui équivaudrait à appeler une sous-routine en BASIC), donc je répète trois fois :

Code : Tout sélectionner

IF i%=n%
	Print n%,x%,y%
	get
	STOP
Endif
Oui, je sais, c'est pas bien.
J'améliorerai cela.

C'est la première fois que j'utilise la logique booléenne pour la parité, c'est bien pratique.

Enfin, l'utilisation des variables d'entiers simples limite le calcul à environ 32 000.

Sur le 3mx, le résultat est quasi instantané pour 2018 (moins d'une seconde) et prend 8 secondes pour 32 000.

(Illustration Mass Made Soul : https://www.massmadesoul.com/psion-3/)
3 hommes, 3 demis, un 3a... Magnéto, Serge !

« Boris », c'est juste Maurice enrhumé.

Répondre

Revenir vers « Tous les Pockets »