SGCG

…esto no es un subtítulo…

Ir a: contenido categorías calendario archivo suscripción

Volver arriba

Jugando con autómatas celulares (4)

2013-08-20

Hace varios artículos, planteamos un interesante proyecto: una pequeña biblioteca para construir autómatas celulares. Los autómatas celulares son unas estructuras matemáticas muy curiosas: retículos de celdas que van cambiando de un estado a otro y que pueden, a partir de reglas sencillas, exhibir complejísimos comportamientos emergentes. Como práctica, nuestra biblioteca estará hecha en Scheme R5RS y en Python 2. El enfoque es funcional porque el problema se presta mucho a ello. No nos preocuparemos tanto por hacer un código especialmente rápido como por hacerlo claro y conciso.

Hace un par de días creamos un sencillo autómata de ejemplo. El código era específico de este autómata, pero podemos ir creando funciones más generales con las que trabajar. Hoy vamos a crear funciones para sacar por pantalla nuestra lista de celdas de una forma compacta. Dividiremos el trabajo en en dos funciones que actúan de nivel más bajo a nivel más alto: convertir la lista de celdas en una cadena de caracteres e imprimir la lista de celdas.

Convertir una lista de celdas en una cadena de caracteres

Inspeccionar una lista de celdas como una lista a veces no es lo más deseable. Podemos tratar de hacer la conversión en una cadena de caracteres. Los caracteres no tienen por qué ser los mismos valores de los estados, sino que podemos hacer una correspondencia entre estados y caracteres más agradable a la vista, pero quizá poco interesante para el trabajo que no es de entrada y salida. Si los estados de las celdas son enteros consecutivos desde 0 hasta cierto valor, entonces podemos crear una cadena de caracteres tal que cada estado numérico es una posición en esta cadena e indica el carácter a mostrar. Tanto Scheme como Python permiten acceder a los caracteres individuales de una cadena de forma muy sencilla. Lo que podemos hacer es recorrer la lista con el estado de cada celda y crear una lista de caracteres; después, usamos esta última lista para construir una cadena. En Scheme, el código correspondiente de una función translate que traduce una lista de celdas cells a una cadena de caracteres de acuerdo con una tabla de traducción translation-table puede ser así:
(define (translate cells translation-table) (list->string (map (lambda (cell) (string-ref translation-table cell)) cells)))
Usamos map para recorrer las celdas y consultar en la tabla de una en una; después, usamos la función list->string para convertir la lista de caracteres en una cadena de caracteres. El código de Python correspondiente funciona de una forma similar:
def translate(cells, translation_table): return ''.join(map(lambda cell: translation_table[cell], cells))
El código es un poco más pintoresco por la manera que ofrece la biblioteca estándar de Python de juntar una lista de caracteres con el método join.

Si tenemos una lista de celdas cells con estados 0 y 1, podemos convertirla en una cadena de caracteres en la que aparecen espacios por cada 0 y asteriscos por cada 1 de la siguiente manera:
(translate cells " *")
(en Scheme) o:
translate(cells, " *")
(en Python).

Función para imprimir listas de celdas unidimensionales

La función de traducción no imprime nada. Podemos hacer una que traduzca la lista de celdas y la imprima. Esto es muy inmediato; lo único que hay que hacer es llamar a la función translate y luego a una de salida de caracteres. Nuestra función no imprimirá una nueva línea al terminar. En Scheme, es así:
(define (translate-and-display-1d cells translation-table) (display (translate cells translation-table)))
Los argumentos son los mismos que en la función de traducir, translate. El código de Python es casi igual de corto:
def translate_and_display_1d(cells, translation_table): import sys sys.stdout.write(translate(cells, translation_table))

Otros artículos de la serie


Categorías: Informática

Permalink: http://sgcg.es/articulos/2013/08/20/jugando-con-automatas-celulares-4/