domingo, 17 de julio de 2011

Video juegos en Python: Sanson y los Filisteos

Sanson y los Filisteos
Por:
Garcia, Jocabed
Moreno, Mariana
(Sección B)

Dice la historia que Sansón era un hombre con mucha fuerza,  en una oportunidad iba de camino a visitar a su amada y le salió al encuentro un león el cual mato tomándolo por la boca y abriéndola, se enfrentaba a miles de filisteos y nadie podía con el, en otra oportunidad estaba en el desierto  y los filisteos le tendieron una emboscada, Sansón para defenderse tomo la quijada de un asno muerto que estaba allí y con ella venció a sus enemigos aquel día. Su gran fuerza permanecía mientras no cortara su cabello.
 
Inspirados en esa historia  surge  el juego “Sansón y los filisteos” donde Sansón no puede dejarse tocar por las tijeras ni los filisteos porque sino  va perdiendo vidas, aparecen leones los cuales debe tomar para tener fuerza, la quijada del asno esta representada por los disparos, al impactar con las tijeras o los filisteos estas se desaparecen, pero cuidado, a medida que transcurre el juego van apareciendo mas y mas filisteos.
 Página oficial del juego:  http://sanson-filisteos.blogspot.com/ 


sábado, 16 de julio de 2011

Video juegos en Python: Un Paréntesis (Parte III)

Hola a todos:

Mis felicitaciones a todos los equipos - sus juegos están muy buenos.  Una vez más, no dejen que esto muera aquí- esto es solo el comienzo.  Traten de continuar depurando sus juegos y comentando colaborativamente como vienen haciendo ahora.  Yo por mi parte siento que el aprendizaje durante esta última semana ha sido enorme y deberían de tomar en cuenta esto a la hora de evaluar.   Por cierto, les pongo a continuación las estadísticas de mi blog, donde aparecen el número de visitas a cada post, o juego:


Esto sería una especie de ranking de popularidad o nivel de expectativa que ha generado cada juego.  Claro, no es del todo exacto porque hay que recordar que algunos de estos juegos tienen su blog aparte, el cual a su vez también ha recibido visitas.  Además, por ejemplo el juego de Astuto Ben aún no figura en este ranking porque recién acabo de colgar el post.  Sin embargo, me parece bastante indicativo que Tayupolandia- perdón, Algorítmia - haya generado tanta expectativa, a pesar de no estar terminado.  Creo el pueblo clama por una explicación completa del proyecto de la trama del juego, y con esto se hace patente que la trama es un elemento muy importante del juego.  Muchachos de Algorítmia, nos deben una explicación ....

Otro punto interesante es la baja cantidad de visitas de MundoLibo.  Claro, este juego tiene su propio blog, pero a mi me parece que la propuesta de estos muchachos ha sido subestimada.  La trama como tentativa para inducir a niños al uso del Libre Office es una propuesta muy original (esa es mi opinión).  Los chamos del Helicóptero han hecho un juego sencillo pero bastante adictivo y completo en sí.  Más importante aún, han logrado corregir los errores iniciales y obtener una versión definitiva de su juego.  Paseando por Venezuela es otra propuesta que ha generado mucha expectativa, pero no he podido subir los archivos que me enviaron porque como dije en otro post, mi conexión está pésima.  Insisto en que desaprovechamos el juego del ahorcado como ocasión para aprender de Tkinter.  En realidad, insisto en que no hemos tenido tiempo para revisar los méritos de cada propuesta, razón por la cual, repito, deberíamos de continuar activos en este foro.  Que no se sientan mal aquellos cuyas propuestas no mencioné aquí- pues como ya dije todas son excelentes.

Con respecto a las evaluaciones, algunos me han comenzado a enviar sus formatos de evaluación (recuerden que en formato ods).  Con la sección B acordamos en que Barbara Leota recibiría todos los formatos de evaluación y los juntaría para entregarme una sola nota (el 60% de la nota de la materia) para cada estudiante.  Esto afín de agilizar el proceso de entrega de notas a la coordinación.  Con la sección A sugiero que nombren a una persona para acopiar todos los formatos de evaluación.  Si pueden al final de la jornada imprimir estos formatos con el 60% definitivo de cada alumno y hacerlo firmar sería mejor aún.  En todo caso yo debo imprimir las actas de la materia y hacerlas firmar por ustedes antes del miercoles.

Video Juegos en Python: Astuto Ben

Astuto Ben
Por:

Blanco Laudis
Carrasquel Rosmauris
Guayapero Reynaldo
Leota Bárbara
Mendoza Diana
Pulido Naicelis
(Sección B)
Finalmente, lo que todos esperaban: Astuto Ben (No contaban con mi astucia!).  Pido disculpas a todos por crear este post a última hora - mi conexión a Internet está pésima.  Voy a dejarles solo la imagen de la pantalla del menú principal, de abreboca:
 
 
Su blog es  http://astuto-ben-python.blogspot.com/ y los archivos de descarga están en sourceforge: https://sourceforge.net/projects/videojuegoastut/files/.  Ahora la avalancha de preguntas y comentarios....

viernes, 15 de julio de 2011

Video juegos en Python: Algorítmia

