Primeros pasos con la robot Karel

¿Quién es Karel?

karel es un paquete de R creado con el propósito de brindar un entorno que posibilite la enseñanza de principios de la programación en una forma dinámica e interactiva, para estudiantes sin experiencia previa que estén cursando el nivel secundario o los primeros años de su formación de grado. Karel es una robot que vive y camina por ciertos mundos, en los cuales puede realizar determinadas acciones si se lo pedimos, mientras aprendemos a programar en R.

La robot Karel acompaña en la enseñanza de conceptos fundamentales de la programación, por ejemplo, el de procesador (Karel), ambiente (su mundo), objetos (llamados cosos) y acciones (las actividades que puede realizar). Además, como se puede observar en los ejemplos de los tutoriales presentes en esta página, junto con Karel es posible instruir sobre el concepto de la descomposición algorítmica: en numerosas oportunidades la robot debe cumplir objetivos cuya resolución requiere descomponer el problema en partes más pequeñas, para cada una de las cuales los estudiantes deben programar una función en R. También facilita la ejemplificación del uso de estructuras de control de código secuenciales, condicionales (if () {} else {}) e iterativas (for () {}, while () {}).

El primer paso para programar con Karel es generar un mundo en el cual ella pueda andar, a través de la instrucción generar_mundo(), aclarando entre los paréntesis el nombre del mundo que queremos usar. El paquete trae incorporados unos cuantos pero los usuarios pueden optar por crear otros nuevos.

Todos los mundos de Karel son rectangulares, compuestos por calles que los recorren horizontalmente (filas) y avenidas verticales (columnas). Karel siempre se encuentra en la intersección entre una calle y una avenida (celda), mirando hacia una de las cuatro direcciones posibles: este, norte, oeste o sur. Los bordes negros representan paredes que Karel no puede atravesar, solo puede rodearlas. Además, en algunas celdas hay uno o varios cosos. Karel puede recorrer el mundo poniendo y juntando cosos por ahí; si los junta los guarda en su mochila y lleva un registro de cuántos tiene. Finalmente, Karel solo puede realizar estas actividades: avanzar(), girar_izquierda(), juntar_coso() y poner_coso(). Claro, agrupando ingeniosamente estas acciones básicas se pueden crear otras nuevas, por ejemplo, crear una función girar_derecha() que produzca tal efecto, haciendo girar a Karel tres veces a la izquierda. Por otro lado, Karel es capaz de evaluar ciertas características de su entorno a través de funciones que arrojan un valor lógico TRUE o FALSE, por ejemplo: frente_abierto(), hay_cosos() o mira_al_sur(), de manera que podemos condicionar las acciones que Karel realiza a la verificación de ciertos aspectos sobre su posición y su mundo. Una vez que se ejecuta el código con todas las acciones que Karel debe realizar, se debe correr la función ejecutar_acciones() y se puede ver el resultado en una animación creada con los paquetes ggplot y gganimate.

Con el objetivo de sortear algunas de las barreras idiomáticas que pueden hacer más desafiante poder dar los primeros pasos en el aprendizaje de programación, el paquete karel se diseñó de forma completamente bilingüe: todas las funciones tienen una versión en español y en inglés (por ejemplo,girar_izquierda() y turn_left()), así como también las páginas del manual de ayuda y algunas del sitio web están escritos en ambos idiomas.

La idea para la implementación de este paquete se basa en Karel the Robot, un lenguaje de programación creado con fines educativos por el Dr. R. E. Pattis de la Universidad de Stanford (California, EEUU), quien también escribió el libro Karel the Robot: A Gentle Introduction to the Art of Programming, en 1981. Su nombre es un homenaje a Karel Capek, el escritor sueco que inventó la palabra robot en su obra de ciencia ficción R.U.R. (Rossum’s Universal Robots). Su sintaxis se basaba en Pascal, pero a lo largo de las décadas esta estrategia de enseñanza fue implementada en distintos lenguajes como Java, C++, Ruby y Python. El paquete aquí presentado es la primera implementación de Karel para R. Algunos de los ejemplos incluidos en las viñetas son adaptaciones de aquellos publicados por Eric Roberts en su material Karel the robot learns Java (2005).

Instalación

Podés instalar karel desde CRAN:

install.packages("karel")

También podés instalar la versión en desarrollo desde GitHub:

# install.packages("devtools")
devtools::install_github("mpru/karel")

Ejemplos

¿Podés escribir un programa para que Karel coloque cosos en los vértices del rombo en en el cual está encerrada?

¿Algo así, tal vez?

> # Cargar el paquete y los superpoderes de Karel
> library(karel)
> cargar_super_karel()
> 
> # Crear funciones auxiliares
> recorrer_diagonal <- function() {
+   while (frente_abierto()) {
+       avanzar()
+       girar_izquierda()
+       avanzar()
+       girar_derecha()
+   }
+ }
> 
> # Implementar el problema
> generar_mundo("mundo019")
> for (i in 1:4) {
+   recorrer_diagonal()
+   poner_coso()
+   girar_derecha()
+ }
> ejecutar_acciones()

Ahora Karel está en un laberinto. ¿Podemos hacerla llegar hasta el final?

Sí, con este código:

> generar_mundo("mundo009")
> while (no_hay_cosos()) {
+   girar_derecha()
+   while (frente_cerrado()) {
+     girar_izquierda()
+   }
+   avanzar()
+ }
> ejecutar_acciones()

Podés ver más detalles sobre estos ejemplos y otros en la sección de tutoriales.