π
<-
Chat plein-écran
[^]

News 2024
Avril (13)
Mars (7)
Janvier (20)

News 2023
Octobre (19)
Août (14)
Juillet (13)
Juin (21)
Mai (29)
Avril (24)
Mars (24)
Janvier (24)

News 2022
Octobre (23)
Août (14)
Juillet (15)
Juin (17)
Mai (31)
Avril (27)
Mars (28)
Janvier (34)

News 2021
Octobre (24)
Août (37)
Juillet (50)
Juin (32)
Mai (48)
Avril (61)
Mars (35)
Janvier (34)

News 2020
Octobre (17)
Août (43)
Juillet (43)
Juin (45)
Mai (60)
Avril (78)
Mars (36)
Janvier (39)

News 2019
Octobre (13)
Août (18)
Juillet (23)
Juin (28)
Mai (31)
Avril (26)
Mars (38)
Janvier (37)

News 2018
Octobre (13)
Août (32)
Juillet (23)
Juin (64)
Mai (63)
Avril (45)
Mars (43)
Janvier (45)

News 2017
Octobre (26)
Août (39)
Juillet (52)
Juin (88)
Mai (51)
Avril (43)
Mars (37)
Janvier (33)

News 2016
Octobre (25)
Août (42)
Juillet (34)
Juin (109)
Mai (55)
Avril (34)
Mars (37)
Janvier (24)

News 2015
Octobre (22)
Août (56)
Juillet (22)
Juin (94)
Mai (56)
Avril (32)
Mars (40)
Janvier (21)

News 2014
Octobre (26)
Août (18)
Juillet (23)
Juin (101)
Mai (57)
Avril (59)
Mars (54)
Janvier (31)

News 2013
Octobre (67)
Août (50)
Juillet (43)
Juin (193)
Mai (93)
Avril (102)
Mars (45)
Janvier (50)

News 2012
Octobre (64)
Août (63)
Juillet (53)
Juin (132)
Mai (88)
Avril (73)
Mars (57)
Janvier (58)

News 2011
Octobre (56)
Août (31)
Juillet (27)
Juin (71)
Mai (61)
Avril (32)
Mars (36)
Janvier (24)

News 2010
Octobre (11)
Août (8)
Juillet (14)
Juin (10)
Mai (3)
Avril (3)
Mars (1)

News 2009
Août (3)
Juin (2)
Mai (1)
Avril (2)
Mars (1)

Découvre la Graph 25+E personnalisée façon lignes de niveau

Nouveau messagede critor » 11 Déc 2020, 15:26

As-tu déjà pensé à personnaliser ta calculatrice préférée pour la rendre unique au monde ?

Voici plusieurs œuvres d'art que nous t'avions déjà présentées par The_Andy! et Persalteas :
1310 1311


Aujourd'hui, c'est au tour de la Casio Graph 25+E se se faire personnaliser avec talent par Laurine Harteloire. :favorite:

Laurine te choisit ici pour le couvercle et le boîtier un superbe motif façon lignes de niveau, tout s'adaptant au relief statique déjà imposé par Casio (gravures, touches, patins, écran, etc.).


N'hésite pas à partager toi aussi tes créations. ;)



Source : https://twitter.com/LHarteloire/status/ ... 7053429761
Lien vers le sujet sur le forum: Découvre la Graph 25+E personnalisée façon lignes de niveau (Commentaires: 0)

Dumping de l'OS TI-73 1.3007, enfin !

Nouveau messagede critor » 14 Déc 2020, 12:22

Connais-tu la TI-73 ? ;)

Aujourd'hui l'entrée de la gamme graphique chez Texas Instruments est la TI-82 Advanced pour la France. Dans d'autres pays n'imposant pas l'utilisation du mode examen à diode, c'est encore la TI-82 STATS.

Les TI-82 n'ont toutefois pas toujours constitué l'entrée de gamme. A partir de la rentrée 1995 nous avions droit à la TI-80. Avec des caractéristiques bien représentatives de l'entrée de gamme, et dont seul Lexibook arrive encore aujourd'hui à honorer la mémoire : :troll:
  • pas de port de communication, tous les programmes devaient donc être saisis à la main
  • processeur n'atteignant même pas les 1 MHz, se contentant de 980 KHz
  • écran graphique de seulement 64×48 pixels, le pire de toute la gamme

10121Pour la rentrée 2009, nous avons eu en France la TI-76.fr dédiée au lycée professionnel, comme indiqué plus clairement sur ses prototypes nommés à la différence TI-Lycée Pro.fr.

Et entre la TI-80 et la TI-76.fr, rien du tout. Pour la rentrée 1998, Texas Instruments arrête brutalement la production de la TI-80, faisait donc de la TI-82 le nouveau modèle d'entrée de gamme. Un modèle bien évidemment plus cher, et une hausse du coût d'entrée non négligeable pour les familles les moins ambitieuses : on passait de 280F pour la TI-80 à au moins 350F pour la TI-82. Toutefois, l'épuisement des stocks sera progressif et le problème ne sera ressenti qu'à retardement.

Chez Casio nous avons à la même époque pour l'entrée de gamme la fx-6900G (1995), fx-6910G (1996), fx-6910aG (1997), Graph 20 (1998), et enfin lancée pour la rentrée 1999 la Graph 25.

La Graph 25 de la rentrée 1999 est initialement commercialisée au même prix que la Graph 20 qu'elle remplace, dans les 300F. Toutefois soudainement pour la rentrée 2000, la société Noblet qui s'occupe alors de la distribution des calculatrices Casio en France, en profite pour augmenter le prix de la Graph 25 à 350F, s'alignant ainsi sur le prix de la TI-82. Ceci fera l'objet d'une plainte pour suspicion d'entente faussant la concurrence, et d'une condamnation conjointe de Texas Instruments et de Noblet.

De 1998 à 2009, l'entrée de la gamme graphique chez Texas Instruments en France fut donc la TI-82, devenant ainsi le modèle le plus vendu chez les lycéens avant d'être détrôné à compter de 2012 par la nouvelle Casio Graph 35+USB de 2009.

1053Toutefois, dans le reste du monde les choses sont différentes. La TI-80 a bien eu un successeur commercialisé dans d'autres pays, la TI-73 sortie pour le rentrée 1998, soit un an avant la TI-83 Plus.

La TI-73 utilisait le même matériel que la TI-83 Plus. Son logiciel était toutefois différent :
  • d'un côté bien évidemment beaucoup moins de fonctions
  • pas de clavier alphabétique physique ici, mais virtuel appelé par la combinaison
    2nd
    MATH
  • mais il n'empêche une innovation majeure avec la saisie et l'affichage des fractions en écriture naturelle
La TI-76.fr de 2009 reprendra d'ailleurs ces deux premiers points.

En 2003 la TI-73 sera remplacée par la TI-73 Explorer, à notre connaissance un renommage purement commercial sans aucune amélioration matérielle ou logicielle.

Au cours de la longue vie des TI-73 et TI-73 Explorer, les calculatrices sont venues avec différentes versions du Boot Code, consultable sur ces modèles en tapant
2nd
DEL
MODE
2nd
DEL
:
  • 1.3004 (TI-73)
  • 1.3005 (TI-73 Explorer)
  • 1.3007 (TI-73 Explorer)

De nombreuses mise à jour logicielles furent disponibles, toutes disponibles sur notre site :
  • 1.3004
  • 1.3007 (7 août 1998)
  • 1.40 (11 octobre 1999)
  • 1.50 (mai 2001)
  • 1.60 (13 novembre 2001)
  • 1.80 (29 juillet 2005)
  • 1.85 (8 décembre 2005)
  • 1.90 (6 février 2006)
  • 1.91 (6 mars 2008)

Toutes, non. Une irréductible version logicielle se dérobait depuis des années à toutes nos tentatives de récupération, la 1.3007.

Elle ne fut que très brièvement téléchargeable sur le site de Texas Instruments, et malheureusement le fichier à télécharger ne fut pas sauvegardé par les archives du web.

Le musée Datamath avait récupéré une TI-73 munie de l'OS 1.3007 mais n'en dispose plus, soit mise à jour soit revendue.

Aujourd'hui le légendaire OS TI-73 1.3007 rejoint enfin nos archives grâce à Zeroko et Frédéric Desautels alias mr womp womp. Il a en effet récupéré plus de 20 ans après peut-être une des dernières TI-73 au monde encore munies de cet OS car jamais mises à jour depuis.

L'extraction historique de cet OS ne fut toutefois pas chose facile, le shell Mallard permettant de rajouter la gestion des programmes ASM à la TI-73 ne gérant pas les versions antérieures à 1.40. Il a fallu modifier TiLP (contribution de Zeroko) pour exploiter la méthode générique ciblant les calculatrices à processeur z80 dépourvue de la fonctionnalité ASM sans besoin de rien leur installer (TI-82/83/85/86).

Tu peux désormais installer la version 1.3007 sur ta TI-73, et l'explorer librement. :)

Une fois de plus, un grand merci à ces deux membres de la communauté pour cette contribution exceptionnelle à la sauvegarde et la préservation du patrimoine éducatif construit par Texas Instruments ! :bj:

Attention toutefois, les TI-73 Explorer munies du dernier Boot Code 1.3007 refuseront l'installation de l'OS 1.3007 ainsi que de toute version inférieure à 1.85, retournant une erreur de version.

L'interdiction de réinstallation de versions inférieures n'étant pas la norme à l'époque chez Texas Instruments, nous soupçonnons une évolution matérielle incompatible avec ces anciennes versions.

Pour les TI-73 Explorer munies du Boot Code 1.3005, nous ne savons pas.

Téléchargement : OS TI-73 1.3007
Lien vers le sujet sur le forum: Dumping de l'OS TI-73 1.3007, enfin ! (Commentaires: 1)

Résultat du concours de rentrée 2020 - Défi de Quetzalcoatl

Nouveau messagede Lephe » 14 Déc 2020, 18:26

Bonjour à tous les membres ! Avec notre concours de rentrée tout juste terminé, voyons comment vous avez résolu notre deuxième défi, le défi Python de Quetzalcoatl ! ;)

La participation à cette épreuve aura été similaire à la première, avec 141 participations soumises par 20 personnes. 11 d'entre vous se sont déclarés de la team TI, et 4 de la team Casio (les autres n'ont rien indiqué). Merci beaucoup pour toute la science que, comme on va le voir tout de suite, vous avez déployé pour optimiser ce défi ! o/

Image

Cette épreuve consistait à traverser une caverne à l'aide de l'excavatrice transformée en ballon. Comme l'épreuve précédente, l'objectif était de minimiser la quantité d'énergie dépensée, dont j'ai détaillé le calcul dans un topic quand on a réalisé que c'était moins évident que prévu. ^^

Le contrôle du ballon se faisait en spécifiant des triplets :
• L'accélération verticale du ballon, ay.
• La vitesse de changement de forme, da.
• La durée de validité du contrôle.

Les coûts étaient répartis sensiblement ainsi :
• 10 points par contrôle effectué.
• Un léger coût sur les changements de forme, croissant avec |da|.
• 7 points par collision, sachant que si on s'enfonce dans la roche le nombre de collisions à chaque instant peut être très élevé.

Voyons voir ce que vous avez pu trouver ! L'analyse ci-dessous est purement la mienne, j'aurai sans doute raté des détails croustillants, donc n'hésitez pas à préciser dans les commentaires. :D


Le classement



17. Image Golden Man (Image) : 6058.5 (Programme : q5.py)

Comme dans l'article précédent, la première participation ici est aussi une des plus malines. Avec un seul ordre d'une seule unité de temps, Golden Man fixe la vitesse verticale à -0.27 et descend en ligne droite jusqu'à la ligne d'arrivée. Le script auto-complète la séquence d'instructions en ne faisant rien jusqu'à la fin.

Soumettre des ordres coûte cher, donc cette idée est logique. Mais les collisions coûtent infiniment plus cher, et à plusieurs moments le ballon est entièrement dans la roche. Or, l'algorithme codé par Critor évalue en gros la surface de l'intersection de l'ellipse du ballon avec la roche, et pénalise d'un multiple élevé de cette surface, donc le score explose. ^^

Image


16. Image Ptitjoz (ImageImage) : 2165.3 (Programme : q124.py)

Ptitjoz est le premier à faire des paraboles. Comme vous l'avez sans doute remarqué, la première composante de chaque ordre est l'accélération verticale du ballon. Sur la période indiquée par chaque ordre, le ballon fait donc une parabole montante ou descendante.

Le passage de la première section est très propre avec absolument aucune collision. Et il y a une technique intéressante au niveau de la section infranchissable, où le ballon plonge dans la roche pour se mettre dans une position favorable à la remontée. C'est une mécanique intéressante qu'on aurait pu vous inciter à exploiter. Mais le jeu était équilibré de façon à punir inconditionnellement les collisions, donc ça n'est pas arrivé : il n'était jamais intéressant de faire des concessions. ;)

