Misez P'tit, Optimisez n°49 : un compte à rebours

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 :

Misez P'tit, Optimisez n°49 : un compte à rebours

Message par dprtl »

Voici une proposition de MPO qui devrait être réalisable sur la plupart des pockets et calculatrices programmables, suffisamment rapides, avec plus ou moins de difficulté (routine en assembleur éventuellement...). Il s'agit d'écrire un programme qui affiche un compte à rebours de 10 jusqu'à 0, qui dure 10 secondes au total, aussi précisément que possible.

Par exemple, en scripting shell (bash ou zsh, plus ou moins hors sujet sur pocket), voici ce que ça donne :

Code : Tout sélectionner

#!/bin/bash
for i in `seq 10 -1 0`
do
  echo $i
  sleep 1
done
Sur certaines machines, comme la WP-34S, c'est un jeu d'enfant... Mais pour les autres ? Mon MPO est-il vraiment trop facile ? :)

Pour augmenter la difficulté, vous pouvez tenter l'exercice sur le même compte à rebours de 10 secondes, en affichant le décompte tous les dixièmes de seconde. Voici une version qui réalise ça sur WP-34S en 14 pas (affichage plus joli en mode FIX 1 avant de le lancer) :

Code : Tout sélectionner

001 1
002 0
003 0 
004 STO 00
005 LBL 01
006 RCL 00
007 1
008 0
009 /
010 PSE 01
011 DSE 00
012 GTO 01
013 0
014 RTN
Remarque : le déroulement du programme complet prend forcément un peu plus de 10s... mais l'écart n'est pas quasiment pas mesurable au chrono à main.

Pour d'autres énoncés de MPO, tous plus agaçants et passionnants les uns que les autres, consultez le sommaire des MPO.
Modifié en dernier par dprtl le 05 janv. 2014 09:42, modifié 2 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: Misez P'tit, Optimisez n°49 : un compte à rebours

Message par C.Ret »

Aïeh AieH Aiouille !

Je ne peux pas afficher les nombres de 10 à 0 en moins de 15s sur mon SHARp PC-1211.

J'ai beau chercher comment faire, il me faut au minimum 14 secondes et 33 centièmes !

Code : Tout sélectionner

1 FOR A=10TO 0STEP -1:PAUSE A:NEXT A
Et encore, je triche en mettant en route mon chronomètre à l'aparition de 10 et en l'arrêtant dès que s'affiche 0.

Pas ouvert à tous les sacefetplus ce M.P.O. !! Faut une machine puissante ! Et surtout rapide.


Bon, pour une HP-28S modèle avec ROM 2BB:

Code : Tout sélectionner

« 10
  CLLCD
  WHILE DUP
  REPEAT 
     1 - DUP 2 DISP
     #11CAh SYSEVAL
     DO
     UNTIL
        #11CAh EVAL OVER - #1E00h >
     END
     DROP
  END
  CLMF
»
Note: Pour utiliser ce code sur une HP-28C il faut changer l'adresse du SYSEVAL en #123Eh pour les version 1BB ou en #1266h pour les versions 1CC.
Queque soit l'HP28C/S, il faut aussi que le "binary word size" soit au minimum de 16bits; Ce qui est facile à contrôler avec la commande STWS

Et comme il s'agit d'un MPO, voici une version compilée:

Code : Tout sélectionner

« DO 
     #11CAh SYSEVAL #1E00h / B->R NEG 11 MOD 1 DISP 
  UNTIL KEY END
»
Dans cette dernière version, les nombres de 10 à 0 s'affichent à chaque seconde jusqu'à ce que l'on appuie sur une touche.
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
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5230
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

Re: Misez P'tit, Optimisez n°49 : un compte à rebours

Message par bernouilli92 »

Voici ma version pour hp48 et compatibles :

Code : Tout sélectionner

« 
  10 0 
  FOR I 
    I 1 DISP 
    1 WAIT
  -1 STEP
»
Mais pas sûr qu'on ne puisse pas faire mieux au niveau timing en replaçant 1 WAIT par quelque chose du genre 0.95 WAIT
HP, Casio, Sharp, Psion, quelques TI et divers autres
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: Misez P'tit, Optimisez n°49 : un compte à rebours

Message par C.Ret »

Oh!

Je viens de découvrir que le code de Bernouilli fonctionne parfaitemetn sur mon HP-28S !