Algorítmia
Por:
Bonillo, Axel
Santaella, Vincent
Tayupo, José
Tovar, Gustavo
Urbina, Katherine
(Sección B)

Ya "TayupoLandia" tiene un nombre- se llama Algorítmia.  Creo que es bastante interesante y merece la pena que le echen un vistazo:

Tayupo me estuvo contando algo sobre la trama del juego y me decía que esta aún incompleto.  Tendrá que ser él y su grupo quienes comenten sobre ello en este post.

El enlace para su descarga es este de aquí.

La página oficial del juego es  http://algoritmia-python.blogspot.com/.

jueves, 14 de julio de 2011

Video Juegos en Python: Un paréntesis (Parte II)

Otro paréntesis, si me lo permiten (y sino también):

El arte y ciencia de producir videojuegos es muy novedoso y creo que necesitamos ir sistematizando los conceptos y técnicas.  Sistematizar es algo que les viene fácil a ustedes como estudiantes de sistemas.  Comenzaré por sugerirles una lectura es castellano sobre las bases conceptuales de los videojuegos (el enlace aquí, por cierto es una traducción por Ciro Duran).  No lo he leido completo, pero ojeandolo encontré esto que dice el autor con respecto a la "ciencia y arte de diseñar videojuegos":

En unos pocos años hemos alcanzado finalmente lo que yo veo como una masa crítica de escritura de conceptos, análisis formales y entendimiento práctico y teórico para ser capaces de llenar el curriculum de una universidad... o por lo menos, en este caso, un curso de diez semanas.

Ok, eso no es enteramente justo. Existe actualmente una gran cantidad de material relacionado con el diseño de juegos y muchos libros (con muchos más siendo publicados a un ritmo alarmante). Pero la gran mayoría o bien es inútil, o es una lectura tan densa que nadie en el campo se molesta en leerlo. Las lecturas que tendremos en este curso son aquellas que, cualquiera que sea la razón, se han impregnado en la industria; muchos diseñadores profesionales ya están familiarizados con ellas.
 Voy a poner mi imaginación a volar un poco y me disculpan estos ensueños: ¿Se imagínan ustedes una carrera universitaria llamada "Ingeniería de Video Juegos"? ¿Como sería el campo laboral? ¿El Pensum de la carrera? Supongo yo que deberiamos estudiar cosas como estas:

  • Bases conceptuales de los video juegos
  • Diseño Gráfico
  • Animación
  • Sonido
  • Juegos de Aventura, RPG y Ficción Interactiva
  • Juegos de Estrategia
  • Juegos de Simulación: SimCity, Los Sims
  • Juegos Educativos.
  • Aspectos psicológicos: ¿qué tipo de videojuegos activan o desarrollan ciertas habilidades psico-motoras? ¿Qué hace un video juego adictivo? ¿Qué hace un videojuego divertido? ¿Como se hace un video juego educativo, según el tema a enseñar y la edad?
  • Publicidad y videojuegos: Mercadeo viral a través de videojuegos.
  • Comercialización de videojuegos y la industria de los videojuegos.
  • Videojuegos para dispositivos móviles: ¿como explotar la interconectividad?

¿Qué opinan ustedes? ¿Estudiarían una carrera así? ¿Les parece relevante o algo que pueda tener un campo laboral interesante?  Bueno, soñar no cuesta nada- volvamos a un plano más inmediato...

En este momento, una sistematización interesante por realizar sería la del uso de la librería PyGame.  Les pido a todos los que usaron esta librería que echen el cuento sobre cuales referencias o tutoriales les fueron útiles para aprender sobre PyGame.  Una vez que se dispusieron a usarlo, ¿se dieron cuenta si existe algún workflow (flujo de trabajo) para usar Pygame? Me refiero a lo siguiente: me imagino que primero tienen que declarar y activar una ventana (¿qué es una ventana y como se hace eso?), luego dibujan cosas sobre la ventana mediante blits (¿que es un blit?) y hacen un update (¿que es un update?)  Si quieren ponerse sofisticados con la animación y lograr algo de calidad, utilizarían un sprite, pero, ¿qué es un sprite?  ¿Se dan cuenta de hacia adonde quiero llegar? Pygame ofrece un conjunto de herramientas estándar para crear video juegos, pero para poder usarlas hay que manejar algo de terminología, y saber de antemano para qué tipo de tareas se utilizan las distintas herramientas.  Quisiera que de todo esto hicieramos una especie de manual de PyGame para dummies.

Al grupo de "El ahorcado", que utilizó el Tkinter, le hago la misma invitación.  ¿Existe algún texto sencillo que nos pueda instruir sobre su uso y el manejo de la terminología básica?  Como se acordarán, el documento que usamos en clase no era particularmente sencillo.

Traten de participar bastante en este post, pues la temática es universal para todos los video juegos.  De lo contrario, creo que tendré que hacer yo mismo un videojuego para lanzar estudiantes por la ventana desde el tercer piso de la UNEFA y así liberar mi frustración de no ver a los estudiantes participar.  Ahora, hablando en serio, en verdad quisiera que no dejáramos este tema hasta este semestre.  Sería excelente si terminaran de desarrollar sus videojuegos.  Y sería mejor aún si algunos de ustedes continuasen explotando esto para su provecho profesional.  Creo sinceramente que hay material para que lo puedan lograr.

