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 retournes qui commence à la
position start et de longeur lenString.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)