Ben mince alors.

Code : Tout sélectionner

« 10 0 FOR i i 1 DISP 1 WAIT -1 STEP »

Du coup je propose un code MOP-iser (pour tenter de ratrapper mon code monstrueusement compliqué) et corrigé le code de notre ami où se répète les 1 et se confondent les i et !

Code : Tout sélectionner

« 10 DO 1 - LAST DISP LAST WAIT UNTIL NOT END »
l7h5.png
l7h5.png (56.34 Kio) Vu 2911 fois
Modifié en dernier par C.Ret le 23 mars 2022 21:53, modifié 3 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
dprtl
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 463
Enregistré le : 27 janv. 2013 00:26
Localisation : Strasbourg
Contact :

Re: Misez P'tit, Optimisez n°49 : un compte à rebours

Message par dprtl »

Même problème que la SHARP PC-1211 : la TI-66 est trop lente pour afficher un décompte de 10 à 0. On s'en sort en trichant un peu :

Code : Tout sélectionner

000 1
001 0
002 STO
003 00
004 0
005 x<>t
006 RCL
007 00
008 LBL
009 A
010 PAU
011 4
012 INV
013 SUM
014 00
015 RCL
016 00
017 x>=t
018 A
019 NOP
020 CLR
021 R/S
022 RST
Du coup l'exécution totale demande environ 10 secondes (le plus important), mais on affiche seulement : 10, 6, 2 et 0.
Avatar du membre
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 454
Enregistré le : 13 janv. 2013 19:44
Localisation : Marseille-est

Re: Misez P'tit, Optimisez n°49 : un compte à rebours

Message par babaorhum »

Salut tout le monde,
EDIT : correction - c'est de 10 à 0 ...
Donc, une bétise pour commencer ... sur ma 41CX :

Code : Tout sélectionner

 LBL 'SS -1 E-3 SETSW SW RTN
XEQ 'SS R/S et en plus sa bip arrivé à zéro !!
Et j'ai étalonné mon PC-1500 avec le code suivant :

Code : Tout sélectionner

10 "C" REM CHRONO 10S
20 WAIT 59:FOR I = 10 TO 0 STEP -1:PRINT I:NEXT I
lancer DEF C, et ca marche a peu près au 1/10ème de seconde (sur les 10 secondes) sur le mien, mais c'est probablement pas universel la durée du WAIT sur les 1500 ?
Voili pour ce soir ...
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
Avatar du membre
dprtl
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 463
Enregistré le : 27 janv. 2013 00:26
Localisation : Strasbourg
Contact :

Re: Misez P'tit, Optimisez n°49 : un compte à rebours

Message par dprtl »

Voici une version un peu différente pour Casio PB-1000. Comme elle fait appel à l'horloge interne, la précision est valable ; malgré la première seconde un peu raccourcie. On pourrait sans problème faire d'autres calculs entre les itérations :

Code : Tout sélectionner