Video juegos en Python: Las Aventuras de Halama

Las Aventuras de Halama

Por:
BRISO ZAMORA, MARILYNE MERCEDES
ESPAÑA GUZMAN, ARILEIDYS ANANDYS
EZEIZA ABREU, HAMARA ANTONIETA
GONZALEZ FLORES, LIRICKZABETH ALEXANDRA
LOPEZ GUTIERREZ, AURIMAR
MORENO GONZALEZ, ALEXIS MOISES

Halama es un personaje mítico, una especie de superego de HAmara, MArilyne y Lirickzabeth Alexandra (supongo yo, pero corrijanme si estoy equivocado).  Es el protagonista de una aventura en la selva, en la que debe encontrar numeros y letras.


El blog del juego es http://www.lasaventurasdehalama.blogspot.com/.  Ingresen y ayudemos a Hamala a encontrar su forma definitiva.

miércoles, 13 de julio de 2011

Video juegos en Python: El Helicoptero

El Helicoptero
Por:
Boada, Jesus
Bolivar, José
Guevara, Marianny
Quijada, Angel
(Sección A)

Ok, ya por fin sabemos como se hacen tantos huecos en las carreteras de Venezuela: !es por tantos meteoritos que caen!  En lo que pudiera ser la carretera de El Tigrito a San Tomé, estas al mando de un helicoptero y tu misión es esquivar, no los huecos, sino los meteoritos.  Esto me da una idea: ¿Y si hacemos un juego de esquivar huecos en un volkswagen y cada vez que caes en uno el computador te dice "devuelvete que te pelaste otros"? Ya tengo el nombre, podemos llamarlo "La Fiesta del Asfalto".


El juego lo pueden descargar en este enlace.  Hagan sus preguntas, comentarios y observaciones a este juego bajo los comentarios a este post.

Video juegos en Python: El Coleccionista

El Coleccionista
Por:
Figueroa, Dakar
Quijada, Luis
Requena, Rozelis
(sección A)

Otro juego para nuestra colección. Les dejo el enlace para que descarguen el juego, hagan sus preguntas y comenten sobre el.

lunes, 11 de julio de 2011

Video juegos en Python: TortuBros

TortuBros

Realizado por:
Gabriela Prassad
Keileth Santoyo
(Sección A)

Es un avión, es una tortuga, es MarioBros... ¡No! ¡Es TortuBros!


Bombas y frutas caen del cielo: las frutas son buenas, pero las bombas acabarán con la tortuga.  Si quieren averiguar más, descarguen la carpeta comprimida (Nota: Muchachas, les he eliminado los archivos de instalación de Python para Guindous (guacala) y pygame.  Esto afín de hacer más ligera la descarga y no comerme tanto espacio en mi dropbox.  Les pido disculpas de antemano).

Video juegos en Python: El Ahorcado

El Ahorcado

The Cast:
Sygrys Acosta - diseño visual y enlace de código
Carlos Benitez - "Echa" código
Malak El Jourdi - "Echa" código
Mariam Pereira - diseño visual y enlace de código
José Senra - "Echa" código
 (sección A)


Esta es una propuesta nostálgica, pero con un toque "pythonista".  Como punto resaltante, fué elaborado usando la librería Tkinter, la cual deberiamos también aprender.  Pero no les digo más porque los detalles, enlaces de descarga se encuentran en el blog http://elahorcado3.blogspot.com/ .   

Participen haciendo sus comentarios, preguntas, etc. a ese blog.

Video Juegos en Python: LoriTortu

LoriTortu

Por:
Jean Carlos Narvaez
Luis Rodriguez
Francelis Solano
(sección A)


Breve sinopsis: Este vídeo juego consiste en una carrera de tortugas.  Para su descarga y mayor detalles, visiten el blog de Luis Eduardo: http://luiserodriguez1987.blogspot.com/


Igual que para el juego MundoLibO, los comentarios, preguntas y observaciones a este juego se haran en el blog de este juego, no aquí.

domingo, 10 de julio de 2011

Video juegos en Python: Luvia de Palabras

Lluvia de palabras

Por:
Ysemery Carvajal
Luiomarcel Lopez
Candy Ramirez
Lorena Tortora
(Sección A)

Sinopsis del Juego: El jugador intenta escribir cierta cantidad de palabras en un tiempo limitado.  Se presenta la palabra en la pantalla base y las letras con las cuales se ha de construir la palabra van cayendo como lluvia desde la parte superior.


Agregado el 16/7/2011: Este juego tiene su blog. Puedes seguirlo en http://lluviapython.blogspot.com

Para descargar la carpeta comprimida con todos los archivos de imágenes y el script, haga clic aqui.  Entiendo que el script ejecutable es "ZZZ-cogido.py".  Como de costumbre, todos los comentarios, preguntas y observaciones al juego de este equipo se harán como comentarios a este post.

Video Juegos en Python: Un paréntesis (Parte I)

Hola:

