Pseudo.py un petit utilitaire pour créer des pseudos

La problématique était la suivante :

L’équipe pédagogiques du collège dans lequel j’exerce désirait, dans le cadre de la semaine des Mathématiques, créer une activité en ligne à destination de toutes les classes de sixième. Chaque élève joue pour sa classe. Il doit donc avoir un pseudo et nous devons, grâce à lui, savoir dans quelle classe il est inscrit.

Or la nécessité d’être en conformité avec le RGPD nous oblige à une certaine prudence.

Notre idée est la suivante :

Nous créons pas classe une liste de 50 pseudos dans lequel un code numérique identifie la classe d’origine. Chaque élève choisit un pseudo et le raye de la liste.

Ce pseudo est son identifiant pour accéder aux activités (via Canopé) . Aucune donnée personnelle n’est sauvegardée…

Pseudo.py

J’utilise un fichier texte avec quelques noms d’animaux :

CHIEN
CHAT
TAUREAU
VACHE
AGNEAU
CHEVRE
CERF
LAPIN
COCHON
CHEVAL
LION
TIGRE
PANTHERE
JAGUAR
GUEPARD
OURS
LOUP
RENARD
HYENE
ELEPHANT
RHINOCEROS
HIPPOPOTAME
ZEBRE
GIRAFE
ANTILOPE
KOALA
KANGOUROU
CASTOR
SINGE
PANDA
LOUTRE
TORTUE
SERPENT
LEZARD
IGUANE
CROCODILE
ALLIGATOR
DRAGON
PYTHON
MOUSTIQUE
MOUTON
CHEVREUIL
OURSON
SOURIS
RAT
POULE
CANARD
OIE
COQ
PAON
PERROQUET
PINGOUIN
FLAMANT
FOUINE
HERISSON
COLOMBE
PIGEON

Avec le code python qui suit on génère un fichier texte qui répond au cahier des charges:

from random import *
nb_pseudo=50

f = open("animaux.txt", "r")
g= open ("result.txt","w")
animaux=f.read().splitlines()

classes={
    "6A": "13,17,21,25,29,33",
    "6B": "14,18,22,26,34,38",
    "6C": "11,15,19,23,27,31",
    "6D": "12,16,24,28,32,36"}



for classe in classes.keys():
    g.write(classe+"\n")
    suffixes=(eval(classes[classe]))
    shuffle(animaux)
    for n in range(nb_pseudo):
                g.write(animaux[n]+str(choice(suffixes))+"\n")
    g.write(40*"-"+"\n")
g.close()

Et on obtient le fichier texte  » result.txt « :

