Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
// 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

This comment has been minimized.

Copy link

juandopazo commented Aug 15, 2011

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

@joseanpg

This comment has been minimized.

Copy link
Owner Author

joseanpg commented Aug 15, 2011

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

@juandopazo

This comment has been minimized.

Copy link

juandopazo commented Aug 15, 2011

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

This comment has been minimized.

Copy link

juandopazo commented Aug 15, 2011

No se, para mi las expresiones regulares son vudu

@joseanpg

This comment has been minimized.

Copy link
Owner Author

joseanpg commented Aug 16, 2011

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

This comment has been minimized.

Copy link
Owner Author

joseanpg commented Aug 16, 2011

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
You can’t perform that action at this time.