Image


15. Nagero (Image) : 1980.5 (Programme : q131.py)

Comme le programme d'exemple, la participation de Nagero ne s'écarte pas trop des accélérations verticales ±1. Ça a l'avantage d'éliminer des paramètres dans la recherche d'un chemin, mais ça oblige à faire beaucoup de vagues et donc passer beaucoup de points sur les ordres.

La trajectoire évite quand même la plupart des passages difficiles et pourrait presque attraper le dernier lot à quelques instructions près sur la fin !

Image


14. Image Arm234 (Image) : 1132.5 (Programme : q104.py)

Comme si ce n'était pas assez de le faire une fois, Pavel a là aussi écrit une version pour ordinateur du programme de l'épreuve, et Arm234 est le premier de ce classement à s'en être servi. :)

Image

Quelque chose qui devient assez vite évident lorsqu'on cherche de façon interactive, c'est que malgré l'insistance du sujet à vous faire utiliser des paraboles, il est parfaitement possible d'avancer en ligne droite en spécifiant une accélération verticale nulle pendant une période donnée.

À partir de là, le jeu devient surtout d'identifier les segments qu'on peut parcourir et d'utiliser une série d'instructions économe en score pour fixer la vitesse verticale et la forme du ballon, puis ne rien faire pendant toute la durée de chaque segment, ce qui ne coûte aucun point au score ! ;)

On retrouve de nouveau la parabole directe au niveau du passage infranchissable, puisque quitte à passer en force autant ne pas consommer en plus des appels à modifier_vol().

Arm234 a écrit:J’ai choisi de ne rien faire avec la calculatrice (j’ai une NumWorks), car je trouvais cela assez compliqué pour pouvoir réaliser les différents textes, j’ai donc avancé à tâtons avec l’émulateur pour pc avec TKinter en me sevrant des captures d’écran des premiers qui m’ont beaucoup servi pour savoir où aller et quels tracés réaliser.
(message original)

Image


13. Image CaptainLuigi (ImageImage) : 825.5 (Programme : q119.py)

CaptainLuigi a lui aussi utilisé le programme de Pavel. En fait ça se voit assez vite au formatage du code puisque l'outil génère une version compacte avec une boucle for. Sauf fourberie particulière, les personnes qui n'ont utilisé que leur calculatrice ont gardé la séquence de modifier_vol() donnée en exemple. Donc qui utilise quoi se devine assez bien au premier coup d'oeil. :E

Cette participation est la toute dernière à ne pas avoir aggressivement abusé de lignes droites partout, et doit son placement au passage rigoureux de tous les points serrés, qui totalise un nombre faible de collisions (n'oubliez pas que la surface de l'intersection compte, ici on frôle à peine).

CaptainLuigi a écrit: J'ai tenté 2/3 fois sur Casio, vers 1000 environ .
Mais à force d'attendre l'importation des modules qui prenait 20,30 secondes, j'ai jeté un coup d'œil à l'outil que Pavel avait développé , et très rapidement j'ai fait ce score un peu plus décent de 825.5
(j'avais une participation bien en dessous mais invalide :sry: )
(message original)

Image


12. Image Tituya (ImageImage) : 537.5 (Programme : q15.py)

Pour quelqu'un qui dit ne pas avoir cherché beaucoup, Tituya a cherché droit au but : c'est fait à la main, on a les lignes droites, un passage impeccable de toutes les sections, et le ballon ne change même pas de forme ! Un total de 21 instructions directes et efficaces.

À partir de là, le chemin ne change plus fondamentalement et on va surtout voir moins de collisions sur la section infranchissable et moins d'instuctions.

Tituya a écrit: Voilà ma méthode : J'ai simplement essayé de faire les trajets le plus cours possible. Sachant que les trajets les plus cours sont ceux allant droit, j'ai construit mon programme en jouant sur ça et en essayant d'éviter au maximum les murs.
Rien de plus, rien de moins. J'ai moins été intéressé par ce concours, je n'ai pas plus cherché que ça.
(message original)

Image


11. Image Wistaro (Image) : 499 (Programme : q64.py)

Le programme soumis par Wistaro a la propriété unique de soumettre une instruction par unité de temps. Toutes les (0,0,1) ne coûtent aucun point, mais il en reste 24 autres. Et pourtant, son score est en-dessous de 500 points ! :O

Le secret ? Un ajustement aléatoire habile (quoique manuel) des instructions. Quasiment tout le monde a travaillé manuellement sur ce défi, et ce n'est pas surprenant étant donné la complexité du calcul des collisions et l'absence d'un cadre formel facile dans lequel attaquer le problème.

Je ne vous cache pas qu'après le premier défi je ne m'attendais pas du tout à ce qu'on recoive une participation de ce style !

Wistaro a écrit:Ma méthode pour ce concours n'est pas vraiment surprenante. J'ai tout d'abord commencé par lancer le programme sur ma calculatrice (TI-Nspire CX CAS munie de Khi-CAS + micropython). j'ai tâtonné à la main pour essayer de comprendre le rôle de tous les paramètres.
J'ai aussi essayé de décortiquer le code source en Python, mais ça n'a pas servi à grand chose vu mon faible niveau dans ce langage :p
Une fois cela bien compris, j'ai utilisé le programme pc de Pavel pour essayer de trouver la trajectoire la plus optimisée. Je le remercie beaucoup d'ailleurs, ça m'a bien aidé, même si je trouve que ça nous facilitait la tâche :p

Après plusieurs essais infructueux, j'ai fini par atteindre 499 en jouant sur les différents paramètres de manière aléatoire. J'ai réussi une fois à faire 480, mais malheureusement je n'ai pas pensé à sauvegardé la trajectoire :(
(message original)

Image


10. commandblockguy (Image) : 462.5 (Programme : q26.py)

La participation de CommandBlockGuy pousse tellement le concept de ligne droite à bout que son programme est structurellement une alternance entre des paraboles pour changer de direction et des lignes droites pour progresser dans la caverne (sauf au passage du premier pincement où il enchaîne deux paraboles).

Vous pouvez voir que le chemin emprunté est le même pour toutes les soumissions restantes, mais le score continue de descendre drastiquement. Il y a plusieurs raisons pour ça, mais une en particulier était volontaire. À l'origine, Critor avait proposé que la première composante de chaque instruction soit la vitesse verticale (ce qui est somme toute plus logique physiquement parlant). Voyant les retours sur le premier défi, j'ai suggéré d'utiliser l'accélération à la place.

Spécifier une accélération constante par morceaux fait bien sûr des paraboles au lieu de lignes, mais ce n'est pas tout. Ça ajoute au problème une variable cachée qui est la vitesse verticale. En particulier, on ne peut pas juste déplacer des instructions d'un endroit à un autre de plan de vol, parce que si la vitesse verticale est différente au points de départ et d'arrivée, leur effet diffère aussi. ;)

Derrière tout ça il y avait aussi l'idée que des changements sur le début du plan de vol se répercutent assez violemment sur la fin et nécessitent de réajuster la fin. J'espérais que les candidats qui partent sur un début différent les uns des autres restent « coincés » dans ces espaces de solutions, évitant ainsi qu'il n'y ait qu'une seule solution comme au premier défi.

commandblockguy a écrit:This time, I basically just did everything manually, trying to minimize my number of collisions. I would have tried to automatically test solutions again, but I was much busier for this round than the last one. I ended up with a best score of 455.5, but because that was already taken I slightly changed it to get a score of 462.5.
(message original)

Image


9. Image Filoji (ImageImage) : 454.5 (Programme : q13.py)

Un autre aspect qu'on a voulu essayer, et qui dans le cas de Filoji a joué en notre défaveur, était de publier les images des trajets empruntés par tout le monde. Comme la variable cachée (la vitesse) n'est pas visible sur les images, contrairement au premier défi ça ne donne pas toute l'information sur la solution.

On a pensé que ça aiderait tout le monde à trouver des astuces (par exemple le fait qu'on pouvait faire des lignes droites) et motiverait un peu ceux qui avaient du mal. Qu'en avez-vous pensé ? Est-ce que ça vous a aidé, ennuyé ? Et par extension, même question sur les infos publiques du troisième défi (où il y a infiniment plus d'informations cachées). ^^

Filoji a écrit:C'est pas compliqué dans la vie, il faut tricher !
Donc, pour commencer, j'ai vu que le concours commençais, mais c'était le même type de challenge que le précédent...
Je me suis dit "Après tout, tente !", et c'est ce que j'ai fait.
Je ne vais pas vous mentir, j'ai préféré le 1er, car je le trouvais plus simple à comprendre. En plus, je n'ai pas vraiment d'histoire sur celui-ci, j'ai très vite réussis à trouver une solution qui m'avais placé en ~5ème, et je me suis arrêté là. Comment j'ai réussis à faire ça ? Ben j'ai juste regarder les participations ennemis. Je trouvais ça bien à la base de voir l'avancement des autres, mais quand le seul but pour moi était de recopier le chemin des autres, je me suis très vite lassé.
(message original)

Image


8. Image Ti64CLi++ (ImageImage) : 406.8 (Programme : q138.py)

Parfois on se demande ce qu'on ferait sans Pavel. :E

Ti64CLi++ a écrit:Alors pour cette fois, j'ai tout fait avec l'utilitaire de Pavel (au passage, merci pour tout :bj: ), j'ai tenté une première fois, où j'ai obtenu un score d'environ 600 il me semble, puis un deuxième jet m'a permis d'atteindre les 490.
Enfin, j'ai fais joujou avec les paramètres, sans trop jamais vraiment me pencher dessus, ce qui m'a permis d'avoir ce score de 406,8.
(message original)

Image


7. Image Jeffitus (Image) : 234 (Programme : q136.py)

Le saut entre TI64CLi++ et Jeffitus est flagrant : presque 200 points. Il y a bien sûr quelques instructions en moins, mais ce que fait vraiment la différence c'est la quantité de collisions au niveau du passage infranchissable.

Quand Critor a suggéré ce sujet j'ai tout de suite pensé que je pouvais générer les deux courbes définissant le plafond et le sol en tirant aléatoirement les coefficients d'une décomposition de Fourier pour deux fonctions. Mais ça posait un problème qui est que les courbes pouvaient facilement se croiser. Dans l'exemple ci-dessous, l'amplitude permet aux courbes de traverser tout l'écran, et les composantes majeures du profil spectral sont partagées pour éviter les intersections. Mais on peut toujours s'en sortir avec deux (voire une seule) lignes droites.

Image

Du coup j'ai changé de méthode et j'ai généré la position du plafond et la hauteur de l'espace naviguable à partir des profils spectraux. De cette façon, il était facile de garantir que le résultat serait toujours positif, et on a beaucoup plus facilement des passages serrés.

Image

En fin de compte, Critor a choisi une instance avec un passage infranchissable, ce qui vous obligeait à faire des compromis. On a vu au début de ce classement qu'éviter à tout prix les collisions joue le rôle le plus important dans les bons scores, et ça se voit encore même dans le top 10. :)

Jeffitus a écrit:The first score I submitted was done by hand, using a script written by commandblockguy for the PC. I'll note that initially I didn't really touch the second parameter, since I didn't really understand what it was doing at first. I saw that some people were talking about Pavel's GUI version, so I decided to try that out and sure enough I began getting better scores. It was also around that time that Afyu mentioned the second parameter, and I started looking into how it worked. With that knowledge I was able to get below 400 easily, and below 300 soon after that. I think I probably could have improved my score more, but since I really only started trying to improve just a few days before the contest ended I'm pretty happy with how my score turned out.
(message original)

Image


6. Image Ne0tuX (ImageImage) : 217 (Programme : q111.py)

Ne0tux a lui aussi faire la plupart de la recherche à la main. Au fond, le défaut sans doute de ce défi, c'est qu'il y a un aspect de grind assez conséquent. C'était aussi le cas dans le passé (par exemple pour le problème de sélection d'équipe Pokémon en 2019) mais dans ces cas-là on pouvait aussi approcher la solution à l'ordinateur.

Je ne suis pas surpris qu'il y ait eu très peu de scripts pour ce défi, et à autres paramètres égaux je trouve ça dommage (ceci n'engage que mon opinion). Le troisième défi tranche beaucoup en vous tous faisant programmer une solution, et selon si vous avez aimé ça pourra influencer le format des prochaines éditions. N'hésitez pas à dire en deux ou trois mots ce que vous avez préféré, ça nous informe beaucoup. ^^

Ne0tux a écrit:J'ai de nouveau tiré profit d'Omega en ligne pour valider ma participation, mais je dois remercier Pavel car c'est avec sa GUI que j'ai testé mes idées. C'est la première fois que je ne produis aucun algorithme d'optimisation ; je me suis contenté d'appliquer au mieux la stratégie déduite du code et des participations visibles. Le fait de voir ce qu'ont fait les autres était une nouveauté. D'un côté, j'ai trouvé intéressant de constater (au début tout du moins) que des scores proches avaient parfois des visuels différents. D'un autre côté, accéder à ces visuels était une solution à moindre effort comparé à tout expérimenter soi-même. Ma double nature humain/développeur m'a fait choisir la facilité en m'intéressant aux 2-3 premiers visuels du classement et c'est ainsi que j'ai validé quelques d'intuitions obtenues par le code : possibilité de faire des lignes droites à moindre coût, besoin d'un minimum de collision pour un score minimum.
(message original)

Image


5. Image LeGmask (Image) : 213.6 (Programme : q108.py)

Comme la dernière fois, je vous laisse avec les explications brutes du top 5, qui sont déjà on ne peut plus complètes par elles-mêmes. :)