10 I=10:A$=""
20 B$=MID$(TIME$,7,2)         # on prend 2 caractères à partir de la 7e position : les secondes
30 IF A$<>B$ THEN PRINT I:I=I-1:A$=B$
40 IF I>=0 THEN 20
Malheureusement, ce programme ne fonctionne pas tel quel sur PB-2000C, car l'accès à l'horloge interne a été retiré du Basic :(
Avatar du membre
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5230
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

Re: Misez P'tit, Optimisez n°49 : un compte à rebours

Message par bernouilli92 »

@ C.Ret : pas mal, 4 octets de moins, 45,5 octets contre 49,5
Par contre cela ne fonctionne pas si LASTARG est désactivé (flag -55), mais bon on ne va pas chipoter. Je reste impressionné.
Modifié en dernier par bernouilli92 le 11 déc. 2013 18:03, modifié 1 fois.
HP, Casio, Sharp, Psion, quelques TI et divers autres
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: Misez P'tit, Optimisez n°49 : un compte à rebours

Message par C.Ret »

Merci Bernouilli92,

Mais il n'y a rien d'impressionant c'est juste 4 octets.
Ce qui m'amuse beaucoup c'est effectuvement d'avoir pu éviter la répétition des 1 tout en évitant les habituels DUP OVER et autres ROLL ou ROLLD .

Le RPL c'est quand même un drôle de truc !
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.
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez P'tit, Optimisez n°49 : un compte à rebours

Message par Gilles59 »

Puisqu'on est dans le miser petit ;

Code : Tout sélectionner

 « 10 1 OVER START DUP 1 DISP 1 WAIT 1 - NEXT »
Fait 44 octets soit 1,5 octets de moins ...

Code : Tout sélectionner

« 1 ALOG 1 OVER START DUP 1 DISP 1 WAIT 1 - NEXT »
fait 42,5 octets (car les chiffres 0 à 9 sont codés de façon 'compacte')

Pour Casio FX602P, en 18 pas :

Code : Tout sélectionner

10 Min01
LBL0
 "AR01"
 40 Min00
 LBL1 DSZ GOTO1
 1 M-01 
MR01 x>=0 GOTO0
Sur 603P, bonne occas pour utiliser un des deux timers pour une précision parfaite. J'y reviendrais !
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez P'tit, Optimisez n°49 : un compte à rebours

Message par Gilles59 »

Une version très précise sur Casio FX-603P qui utilise le timer découvert par Xerxes. Ce timer se révèle ici plus pratique que celui que j'ai découvert car il peut s'initialiser avec une valeur :

Code : Tout sélectionner

205 POKE 0885      // Initialise le timer (18,7 Hz) à 10,96 sec ;D 
MinF               // Pour s'arréter quand le timer boucle <0
1 POKE 0884        // Démarre le timer. 
M+F                // Pour ne pas sortir à la première boucle

LBL0
 PEEK 0885         // Lit le timer
 x>=F GOTO9        // On a bouclé 0 -> 255 alors on sort
 / 18.7 = INT "#"  // Transforme les 18,7 Hz en secondes et affiche
GOTO0              // on continue

LBL9               // 11 secondes on passé...
 0 POKE 0884       // Stoppe le timer
 "; -> FIN"
  
Petite variation pour un affichage au 1/100ieme de seconde :

Code : Tout sélectionner

205 POKE 0885      // Initialise le timer (18,7 Hz) à 10,96 sec ;D 
MinF               // Pour s'arréter quand le timer boucle <0
1 POKE 0884        // Démarre le timer. 
M+F                // Pour ne pas sortir à la première boucle

LBL0
 PEEK 0885         // Lit le timer
 x>=F GOTO9        // On a bouclé 0 -> 255 alors on sort
 / 18.7 = FIX2 "#"  // Transforme les 18,7 Hz et affiche au 1/100 ieme xx.xx
GOTO0              // on continue

LBL9               // 11 secondes on passé...
 0 POKE 0884       // Stoppe le timer
 "; -> FIN"
  
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Avatar du membre
ledudu
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5633
Enregistré le : 26 mars 2009 13:07
Localisation : Ile de France
Contact :

Re: Misez P'tit, Optimisez n°49 : un compte à rebours

Message par ledudu »

Machine : PB-2000
Language : Prolog

Code : Tout sélectionner

time(0):-beep(1).
time(N):-M is N-1,d_clear,write(N),beep(0),pause(26),time(M).
pause(0).
pause(P):-Q is P-1,pause(Q).
Paramétrage mémoire :
code,heap,ctl? 300, 2500 ,42000
Modifié en dernier par ledudu le 04 janv. 2016 08:19, modifié 1 fois.
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7141
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: Misez P'tit, Optimisez n°49 : un compte à rebours

Message par gege »

Bonjour,
bizarre le Prolog !
C'est pas un M au lieu du N ?
G.E.
Avatar du membre
ledudu
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5633
Enregistré le : 26 mars 2009 13:07
Localisation : Ile de France
Contact :

Re: Misez P'tit, Optimisez n°49 : un compte à rebours

Message par ledudu »

Oui, corrigé.
Avatar du membre
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 8385
Enregistré le : 12 févr. 2007 18:36
Localisation : Pas très loin de Lyon
Contact :

Re: Misez P'tit, Optimisez n°49 : un compte à rebours

Message par badaze »

gege a écrit :Bonjour,
bizarre le Prolog !
J'en ai fait pas mal à la fac il y a 25 ans. Mais je n'en plus aucun souvenir.
Tout est bon dans le pocket.
Moi j'aime tout.... Casio, HP, Sharp, TI et les autres sauf que les TI semblent ne pas m'aimer :(
http://www.emmella.fr
Mes Casio - HP - Sharp - TI
Homme invisible.
Répondre

Retourner vers « Tous les Pockets »