MPO 106 - Distribution de bonbons

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 du membre
dprtl
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 463
Enregistré le : 27 janv. 2013 00:26
Localisation : Strasbourg
Contact :

Re: MPO 106 - Distribution de bonbons

Message par dprtl »

C.Ret a écrit : 06 mars 2022 21:12 En attendant, je modifie le code de mon SHARP PC-1211 afin de pouvoir gérer plus de 100 élèves (au lieu des 20 actuels) !

Quel est la ronde la plus importante que vous puissiez calculer ?
Sur ma Casio, j'ai un peu plus de RAM, donc pas trop de mérite pour calculer une ronde à 300 élèves avec le programme précédent et 30 lignes de 10 données chacune :

Code : Tout sélectionner

160 DATA 0,1,2,3,4,5,6,7,8,9
170 DATA 0,1,2,3,4,5,6,7,8,9
180 DATA 0,1,2,3,4,5,6,7,8,9
190 DATA 0,1,2,3,4,5,6,7,8,9
...
Résultat (non vérifé) : [13,10] en 12 minutes environ (sans afficher les calculs intermédiaires).
Modifié en dernier par dprtl le 02 avr. 2022 16:41, modifié 1 fois.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: MPO 106 - Distribution de bonbons

Message par C.Ret »

@dprtl:
Ah! Oui 300 élèves sur une CASIO, c'est pas mal, c'est carrément toute l'école !


@Eric:
Ah! Oui, pardon, je n'avais pas vu le point blanc dans la video qui effectivement indique bien que 2nd CMS a était effectuer au début de chaque saisie.
Il y avait du soleil sur mon écran et je n'avais pas fait attention au point blanc marquant l'appuis des touches.

@Tous:
Bon, l'algorithme de la TI-58c est assez simple, la version postée ci-dessus est celle obtenue après avoir "compilé" les adresses des instructions. Lors de la mise au point, les Sub-routines et différentes parties du code avait des labels. C'est plus pratique, et indispensable pour le développement; on peut ajouter des R/S et autre PAUSEs pour voir ce qui ce passe. Alors que la version avec les adressages explicites est impossible à modifier sans tout casser.


Vous avez aimé la version TI-58C, alors vous allez adorer la version HP-15C qui utilise sa capacité à exploiter des matrices :
MPO106 - HP-15C.gif
MPO106 - HP-15C.gif (31.75 Kio) Vu 3643 fois
Attention, dans ce code seules les instructions STO A des pas 008 et 033 doivent être saisies en mode USER afin d'utiliser les fonctions de la saisie automatique des éléments et ainsi de passer à l'élément suivant (par les éventuels incréments automatiques des registres R0 et R1) ou saut du pas suivant si en fin de matrice.

En partitionnant la HP-15C afin de n'utiliser que les registres I, R0, R1 et R2 par une petit 2 f DIM (i), on obtient la configuration mémoire g MEM 2 55 8-5 qui indique la limite des registres à R2, qu'il y a 55 registres dans la piscine (le "pool") et que le code utilise 8 registres et 5 pas.

Notez les codes des instructions; ce ne sont pas des codes que l'on rencontre très souvent. Il y a même un RCL g A. Ce n'est pas une faute de frappe, c'est bel et bien une instruction prévue; instruction de rappel de l'élément A(y,x) où x et y sont pris dans la pile aux niveaux X: et Y:.

Hé hé hé, ce code est une bonne révision des différentes instructions de saisie et modification des éléments des matrices sur HP-15C ! Infernal !

Registres:
I : Compteur
R0,R1: index éléments matrice A
R2: valeur dernier élément de A / nombre de bonbons à l'équirépartition.
Matrice A: tableau contenant le nombre de bonbons pour chaque élève.


Utilisation:
Saisir le nombre n d'élèves dans la ronde et lancer par f A.
Saisir alors les n nombres de bonbons initialement distribués ce qui aura pour effet de placer ces valeurs dans la Matrice A de taille n x 1.