Vous noterez quand même, si vous lisez le code, que les débuts sont extrêmement proches. L'usage de lignes droites réduit drastiquement le nombre de possibilités de chemin. Mon espoir qu'il y ait ultimement plus d'une solution vraiment compétitive n'était donc qu'à moitié fondé, car seule les instructions de fin diffèrent vraiment d'une soumission à l'autre.

LeGmask a écrit:Sérieusement, en vrai pour tout vous dire ce concours était d’autant plus simple que le premier niveau compréhension, peut-être un peut trop, et trop répétitifs par rapport au dernier concours, mais je ne m’en pleins pas on a déjà l’immense chance d’avoir de superbe concours rien que pour nous 😊

Ce qu’il en est de ma solution : bien bah tout d’abord je me suis empréssée de faire une adaptation de labgui le script de Pavel pour le premier concours (https://gist.github.com/LeGmask/88eaf69 ... eb16d79dbd ) je m’apprêtait a voir avec cent20 pour faire profiter la team numworks de cette avantage ou tout le monde, sauf que Pavel ma devancé. J’avais fini mon script le matin 9h quelques heures après, Pavel qui nous sort ca version :notlikethis: . Néanmoins j’ai essayé les deux et je trouvais ma version adaptée de labgui bien plus efficace que la nouvelle fournis par Pavel. J’ai alors cherché un peut avec mon nouvel outil et fait un score aux alentours de 590 de mémoire.

Après cela j’ai laissé passez beaucoup de temps, semaine de DS + préparation à mon championnat de voile à Dunkerque… première semaine des vacances j’ai réussi le mercredi (étant en « formation » avant) à regarder un peut, et j’ai réussi à descendre juste en dessous de Afyu, l’idée que j’avais vu est que si ont réduisait le serpentin avec le 2e paramètre, il fallait faire ajouter l’inverse pour annuler le fait qu’avancer consomme du score… Le weekend de cette première semaine de vacance j’ai donc pus trouver mieux que le score actuel de Pavel qui avait 218, je me place donc premier avec 216.5.

Arrivée à Dunkerque, Pavel reprend sa place avec 211, puis Afyu passe devant aussi, de plus qui dit championnat de France ne dit pas beaucoup de temps libre, la journée sur l’eau le soir dodo. J’ai néanmoins trouvé un peu de temps et réussi à me placer devant Afyu, a ce moment la j’ai donc décidé de faire un algorithme pour optimiser le tout, cette algorithme ajoutait simplement aléatoirement de petites valeurs au différentes variable, et finissait par toujours retomber sur 211, avec plus de temps j’aurais peut-être pus trouver mieux mais je ne pense pas que c’était faisable.

J’ai finalement été dépasser par Tiny_Hacker, et cent20 mais je n’avais pas vraiment le temps de faire une amélioration, puis bon j’ai déjà un lots avec une calculatrice je n’avais pas non plus la motivation de faire beaucoup mieux 😊.

Encore une fois grand merci pour ce concours, et je repose mon idée, d’une évaluation automatique pour le concours afin d’éviter a critor de tout faire à la main. J’ai ici décider d’aider ceux qui en avait vraiment besoin afin de rétablir l’équilibre par rapport au premier défi ou je me suis fait aider.
(message original)

Image


4. Image cent20 (Image) : 213.502 (Programme : q127.py)

cent20 a écrit:Ma méthode en quelques mots

cent20 a écrit:Un algorithme dynamique, arborescent, basé sur des séries génétiques, analysé par une IA dédié à cet usage dont je ne peux pas révéler à cet instant, tous les secrets.

Comment tout ceci fonctionne ? Il est temps de révéler tous mes secrets.
C'est assez simple. Commençons par définir ce qu'est un algorithme

Un algorithme est une suite finie et non ambiguë d’opérations ou d'instructions permettant de résoudre une classe de problèmes

J'ai donc mis au point un algorithme, il était arborescent car le défi l'était, l'optimisation d'un trajet dépendait du précédent. Le caractère génétique vient du fait qu'une fois que j'ai obtenu une bonne série, mon IA l'étudie à nouveau pour l'optimiser si cela est possible. Comme je l'ai promis dans le forum, il est temps de vous révéler les secrets de cet algorithme.

Code: Tout sélectionner
# Attendre que le grand Pavel propose un outil de recherche sur PC

Boucle de recherche : Quand vous arrivez à la dernière étape, il suffit de boucler sur la première

Code: Tout sélectionner
'''
Proposer une solution
L'optimiser
Regarder les réponses des autres utilisateurs
Mettre une baffe à l'IA pour qu'elle s'adapte
Proposer une meilleur solution, inspiré des autres propositions.
Analyser mon score à mi chemin et comprendre que s'il est supérieur au score de la meilleur proposition # # c'est que rien ne va.
Mettre à nouveau une baffe à l'IA pour qu'elle s'adapte
Troller sur le forum en racontant n'importe quoi, l'essentiel est de faire croire que votre score est imbattable.
Prendre beaucoup de plaisir, et c'est le plus important, à chaque palier franchis dans la progression, ils ont été exposé clairement par Pavel et Afyu donc inutile de les réexpliquer.
'''

Quelques regrets
- Avoir trop chauffé Afyu, qui m'a grillé brillamment pour le coup.
- Avoir cru, trop tôt, que Pavel avait trouvé le meilleur score, j'aurais pu obtenir le 211 mais mon algo de recherche ne pouvait pas y arriver à cause de son fonctionnement : "Regarder les réponses des autres utilisateurs"

J'ai adoré ce deuxième défi, trouver les différentes astuces lors de la recherche est vraiment jouissif.
J'ai vaguement codé une optimisation itérative sur des intervalles prédéterminé pour gratter la 3ème place, mais n'ayant pas mis assez de décimales un joueur à pu s'intercaler entre mon résultat et celui de Afyu.
(message original)

Image


3. Image TIny_Hacker (Image) : 213.501 (Programme : q139.py)

TIny_Hacker a écrit:Thank you for this awesome contest!
When I first entered, I was not really attempting to get a good score but figured that since there were hardly any entries I might as well see what I could come up with since even a huge score would get me into the top 13. :D I discovered Pavel's GUI searching for information on Planet-Casio, and I messed around trying to get a path that got as few collisions as possible. I ended up with a huge score, which I never bothered to submit.

After messing around some more, I realized I could move in straighter segments by making a small segment before the current and aiming it in the direction I wanted to go. After making a path like this, I ended up with a score of 1,029.5 which I deemed good enough to submit. After more people started sending their solutions and getting better scores, I decided to look back into my current path again. After removing quite a few collisions, I got a score of 647.5, which roughly followed the path that the people ahead of me used. I have to admit, this contest was quite addicting for me!

After a few more days, I had managed to reduce my score to 449.5, and I couldn't seem to figure out how to get it any lower. I realized that there must be a key thing I was missing, seeing the 200 point difference between my score and the scores below me. The next day, Afyu gave me a hint which helped quite a bit, and I discovered the trick to getting into the 200s! The next day, I made a modified version of the GUI which displayed my score for every step along the path, so that I could make sure I was always improving rather than getting the same or a worse score. After a few hours of trying paths, I managed to get my score to 216.5, which I "broke" in order to make it fit into the ranking since 216.5 had already been taken by Pavel. I finally was able to reduce my score to 214, which I submitted and gave up on reducing afterward. However, around 45 minutes before the deadline, I realized that my chances of getting a TI-Nspire were much less than I thought because I had forgotten that there was only one NumWorks in the prizes this time!

However, Afyu told me that one of my segments was too short, and when I compared my path to the ones in front of me that was true! I discovered that the reason I had missed that earlier was that the decrease in the score is not immediate, and so it did not appear to be a better path because I was comparing it in my tweaked version of Pavel's GUI. After I reached 213, I changed some more code in Pavel's GUI to allow me to change the middle argument more precisely, and I was able to sneak my score into 3rd!
(message original)

Image


2. Image Afyu (ImageImage) : 213.5 (Programme : q110.py)

Afyu a écrit:J'ai découvert l'énoncé avec 4 jours de retard et j'ai commencé mes recherches sur la ressource NumWorks avec le Workshop officiel.
J'ai placé des commandes modifier_vol(n1, n2, n3) en tatonant, jusqu'à avoir une solution convenable.
J'ai alors 22 étapes et une consommation à 3567.5.
Par exemple, la longue ligne droite entre le premier et le deuxième stalactite est coupée en 4 segments mis bout à bout... inutilement.

Puis, j’ai fait un deuxième essai à 2034.5 et ensuite un troisième à 1964.5 et un à 1666 avant d'arriver à mon essai à 1054.5 que j’ai décidé d'envoyer.

Après plusieurs essais et 9 scores plus tard, j'arrive à 541.5 et je décide de passer (enfin !) par un algorithme pour optimiser tout ça.

J'ai repris la ressource proposée pour la NumWorks (version Workshop officiel) et j'en ai supprimé la partie graphique (faute de savoir comment l'adapter sur ordi, en utilisant tkinter plutôt que kandindky pour le module graphique) et j'ai ajouté quelques lignes pour créer 3 listes d'initialisation coord1init, coord2init et coord3init qui contiennent respectivement : les valeurs utilisées comme 1er paramètre, celles utilisées comme 2ème paramètre et celles utilisées comme 3ème paramètre. Et maintenant, avec un peu de recul, je me demande s'il n'aurait pas été plus pertinent de créer des triplets de nombres (un triplet pour chaque commande modifier_vol(n1, n2, n3) plutôt que 3 listes. En fait NON, car sauvegarder puis récupérer régulièrement plein de triplets c'est plus compliqué que de sauvegarder 3 listes.
Dans le script j'ai également créé une variable scoremax qui contiendra mon meilleur score. J'ai également créé 3 listes coord1, coord2 et coord3 qui sont les listes de paramètres sur lesquelles je vais travailler (et qui sont en lien avec les 3 listes d'initialisation). Je modifie aléatoirement une valeur d'une ou de plusieurs de ces 3 listes et je calcule la consommation obtenue. Concrètement, je tire un nombre aléatoire compris entre 0 et la longueur de coord1 - 1. Je stocke ce nombre dans la variable rang1. Ensuite, je modifie coord1[rang1] en lui ajoutant ou en lui retirant une certaine valeur ou en ne la modifiant pas, avec l'instruction coord1[rang1]+=0.01*(randint(0,2)-1) qui ajoute ou retire 0.01 ou ne fait rien. Je fais de même avec coord2 et coord3. Ensuite, je compare la consommation obtenue, donc state[4], avec mon scoremax. Si le score obtenu est meilleur (donc plus petit), alors je copie les 3 listes coord1, coord2 et coord3 dans mes listes d'initialisation/sauvegarde coord1init et ses consœurs et je stocke mon nouveau meilleur score dans scoremax. Ensuite, au tour de boucle suivant, je modifie de nouveau une valeur dans une ou plusieurs des 3 listes et je compare le score obtenu avec mon meilleur score et ainsi de suite. Tous les 3 tours de boucle, donc tous les 3 changements (qui sont successifs), je récupère la valeur de coord1init et ses deux voisines pour les copier dans coord1, coord2 et coord3. C'est une sorte de réinitialisation de mes 3 listes de travail aux paramètres du dernier meilleur score obtenu.
J'ai parfois adapté ce nombre de boucles à parcourir avant cette réinitialisation, suivant si je voulais permettre un grand nombre de changements ou au contraire rester proche de mon actuelle meilleure solution (finalement 3 boucles était un bon choix).
J'ai également adapté la précision des valeurs que je souhaitais pour les 3 paramètres. Le dernier paramètre semble être toujours un entier (mettre une valeur non entière donne le même le score que mettre uniquement la partie entière).

Avec la publication du classement et des solutions de chacune et chacun des gagnants du premier défi, j'ai vu qu'il pouvait y avoir une histoire de nombre de décimales. J'ai donc tenté de réduire le nombre de décimales de mes paramètres (par exemple, je remplace un 2.42 par 2.4 dans la liste coord1init et je relance mon algorithme jusqu'à obtenir de nouveau mon meilleur score, les autres valeurs ayant alors été légèrement modifiées pour compenser l'écart entre 2.42 et 2.4, et je recopie alors ces autres valeurs qui ont été renvoyées avec mon 2.4 ; si avec 2.4 ça ne me renvoie pas une nouvelle solution avec mon meilleur score, alors je teste avec 2.41, en étant moins exigeant, puis ensuite avec 2.4).

Mon premier score obtenu avec mon algorithme était 537.5 (le 11/10). Je passe sous la barre des 500 le même jour, puis sous la barre des 400 le 16/10 et enfin sous la barre des 300 le 17/10 et je suis finalement arrivé à 265.325 le 21/10. Ensuite, rien. Le néant. Plus aucune amélioration pendant 2 jours. LeGmask, que je remercie grandement ici pour son aide, m'a entendu me plaindre de cette stagnation de mon score sur le chat et m'a donné quelques conseils, en particulier celui d'utiliser l'interface graphique proposée par Pavel - que je remercie grandement ici pour son script généreusement partagé dans les commentaires (page 3). LeGmask m'a proposé une version améliorée par ses soins, qui m'a aidé à comprendre l'importance et l'influence des 3 paramètres et de la variable state[2]. Avant d'utiliser cette interface graphique, j'avais compris qu'on pouvait tracer un segment (droit) avec un triplet de la forme (0, 0, n) avec n un entier. J'avais également compris que le dernier paramètre influait sur la longueur du morceau de courbe placé et que le premier paramètre modifiait l'inclinaison ou la hauteur d'arrivée. Le 2ème paramètre restait assez flou pour moi et j'ai laissé mon algorithme choisir la valeur la plus adaptée pour obtenir un bon score. En suivant les conseils de LeGmask et avec l'interface graphique de Pavel, j'ai compris que le 2ème paramètre modifiait la valeur de state[2] et que la consommation de chaque morceau de courbe placé était bien moindre lorsque state[2] avait pour valeur 0.5 (ce qu'on peut retrouver en lisant le code du script donné pour le défi, à l'endroit du calcul du score, donc de state[4], et ça concerne en particulier la variable dapi qui sanctionne tout écart de state[2] avec la valeur 0.5). Une solution simple serait de modifier le 2ème paramètre de la 1ère commande modifier_vol(n1, n2, n3) afin de mettre la variable state[2] à 0.5 et de ne plus modifier cette valeur. Le problème est que state[2] joue sur l'épaisseur du tracé et qu'il est nécessaire de modifier cette valeur pour réduire l'épaisseur du trait pour passer certains passages étroits de la cave sans toucher les bords (en fait : le passage sous chacun des 3 stalactites). Il faut donc momentanément s'éloigner de cette fameuse valeur 0.5 le temps de passer sous les stalactites pour y revenir aussi vite que possible en modifiant le 2ème paramètre du premier morceau de courbe placé après un passage étroit.

Une observation grandement facilitée par l'utilisation de l'interface graphique m'a permis de comprendre que state[0] contient la position horizontale à la fin du dernier morceau de courbe placé (la cave est en fait divisée en 128 "tranches verticales" qui donnent une abscisse comprise entre 0 et 127, stockée dans state[0]), de même state[1] contient la position verticale, state[2] contient un paramètre toujours compris entre 0 et 1 et qu'il vaut mieux conserver à 0.5 lorsque c'est possible (c'est le 2ème paramètre des commandes modifier_vol(n1, n2, n3) qui modifie la valeur de state[2]) et state[4] contient la consommation totale (donc le score). Pour state[3], je ne sais pas... J'ai également observé l'évolution de la consommation suivant la valeur prise par state[2]. Si state[2] vaut 0.5, alors chaque nouveau morceau de courbe placé (et qui conserve le fait que state[2] vaut 0.5) consomme 10 s'il est droit (1er paramètre égal à 0) et 20 s'il est courbé (1er paramètre non nul) et ce peu importe sa longueur (donnée par le 3ème paramètre). Si state[2] ne vaut pas 0.5, alors le calcul est différent et la consommation d'un morceau de courbe placé augmente de 3 lorsque sa longueur (3ème paramètre) augmente de 1. L'utilisation de l'interface graphique m'a permis de comprendre que le 2ème argument pouvait se contenter de prendre pour valeur 0.5 ou -0.5, en effet les valeurs strictement comprises entre -0.5 et 0.5 ne sont pas très productives et les valeurs en-dehors de cet intervalle ne changent rien du tout par rapport à un -0.5 ou un 0.5) ce qui a grandement augmenté l'efficacité de mon algorithme de recherche puisque la partie coord2[rang2]+=0.01*(int(0,2)-1) est devenue coord2[rang2]=0.5*(int(0,2)-1) avec seulement 3 valeurs possibles pour chaque 2ème argument.
Donc, pour minimiser la consommation globale, il faut essayer de garder state[2] à 0.5 en modifiant la valeur du 2ème paramètre, ou revenir à ce 0.5 dès que possible. Il faut également minimiser le nombre de commandes modifier_vol(n1, n2, n3) car chaque nouvelle commande a un coût fixe. Il faut donc favoriser de longs morceaux (traversant le plus grand nombre possible de "tranches verticales", peu importe la position verticale (state[1]) de départ et d'arrivée), si possible en ligne droite.

Un dernier point : les collisions. Chaque collision consomme 7 ou 14 (ou plus). Il faut donc à tout prix réduire le nombre de collisions. Il est possible de parcourir la grotte sans collision à l'exception du passage sous le 3ème stalactite. Ce passage entraîne 4 ou 5 collisions dans la plupart des cas. En fait, j'ai modifié mon algorithme de recherche pour l'orienter sur l'optimisation de ce nombre de collisions et surtout j'en ai demandé l'affichage. Le nombre de collisions est calculé deux fois dans chaque "tranche verticale" de cave et prend la forme d'un nombre entier compris entre 0 et 12, inclus. J'ai créé une liste (colli) qui contient ces nombres de collisions et ça donne une liste de 255 entiers compris entre 0 et 12, inclus.
Une de mes tactiques pour améliorer mon score a été de minimiser ma consommation sans prendre en compte le nombre de collisions, puis de modifier mes 3 listes de coordonnées pour réduire le nombre de collisions lors du passage sous le 3ème stalactite puis de réduire le nombre de collisions après le 3ème stalactite. N'ayant d'abord pas utilisé l'interface graphique de Pavel, j'ai tenté d'optimiser le début du parcours (quitte à casser la suite du parcours), puis le passage sous le 3ème stalactite (quitte à casser la suite du parcours) puis de corriger la fin du parcours, et tout ça en jouant sur les valeurs de la liste colli qui contient le nombre de collisions tout au long du chemin parcouru. J'ai ainsi créé un 2ème algorithme ayant pour seul but de réduire le nombre de collisions sous le 3ème stalactite. En fait, dans la liste colli, le passage sous le 3ème stalactite correspond aux 169 et 170ème valeurs (donc d'indices 168 et 169). Dans l'idée, j'ai lancé mon script en mettant comme condition de réussite/affichage le fait d'avoir les 168 premières valeurs égales à 0, donc avec aucune collision avant le passage critique, puis comme condition d'avoir la somme colli[168]+colli[169] (écrite sous la forme sum(colli(168:170]) dans mon script) égale à 4 (en fait 2+2), puis comme condition d'avoir les derniers termes de la liste colli tous égaux à 0.
J'ai tenté à de très nombreuses reprises d'avoir strictement moins de 4 collisions sur le parcours complet, mais rien n'y a fait, ni avec mon algorithme de recherche, ni avec la version adaptée pour la réduction du nombre de collisions, ni avec l'interface graphique de Pavel améliorée par LeGmask je n'ai réussi à réduire le nombre de collisions strictement en-dessous de 4.

Le 26/10 j'ai finalement obtenu 220.0 avec 4 collisions en tout, puis 221.0 mais avec 5 collisions. En supprimant cette 5ème collision, j'ai finalement obtenu 214. Le 27/10 Pavel envoie un score à 211 que j'ai réussi à obtenir quelques heures plus tard en imitant son trajet, sauf pour la fin. (On peut en effet remplacer deux segments droits qui coûtent 10 et 10 lorsque state[2] vaut 0.5 par un morceau courbé qui coûte 10+10 directement). En partant du trajet à 214.0, il restait une optimisation à faire, qu'il a faite avant moi. Bien joué ! J'ai passé de longues heures à essayer de réduire encore le score, pour éventuellement passer à 208 en raccourcissant un morceau courbé dans un passage étroit (donc sans avoir state[2]=0.5) et en rallongeant un segment droit, mais sans succès. J'ai également essayé de réduire le nombre de morceaux (-10 ou -20) tout en ayant une collision supplémentaire (+7 ou +14) mais sans y parvenir. 211.0 est peut-être le meilleur score possible, après tout...
En dégradant ce 211.0 j'ai obtenu 213.98 puis 213.56 puis 213.5 (justement en modifiant le 2ème paramètre du morceau qui contient la portion en rouge et en le mettant à 0.25 plutôt qu'à 0.5, le trait est moins fin mais donne toujours 4 collisions et la consommation globale est alors de 213.5). Il m'a semblé impossible d'obtenir un score strictement compris entre 211.0 et 213.5 et mon algorithme n'a pas trouvé non plus. Le participant qui est juste derrière moi a obtenu 213.501 et le suivant 213.502. En fait, il est possible d'obtenir des scores compris entre 213.500 et 213.501. Par exemple, en mettant 0.2501 plutôt que 0.25 au 2ème paramètre du morceau de courbe qui contient la zone en rouge, on obtient un score à 213.5002 :) et en mettant 0.25001 on obtient 213.50002 :D
(message original)

Image


1. Image Pavel (ImageImage) : 211 (Programme : q103.py)

pavel a écrit:J'ai commencé par modifier le code cave.py pour en faire une version interactive qui peut être contrôlée avec les touches du clavier:
https://gitea.planet-casio.com/Pavel/cavegui

En jouant avec cette version interactive, j'ai essayé de comprendre le comportement du système. Voici ce que j'ai appris:

• il y a trois paramètres à contrôler (l'accélération verticale, le changement de forme du ballon, la durée)
• la vitesse horizontale est constante
• les mouvements à vitesse constante et avec la forme initiale du ballon sont gratuits
• pour le deuxième paramètre, seules trois valeurs doivent être utilisées: 0, 0.5, -0.5
• quand le deuxième paramètre est -0.5, la duree doit etre 1
• il faut minimiser la quantité d'instructions avec l'accélération ou le changement de forme du ballon différent de zéro
• il faut minimizer la durée de deplacements avec la forme du ballon différente de sa forme initiale
• il faut minimizer la quantite de collisions

Regarder des images des solutions des autres participants m'a aussi aidé à apprendre quelques astuces.

Comme il est très facile d'obtenir de bons scores simplement en jouant avec la version interactive du code, je n'ai même pas essayé de coder un algorithme qui trouvera la solution automatiquement.
(message original)

Image


Conclusion



Ce défi est pas mal de grind, avec peu de possibilités d'optimiser le résultat à l'ordinateur (ou en tous cas, pas assez de compétition pour vous inciter à le faire). La précision des passages fait quand même qu'un plan visuel ne suffisait pas à s'en sortir, il fallait aussi traiter chaque collision prudemment tout en limitant le nombre d'instructions.

Personnellement je suis partagé entre ce genre de format et ce qu'on trouve au troisième défi avec de l'IA à programmer. D'un côté jouer directement sur la calculatrice est plus accessible, d'un autre les sujets « paramétrés » (on donne une famille d'instances à résoudre) offrent beaucoup plus de liberté. Qu'est-ce que vous en pensez, vous ? :)

En tous cas, merci infiniment à tous les participations pour vos envois et vos commentaires. On se retrouve bientôt pour les résultats du défi du Léviathan ! ;)
Dernière édition par Lephe le 14 Déc 2020, 18:30, édité 1 fois.
Lien vers le sujet sur le forum: Résultat du concours de rentrée 2020 - Défi de Quetzalcoatl (Commentaires: 5)

Rajoute le débogage GDB à ton émulateur Graph 90+E/fx-CG50 !

Nouveau messagede critor » 16 Déc 2020, 13:39

Au début des années 2000, Casio et Texas Instruments supportaient encore activement le développement tiers pour leurs calculatrices.

Les constructeurs diffusaient de véritables SDK pour leurs modèles de l'époque.

Chez Texas Instruments on peut citer :

Chez Casio nous avions le fx-9860G SDK, qui en France concernait donc les Graph 85.

Ces logiciels couplaient :
  • un assembleur éventuellement accompagné d'un compilateur
  • avec un émulateur tout spécialement adapté au développement, avec de quoi contrôler en direct l'état mémoire ou processeur, et même changer la version du système d'exploitation émulé

Mais les choses ont bien changé depuis. Casio et Texas Instruments ne publient plus de mise à jour de ces outils depuis maintenant une 15aine d'années, et ils sont totalement obsolètes car non adaptés aux modèles actuellement commercialisés. :'(

Ne sont plus diffusés par les constructeurs que des émulateurs orientés utilisateurs, notamment pour la vidéoprojection en classe. Ils ne permettent pas de connaître l'état mémoire/processeur, encore moins de changer la version du système, et ne sont ainsi absolument pas adapté au développement de programmes ou applications en langage machine. Sans compter qu'ils ne sont pas toujours parfaitement fidèles au matériel.

Ce n'est pas (encore ?...) le cas chez Casio, mais chez Texas Instruments le développement tiers est même désormais farouchement combattu. :mj:

Du côté de Texas Instruments, la communauté des développeurs a pris le relais, réinventant ses propres émulateurs pour les machines récentes puis les adaptant progressivement aux besoins des développeurs.

On peut citer CEmu pour les TI-83 Premium CE et TI-84 Plus CE, ou encore Firebird pour les TI-Nspire.

Du côté de Casio hélas, aucun émulateur tiers n'est jamais sorti. Nous ne disposons que émulateurs officiels orientés pour l'enseignement et sur lesquels nous n'avons aucun contrôle. :mj:

Le développement d'applications était donc peu confortable, nécessitant dans tous les cas des tests sur machine et donc d'avoir en permanence la calculatrice et les câbles sous la main.

Mais surtout dans le cas de développement d'utilitaires système avec du code touchant à des zones sensibles, en cas de bugs cela pouvait potentiellement détruire définitivement la calculatrice. :mj:

C'est peut-être justement pour ça qu'il existe peu d'utilitaires système pour Casio par rapport aux modèles concurrents.

C'est donc une autre piste qu'explore aujourd'hui Redoste sur Planète Casio, dans le contexte de la Graph 90+E (ou fx-CG50 hors de France).

En effet si c'est apparemment trop difficile de réinventer notre propre émulateur, pourquoi ne pas tout simplement modifier l'émulateur officiel ? ;)

Redoste révolutionne aujourd'hui la face du monde du développement Casio, en rajoutant un serveur GDB à ton émulateur, de quoi pouvoir pleinement tester et déboguer tes applications aussi ambitieuses soient-elles sans avoir à connecter ni risquer ta calculatrice ! :bj:
Il devient même possible d'utiliser GDB pour analyser le firmware de Casio ! :D

La méthode Redoste ne concerne que l'émulateur de Graph 90+E / fx-CG50 installable sur Windows.

Il te suffira tout simplement de remplacer dans le dossier d'installation la bibliothèque .dll d'émulation du processeur SH4 (fichier CPU73050.dll) par la version modifiée de Redoste.

Attention, cette manipulation n'est pas compatible avec l'émulateur Mac, ni avec l'émulateur sur clé USB. :#non#:

Lien : https://github.com/redoste/fx-CG50_Mana ... -gdbserver

Téléchargement : Emulateur Graph 90+E / fx-CG50 version 3.50 à installer sur Windows
(période d'essai gratuite sans engagement de 90 jours, prolongeable gratuitement en cas de besoin jusqu'au 31 décembre 2020 si déjà entamée ou épuisée)

Source : https://www.planet-casio.com/Fr/forums/ ... iowin.html
Lien vers le sujet sur le forum: Rajoute le débogage GDB à ton émulateur Graph 90+E/fx-CG50 ! (Commentaires: 1)

Scripts & résultats concours dessin Noël Casio Graph Python

Nouveau messagede critor » 17 Déc 2020, 14:33

Enseignant de matière scientifique en collège ou lycée, jusqu'à ce mardi 15 décembre Casio t'a permis de participer à un superbe concours de Noël 2020.

Il te suffisait de programmer et envoyer un superbe dessin de Noël sur ta calculatrice Casio ou son émulateur, avec 2 catégories au choix :
  • fx-92+ Spéciale Collège (langage de programmation orienté tracé à la Scratch/Logo)
  • Casio Graph 35+E II ou Graph 90+E avec l'application Python

9668A gagner dans chacune des 2 catégories :
  • pour le meilleur dessin, un superbe lot de 180€ de valeur médiane : 1 disque dur externe SSD de 1 To de capacité + 1 calculatrice graphique Casio Graph 90+E ou Graph 35+E II au choix
  • pour le 2ème meilleur dessin, un non moins superbe lot de 150€ de valeur médiane : 1 enceinte bluetooth + 1 calculatrice graphique Casio Graph 90+E ou Graph 35+E II au choix
    129871302313021
  • pour tous les autres pas de perdant avec un superbe lot de participation : 1 batterie externe + 1 clé USB

Les gagnants ont maintenant été choisis par Casio, et l'ensemble des participants prévenus de leur lot par courriel.

Plusieurs participants ont partagé leurs scripts Python et nous allons te les présenter ci-dessous, ainsi que de façon tout à fait officieuse les résultats du concours puisque par pur hasard les meilleurs dessins choisis par Casio en font partie ! :bj:

1323413235Voici ci-contre ma propre participation, une forêt de Noël, envoyée juste pour le plaisir. ;)
Je ne souhaitais piquer de lot à personne et je l'ai bien dit, et c'est parfait puisque je gagne bien le seul lot de participation. :)

