miércoles, 31 de agosto de 2011

Palindromas y Excel

Ahora vayámonos de la oficina y hagamos algo divertido... bueno si no quieres, puedes regresar a la oficina.
Veremos cuantas palabras son palíndromas en español. Una palabra palindrómica es aquella que se lee igual de derecha a izquierda que de izquierda a derecha. Ejemplos

Oso -> osO
Ojo -> ojO

También se pueden armar frases, una vez saque unos muy buenos:
Ana Freud Huerfana
Claro el anterior no es perfecto por la H, pero en cuanto a sonido sí. ¿Te acuerdas cuando decían que el rock al revés le hablaba al diablo? Imaginate a un grupo de rock con una canción que hable de Ana Freud y al revés te diga que la chica era huérfana y por eso mató a su papá. Claro, simbólicamente.

O este otro:
Ay ojalá Bush suba la joya
Ala moro le derrota la torre del oro mala

Bueno, la idea es esa, como diría el decrépito chavo del ocho.
Ahora, veamos como podemos saber cuantas palabras solas forman un palíndroma, un diccionario de palíndromas, de hecho le puede servir a un palindromista para hacer palíndromas complejos, como los últimos que vimos. Por ejemplo, ala, oro son palíndromas, adentró de otro palíndroma.

Lo primero que tenemos que conseguir es un diccionario. Hay muchos, uno muy bueno está aquí:

http://snowball.tartarus.org/algorithms/spanish/voc.txt

En las páginas de Hackers hay muchos, pues estas malas personas se dedican a romper códigos para lo que necesitan múltiples palabras. Hacen combinaciones inteligentes a partir de esas palabras y entonces rompen passwords.

Lo siguiente que tienes que hacer es darle una formateada y quitarle los absurdos acentos, pasar todo a mayúsculas y quitar los resabios del origen de la vida que son las eñes y las us con diéresis y todos esos adornos del idioma español. Claro que no debes decir que hiciste eso a nadie de sociedad, te pueden decir que eres un salvaje que cometes atentados contra la lengua.

Luego lo debes pasar a cualquier procesador de texto y de ahi como texto llano a otro archivo. Lo importarás en Excel y convertirás todo a mayúscula con la función para ello. Se que sueno imperativo y que ese tono no te gusta, pero si no lo hago, no harás tu tarea. Adelante.


Ahora, si copias la función de mayúsculas en todo el listado y luego lo copias como valor y borras la antigua columna tienes lo que queremos.




Deberás ahora borrar los espacios vacíos y tienes 28377 palabras, lo puedes salvar ya como una hoja Excel. Ahora nos sorprende que haya personas que se comuniquen con trescientas palabras.

Bien, ahora si podemos trabajar.

Nuestra macro lo que hará será ir bajando desde la celda B2, hasta la 28377 volteando las palabras. Para ello deberá hacerse a la izquierda la celda activa, tomar el valor, procesarlo, regresar a la derecha, vaciar el valor procesado, bajar, y así tantas veces como larga la lista es.

Para no escribir tanto código hay un buen truco que consiste en hacer una pequeña macro para cada acción de esas, es decir una para hacerse a la izquierda, otra para la derecha, otra para subir, otra para bajar, las untamos y ya solo llenamos el código faltante.

Tenemos varios códigos:


Se hace a la izquierda en el mismo renglón:
    ActiveCell.Offset(0, -1).Range("A1").Select
Se hace a la derecha:
    ActiveCell.Offset(0, 1).Range("A1").Select
Se hace hacia abajo:



    ActiveCell.Offset(1, 0).Range("A1").Select


El código comentado queda del siguiente modo:

-------------------------------------------------------

Sub Macro5()
Dim Palindroma, NuevaLetra, Palabra As String   'abre variables que usaremos
Dim N, M, LargoDePalabra As Integer


'
' Macro5 Macro
'
Palindroma = ""  'inicia dichas variables
NuevaLetra = ""

For M = 1 To 28377    'inicia el ciclo para todas las palabras que se tienen

'
ActiveCell.Offset(0, -1).Range("A1").Select   'se hace a la izquierda
Palabra = ActiveCell.Value                            'toma la palabra
ActiveCell.Offset(0, 1).Range("A1").Select    'regresa a la derecha

LargoDePalabra = Len(Palabra)                    'mide la palabra, cuantos caracteres tiene

For N = 1 To LargoDePalabra                      ' Examina la palabra del primer al último caracter
NuevaLetra = Mid$(Palabra, LargoDePalabra - N + 1, 1)   'extrael la letra numero n

Palindroma = Palindroma + NuevaLetra                             ' dicha letra la anota al final del palindroma

Next                                                                                   ' repite el proceso

ActiveCell.Value = Palindroma                                           'anota el palindroma
Palindroma = ""                                                                  'inicia
NuevaLetra = ""

ActiveCell.Offset(1, 0).Range("A1").Select                        'baja uno

Next
End Sub
-----------------------------------------------


El resultado es este:

Posterioremente, para saber cuales son palindromas, incertamos en la columna c1 para copiar en todos los renlgones el condicional:
=if(b1=a1,"PALINDROMA","")

Que significa, si la palabra en la columna de palabras es igual a la palabra en la columna de palindromas, anota palindromas, si no no anotes nada. Del siquiente modo:



Si posterior a eso, juntamos mediante un filtro todos los que resultaron palíndromas, obtenermos los 64 palíndromas de ese diccionario:


Resultan estos:
     A ABBA ABEBA ACA AEREA AFA ALA ALLA ALLA AMA ANA ANNA ASA B BAB BOB C CIVIC D DAD E EFE EJE ESE ESE EYE F FMF G H I ICI II III J K L M MENEM N NARRAN O O OJO ORO OTTO OXXO OYO P POP Q R RADAR RAPAR RECONOCER S SALAS SERES SOLOS SOMOS SOROS SUS T U V W X XIX XX Y

Realmente yo pensé que los resultados serían más sorprendentes, palabras nunca antes vistas, pero no, son las mismas de siempre, hasta por ahi aparece Oxxo. Las únicas que valdría la pena destacar son rapar, reconocer, y ya. Quizá examinando un diccionario de 200 mil palabras resulte algo, ya habrá ocasión de repetir esto. Como siguiente reto, para otra ocasión, haremos una relación de palabras que en al revés de español, son una palabra existente en inglés.

Nada más amiguitos, recuerden que lso palindromas evocan al diablo, así que este ejercicio no lo hagan más que en la presencia de un adulto.



No hay comentarios:

Publicar un comentario