la seconde partie du code (Label B) effectue le calcul des distributions après avoir vérifié que les éléments de la matrice A ne sont pas tous égaux. Pour cela le dernier élément est extrait et mémorisé dans le registre R2. Cette valeur est retirée à tous les éléments de la Matrice A. Puis la norme euclidienne de (matA-R2) est calculée (C'est à dire la racine carré de la somme de tous les éléments élevés au carré) . Si tous les éléments de la Matrice A sont égaux à R2 alors cette norme est nulle et la dernière partie (Label C), affichant les résultats est lancée.

Sinon, la boucle de calcul de la distribution des bonbons est exécutée. Comme pour le code de la Ti58c, la valeur R2 du dernier élément est utilisée pour calculer la nouvelle valeur du première élément de la Matrice A. Au passage, la valeur du registre I est augmenté d'une unité afin qu'il serve de compteur. A partir de la valeur R2, le sous-programme 2 calcule CEIL(R2/2).
Cette valeur sera ajoutée à CEIL(A(1,1)/2) afin de calculer la nouvelle valeur qui sera placée dans la Matrice A et la valeur CEIL(A(1,1)/2) restera dans la pile pour le calcul de l'élément suivant. Et ainsi de suite pour chaque élément de la Matrice A.

Une fois que tous les éléments de la Matrice A ont été mis à jour, le programme reboucle sur le Label B afin de vérifier l'égalité de tous les éléments de la Matrice A.
Dans le cas d'une matrice ne contenant qu'un seul élément, cet élément sera retiré à lui-même et la norme euclidienne sera nulle.

La dernière partie du code (Label C), se contente de placer R2 dans la pile en Y: et le compteur I en X: qui sera donc affiché. Une simple pression sur la touche [x:y] permettra de voir le nombre de bonbon communs à tous les élèves. Ce nombre peut également être obtenu en parcourant les élément de la Matrice A.

Le sous-programme LBL 2 utilise un RND qui impose un format d'affichage FIX 0 afin de transformer l'instruction d'arrondi RND en l'équivalent d'un CEIL. Mais c'est pas grave, il n'y a de toute façon dans les résultats que des entiers.

Cette version est plus complexe que la version initiale qui utilisait deux matrices et donc ne permettait pas de traiter une classe de 55 élèves.
Bon, l'HP-15C fait ce qu'elle peut et n'a pas l'ambition de traiter la ronde d'une école entière. N'est pas CASIO qui le veut...

Sans compter, que déjà 10 élèves c'est quelques minutes de 'runninG' ; je n'ose pas imaginé avec quelque centaine ...
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.
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: MPO 106 - Distribution de bonbons

Message par zpalm »

C.Ret a écrit : 09 mars 2022 21:33 Vous avez aimé la version TI-58C, alors vous allez adorer la version HP-15C qui utilise sa capacité à exploiter des matrices
Ah! J'adore, j'adore, j'adore, j'adore, j'adore, j'adore
Et je coupe le son (ooh)
Et je remets le son 8)
C.Ret a écrit : 09 mars 2022 21:33Hé hé hé, ce code est une bonne révision des différentes instructions de saisie et modification des éléments des matrices sur HP-15C ! Infernal !
Diabolique ! Je n’avais jamais utilisé toutes ces instructions sur la 15C !!!
C.Ret a écrit : 09 mars 2022 21:33Le sous-programme LBL 2 utilise un RND qui impose un format d'affichage FIX 0 afin de transformer l'instruction d'arrondi RND en l'équivalent d'un CEIL.
Ce sous programme fait 5 pas. Avec les deux GSB 2 cela fait 7 pas alors qu’il n’y a que trois instructions utiles: 2 / RND.
On peut donc gagner un pas de programme en supprimant le sous-programme LBL 2 et en remplaçant chaque GSB 2 par: 2 / RND.
C.Ret a écrit : 09 mars 2022 21:33Sans compter, que déjà 10 élèves c'est quelques minutes de 'runninG' ; je n'ose pas imaginé avec quelque centaine ...
Sur ma 15C LE ça ne prend que quelques secondes, et sur ma DM15CC une poignée de secondes supplémentaires. L’avantage de la 15CC c’est qu’elle a comme configuration mémoire g MEM 2 119 8-5 avec le firmware M80 (firmware patché pour gérer 128 registres au lieu des 64 originaux). Elle peut donc traiter une école de 119 élèves. Elle pourrait gérer 128 élèves de plus si j’installai le firmware M1B.