Quiero hacer un alto en la publicación de los juegos para comentarles que estoy bastante complacido con algunas propuestas.  Entiendo que algunos proyectos no están completos y espero que tengan la disposición de, entre todos nosotros, ayudar a esos equipos a completar su propuesta.  Quisiera que esto fuese más dinámico y que intervengan mucho en todos los posts de las respectivas propuestas para contestar preguntas a su equipo y para preguntarle a otros equipos como han realizado ciertas cosas.  De esa forma, creo, lograremos completar las propuestas y aprender bastante sobre la creación de video juegos.

Quiero que se den una palmadita en el hombro a ustedes mismos a la vez de que entiendan que estamos haciendo algo sin precedentes en la UNEFA- y eso es formarnos como una generación de expertos en Python, que es un lenguaje de programación que les permitirá acrecentar enormemente su productividad como creadores de aplicaciones.  En particular, la creación de video juegos es todo un mundo en sí y hay mucha necesidad de gente experta en esto para desarrollar juegos educativos a nivel de primaría, secundaria y hasta la universidad.

Esto podría derivar en muchas cosas.  Por ejemplo, podríamos organizar un foro próximamente sobre la programación de video juegos en Python donde podamos hacer alarde y exhibir el trabajo que comenzamos en esta asignatura.  Para dicho foro, si tuviesemos disponibilidad de computadoras, se podrían hacer prácticas donde ponemos a los participantes a crear un video juego sencillo en pygame, paso a paso.

Les recomiendo especialmente que revisen el blog de MundoLibO y espero que Richard y Habib cuelguen el pdf de la reseña de su juego para que lo puedan leer.   

Video Juegos en Python: MundoLibO

MundoLibO

Richard Flores y Luis Habib, de la sección B, nos traen este excelente juego.  Aún no está completo pero promete, promete...

El enlace al sitio oficial del juego es http://www.mundolibo.blogspot.com/
Por esta vez, no hagan sus comentarios, preguntas, observaciones al juego debajo de este post, sino en el blog de mundolibo.

sábado, 9 de julio de 2011

Video Juegos en Python: La Culebra

La Culebra

Autor: José Miguel Medina, sección B

Descripción del Juego:
Versión del juego LA CULEBRITA, muy parecido al realizado por el profesor. Este que le presento es muy parecido a versiones ya existentes, pero con una nueva versión y modificación. Consiste en comer el Objetivo y acumular puntos y a la vez aumentar de tamaño, no debe chocar de los bordes porque muere.
 INSTRUCCIONES DEL JUEGO:

 (El juego esta codificado en Python 2.4.1 para Win32 y Pygame 1.9 para Win32)
Debe contener los siguientes archivos:
Modulo Inicio (Realiza el enlace y llamado al modulo de juego o Nivel Principal “Doble clic a este nivel” para hacer el llamado)
Modulo Nivel (Nivel de Juego, contiene indicaciones para ingresar al juego o en su defecto abandonarlo)
Archivo Fuego (Este archivo es para las colisiones con los bordes de la ventana de juego en caso de perder)

REQUERIMIENTOS DE SOFTWARE:
Python 2.4.1 Win32
Py2.4.exe
WxPython 2.6.0.0(ansi) For Python 2.4.1
Pyreadline-1.6.2
Descargar en:
www.python.org/getit/

Pygame 1.9 Win32
Pygame-1.9.1release.win32-py2.4.exe
Descargar en:
www.pygame.org


Como de costumbre, las observaciones, preguntas y comentarios sobre este video juego se colocarán como comentarios a este post (ver infra).

Video Juegos en Python: Paseando por Venezuela

Paseando por Venezuela

"Paseando por Venezuela es el proyecto de video-juego de los siguientes estudiantes de la sección B: 

ARCIA GARCIA, JAVIER JOSE
CORDERO PERDOMO, YENNY ELIZABETH
FRONTADO MEJIAS, DENNYS DE JESUS
HERNANDEZ VALERA, MARIA JOSE
ROMERO FEBRES, YOHANDRI CAROLINA


Citando textualmente de la propuesta de este equipo:
Es un juego dirigido a estudiantes que cursan las etapa de entre preescolar y primaria, el objetivo principal es enseñar a los niños de estas edades a relacionar e identificar los sonidos de las letras, ya que en este juego ofrece narraciones escritas y de audio, con frases que se resalta mientras se realiza la narración, para que el niño tenga varias técnicas de aprendizaje para desarrollar la lectura.

Paseando por Venezuela tiene una tematica interesante ya que se plantea en un escenario nacionalista, es decir, el usuario tiene la posibilidad de ir a varios sitios de Venezuela y conocer lugares o parques nacionales.

Para que sea didáctico además se le va proponer que busque letras durante su viaje por el país.

El niño al entrar se le presentara una narración explicándole en palabras sencillas el juego, luego escoge el personaje con el cual desea jugar, se le nombrara algunos imágenes de lugares y decidirá el usuario hacia donde comienza su aventura.

Actualizado 17/7/2011: La página oficial del juego es http://juegotupi.blogspot.com/
El programa requiere PyGame para correr.  A continuación los enlaces a los archivos:

 En los comentarios abajo de este post estaré haciendo mis observaciones.  Invito a todos a que hagan sus observaciones aquí también.

