TP Noté de Programmation Fonctionnelle

Durée : 1h.

On s'intéresse aux grilles de mots-croisés. Chaque case dans une grille est repérée par ses coordonnées (i,j), où 1<=i<=M et 1<=j<=N et où M est le nombre de lignes et N, le nombre de colonnes de la grille. Voici un exemple de grille de mots croisés de taille 6x5 (à 6 lignes et 5 colonnes)

N
O
T
E
R
I
¤ A
N
E
V
¤ B
A
C
E
¤ L
¤
U
A
R
E
T
E
U
¤ S
A
S


1.     Définir la fonction spell qui, étant donné un mot horizontal et les coordonnées de sa première lettre, retourne la liste des lettres de ce mot avec leurs coordonnées :

spell ((5,1),"SAC") = [((5,1),"S");((5,2),"A");((5,3),"C")]

On utilisera la fonction String.sub s start len, qui retourne la souschaine de s qui commence à la position start et de longeur len, et la fonction String.length s qui retourne la longueur de s.


2.     Définir la fonction scan_h qui, étant donnés les dimensions M et N d'une grille, retourne la liste de ses cases dans l'ordre de leur parcours. On choisit de parcourir les cases horizontalement.

scan_h (3,2) = [(1,1);(1,2);(2,1);(2,2);(3,1);(3,2)]


3.    Définir la fonction scan_v identique à la fonction scan_h de la question 2. excepté que l'on choisit de parcourir les cases verticalement.

scan_v (2,3) = [(1,1);(2,1);(1,2);(2,2);(1,3);(2,3)]

Il est imposé de se servir de la fonction scan_h et du schéma List.map en remarquant que le résultat de scan_v (2,3) est identique à celui de scan_h (3,2) excepté que les coordonnées à l'intérieur de chaque couple sont données dans le désordre ((j,i) au lieu de (i,j)).


Dans la suite, on appelle solution d'une grille de mots-croisés, la liste de ses mots horizontaux avec les coordonnées de leur première lettre. Par exemple :

let soluce =
  [((1,1),"NOTER");((2,1),"I");((2,3),"ANE");
   ((3,1),"V");((3,3),"BAC");((4,1),"E");
   ((4,3),"L");((4,5),"U");((5,1),"ARETE");
   ((6,1),"U");((6,3),"SAS")];;


est solution de la grille donnée en exemple.


4.     Définir la fonction letters qui étant donnée une solution de grille de mots-croisés retourne la liste de toutes les lettres de la grille avec leur coordonnées.

letters soluce =
  [((1,1),"N");((1,2),"O");((1,3),"T");((1,4),"E");((1,5),"R");
   ((2,1),"I");((2,3),"A");((2,4),"N");((2,5),"E");((3,1),"V");
   ((3,3),"B");((3,4),"A");((3,5),"C");((4,1),"E");((4,3),"L");
   ((4,5),"U");((5,1),"A");((5,2),"R");((5,3),"E");((5,4),"T");
   ((5,5),"E");((6,1),"U");((6,3),"S");((6,4),"A");((6,5),"S")]



5.     Définir la fonction size qui étant donnée une solution de grille de mots-croisés retourne les dimensions N et M de la grille.

size soluce = (6,5)