Image

(La photo a été prise après le test des 10 élèves, c’est pour ça qu’elle indique 109 registres libres, et 10 pour la matrice A.)

Pour finir et pour pinailler, quelques petites remarques sur le listing du programme :
  • au pas 37 les codes instructions pour RCL 2 sont 45 2 et non 45 11
  • aux pas 20 et 31 il manque le préfixe g
De toute façon c’est un programme magnifique !

J'adore, j'adore, j'adore, j'adore, j'adore, j'adore
Et je coupe le son (ooh)
Bonne nuit 8)
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: MPO 106 - Distribution de bonbons

Message par Schraf »

@dprtl : oui, le résultat est bien 13 tours et 10 bonbons par enfant, vérification avec Excel :

Version Excel
Version Excel
300 eleves.jpg (70.75 Kio) Vu 3622 fois

@C.Ret : Ton programme tombe à pic, je viens de récupérer un HP-15C il y a quelques jours
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: MPO 106 - Distribution de bonbons

Message par Schraf »

Question pour les pros des Hp-48/50g : Je voulais ajouter un aspect graphique aux programmes de @C.Ret ou @bernouilli92

Comme vous avez utilisé une liste, je me demandais s'il y avait un moyen de passer les valeurs dans ΣDAT. Avec une matrice on peut faire [[1] [5] [7]] 'ΣDAT STO et ensuite STAT - PLOT - BARPL(ot) pour avoir un joli histogramme.

Valeurs 1, 5 et 7
Valeurs 1, 5 et 7
BARPLOT sur HP-48G.jpeg (48.09 Kio) Vu 3618 fois
Ma question est de savoir comment passer d'une liste {3 0 5 0 2 1} à une matrice du type [[3] [0] [5] [0] [2] [1]], je cherche avec STREAM (merci à @FLISZT), DOLIST et DOSUB mais sans succès pour le moment...