Ce script dispose d'un mode monochrome, et est compatible à la fois Graph 35+E II et Graph 90+E, même si c'est sur cette dernière qu'il révèle son plein potentiel.

Voici l'astuce utilisée pour détecter le type d'écran :
Code: Tout sélectionner
def init_casioplot():
  global color_screen, screen_w, screen_h
  set_pixel(0, 0, (0, 0, 255))
  col = get_pixel(0, 0)
  color_screen = col[0] != col[2]
  screen_w, screen_h = color_screen and (384, 192) or (128, 64)


Dans l'ordre, mon script utilisant la bibliothèque de tracé par pixels casioplot :
  1. fait tomber la nuit : Il utilise ici 2 dégradés dans les tons de bleu pour représenter le sol et le ciel.
  2. allume les étoiles (pixels blancs)
  3. plante une forêt de sapins - nous allons y revenir
  4. décore mon plus beau sapin : des disques de rayon 2 selon 3 couleurs de remplissage alternées, avec une couleur voisine pour la bordure rajoutant un peu de relief
  5. saupoudre le tout de neige : des disques de rayon 1

La bibliothèque casioplot offre un nombre assez restreint de fonctions de tracé :
  • clear_screen() pour effacer l'écran en blanc
  • set_pixel(x,y,couleur) pour allumer un pixel dans une couleur (R,G,B) au choix
  • draw_string(x,y,string,couleur,taille) pour écrire du texte dans une couleur RGB et selon une taille de police au choix ("small", "medium" ou "large")

