mercredi 1 avril 2009

Numyrinthe

Vous trouverez ci-dessous la photo d'un Numyrinthe. Il s'agit d'un labyrinthe de symboles (chiffres, lettres, autres) disposés sur des cercles concentriques. Pour passer d'un cercle à un autre, il faut déduire la relation qui les relie (une simple opération mathématique d'addition par exemple). Quelques infos :
  • pour les Numyrinthes complexes, ces relations de passage d'une couronne à l'autre peuvent être différentes. Elles peuvent être de natures différentes (i.e. pas nécessairement mathématique).
  • le nombre de cercles n'est pas limité.
  • les symboles peuvent être répétés, ou non. Tout dépend de la complexité du Numyrinthe.
Le Numyrinthe est résolu lorsque toutes les cases libres sont remplies.
Saurez-vous résoudre ce premier Numyrinthe, plutôt facile, dans lequel il vous faudra faire plus ?

lundi 23 mars 2009

Python et la copie de listes : attention aux pièges

La copie de listes en Python est une opération qui recèle quelques subtilités liées à la manipulation des objets (Dans Python, tout est objet !). J'ai déjà écrit sur le sujet ici.
Il faut davantage se méfier de la copie de listes de listes, c'est à dire de listes composées de listes !!!

Le problème
Si l'on veut recopier la liste a dans b, l'opération b = a produit le résultat suivant :
>>> a = [1,2,3]
>>> b = a
>>> a.append(4)
>>> print a,b
[1,2,3,4] [1,2,3,4]


a et b sont en effet des alias, des étiquettes du même objet [1,2,3]. Donc, effectuer une opération sur a revient à effectuer une opération sur b, puisque dans les deux cas on effectue l'opération sur [1,2,3].

Le fils de Dark Vador, le dernier élève de Yoda sont deux périphrases pour désigner Luke Skywalker.

Solution 1.
La copie de listes étant donc une opération très répandue en Python, il existe plusieurs solutions à ce problème de copie. La première consiste à utiliser la fonction list().
>>> a = [1,2,3]
>>> b = list(a)
>>> a.append(4)
>>> print a,b

[1,2,3,4] [1,2,3]

Solution 2.
Utilisation de la fonction copy() du module copy.
>>> import copy
>>> b = copy.copy(a)


Copie de listes de listes.
Examinons le problème en créant une liste de listes, et en la copiant grâce à list().
>>> a = [ [1,2,3] , ["a", "b"] ]
>>> b = list(a)

Rajoutons un élément à a[1].
>>> a[1].append("c")

On peut vérifier que a et b sont deux listes différentes
>>> id(a)
168544588
>>> id(b)
168544876


Affichons a et b :
>>> print a,b
[[1,2,3] , ["a", "b" , "c"]] [[1,2,3] , ["a", "b" , "c"]]


La liste b est elle-aussi modifée !
En effet, le deuxième élément des deux listes est à la même adresse :
>>> id(a[1])
168544492
>>> id(b[1])
168544492


Solution.
La copie de listes de listes se fera grâce à l'instruction deepcopy() du module copy.

mardi 3 février 2009

Récupérer puis Traiter les données d'une fenêtre TKinter (RadioButton)

Le petit script ci-dessous vous permet de récupérer la donnée en provenance d'un radiobutton.

from Tkinter import *

def affichage():
print v.get()
print 2*float(v.get())

mast = Tk()
v = StringVar()
Radiobutton(mast,variable=v,text="A ", value="3.14", command=affichage).pack()
Radiobutton(mast,variable=v,text="B", value="6.28",command=affichage).pack()
Radiobutton(mast,variable=v,text="C", value="4.2",command=affichage).pack()
mast.mainloop

Chaque radiobutton est caractérisé par la valeur qu'il doit renvoyer (dans cet exemple, c'est une chaîne de caractères, indiquée ici dans le champ value : 3.14, 6.28 ou 4.2). Le champ variable est le nom de la variable qui recevra le choix de l'utilisateur : nécessairement le nom doit être identique pour tous les radiobuttons d'un même groupe.
On associe pour l'exemple la fonction affichage() à chaque radiobutton pour les "voir" sur la console.
Pour finir, l'accès au contenu de la variable v se fait grâce à la méthode get().

mardi 6 janvier 2009

Listes multi-dimensionnelles en Python

En Python, les listes sont l'un des types de données les plus pratiques. Ce sont les équivalents les plus proches des structures de type tableau que l'on rencontre dans d'autres langages.
Donc, à ce titre, on peut également définir des listes multi-dimensionnelles, à 2 dimensions pour commencer.
Script
nb_lignes,nb_cols = 5,4
liste = []
for indl in range(nb_lignes):
.....dummy = [0] * nb_cols
.....liste.append(dummy)
print liste
liste[1][3] = "X"
print liste


Dans l'exemple précédent, on définit une liste liste de 5 lignes par 4 colonnes. L'affichage de la liste avant et après l'insertion du caractère "x" en (1,3) permet d'observer la mise à jour de la liste.

