Calculatrices non standard

mardi 27 mai 2014
par  Alain BUSSER

Plusieurs exemples viennent de l’intégrale des jeux mathématiques du Monde, par Élisabeth Busser et Gilles Cohen, paru aux éditions Pôle (ISBN n° 978 284 884 0741). D’autres ont été donnés au Rallye Mathématique CM2-6e de l’IREM de Paris. La possibilité de manipuler une telle calculatrice, et pas seulement de l’imaginer, aide grandement à émettre des conjectures, et donne (du moins, on l’espère) l’envie de les valider...

Note : Bien que placés dans cette rubrique, ces fichiers ne sont pas programmés en CoffeeScript (sauf le dernier). Mais directement en JavaScript, dans l’espoir de mieux les voir fonctionner sous Android... Chaque copie d’écran d’un de ces fichiers est cliquable et permet d’ouvrir le fichier dans le navigateur (par exemple, clic droit puis « ouvrir dans un nouvel onglet »).

Remarque : Pour avoir une calculatrice cassée, il suffit de prendre une calculatrice entière et de la casser (enlever, modifier ou inactiver des touches par exemple).

Sujets du Rallye

Extrait du sujet du Rallye CM2-6e de 2000, exercice « avec ma calculette » :

Rallye CM2-6e 2000
la calculatrice cassée
Alain Busser 2014

Gestion du clavier de l’ordinateur

Ce fichier utilise une expression régulière pour voir si un calcul n’utilise que les touches de la calculatrice. Au début du source, on crée la RegExp avec

var	RE = /[^47\+\-=]/g;

La lettre « g » à la fin demande que la recherche soit globale (que la RegExp cherche tous les caractères illégaux, pas seulement le premier d’entre eux). Entre crochets, figure la liste des caractères autorisés (le « + » et le « - » sont « échappés » pour être compris comme des caractères), mais précédés d’un chapeau qui demande à la RegExp, non pas de chercher ces caractères, mais de lister les autres caractères (ceux qui ne sont pas sur la calculatrice cassée).

Pour savoir si un caractère non autorisé a été utilisé dans le calcul, on récupère le calcul (non effectué) et on effectue sur celui-ci une fouille au corps exhaustive à l’aide de la RegExp. Le résultat, noté v, est la liste des caractères non autorisés :

var v = calcul.match(RE);
if (v==null){
	discours = "";
} else {
	discours = "Mais les éléments suivants ont été utilisés, alors qu'ils ne sont pas disponibles sur la calculatrice : {"+v+"}.";
}

La variable discours, affichée en bas du fichier en rouge, contient alors l’ensemble des caractères non autorisés (ou rien si le calcul est « légal »).

Remarque : Selon le théorème de Bachet-Bezout, tout nombre entier peut être calculé à l’aide de cette calculatrice, parce que 4 et 7 sont premiers entre eux. Il est donc possible de décliner cet exercice en de nombreuses variantes, par exemple avec 5 et 3...

Ensuite, le sujet du rallye 2012 avec « Technologie » :

calculatrice cassée
encore une calculatrice abimée, et en plus il faut économiser les boutons pour ne pas agraver la situation
Alain Busser 2014

Sujets des jeux mathématiques du Monde

Calculatrice bizarre : Au lieu d’opérations sur deux nombres, elle n’a que deux fonctions unaires (qui transforment un nombre en un nombre).

  • le bouton

    implémente la fonction affine x→2x+1 ;

  • le bouton

    implémente la fonction qui est l’identité sur les nombres pairs et x→(x+5)/2 sur les nombres impairs.

une calculatrice bizarre
la calculatrice bizarre du Monde
Alain Busser 2014

Alors, en itérant ces deux fonctions, la calculatrice est un système dynamique, l’ensemble des fonctions engendrées par A et B (par composition) étant un semi-groupe dont on s’intéresse à une orbite.

Pour tricher

Le script suivant, testé dans alcoffeethmique, donne les premiers nombres qu’on peut obtenir avec ce système dynamique :

S = new Ensemble [0]
A = (x) -> 2*x+1
B = (x) ->
    if x%2 is 0
        x
    else
        (x+5)/2
for n in [1..9]
    S.ajoute A(x) for x in S.support
    S.ajoute B(x) for x in S.support
affiche S

Il donne le résultat suivant, confirmant que 100 peut être atteint et en combien d’étapes :

Question : L’ensemble des entiers ainsi obtenus est-il récursif ? Autrement dit, y a-t-il un moyen calculable de dire si un entier n’y est pas ?

encore une calculatrice bizarre : Là encore, deux fonctions A et B, mais le système dynamique semble avoir peu d’orbites :

autre systèle dynamique
celui-là rappelle Kaprekar mais avec deux fonctions à itérer
Alain Busser 2014

L’ascenceur : Après tout, avec ses touches et son affichage de l’étage courant, l’ascenseur est aussi une calculatrice :

l’ascenseur
assez difficile, mais on peut tâtonner en cliquant sur les boutons
Alain Busser 2014

Étages restant à parcourir

L’étage où se trouve actuellement l’ascenceur est calculé par des additions et des soustractions [1], et stocké dans la variable S. Alors pour mettre à jour la liste des étages restant à parcourir, on applique l’algorithme suivant :

  • On calcule la position de S dans le tableau aFaire ;
  • on stocke cet entier dans index ;
  • si index vaut -1, c’est que S n’est pas dans le tableau (étage déjà parcouru) ;
  • sinon, on enlève du tableau l’élément de numéro index (c’est donc S)

En JavaScript ça donne ceci :

var index = aFaire.indexOf(S);
if (index>-1) {
	aFaire.splice(index,1);
}

Pour mettre à jour la liste des étages déjà parcourus c’est beaucoup plus simple, il suffit de faire fait.push(S); si le tableau des étages déjà parcourus s’appelle fait.

Voici la version Android de ce jeu (programmée avec app Inventor) :

ascenseur version Android
installable Android
Alain Busser 2016

addNimTion

Un remake de ce jeu, mais en CoffeeScript, et avec du CSS pour désactiver les boutons qu’on n’a pas le droit de jouer.

principe du CSS

Une fonction adjacency permet de savoir qui est à côté de qui [2] :

adjacency = (a,b) ->
    if a>b
        adjacency b, a
    else
        false if a is b
        switch b
            when 2 then (a is 1)
            when 3 then (a is 2)
            when 4 then (a in [1,2])
            when 5 then (a in [1..4])
            when 6 then (a in [2,3,5])
            when 7 then (a in [4,5])
            when 8 then (a in [4..7])
            when 9 then (a in [5,6,8])
            else false

Ensuite, on désactive tous les boutons, puis on ne réactive que ceux qui sont à côté de celui qui vient d’être joué (et qui s’appelle riposte) :

 $(".calc").each (x) -> $(this).removeClass "actif"
 $(".calc").each (x) -> $(this).addClass "actif" if adjacency(parseInt($(this)[0].innerHTML),riposte)

En effet, $(this)[0].innerHTML renvoie le contenu du bouton (le nombre qui est dessus) et en le « parseIntant », on a le nombre correspondant (parseInt convertit en entier)

addnimtion
le jeu addNimTion en CoffeeScript
Alain Busser 2014

[1d’ailleurs l’exercice est intéressant à programmer avec la tortue LOGO

[2On aurait pu faire plus simple en remplaçant cette fonction par un tableau, mais il s’agissait d’une matrice booléenne 9×9...


Commentaires