Ce n'est absolument pas un défaut, au contraire cela permet un travail absolument passionnant : la construction et optimisation de fonctions pour tracer chaque primitive. J'ai donc rajouté de quoi tracer des cercles, disques, mais également segments pour les sapins :
Code: Tout sélectionner
def draw_line(x1, y1, x2, y2, c):
  m, a1, b1, a2, b2 = 0, int(x1), int(y1), int(x2), int(y2)
  if (x2 - x1) ** 2 < (y2 - y1) ** 2:
    m, a1, a2, b1, b2 = 1, b1, b2, a1, a2
  if min(a1, a2) != a1: a1, b1, a2, b2 = a2, b2, a1, b1
  for k in range(a2 - a1 + 1):
    a, b = a1 + k, int(b1 + (b2 - b1) * k / ((a2 - a1) or 1))
    set_pixel((a, b)[m], (b, a)[m], c)

def draw_ellipse(x, y, rx, ry, c):
  for h in range(-int(ry), int(ry)+1):
    w = sqrt(max(0, rx*rx*(1-h*h/ry/ry)))
    x1, x2 = int(x - w), int(x + w)
    yc = int(y + h)
    set_pixel(x1, yc, c)
    set_pixel(x2, yc, c)
  for w in range(-int(rx), int(rx)+1):
    h = sqrt(max(0, ry*ry*(1-w*w/rx/rx)))
    y1, y2 = int(y - h), int(y + h)
    xc = int(x + w)
    set_pixel(xc, y1, c)
    set_pixel(xc, y2, c)

def fill_ellipse(x, y, rx, ry, c):
  for h in range(-int(ry), int(ry)+1):
    w = sqrt(max(0, rx*rx*(1-h*h/ry/ry)))
    x1, x2 = int(x - w), int(x + w)
    yc = int(y + h)
    draw_line(x1, yc, x2, yc, c)

def draw_circle(x, y, r, c):
  draw_ellipse(x, y, r, r, c)

def fill_circle(x, y, r, c):
  fill_ellipse(x, y, r, r, c)


La construction des sapins utilise des similitudes, transformations géométriques conservant les rapports de distances.
Une similitude peut se décomposer en une isométrie (transformation conservant les distances : translation, rotation, ...) la plupart du temps suivie d'une homothétie (agrandissement ou réduction).

Plus précisément, en partant d'un couple de seulement 2 points que l'on va appeler le tronc, 5 similitudes sont appliquées pour créer 5 branches (en bas à gauche, à gauche, en haut, à droite, en bas à droite).

En itérant le même processus sur chacune de ces branches, on fait ainsi pousser l'arbre, le développant dans ces 5 directions.

Par exemple, sur la capture couleur ci-contre, nous avons de gauche à droite des arbres avec :
  • 1 itération
  • 3 itérations
  • 5 itérations (profitant pleinement des 1 Mio de mémoire de tas Python ;) )
  • 4 itérations
  • 3 itérations

Pour l'exécution sur Graph 35+E II nous avons dû limiter le nombre d'itérations afin de ne pas exploser la mémoire de tas Python (heap) ici limitée à 100 Kio. Nous avons ici de gauche à droite :
  • 0 itération (donc le tronc initial nu)
  • 1 itération (donc le tronc avec ses 5 branches initiales)
  • 3 itérations
  • 2 itérations
  • 0 itération

Code: Tout sélectionner
from math import pi, sin, cos, exp, sqrt
import matplotlib.pyplot as plt
from random import *
from casioplot import *

def init_casioplot():
  global color_screen, screen_w, screen_h
  set_pixel(0, 0, (0, 0, 255))
  col = get_pixel(0, 0)
  color_screen = col[0] != col[2]
  screen_w, screen_h = color_screen and (384, 192) or (128, 64)

def transform(x, y):
  f = screen_h * 45 // 64
  return (x*f,screen_h-1-y*f)

def draw_line(x1, y1, x2, y2, c):
  m, a1, b1, a2, b2 = 0, int(x1), int(y1), int(x2), int(y2)
  if (x2 - x1) ** 2 < (y2 - y1) ** 2:
    m, a1, a2, b1, b2 = 1, b1, b2, a1, a2
  if min(a1, a2) != a1: a1, b1, a2, b2 = a2, b2, a1, b1
  for k in range(a2 - a1 + 1):
    a, b = a1 + k, int(b1 + (b2 - b1) * k / ((a2 - a1) or 1))
    set_pixel((a, b)[m], (b, a)[m], c)

def draw_ellipse(x, y, rx, ry, c):
  for h in range(-int(ry), int(ry)+1):
    w = sqrt(max(0, rx*rx*(1-h*h/ry/ry)))
    x1, x2 = int(x - w), int(x + w)
    yc = int(y + h)
    set_pixel(x1, yc, c)
    set_pixel(x2, yc, c)
  for w in range(-int(rx), int(rx)+1):
    h = sqrt(max(0, ry*ry*(1-w*w/rx/rx)))
    y1, y2 = int(y - h), int(y + h)
    xc = int(x + w)
    set_pixel(xc, y1, c)
    set_pixel(xc, y2, c)

def fill_ellipse(x, y, rx, ry, c):
  for h in range(-int(ry), int(ry)+1):
    w = sqrt(max(0, rx*rx*(1-h*h/ry/ry)))
    x1, x2 = int(x - w), int(x + w)
    yc = int(y + h)
    draw_line(x1, yc, x2, yc, c)

def draw_circle(x, y, r, c):
  draw_ellipse(x, y, r, r, c)

def fill_circle(x, y, r, c):
  fill_ellipse(x, y, r, r, c)