6A
CHEVRE17
GUEPARD17
OURS29
FOUINE21
POULE13
OURSON17
COLOMBE21
VACHE13
CHEVREUIL21
COQ25
FLAMANT17
COCHON13
HYENE21
CASTOR29
PERROQUET13
KANGOUROU21
GIRAFE29
ANTILOPE33
TORTUE21
TIGRE21
CHIEN17
IGUANE29
TAUREAU17
CHEVAL25
ALLIGATOR25
RENARD25
LION17
PINGOUIN21
PIGEON21
RHINOCEROS21
CHAT13
SERPENT33
MOUTON21
HERISSON21
KOALA29
MOUSTIQUE13
DRAGON25
ZEBRE17
PAON21
SOURIS25
AGNEAU33
PANTHERE33
CROCODILE33
RAT25
PANDA29
SINGE17
LEZARD29
LOUP25
OIE13
CANARD33
----------------------------------------
6B
PANDA38
RENARD38
CHEVREUIL26
CHAT22
CHIEN22
CHEVRE14
OURSON34
HYENE18
CERF38
PYTHON14
LOUTRE22
VACHE34
HIPPOPOTAME22
CASTOR18
MOUSTIQUE14
LOUP26
FOUINE26
OURS26
LEZARD34
COCHON38
OIE38
SOURIS22
CROCODILE26
SERPENT14
TIGRE26
DRAGON22
IGUANE34
AGNEAU18
PINGOUIN26
SINGE26
ANTILOPE22
ZEBRE14
KANGOUROU14
ALLIGATOR18
HERISSON34
LAPIN22
PERROQUET18
PAON14
COLOMBE26
POULE26
MOUTON38
COQ14
JAGUAR34
ELEPHANT18
LION18
RHINOCEROS14
TAUREAU34
GUEPARD26
FLAMANT26
PANTHERE38
----------------------------------------
6C
COCHON27
CROCODILE31
ZEBRE11
LOUTRE31
FOUINE19
KANGOUROU23
LEZARD19
GUEPARD11
LAPIN31
PYTHON19
TIGRE19
OIE31
GIRAFE15
COQ31
CHEVAL27
CASTOR19
ELEPHANT15
OURSON15
RENARD19
DRAGON11
TORTUE27
ALLIGATOR11
HYENE31
CHAT31
KOALA15
RHINOCEROS31
LION19
FLAMANT19
PAON23
LOUP15
HIPPOPOTAME11
CERF11
CHEVREUIL11
VACHE19
CHIEN23
SINGE23
AGNEAU27
CHEVRE11
OURS31
IGUANE27
PANTHERE23
SERPENT23
TAUREAU23
POULE31
CANARD23
COLOMBE11
PIGEON23
RAT23
PINGOUIN19
PANDA27
----------------------------------------
6D
CHEVRE28
PAON32
ZEBRE12
CASTOR16
MOUSTIQUE32
LOUTRE12
CHEVAL36
RENARD24
OURSON36
CHEVREUIL32
ANTILOPE36
TORTUE36
SINGE16
TIGRE12
TAUREAU16
COCHON28
LEZARD24
AGNEAU12
PIGEON28
JAGUAR12
HYENE36
HERISSON36
FLAMANT32
CHAT24
RAT16
PERROQUET28
VACHE16
GIRAFE24
ELEPHANT12
PINGOUIN36
SERPENT24
MOUTON16
POULE28
OURS24
PYTHON24
HIPPOPOTAME28
COLOMBE32
LION12
ALLIGATOR24
GUEPARD12
RHINOCEROS24
COQ16
OIE24
SOURIS12
LOUP16
CERF32
CROCODILE32
PANDA24
KOALA12
FOUINE24
----------------------------------------

Remarques

J’ai choisi les nombres de deux chiffres pour qu’on puisse rapidement retrouver la classe en question : Le reste dans la division euclidienne de ce nombre par 4 donne le rang de la classe :

13 = 4 × 3 + 1 : première classe

Le code Python n’est pas commenté, il est très simple !

Parlons RGPD et Education Nationale

Le Règlement général sur la protection des données (RGPD) est un texte de l’Union européenne qui a pour objectif de renforcer et unifier la protection des données personnelles des citoyens de l’UE. Depuis sa mise en place en mai 2018, il s’applique à toutes les entreprises et organisations, y compris les établissements d’enseignement.

Dans l’éducation nationale, le RGPD peut poser de nombreuses problématiques en raison de la quantité importante de données personnelles en jeu. Voici quelques-uns des principaux défis auxquels les établissements d’enseignement peuvent être confrontés :

  1. Gestion des données des étudiants : Les établissements d’enseignement doivent gérer de nombreuses informations personnelles sur leurs étudiants, telles que leur nom, leur adresse, leur numéro de téléphone, leur adresse e-mail, leur histoire scolaire, etc. Il est important de veiller à ce que ces informations soient protégées conformément aux exigences du RGPD.
  2. Stockage sécurisé des données : Les établissements d’enseignement doivent prendre des mesures pour s’assurer que les données personnelles des étudiants sont stockées de manière sécurisée. Cela peut inclure la mise en place de contrôles d’accès, l’utilisation de mots de passe forts, la sauvegarde régulière des données et la mise en place de systèmes de protection contre les cyberattaques.
  3. Consentement des étudiants : Les établissements d’enseignement doivent obtenir le consentement explicite des étudiants avant de collecter, traiter ou utiliser leurs données personnelles. Les étudiants doivent également avoir la possibilité de retirer leur consentement à tout moment.
  4. Transparence : Les établissements d’enseignement doivent informer les étudiants sur les types de données qu’ils collectent, les raisons pour lesquelles ils les collectent et la manière dont ils les utiliseront. Ils doivent également fournir une information claire sur les droits des étudiants en matière de protection de leurs données personnelles.
  5. Responsabilité en cas de fuite de données : Les établissements d’enseignement sont responsables de veiller à ce que les données personnelles des étudiants ne soient pas divulguées à des tiers non autorisés. En cas de fuite de données, ils doivent en informer rapidement les étudiants concernés et prendre les mesures nécessaires

