495 résultats trouvés

par Schraf
18 avr. 2024 13:49
Forum : Tous les Pockets
Sujet : Misez p'tit Optimisez n°53 : la suite de Syracuse
Réponses : 169
Vues : 161152

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Je me mets à l'assembleur sur les calculatrices HP-48/49/50g. Tout n'est pas encore clair dans ma tête mais j'ai réussi à créer le programme Syracuse et franchement ça décoiffe ! J'ai repris quelques valeurs proposées par @C.Ret page 10 (Nombre de départ, temps de vol et maximum atteint), voici les temps qui sont de l'ordre du centième de seconde...

Code : Tout sélectionner

27		111	9232			0.014"
77031		350	21933016		0.019"
8388607		473	188286357652		0.022"
837799		524	2974984576		0.023"
33554431	444  	9161049517720		0.020"
75128138247	1228	319497287463520		0.034"
N=75128138247
N=75128138247
ASM_HP.jpg (47.45 Kio) Vu 38 fois
PS. J'ai utilisé la fonction TICKS pour chronométrer
par Schraf
19 mars 2024 14:19
Forum : Tous les Pockets
Sujet : Misez P'tit, Optimisez n°14 - une approximation de PI
Réponses : 37
Vues : 23081

Re: Misez P'tit, Optimisez n°14 - une approximation de PI

Traduction pour la HP-Prime du programme écrit à l'origine en C. On arrive à 2858 décimales exactes en prenant m = 2857 (Fichier hpprgm à récupérer ici)

Code : Tout sélectionner

EXPORT digitsPi(m)
BEGIN
    LOCAL n := ip(m / 2 * 7);
    LOCAL r, c, a, k, d, u, b, v; 
    LOCAL x := 0, y := 0; 
    r := MAKELIST(2000, k, 1, n); 
    r(n) := 0;
    RECT();
    c := 0;
    a := 10000;
    FOR k FROM n DOWNTO 1 STEP 14 DO
        d := 0;
        FOR u FROM k DOWNTO 1 STEP 1 DO
            d := d + r(u) * a;
            b := 2 * u - 1;
            r(u) := d MOD b;
            d := ip(d / b);
            v := d;  
            d := d * (u - 1);
        END;         
        q := "000" + STRING(c + ip(v / a));
        TEXTOUT_P(q(length(q)-3,4),x,y);
        x := x + 35;
        IF x > 300 THEN
          x := 0;
          y := y +15;
        END;
        IF y > 230 THEN 
         WHILE NOT(ISKEYDOWN(12)) DO END;
         x := 0;
         y := 0;
         RECT();
        END;
        c := v MOD a;
    END;
    WHILE NOT(ISKEYDOWN(12)) DO END;  
    RETURN;
END;
Flèche vers le bas pour passer à l'écran suivant
Flèche vers le bas pour passer à l'écran suivant
decimales.jpg (48.78 Kio) Vu 73 fois

