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
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 »

Je ne sais pas pour vous, mais j'ai du mal à visualiser ce qu'il se passe au fil des différents partages entre les enfants, ça m'a donné l'idée d'améliorer le programme Python pour obtenir :

Visualisation des partages
Visualisation des partages
bonbons.png (13.13 Kio) Vu 3897 fois
Tout en haut de l'écran le partage initial, en l'occurrence ici j'ai mis un nombre aléatoire entre 1 et 200 bonbon(s) pour un enfant sur 4 (les autres ont donc 0 bonbon). En noir ceux qui n'ont rien, en niveaux de rouge ceux qui ont au moins un bonbon. Quand la ligne est remplie avec le même rouge, c'est que le partage est terminé.
Je suis parti avec 160 enfants car l'écran de la calculatrice fait 320 pixels de large

La ligne du dessous donne la répartition après le premier partage, la suivante le 2e partage etc.

Testez le programme ici (Actualisez la page pour une nouvelle répartition)

Code : Tout sélectionner

from math import ceil
from kandinsky import fill_rect
from random import randint

def affiche(l,c):
    m = max(c)  # maxi bonbons parmi les enfants
    for (i,v) in enumerate(c):
        coul = int(255 * v / m) # variation de la couleur rouge
        fill_rect(2*i, l, 2, 1, (coul,0,0)) # rectangle 2*1 pixels

def MPO106():
    t = 0
    Bo = [0 if k%4 == 0 else randint(1,200) for k in range(160)]    # initialisation repartition
    while max(Bo) != min(Bo):
        Bo = [ceil(b/2) + ceil(Bo[k-1]/2) for (k,b) in enumerate(Bo)]
        affiche(t, Bo)
        t += 1
    return Bo[0]

MPO106()
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6186
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: MPO 106 - Distribution de bonbons

Message par Marge »

Merci, Schraf, je vais tenter cela sur ma NW. Ça va néanmoins prendre un peu de temps, je ne connais rien au pyhon - mais j'ai bien envie d'essayer !
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é.
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 »

@Marge : En cliquant sur le lien que j'ai proposé, il suffit de connecter sa NW et d'appuyer sur le bouton "Envoyer sur ma calculatrice"
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 version en vidéo des étapes de la distribution des bonbons. Au démarrage un seul enfant a des bonbons (200 dans la vidéo), on voit le nombre de tours augmenter avec le minimum et le maximum de bonbons dans le cercle.

Vous pouvez tester (et améliorer) le programme ici.

91e tour avec un démarrage de 200 bonbons
91e tour avec un démarrage de 200 bonbons
VisuelCercle.png (6.58 Kio) Vu 3855 fois
Etat final de la distribution
Etat final de la distribution
final.png (6.3 Kio) Vu 3855 fois
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3418
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: MPO 106 - Distribution de bonbons

Message par C.Ret »

badaze a écrit : 05 mars 2022 00:00 Version en Basic.

Code : Tout sélectionner

[...]
 500 : "AFFICHE":CLS
 510 : A$ = "OK"
 520 : IF OK=0 LET A$ = "OK"
 530 : WAIT 0
 540 : PRINT A$ + " " + STR$(N) + "<"
 550 : FOR I=1 TO 8
 560 :   PRINT STR$(A(AI)) + " ";
 570 : NEXT I
 580 : RETURN
J'ai essayé de transformer la version de Badaze pour mon SHARP PC-1211, mais j'ai eut du mal avec l'affichage de la liste. la gestion de l'affichage sur le PC-1211 est très rudimentaire.

En laissant tomber l'affichage des listes de bonbons intermédiaires, je suis arrivé à ce code qui permet de traiter au maximum 20 élèves:

Code : Tout sélectionner

     // R.A.Z.
1:CLEAR                                                                                          4 o
     // Boucle de saisie  Y= nb d'élèves    [ A(1) ... A(Y) ] bonbons
2:INPUT X:Y=Y+1,A(Y)=X,U=Y:GOSUB 9:GOTO 2                                                       28 o
     // Boucle de calculs Z= compteur de distributions 
3:U=Y:IF W IF Y>1 GOSUB 8:W=0,Z=Z+1:FOR U=1 TO Y:X=V:GOSUB 8:A(U)=X+V:GOSUB 9:NEXT U:GOTO 3     57 o
     // Affiche (c,r) 
4:PRINT Z,A:END                                                                                  9 o
     // V= CEIL A(U)
