miércoles, 6 de junio de 2007

Software libre

Por software libre se entiende la libertad de los usuarios por ejecutar, copiar, distribuir, estudiar, cambiar y mejorar el software.

En el proyecto GNU se hace uso de "copyleft" cuyo objetivo es el de dar a todo usuario la libertad de redistribuir y cambiar software GNU. Para cubrir un programa con copyleft, primero se reservan los derechos, luego se añaden términos de distribución. A diferencia del "copyright" que quita la libertad a los usuarios sobre cualquier programa, se usa el copyleft como un derecho reservado para garantizar su libertad de uso. Dentro de estos softwares pueden localizarse los de tipo educativo, que son una poderosa herramienta pues además de mejorar la enseñanza nos permite ser creativos y contribuir a su propia transformación continua.

Aquí tenemos el ejemplo del simulador Robot Karel que introduce a los alumnos al estudio de la programación, material que por lo general es dificil de aprender. Con esta poderosa herramienta apoyamos a los estudiantes a desarrollar su creatividad, tanto para resolver problemas complejos, como para plantear situaciones dificiles en el mundo de Karel.

La liga principal de este software es la siguiente:



http://gvr.sourceforge.net/esp/links.php


El software es libre y podemos utilizarlo en el momento que deseemos, este software es soportado por los principales sistemas operativos actuales.

En esta otro dirección podemos encontrar también mucha información sobre el software y su aplicación en la olimpiada de informática, evento que es mundial:

http://www.mundodekarel.cjb.net/


En esta dirección podemos encontrar ejercicios aplicando el simulador:

http://www.cimat.mx:88/~amor/Omi/Entrenamiento/Karel/


Este es un ejemplo utilizando el simulador:


Nac093 El Estadio de Futbol Prob 3 del IX concurso nacional de la OMI

Historia
Como buen mexicano, Karel es un aficionado al fútbol. Al llegar a Morelia se ha enterado que el estadio de fútbol se encuentra en la cima del Cerro Quinceo.
Desgraciadamente, Karel no conoce el camino a dicho cerro, por lo que tu deberás escribir un programa que le ayude a encontrarlo.

Problema
Deberás escribir un programa que le permita a Karel llegar al punto más alto del Cerro Quinceo desde su posición inicial.

Consideraciones
Karel se encuentra en el origen mirando al norte.
En el mundo de entrada se representa un mapa del Cerro de Quinceo como un rectángulo (puede que el largo del cerro sea diferente a su ancho) cuya esquina inferior izquierda esta en la posición (1,1).
En cada casilla de dicho rectángulo hay al menos un beeper, el número de beepers en cada casilla indica la altura del cerro en ese punto.
La altura máxima en cualquier punto del cerro no sobrepasará los 99 beepers.
Si Karel se sitúa en el extremo oeste del mapa, sin importar la fila, podrá avanzar hacia el este y la altura ira siempre creciendo hasta llegar a una altura máxima de esa fila, a partir de ese punto si se sigue avanzando hacia el este la altura ira siempre decreciendo.
De igual manera sucede con las columnas, si Karel se sitúa en el extremo sur del mapa, sin importar la columna, podrá avanzar al norte, la altura ira siempre creciendo hasta encontrar una fila con altura máxima, a partir de ese momento si se sigue avanzando hacia el norte, los valores de altura irán siempre decreciendo.
El mapa cuenta además con la singularidad de que todas las columnas tienen su máxima altura en la misma fila, al igual que todas las filas tienen su máximo en la misma columna.
Para la evaluación de este problema únicamente importa la posición final de Karel, no importa su orientación ni los beepers del mapa.






Caso ejemplo

Solución

El código necesario para solucionar este problema es el siguiente:

class program
{
define halfturn()
{
turnleft();
turnleft();
}
define backmove()
{
halfturn();
move();
}
define ponMonton()
{
while( anyBeepersInBeeperBag )
putbeeper();
}
define resta()
{
if( nextToABeeper )
{
pickbeeper();
move();
if( nextToABeeper )
{
pickbeeper();
backmove();
halfturn();
resta();
putbeeper();
}
else
{
backmove();
putbeeper();
halfturn();
}
}
}
program()
{
while( nextToABeeper )
{
ponMonton();
resta();
move();
}
ponMonton();
backmove();
turnleft();
while( nextToABeeper )
{
ponMonton();
resta();
move();
}
backmove();
turnoff();
}
}

En esta programación ya estamos utilizando casi todos los comandos básicos de la misma.

No hay comentarios: