Résumé en français : On vous donne une chaine de caractères composée de "chiffres" ('0' à '9'). Vous devez écrire une fonction qui renvoie une chaine où chaque chiffre est répété le nombre de fois correspondant à sa valeur. Par exemple avec la chaine "312", on doit répéter 3 fois le "3", 1 fois le "1" et 2 fois le "2", ce qui donne la chaine "333122".
Première idée, utiliser 2 boucles. La première pour récupérer un à un les caractères de la chaine et la seconde pour dupliquer le bon nombre de fois chacun de ces caractères.
var explose = s => {
sortie = '' // initialisation du résultat final
for (c of s) { // on parcourt la chaine
for (n = 0; n < +c; n++) // on ajoute le bon nombre de fois...
{
sortie += c // ...le caractère
}
}
return sortie // retour du résultat
}
explose("312")
'333122'
explose("302")
'33322'
explose("102269")
'12222666666999999999'
En JavaScript il est simple de répéter un caractère :
'a'.repeat(5)
'aaaaa'
On peut également répéter un caractère 0 fois, dans ce cas on obtient la chaine vide. D'où cette seconde version :
var explose = s => {
sortie = '';
for (c of s) sortie += c.repeat(+c); // Voir dessous pour +c
return sortie
}
+'5' // Transformer une chaine en nombre
5
Number('5') // Même chose que Number
5
Nous devons transformer chaque caractère en sa répétition, ce qui donne un tableau de taille celle de la chaine initiale :
[..."312"].map(c => c.repeat(+c)) // map = transformation
[ '333', '1', '22' ]
Il suffit ensuite de joindre les différents éléments, d'où cette troisième version :
var explose = s => [...s].map(c => c.repeat(+c)).join('')
explose("44012")
'44444444122'
JavaScript est tolérant sur les mélanges de types :
'a'.repeat('3') // utilisation de '3' au lieu de 3
'aaa'
3 * '4' // multiplication d'un nombre par un caractère
12
Ce qui amène à cette version :
var explose = s => [...s].map(c => c.repeat(c)).join``
explose("44012")
'44444444122'
On peut également utiliser reduce
, c'est-à-dire partir d'une chaine vide et au fur et à mesure ajouter les caractères répétés, voici une version :
var explose = s => [...s].reduce((a, c) => a + c.repeat(c), '')
explose("44012")
'44444444122'
Une autre idée est de ce dire que chaque "chiffre" doit être remplacé par sa duplication. Voyons comment on effectue des remplacements en JavaScript :
'bonjour'.replace('o','*') // Un seul 'o' sera remplacé par '*'
'b*njour'
'bonjour'.replace(/o/g,'*') // Tous les 'o' sont remplacés (g pour global)
'b*nj*ur'
"3a1b22".replace(/\d/g, '*') // Remplacer les chiffres (digits)
'*a*b**'
'4032'.replace(/./g, v => 9 - v) // '.' = caractère quelconque
// Les chiffres sont remplacés par 9 - valeur
'5967'
"okjaicompris".replace(/a|e|i|o|u/g, c => c.toUpperCase())
// Mettre toutes les voyelles en majuscules
'OkjAIcOmprIs'
D'où cette version finale :
var explose = s => s.replace(/./g, v => v.repeat(v))
explose('314159')
'33314444155555999999999'