Résumé en français : Vous devez créer un programme qui à partir d'une phrase, met tous les mots distincts dans une liste et retourne une chaine donnant les positions des mots de la phrase initiale dans cette liste. On ne tiendra pas compte de la casse.
Voici un autre exemple pour mieux comprendre :
phrase = 'The number 0 is such a strange number Strangely it has zero meaning'
>> compress(phrase)
'012345617891011'
En effet, la liste des mots uniques est :
['the', 'number', '0', 'is', 'such', 'a', 'strange', 'strangely', 'it', 'has', 'zero', 'meaning']
Il faut donc bien voir que le mot 'strangely' est à la 8e place dans la phrase initiale mais à la 7e place dans la liste des mots uniques, c'est donc 7 qu'il faut récupérer en non 8.
On peut commencer par créer la liste des mots uniques trouvés dans la phrase et dans un second temps parcourir à nouveau tous les mots de la phrase pour trouver leurs positions dans cette liste. Première étape :
var compress = phrase => {
var mots = []; // Tableau des mots uniques
for (m of phrase.toLowerCase().split(' ')) // On parcourt chaque mot
if (!mots.includes(m)) mots.push(m) // Nouveau mot ? On l'ajoute
return mots
}
compress('The number 0 is such a strange number Strangely it has zero meaning')
[ 'the', 'number', '0', 'is', 'such', 'a', 'strange', 'strangely', 'it', 'has', 'zero', 'meaning' ]
On peut aussi utiliser reduce
(puisque l’on part d’un tableau vide [ ]
et que l’on va ajouter au fur et à mesure les mots nouveaux). Ce qui donne :
var compress = phrase => {
decoup = phrase.toLowerCase().split(' ')
mots = decoup.reduce((a, m) => a.includes(m) ? a : a.concat(m), [])
return mots
}
compress('The number 0 is such a strange number Strangely it has zero meaning')
[ 'the', 'number', '0', 'is', 'such', 'a', 'strange', 'strangely', 'it', 'has', 'zero', 'meaning' ]
Ensuite, pour la seconde partie, il s’agit de transformer (map
) chaque mot en sa position dans la liste des mots uniques. Voici 2 exemples d’utilisation de map
:
[1, 5, 10].map(v => v * v) // On met chaque élément au carré
[ 1, 25, 100 ]
['abra','cada','bra'].map(m => m[0].toUpperCase()) // 1ere lettre en majuscule
[ 'A', 'C', 'B' ]
Ce qui donne cette version finale :
var compress = phrase => {
decoup = phrase.toLowerCase().split(' ')
mots = decoup.reduce((a, m) => a.includes(m) ? a : a.concat(m), [])
return decoup.map(m => '' + mots.indexOf(m)).join('')
}
compress('The number 0 is such a strange number Strangely it has zero meaning')
'012345617891011'
Le ” +
permet de convertir un nombre en chaine. Par exemple ” + 2
donne '2’
, on peut aussi utiliser (2).toString()
.
Nous aurions également pu utiliser un ensemble :
var compress = phrase => {
decoup = phrase.toLowerCase().split(' ')
mots = [...new Set(decoup)] // Liste des mots uniques
return decoup.map(m => '' + mots.indexOf(m)).join('')
}
compress('The number 0 is such a strange number Strangely it has zero meaning')
'012345617891011'