DM

À rendre au plus tard à 18h le 30 Novembre 2021 par mail ici avec le sujet contenant [L3ASR]

Exo 1: Classe des vecteurs (6 points)

Ecrire une classe des vecteurs de deux dimensions dont on peut faire les opérations d'addition, de soustraction, et de multiplication avec une constante. On souhait également d'afficher avec la méthode print également.

class vecteur:
    pass
    
## opérations demandées
a = vecteur(1,2)
b = vecteur(3,4)
print(a + b)  # ca devra afficher (4,6)
print(a - b)  # ca devra afficher (-2,-2)
print(4 * a)  # ca devra afficher (4,8)

Exo 2: Analyse des données avec numpy (6 points)

Etant donnée une matrice 0-1 dont les colonnes indiquent les produits et les lignes représentent les utilisateurs. La valeur 1 dans la cellule (i,j) indique que le client i a acheté le produit j. Votre entreprise cherche une stratégie commerciale qui consiste à proposer des produits aux clients (proposer à un client un produit supplémentaire, souvent connexe, à acheter). Vous avez donc besoin d'analyser les comportements des clients à travers de la matrice des données.

Pour chaque combinaison de deux produits, vous devez calculer combien de fois ils ont été achetés ensemble par le même client, et trouver les deux produits achetés ensemble le plus souvent (afin de proposer d'une stratégie commerciale à votre entreprise).

Si vous avez les entrées:

## Dépendences
import numpy as np

## Données
## ligne = [produits] 
## valeur 1 indique que le produit est acheté. 

panier = np.array([[0, 1, 1, 0],
                   [0, 0, 0, 1],
                   [1, 1, 0, 0],
                   [0, 1, 1, 1],
                   [1, 1, 1, 0],
                   [0, 1, 1, 0],
                   [1, 1, 0, 1],
                   [1, 1, 1, 1]])
                      
## votre code ici
               

La sortie attendue est

[(0,1,4), (0,2,2), (0,3,2), (1,2,5), (1,3,3), (2,3,2)]
(1,2,5)

dans laquelle chaque tuple (a,b,n) veut dire que les produits a et b sont achetés ensemble n fois (par n clients). En plus, les produits 1 et 2 sont les deux les plus achetés ensemble (5 fois) dans cet exemple.

Vous pouvez générer une matrice plus grande pour les tests par np.random.randint(2, size=(10, 20))

Exo 3: Mots triades (6 points)

Les mots triades sont des mots anglais tels que les deux sous-chaînes de caractères que vous obtenez en extrayant des lettres alternées forment deux mots valides.

Par exemple :

Triad Phrases

Écrivez une fonction pour déterminer si une phrase entière est composée de mots triades. Vous pouvez supposer que tous les mots sont constitués uniquement de caractères alphabétiques et sont séparés par des espaces. Nous considérerons que la chaîne vide est un mot anglais non-valide.

is_triad_phrase("learned theorem") # => True
is_triad_phrase("studied theories") # => False
is_triad_phrase("wooded agrarians") # => True
is_triad_phrase("forrested farmers") # => False
is_triad_phrase("schooled oriole") # => True
is_triad_phrase("educated small bird") # => False
is_triad_phrase("a") # => False
is_triad_phrase("") # => False

Vous pouvez prendre le fichier /usr/share/dict/words (un fichier texte de 2,5M contenant plus de 200 mille mots anglais) comme le dictionnaire anglais. Vous pouvez également télécharger le fichier ici. Vous pouvez également tester votre programme en cherchant les mots triades dans le dictionnaire. Pour information, nous avons trouvé 2770 mots triades distincts (insensibles à la casse).

Exo 4: Mots croisants (4 points)

Les mots croisants sont des mots anglais pour lesquels l'écart entre chaque paire de lettres adjacentes augmente strictement. Ces écarts sont calculés sans "enroulement" de Z à A.

Par exemple :

Surpassing Phrases

Écrivez une fonction pour déterminer si une phrase entière est composée de mots croisants. Vous pouvez supposer que tous les mots sont constitués uniquement de caractères alphabétiques et sont séparés par des espaces. Nous considérerons que la chaîne vide et une chaîne de 1 caractère sont des mots croisants valides.

is_surpassing_phrase("superb subway") # => True
is_surpassing_phrase("excellent train") # => False
is_surpassing_phrase("porky hogs") # => True
is_surpassing_phrase("plump pigs") # => False
is_surpassing_phrase("turnip fields") # => True
is_surpassing_phrase("root vegetable lands") # => False
is_surpassing_phrase("a") # => True
is_surpassing_phrase("") # => True

Vous pouvez trouver les fonctions Python ord (renvoie le valeur représentant l’unicode d’un caractère spécifié) et chr (inverse de ord) utiles pour résoudre cet exercise.

ord('a') # => 97
chr(97) # => 'a'

Trouver les mots croisants dans le fichier /usr/share/dict/words. Nous avons trouvé 1931 mots croisants distincts.