jueves, 14 de enero de 2010

Juegos de Palabras con Python

A ratos estoy con el libro Python for Software Design, versión impresa del conocido How to Think Like a Computer Scientist, una fantástica introducción al lenguaje Python del profesor Allen B. Downey.

Concretamente el capítulo 9, "Juegos de palabras", propone una serie de ejercicios en los que poner en práctica lo aprendido en los capítulos precedentes. En primer lugar nos enseña a abrir y leer un fichero de texto línea a línea

filein = open('words.txt')
for line in filein:
word = line.strip()
print word
Y a partir de aquí pide que desarrollemos funciones que recorran un diccionario (el fichero ES.txt) encontrando palabras de longitud igual a...
def de_longitud(n):
fin = open("D:\\ES.txt")
for line in fin:
word = line.strip()
if len(line)==n+1:
print word,
o mayores que...
def mayores_que(n):
fin = open("D:\\ES.txt")
for line in fin:
word = line.strip()
if len(line)>n+1:
print word,
un determinado valor, que no usen una determinada letra...
def has_no_e(palabra):
return (not 'e' in palabra)
o letras en general...
def avoids(letras,palabra):
for l in letras:
if l in palabra:
return False
return True
o que usen un conjunto de ellas...
def uses_all(letras,palabra):
for l in letras:
if not l in palabra:
return False
return True
que busquen palíndromos (palabras capicúas)...
def is_palyndrome(palabra):
return palabra==palabra[::-1]
o palabras cuyas letras estén en orden alfabético...
def is_abecedarian(palabra):
letra_anterior=''
for letra_nueva in palabra:
if letra_nueva<letra_anterior:
return False
letra_anterior=letra_nueva
return True

def is_abecedarian2(palabra):
letra_anterior='z'
for letra_nueva in palabra:
if letra_nueva>letra_anterior:
return False
letra_anterior=letra_nueva
return True

Una vez desarrolladas estas funciones he buscado un diccionario español en formato texto (en este enlace los hay para múltiples idiomas) y he creado la siguiente batería de pruebas para probar las funciones desarrolladas
def demo():
"Imprime todas las palabras de la lista"
fin = open("D:\\ES.txt")
for line in fin:
word = line.strip()
print word,

def demo2():
"Imprime palabras que no contienen la letra e"
fin = open("D:\\ES.txt")
for line in fin:
word = line.strip()
if has_no_e(word):
print word,

def demo3():
"Imprime palabras que evitan un conjunto de letras"
fin = open("D:\\ES.txt")
for line in fin:
word = line.strip()
if avoids('aeio',word): # "aents"
print word,

def demo4():
"Imprime palabras que usan un conjunto de letras"
fin = open("D:\\ES.txt")
for line in fin:
word = line.strip()
if uses_all('aeiouy',word):
print word,

def demo5():
"Imprime palabras cuyas letras están en orden alfabético"
from string import maketrans
fin = open("D:\\ES.txt")
intab = "áéíóúñ"
outtab = "aeioun"
trantab = maketrans(intab, outtab)
for line in fin:
word = line.strip()
word2=word.translate(trantab)
if is_abecedarian(word2):
print word,

def demo5_1():
"Imprime palabras cuyas letras están en orden alfabético inverso"
from string import maketrans
fin = open("D:\\ES.txt")
intab = "áéíóúñ"
outtab = "aeioun"
trantab = maketrans(intab, outtab)
for line in fin:
word = line.strip()
word2=word.translate(trantab)
if is_abecedarian2(word2):
print word,

def demo6():
"Imprime palabras capicúas"
fin = open("D:\\ES.txt")
for line in fin:
word = line.strip()
if is_palyndrome(word):
print word,
Y finalmente lo he ejecutado
print "\n\nPalabras de más de 21 caracteres"
mayores_que(21)
print "\n\nPalabras de 20 o más caracteres"
mayores_que(19)
print "\n\nPalabras capicúas"
demo6()
print "\n\nPalabras cuyas letras están en orden alfabético"
demo5()
print "\n\nPalabras cuyas letras están en orden alfabético inverso"
demo5_1()
print "\n\nPalabras que usan aeiouy"
demo4()
Siendo este el resultado:

Palabras de más de 21 caracteres
internacionalizaríamos internacionalizándolas internacionalizándoles internacionalizándolos

