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

Répondre
Avatar de l’utilisateur
dprtl
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 282
Inscription : 27 janv. 2013 01:26
Localisation : Strasbourg
Contact :

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

Message par dprtl » 07 déc. 2013 11:45

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.
Dernière édition par dprtl le 05 janv. 2014 10:42, édité 2 fois.

Avatar de l’utilisateur
C.Ret
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1949
Inscription : 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 » 07 déc. 2013 12:57

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 + 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
bernouilli92
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4641
Inscription : 21 nov. 2012 14:03
Localisation : Ile de France

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

Message par bernouilli92 » 07 déc. 2013 14:37

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 de l’utilisateur
C.Ret
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1949
Inscription : 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 » 07 déc. 2013 15:02

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 »

Image
Dernière édition par C.Ret le 08 déc. 2013 16:47, é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
dprtl
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 282
Inscription : 27 janv. 2013 01:26
Localisation : Strasbourg
Contact :

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

Message par dprtl » 07 déc. 2013 17:52

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 de l’utilisateur
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 581
Inscription : 13 janv. 2013 20:44
Localisation : Toulon-ouest

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

Message par babaorhum » 07 déc. 2013 19:10

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,35s,32E,32Sii,28S,22s,21,16C,11C,12Cp
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,850P,3900P,4000P
TI-74&92 ; Canon X-07 ; Panasonic HHC RL-H1400 ; TANDY EC-4026

Avatar de l’utilisateur
dprtl
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 282
Inscription : 27 janv. 2013 01:26
Localisation : Strasbourg
Contact :

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

Message par dprtl » 10 déc. 2013 00:01

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 de l’utilisateur
bernouilli92
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4641
Inscription : 21 nov. 2012 14:03
Localisation : Ile de France

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

Message par bernouilli92 » 10 déc. 2013 00:10

@ 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é.
Dernière édition par bernouilli92 le 11 déc. 2013 19:03, édité 1 fois.
HP, Casio, Sharp, Psion, quelques TI et divers autres

Avatar de l’utilisateur
C.Ret
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1949
Inscription : 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 » 11 déc. 2013 18:51

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 + 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. .

Gilles59
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 1197
Inscription : 27 oct. 2010 20:46

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

Message par Gilles59 » 26 oct. 2014 20:10

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 / TI66 / TI74 Basicalc / TI95 Procalc/ HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49G+ / 50G / 50G NewRPL / HP Prime / Amstrad CPC 6128+

Gilles59
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 1197
Inscription : 27 oct. 2010 20:46

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

Message par Gilles59 » 27 oct. 2014 19:43

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 / TI66 / TI74 Basicalc / TI95 Procalc/ HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49G+ / 50G / 50G NewRPL / HP Prime / Amstrad CPC 6128+

Avatar de l’utilisateur
ledudu
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6120
Inscription : 26 mars 2009 14:07
Localisation : Ile de France
Contact :

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

Message par ledudu » 03 janv. 2016 18:24

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
Dernière édition par ledudu le 04 janv. 2016 09:19, édité 1 fois.

Avatar de l’utilisateur
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7866
Inscription : 31 janv. 2008 15:24
Localisation : Banlieue Paârisienne
Contact :

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

Message par gege » 04 janv. 2016 01:55

Bonjour,
bizarre le Prolog !
C'est pas un M au lieu du N ?
G.E.

Avatar de l’utilisateur
ledudu
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6120
Inscription : 26 mars 2009 14:07
Localisation : Ile de France
Contact :

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

Message par ledudu » 04 janv. 2016 09:20

Oui, corrigé.

Avatar de l’utilisateur
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 8037
Inscription : 12 févr. 2007 19:36
Localisation : Pas très loin de Lyon
Contact :

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

Message par badaze » 04 janv. 2016 20:25

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

Revenir vers « Tous les Pockets »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 11 invités