Created
August 15, 2011 11:49
-
-
Save joseanpg/1146082 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// FUNCIONES AUXILIARES | |
/* | |
* La siguiente función cuenta las propiedades | |
* (tanto propias como hereradas) de un objeto | |
*/ | |
function contarPropiedades(obj) { | |
var recuento = 0; | |
for (propiedad in obj) recuento ++; | |
return recuento; | |
} | |
/* | |
* Las siguientes funciones son las que permiten hacer un "estudio estadístico" | |
* de las vocales de un texto. | |
* | |
*/ | |
// No hay esperanzas matemáticas en http://www.unicode.org/charts/PDF/U0080.pdf | |
// pero podemos organizar nuestra propia tabla con congruencias módulo 5 | |
var listaDeVocales = 'aeiouáéíóúàèìòùâêîôûäëïöü'; | |
function normalizaVocalMinuscula(c) { | |
var pos = listaDeVocales.indexOf(c); | |
if (pos !=-1) return listaDeVocales.charAt(pos%5); | |
else return false; | |
} | |
function estadisticaDeVocales(texto) { | |
texto = texto.loLowerCase(); | |
var tablaDeFrecuencias = {}; | |
for (var j=0, len = texto.length;j<len;j++) { | |
var caracter = normalizaVocalMinuscula(texto.charAt(j)); | |
if (caracter !== false) { | |
if (caracter in tablaDeFrecuencias) tablaDeFrecuencias[caracter]++; | |
else tablaDeFrecuencias[caracter] = 1; | |
} | |
} | |
return tablaDeFrecuencias; | |
} | |
// RESOLUCIÓN DEL PROBLEMA | |
/* | |
* vocalizeitor recorre el árbol de strings | |
* buscando el máximo número de vocales distintas | |
* por nodo. Devuelve dicho número y las string que lo tienen | |
* | |
*/ | |
function vocalizeitor(soa, campeones) { | |
if (soa instanceof Array) { | |
for (var j=0, len = soa.length;j<len;j++) { | |
vocalizeitor(soa[j],campeones); | |
} | |
} | |
else { | |
var numeroDeVocalesDistintas = contarPropiedades(estadisticaDeVocales(soa)); | |
if (numeroDeVocalesDistintas == campeones.numeroDeVocalesDistintas) { | |
campeones.nodos.push(soa); | |
} | |
else if (numeroDeVocalesDistintas > campeones.numeroDeVocalesDistintas) { | |
campeones.numeroDeVocalesDistintas = numeroDeVocalesDistintas; | |
campeones.nodos = [soa]; | |
} | |
} | |
} | |
/* | |
* Esta vez le toca a Ferb poner en marcha el invento | |
* | |
*/ | |
function ferb(a) { | |
var campeones = {numeroDeVocalesDistintas:0,nodos:[]}; | |
vocalizeitor(a,campeones); | |
return campeones; | |
} | |
//TEST | |
var ej = ferb(["hola", ["soy", ["juan", "fernandez"] ], "y", ["no", "tengoóaiua", ["diiiiineeeeroooooo"] ] ]); | |
console.log(ej.numeroDeVocalesDistintas,ej.nodos.join()); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Llevas razón: es más eficiente que la vocal desnuda sea el valor, aunque la diferencia sea mínima :)
Pensándolo bien, incluso es más claro a nivel conceptual.