Video Juegos en Python

Hola a todos:

Para el curso de Python que estoy facilitando como materia electiva en la carrera de Ingeniería de Sistemas de la UNEFA, los estudiantes han de entregar como proyecto final un video-juego desarrollado en Python.

Algunos ya han hospedado sus archivos en algún portal de hospedaje (megaupload, sourceforge, etc.).  Sin embargo, dado lo considerable del tamaño de los archivos (que incluye imágenes y audio por el orden de las decenas de megas), necesito que hagamos lo siguiente:

  • Envienme una reseña del video juego sobre cuál es su temática, instrucciones de uso, algunas imágenes/capturas de pantalla.  Elaboren esto como un archivo en word (no usar la versión de office nueva) o pdf, de modo que yo pueda cortarlo y pegarlo directamente a este blog.
  • Necesito también una descripción de los modulos de código fuente (los .py).  ¿Cual es el módulo principal (el que el usuario debe ejecutar para "correr" el juego y que a su vez invoca a los demas modulos)? ¿Cuales son las dependencias (librerias necesarias para que funcione el programa)? ¿Cuales son los requisitos de sistema (versión de python, sistema operativo, etc.)?  Esta información también se incluirá en el blog.
  • Por último, necesito un enlace a la dirección donde ustedes están hospedando todos los archivos del programa.  Es importante incluir ahí los archivos .py, tal como se ejecutarían en python.  Yo no he usado sourceforge, pero entiendo que es especialmente apto para esto. Particularmente, les recomiendo dropbox, porque pueden dar enlaces públicos a cada archivo particular.  Si tienen problemas con esto, envíenme los archivos y yo los cuelgo en mi dropbox. 

Algunos ya me han enviado sus archivos.  Yo los estaré revisando y colgando a este blog, con una entrada para cada equipo.  Si necesito algo, les notificaré por correo este fin de semana. 

Las preguntas/observaciones departe de los demás cursantes y las mias se harán comentando en la entrada del blog respectiva.

lunes, 13 de junio de 2011

La Estética de Python

Hasta ahora, las pocas entradas de este blog han versado sobre aspectos técnicos de la programación en Python.  No es la idea de este blog orientarlo  exclusivamente a estos aspectos, pues sería muy árido.   Se podría decir que por esto he intercalado, casi de contrabando, algunas pinturas surrealistas aquí y allá, aunque al hacerlo, tampoco me he salido del aspecto técnico, pues el arte es en gran parte un asunto de técnica también y la programación es un arte.  Hay matemáticos que afirman que la buena matemática lo es también en un sentido estético- lo verdadero y trascendental tiene que ser hermoso.  Esto vale también para la programación, que también es una actividad matemática, si se quiere.   El buen código tiene que ser estéticamente agradable - esta es la premisa fundamental de Python.

  Mond Guter Dinge
Max Ernst

El código Python se caracteriza por la indentación- el uso de espacio en blanco al comienzo de una línea para indicar el nivel, bloque o estructura de control al cual corresponde esa línea.  Yo he usado la indentación en el código prácticamente desde que di mis primeros pasos con la programación estructurada en PASCAL.  Como ustedes sabrán, este lenguaje no obliga el programador a indentar, pero afortunadamente para mi, el libro con el cual aprendí PASCAL usaba esta convención de estilo.  Pronto me di cuenta de que esto era algo bueno porque el código era mucho más legible que el código en BASIC, lenguaje este con el que aprendí a programar.

En lenguajes más antiguos como FORTRAN, el espacio en blanco era importante para demarcar ciertas partes de una línea de código.  Concretamente, las primeras 5 columnas de la línea indicaban el número de línea (opcional), la sexta columna contenía una "C" si la línea era un comentario, etc., aunque no me acuerdo si era exactamente así y me da flojera buscarlo en google para verificar...  En el proceso de evolución de los lenguajes de programación, esta práctica fué abandonada a favor del uso de ciertas palabras reservadas para indicar el comienzo y el fin de un bloque de código en un programa (el begin y end en PASCAL).   Con el tiempo, lenguajes como C abreviaron esto aún más mediante el uso de braces (los signos de corchetes: {}).  De modo que algunos programadores consideraban el uso de la indentación de Python como un retroceso en la evolución de los lenguajes cuando este lenguaje fue creado.

En efecto, la misma sintaxis de Python obliga al uso de indentación- es un requisito, no una convención de estilo opcional.  ¿Y porqué importaría algo tan "frivolo" en la programación? En lo particular, en mi experiencia docente en cursos donde se utiliza la programación (he facilitado materias como "simulación y modelos", donde usamos extensivamente el lenguaje R, el cual por cierto no usa indentación), me he dado cuenta que un error de programación muy común para principiantes es el no cerrar una llave/corchete que se ha abierto, o cerrarla en el lugar incorrecto.  En Python, este tipo de error es imposible y este tipo de cosas hace la experiencia de aprender a programar mucho menos frustrante.  Al fin del día, se trata de reducir al máximo las cantidad de horas/programador necesarias para desarrollar un programa, y esto también es una premisa fundamental de Python.