Avec un WAIT (ou sans, je ne sais plus si BARPLOT fige l'écran et attend), on pourrait voir l'évolution des distributions.
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: MPO 106 - Distribution de bonbons

Message par zpalm »

C.Ret a écrit : 09 mars 2022 21:33 Sans compter, que déjà 10 élèves c'est quelques minutes de 'runninG' ; je n'ose pas imaginé avec quelque centaine ...
Quelques mesures: une distribution sur 55 élèves [1,2,3,4,5…,54,55] donne [79,56] en 39 secondes sur la HP-15C LE, et en 3 minutes 38 secondes sur la DM15. Ceci sans les appels au sous-programme LBL 2, ce qui doit être un peu plus rapide que le programme original.
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: MPO 106 - Distribution de bonbons

Message par Schraf »

Illustration de la simulation de @zpalm

79 tours et 56 bonbons par enfant
79 tours et 56 bonbons par enfant
1a55.jpg (108.52 Kio) Vu 3604 fois
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: MPO 106 - Distribution de bonbons

Message par zpalm »

Une constatation amusante: si on a n enfants et que l'on distribue a chaque enfant le nombre de bonbons correspondant à son rang de 1 à n, alors le nombre final de bonbons pour chaque enfant est 2*Ceil(n/2)
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: MPO 106 - Distribution de bonbons

Message par C.Ret »

zpalm a écrit : 10 mars 2022 00:36 Ah! J'adore, j'adore, j'adore, j'adore, j'adore, j'adore
Et je coupe le son (ooh)
Et je remets le son 8)
Je crois que nous avons la même musique qui nous trotte dans la tête...
zpalm a écrit : 10 mars 2022 00:36Diabolique ! Je n’avais jamais utilisé toutes ces instructions sur la 15C !!!
Moi aussi je trouve de ces occasions sont bien trop rares...
zpalm a écrit : 10 mars 2022 00:36Ce sous programme fait 5 pas. Avec les deux GSB 2 cela fait 7 pas alors qu’il n’y a que trois instructions utiles: 2 / RND.
On peut donc gagner un pas de programme en supprimant le sous-programme LBL 2 et en remplaçant chaque GSB 2 par: 2 / RND.
Très juste ! j'ai à un moment utilisé l'instruction RND pour éviter la séquence « 2 ÷ .5 + INT » (identique à la Ti58c) remplacée efficacement par « 2 ÷ RND ». Mais je ne suis pas allé jusqu'au bout de ma logique.
Effectivement « ... GSB 2 ... GSB 2 ... LBL 2 2 ÷ RND RTN ... » est plus long que « ... 2 ÷ RND ... 2 ÷ RND ... » !
zpalm a écrit : 10 mars 2022 00:36Sur ma 15C LE ça ne prend que quelques secondes, et sur ma DM15CC une poignée de secondes supplémentaires. L’avantage de la 15CC c’est qu’elle a comme configuration mémoire g MEM 2 119 8-5 avec le firmware M80 (firmware patché pour gérer 128 registres au lieu des 64 originaux). Elle peut donc traiter une école de 119 élèves. Elle pourrait gérer 128 élèves de plus si j’installai le firmware M1B.
Ah! Mon code a donc un avenir, car si l'on compte sur les HP-15C originales, on est pas prêt de suivre le rythme ou la quantité !

Comme zpalm a pris le soin de me relire et signaler quelques imperfection, je me permets de rééditer mon code en tenant compte de ses remarques:
MPO106 - HP-15C (revue).gif
MPO106 - HP-15C (revue).gif (29.25 Kio) Vu 3591 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.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: MPO 106 - Distribution de bonbons

Message par C.Ret »

Schraf a écrit : 10 mars 2022 10:07Ma question est de savoir comment passer d'une liste {3 0 5 0 2 1} à une matrice du type [[3] [0] [5] [0] [2] [1]]
Sur HP-28S c'est très simple, il suffit de passer par la pile :
« LIST→ { 1 } + →ARRY STO∑»

Alternativement, comme on veux mettre une liste dans ∑Dat :
« CL∑ 1 DO GETI ∑+ UNTIL 46 FS? END »

