Go Down

Topic: Idée de concours : Optimisation de code  (Read 3311 times) previous topic - next topic

lesept

C'est très complet, mais un brin complexe. Notamment l'histoire des choses d'erreur.

Pour s'assurer du résultat correct, on peut fournir un jeu de cas tests.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

J-M-L

#31
Jan 12, 2019, 02:33 pm Last Edit: Jan 12, 2019, 02:33 pm by J-M-L
OK pour simplifier.

On peut dire qu'un nombre qui ne rentre pas sera représenté par le nombre min ou max représentable, sans gérer d'erreurs par exemple.

je vous laisse virer ce que vous voulez.
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

lesept

Pas facile pour moi ce week-end, je n'ai que mon portable.

Mais j'aurais aussi aimé voir d'autres personnes s'intéresser à ce "concours" et son cdc pour s'assurer qu'il aura un minimum de participants...
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

J-M-L

laissons un peu de temps au bar de s'activer :)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

BrUnO14200

Je suis toujours présent ;) .

Concernant ton exemple, J-M-L , j'envisageais plus "accessible" ..j'ai peur que ça effraie les débutants .

Biensur le but est de progresser donc le niveau ira en augmentant .

C'est dommage qu'on ne puisse pas faire de sondages sur ce forum .
Ca permettrait de voter pour son programme "préféré" de manière "démocratique" et sans jury .

Ma couveuse :https://forum.arduino.cc/index.php?topic=571843.0

J-M-L

Concernant ton exemple, J-M-L , j'envisageais plus "accessible" ..j'ai peur que ça effraie les débutants .
j'ai juste documenté la proposition de @lesept. Pas de soucis pour faire plus simple. On pourrait dire par exemple extraire et classer des entiers uint8_t qui seraient dans la chaîne de caractères par ordre croissant ?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

lesept

#36
Jan 14, 2019, 02:33 pm Last Edit: Jan 14, 2019, 05:57 pm by lesept
Je reprends le cahier des charges de J-M-L, en essayant de le simplifier. J'ajoute aussi quelques cas tests.


Proposition de cahier des charges:

Ecrire la fonction
bool extraireNombres(const char * entree, int16_t * tableauEntiers, size_t& nbEntiers, float * tableauDecimaux, size_t& nbDecimaux)
qui analyse la c-string (tableau de caractères terminée par un caractère NULL '\0') entree pour extraire et ranger dans les tableaux tableauEntiers et tableauDecimaux respectivement les nombres entiers et décimaux acceptables trouvés lors de l'analyse. Le nombre d'éléments trouvés sera à reporter respectivement dans nbEntiers et nbDecimaux.


On a le droit d'utiliser les fonctions c standard de stdlib.h ou string.h lors de l'analyse.

La c-string entree ne peut pas contenir plus de 10 nombres de chaque catégorie.

Les entiers acceptables sont les short aussi connus sous le type formel int16_t, donc entre -32768 to 32767, représentés en ASCII et base 10. Un seul signe - en début de séquence de chiffres est traité (par exemple aaa---12bbb sera reconnu comme -12). Si l'entier reconnu est en dehors des bornes autorisées alors la fonction renvoie false. On peut avoir autant de 0 en début de nombre que l'on veut. 0000001 sera reconnu comme 1.

Les nombre décimaux sont les float en Single Precision sur 32 bits, donc entre -3.4e38 .. 3.4e38. La représentation autorisée est proche de celle que l'on a prise pour les entiers, pas de notation scientifique. Un nombre décimal contient donc un entier, suivi obligatoirement d'un seul symbole séparateur entre la partie entière et la partie décimale suivi d'un autre entier qui comportera au moins 1 chiffre valide.
Le séparateur décimal est le point '.'

La fonction retourne true si elle a pu s'exécuter correctement, false si une incompatibilité a été détectée (y compris de représentation de nombre).

Donc par exemple -az---a//+0123.45-----azlkkma678,900blabla doit identifier comme décimal 123.45 et comme entiers 678 et 900


Critères d'évaluation dans l'ordre d'importance:
  • résultat correct
  • respect du cahier des charges
  • vitesse d'exécution de la fonction telle que calculé avec un appel à micros() avant la fonction et en sortie de fonction (avec interdiction de toucher aux interruptions ni au timer contrôlant micros())
  • impact sur l'utilisation de la mémoire (nombre d'octets nécessaires au bon déroulement de la fonction en dehors des paramètres).