¿Piensan los desarrolladores de Python ceder un poco con la indentación de Python e incorporar el uso de llaves (braces)?  Para responder esta pregunta, abra una consola de Python y teclee lo siguiente:

from __future__ import braces


sábado, 11 de junio de 2011

Listas por comprensión

Yo pensaba que las facilidades para trabajar con vectorización, seleccionando en una sola instrucción todos aquellos elementos de un vector o lista que satisfacen cierto criterio, era algo exclusivo a R que no existía en Python. Como novato de Python, estaba muy equivocado - Python no deja de sorprender ...

La trahison des images (ceci n'est pas une pipe) - 1928/1929
René Magritte

Resulta que eso en Python se llama "listas por comprensión" y la sintaxis de este tipo de expresiones es muy parecida a la notación de conjuntos matemática (definición de conjuntos por comprensión), de modo que es muy intuitivo.  Nos referimos pues a dicha notación identificando algunos de sus elementos:

  • Función de salida: son expresiones que involucran a la variable x y que vienen a ser los elementos que constituyen el nuevo conjunto (o lista) a definir.
  • Variable: es una variable dummy que figura en toda la expresión.
  • Conjunto de entrada: es el conjunto (la lista) a partir de la cual se toman los elementos x.
  • Predicado: es una condición lógica que deben verificar los elementos x para que, aplicándoles f(x), formen parte del nuevo conjunto 8la nueva lista)
En python, la función de salida se representa mediante una expresión, la expresión "x pertenece a A" se indica mediante un constructo Python (for x in A) y el predicado es un constructo Python con if: if p(x), donde p(x) es una expresión que genera un booleano.  Así por ejemplo, si a partir de una con todos los numeros naturales entre 1 y 5, quisieramos generar una nueva lista con cada número de esos elevado al cuadrado, la expresión matemática y la correspondiente expresión en python serían:

A=range(1,6)
[x**2 for x in A]

lo cual arrojaría la siguiente lista en la consola de comandos de Python:

[1, 4, 9, 16, 25]

Nótese que se ha omitido la clausula if (el predicado), aunque esta expresión sería totalmente equivalente a la anterior:

[x**2 for x in A if 1<=x<=5]

Otro ejemplo, supóngase que A es el conjunto de todos los números enteros entre -20 y 20.  ¿Cuales de entre esos números son tales que elevados al cuadrado, están entre 50 y 90?


A=range(-20,21)
[x for x in A if 50<=x**2<=100]

lo cual genera:
 [-8, -9, 8, 9]


Python no es el único lenguaje con listas por comprensión.  Otros lenguajes funcionales como Haskell también incluyen este tipo de constructos.

Gramaticas de sufijo, parte 3: implementación en python

Sin más preámbulos, coloco el código Python que, dado una cadena S que se requiere transformar a T mediante una gramática de sufijo (conjunto de NR reglas), hace una búsqueda exhaustiva de todas las posibles maneras de transformar S a T:


#Definir estructura de datos (clase) para el arbol de busqueda
class Arbol:
    def __init__(self, nodo):
        self.nodo = nodo
        self.subarbol=[]
    def __str__(self):
        return str(self.nodo)
    def agregar_hijo(self,regla,hijo):
        self.subarbol.append(tuple([regla,hijo]))
    def contiene_nodo(self,nodo):
        """contiene el arbol al argumento como nodo?"""
        if self.nodo==nodo:
            return True
        else:
            if self.subarbol!=[]:
                cn=False
                for i in self.subarbol:
                    cn=cn or i[1].contiene_nodo(nodo)
                return cn
            else:
                return False           
    def aplicar_reglas(self,arbol):
        #primero aplica todas las reglas al nodo raiz
        for i in range(0,len(reglas)):
            su0=reglas[i][0]
            su1=reglas[i][1]
            no=self.nodo
            if no.endswith(su0):
                nuevo = no[:no.rfind(su0)]+su1
                if nuevo==T or not(arbol.contiene_nodo(nuevo)):
                    self.agregar_hijo(i,Arbol(nuevo))
        #luego se ramifica recursivamente para cada subarbol
        #(si hay subarboles hijos)
        if self.subarbol!=[]:
            for i in self.subarbol:
                i[1].aplicar_reglas(arbol)
    def recorrer_arbol(self,ruta):
        """recorre todo el arbol retornando las rutas que terminan en T"""
        global rutas
        if self.nodo==T:
            rutas.append(ruta)
        else:
            for i in self.subarbol:
                i[1].recorrer_arbol(ruta+[(i[0],i[1].nodo)])

def imprimir_rutas():
    if rutas==[]:
        print "No es posible transformar",S,"en",T,"mediante esta gramatica."
    else:
        for i in range(0,len(rutas)):
            print "Transformacion",i+1,":"
            print S,"\t-->",
            for j in rutas[i]:
                print j[1],"\tRegla",j[0]+1,": (",
                print reglas[j[0]][0],"-->",reglas[j[0]][1],")"
                if not(j==rutas[i][-1]):
                    print "\t-->",
               