Et traduction pour la HP-50g (relativement rapide pour 100 ou 200 décimales avec l'émulateur emu48 mais super lent sur une vraie machine) :

Code : Tout sélectionner

« 3.5 * IP DUP DUP { } +
2000 CON SWAP 0 PUT
10000. → n r a
  « 0 n 1
    FOR k 0 k 1
      FOR u r u GET
        a * + u 2 * 1 - IDIV2 r u
        ROT PUT 'r' STO
        u 1 >  « u 1 - * » IFT
       -1 STEP
       DUP a / IP ROT + R→I →STR
      WHILE DUP SIZE 4 <
      REPEAT "0" SWAP +
      END MSGBOX
      a MOD
  -14 STEP
  »
» 'DP STO

100 DP affiche 3141 au bout d'environ 1 min 30 s puis attendre encore 1 min 25 s etc.
4 décimales toutes les 1 min 30 environ
4 décimales toutes les 1 min 30 environ
HP50g.png (5.47 Kio) Vu 73 fois
par Schraf
08 mars 2024 16:26
Forum : Tous les Pockets
Sujet : Misez p'tit Optimisez n°126 : Remplir un tableau de valeurs calculées
Réponses : 28
Vues : 867

Re: Misez p'tit Optimisez n°126 : Remplir un tableau de valeurs calculées

Pentes et ordonnées à l'origine entre 2 lignes consécutives (⌊N⁴⌋, CUMUL). Par exemple l'équation de la droite entre (5, 5) et (39, 22) est y = 0.5 x + 2.5. Les pentes semblent être de la forme 1/(1+⌊N⌋) (même si ça reste à montrer) mais je ne vois pas encore la logique pour les ordonnées à l'origine que @C.Ret a d'ailleurs mises en dur dans sa HP 15C.

Code : Tout sélectionner

N	N⁴		⌊N⁴⌋	⌊N⁴⌋/⌊N⌋	CUMUL		PENTE = 1/(1+⌊N⌋)	ORDONNEE ORIGINE
1,5	5,0625		5	5		5		0,50000			2,5
2,5	39,0625		39	17		22		0,33333			9
3,5	150,0625	150	37		59		0,25000			21,5
4,5	410,0625	410	65		124		0,20000			42
5,5	915,0625	915	101		225		0,16667			72,5
6,5	1785,0625	1785	145		370		0,14286			115
7,5	3164,0625	3164	197		567		0,12500			171,5
8,5	5220,0625	5220	257		824		0,11111			244
9,5	8145,0625	8145	325		1149		0,10000			334,5
10,5	12155,0625	12155	401		1550		0,09091			445
11,5	17490,0625	17490	485		2035		0,08333			577,5
12,5	24414,0625	24414	577		2612		0,07692			734
13,5	33215,0625	33215	677		3289		0,07143			916,5
14,5	44205,0625	44205	785		4074		0,06667			1127
15,5	57720,0625	57720	901		4975		0,06250			1367,5
16,5	74120,0625	74120	1025		6000		0,05882			1640
17,5	93789,0625	93789	1157		7157		0,05556			1946,5
18,5	117135,0625	117135	1297		8454		0,05263			2289
19,5	144590,0625	144590	1445		9899		0,05000			2669,5
20,5	176610,0625	176610	1601		11500		0,04762			3090
par Schraf
07 mars 2024 19:14
Forum : Tous les Pockets
Sujet : Misez p'tit Optimisez n°126 : Remplir un tableau de valeurs calculées
Réponses : 28
Vues : 867

Re: Misez p'tit Optimisez n°126 : Remplir un tableau de valeurs calculées

Ca marche, j'ai à peu près les mêmes valeurs :

HP50gRPL.png
HP50gRPL.png (6.73 Kio) Vu 196 fois
HP50gOK.png
HP50gOK.png (6.84 Kio) Vu 196 fois
Par contre rien compris d'où venait cette formule, il faudrait que je trouve un prof de maths... 😅
par Schraf
07 mars 2024 15:31
Forum : Tous les Pockets
Sujet : Misez p'tit Optimisez n°126 : Remplir un tableau de valeurs calculées
Réponses : 28
Vues : 867

Re: Misez p'tit Optimisez n°126 : Remplir un tableau de valeurs calculées

@C.Ret : Je ne sais pas à quel endroit j'ai mal tapé ton programme mais sur ma HP-50g ça ne donne rien du tout lorsque je le lance...

???
???
mpo126.png (6.95 Kio) Vu 222 fois
par Schraf
06 mars 2024 21:41
Forum : Tous les Pockets
Sujet : Misez p'tit Optimisez n°126 : Remplir un tableau de valeurs calculées
Réponses : 28
Vues : 867

Re: Misez p'tit Optimisez n°126 : Remplir un tableau de valeurs calculées

Et ci-dessous traduction pour les HP 50g : 10.5 secondes pour 422825625, 10 secondes pour 1e9 et 17.5 secondes pour 1e10

Version HP 50g
Version HP 50g
mpo126.jpg (30.83 Kio) Vu 265 fois
par Schraf
06 mars 2024 10:41
Forum : Tous les Pockets
Sujet : Misez p'tit Optimisez n°126 : Remplir un tableau de valeurs calculées
Réponses : 28
Vues : 867

Re: Misez p'tit Optimisez n°126 : Remplir un tableau de valeurs calculées

Traduction pour le HP 15 CE (mais il semble moins rapide que ce que vous avez chronométré avec les vôtres) :

Code : Tout sélectionner

Pas	Code		Touche
1	42 34		CLEAR REG
2	44 0		STO 0
3	1		1
4	48		.
5	5		5
6	44 1		STO 1
7	5		5
8	42 21 11	LBL A
9	45 0		RCL 0
10	43 10		x ≤ y
11	22 12		GTO B
12	34		x ⇋ y
13	36		ENTER
14	42 4 3		x ⇋ 3
15	32 13		GSB C
16	1		1
17	44 40 1		STO + 1
18	45 1		RCL 1
19	4		4
20	14		y^x
21	43 44		INT
22	22 11		GTO A
23	42 21 12	LBL B
24	45 0		RCL 0
25	45 3		RCL 3
26	42 21 13	LBL C
27	30		-
28	45 1		RCL 1
29	43 44		INT
30	10		÷
31	44 40 4		STO + 4
32	45 4		RCL 4
33	43 32		RTN
par Schraf
06 mars 2024 08:59
Forum : Tous les Pockets
Sujet : Misez p'tit Optimisez n°126 : Remplir un tableau de valeurs calculées
Réponses : 28
Vues : 867

Re: Misez p'tit Optimisez n°126 : Remplir un tableau de valeurs calculées

Voici ma version pour la NUMWORKS qui répond instantanément pour l'ensemble des 3 valeurs 422825625, 1e9 et 1e10 :

Code : Tout sélectionner

def mpo126(n):
 s, i, pr, p = 0, 1.5, 0, 5
 while n > p:
  s += (p - pr) / int(i)
  i += 1
  pr = p
  p = round(i ** 4)
 return s + (n - pr) / int(i)

for n in 422825625, 1e9, 1e10: print(mpo126(n))
Code en Python ici
par Schraf
16 févr. 2024 19:39
Forum : Tous les Pockets
Sujet : Tournoi Puissance 4 sur FB
Réponses : 9
Vues : 1017

Re: Tournoi Puissance 4 sur FB

Ah !! @marge = Michel ??

Le programme que j'ai traduit pour la HP Prime est celui-ci.

Il fonctionne à peu près (mais je pense qu'il y a qq petits bugs)... Je mets le code ci-dessous juste pour info. Pour que la HP commence on tape connect4(""), sinon on tape la position de l'autre joueur, par exemple connect4(" X")

Code : Tout sélectionner

AIManager();
GetValue();
winning();
NegaMax();
PlayPosition();
Affichage();
inp, PlayOut, EVA;

black:=RGB(0,0,0);
red:=RGB(255,0,0);
yellow:=RGB(255,255,0);

EXPORT connect4(dep)
BEGIN
 LOCAL winningtp, go, k, choix, tour;
 inp:=dep;
 PlayOut:=0;
 EVA:=0;
 tour:=0;
 DIMGROB_P(G2,30,30,black);
 ARC_P(G2,15,15,12,red);
 DIMGROB_P(G3,30,30,black);
 ARC_P(G3,15,15,12,yellow);
 FOR k FROM 1 TO 80 - DIM(inp) DO inp:= inp + " "; END;
 go:= 1;
 WHILE go==1 DO
  IF tour==0 THEN
   tour:=1;
   choix:=AIManager();
  ELSE
   choix:=AIManager();
  END;
  inp(choix):="O";
  //MSGBOX("HP : " + (1 + mod(choix-1,7)));
  Affichage(choix);
  winningtp:=winning();  
  CASE
   IF winningtp==1 THEN MSGBOX("Tu gagnes !"); go:=0; END;
   IF winningtp==2 THEN MSGBOX("Je gagne !"); go:=0; END;
   IF winningtp==3 THEN MSGBOX("Egalite ! "); go:=0; END;
   PlayPosition("X");
  END;
 END;
 Affichage(-1);
END;

Affichage(choix)
BEGIN
LOCAL l,c,v;
 RECT_P(0,0,319,219,black);
 IF choix > 0 THEN
  TEXTOUT_P("HP: "+(1 + mod(choix-1,7)),15,105,2,yellow); END;
 IF choix == 0 THEN
  TEXTOUT_P("I THINK...",15,105,2,yellow); END;
 IF choix == -1 THEN
  TEXTOUT_P("GAME\nOVER",15,105,2,yellow); END;
 FOR l FROM 0 TO 5 DO
  FOR c FROM 1 TO 7 DO
   v:=inp(7*l+c);
   IF v==88 OR v==79 THEN
   BLIT_P(40+30*c,180-30*l,IFTE(v==88, G2, G3));
   END;
   IF l==0 THEN TEXTOUT_P(c,55+30*c,10,2,yellow); END;
  END;
 END; 
END;

winning()
BEGIN
LOCAL tp, k;
 tp:=0;
 FOR k FROM 1 TO 42 DO
  IF (inp(k) <> 32) THEN
   tp:=tp+1;
   IF k - floor((k-1)/7) * 7 <= 4 THEN
    IF inp(k)==inp(k+1) AND inp(k)==inp(k+2) AND inp(k)==inp(k+3) THEN
     IF inp(k)==88 THEN RETURN 1 ;
     ELSE RETURN 2;
     END;
    END;
   END;
   IF k <= 21 THEN
    IF inp(k)==inp(k+7) AND inp(k)==inp(k+14) AND inp(k)==inp(k+21) THEN
     IF inp(k)==88 THEN RETURN 1 ;
     ELSE RETURN 2;
     END;
    END;
   END;
   IF k - floor((k-1)/7) * 7 <= 4 AND k<=18 THEN
    IF inp(k)==inp(k+8) AND inp(k)==inp(k+16) AND inp(k)==inp(k+24) THEN
     IF inp(k)==88 THEN RETURN 1 ;
     ELSE RETURN 2;
     END;
    END;
   END;
   IF k - floor((k-1)/7) * 7 >= 4 AND k <= 21 THEN
    IF inp(k)==inp(k+6) AND inp(k)==inp(k+12) AND inp(k)==inp(k+18) THEN
     IF inp(k)==88 THEN RETURN 1 ;
     ELSE RETURN 2;
     END;
    END;
   END;
  END;   
 END;
 IF tp==42 THEN
  RETURN 3;
 END;
 RETURN 0;
END;

NegaMax(Depth)
BEGIN
 LOCAL XO, tp, PlayNb, chance, col;
 PlayNb:={0,0,0,0,0,0,0,0}; 
 chance:=0;
 IF mod(Depth,2) <> 0 THEN XO:="X";
 ELSE XO:="O";
 END;
 FOR col FROM 1 TO 7 DO
  PlayNb(col):=GetValue(col);
 END;
 FOR col FROM 1 TO 7 DO
  IF PlayNb(col) <> 0 THEN
   inp(PlayNb(col)):=XO;
   IF winning() <> 0 THEN
    PlayOut:=PlayOut + 1;
    IF XO=="O" THEN EVA:=EVA + 1;
    ELSE EVA:=EVA - 1;
    END;
    inp(PlayNb(col)):=" ";
    RETURN -1;
   END;
   inp(PlayNb(col)):=" ";
  END;
 END;
 IF Depth <= 4 THEN
  FOR col FROM 1 TO 7 DO
   tp:=0;
   IF PlayNb(col) <> 0 THEN
    inp(PlayNb(col)):=XO;
    IF winning() <> 0 THEN
     PlayOut:=PlayOut + 1;
     IF XO=="O" THEN EVA:=EVA + 1;
     ELSE EVA:=EVA - 1;
     END;
     inp(PlayNb(col)):=" ";
     RETURN -1;
    END;
    tp:=NegaMax(Depth+1);
    IF col==1 THEN chance:=tp; END;
    IF chance < tp THEN chance:=tp; END;
    inp(PlayNb(col)):=" ";
   END;
  END;
 END;
 RETURN -chance;
END;

GetValue(col) 
BEGIN
LOCAL n,k;
 n:=0;
 IF col > 7 THEN RETURN 0; END;  
 FOR k FROM 0 TO 6 DO
  IF inp(col+7*k)==32 THEN
   n:=col+7*k;
   BREAK;
  END;
 END;
 IF n > 42 THEN RETURN 0; END;
 RETURN n;
END;

AIManager()
BEGIN
LOCAL chance, col, PlayNb, tp;
 chance:={9999999 , 1 };
 FOR col FROM 1 TO 7 DO
  PlayOut:=0;
  EVA:=0;
  PlayNb:=GetValue(col);
  IF PlayNb <> 0 THEN
   inp(PlayNb):="O";
   IF winning()==2 THEN
    inp(PlayNb):=" ";
    RETURN PlayNb ;
  END;
   tp:=-(100*NegaMax(1));
   IF PlayOut <> 0 THEN tp:=tp -(100*EVA)/PlayOut; END;
   IF chance(1) > tp THEN
    chance(1):=tp;
    chance(2):=PlayNb;
   END;
   inp(PlayNb):=32;
  END;
 END;
 RETURN chance(2);
END;

PlayPosition(XO) 
BEGIN
 LOCAL col, down;
 DIMGROB_P(G4,10,10,black);
 ARC_P(G4,5,5,4,red);
 DIMGROB_P(G5,10,10,black);
 col:=1;
 down:=0;
 BLIT_P(52+30*col,20,G4);
 WHILE down==0 DO
  IF ISKEYDOWN(7) THEN
   BLIT_P(52+30*col,20,G5);
   col:=max(1, col-1);
   BLIT_P(52+30*col,20,G4);
   WAIT(.2);
  END;
  IF ISKEYDOWN(8) THEN
   BLIT_P(52+30*col,20,G5);
   col:=min(7, col+1);
   BLIT_P(52+30*col,20,G4);
   WAIT(.2);
  END;
  IF ISKEYDOWN(12) THEN
   down:=1;
  END;
 END;
 col:=GetValue(col);
 inp(col):=XO;
 Affichage(0);
 RETURN;
END;
par Schraf
06 févr. 2024 13:33
Forum : Tous les Pockets
Sujet : Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Réponses : 74
Vues : 34342

Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?

@tyann : En nb d'octets oui, je me demandais juste si niveau vitesse...

Version récursive pour HP 50g semblable à celles proposées par @C.Ret il y a... 4 ans :

Code : Tout sélectionner

« 2 IDIV2 SWAP DUP «  B° » IFT + »
'B°' STO
IDIV2 permet de trouver le quotient (niveau 2) + le reste (niveau 1) d'une division
Tant que le quotient (mis au niveau 1 avec SWAP) n'est pas nul on continue à appliquer la division, puis on remonte en faisant les sommes. Exemple avec 22 :

Code : Tout sélectionner

22
« 2 IDIV2 SWAP »	0	11
« 2 IDIV2 SWAP »	0	1	5
« 2 IDIV2 SWAP »	0	1	1	2
« 2 IDIV2 SWAP »	0	1	1	0	1
« 2 IDIV2 SWAP »	0	1	1	0	1	0
+			0	1	1	0	1
+			0	1	1	1
+			0	1	2
+			0	3
+			3
par Schraf
06 févr. 2024 11:14
Forum : Tous les Pockets
Sujet : Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Réponses : 74
Vues : 34342

Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?

@C.Ret
Mais, que fait-on des touches parenthèses ?? :mrgreen: :mrgreen:
Je te laisse deviner avant la très prochaine mise en ligne de ma vidéo de présentation !

@tyann : Ligne 3 c'est plutôt PRT B. La fonction SGN est intéressante mais a priori c'est plus rapide avec juste une multiplication par 2 à la fin non ?

Code : Tout sélectionner

1 VAC:INPUT A
2 A=INT A/2:B=B+FRAC A:GOTO 3-SGN A
3 PRINT 2*B
par Schraf
05 févr. 2024 12:12
Forum : Tous les Pockets
Sujet : Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Réponses : 74
Vues : 34342

Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?

Je suis en train de préparer une petite vidéo de présentation de l'application RPN83P qui permet d'avoir une calculatrice RPN sur une TI 83+ ou 84+. Le projet est actuellement en évolution mais déjà pas mal de fonctionnalités intéressantes, en particulier il y a les fonctions arithmétiques du HP 16C ce qui permet de répondre à ce MPO. Comme cette calculatrice RPN n'est pas encore programmable (c'est dans les projets du créateur), je ne peux donner que la commande qui est CNTB (Count BIT)

Nombre de bits à 1 dans 20220903
Nombre de bits à 1 dans 20220903
cntb.jpg (35.89 Kio) Vu 319 fois

En savoir plus sur l'appli : https://github.com/bxparks/rpn83p
par Schraf
24 janv. 2024 14:49
Forum : Tous les Pockets
Sujet : Equation du second degré avec une calculatrice "4 opérations"
Réponses : 35
Vues : 1237

Re: Equation du second degré avec une calculatrice "4 opérations"

Et ça fonctionne même sur une calculatrice 4 opérations où il n'y a ni M+, ni M- mais juste M pour stocker ou récupérer la valeur.

Démarrage avec 3 = M comme valeur approchée de la racine carrée, et ensuite 6 / M + M / 2 = M répétés plusieurs fois

Démo en vidéo
par Schraf
24 janv. 2024 13:29
Forum : Tous les Pockets
Sujet : Equation du second degré avec une calculatrice "4 opérations"
Réponses : 35
Vues : 1237

Re: Equation du second degré avec une calculatrice "4 opérations"

@MangeGrain : A voir si cette version fonctionne sur ta CASIO, toujours pour √6

Code : Tout sélectionner

AC 6 M+	Initialisation avec 6 comme valeur approchée de √6, on voit large !

Répéter les 2 lignes suivantes : 

6 / MR = M+	Le = n'est peut-être pas nécessaire, sur certaines machine le fait t'appuyer sur M+ lance le calcul
MR / 2 = M-	Idem, le = pourra peut-être s'enlever
L'idée est que l'on doit calculer 6 / x + x or x est déjà en mémoire M d'où la première ligne.
Ensuite on doit diviser le résultat de M par 2, on enlève donc la moitié.
par Schraf
24 janv. 2024 11:03
Forum : Tous les Pockets
Sujet : Equation du second degré avec une calculatrice "4 opérations"
Réponses : 35
Vues : 1237

Re: Equation du second degré avec une calculatrice "4 opérations"

Pour les racines carrées il y a une méthode de calcul qui converge très rapidement, c'est celle des suites adjacentes.

Il suffit que la calculatrice 4 opérations ait la touche MC (effacement de la mémoire M).

Exemple avec √6 = 2.4494897 :

On part de 2 valeurs qui encadrent la solution 2*2 = 4 et 3*3=9 donc la valeur cherchée est entre 2 et 3.

Etape 1 : Somme des termes qui encadrent la valeur cherchée 2 + 3 =
Etape 2 à répéter jusqu'à avoir une valeur stable (ou quand on en a marre) :

Code : Tout sélectionner

/ 2 = MC M+
6 / MR + MR = 	(Le = n'est pas obligatoire si la machine ne connait pas les priorités)
On obtient successivement à l'affichage :

Code : Tout sélectionner

5		2 + 3
2.5		/ 2
4.9		6 / 2.5 + 2.5
2.45		/ 2
4.89897959	6 / 2.45 + 2.45
2.4494897	/ 2
On a 7 décimales exactes en seulement 2 itérations...

Aller à la recherche avancée