Un générateur aléatoire de calcul mental en python pour la NumWorks


Accueil > Projets > Un générateur aléatoire de calcul mental en python pour la NumWorks

Par Fedyna Kevin, Robert Vincent en avril 2020

Introduction

Si les exercices répétitifs d’entrainement étaient tombés en disgrâce dans les précédents programmes scolaires, les nouveaux programmes de mathématiques les réintroduit, tout du moins en ce qui concerne les rituels de calcul mental en classe de seconde.

Extrait du programme officiel de la classe de seconde :
L’acquisition de ces réflexes est favorisée par la mise en place d’activités rituelles, notamment de calcul (mental ou réfléchi, numérique ou littéral). Elle est menée conjointement avec la résolution de problèmes motivants et substantiels, afin de stabiliser connaissances, méthodes et stratégies.

Le script que nous avons conçu permet de pratiquer du calcul mental numérique, directement sur sa calculatrice, sans que les élèves n’aient la possibilité de tricher sur leur voisin et tout en proposant une correction personnalisée à chaque élève !

Un précédent script réalisé en mode texte

Un précédent script avait été codé en mode console, il est disponible ici : calcul_mental_old.py et il gérait un menu, lui aussi codé avec des print() et des input().

Fonctionnel, il manquait toutefois d’ergonomie, et le décalage du texte en temps réel dans le console pouvait perturber l’apprentissage.

Réécriture pour profiter de la couche graphique de la calculatrice

Avec la sortie de la version 13.2.0 d’Espilon, le logiciel qui anime la NumWorks permet de disposer d’un tas python (heap) de 31ko et de fonctions natives tel que keydown() qui permet de récupérer le code de la touche pressée.

Une conception graphique minimaliste et intuitive a donc été pensée et codée pour sublimer ce générateur aléatoire de calculs.

Un script compatible avec notre menu graphique

En parallèle, nous avons développé Un menu en python pour les jeux sur la numworks et ce script exploite les possibilités de ce
menu graphique.

Réglage Options
Mode Classique , Rapide
Opération(s) + , - , x , / , + - , x / , + - x , + - x /
Difficulté facile, modéré, difficile, expert
Répétition 20, 42, 50, 100, 120

Classique vs Rapide

Le mode classique interrompt le script et le chronomètre pour afficher si il y a une erreur, et indiquer quelle était la bonne réponse.

Le mode rapide est un mode d’entrainement intensif sans perturbation, que vous fassiez juste ou faux les calculs s’enchaînent et vous ne pourrez pas analyser vos erreurs.

Dans tous les cas, une fois la série de calcul terminée, un écran de synthèse résume le travail réalisé.

Quelques portions de code commentées

Le code qui génère le menu est documenté dans l’article associé.

Quelques portions de code commentés ou juste extraites ...

Gestion de la difficulté

Pour pouvoir être lu par notre script, la difficulté doit être représentée par un nombre.
Ainsi, on crée un code qui récupère un nombre en fonction de l’index de la première lettre dans un tableau.

  1. ["Difficulté", "  modéré", "difficile", "expert", "facile"],
  2. dif = ["f", "m", "d", "e"].index(dif[0])

Télécharger

Ce dif sera un indice qui sera utilisé pour interroger la table de difficulté :

  1. da = [1, 9]
  2. db = [10, 19]
  3. dc = [1, 10]
  4. dd = [dc, [2, 10]]
  5. diff = {"+": [[da] * 2, [db, da], [db, da], [db] * 2],
  6.         "-": [[da] * 2, [db, da], [[10, 20], [10, 20]], [db] * 2],
  7.         "*": [[dc] * 2, [dc] * 2, [[2, 10], [11, 20]], [[1, 25], [1, 25]]],
  8.         "/": [dd, dd, dd, [[1, 20], [2, 20]]]}

Télécharger

def draw_line(x, y, clr, *ts) :

kandinsky ne dispose pas d’une fonction permettant de tracer des lignes. Or elle dispose d’une fonction qui allume un pixel d’une certaine couleur.

Voici donc notre fonction pour tracer une ligne.

  1. def draw_line(x, y, clr, *ts):
  2.     for t in ts:
  3.         d = list(map(lambda n: n // abs(n) if n != 0 else 0, t[0]))
  4.         for i in range(t[1]):
  5.             set_pixel(x + i * d[0], y + i * d[1], clr)
  6.         x += i * d[0]
  7.         y += i * d[1]

Télécharger

Quelques explications :

La fonction prend un couple (x,y) de départ, un couleur et des trajectoires (ts).
Ces trajectoires sont de la forme ([dx,dy],l)

  1. d = list(map(lambda n: n // abs(n) if n != 0 else 0, t[0]))

Cette ligne permet d’obtenir une liste contenant uniquement des -1, 0, 1.

Améliorations possibles

Un mode d’apprentissage automatique si on dispose d’une mémoire de stockage permanente utilisable par python.

Un mode examen (Nécessite de "crypter" qq portions du code) : Le professeur génère un code unique, l’élève saisit ce code et fait une série aléatoire mais paramétré par le professeur. Un bon élève doué en programmation pourra toutefois bypasser le code et avoir tout juste sans rien faire !

Télécharger cette application python codée pour la NumWorks

En l’état actuel, vous ne pouvez pas tester ce script directement depuis le workshop, car l’équipe de développement de la NumWorks n’a pas encore mappé les touches du clavier de l’ordinateur sur leur simulateur en ligne.

Quelques touches seulement sont actives sur le workshop, les 4 flèches, la touche Entrée et les touches Retour Arrière, Majuscule.

Ceci vous permet donc uniquement de tester le menu de cette application mais pour tester le générateur de calcul, il faudra charger le script sur la calculatrice.

Il faut télécharger sur votre calculatrice :

Soit le script calcul.py
Soit les scripts calcul_se.py et menu.py.

La version "(...)_se" désigne une édition spéciale, allégée de menu qui est appelé depuis un autre script. Ainsi, le code du menu est mutualisé, ce code occupe donc moins de place car l’espace de stockage des scripts sur la calculatrice est limité.

Calculez bien !

Vous pouvez réagir à cet article sur le topic tiplanet.org de cette news :
Snake, calcul mental, et interface lancement jeux Python