Il est important de noter que les élèves qui sont des mineurs (c’est-à-dire qui ont moins de 18 ans) sont considérés comme des personnes vulnérables en termes de protection de leurs données personnelles. Les établissements d’enseignement doivent prendre des mesures supplémentaires pour garantir la protection de leurs données personnelles.

  1. Consentement des parents ou tuteurs légaux : Pour les élèves mineurs, les établissements d’enseignement doivent obtenir le consentement explicite de leurs parents ou tuteurs légaux avant de collecter, traiter ou utiliser leurs données personnelles.
  2. Réduction de la quantité de données collectées : Les établissements d’enseignement doivent veiller à ne collecter que les données nécessaires à leur activité. Pour les élèves mineurs, cela peut signifier ne pas collecter d’informations sensibles telles que les antécédents médicaux ou les opinions politiques.
  3. Protection renforcée des données : Les établissements d’enseignement doivent prendre des mesures supplémentaires pour s’assurer que les données personnelles des élèves mineurs sont protégées de manière adéquate. Cela peut inclure l’utilisation de méthodes de cryptage supplémentaires, la mise en place de contrôles d’accès supplémentaires ou la limitation de l’accès aux données à un nombre restreint de personnes.

En conclusion, le RGPD est un enjeu important pour l’éducation nationale, et il est important de veiller à ce que les établissements d’enseignement prennent les mesures nécessaires pour protéger les données personnelles de leurs étudiants, en particulier les élèves mineurs. Les établissements d’enseignement doivent être transparents quant à la collecte, le traitement et l’utilisation des données personnelles, et ils doivent garantir la sécurité et la confidentialité de ces données.

Etat des lieux du site2wouf.fr, été 2021.

Je profite des vacances et de la météo désastreuse dans le Pas-de-Calais en ce mois de juillet pour dresser un état des lieux du site. La première version date des débuts d’internet mais la version actuelle, avec ce nom de domaine est né en 2008, en janvier.

Environs quatre millions de pages ont été visitées depuis 2008. 84% des visiteurs sont français, le reste se partageant majoritairement entre les Etats Unis, et l’ Afrique du Nord (6% pour la Tunisie)

Historiquement, les premières versions regroupaient surtout des pages de type leçons en Mathématiques couvrant l’ensemble du collège, ce sont ces pages qui continuent à générer le plus de visites aujourd’hui. (Ainsi la page d’entrée la plus fréquente est une leçon de trigonométrie pour les élèves de troisième. )

Aujourd’hui, à la dispositions des élèves et des collègues, vous pouvez trouver sur le site2wouf.fr :

  • 3600 feuilles de problèmes gratuites en pdf pour tous (la résolution dépend du niveau)
  • 2400 feuilles de problèmes gratuites en pdf adaptées au cycle 3 ( De la fin de l’école primaire à la sixième)
  • 4400 feuilles de problèmes gratuites en pdf adaptées au cycle 4 (5ème – 4ème – 3ème)
  • 1600 feuilles de problèmes gratuites en pdf de type jeux (développement cognitif)

Les 12000 feuilles sont corrigées pour permettre une utilisation autonome de ces ressources par les élèves. Chacune d’entres elles est hébergée sur une page html qui propose, pour une utilisation en classe le problème du jour (différent chaque jour) , à faire en groupe par exemple.

Les 3 problèmes « chouchous » des élèves :

Evolution:

