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()); | |
@juandepazo sólo utilizo lo que creo que se ha visto en las reuniones que hasta ahora se han desarrollado
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;
}));
No se, para mi las expresiones regulares son vudu
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;
}
})();
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
Las expresiones regulares no son lo tuyo o no hay una solucion con regex?