Skip to content

Instantly share code, notes, and snippets.

@felipernb
Created August 16, 2011 09:18
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 felipernb/1148717 to your computer and use it in GitHub Desktop.
Save felipernb/1148717 to your computer and use it in GitHub Desktop.
Given an array, normalize it to remove recursive arrays and return the number of distinct vowel in the word that has more distinct vowels
var merge_recursive = function(a, res) {
if (!Array.isArray(res)) res = [];
// Using BFS algorithm as if it was a tree
for (var i = 0; i < a.length; i++) {
if (Array.isArray(a[i])) {
merge_recursive(a[i], res);
} else {
res.push(a[i]);
}
}
return res;
}
var vowel_max_counter = function(arr) {
var tokens = merge_recursive(arr);
var count_different_vowels = function(str) {
var vowel_variations = [/[aáãàâä]/, /[eéêèë]/, /[iíîìï]/,
/[oóõòôö]/, /[uúùûü]/];
var different_vowels = 0;
for (var i = 0; i < vowel_variations.length; i++) {
if (str.match(vowel_variations[i])) {
different_vowels++;
}
}
return different_vowels;
};
var max = 0;
var different_vowels;
for (var i = 0; i < tokens.length; i++) {
max = Math.max(count_different_vowels(tokens[i]), max);
}
return max;
}
console.info(vowel_max_counter(["hola", ["soy", ["juan", "fernandez"] ], "y", ["no", "tengo", ["dinero"] ] ]));
@joseanpg
Copy link

Unas observaciones:

  • Cada cadena es escaneada 5 veces contra las correspondientes expresiones regulares, utilizando una función del 'engine'. Además
    se crean reiteradamente cadenas nuevas al ser dicha función replace.
  • Posteriormente se escanean mediante un bucle JavaScript los caracteres de cada cadena y se escanea cada unos de ellos contra una expresión regular.

A veces las expresiones regulares son una tentación que puede resultar un poco cara.

@felipernb
Copy link
Author

Hola, gracias por tus comentários.

No sé como es la implementación interna de regex en JS, pero mirando tu solución que a cada caracter leído itera en una string de tamaño 25 para un indexOf no creo que la mia sea mucho más cara. (Tampoco sé como funciona la implementación del indexOf, pero si no usa algo de memória extra, tiene que iterar la string)

Lo de crear las strings con el replace es un problema, pero es algo que el garbage colector se encarga :D

@joseanpg
Copy link

La solución a la que haces referencia no es comparable con la que aquí tenemos ya que tenía como limitación no utilizar expresiones regulares. En vistas de que el nadie está aplicando dicha limitación (seguramente fue un malentendido por mi parte) puedes comparar con esta otra https://gist.github.com/1149534.

Lo que quería argumentar con mi comentario anterior es que es tentador utilizar expresiones regulares sin planificar claramente una estrategia y que en muchos casos el efecto conseguido equivale disparse en un pie accidentalmente. Sobre todo es frecuente abusar de replace para realizar todo tipo de extraños hacks.

Por cierto deberías leer este twit de @genezeta

Una cosa más, mencionas que

Lo de crear las strings con el replace es un problema, pero es algo que el garbage colector se encarga :D

El recolector de basura se encarga de eliminar los objetos no referenciados., pero ello le lleva su tiempo. Por otra parte no estoy exponiendo un temor a un agotamiento de la memoria, sino que más bien lo que me preocupa es el tiempo que se consume en la creación de objetos transitorios y las "pausas" que el recolector intercalará en nuestro proceso.

@felipernb
Copy link
Author

Lo he alterado, ahora tiene menos lineas, no hace replaces, usa menos memória y procesamiento :)

@joseanpg
Copy link

Me alegra verlo ;)

@joseanpg
Copy link

Creo interesante comentar que en este caso estás utilizando String.prototype.match con expresiones regulares no globales .

var vowel_variations = [/[aáãàâä]/, /[eéêèë]/, /[iíîìï]/,/[oóõòôö]/, /[uúùûü]/];

Esto es equivalente a ejecutar RegExp.prototype.exec con esa misma expresión regular no global. En consecuencia lo único que podemos encontrar es una vocal por cadena. Permite contar el número de vocales distintas pero no realizar un estudio estadístico de la aparición de las vocales. De todas formas, dicha estadística no es un requerimiento de la propuesta.

Para mejorar un poco más sugiero la sustitución de String.prototype.match por RegExp.prototype.test

if (vowel_variations[i].test(str)) different_vowels++;

@felipernb
Copy link
Author

Pero, que mas dá si la idea es solo saber si la vocal se encuentra en la string? Es incluso mas rapido que buscar todas las ocurrencias. Consigues ver algún caso de prueba en que falla?

@joseanpg
Copy link

Observa que escribí:

De todas formas, dicha estadística no es un requerimiento de la propuesta.

Uno de los propósitos del comentario anterior es servir de apoyo a otro comentario en http://jsperf.com/gejs-estadistica-de-vocales/3 (observa el título: Estadistica de Vocales ;)

@joseanpg
Copy link

En http://jsperf.com/gejs-estadistica-de-vocales/4 podemos apreciar lo inconveniente que resulta utilizar RegExp.prototype.exec si lo único que queremos realizar es una comprobación de matching y no nos interesa ningún detalle de éste. En estos casos sin duda, lo que hay que utilizar es RegExp.prototype.test.

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