Le site est en évolution constante en fonction des réactions des visiteurs. Ainsi cette année de nombreux lycéens ont été intéressé, pour préparer le grand oral par deux thèmes abordés souvent ici :

Je terminerai en vous remerciant : ce sont vous, les visiteurs, qui donnent un sens à mon investissement pour faire vivre ce site ! Merci.

Des énigmes et des problèmes

J’ai adoré l’initiative et l’originalité du travail proposé par des élèves du collège Louise Michel durant l’année 2019-2020 : Un cahier de problème et d’énigmes.

Même si au départ j’ai été choqué que ce document soit publié avec une erreur dès l’énigme 2, j’ai pris beaucoup de plaisir à le parcourir et à faire travailler des élèves de sixièmes sur ces jolis problèmes.

Parlons en premier de l’erreur évoquée, intéressante, avec en tête cette citation de John Fitzgerald Kennedy

Une erreur ne devient une faute que si l’on refuse de la corriger.

L’énigme 2 (Thais)

Je suis un nombre décimal compris entre 0 et 30.
Mon chiffre des dizaines est le quart de mon chiffre des unités qui est égal à 8.
Mon chiffre des dixièmes est le seul chiffre présent dans le résultat de 33÷3.
Mon nombre de millièmes est le double de 5×9 + 7.

On arrive facilement à un nombre de la forme 28,1?????? à l’aide des 3 premiers indices.

Le dernier indice nous apprends que le nombre de millièmes est 104 donc que le nombre est de la forme 0,104?????

Thais attendait surement 28,104 mais dans ce nombre il y a, hélas, 28104 millièmes ! (Si vous n’êtes pas convaincus, demandez-vous combien il y a de centimes dans 1,20€… 120 ou 20?) On aurait pu corriger le dernier indice ainsi:

Le nombre de millièmes de ma partie décimale est le double de 5×9 + 7.

L’énigme 10 : L’ascenseur étrange (Léo B)

Dans cet immeuble de onze étages, l’ascenseur est bien étrange.
Il ne peut monter que 2, 3 ou 5 étages à la fois et ne peut descendre que 4 ou 11 étages.
Le concierge, dont la loge est située au rez-de-chaussée, doit procéder à la distribution du courrier.
Comment doit-il opérer pour partir de sa loge, s’arrêter une fois et une seule à chaque étage, et revenir chez lui ?

Cet exercice est classique et amusant. Mais souvent on ne propose que 3 déplacements possibles. Et je me suis posé une question : A-t-on encore des solutions quand on ne s’autorise que 3 déplacements (Par exemple : +2, +3 et -4)

Ma contribution : une application Python 3

class Immeuble:
    def __init__(self,etages,possibles,depart=0):
        self.etages=etages
        self.possibles=possibles
        self.depart=depart

class Voyage:
    def __init__(self,passe,i):
        self.passe=passe
        self.i=i
        
    def enfants(self):
        boutons=[]
        if len(self.passe)==0:
            self.passe=[self.i.depart]
        for j in self.i.possibles:
            if  self.passe[-1]+j in [x for x in self.i.etages if x not in self.passe]:
                boutons.append(j)
        liste=[]
        
        for j in boutons :
            newpasse=[x for x in self.passe]
            newpasse.append(self.passe[-1]+j)
            liste.append(newpasse)
          
        return [Voyage(l,self.i) for l in liste]


    


def etudie(x,y,z,t=None):
    if t==None:
        t=x
    i=Immeuble(x,y,z)
    v=Voyage([],i)
    n=2
    liste=[Voyage(x.passe,i) for x in v.enfants()]
    oldliste=liste
    while len(liste) !=0:
        n+=1
       
        newliste=[]
        for k in liste:
            for l in k.enfants():
                newliste.append(Voyage(l.passe,i))
        oldliste=liste
        liste=[x for x in newliste]
       

    return [u for u in oldliste if u.passe[-1] in t]
       
        
a=etudie(list(range(12)),[2,3,5,-4,-11],0,[4,11])
compteur=0

for i in a :
    compteur+=1
    j="-".join([str(x) for x in i.passe])
    print("{}/ {}".format(compteur,j))