#PROGRAMA PRINCIPAL
#Lee S, T y las reglas del archivo
archivo=open("suffix.in","r")
s=archivo.readline().split(" ")
S=s[0]
T=s[1]
NR=int(s[2])
reglas=[]
for i in range(0,NR):
    s=archivo.readline().strip().split(" ")
    reglas+=[tuple(s)]
archivo.close()
#Genera el arbol de busqueda
ab=Arbol(S)
ab.aplicar_reglas(ab)
#recorre el arbol de busqueda para generar las rutas que
#culminan en T
rutas=[]
ab.recorrer_arbol([])
imprimir_rutas()


Este script requiere de un archivo en donde se coloca la cadena inicial S, la cadena final T y el número de reglas (NR) en la primera línea, separados por espacio.  Las siguientes NR líneas del archivo contienen las reglas gramaticales.  Para probar el script, tome las siguientes líneas y cree con ellas un archivo llamado "suffix.in" en el mismo directorio que "suffix.py" (el script de arriba):

AA CB 6
C B
AB BA
AA CC
CC BB
C A
A B

Con esta data de entrada en el archivo "suffix.in", el programa generaría la siguiente salida:

Transformacion 1 :
AA     --> CC     Regla 3 : ( AA --> CC )
       --> CB     Regla 1 : ( C --> B )
Transformacion 2 :
AA     --> CC     Regla 3 : ( AA --> CC )
       --> CA     Regla 5 : ( C --> A )
       --> CB     Regla 6 : ( A --> B )

miércoles, 8 de junio de 2011

Gramaticas de sufijo, parte 2: la necesidad de arboles n-arios

Una forma de construir un algoritmo para buscar todas las formas posibles para transformar la cadena S a la cadena T sería esta: partiendo de la cadena inicial S verificamos cuales son las reglas aplicables.  Al aplicar dichas reglas a S obtenemos un conjunto de cadenas que "derivan" de ella.  A su vez, verificamos cuales son las reglas aplicables a cada una de las cadenas derivadas, las aplicamos y obtenemos otras cadenas , ...

Este proceso generaría una especie de árbol de búsqueda, donde un nodo representa una cadena, los arcos que salen de ese nodo representan la aplicación de determinada regla gramatical y estos arcos son aferentes a otros nodos, los cuales derivan del nodo padre mediante la aplicación de reglas.  Este árbol no sería del todo diferente al árbol de búsqueda que generan los programas de ajedrez cuando evalúan todas las posibles jugadas y respuestas del oponente en cada turno.  Para el ejemplo del post anterior, el árbol de búsqueda sería como este:
        
              AA
             /     \
            /       \
          AB     CC
           |         |
          BA     BB
           |
          BB

Se necesita etiquetar cada arco del árbol con el número de regla que produjo la transformación.  Observe que si hay muchas reglas, cada nodo podría tener muchos "hijos"- de ahí que necesitamos una estructura de datos parecida a un árbol n-ario, pero con los arcos etiquetados según la regla aplicada en cada transformación.  También hay que observar que en el proceso de verificar cuales reglas aplican a una cadena, pudiésemos obtener una cadena que ya ha sido producida y ya se encuentra en alguna parte del árbol.  Si agregamos nodos duplicados al árbol, el proceso de generar el árbol no terminaría nunca por la circularidad.  Por otro lado, cuando generamos un nodo igual a la cadena T, no se siguen generando más nodos hijos.  De hecho, aquellos nodos iguales a la cadena T son los únicos que pueden figurar repetidamente en el árbol y siempre se van a encontrar al final de alguna rama.  Si ninguna de las ramas del árbol termina en T, sabremos que no ha sido posible transformar S a T mediante la gramática dada.

Observese también que  una cadena (nodo) podría tener más de dos cadenas derivadas de ella, por lo cual no nos serviría un árbol binario como el que se describe en el capitulo 20 de "Pensar como programador".  Entonces, ¿como crear un árbol n-ario (n-ary tree) en python? Una busqueda por google me arrojo una página donde encontré esta definición de clase:


class Arbol:
    def __init__(self, nodo):
        self.nodo = nodo
        self.subarbol=[]
    def __str__(self):
        return str(self.nodo)
    def agregar_hijo(self,hijo):
        self.subarbol.append(hijo)

Para usar esta clase, creamos varias instancias de arboles, digamos a,b y c:
a=Arbol("arbol A")
b=Arbol("arbol B")
c=Arbol("arbol C")


luego, si por ejemplo queremos agregar los arboles b y c como hijos de a, haríamos lo siguiente:

a.agregar_hijo(b)

a.agregar_hijo(c)

Si queremos acceder a los hijos de a, navegariamos por la lista a.subarbol.  A su vez podemos agregarle nietos a a  (hijos de b o c) .  Este fue el punto de partida para desarrollar el programa que resuelve el problema de las gramaticas de sufijo.

continuara...

Gramáticas de sufijo

En la final del Mundial de Programación de la ACM (edición 2009), apareció un encantador problemita sobre gramáticas de sufijo, que es el problema K (suffix grammars) del problemario