Palabras de 20 o más caracteres
anticonstitucionales antiproporcionalidad circunstanciadamente contrarreclamaciones descongestionaríamos extraterritorialidad inconstitucionalidad internacionalizabais internacionalizarais internacionalizarlas internacionalizarles internacionalizarlos internacionalizarnos internacionalizaréis internacionalizarían internacionalizarías internacionalizaseis malintencionadamente pentagonododecaedros precondicionamientos subdesarrolladamente bienintencionadamente desproporcionadamente electromagnéticamente intercontinentalmente internacionalizaremos internacionalizaríais internacionalizasteis internacionalizábamos internacionalizándola internacionalizándole internacionalizándolo internacionalizándome internacionalizándoos internacionalizándose internacionalizándote internacionalizáramos internacionalizásemos internacionalizaríamos internacionalizándolas internacionalizándoles internacionalizándolos

Palabras capicúas
a b c d e f g h i j k l m n o p q r s t u v w x y z ñ ó ll ada ala ama ana ara asa ata aya dad efe eje ele eme ene ese eñe non ojo oro oso sus erre alela aviva azuza dañad debed nadan radar rajar rapar rasar rayar rever rotor sacas sagas salas sanas sayas sañas sedes seres solos somos sosos narran rallar selles adamada adatada recocer reconocer sometemos

Palabras cuyas letras están en orden alfabético
a b c d e f g h i j k l m n o p q r s t u v w x y z ñ ó ad ah al as ay be ce ch cu de di dé el en es ex fi ir ll lo mu no nu os su tu tú él ñu aes ahí ajo amo ano año bel bes bis bit ces clo coz del den des dio dos doy fin fió fío gis hoy hoz huy los luz mor muy nos abel afmo afín agio ajos amor amos anos años befo cegó cejo cejó celo ceno cenó ceño ciño ciñó cruz deis dejo dejó dijo dilo dios délo ello fijo fijó film filo fino finó flor gimo hijo hilo hiló loor motu ágil achín adiós afijo afino afinó bello celos ceños chino dejos demos dilos dimos dinos délos dénos ellos fijos filos finos hijos hilos himno afijos bellos chillo chilló chinos defino dennos himnos

Palabras cuyas letras están en orden alfabético inverso
a b c d e f g h i j k l m n o p q r s t u v w x y z ñ ó da fe ge ha he id ji ka la le ll me mi mí ni oh oí pe pi ro se si so sé sí te ti té un va ve vi xi ya ye yo fea iba ida kif lea lee lid lié lía líe mea meé mía míe nea oca oda ola ole olé olí oía oíd pie pon pía píe rea red roa roe rol ron roo roí ría ríe sea sed sol son tea tic toa ton tía una une uní usa use uso usé usó uña vea ved vid vía yod yol zoo leed liba liga mica mida miga oiga ojea ojee ojeé oled olla olía onda oída peca pica pida poca poda pone rica rifa rife rifé rige roba roca roda roed roja roma roía roña seca seda sida siga soba soda sofá soga soja sola solí soma soné soñé teca toba toca toda toga tole toma tome tomé trié tría tríe unge unid unja unía urea urge urja urna usía veda vida viga volé yoga yola yuca yuta yute zeda zoca zona ojeda olida plica polca polea poned ponga ponla ponme ponía roiga rolla rolle rollé ronca ronda roída soled solía sonda tolla tonga troje unida volea volee voleé zumba zupia zurda zurra zurre zurro zurré zurró única úrica roñica solida sólida sónica tromba tronca tónica zurrón

Palabras que usan 'aeiouy'
atribuyendo atribuyeron neoyorquina ayuntamiento concluyerais constituyera contribuyera neoyorquinas obstruyerais reconstituya retribuyamos suprayectivo atribuyéndole atribuyéndome atribuyéndose atribuyéndote atribuyésemos ayuntamientos constituyeran constituyeras construyerais contribuyeran contribuyeras eyaculaciones reconstituyan reconstituyas suprayectivos yuxtaponiendo yuxtapusieron atribuyéndoles constituyerais contribuyerais reconstituyera retribuyéndola retribuyéramos multiproyectiva reconstituyamos reconstituyeran reconstituyeras reconstruyerais redistribuyamos retribuyéndolas yuxtaposiciones yuxtapusiésemos multiproyectivas reconstituyerais reconstituyéndola reconstituyéramos redistribuyéramos reconstituyéndolas

¡¡¡Que ustedes lo disfruten!!!





Fuente: Python for Software Design, versión impresa del conocido How to Think Like a Computer Scientist. Como siempre, gracias por venir. Si te gustó el post puedes apuntarte a través del correo electrónico o por medio del feed RSS (más información acerca del RSS). También puedes seguirme a través de mis elementos compartidos, y a partir de ahora desde Twitter o Friendfeed.

2 comentarios:

Jitanjáfora dijo...

Maravilloso, simplemente. A los que nos gusta jugar con el lenguaje, este mundo nos desvela inquietantes posibilidades...

J. dijo...

:.)