sábado, 25 de febrero de 2012

Palíndromos (2 de 3)

El método estudiado en la entrada anterior para ver si una frase es palíndromo es largo, confuso y poco elegante. Veamos otra solución.

Comencemos escribiendo un conjunto de frases a partir de la celda B3.

Paso 1: Poner la frase en mayúscula y eliminar los acentos.

En E3:
=SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(MAYUSC(B3);"Á";"A");"É";"E");"Í";"I");"Ó";"O");"Ú";"U");"Ü";"U")

Extendemos la fórmula hasta la fila 18.

Paso 2: Eliminar los signos de puntuación y los espacios.

En F3:
=SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(E3;",";"");";";"");".";"");":";"");"!";"");"¡";"");"¿";"");"?";"");"""";"");" ";"")

Extendemos la fórmula hasta la fila 18.

Si hacemos el ejercicio con Excel 2003, este paso hay que hacerlos en dos o mas pasos, ya que sólo admite 7 niveles de anidamiento. Excel 2010 admite 64.

Ahora, dividiremos la frase por la mitad (no importa que el número de caracteres sea par o impar). De la primera mitad extraeremos los caracteres empezando por la izquierda y los compararemos con los que extraigamos de la segunda mitad empezando por la derecha.Si todos coinciden es un palíndromo.

Paso 3: Contar el número de caracteres y dividir por dos (división entera).

En G3:
=COCIENTE(LARGO(F3);2)    [Resultado: 14]

De la primera frase, extraeremos los primeros 14 caracteres y los 14 últimos. En el ejemplo, la frase tiene 29 caracteres, de modo que el central (es la letra R) se desestima puesto que siempre ocupa el lugar decimoquinto, ya sea leyendo por la izquierda, ya sea leyendo por la derecha.

Paso 4: Extraer la mitad de los caracteres por la izquierda y la otra mitad por la derecha.

Seleccionamos H3:H50 y escribimos:
=EXTRAE(F3;FILA(INDIRECTO("1:"&G3));1)    [Terminar con Ctrl + Mayús + Intro]

Seleccionamos I3:I50 y escribimos:
=EXTRAE(F3;LARGO(F3)-FILA(INDIRECTO("1:"&G3))+1;1)    [Terminar con Ctrl + Mayús + Intro]

Ya hemos extraído los primeros 14 caracteres por la izquierda y por la derecha. Las últimas filas dan error porque hemos seleccionado un rango muy superior al que necesitamos (no podemos saber de antemano la longitud de la frase). Cuando compongamos la fórmula final prescindiremos de estas columnas y ya no habrá ningún error.

Comparando los caracteres de las columnas H e I por parejas obtendremos un conjunto de valores VERDADERO (si coinciden) y FALSO (si no coinciden).

Paso 5: Comparar las columnas H e I.

En J3:
=H3=I3

Extendemos la fórmula hasta la fila 50.

Paso 6: Comprobar el número de valores VERDADERO que hay en la columna J.

Si es un palíndromo, deberá haber 14 valores VERDADERO. Para contarlos podemos usar SUMA o, mejor aún, SUMAPRODUCTO, que nos evitará la necesidad de usar fórmulas matriciales.

En K3:
=SUMAPRODUCTO(--(J3:J16))=G3    [Resultado: VERDADERO]

Hemos seleccionado hasta la fila 16, ya que si incluimos más filas se produce un error. Dejando que Excel seleccione el número correcto de filas nos evitamos este problema.

Sustituimos la fórmula de K3 por:
=SUMAPRODUCTO(--(EXTRAE(F3; FILA(INDIRECTO("1:"&G3));1)=EXTRAE(F3;LARGO(F3)-FILA(INDIRECTO("1:"&G3))+1;1)))=G3

 Paso 7: Ponemos el resultado final.

En L3:
=SI(K3;"Sí";"No")

Vamos a crear una fórmula compuesta usando únicamente los datos de la celda F3. La fórmula definitiva la pondremos en C3.

En C3:
=SI(SUMAPRODUCTO(--(EXTRAE(F3;FILA(INDIRECTO("1:"&COCIENTE(LARGO(F3);2)));1)=EXTRAE(F3;LARGO(F3)-FILA(INDIRECTO("1:"&COCIENTE(LARGO(F3);2)))+1;1)))=COCIENTE(LARGO(F3);2);"Sí";"No")    [Resultado: Sí]

Extendemos la fórmula hasta la fila 18.

Podemos eliminar sin problemas las columnas G, H, I, J, K, y L; ya no son necesarias.

Paso 8: Crear dos nuevos "nombres" para eliminar las columnas E y F.

Hacemos clic en E3 (imprescindible), accedemos a Fórmulas + Asignar nombre y creamos el "nombre" siguiente:

 En_mayus  =SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(MAYUSC($B3);"Á";"A");"É";"E");"Í";"I");"Ó";"O");"Ú";"U");"Ü";"U")

Hacemos clic en F3 (imprescindible), accedemos a Fórmulas + Asignar nombre y creamos el "nombre" siguiente:

 Sin_puntos  =SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(
SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(
SUSTITUIR(SUSTITUIR(SUSTITUIR(MAYUSC($B3);"Á";"A");"É";"E");"Í";"I");"Ó";
"O");"Ú";"U");"Ü";"U");",";"");";";"");".";"");":";"");"!";"");"¡";"");"¿";"");"?";"");"""";"");" ";"")

Sustituimos la fórmula de C3 por la siguiente:
=SI(SUMAPRODUCTO(--(EXTRAE(Sin_puntos;FILA(INDIRECTO("1:"&COCIENTE(LARGO(Sin_puntos);2)));1)=EXTRAE(Sin_puntos;LARGO(Sin_puntos)-FILA(INDIRECTO("1:"&COCIENTE(LARGO(Sin_puntos);2)))+1;1)))=COCIENTE(LARGO(Sin_puntos);2);"Sí";"No")

Extendemos la fórmula hasta la fila 18 y eliminamos todas las columnas que hay a la derecha de la D.

Nota: En Excel 2003 es necesario cargar el complemento "Herramientas para análisis" para que la función COCIENTE esté disponible (Herramientas + Complementos + Herramientas para análisis). Si no se ha cargado, hay que sustituir COCIENTE por la función ENTERO. Con ENTERO, la fórmula de C3 sería:

=SI(SUMAPRODUCTO(--(EXTRAE(Sin_puntos;FILA(INDIRECTO("1:"&ENTERO(LARGO(Sin_puntos)/2)));1)=EXTRAE(Sin_puntos;LARGO(Sin_puntos)-FILA(INDIRECTO("1:"&ENTERO(LARGO(Sin_puntos)/2)))+1;1)))=ENTERO(LARGO(Sin_puntos)/2);"Sí";"No")

Descargar archivo (S98-Palíndromo.xls)

Descargar archivo (S98-Palíndromo.xlsx)

No hay comentarios:

Publicar un comentario