k=input(" FIN ")


                

Résultats :

Ce qui est raccord avec la correction proposée :

Quelques mots sur l’application Python 3

def etudie(x,y,z,t=None) est la fonction qui retourne une liste contenant les chemins.

Elle reçoit en paramètres :

  • x : la liste des étages de l’immeuble ([0,1,2,3,4,5,6,7,8,9,10,11] ici)
  • y: la liste des boutons ([+2,+3,5,-4,-11] ici)
  • z: l’étage de départ (0 ici)
  • t: la liste optionnelle des dernières étapes (ici [4,11] , les seuls permettant de rejoindre la loge au coup suivant)

Les chemins retournés dans la liste ont chacun un paramètre .passe (passé) qui est une liste des étages parcourus.

Modifions la ligne a=etudie(list(range(12)),[+2,+3,5,-4,-11],0,[4,11]) en a=etudie(list(range(12)),[+3,5,-4,-11],0,[4,11]) pour signifier que l’on a, comme choix que:

  • monter de 3
  • monter de 5
  • descendre de 4
  • descendre de 11

Nous n’avons pas de solution !

Modifions maintenant la ligne a=etudie(list(range(12)),[+2,+3,5,-4,-11],0,[4,11]) en a=etudie(list(range(12)),[+2,+3,-4,-11],0,[4,11]) pour signifier que l’on a, comme choix que:

  • monter de 2
  • monter de 3
  • descendre de 4
  • descendre de 11

Il nous restait 4 solutions, mais seulement de 11 étapes (pas 12) . Ainsi la ligne 1 ne contient pas 10, la 2 ne contient pas 1…

Remarque :

Pour éviter ce souci, j’ai modifier le code source pour ne renvoyer les chemins que quand toutes les étapes sont parcourues :

class Immeuble:
    def __init__(self,etages,possibles,depart=0):
        self.etages=etages
        self.possibles=possibles
        self.depart=depart

class Voyage:
    def __init__(self,passe,i):
        self.passe=passe
        self.i=i
        
    def enfants(self):
        boutons=[]
        if len(self.passe)==0:
            self.passe=[self.i.depart]
        for j in self.i.possibles:
            if  self.passe[-1]+j in [x for x in self.i.etages if x not in self.passe]:
                boutons.append(j)
        liste=[]
        
        for j in boutons :
            newpasse=[x for x in self.passe]
            newpasse.append(self.passe[-1]+j)
            liste.append(newpasse)
          
        return [Voyage(l,self.i) for l in liste]


    


def etudie(x,y,z,t=None):
    if t==None:
        t=x
    i=Immeuble(x,y,z)
    v=Voyage([],i)
    n=2
    liste=[Voyage(x.passe,i) for x in v.enfants()]
    oldliste=liste
    while len(liste) !=0:
        n+=1
       
        newliste=[]
        for k in liste:
            for l in k.enfants():
                newliste.append(Voyage(l.passe,i))
        oldliste=liste
        liste=[x for x in newliste]
       
    nb_etapes=len(oldliste[0].passe)
    if nb_etapes==len(x):
    
        return [u for u in oldliste if u.passe[-1] in t]
    else:
        return []
        
a=etudie(list(range(12)),[+2,3,-4,-11],0)
compteur=0

for i in a :
    compteur+=1
    j="-".join([str(x) for x in i.passe])
    print("{}/ {}".format(compteur,j))

k=input(" FIN ")

                

Ainsi avec comme point de départ une activité proposée par un élève de sixième, de nombreuses portes se sont ouvertes, et j’ai continué un long moment à m’amuser avec cet ascenseur !

Finalement j’ai intégré au site de Wouf ces « exercices du jour » : L’ascenseur fou fou fou où je propose en téléchargement 400 problèmes gratuits en pdf de ce type.

Math et Python : histoire d’un bug – épisode 1

