Skip to content

Instantly share code, notes, and snippets.

@joseanpg
Created August 15, 2011 11:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save joseanpg/1146082 to your computer and use it in GitHub Desktop.
Save joseanpg/1146082 to your computer and use it in GitHub Desktop.
// 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());
@joseanpg
Copy link
Author

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment