viernes, 24 de febrero de 2012

Palíndromos (1 de 3)

Siempre que puedo prescindo de las macros para resolver problemas en Excel. He empezado a hacer un ejercicio —sin usar macros— para comprobar si una frase es un palíndromo y me he encontrado con que el problema es más difícil de lo que había imaginado.

Una frase es un palíndromo si se puede leer igual de derecha a izquierda que de izquierda a derecha. Por ejemplo: Diré: "si Mari vive, ¿revivirá mi ser?". ¡Id!

El problema que se presenta es múltiple. Excel considera diferentes las mayúsculas y las minúsculas (D≠d), las letras sin acentuar y las acentuadas (é≠e) y, además, hay que prescindir de los signos de puntuación (puntos, comas, signos de admiración, guiones, etc).

Pongamos una frase en B3 y comencemos a resolver el ejercicio.

Paso 1: Extraer todos los caracteres, de uno en uno, en la columna E y ponerlos en mayúscula.

En E3:
=MAYUSC(EXTRAE($B$3;FILA(A1);1))

Extendemos la fórmula hasta la fila 100.

Paso 2: Crear un "nombre" para poder prescindir de esta columna.

Accedemos a Fórmulas + Asignar nombre y creamos el siguiente:

 Deletreado  =MAYUSC(EXTRAE(Hoja1!$B$3;FILA(DESREF(Hoja1!$A$1;0;0;LARGO(Hoja1!$B$3)));1))

Borramos los datos de la columna E, seleccionamos E3:E100 y escribimos:
=Deletreado   [Terminamos con Ctrl + Mayús + Intro]

El resultado es el mismo que el obtenido con la fórmula anterior. Así pues, ya sabemos que el "nombre" Deletreado nos genera la lista de caracteres de la frase en mayúsculas. Borramos los datos de la columna E.

Paso 3: Crear una matriz con los caracteres que se deben eliminar. Esta matriz se guardará en otro "nombre" cuyo valor será:

 No_valen  ={".";",";":";":";"?";"¿";"¡";"!";" ";""""}

Hemos incluido los signos ortográficos habituales y el espacio en blanco. Podríamos haber añadido algunos más: guión corto, guión largo, guión bajo, comillas angulares («»), signo de párrafo (§), apóstrofo, asterisco, llave, paréntesis...

Probemos este nuevo "nombre" en la columna E. Seleccionamos E3:E20 y escribimos:
=No_valen   [Terminamos con Ctrl + Mayús + Intro]

Una vez que hayamos comprobado que la matriz es correcta, volvemos a borrar los datos de la columna E.

Paso 4: Eliminar los caracteres incluidos en la matriz No_valen.

Volvemos a crear el tercer "nombre".

 Con_tilde  =SI(ESERROR(BUSCARV(Deletreado;No_valen;1;FALSO));Deletreado;"")

Comprobamos que este "nombre" genera la lista de caracteres de la frase prescindiendo de los caracteres de puntuación. Para ello, seleccionamos E3:E100 y escribimos:
=Con_tilde    [Terminamos con Ctrl + Mayús + Intro]

De nuevo, borramos la lista de la columna E.

Paso 5: Crear una matriz con los 6 caracteres que llevan tilde. Esta matriz se guardará en un "nombre" cuyo valor será:

 Tildes  ={"Á";"É";"Í";"Ó";"Ú";"Ü"}

Podemos volver a probarlo en la columna E, borrándolo posteriormente.

Paso 6: Crear una lista con los los caracteres de la frase excluidos los signos de puntuación y con las vocales acentuadas sustituidas por vocales sin acentuar. Esta lista estará contenida en un "nombre" con el siguiente valor:

 Sin_tilde  =SI(ESERROR(COINCIDIR(Con_tilde;Tildes;0));Con_tilde;ELEGIR(COINCIDIR(Con_tilde;Tildes;0);"A";"E";"I";"O";"U";"U"))

Seleccionamos F3:F100 y escribimos:
=Sin_tilde    [Terminamos con Ctrl + Mayús + Intro]

Paso 7: Asignar números correlativos a cada carácter. Si la celda está en blanco tendrán el mismo número que la celda precedente.

En G3:
=CONTARA($F$3:F3)-CONTAR.BLANCO($F$3:F3)

Extendemos la fórmula hasta la fila 100.

Paso 8: Crear una lista sin celdas en blanco.

En H3:
=INDICE(Sin_tilde;COINCIDIR(FILA(A1);$G$3:$G$100;0))

Extendemos la fórmula hasta la fila 100.

Paso 9: Obtener el código ASCII de cada carácter.

En I3:
=CODIGO(H3)

Extendemos la fórmula hasta la fila 100.

Paso 10: Contar cuantas celdas tienen números en la columna I. Es decir, cuantos caracteres han quedado después de eliminar signos de puntuación y espacios en blanco.

En J3:
=CONTAR(I:I)

Paso 11: Poner la frase al revés.

En K3:
=INDIRECTO(DIRECCION($J$3+5-FILA();COLUMNA($H$1)))

Extendemos la fórmula hasta la fila 100.

Paso 12: Comparar las columnas H y K. Si los valores coinciden, poner 1; si no coinciden, poner 0.

En L3:
=--(H3=K3)

Extendemos la fórmula hasta la fila 100.

Paso 13: Sumar los números de la columna L.

En M3:
=SUMA(DESREF(L3;0;0;J3))

Paso 14: Comparar el valor de M3 con el valor de J3. Si coinciden, la frase es una palíndromo; en caso contrario, no lo es.

En N3 y en C3:
=SI(J3=M3;"Sí";"No")



 
 

No hay comentarios:

Publicar un comentario