Bon, je sais pas si ça aide sur HP-48/50 :(
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.
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: MPO 106 - Distribution de bonbons

Message par Schraf »

Merci @C.Ret, ça ne fonctionne pas sur HP-50g mais cette version devrait faire l'affaire :

Code : Tout sélectionner

« OBJ→ 1 2 →LIST →ARRY STO∑ »
Exemple avec {3 0 5 0 2 1}

Code : Tout sélectionner

OBJ→ 		Récupération de tous les éléments de la liste + nb d'éléments au niveau 1
3
0
5
0
2
1
6		Nb d'éléments

1 2 →LIST 	On crée la dimension de la matrice qui sera de 1 colonne et 6 lignes. 
3		Le "2" pour créer la liste à partir des 2 derniers éléments de la pile
0
5
0
2
1
{6. 1.}		Dimensions de la future matrice

→ARRY 		Transformation des données de la pile en matrice suivant les dimensions voulues
[3
0
5
0
2
1]

STO∑ 		Stockage pour les stats
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: MPO 106 - Distribution de bonbons

Message par Schraf »

Donc voici une version animée des programmes de @C.Ret et @bernouilli92, testé sur HP 50g :

Code : Tout sélectionner

« DUP SIZE 0 → S N                    
  « WHILE                             
      DUP SORT DUP REVLIST ≠          
    REPEAT                            
      'N' 1 STO+                      
      2 / CEIL                        
      DUP S GET OVER 1 S 1 - SUB +    
      ADD 
      DUP OBJ→ 1 2 →LIST →ARRY STO∑   		Partie ajoutée : Liste vers données statistiques
      BARPL .2 WAIT                            	Affichage histo pendant 0,2 seconde
    END                               
    N SWAP 1 GET 2 →LIST         
  »                                   
» 
10 élèves puis... 55 dans la vidéo
10 élèves puis... 55 dans la vidéo
10 eleves.jpg (47.26 Kio) Vu 3569 fois
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: MPO 106 - Distribution de bonbons

Message par C.Ret »

zpalm a écrit : 09 mars 2022 00:26Oui au moins 2 modules mémoire si je ne me trompe pas ou un quad memory.
On doit pouvoir faire avec moins de pas mais je n’ai pas encore vraiment eu le temps de chercher à optimiser.
De cette réflexion, je me suis dit, je vais utiliser toute la plage mémoire disponible, d'où la structure de donnée suivante :
R00: nbr d'élève
R01: nbr bonbons élève 1
R02: nbr bonbons élève 2
R03: nbr bonbons élève 3
R04: nbr bonbons élève 4
R05: nbr bonbons élève 5
etc...

Chaque module mémoire apporte 64 registres, il ne reste plus qu'à faire le programme le plus court possible: une première idée (41 pas - un peu mieux que 64 mais rien d'exceptionnel, c'est exactement le même algorithme que pour mes autres machines.
J'utilise l'indirection pour adresser les registres, l'index est dans la pile ainsi que le compteur.

Code : Tout sélectionner

01 ►LBL "MPO106
02              STO 00                                           ; R00 = nombre d'élèves
03              LBL 00  STOP  STO IND Y  RDN  DSE X  GTO 00      ; Boucle saisie
09              LBL 01  RCL 00  RCL 01                           ; BOUCLE PRINCIPALE 
12                      LBL 02  RCL IND Y  X≠Y?  GTO 03          ;  Si un élément est diffèrent, recalcul distribution 
16                              RDN  DSE Y  GTO 02               ;  Boucle pour test équirépartition
19              RCL Z  RTN                                       ;   Z = Compteur
	
21  LBL 03  RUP  RCL 00  RCL 01  XEQ 05  ISG Z                   ;  Initialise report et incrémente compteur
27          LBL 04  X<> IND Y  XEQ 05  ST+ IND Y  DSE Y  GTO 04  ;  Recalcule répartition des bonbons
33          RUP  GTO 01                                          ; 
	
35  LBL 05  2  ST/ Y  1/X  +  INT  RTN                           ;  calcul CEIL(x/2)
Utilisation:
Entrer le nombre n d'élèves puis XEQ [alpha]MPO106[alpha]
Puis saisir les n nombres de bonbons séparé d'un R/S (ne pas perturber l'ordre de la pile !)
La goose vole au travers de l'écran.
Le nombre de distributions est alors affiché. Presser sur [x<>y] pour obtenir le nombre de bonbons de chaque élève à l'équirépartition.


Je compte sur vous pour amender ce code, l'améliorer ou l'optimiser !
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.
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: MPO 106 - Distribution de bonbons

Message par Schraf »

Nouvelle question pour les pros des HP-48/50 : Vous me confirmez qu'il n'est pas possible d'appliquer une fonction, en l'occurrence CEIL à chacun des éléments d'une matrice, contrairement aux listes ? Et que l'on ne peut pas non plus utiliser STREAM ?