Exemples de cas test (n'hésitez pas à en ajouter si nécessaire) :
  • "Day: 14/01/2019, Time 12:25:07" --> renvoie 6 entiers {14,1,2019,12,25,7}
  • "Temperature 12.3 C - Humidite 75%" --> renvoie un float 12.3 et un entier 75
  • "((123-45)/67.89)-(98*76.5)/(43.21+0123)=?" --> renvoie 3 float {67.89,76.5,43.21} et 4 entiers {123,-45,98,123}
  • "((123 - 45) / 67.89) - (98 * 76.5)/(43.21 + 0123)=?" --> renvoie 3 float {67.89,76.5,43.21} et 4 entiers {123,45,98,123}
  • "abc123def---456gh1.2345!*_()-9.8765yz" --> renvoie 2 float {1.2345,-9.8765} et 2 entiers {123,-456}


Qu'en pensez-vous ? S'il n'y a pas suffisamment de personnes intéressées, pas la peine d'aller plus loin à mon avis...
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

BrUnO14200

Moi ça me plait mais je vais viser les places du fond du classement :D !
Ma couveuse :https://forum.arduino.cc/index.php?topic=571843.0

kayel

Quote
Il y aurait un "sujet" défini au départ : un truc relativement "simple" et accessible au plus grand nombre.
Pour moi ça évoque un "Figure of eight challenge(1)" avec un buggy à 7€, pas un cahier des charges long comme "Guerre et Paix".

Tel quel votre truc n'est pas fun.

(1) Faire un parcours en forme de 8. Engins aquatiques et aeronefs bienvenus.

lesept

Notre cahier des charges n'est guère épais, pourtant...

Je comprends ce que tu veux dire. Mais il faut bien expliquer le contenu du challenge et faire en sorte que tous le comprennent de la même façon. Et il faut aussi trouver un sujet qui permette de se creuser un peu les méninges : si c'est pour faire clignoter une led, je ne vois pas l'intérêt.

Tout est ouvert, on peut penser à d'autre sujets, pour l'instant ce n'est qu'une phase de préparation.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

J-M-L

#40
Jan 14, 2019, 09:25 pm Last Edit: Jan 14, 2019, 11:13 pm by J-M-L
Sinon pour faire du fun on peut proproser de faire un jeu avec les leds de bricofoy

Il faudrait que Bricofoy documente son montage hardware (qui doit être assez simple à faire sur breadboard)

La mesure de succès = vote des participants (application qui ne plante pas, facile à lire, sans bugs visible par les membres du forum, et s'installe sur la spec hardware, et jeu addictif)

Le prix => Bricofoy envoie une copie de la boîte gravée et prête à monter (merci bricofoy :) ), en échange il peut utiliser tous les jeux (On peut prévoir une cagnotte pour financer le Matos et expédition au gagnant  :) )
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

kayel

@lesept

 Ca me foutrait les boules de savoir que tout ceux qui ne connaissent pas les pointeurs vont se tirer après avoir lu le premier paragraphe du cahier des charges.

 Un concept simple admet le plus grand nombre de participants. Ca n'oblige pas à faire simple, ça le permet.



 

bricofoy

#42
Jan 14, 2019, 11:08 pm Last Edit: Jan 14, 2019, 11:13 pm by bricofoy
Whow, J-M-L ça c'est une idée qu'elle est bonne :)

Pour le hard du machin... bah pour le moment y'a 10 leds intégrées dans les poussoirs, avec leur résistance de limitation de courant intégrée (qui limite à 18mA avec alim en 12V), bufferisées par des 2n2222 montés en émetteur commun avec des R de 10K entre l'E/S de l'arduino et la base, et les 10 poussoirs entre E/S et la masse (avec les entrées du micro en input_pullup).
J'ai rajouté des 100nF sur les poussoirs, mais ça change rien pour l'anti-rebond, du coup il est logiciel.

En gros en l'état actuel,  il faut 10 poussoirs, 10 leds, 10 résistances pour les leds, 10 transistors (2N2222 ou autre), et 10 résistances pour la base des transistors, ou décharger la gate si c'est des mos.
Les poussoirs peuvent être NO ou NF, et reliés à la masse ou au +, le lociciel actuel est capable de s'adapter.

Le tout relié à une mega, car je n'avais pas assez d'E/S sur la uno.

Possibilité de rajouter un buzzer, pour faire un mode "Simon" ou autre.
Possibilité aussi de rajouter un affichage par matrice de leds et/ou afficheurs 7 segments, mais ça c'est quand même plus compliqué et il faut redessiner la face avant.

Alimentation en 10,8V par une batterie de visseuse constituée de 3 piles 18650 (ce que j'avais sous la main le soir du 24, en fait...).
Il n'y a pas encore le circuit de charge pour le moment, je n'ai pas encore reçu le BMS 3 cellules chinois que j'ai commandé. Mais vu la capacité des piles (2Ah), je ne crois pas avoir besoin de recharger le bazar avant un bon moment.

Le Vin de la carte arduino est alimenté par le + batterie, du coup même si l'inter général est coupé ou la batterie vide, il est possible d'alimenter le jeu via le câble USB. Les boutons sont juste moins lumineux, mais ça fonctionne parfaitement.

Coté logiciel, il y a une base réutilisable qui comprends la lecture des boutons avec anti-rebond, une mise en veille si pas d'actions sur les boutons pendant plusieurs minutes, un menu de départ pour le choix du jeu, et des fonctions d'affichage. Le tout basé sur la librairie YASM (dispo dans le gestionnaire de l'IDE arduino) qui facilite grandement la mise en place de chronos et autres.
La librairie est prévue au départ pour faire des machines à états, mais ici je m'en sert surtout pour les fonctions de chronométrage qu'elle propose, pour faire une sorte de multitâche.
Autant que possible, ce serait bien de garder ce système. Il est bien entendu envisageable de repartir de zéro, mais ça serait un peu réinventer la roue...

Dans ce contexte un nouveau jeu serait lancé par un état de plus de la machine "programme". Pour le moment, mes différents jeux tiennent chacun dans un seul état de la machine "programme", mais rien n'interdit depuis cet état d'exécuter une autre machine à état plus complexe si nécessaire (plus clair pour la lecture du code que de rajouter des états à "programme" à mon avis)

Voili voilou...
-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

J-M-L

Bon ça déchaine pas les passions...

tant pis, c'était une idée comme ça
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

lesept

Mon problème sur ce dernier challenge, c'est qu'il nécessite pas mal de matériel.
Mais pour celui ci ou l'autre, c'est vrai qu'on n'a pas un succès fou.
Autant abandonner...
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Go Up