def horiz_gradient(x, y, w, h, col1, col2):
  for k in range(h):
    draw_line(x, y + k, x + w - 1, y + k, [col1[i] + (col2[i] - col1[i])*k//(h-1) for i in range(3)])

def cmath_exp(a):
  return exp(a.real) * (cos(a.imag) + 1j*sin(a.imag))

def similitude(u, v):
    v = 1j * (u - v)
    return lambda z: v*z + u

def generer_arbre(n):
  lf = (
    similitude(.2j, .2j + .5*cmath_exp(1j * pi / 7)),
    similitude(.22j, .22j + .45j*cmath_exp(1j * pi / 3)),
    similitude(.55j, .55j + .35*cmath_exp(1j * pi / 6)),
    similitude(.57j, .57j + .3j*cmath_exp(1j * pi / 3)),
    similitude(.7j, 1.2j - .01)
  )
  lz = [0j, 0.7j]
  lz1 = lz[:]
  for _ in range(n):
    lz2 = []
    for f in lf:
      lz2.extend([f(z) for z in lz1])
    lz.extend(lz2)
    lz1 = lz2
  return lz

def rotate_color(c):
  return (c[1], c[2], c[0])
   
def trace(d, nb_trees, nb_balls, nb_stars, nb_flakes):

  color_black = (0,) * 3
  color = color_screen and (255,) * 3 or color_black

  # fait tomber la nuit
  colors = (color_black, (0, 0, 127), (0, 127, 255))
  dy = screen_h / (len(colors))
  if color_screen:
    for k in range(len(colors) - 1):
      horiz_gradient(0, round(dy*k), screen_w, round(dy), colors[k], colors[k + 1])
    horiz_gradient(0, screen_h - 1 - round(dy), screen_w, round(dy), (0, 63, 127), color_black)
  dx = (screen_w - 1) / 2 / (nb_trees - 1)

  # allume les etoiles
  for k in range(nb_stars):
    set_pixel(randint(0, screen_w - 1), randint(0, screen_h - 1 - round(dy)), color)

  # plante une foret de sapins
  for p in range(d - nb_trees, d + 1):
    x0 = screen_w // 2 + (p < d and dx * ((d - p) % 2 and d + 1 - p or p - d))
    dy = screen_h / (len(colors)) * (d - p) / nb_trees
    lz = generer_arbre(p)
    for k in range(0, len(lz), 2):
      x1, y1 = transform(lz[k].real, lz[k].imag)
      x2, y2 = transform(lz[k+1].real, lz[k+1].imag)
      x1 += x0
      x2 += x0
      draw_line(x1, y1 - dy, x2, y2 - dy, (0, 160 * (1 - (d - p)//(nb_trees - 1)), 0))

  # decore mon plus beau sapin
  if color_screen:
    lz, r, color_in, color_out = lz[1::max(1, len(lz)//nb_balls)], 2, (0, 255, 255), (0, 0, 255)
    for z in lz:
      x, y = transform(z.real, z.imag)
      x += x0
      fill_circle(x, y, r, color_in)
      draw_circle(x, y, r, color_out)
      color_in, color_out = rotate_color(color_in), rotate_color(color_out)

  # saupoudre de neige
  if color_screen:
    for k in range(nb_flakes):
      fill_circle(randint(0, screen_w - 1), randint(0, screen_h - 1), 1, color)

init_casioplot()
trace(color_screen and 5 or 3, 5, 30, 100, 40)
show_screen()

13236Nous retrouvons maintenant Thomas Fontaine qui s'était déjà illustré au 3ème défi de notre concours de rentrée 2019. ;)

On passe aux choses sérieuses, puisque Thomas nous annonce que Casio a classé son dessin en 2ème position ! :D

Thomas utilise ici le module de tracés relatifs turtle sur Graph 90+E pour nous dessiner un buste de renne.

Un tracé façon 3D fil de fer, décomposant très artistiquement le tout en triangles et quadrilatères telle une sculpture sur bois.

Le script profite avantageusement en taille de la symétrie verticale, n'ayant donc à décrire que le demi-buste qui sera itéré 2 fois.

Le plus remarquable c'est qu'une fois le tracé de chaque demi-buste commencé après un goto() et un couple penup/pendown() initial, à aucun moment la tortue ne se téléporte ou ne lève le stylo, superbe arabesque ! :favorite:

Sur chaque demi-buste, sont tracés dans l'ordre par le code reproduit ci-après:
  1. tête
  2. oreille
  3. cou
  4. poitrail
  5. bois

Toutes nos félicitations Thomas ! :D

Code: Tout sélectionner
from turtle import *
pensize(2)
for k in [-1,1]:
  penup()
  goto(0,-50)
  pendown()
  hideturtle()

  setheading(90-90*k+30*k)
  fd(19)
  lt(90*k)
  fd(10)

  lt(60*k)
  fd(10)
  fd(-10)
  lt(40*k)
  fd(12)
  fd(-12)
  rt(100*k)

  rt(15*k)
  fd(10)
  rt(15*k)
  fd(10)
  rt(40*k)
  fd(15)
  lt(140*k)
  fd(17)
  fd(-17)
  rt(40*k)
  fd(20)
  fd(-20)
  rt(100*k)
  #oreille
  lt(15*k)
  fd(10)
  lt(60*k)
  fd(7)
  lt(100*k)
  fd(7)
  fd(-7)
  rt(210*k)
  fd(25)
  rt(163*k)
  fd(25)
  fd(-25)
  lt(48*k)
  fd(8)
  rt(65*k)
  fd(20)
  fd(-20)
  lt(50*k)
  fd(20)
  rt(115*k)
  fd(15)
  fd(-15)
  lt(30*k)
  fd(16)
  fd(-16)
  lt(30*k)
  fd(13)

  lt(90*k)
  fd(5)
  rt(110*k)
  fd(10)
  lt(30*k)
  fd(10)
  fd(-10)
  rt(30*k)
  fd(-10)
  lt(90*k)
  fd(20)
  rt(120*k)
  fd(7)
  lt(10*k)
  fd(12)
  fd(-12)
  rt(10*k)
  fd(-7)
  lt(130*k)
  fd(9)

  rt(60*k)
  fd(5)
  lt(45*k)
  fd(50)

  rt(165*k)
  fd(52)
  fd(-52)
  lt(165*k)
  #cou
  lt(140*k)
  fd(35)
  lt(70*k)
  fd(42)
  fd(-42)
  rt(30*k)
  fd(29)
  lt(45*k)
  fd(32)

  rt(40*k)
  fd(5)
  lt(22*k)
  fd(13)
  lt(20*k)
  fd(15)
  lt(40*k)
  fd(11)
  lt(108*k)
  fd(49)
  fd(-49)
# on est en haut de la tete
#bois
  rt(108*k)
  fd(-13)
  #debut des bois
  rt(110*k)
  fd(10)
  lt(90*k)
  fd(6)
  fd(-6)
  rt(130*k)
  fd(30)
  lt(90*k)
  fd(5)
  fd(-5)
  rt(60*k)
  fd(20)
  lt(90*k)
  fd(5)
  fd(-5)
  rt(40*k)
  fd(25)
  lt(165*k)
  fd(25)
  rt(43*k)
  fd(15)
  rt(24*k)
  fd(20)
  fd(-20)
  rt(120*k)
  fd(15)
  lt(90*k)
  fd(5)
  fd(-5)
  rt(45*k)
  fd(25)
  lt(165*k)
  fd(25)
  rt(45*k)
  fd(15)
  rt(45*k)
  fd(5)
  rt(90*k)
  fd(10)
  lt(90*k)
  fd(4)
  fd(-4)
  rt(120*k)
  fd(15)
  lt(165*k)
  fd(15)
  lt(30*k)
  fd(15)
  rt(75*k)
  fd(15)
  fd(-5)
  rt(70*k)
  fd(12)
  lt(160*k)
  fd(12)
  rt(30*k)
  fd(10)

13237Voici maintenant notre cher Afyu, qui utilise également le module turtle sur Graph 90+E.

Afyu nous apprend que c'est sa participation qui a été retenue par Casio en tant que meilleur dessin de Noël ! :bj:

Afyu nous dessine ici toute une scène de Noël. Nous y retrouvons plusieurs éléments des participations précédentes :
  • le sapin
  • ses boules
  • une étoile
  • le renne, ici en entier ;)
Mais c'est surtout la scène de Noël la plus complète. Afyu profite en effet ici de l'écran large de la Casio Graph 90+E pour nous rajouter en prime un traineau recevant une pluie de cadeaux. :D

Sont tracés dans l'ordre par le code ci-après :
  1. le renne avec :
    1. sa patte arrière droite
    2. son dos
    3. ses oreilles
    4. ses bois
    5. sa tête
    6. son torse
    7. sa patte avant droite
    8. sa patte avant gauche
    9. son abdomen
    10. sa patte arrière gauche
  2. le traineau
  3. le harnais
  4. le sapin avec :
    1. son feuillage
    2. ses guirlandes
    3. ses boules
    4. son étoile
  5. les 4 paquets cadeaux avec pour chacun :
    1. la boîte
    2. le ruban

Et ce qu'il y a de remarquable ici c'est que l'on ne repère quasiment pas d'élément géométrique remarquable, témoin du soin et de la précision apportés au tracé ! :o

Bravo Afyu, nous sommes très fiers de toi ! :bj:

Code: Tout sélectionner
from turtle import *
hideturtle()
penup()
goto(-110,-50)
pendown()
#4  me patte
rt(40)
penup()
for i in range(30):
  fd(1/4)
  lt(1/2)
pendown()
for i in range(30):
  fd(1)
  rt(3-i/15)
for j in range(4):
  for i in range(10):
    fd(1/2)
    lt(3)
  lt(60)
lt(120)
for i in range(10):
  fd(1/2)
  rt(3)
lt(110)
for i in range(20):
  fd(1)
  rt(1.5)
#fd(30)
lt(50)
for i in range(25):
  fd(0.6)
  rt(2)
for i in range(15):
  fd(1)
  lt(3)
for i in range(30):
  rt(12)
  fd(1/2)
for i in range(15):
  fd(1)
  lt(4)
for i in range(30):
  fd(1)
  rt(i//10)
lt(30)
for i in range(40):
  fd(1/2)
  rt(i//10)
setheading(0)
penup()
fd(-15/2)
pendown()#les oreilles
for i in range(40):
  fd(((400-10*i)//160)/2)
  lt(4)
lt(290)
#for i in range(42):
  #fd((10*i)//160)
  #lt(4.2)
#penup()
#for i in range(42):
  #fd(-(10*(28-i))//160)
  #lt(-4.2)
#pendown()
for i in range(40):
  fd(((10*i)//160)/2)
  lt(4)
penup()
rt(90)
#fd(5)
lt(90)
fd(-5/2)
pendown()
#les bois
#penup()
rt(110)
fd(1)
#pendown()
rt(90)
for i in range(20):
  fd(1)
  rt(1)
lt(20)
for j in range(3):
  rt(90)
  #for i in range(20):
    #fd(3)
    #lt(2+20-2*i)
  for i in range(10):
    fd(3/2)
    lt(2+10-i)
  for i in range(4):
    fd(1/2)
    lt(36)
  lt(10)
  for i in range(9):
    fd(1)
    rt(1+2*i)
lt(40)   
for i in range(80):
  fd(1/2)
  rt(2)
for i in range(10):
  fd(1/2)
  lt(18)
for i in range(30):
  fd(1/2)
  lt(1)
for i in range(20):
  fd(1/2)
  rt(3)
#fin des bois
penup()
setheading(-90)
fd(15/2)
lt(90)
fd(1)
pendown()
setheading(240)
pensize(2)
for j in range(2):
  for i in range(40):
    fd(1/12)
    rt(3)
  rt(60)
pensize(1)
setheading(90)
penup()
fd(15/2)
lt(90)
fd(1)
lt(75)

pendown()
rt(60)
for i in range(20):
  fd(1/2)
  lt(2)
lt(40)
for i in range(30):
  fd(1/2)
  rt((30-i)//7)
lt(70)
for j in range(4):
  for i in range(10):
    fd(1/2)
    lt(5)
  lt(40)
rt(0)
#for j in [1,-1]:
  #for i in range(30):
    #fd(j)
    #lt(4*j)
fd(5/2)
rt(50)
fd(1)
lt(70)
for i in range(25):
  fd(1)
  lt((50-5*i)/3.7)
lt(70)
for j in range(2):
  for i in range(10):
    fd(1)
    rt(2)
  lt(40)
rt(50)
fd(7/2)
fd(-7/2)
rt(40)
#1  re patte
for j in range(2):
  for i in range(30):
    fd(1/2)
    rt(1)
  lt(70)
lt(20)
fd(5)
rt(200)
for j in range(4):
  for i in range(10):
    fd(1/2)
    lt(3)
  lt(60)
lt(100)
for j in range(2):
  for i in range(30):
    fd(-1/2)
    rt(-1)
  rt(70)
  penup()
#2  me patte
#lt(90)
fd(15/2)
#pendown()
lt(100)
pendown()
for j in range(2):
  for i in range(30):
    fd(1/2)
    rt(1)
  lt(50)
lt(30)
fd(5)
rt(190)
for j in range(4):
  for i in range(10):
    fd(1/2)
    lt(3)
  lt(60)
lt(100)
for j in range(2):
  for i in range(30):
    fd(-1/2)
    rt(-1)
  rt(60)
#bas du corps
rt(90)
fd(5/2)
fd(-5/2)
rt(120)
for i in range(50):
  fd(1/2)
  lt(1/4)
lt(90)
penup()
fd(15/2)
pendown()
rt(190)
#3  me patte
for i in range(40):
  fd(1/2)
  lt(2-i/20)
rt(0)
for i in range(30):
  fd(1/2)
  rt((100-3*i)/30)
lt(0)
for j in range(4):
  for i in range(10):
    fd(1/2)
    lt(3)
  lt(60)
lt(120)
for i in range(10):
  fd(1/2)
  rt(3)
lt(90)
for i in range(30):
  fd(1/2)
  lt(1)
lt(10)
for i in range(30):
  fd(1/2)
  rt(1+i//15)
rt(20)
for i in range(30):
  fd(1/2)
  lt(1+i//15)



from turtle import *
hideturtle()
penup()
setheading(0)
pencolor([120/255,60/255,0])
pensize(3)
goto(-80,-40)
pendown()
rt(35)
for i in range(45):
  fd(1/2)
  rt(1)
rt(90)
#bois
pensize(3)
pencolor([120/255,60/255,0])
for i in range(30):
  fd(1)
  lt(6)
rt(10)
fd(5)
lt(90)

for i in range(4):
  fd(10)
  rt(90)
  fd(3.5)
  rt(90)
  fd(10)
  lt(90)
  fd(20)
  lt(90)

rt(90)
for i in range(10):
  fd(0.6)
  rt(18)

fd(47*2+5)

for i in range(28):
  fd(1.45)
  rt(6)

rt(84)
for i in range(20):
  fd(1/2)
  rt(1)
fd(7/2)

setheading(0)
fd(90)

#arri  re
lt(90)
for i in range(30):
  fd(3/2)
  rt(i//10)

setheading(0)
for i in range(17):
  fd(1/2)
  lt(10)
fd(3/2)
penup()
fd(-3/2)
for i in range(17):
  fd(-1/2)
  lt(-10)
pendown()
setheading(160)
for i in range(38):
  fd(3)
  lt((15-i)/2)
for i in range(40):
  fd(1/2)
  lt((15-i))
 
penup()
setheading(0)
fd(105)
lt(90)
fd(20)
pendown()

setheading(160)
for i in range(38):
  fd(3)
  lt((15-i)/2)
for i in range(42):
  fd(1/2)
  lt((15-i))

lt(70)
fd(15/2)

pensize(2)
setheading(203)
for i in range(34):
  fd(3)
  rt(2-i/40)



from turtle import *
setheading(-30)
penup()
goto(110,-80)
hideturtle()
#pendown()
pencolor([0,205/255,0])
pensize(2)
for k in [-1,1]:
  penup()
  goto(110,-80)
  setheading(90)
  fd(15)
  setheading(90-120*k)
  fd(16)
  pendown()
  for j in range(4):
    for i in range(30):
      fd(1-j/5)
      lt(k*(1+i//20))
    rt(50*k)
    for i in range(10):
      fd(-1+j/5)
      lt(k*(-1-i//20))

    lt(50*k)
    for i in range(50):
      fd(1-j/5)
      lt(k*(i/30))
    rt(40*k)
    for i in range(40):
      fd(-1+j/5)
      lt(k*(-i//20))

    lt(70*k)
    for i in range(10):
      fd(1-j/5)
      lt(k*(1+i//20))
    rt(30*k)
    for i in range(40):
      fd(-1+j/5)
      lt(k*(-1-i//30))
    setheading(90-90*k-30*k+30*j*k)
  setheading(90-50*k)
  for i in range(30):
    fd(1/2)
    lt(k*(1+i//20))
  rt(40*k)
  for i in range(20):
    fd(-1/3)
    lt(k*(-1-i//20))

  lt(50*k)
  for i in range(30):
    fd(1/2)
    lt(k*(i/10))
  rt(60*k)
  for i in range(30):
    fd(-1/3)
    lt(k*(i/20))

  lt(20*k)
  for i in range(30):
    fd(1/2)
    lt(k*(1+i//20))
#guirlandes
penup()
goto(120,50)
pendown()
pencolor([1,0,0])

setheading(-140)
for i in range(6):
  pensize(5)
  fd(3)
  pensize(2)
  fd(3)
  rt(5)

setheading(-50)
for i in range(10):
  pensize(5)
  fd(3)
  pensize(2)
  fd(3)
  lt(6)
 
setheading(-150)
for i in range(12):
  pensize(5)
  fd(3)
  pensize(2)
  fd(3)
  rt(4)
 
setheading(-60)
for i in range(13):
  pensize(5)
  fd(3)
  pensize(2)
  fd(3)
  lt(6)
 
setheading(-120)
for i in range(15):
  pensize(5)
  fd(3)
  pensize(2)
  fd(3)
  rt(6)
 
setheading(-50)
for i in range(13):
  pensize(5)
  fd(3)
  pensize(2)
  fd(3)
  lt(6)

#boules
from random import randint
for coord in [(17,32),(-17,24),(-60,-10),(15,0),(-30,-40),(40,-50)]:
  penup()
  goto(coord[0]+110,coord[1]-10)
  pensize(20)
  pencolor([randint(1,10)/10,randint(1,10)/10,randint(1,10)/10])
  pendown()
  fd(1)

#etoile
penup()
goto(100,80)
pendown()
pencolor([220/255,220/255,40/255])
pensize(5)
setheading(0)
for i in range(5):
  fd(20)
  rt(72*2)




#paquets
from random import randint
for coord in [(0,20),(-30,-10),(-70,10),(-30,50)]:
  penup()
  goto(coord[0],coord[1])
  pendown()
  pensize(7/2)
  pencolor([randint(1,10)/10,randint(1,10)/10,randint(1,10)/10])
  setheading(randint(1,60)-30)
  for i in range(4):
    fd(20)
    lt(90)
  fd(20)
  lt(45)
  fd(15/2)
  lt(45)
  fd(20)
  lt(135)
  fd(15/2)
  fd(-15/2)
  rt(45)
  fd(20)
  lt(45)
  fd(15/2)
 
 
  penup()
  lt(45)
  pencolor([randint(1,10)/10,randint(1,10)/10,randint(1,10)/10])
  pensize(7/2)
  fd(10)
  #pendown()
  lt(90)
  fd(20)
  lt(45)
  fd(15/2)
 
  fd(-7/2)
  pendown()
  pensize(5/2)
  lt(45)
  fd(-10)
  fd(20)
  lt(90)
  fd(20)
  fd(-20)
  rt(90)
  fd(-10)
  rt(45)
  pensize(7/2)
  penup()
  fd(-4)
  rt(45)
  fd(-10)
  pendown()
  lt(90)
  fd(-10)
  fd(20)
  #ruban
  rt(45)
  fd(7/2)
  rt(15)
  for j in range(2):
    for i in range(30):
      fd(1/2)
      lt(2)
    lt(120)
    for i in range(30):
      fd(1/2)
      lt(2)
    rt(180)

Un grand merci également à Casio pour ce concours absolument remarquable invitant les participants à véritablement produire quelque chose sur leur calculatrice ou son émulateur, une grande première il nous semble, et réussie si on se fie aux dessins présentés. :D

Un concours de plus à la dotation fort appréciée. On aime la présence de plusieurs gros lots, la possibilité pour les gagnants de personnaliser en partie leur gros lot (choix de la calculatrice), l'absence de perdant, et justement en lot de participation les goodies exclusifs ! :bj:

Merci Casio d'avoir égayé notre mois de décembre avec un peu de magie de Noël en cette période difficile. :favorite:

Du grand art, reproduire un tel événement en ouvrant la participation aux élèves pourra être une excellente idée bien sûr en des temps plus propices. ;)

Téléchargements :
Lien vers le sujet sur le forum: Scripts & résultats concours dessin Noël Casio Graph Python (Commentaires: 10)

Résultats concours dessin Noël Graph Python et fx-92+SC

Nouveau messagede critor » 18 Déc 2020, 15:03

Enseignant de matière scientifique en collège ou lycée, jusqu'à ce mardi 15 décembre Casio t'a permis de participer à un superbe concours de Noël 2020.

Il te suffisait de programmer et envoyer un superbe dessin de Noël sur ta calculatrice Casio ou son émulateur, avec 2 catégories au choix :
  • fx-92+ Spéciale Collège (langage de programmation orienté tracé à la Scratch/Logo)
  • Casio Graph 35+E II ou Graph 90+E avec l'application Python

9668A gagner dans chacune des 2 catégories :
  • pour le meilleur dessin, un superbe lot de 180€ de valeur médiane : 1 disque dur externe SSD de 1 To de capacité + 1 calculatrice graphique Casio Graph 90+E ou Graph 35+E II au choix
  • pour le 2ème meilleur dessin, un non moins superbe lot de 150€ de valeur médiane : 1 enceinte bluetooth + 1 calculatrice graphique Casio Graph 90+E ou Graph 35+E II au choix
    129871302313021
  • pour tous les autres pas de perdant avec un superbe lot de participation : 1 batterie externe + 1 clé USB

Les gagnants ont maintenant été choisis par Casio, et l'ensemble des participants prévenus de leur lot par courriel.

13237Dans une actualité précédente nous te présentions les dessins de Noël sur Graph 90+E gentiment partagés par plusieurs candidats.

De façon tout à fait officieuse nous te partagions les résultats du concours, deux personnes parmi notre petit échantillon de candidats ayant par chance affirmé avoir gagné :
  1. Florian Allard alias Afyu
    13236
  2. Thomas Fontaine
Félicitations à tous les deux, nous sommes fiers de vous ! :bj:

Retourne donc à l'actualité précédente pour consulter les diverses explications apportées sur chacun de ces scripts.

Casio vient de publier les résultats officiels, avec donc désormais en prime les dessins gagnants sur fx-92+ Spéciale Collège : :D
  1. Alain Ladiesse
  2. Amélie Roy
Félicitations à eux aussi ! :bj:

Nous regrettons toutefois ici de ne pas disposer d'un partage des scripts correspondant aux dessins en question. Dommage, vu le tracé extrêmement bien fourni sur l'écran large de la fx-92+ Spéciale Collège, ils auraient sûrement été eux aussi fort intéressant à étudier. ;)

Téléchargements :

Source : https://twitter.com/CasioFrance/status/ ... 3852988416
Lien vers le sujet sur le forum: Résultats concours dessin Noël Graph Python et fx-92+SC (Commentaires: 8)

Découverte prototype TI-82 Advanced DVT avec OS 5.0.0.0027

Nouveau messagede critor » 18 Déc 2020, 23:02

13242Sortie pour la rentrée 2015, la TI-82 Advanced est toujours venue préchargée avec le même OS en version 5.0.0.0028 compilée le 1er janvier 2015.

Texas Instruments n'a jamais publié de mise à jour pour ce modèle depuis maintenant donc plus de 5 ans.

Et pourtant l'OS 5.0.0.0028 pour TI-82 Advanced n'est pas dénué de défauts.

Un bug visuel très vilain concerne le menu caractères disponible en langue française (par défaut).

Dès que l'on bouge le curseur de sélection de caractère, c'est le festival :
  • curseur qui laisse des traces...
  • contraste qui s'affole (s'assombrit, s'éclaircit, fait un flash...)
  • caractères du menu qui s'effacent...
  • caractères parasites qui apparaissent...


Et tu n'es pas à l'abri d'un reset effaçant la mémoire après avoir terminé de valider ta sélection de caractères dans ce contexte délirant. :p

46324615Le pire étant qu'il s'agit d'une erreur commise par Texas Instruments au tout dernier moment.

En effet le modèle TI-84 Plus précédent ne souffrait pas de ce bug.

Mais surtout, ce même bug n'était pas non plus présent sur le prototype TI-82 Advanced DVT que nous avions eu l'honneur et le plaisir de tester en avant-première. De numéro de série K-DVT-157, il était pour sa part muni d'une version 5.0.0.0014.

Si Texas Instruments pour une raison que nous ignorons ne souhaite plus dépenser le moindre centime pour la TI-82 Advanced, la seule solution serait de réinstaller une version intermédiaire entre 5.0.0.0014 et 5.0.0.0028. Faut-il encore pouvoir en récupérer une, puisqu'elles n'ont jamais été publiées.

Et bien justement, Frédéric Desautels a trouvé à la revente un autre prototype DVT de la TI-82 Advanced.

De numéro de série K-DVT-211, il est donc beaucoup plus récent que le nôtre. Et justement, il fait tourner une version 5.0.0.0027 ! :D

Si le bug n'y est pas présent et si nous réussissons à extraire l'OS 5.0.0.0027, nous allons peut-être pouvoir enfin te fournir de quoi corriger ta TI-82 Advanced ! :bj:

A bientôt, on espère... ;)
Lien vers le sujet sur le forum: Découverte prototype TI-82 Advanced DVT avec OS 5.0.0.0027 (Commentaires: 13)

Bêta-test public nouvelle version NumWorks 15.2

Nouveau messagede Admin » 19 Déc 2020, 10:47

13243Le 4 novembre dernier, NumWorks lançait le bêta-test public de la prochaine mise à jour en version 15 pour sa calculatrice. Il s'agissait très exactement d'une version 15.0.0.

La 10 décembre, tu avais droit à une nouvelle version bêta 15.1.0.

Aujourd'hui voici ton cadeau de Noël NumWorks avant l'heure, une nouvelle version bêta 15.2.0 améliorée à tester. :D

Tu peux donc si tu le souhaites dès maintenant mettre à jour ta calculatrice en version 15.2.0, et profiter gratuitement en avant-première de toutes les formidables nouveautés de la prochaine mise à jour en version 15, nouveautés que nous te rappelons ci-dessous : :bj:
ImageImageImageImageImageImageImage




1) Application Paramètres

Go to top

1319513194Et voici déjà une première nouveauté qui nous saute littéralement aux yeux.

En fin de mise à jour la calculatrice redémarre et nous demande notre langue, comme d'habitude, et puis surprise elle veut également connaître notre pays. :o

Nous allons avoir tout le loisir de nous pencher là-dessus puisque ce même nouveau réglage est également disponible dans l'application Paramètres, avec au choix :
  • Allemagne
  • Canada
  • Espagne
  • Etats-Unis
  • France
  • International
  • Italie
  • Pays-Bas
  • Portugal
  • Royaume-Uni


En effet jusqu'à présent, certaines fonctionnalités de la calculatrice étaient impactées par le choix de la langue. On peut citer le mode examen néerlandais interdisant l'application Python (pour les Pays-Bas dont la réglementation interdit l'accès à tout éditeur de texte) qui n'était disponible qu'en langues anglaises ou néerlandaise.

On pouvait aussi reprocher hors de nos frontières une méthode de calcul des quartiles utilisant une définition spécifique à la France.

Bref, des désagréments d'utilisation dans un contexte international, lier des fonctionnalités à la langue n'était pas une bonne chose, pour les élèves des lycées français à l'étranger, ou plus généralement toute personne préférant utiliser une autre langue que la langue officielle du pays réglementant sa scolarité.

Désormais fini les problèmes, l'option langue ne contrôle comme son nom l'indique que la langue des messages affichés.

C'est le seul choix du pays, comme sur ordinateur, qui influe sur le fonctionnement, avec entre autres :
  • le mode examen néerlandais qui n'est disponible que si on choisit les Pays-Bas
  • le calcul des quartiles dans l'application Statistiques qui utilise la méthode française si l'on choisit la France, et sinon désormais la méthode internationale pour tout autre choix de pays
  • pour les calculs avec unités dans l'application Calculs, les conversions d'unités automatiques qui dans le cas des Etats-Unis privilégieront les unités du système impérial, et les mettront également en avant dans les résultats additionnels


  • et enfin l'organisation des applications à l'écran d'accueil, qui dans le cas des Etats-Unis ne met plus en avant l'application Python :


La NumWorks a dorénavant de quoi s'adapter non seulement aux réglementations et usages de chaque pays, mais également aux besoins et préférences de chaque utilisateur dans un contexte de mobilités internationales, une calculatrice pour les gouverner toutes ! :bj:

Peut-être que cette option serait justement l'occasion de réactiver le formidable moteur de calcul littéral qui avait été supprimé à compter de la version 11.2, justement à cause de réglementations d'examens interdisant cette fonctionnalité au-delà des frontières françaises, et de recommencer à le faire évoluer... une calculatrice littérale à seulement 80€ ce serait fantastique, n'est-ce pas ? :D




2) Application Calculs et boîte à outils

Go to top

Ici dans l'application Calculs nous sommes littéralement gâtés, c'est Noël avant l'heure.

Comme nous l'avons déjà abordé dans la partie précédente, une nouveauté déjà est l'ajout de la gestion des unités du système impérial. Tu les retrouveras dans la boîte à outils avec les autres unités : :)
  • directement dans la catégorie Superficie (acre)
  • dans les catégories Distance, Volume et Masse, en 1er ou 2ème niveau selon ton choix de pays :
    • Distance :
      • in (pouce)
      • ft (pied)
      • yd (yard)
      • mi (mile)
    • Volume :
      • tsp (cuillère à café)
      • tbsp (cuillère à soupe)
      • floz (once fluide)
      • cup (tasse)
      • pt (pinte)
      • qt (quart)
      • gal (gallon)
    • Masse :
      • oz (once)
      • lb (livre)
      • shtn (tonne courte)
      • lgtn (tonne longue)

      De nouvelles unités de température bien plus usuelles que le Kelvin sont également rajoutées, les degrés Celsius et Fahrenheit. :bj:

      Une petite nouveauté non négligeable est que tu ne perds plus le calcul en cours de saisie si tu sors de l'application Calculs, par exemple pour aller copier-coller une donnée présente dans une autre application, très pratique ! :bj:

      Grande nouveauté, la calculatrice gère maintenant le calcul vectoriel. Une nouvelle entrée est disponible en ce sens dans la boîte à outils avec les fonctions dédiées : :bj:
      • dot(,) (produit scalaire)
      • cross(,) (produit vectoriel)
      • norm() (norme)
      Attention, ne sont reconnues en tant que vecteurs et donc acceptées par ces fonctions que les seules matrices colonne, pas les matrices ligne. C'est d'ailleurs dommage pour l'intuitivité.

      Le calcul matriciel bénéficie quant à lui de deux nouvelles fonctions :
      • ref() (forme échelonnée)
      • rref() (forme échelonnée réduite)
      Précisions que les résultats matriciels bénéficient à leur tour de résultats additionnels calculés automatiquement :
      • déterminant
      • inverse
      • forme échelonnée
      • forme échelonnée réduite
      • trace

      Les fonctions gcd(,) et lcm(,) te permettaient jusqu'à présent de calculer les PGCD et PPCM de seulement 2 nombres. Au-delà, tu devais imbriquer plusieurs appels.

      Désormais les fonctions gcd() et lcm() acceptent autant de paramètres que tu veux ! :bj:




3) Application Fonctions

Go to top

Un objectif clairement affiché de la calculatrice NumWorks c'est l'intuitivité. Par exemple dans l'application Fonctions :
  • tu bénéficiais d'un réglage automatique des bornes verticales de la fenêtre
  • dans le cas de fonctions trigonométriques, tu bénéficiais même en prime d'un réglage automatique des bornes horizontales
L'objectif visé était de te garantir une bonne visibilité graphique de tous les éléments pertinents à étudier, sans que tu aies à régler toi-même les bornes de la fenêtre.

Mais voilà, cela ne produisait pas tout-le-temps des résultats optimaux. Notamment en dehors des fonctions trigonométriques l'intervalle sur lequel la fonction était représentée restait par défaut figé sur [-10;10], ce qui pouvait écraser, déformer, ou même rejeter hors fenêtre plusieurs éléments remarquables.

Désormais l'onglet Graphique dispose d'une toute nouvelle barre de menu, avec par défaut une option Auto qui tentera d'ajuster au mieux aussi bien les bornes horizontales que verticales de la fenêtre ! :bj:
Fantastique, on pourrait commencer à se permettre de parler d'intelligence artificielle, et tout ça dans une calculatrice. :o

Si tu souhaites corriger d'éventuelles distortions, tu pourras également choisir d'orthonormer le repère d'une seule touche via ce même menu. :)


Jusqu'à présent, tes possibilités de naviguer rapidement dans la représentation graphique d'une fonction étaient peu intuitives et donc en pratique assez contraintes.

Outre le réglage manuel d'une nouvelle fenêtre, la méthode la plus évidente était de faire suivre la courbe par le curseur, et la fenêtre s'adaptait alors automatiquement lorsque ce dernier en sortait.
Le parcours de la courbe prenait donc du temps, et tes possibilités de navigation étaient contraintes par la sortie du curseur de la fenêtre, ce qui n'était pas toujours possible verticalement.

Tu avais mieux mais dans la fort mal nommée option Zoom.

Plus besoin de réglage fastidieux de la fenêtre ni de curseur pour explorer la représentation graphique désormais, de façon maintenant évidente l'option Zoom est renommée Naviguer.

Tu pourras ici immédiatement faire défiler la fenêtre horizontalement ou verticalement à l'aide des touches fléchées, et toujours zoomer avec les touches
+
et
-
. :bj:




4) Application Suites

Go to top

L'application Suites bénéficie déjà des nouvelles possibilités de fenêtrage automatique décrites précédemment dans la partie Fonctions.

Grande nouveauté, comme cela avait déjà été fait avec les fonctions, les suites définies dans l'application Suites sont maintenant accessibles et utilisables depuis les autres applications. :bj:

Tu pourras les consulter et saisir en écriture naturelle via la touche
var
, ou encore y faire appel directement sous l'écriture parenthésée.
Une belle intégration multipliant les libertés de recherche et résolution de problèmes. :D

Lorsque tu saisissais les expressions pour définir une suite, il t'était possible de faire référence au terme de rang n ou n+1 de la même suite ou d'une autre suite.

Toutefois la vérification syntaxique était très stricte, et t'empêchait d'utiliser un terme utilisant un autre rang de n (n+2, ...) et même pire un terme de rang fixe, particulièrement embêtant dans l'initialisation de certaines suites récurrentes.

La vérification syntaxique a été corrigée, tu as maintenant toute liberté d'utilisation de terme de suites dans tes définitions de suites. :bj:




5) Application Statistiques

Go to top

L'application Statistiques bénéficie elle aussi sur son onglet Graphique des nouvelles possibilités de fenêtrage automatique de l'application Fonctions.

Dans l'application Statistiques, il t'est désormais possible de trier les colonnes de valeurs ou effectifs dans l'ordre croissant. :)

Pour cela il te suffit juste de sélectionner le nom de la colonne avec les touches fléchées, puis de taper
OK
pour accéder au menu contextuel.




6) Application Régressions

Go to top

L'application Régressions bénéficie également de la nouvelle possibilité de trier les colonnes, ainsi que des nouvelles possibilités de fenêtrage automatique. Mais ce n'est pas tout.

Quand tu réalisais une régression linéaire, tu avais droit au calcul du coefficient de détermination te permettant de juger de l'adéquation au modèle de régression en question.

Toutefois, le coefficient n'était pas calculé lorsque l'on choisissait un modèle de régression autre que linéaire.

Désormais, le coefficient est bien calculé pour l'ensemble des modèles de régression gérés. :)




7) Application Python

Go to top

Comme sur d'autres modèles, l'application Python était un peu à part dans le système de la calculatrice. Elle utilise par définition même un système de notation différent de toutes les autres et ne permettait que peu le partage de données, gênant ainsi le processus de recherche et résolution d'un problème, particulièrement dans le cadre des tâches complexes mobilisant diverses compétences et faisant appel à différentes applications.

Pour importer des données dans ton application Python, tu avais la possibilité de copier-coller.

Mais voilà, avec les différences de notation, tu pouvais obtenir des erreurs de syntaxe ou pire des résultats complètement différents et donc faux. :mj:

Et bien bonne nouvelle, cet écueil a été corrigé. :bj:

Les différences de notation sont maintenant corrigées de façon totalement automatique et transparente lors de l'opération de collé (symboles de multiplication, puissance, racine, ...).


Inversement, si tu souhaitais exporter les données de ton application Python par copié-collé, tu rencontrais le même genre de difficultés. :mj:

Et ici encore bonne nouvelle, la transcription automatique est également gérée dans ce sens-là désormais ! :bj:




Une fois de plus NumWorks nous signe là une superbe mise à jour, améliorant encore et toujours gratuitement les possibilités de ta calculatrice favorite, félicitations ! :bj:

Nous en profitons pour remercier les contributeurs bénévoles ayant aidé à l'élaboration de cette mise à jour :

Liens :
  1. inscription comme bêta-testeur
  2. Mise à jour (demander l'installation de la version bêta, puis suivre les instructions)
Lien vers le sujet sur le forum: Bêta-test public nouvelle version NumWorks 15.2 (Commentaires: 7)

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1446 utilisateurs:
>1424 invités
>18 membres
>4 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)