Codeur Senior

CHALLENGE JavaScript #65 (Difficile)

Chaque Lundi, je vous propose le "5 min JavaScript Challenge"...

J'avais l'habitude de faire l'exercice avec les développeurs qui me suivent par email...
mais maintenant je vais proposer l'exercice à vous aussi, sur YouTube.

PERSONNE ne sera épargné... 😏

La seule règle ?

Vous avez 5 minutes MAX pour en venir à bout... sinon il va falloir revoir les fondamentaux.

Où réaliser le challenge ?

Dans la console de votre navigateur, tout simplement !

METTEZ VOTRE MEILLEURE RÉPONSE DANS LES COMMENTAIRES 👇

2 years ago | [YT] | 28



@lechampi2237

stp les challenges nous manquent!!

1 year ago | 0  

@raffialexanian562

Wow ! J'ai mis un peu plus de 5 minutes. Mon premier challenge que je poste. Comme on ne renvoie qu'une valeur, je me suis dit qu'on doit pouvoir le faire avec un reduce. Et j'ai découvert qu'on pouvait donner des propriétés à l'accumulateur de reduce (?!..). Si, si, pour les utiliser au tour suivant. J'ignorais. Avec un réduce, donc, çà donne : function longestSequence(pattern) { return pattern.split('').reduce((acc, current) => { // acc.previousChar initialisé en '' au 1er tour. if (acc.previousChar === current){ acc.currentCount += 1 if (acc.currentCount > acc.maxCount){ acc.maxCount = acc.currentCount } } else{ // On en profite pour reproduire la chaine la plus longue avec un repeat... acc.longestString = acc.previousChar.repeat(acc.currentCount) // ...Et on réinitialise le compteur à 1 acc.currentCount = 1 } // Le caractère actuel devient le précédent. acc.previousChar = current //Et on renvoie acc dans la boucle suivante. return acc }, /* déclaration des propriétés de acc : */ { previousChar: '', currentCount: 0, maxCount: 0, longestString: ''}); } const pattern = "aabbbbfffffggg"; data = longestSequence(pattern) console.log(`La séquence la plus longue est : "${data.longestString}" avec ${data.maxCount} caractères`); //renvoie : La séquence la plus longue est : "fffff" avec 6 caractères Merci pour ces défis qui nous font progresser !

1 year ago | 0  

@bastienv6233

Par contre j'ai mis un peu plus que 5min ... 😶‍🌫 const text = "aabbbcc"; const findLongestSequence = (text)=>{ let count=1; let curr=''; let max=0; for (let i=0; i<text.length;i++) { if (text[i] === curr) count+=1; else count = 1; if(count>max) max=count; curr=text[i]; } return max;

2 years ago | 2

@Simon_IHG