J’ai développé en Python, il y a un moment déjà un petit utilitaire qui produit des exercices de trigonométrie (https://site2wouf.fr/exercices_trigonometrie.php) qui les corrige et qui fabrique par la même occasion un pdf avec exercices et corrections.

Oui mais voilà, en récoltant les fruits de mon travail en classe aujourd’hui je tombe sur cet exercice et sa correction et remarque une erreur :

Exercice 1

Dans le triangle RBN rectangle en R, on sait que :

  • BN = 3,7 cm
  • BNR = 30°

Après avoir fait un schéma, calcule la longueur du segment [RB]. (Arrondir au dixième)

Correction

Exercice 1

image/svg+xml R B N ? 3,7 cm 30°

Dans le triangle RBN rectangle en R, on cherche une relation entre l’angle aigu RNB son coté opposé et l’hypoténuse du triangle.

RB / BN

= sin(RNB)

d’où

RB / 3,7

= sin(30°)

On a donc RB = 3,7 × sin(30°) ≈ 1.8 cm

Voyez-vous l’erreur ?

sin(30°)=0.5

3.7sin(30°)=1.85

Python aurait du arrondir à 1,9cm

Lu sur la doc Python :

https://docs.python.org/fr/3.7/library/functions.html?highlight=round#round

Le comportement de round() avec les nombres à virgule flottante peut être surprenant : par exemple round(2.675, 2) donne 2.67 au lieu de 2.68. Ce n’est pas un bug, mais dû au fait que la plupart des fractions de décimaux ne peuvent pas être représentés exactement en nombre a virgule flottante. Voir Arithmétique en nombres à virgule flottante : problèmes et limites pour plus d’information.

Pour Python, avec le module math importé :

>>> sin((radians(30)))
0.49999999999999994

donc en multipliant par 3.7, Python trouvera un résultat très proche de 1,85 mais strictement inférieur donc dont le développement décimal commencera par 1,84… et il arrondira effectivement à 1,8.

En arrondissant (round(sin((radians(30)),5) j’évite le souci mais ne vais-je pas tombé parfois sur le comportement évoqué de round() ?

Mes solutions :

Ma fonction round2

Elle est basée sur l’écriture décimale en tant que chaine de caractère.

def round2(x,nbdigit=0):
    """x est un nombre, la fonction renvoie l'arrondi à nbdigit près
       sans riquer des erreurs d'arrondi comme avec la fonction native   
    
    """
    if not isinstance(x, (int,float)):
        raise NameError("x must be int or float")
        return
    if not isinstance(nbdigit,int):
        raise NameError("nbdigit must be integer")
        return
    if nbdigit<0 :
        raise NameError("error nbdigit <0 ")
        return
    if x<0:
        return -round2(-x)
    #x est un nombre positif, et nbdigit un entier positif
    partie1=str(x).split(".")[0][:-1]
    partie2=str(x).split(".")[0][-1]
    try:
        partie2+=str(x).split(".")[1]
    except:
        pass
    pcorrige=""
    n=0
    while n<=nbdigit:
        try:
            pcorrige+=partie2[n]
            
        except:
            pass
        n+=1
    try:
        suivant=int(partie2[n])
    except:
        suivant =0
    p=partie1+pcorrige[0]
    if len (pcorrige)>1:
            p+="."+pcorrige[1:]
  
    nb=[x for x in p]
    if suivant>4:
        nb=["0"]+nb
        ok=False
        x=len(nb)
        while not ok:
            x-=1
            if nb[x]!=".":
                if int(nb[x])<9:
                    nb[x]=str(int(nb[x])+1)
                    ok=True
                else:
                    nb[x]="0"
    nb=float("".join(nb))
    if nb==int(nb):
        nb=int(nb)
    return nb

On peut comparer avec la fonction native :

round2(2.675,2)
2.68
round(2.675,2)
2.67

Pour le souci avec sinus, j’arrondi simplement (à 15 digits) les retours des lignes trigonométriques.

Un problème subsiste néanmoins : On pourrait parfois (avec sin(30), cos(60) et tan(45) par exemple ) travailler avec des valeurs exactes, et remplacer le signe « environ égal » par un « vrai égal »…

Logigramme.py en version 3.0.0

Présentation de l’application logigramme.py

logigramme.py est une application Python3, open source et gratuite qui permet, à partir d’un fichier prog.txt contenant du pseudo-code de fabriquer, en SVG un logigramme comme celui ci-dessus.

Pratique et léger il peut faire gagner du temps aux enseignants de Mathématiques, d’informatique et de technologie.

Mode d’emploi

Pré-requis

L’utilisateur final doit avoir Python3 installé sur sa station de travail.

Téléchargement

L’application logigramme.py est disponible en téléchargement

Il suffit de décompresser cette archive à l’emplacement de votre choix, d’éditer le fichier prog.txt (qui contient un pseudo-code exemple) de le modifier et de le sauvegarder.

Un double clic sur logigramme_f.py (ou en le lançant via l’IDLE de Python) va générer (si le pseudo_code ne contient pas d’erreur) prog.svg. (Il est possible de voir le résultat dans un navigateur en lançant test.html.

Syntaxe du pseudo-code

Le pseudo-code qui correspond au logigramme précédent est simple:

Début Faire un logigramme
Si vous connaissez cette application
le faire en quelques secondes en SVG !
sinon
le faire à la main; et c'est long !
fin_si
Fin

Les seuls impératifs concernant la structure sont logiques : un tq ou un si doit être ouvert avant d’être fermé (fin_tq, fin_si) :

  • tq avant fin_tq
  • si avant fin_si (avec éventuellement un « sinon » intercalé)

Nouveautés de la version 3.0.0

La version 3.0.0 est plus qu’une mise à jour : La logique a été repensé pour privilégier un affichage clair des textes. C’est maintenant la taille des cadres qui s’adapte aux contenus.

Pour les développeurs, un mode de déboguage est activable en passant le booléen debug à 1 dans les codes Python .

Cette version (beta) est en ligne depuis le 29 octobre 2020, n’hésitez pas à intervenir pour en améliorer les performances !

ODS8 en fichier texte. Script Python

Cet article vient en complément de l’archive Un lexique genre ODS7 en txt… , en effet un utilisateur m’a fait part de sa recherche sur l’ODS 8 et ce « vieux billet » est un peu obsolète.

Voilà, mais pour des besoins pédagogiques (formation algorithme au cycle 4) j’avais besoin d’une liste de mots en .txt

Remarque : Je dis bien liste de mots (et non dictionnaire). Et les mots sont à tout le monde…

En effet j’envisage de faire travailler des élèves de 4ème, 3ème sur le développement d’algorithmes divers ayant pour base des jeux de lettres :

  • Boggle
  • Scabble
  • Pendu
  • etc…

Après quelques recherches sur la toile, je me suis aperçu que le fichier txt que je cherchais n’existait pas. Mais que quelques sites proposaient des listes (en html multi-pages. )

Ainsi le très bon listesdemots.net vous propose de nombreuses liste de mots. (898 pages)

Il était donc possible mais fastidieux de créer un fichier txt en copiant collant toutes ces listes !

Pas si fastidieux si on a Python sous le coude !

Code Python traduit en HTML:
#wouf 2020 (py3.6.4)
#http://site2wouf.fr
#Pour créer dico.txt
#Qui contient un lexique basé sur
#ODS8
#En scollant le site : listesdemots.net
#requis :l beautifulsoup4
#(cmd : pip install beautifulsoup4)
#requis :2 requests
#(cmd : pip install requests)
import requests
from bs4 import BeautifulSoup
fichier = open("dico.txt" , "w" )
 
#   Initialisation:
url="https://www.listesdemots.net/touslesmots" 
requete = requests.get(str(url+".htm" )) #page1
print(requete.url)
page = requete.content
 
soup = BeautifulSoup(page,features="html5lib" )
span = soup.find("span" , {"class" : "mot" })
mots=span.string.strip()
lesmots=mots.split(" " )
for l in lesmots:
    fichier.write(l+"\n" )
    print("|" ,end="" )
print()
print("page 1 : OK (" +str(len(lesmots))+")" )
totalmot=len(lesmots)
fichier.close()
#page 2 à 918:
for i in range(2,919):
    fichier = open("dico.txt" , "a" )
    lurl=url+"page" +str(i)+".htm" 
    ok=False
    while not ok:
        try:
            requete = requests.get(lurl,timeout=1)
            ok=True
        except:
            print("Problème de connexion. Je recommence !" )
    print(requete.url)
    page = requete.content
    soup = BeautifulSoup(page,features="html5lib" )
    span = soup.find("span" , {"class" : "mot" })
    mots=span.string.strip()
    lesmots=mots.split(" " )
    for l in lesmots:
        fichier.write(l+"\n" )
        print("|" ,end="" )
    totalmot+=len(lesmots)
    print()
    print("page " +str(i)+" : OK (" +str(len(lesmots))+"/" +str(totalmot)+")" )
    fichier.close()
#fin du script:
  
 
print("mots :" ,totalmot)

Ce script produit en quelques minutes un fichier txt (avec un mot par ligne) contenant tous les mots du site !

Sur le site de la fédération on peut lire :

Qui contacter pour distribuer/vendre un ouvrage ou autre produit utilisant la base de mots de l’Officiel du Scrabble® ?

Tout auteur souhaitant distribuer/vendre un ouvrage ou autre produit (hors application pour Smartphone), utilisant une base de mots conforme à l’Officiel du Scrabble®, doit remplir un contrat de partenariat qui lui sera envoyé sur demande faite auprès de la FISF, à l’adresse suivante : contact@fisf.net

Toute société souhaitant distribuer/vendre un produit numérique privé/grand public sécurisé du type application pour Smartphone, utilisant une base de mots conforme à l’ODS, doit contacter Jean-François Richez, responsable des licences numériques chez Larousse, à l’adresse suivante : JFRICHEZ@larousse.fr

Mon projet Python par Martin

Martin’s Logo

Ce projet réalisé par Martin D, élève de 3ème au collège C Peguy d’Arras a été réalisé dans le cadre d’une formation en programmation (algorithme)

Au cycle 4, les élèves s’initient à la programmation, en développant dans une démarche de projet quelques programmes simples, sans viser une connaissance experte et exhaustive d’un langage ou d’un logiciel particulier. En créant un programme, ils développent des méthodes de programmation, revisitent les notions de variables et de fonctions sous une forme différente, et s’entraînent au raisonnement

Code Python traduit en HTML:
#Martin 3e
from turtle import *
color("red" )#couleur de la figure

speed("fastest" )#vitesse trés rapide
bgcolor("black" )#couleur de fond
for i in range(75):#je répete le programme 75 fois 

    
    
    forward(200-i)
  
    right(90)
    forward(50)
    right(90)
    forward(100)
    left(90)
    forward(100)
    right(90)
    forward(50)
    right(90)
    forward(100)
    left(90)
    forward(100)
    right(90)
    forward(50)
    right(90)
    forward(100)
    left(90)
    forward(100)
    right(90)
    forward(50)
    right(90)
    forward(100)
    left(90)
    left(90)

goto(30,30)#je fais cette comande pour mettre le cercle au centre de ma figure
begin_fill()
color("black" )#couleur du cercle
circle(20)#cercle
end_fill()#cercle plein
ht()

Mes commentaires

Ce premier visuel 2019-2020 me plaît vraiment beaucoup ! Attention quand tu évoques dans un commentaire, la couleur du cercle… Il s’agit en fait de la couleur … du disque!

Astuce : l’objet Fraction de Python

l’objet Fraction

J’ai déjà évoqué ici l’utilisation de Python en mode « calculatrice », c’est à dire dans l’IDLE. Pratique, rapide, imprimable les avantages à préférer l’IDLE à une calculatrice classiques sont nombreux et évidents.

Même les calculs avec les fractions sont faisables en utilisant l’objet Fraction du module fractions (from fractions import Fraction…). Et en choisissant un alias court (…as f) on évite d’écrire Fraction() un certain nombre de fois !

Tous les calculs classiques sont possibles (dans l’exemple ci-dessus **2 sert à mettre au carré) et le résultat est donné sous forme d’une fraction irréductible.