Remontándonos a nuestras clases de lenguaje y castellano, un sufijo es una terminación de una palabra y la gramática es el conjunto de reglas que rigen la correctitud de las producción de secuencias de palabras.  En el contexto de la matemática y los lenguajes formales, estos dos conceptos tienen un significado parecido. En el problema en cuestión, una palabra es una secuencia (o cadena) de símbolos, los sufijos son las terminaciones de las palabras y la gramática va a ser el conjunto de reglas que nos van a permitir operar sobre los sufijos de una palabra y sustituirlo por otro sufijo.

Ejemplo:
Supóngase que tenemos una palabra inicial S="AA" que queremos transformar, mediante reglas gramaticales en una palabra T="BB", teniendo para ello las siguientes cuatro reglas:

Regla 1: "A" --> "B"
Regla 2: "AB" --> "BA"
Regla 3: "AA" --> "CC"
Regla 4: "CC" --> "BB"

Una manera de hacerlo sería, partiendo siempre de "AA", utilizar la regla 1 ("A" --> "B") y transformar "AA" en "AB". Luego aplicar la regla 2 para transformar el sufijo "AB" (o sea, toda la palabra) en "BA". Y por último, aplicando la regla 1 nuevamente, "BA" se transforma en "BB".

Otra manera (más directa) sería aplicar las reglas 3 y 4 sucesivamente, lo cual da la transformación en 2 pasos : "AA" --> "CC" --> "BB".

Se quiere desarrollar un programa en python que, dada una cadena inicial S, una cadena final T y un conjunto de reglas (la gramática), encuentre todas las transformaciones de S a T, mediante la aplicación de las reglas gramaticales, por supuesto.

continuará...

martes, 7 de junio de 2011

Sobre el orígen del nombre Python, una descripción de la descripción del titulo de este blog y una digresión sobre las pinturas de Anatoli Fomenko

Se me olvidaba algo importante- ¿porqué este lenguaje se llama Python?  Ciertamente, la pitón ("python" en ingles) es una serpiente muy grande, pero el lenguaje no se llama así en alusión a las culebras, aunque también se hacen muchos juegos de palabras con eso.  Python proviene del nombre de un programa de comedia británico muy popular en la década de los 70 y 80, del cual el creador del lenguaje, Guido Van Rossum es fanático.  Si les gusta el humor negro británico, les recomiendo ampliamente que busquen algunos episodios del "Monty Python's Flying Circus". 


Las gráficas en esta entrada del blog son de un artista ruso, también matemático, llamado Anatoli Fomenko (artista matemático? o matemático artista?)  Sus pinturas son fuertemente inspiradas en la obra de Salvador Dali.  Sus pinturas evocan distopias y el lado oscuro del surrealismo.




Primera entrada -bibliografía básica sobre Python

Existen actualmente dos dialectos de Python: Python 2.x y Python 3.x. Hablar de las diferencias entre uno y otro dialecto ameritarían otra entrada en este blog pero digamos que Python 3.x es la versión que está siendo desarrollada y soportada mientras que Python 2.x ya no verá actualizaciones pero se continúa soportando por razones de compatibilidad hacia atrás. Esto lo aclaro porque si deseas descargar el interprete Python más el entorno de desarrollo para Windows o para Mac desde la página oficial (https://www.python.org/downloads/), debes escoger entre una u otra versión. Si utilizas Linux, ya tienes Python 2 instalada y si deseas trabajar con Python 3, debes descargar la respectiva paquetería. Seguidamente, les presento alguna bibliografía para iniciarse en el estudio de Python con mis respectivos comentarios.
  • Introducción a la programación con Python - Este es un texto utilizado en los cursos de programación de la Universitat Jaume I. Arranca desde cero - ¿que es una computadora? ¿qué es un algoritmo? ¿qué es un programa?, y abarca las estructuras de datos y las estructuras de control fundamentales. No aborda tópicos de programación orientada a objetos ni otros temas más avanzados, pero es muy bueno para iniciarse.
  • Doma de Serpientes para Niños - Aprendiendo a programar con Python - Otro texto introductorio muy bueno, orientado a los niños. Aborda algunos temas básicos relativos a la creación de gráficos (gráficos de tortuga y gráficos 2d). La versión del texto en este enlace es para Linux, pero también está disponible una versión para Windows y para Mac. Estos libros utilizan la versión Python 3.
  • Python para todos - Un texto un poquito más avanzado que los dos anteriores.
  • Aprenda a pensar como programador con Python - Este texto es el resultado de la insatisfacción de unos profesores con los libros de programación para cursos introductorios. Ellos proponen que el Python es el lenguaje ideal para los cursos básicos de programación, porque permite ver un “más alto nivel de éxito y un bajo nivel de frustración" que puede “avanzar rápido con mejores resultados”.
A pesar de que Python es un lenguaje particularmente clemente para los principiantes, es un lenguaje de altísimo nivel muy poderoso. Ciertamente, en cuanto a lenguaje de scripting, quizás no pueda competir con Perl en su terreno, pero, a diferencia de Perl, su sintaxis es sumamente legible, lo cual lo hace particularmente bien adaptado a desarrollar versiones beta de aplicaciones complejas en muy corto tiempo. Quizás por esto es que empresas como Google han utilizado Python y buscan siempre programadores expertos en este lenguaje.