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());
@juandopazo
Copy link

Las expresiones regulares no son lo tuyo o no hay una solucion con regex?

@joseanpg
Copy link
Author

@juandepazo sólo utilizo lo que creo que se ha visto en las reuniones que hasta ahora se han desarrollado

@juandopazo
Copy link

JAJA Sí, algo así se me habia ocurrido. Pero se me ocurre que algun maestro de las expresiones regulares podria hacer algo como...

Math.max.apply(Math, flatten(arr).map(function (str) {
    return /magia/.match(str).length - 1;
}));

@juandopazo
Copy link

No se, para mi las expresiones regulares son vudu

@joseanpg
Copy link
Author

Muy elegante. ¿Qué te parece aprovechando que que el mapa es biyectivo lo invertimos, de manera que la clave sea la vocal en su forma canónica?

var normalizaVocal = (function() {
  var listaDeVocales = {'a':'aáàäâ','e':'eéèëê','i':'iíìïî','o':'oóòöô','u':'uúùüû'};
  return  function(v) {
    for (var vocal in listaDeVocales) {
      var variantes = listaDeVocales[vocal]
      if (variantes.indexOf(v) != -1) return vocal;
     }
     return false;
  }
 })();

@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