1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| function string.to_list(s)
-- Convertit une chaîne en table
list = {}
for i = 1, #s do
list[i] = s:sub(i, i)
end
return list
end
function table.find(tab, element)
-- Retourne la position d'un élément dans
-- la table ou nil si non trouvé
for i, n in ipairs(tab) do
if n == element then
return i
end
end
return nil
end
local function nombre_concordances(mot, lettres)
-- Retourne le nombre de concordances entre le mot et lettres
liste_lettres = string.to_list(lettres)
nc = 0
for i = 1, string.len(mot) do
car = string.sub(mot, i, i)
pos = table.find(liste_lettres, car)
if pos ~= nil then
table.remove(liste_lettres, pos)
nc = nc + 1
end
end
return nc
end
local function resultats(fichier, lettres)
-- Construit et retourne un array avec pour clef la longueur des
-- mots et valeur une table des mots
len_lettres = string.len(lettres)
occurences = {}
for mot in io.lines(fichier) do
len_mot = string.len(mot)
if len_mot < 2 or len_mot > len_lettres then
goto continue
end
nc = nombre_concordances(mot, lettres)
if nc ~= len_mot then
goto continue
end
tab_mot = occurences[nc]
if tab_mot == nil then
tab_mot = {}
occurences[nc] = tab_mot
end
table.insert(tab_mot, mot)
::continue::
end
return occurences
end
local function afficher_resultats(fichier, lettres)
res = resultats(fichier, lettres)
len_max = 0
for i, _ in pairs(res) do
if i > len_max then
len_max = i
end
end
for _, mot in pairs(res[len_max]) do
print(mot)
end
end
afficher_resultats("french", "vlrftioya") |
Partager