Question
La solution suivante est plus esthétique, mais comporte un piège classique sur la manipulation des objets.
>>> liste = [[0]*nb_lignes] * nb_cols
Quel est le résultat affiché si l'on procède au même remplacement de la position (1,3) ?

jeudi 11 décembre 2008

Récupérer puis Traiter les données d'une fenêtre TKinter (Entry)

TKinter est un module Python permettant de créer rapidement et simplement une interface utilisateur (GUI, IHM).
Vous trouverez dans cet article un petit exemple (intro_tkinter_basic.py) qui permettra de vous familiariser avec la récupération et le traitement des données provenant de contrôles de type Entry (champs à remplir par l'utilisateur).
Vous verrez également comment renvoyer ces données vers l'IHM dans un contrôle de type Text.
Pour cela, on utilise les deux méthodes configure() et get().

samedi 15 novembre 2008

Avez-vous VUE ?


VUE, pour Visual Understanding Environment, est un nouvel outil dans le monde des cartes mentales. Sa particularité est d'introduire la notion de chemins d'apprentissages (pathways) . Ces chemins permettent de relier les noeuds d'une carte partageant une même idée, une même thématique. De plus, chaque noeud de la carte possède sa propre diapositive (au sens Powerpoint/OOo Impress du terme), ce qui permet, lors d'une présentation, de basculer entre une approche "carte mentale" ou une approche "diaporama". Bien entendu, chaque noeud/diapo peut être agrémenté à l'envi de photos, liens, etc qui viennent enrichir la présentation.
Il faut noter qu'une version en ligne existe, utilisable à l'intérieur du navigateur sous forme d'applet Java.
Il est développé par l'université Tufts, et peut donc être téléchargé sur leurs serveurs. Développé en Java, il est donc disponible sur toutes plateformes.

lundi 3 novembre 2008

L'Homme Invisible

De petits casques très pratiques ont fait leurs apparitions dans le commerce (ici ou ). Ces casques, qui mettent en oeuvre des techniques d'annulation/réduction du bruit ambiant (noise cancelling techniques) permettent par exemple de voyager en avion dans le calme, sans avoir à subir le ronronnement permanent des réacteurs. Techniquement ( le TNS étant à la mode ces jours-ci), l'algorithme à la base du noise cancellation est un filtre numérique d'ordre assez élevé (> 100). On parle de filtre adaptatif dans la mesure où les coefficients du filtre ne sont pas des constantes mais des variables ajustées en fonction d'un critère d'erreur : la différence entre le bruit ambiant reçu au niveau du casque et la correction apportée par le filtre. Ce sont là des techniques complexes...
Examinons le fonctionnement d'un dispositif simpliste avec SwitcherCAD.
Un monde sans son.
Le principe physique à la base du concept est celui d'interférences destructives. L'idée est d'envoyer dans les écouteurs le bruit ambiant additionné d'un signal électrique semblable mais de polarité inverse.
La figure ci-dessus représente une source de tension SwCAD classique, définie par un fichier WAV (ici vista2.wav pour faire le test). La durée de simulation est de 4.7 secondes, ce qui correspond environ à la durée du son.
Créeons maintenant un fichier son défini comme l'opposé de vista2.wav, par l'utilisation d'une source SwCAD BV (Behavorial Voltage, voir l'article de référence si besoin).
Notez le signe "-" devant la définition de la source. La ligne de commande .wave permet d'exporter notre signal au format WAV (nom de fichier = vista3.wav, N = 16 bits, Fe = 44.1Hz).
Une fois lancée la simulation, vous pouvez écouter le son produit par la source Vmusik_neg enregistré sous le nom vista3.wav . Il n'y aucune différence à l'oreille.
Pour finir, toujours avec une source BV, créons un troisième son défini comme la somme de Vmusik et de Vmusik_neg.
La tension Vcancel est exportée là aussi au format WAV (fichier vista4.wav). Ecoutez le son résultant ici.....
Remarque importante : pour cette expérience, on a inversé la polarité du signal vista2. C'est donc que nous connaissons vista2. Dans le cas d'un bruit ambiant par définition aléatoire, nous n'avons pas cette connaissance, noeud du problème...

Et avec des images ?
Avec ce principe, vous pouvez jouer à l'Homme Invisible...
Prenons, au hasard, une image tirée des Simpsons, avec Tom Brady comme invité d'Homer.
C'est l'image que l'on va chercher à annuler... Pour cela, n'importe quel logiciel de traitement d'image possède une option Inverser les couleurs. Le résultat de cette opération sur l'image de départ donne :
C'est le négatif, terme désuet à l'ère des appareils photos numériques.
La photo ci-dessous représente la somme des deux images précédentes (Réalisé sans trucages) :
On a fait disparaître l'image... La photo ci-dessous comporte un calque transparent permettant de voir les deux moitiés des deux images, avec la zone grise au centre.
Moralité : Si les casques d'aujourd'hui permettent d'annuler les bruits de fond ambiants, vivement les lunettes de demain... (ou bien relire H.G. Wells)