Avec de la récursion (même si je pense qu'un simple for est plus performant pour des petites chaines de caractères). On pourrait supprimer quelques lignes de code en réassignant les paramètres de la fonction, mais ce n'est pas une bonne pratique à mon sens. function findLongestSubstring(text) { const array = text.split(''); if(array.length === 0){ return 0; } function findMax(character, index, count, max) { const currentMax = count > max ? count : max; if(array.length <= index) { return currentMax; } const currentCharacter = array[index]; const nextIndex = index + 1; if(currentCharacter === character) { const currentCount = count + 1; return findMax(currentCharacter, nextIndex, currentCount, currentMax); } return findMax(currentCharacter, nextIndex, 1, currentMax); } return findMax(undefined, 0, 0, 0); }

2 years ago (edited) | 0

@galluladavid8631

avec filter ( un peu long mais cela fonctionne ) function trouverSequencePlusLongue(chaine) { const sequences = chaine.split('').filter((char, index, array) => { return char === array[index - 1] || char === array[index + 1]; }); let sequencePlusLongue = ''; let sequenceActuelle = ''; sequences.forEach((char) => { if (char === sequenceActuelle[0]) { sequenceActuelle += char; } else { sequenceActuelle = char; } if (sequenceActuelle.length > sequencePlusLongue.length) { sequencePlusLongue = sequenceActuelle; } }); return sequencePlusLongue; } // Exemple d'utilisation const chaine = 'abbcccddddeeeee'; const plusLongueSequence = trouverSequencePlusLongue(chaine); console.log(plusLongueSequence); // Affiche 'eeee'

2 years ago | 2

@julienlemarchand7590

Voici mes deux propositions. J'ai une préférence pour la récursion mais pour le sport j'ai aussi tenté l'approche itérative. function findLongestCharSequence_recursive(text) { return recursive([...text]); function recursive(characters, previousChar = null, sequenceCounter = 1, longestSeq = 0) { const current = characters.shift(); if (!current) return longestSeq; if (current == previousChar) sequenceCounter += 1; else { longestSeq = Math.max(longestSeq, sequenceCounter); sequenceCounter = 1; } return recursive(characters, current, sequenceCounter, longestSeq); } } function findLongestCharSequence_iterative(text) { let sequenceCounter = 1; const resetCounter = () => (sequenceCounter = 1); return [...text].reduce((longestCharSequence, currentChar, i, array) => { const previousChar = array[i - 1]; const isSameSequence = currentChar === previousChar; if (isSameSequence) sequenceCounter += 1; else { longestCharSequence = Math.max(longestCharSequence, sequenceCounter); resetCounter(); } return longestCharSequence; }, 0); } Merci Simon pour cet exercice. Très intéressant !

2 years ago | 0

@galluladavid8631

je n'avais pas compris qu'il fallait retrourner un chiffre , correspodant à la chaine la plus longue . ma solution : utiliser le combiné de trois methodes : -match: est utilisée avec une expression régulière /(.)\1*/g pour trouver toutes les séquences de caractères identiques consécutifs dans la chaîne map: est utilisé pour convertir les séquences trouvées en un tableau contenant leurs longueurs respectives. Math.max est utilisé avec l'opérateur de décomposition (...) pour obtenir la longueur maximale parmi toutes les séquences. voici ma reponse function longueurSequenceMax(chaine) { return Math.max(...chaine.match(/(.)\1*/g).map(seq => seq.length)); } // Exemple d'utilisation const chaine = "aaabbccccccddddd"; const longueur = longueurSequenceMax(chaine); console.log(longueur); // Affiche 6

2 years ago | 1

@galluladavid8631

il y a surement plus court , je pense avec reduce mais je propose ceci function trouverSequencePlusLongue(chaine) { let sequenceActuelle = ''; let sequencePlusLongue = ''; for (let i = 0; i < chaine.length; i++) { if (chaine[i] === chaine[i - 1]) { sequenceActuelle += chaine[i]; } else { sequenceActuelle = chaine[i]; } if (sequenceActuelle.length > sequencePlusLongue.length) { sequencePlusLongue = sequenceActuelle; } } return sequencePlusLongue; } // Exemple d'utilisation const chaine = 'abbcccddddeeeee'; const plusLongueSequence = trouverSequencePlusLongue(chaine); console.log(plusLongueSequence); // Affiche 'eeee'

2 years ago | 2

@Kergari

const count = text.split('').reduce(function(accumulator, current, index, array) { let currAccumulator = 1; array.slice(index).every((current, index, array) => { if(index < array.length-1 && current === array[index+1]) { currAccumulator++; return true; } return false; }); return Math.max(accumulator, currAccumulator); }, 1); return count;

2 years ago (edited) | 0

@BastienFacquet

Je me suis permis de regarder quelques réponses avant de donner la mienne, et j'ai trouvé une réponse tellement concise que je me suis demandé si je devais en être jaloux ^^. Du coup, pour me consoler, j'ai comparé les performances de ma réponse avec celle qui pourrait tenir sur une ligne. Et ca donne : function getMaxEqualCharsConsecutive(text){ let max = 0, counter = 1, letter = text[0]; function resetCountersAndUpdateLetter(e){ max = counter > max ? counter : max; counter = 1; letter = e; } text.split('').map(e => e == letter ? counter++ : resetCountersAndUpdateLetter(e)); return max; } function longueurSequenceMax(chaine) { return Math.max(...chaine.match(/(.)\1*/g).map(seq => seq.length)); } function getTimeAfterRepeat(fn, e){ let d = new Date(); for(let i = 0; i < 10000; i++){ fn(e); } return new Date() - d; } results = { arrayFunction : getTimeAfterRepeat(getMaxEqualCharsConsecutive, lorem), regexp : getTimeAfterRepeat(longueurSequenceMax, lorem) }; //=> {arrayFunction: 237, regexp: 893} Conclusion, les regex c'est puissant mais gourmand, à utiliser avec parcimonie... (d'autant plus que ma réponse n'est certainement pas la plus performante...)

1 year ago | 0  

@alanlechevallier2737

const text = "aaabbbccdddddde" const list = [] const findLongestSequence = text => { let compteur = 1 for (i = 0; i < text.length; i++) { if (text[i] == text[i+1]){ compteur += 1 } else { list.push(compteur) compteur=1 } } console.log(Math.max(...list)) } findLongestSequence(text)

2 years ago | 1

@paulpiazza4909

Je suis parti sur la méthode slice. ``` const text = "aabbbcddeef"; let max = 0; for(let i = 0; i < text.length; ++i) { const char = text[i]; const firstIndex = text.indexOf(char); const lastIndex = text.lastIndexOf(char); const slice = text.slice(firstIndex, lastIndex + 1); const sliceLength = slice.length if(sliceLength > max) max = sliceLength; } console.log(max); ```

2 years ago (edited) | 0

@Kergari

// Ne marche pas quand on a des caractères similaires non consécutifs. Comme "aabbbaaccaa" const text = "Hello Worlddd" const map = new Map(); const array = text.split(´´); array.forEach((item, index) => { if(index > 0 && item === array[index-1]) map.set(item, map.get(item)==null ? 2 : map.get(item)+1); }); return Math.max(…map.values());

2 years ago (edited) | 0