Code : Tout sélectionner

{1.5 3 2.5}	Avec une liste...
CEIL
{2 3 3}		...cela fonctionne

Code : Tout sélectionner

[1.5 3 2.5]
CEIL
--> Error

[[1.5 3 2.5]]
CEIL
--> Error
L'idée était d'utiliser une matrice plutôt qu'une liste, en particulier pour avoir un stockage direct dans ∑DAT :

Code : Tout sélectionner

En entrée : [1 2 3 4 5]

« DUP SIZE 1 GET 0 → S N                    
  « {S 1} RDM				Transformation de l'entrée en matrice colonne
  WHILE                             
    DUP OVER 1 GET CON OVER ≠		Test si matrice constante
    REPEAT                            
      'N' 1 STO+                      
      2 / CEIL				Le CEIL ne fonctionnera pas... :-(
      DUP S ROW- 1 ROW+			On déplace dernier élément de la matrice en 1ere position
      + DUP STO∑			Addition des matrices et stockage pour affichage de l'histogramme
      BARPL .2 WAIT                            
    END                               
    N SWAP 1 GET 2 →LIST         
  »                                   
»
J'imagine que c'est pour ça que vos propositions utilisent des listes, n'est-ce pas ?
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: MPO 106 - Distribution de bonbons

Message par Schraf »

En lisant le document de @FLISZT je trouve une réponse à ma question sur la transformation d'une matrice à l'aide d'une fonction...

Code : Tout sélectionner

[1.5 2 3.5 4.8]
<< CEIL >> MAP
[2 2 4 5]		Ca fonctionne !
Je pensais que le programme ci-dessous allait marcher mais le test du WHILE donne toujours VRAI même quand la matrice semble constante

Code : Tout sélectionner

En entrée : [1 2 3 4 5]

« DUP SIZE 1 GET 0 → S N                    
  « {S 1} RDM
  WHILE                             
    DUP OVER 1 GET CON OVER ≠		Le test pour savoir si la matrice est constante ne fonctionne plus...
    REPEAT                            
      'N' 1 STO+                      
      2 / « CEIL » MAP				
      DUP S ROW- 1 ROW+			On déplace dernier élément de la matrice en 1ere position
      + DUP STO∑
      BARPL .2 WAIT                            
    END                               
    N SWAP 1 GET 2 →LIST         
  »                                   
»
C'est l'histoire d'un type...

Code : Tout sélectionner

Commandes		Affichage pile
[[1.5 1.5]]		[1.5 1.5]
<< CEIL >> MAP		[2 2]
ENTER			[2 2] [2 2]
ENTER			[2 2] [2 2] [2 2]
1 GET CON		[2 2] [2 2]
==			0	Conclusion : Pour lui les 2 matrices ne sont donc pas identiques...

[[1.5 1.5]]		[1.5 1.5]
TYPE			3 	Càd matrice
[[1.5 1.5]] 		[1.5 1.5]
<< CEIL >> MAP		[2 2]
TYPE			29	Càd objet externe
Résolution du problème en mettant déjà les données dans ∑DAT, ce qui permet de faire le test MAX∑ ≠ MIN∑ pour savoir si toutes les valeurs sont égales ou non :

Code : Tout sélectionner

 Entrée : [1 2 3 4 5]

« DUP SIZE 1 GET 0 → S N                    
  « {S 1} RDM
  WHILE
    DUP STO∑ MAX∑ MIN∑ ≠
    REPEAT
      BARPL .2 WAIT
      'N' 1 STO+
      2 / « CEIL » MAP
      DUP S ROW- 1 ROW+
      +
    END
    N SWAP 1 GET 2 →LIST
  »                                   
»
En enlevant la partie affichage de l'histogramme, le programme met environ 6 minutes pour l'exemple de @dprtl avec les 300 élèves
Répondre

Retourner vers « Tous les Pockets »