2017-03-04 2 views
-5

Je veux catégoriser les chaînes en trois types: bon, mauvais ou mixte. Si une chaîne a 3 voyelles consécutives ou 5 consonnes consécutives, ou les deux, alors elle est classée comme mauvaise. Sinon, il est classé comme bon. Les voyelles dans l'alphabet anglais sont ["a", "e", "i", "o", "u"] et toutes les autres lettres sont des consonnes.Comment classer une chaîne comme «bonne», «mauvaise» et «mixte» en fonction de séquences de voyelles et de consonnes

La chaîne peut également contenir le caractère ?, qui peut être remplacé par une voyelle ou une consonne. Cela signifie que la chaîne "? Aa" peut être mauvaise si ? est une voyelle ou bonne si c'est une consonne. Ce type de chaîne est classé comme mélangé.

Implémentez une fonction qui prend une chaîne s et renvoie sa catégorie: bonne, mauvaise ou mixte.

Ci-dessous le code actuel que j'ai:

function classifyStrings(s) { 
 
    if (s.includes('?')) return 'mixed'; 
 

 
    for (var i = 0; i < s.length; i++) { 
 
    if (s[i].match(/[aeiou]/gi) && s[i + 1].match(/[aeiou]/gi) && s[i + 2].match(/[aeiou]/gi)) { 
 
     return 'bad' 
 
    } else { 
 
     return 'good' 
 
    } 
 
    } 
 
}

Quelqu'un peut-il me s'il vous plaît aider?

+2

On dirait que vous essayez de trouver quelqu'un pour résoudre votre examen. – Janne

+0

En guise d'aide, avec regEx vous pouvez utiliser une construction comme ceci/[aeiou] {3,}/gi pour déterminer s'il y a au moins trois voyelles dans une rangée. Je recommanderais [ce site] (https://regex101.com/) de mieux connaître regEx et ses nombreuses facettes (bien qu'il y en ait beaucoup de bonnes.) – rasmeister

+0

@rasmeister J'ai essayé votre solution, mais le code ci-dessous ne semble pas au travail Savez-vous pourquoi? si (s [i] .match (/ [aeiou] {3} /)) retourner 'mauvais' – Tae

Répondre

-1

Heres un 'presque' répondre

function isVowel(s){ 
 
    return s=="a" || s=="i" || s=="o" || s=="u" || s=="e"; 
 
} 
 

 
var inputs = ["aaa","aab","aabbbbb","aa?bbbb","?aa", "bbaa?"] 
 
//    bad good bad  bad  mixed mixed 
 
for(var i=0;i<inputs.length;i++){ 
 
    var letters = inputs[i].split(""); 
 
    var vcount = 0; ccount = 0; 
 
    var mixed = false; 
 
    for(var j=0;j<letters.length;j++){ 
 
    if(isVowel(letters[j])){ 
 
     ccount=0; 
 
     vcount++; 
 
    }else if(letters[j]=="?"){ 
 
     mixed = true; 
 
    }else{ 
 
     vcount=0; 
 
     ccount++; 
 
    } 
 
    } 
 
    if(mixed){ 
 
    var possibilities = ["ifVowel","ifConsonant"]; 
 
    var outcome = []; 
 
    for(var p=0; p<possibilities.length; p++){ 
 
     var tvcount = 0; tccount = 0; 
 
     for(var l=0; l<letters.length;l++){ 
 
     if(isVowel(letters[l])){ 
 
      if(tccount!=5) tccount=0; 
 
      tvcount++; 
 
     }else if(letters[l]=="?"){ 
 
      if(possibilities[p]=="ifVowel"){ 
 
      if(tccount!=5) tccount=0; 
 
      tvcount++; 
 
      }else { 
 
      if(tvcount!=3) tvcount=0; 
 
      tccount++; 
 
      } 
 
     }else{ 
 
      if(tvcount!=3) tvcount=0; 
 
      tccount++; 
 
     } 
 
     } 
 
     if(tvcount==3 || tccount==5){ 
 
     outcome.push("bad"); 
 
     }else{ 
 
     outcome.push("good"); 
 
     } 
 
    } 
 
    if(outcome[0]!=outcome[1]) console.log("mixed"); 
 
    else console.log(outcome[1]); 
 
    }else{ 
 
    if(vcount==3 || ccount==5) console.log("bad"); 
 
    else console.log("good"); 
 
    } 
 
}

Cependant, cela ne fonctionne pas s'il y a plus d'un "?". Probablement pourrait résoudre ce problème avec récursion, mais déjà passer 30 minutes sur celui-ci, doivent donc passer :(

Hope this helps

+0

" aa? Bbbb' ne devrait pas être "mélangé"? –

+0

@torazaburo non, parce que les deux possibilités résultats mauvais – IsuruKusumal

1

définir deux expressions régulières, un pour mixte et un pour le mal.

L'expression rationnelle bad recherche simplement trois voyelles consécutives ou cinq consonnes consécutives.L'expression regexp mixed recherche la même chose, mais utilise lookahead (?=) pour s'assurer qu'il y ait un point d'interrogation dans les trois ou cinq caractères suivants.

const bad = /[aeiou]{3}|[^aeiou?]{5}/; 
 
const mixed = /(?=.{0,2}\?)[aeiou?]{3}|(?=.{0,4}\?)[^aeiou]{5}/; 
 

 
function classify(s) { 
 
    return bad.test(s) ? "bad" : mixed.test(s) ? "mixed" : "good"; 
 
} 
 

 
['abcde', 'aeibbb', 'xxaa?s', 'aavwxy?aa', 'abcdfga', 'aa?bbbb'].forEach(s => 
 
    console.log(s, classify(s)));

+0

cela échoue pour 'aa? Bbbb' – IsuruKusumal

+0

Il (maintenant) retourne' mixed' pour 'aa? Bbbb' , ce que je pense est correct, car il n'y a pas "mauvais" "sous-chaînes, seulement" sous-chaînes "mixtes". Si vous n'êtes pas d'accord, veuillez demander au PO. –

+0

Étant donné que les valeurs possibles pour "?" peut être voyelle ou consonne. Donc, pour une entrée donnée "aa?bbbb "il faut soit" aaabbbb "ou" aabbbbb "et les deux sont mauvais. – everlasto