8:V=INT (A(U)/2+.5:RETURN                                                                       18 o
     // W= 0 si tous éléments ont même valeur [ a a a ... a ]
9:W=W+(A<>A(U):RETURN                                                                           17 o
                                                                                          TOTAL 133 o
Variables:
A:
à: nombres de bonbons pour chaque élèves A=A(1) B=A(2) ... T=A(20)
T:
U: indice/boucle
V: CEIL( A(U)/2 )
W: Drapeau, zéro si tous les élèves ont le même nombre (équirépartition des bonbons)
X: variable
Y: Nombre d'élèves
Z: Nombre de distribution de bonbons

Usage:
Taper RUN [ENTER] pour lancer le programme
Saisir le tableau en validant chaque nombre de bonbons initial par [ENTER]
Presser [ENTER] sans rien entrer pour lancer le calcul.
Après quelques dizaines de secondes, le PC-1211 affiche le nombre de distribution et de bonbons que possède chaque élève une fois l'équirépartition obtenue.

Exemple:

Code : Tout sélectionner

Keystrokes                 Affichage                    Commentaire
R U N [ENTER]              ?                            Saisie des données
5 [ENTER]                  ?
1 [ENTER]                  ?
4 [ENTER]                  ?
3 [ENTER]                  ?
2 [ENTER]                  ?
[ENTER]                              2.          4.     Affichage compteur et nombre final de bonbons 
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 : 3418
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: MPO 106 - Distribution de bonbons

Message par C.Ret »

bernouilli92 a écrit : 04 mars 2022 22:49Pas mal l'astuce du CON pour vérifier quand c'est fini.
Ce n'est pas réellement une astuce, mais un peu un passage obligé, le jeu d'instruction du HP-28S étant moins étoffé.

Code : Tout sélectionner

Version HP-48/50                        Version HP-28S                                   Delta
« DUP SIZE 0 → S N                    | « 0 FIX 0 SWAP                                     -1
  « WHILE                             |   WHILE                                            -1
      DUP SORT DUP REVLIST ≠          |     DUP OVER 1 GET CON OVER ≠                      +1
    REPEAT                            |   REPEAT 
      'N' 1 STO+                      |     1 ROT + SWAP                                   -1
      2 / CEIL                        |     2 / RND                                         0
      DUP S GET OVER 1 S 1 - SUB +    |     DUP ARRY→ 1 GET → n « n ROLLD n →ARRY »        +1
      ADD                             |     +                                               0
    END                               |   END                                               0
    N SWAP 1 GET 2 →LIST              |   1 GET R→C STD                                    -2
  »                                   | »                                                   0
»                                     |                                                    -1

Je ne peux sur HP-28S utiliser de listes car elles ne peuvent être utilisées dans les calculs. De ce fait, l'utilisation d'un tableau (ARRAY) induit aussi quelques différences. En particulier, je ne peux utiliser l'instruction SUB !
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 : 3418
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: MPO 106 - Distribution de bonbons

Message par C.Ret »

Bon, j'ai eut du mal avec mon nouvel engin :
une Ti-58c peut donc gérer une classe de 47 élèves - registres R00:Index { R01 à R47 }:tableau R48:compteur R49:nbr d'élèves + 73 pas de programme - résultats à l'affichage (compteur) et dans le registre t (valeur finale équirépartition des bonbons)

Mais ce n'est rien par rapport aux résultats obtenus avec un matériel plus familier:
une HP-15C peut gérer une classe de 55 élèves - registres R0 et R1:index R2:valeur finale I:compteur A:tableau + 44 pas de programme.

Dommage que je n'ai pas de Ti-59, celle-ci avec le même code que ma Ti58c pourrait sans souci gérer une classe de 87 élèves.

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 ?
?
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 : 2929
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: MPO 106 - Distribution de bonbons

Message par zpalm »

C.Ret a écrit : 06 mars 2022 21:12 Quel est la ronde la plus importante que vous puissiez calculer ?
?
Sur HP-41C j’en suis à 98 élèves pour 64 pas de programme.
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6186
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: MPO 106 - Distribution de bonbons

Message par Marge »

Schraf a écrit : 06 mars 2022 08:57 @Marge : En cliquant sur le lien que j'ai proposé, il suffit de connecter sa NW et d'appuyer sur le bouton "Envoyer sur ma calculatrice"
Oui, bien sûr, merci. Mais je veux comprendre, donc y passer un peu de temps quand j’en aurai !
Tes connaissances me seront certainement utiles dans un avenir proche. :)
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é.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3418
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 : 06 mars 2022 22:37
C.Ret a écrit : 06 mars 2022 21:12Quel est la ronde la plus importante que vous puissiez calculer ?
Sur HP-41C j’en suis à 98 élèves pour 64 pas de programme.
Ce doit être une HP-41C dopée en module mémoire ? Non ?
Il faut vraiment autant de pas de programme ?

Je vais voir ce que je peux faire : en attendant, voici le détail du code pour une Ti-58/Ti-58c. Les Ti-59 peuvent en faire autant, voir même plus.

Préparation:
Partitionner la TI-58c afin qu'elle puisse avoir une cinquantaine de registre mémoire par :
5 2nd OP 17
Elle affiche alors 79.49 pour indiquer qu'il y a jusqu'à 79 pas de programme et cinquante registre (de R00 à R49).

Code:
MPO106 - TI-58c.gif
MPO106 - TI-58c.gif (28.29 Kio) Vu 3743 fois
Utilisation:
Avant de saisir un nouveau tableau de données, faire 2nd CMS afin d'effacer le contenu de tous les registres.
Puis saisir le premier éléments du tableau et presser sur la touche utilisateur [ A ].
Le programme du Label A incrémente à chaque fois le registre R00 qui sert d'index. les éléments sont mémorisés dans les registres R01, R02, R03, ... jusqu'à R47; Les éléments suivants peuvent être indifféremment introduit en pressant à nouveau la touche A ou en les séparant d'une pression sur R/S.

Le calcul est lancé en pressant sur B. Après avoir distribué les bonbons et atteint une équirépartition, le nombre de cycle est affiché. Le registre t contient le nombre de bonbons identique. Une pression sur x:t permet de l'afficher.

Pour les Ti-59, on pourra choisir une répartition différente afin de pouvoir gérer une ronde contenant un plus grand nombre d'élèves. Mais il faudra aussi modifier le code afin d'utiliser des registres plus élevés pour remplacer respectivement R48 (qui contient le compteur de cycle) et R49 (où est sauvegardé le nombre d'élèves dans la ronde). Le registre test utilisé pour tester si tous les éléments ont une même valeur. C'est bien pratique, car t contient donc à la fin le nombre de bonbons que possède chaque élève à la fin des cycles.


principe de fonctionnement:
Test d'équirépartition: si un des éléments du tableau n'est pas égal à R01, alors le calcul du cycle suivant de partage des bonbons est lancé.
Partage des bonbons: Pour chaque élément i du tableau, la valeur CEIL(R(i+1)/2) est échangée avec le contenu du registre R(i). On calcul alors CEIL(R(i)/2) qui est ajouté à R(i). La valeur CEIL(R(i)/2) reste dans le registre d'affichage et sert de valeur d'échange pour le registre suivant.
En réalité, la boucle utilise Dsz, donc l'index R00 = i diminue. Donc, pour initialisé le calcul, je commence par calculer CEIL(R01/2) qui sera échanger avec le dernier élément du tableau....

Exemple:
2nd CMs 1 A 2 R/S 3 R/S 4 R/S 5 R/S B affiche 6 puis x:t affiche 6 en 0'48"6
et
2nd CMs 10 A 2 A 8 A 22 A 16 A 4 A 10 A 6 A 15 A 20 A B affiche 12 et x:t affiche 18 en 2'40"2
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 : 2929
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: MPO 106 - Distribution de bonbons

Message par zpalm »

C.Ret a écrit : 08 mars 2022 21:08
zpalm a écrit : 06 mars 2022 22:37Sur HP-41C j’en suis à 98 élèves pour 64 pas de programme.
Ce doit être une HP-41C dopée en module mémoire ? Non ?
Il faut vraiment autant de pas de programme ?
Oui 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.
C.Ret a écrit : 08 mars 2022 21:08Code:
MPO106 - TI-58c.gif
Joli programme ! Il traite aussi le cas d’un seul élève?
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3418
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:26 Joli programme ! Il traite aussi le cas d’un seul élève?
Oui, la Boucle de test (instructions 029 à 042) commence par remettre dans R00 le nombre d'élèves (cf. Sub-008) puis échange R01 avec le registre de test t. Ensuite une boucle Dsz décrémente l'index R00 et test à chaque fois t avec le registre R(00) (cf. RCL Ind 0 ). S'il n'y a pas égalité, cela déclenche le Calcul d'une nouvelle distribution (Pas 046 est suivants).

Dans le cas d'un seul élève (R49=R00=1), le registre t (qui contient R01) est comparé avec RCL IND 00 qui est justement R01 et donc, aucun recalcul n'est déclenché et l'on sort directement en affichant R48 qui vaut zéro (et t qui contient l'unique valeur du tableau).
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 »

@C.Ret, j'ai tapé ton excellent programme pour les Ti-58/59 sur mon téléphone, il fonctionne nickel et les résultats sont... quasi instantanés ! Démo en vidéo ici
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3418
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: MPO 106 - Distribution de bonbons

Message par C.Ret »

Non non non non, même sur une Ti-59, il faut plusieurs dizaines de seconde, ton téléphone est cassé !!

En plus, je ne te vois pas faire 2nd CMs avant de saisir le tableau initial ! C'est pas bien, rien dans mon code ne remet R48 à zéro? Tu risques d'obtenir des résultats erronés (bon peut-être que tu t'en moques vu que t'utilise un téléphone détraqué.
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 »

@C.Ret : Mais si bien sûr que j'ai effacé les mémoires avant d'entrer les différents tests, on me voit taper 2nd CMs à la 15e seconde de la vidéo et je l'avais fait avant la première saisie. Par contre pas besoin de partitionner Pas<>Mémoires avec la version Android, on a 100 mémoires et assez de pas.

Mais dommage que l'écran d'un téléphone soit plat et que l'on ait pas le relief des touches, ça ferait une machine sympa.
Répondre

Retourner vers « Tous les Pockets »