jueves, 26 de agosto de 2010

Ejercicio: Karel dejando zumbadores ordenadamente por columnas

El mundo inicia así:


El objetivo es que pongamos X cantidad de zumbadores en la primera fila de primera, segunda y tercera columna.

El resultado debe ser que karel tome todos los zumbadores excepto 1, y los vaya dejando asi:
En la primera columna, con 3 espacios.
En la segunda columna, con 2 espacios.
En la tercera columna, con ningun espacio.

Quedara así:

Solución:
iniciar-programa

define-nueva-instruccion xa como inicio
avanza;
avanza;
avanza;
deja-zumbador;
fin;
define-nueva-instruccion xb como inicio
avanza;
avanza;
deja-zumbador;
fin;
define-nueva-instruccion xc como inicio
avanza;
deja-zumbador;
fin;
define-nueva-instruccion regresar como inicio
mientras no-orientado-al-sur hacer
gira-izquierda;
mientras frente-libre hacer
avanza;
fin;

inicia-ejecucion
mientras junto-a-zumbador hacer
coge-zumbador;
deja-zumbador;

mientras algun-zumbador-en-la-mochila hacer
xa;

regresar;

mientras no-orientado-al-este hacer
gira-izquierda;
avanza;
mientras no-orientado-al-norte hacer
gira-izquierda;

mientras junto-a-zumbador hacer
coge-zumbador;
deja-zumbador;

repetir 2 veces inicio
xb;
fin;

regresar;

mientras no-orientado-al-este hacer
gira-izquierda;
avanza;

mientras no-orientado-al-norte hacer
gira-izquierda;

mientras junto-a-zumbador hacer
coge-zumbador;
deja-zumbador;


xc;

apagate;
termina-ejecucion
finalizar-programa

miércoles, 11 de agosto de 2010

Ejercicio: Karel se levanta por su Periodico

Un ejercicio basico:
Cada mañana Karel se levanta de la cama y tiene que recoger el periódico, representado por un zumbador, que está en el porche de la casa. Escribe un programa que ordenará a Karel que recoja el periódico y lo lleve de vuelta a la cama. La situación inicial es la de la imagen, y la situación final debe tener a Karel de vuelta en la cama (misma esquina, misma dirección que cuando empezó) con el periódico (zumbador en su mochila).

Codigo:
iniciar-programa

inicia-ejecucion



mientras no-orientado-al-norte hacer

gira-izquierda;



mientras izquierda-bloqueada hacer

inicio

avanza;

avanza;

gira-izquierda;

avanza;

avanza;

fin;



gira-izquierda;

avanza;

avanza;

gira-izquierda;

avanza;



mientras junto-a-zumbador hacer

coge-zumbador;



mientras no-orientado-al-oeste hacer

gira-izquierda;

avanza;



mientras no-orientado-al-norte hacer

gira-izquierda;



avanza;

avanza;



mientras no-orientado-al-este hacer

gira-izquierda;



avanza;

avanza;



mientras no-orientado-al-sur hacer

gira-izquierda;



mientras frente-libre hacer

avanza;

deja-zumbador;



apagate;

termina-ejecucion

finalizar-programa

Coger Zumbadores y Dejarlos al Final

Mundo:
Resultado:
Codigo:
iniciar-programa

inicia-ejecucion



si frente-bloqueado y derecha-bloqueada y izquierda-bloqueada entonces

apagate;



mientras frente-bloqueado hacer

gira-izquierda;

mientras frente-libre hacer

inicio

mientras izquierda-bloqueada y frente-libre hacer

avanza;



mientras no-orientado-al-norte hacer

inicio

gira-izquierda;

fin;



mientras frente-libre hacer

inicio

avanza;

mientras junto-a-zumbador hacer

inicio

coge-zumbador;

fin;

fin;



mientras no-orientado-al-sur hacer

gira-izquierda;

mientras frente-libre hacer

avanza;





gira-izquierda;

si frente-libre entonces

avanza;

fin;

mientras algun-zumbador-en-la-mochila hacer

deja-zumbador;



si frente-bloqueado y derecha-bloqueada y izquierda-bloqueada entonces

inicio

mientras algun-zumbador-en-la-mochila hacer

deja-zumbador;

fin;

apagate;

termina-ejecucion

finalizar-programa

Un "Caracol" en Karel

Mundo:

iniciar-programa

inicia-ejecucion



mientras no-orientado-al-este hacer

gira-izquierda;



mientras frente-libre hacer

inicio

avanza;

si izquierda-bloqueada y derecha-bloqueada y frente-bloqueado entonces

apagate;

mientras frente-bloqueado hacer

gira-izquierda;

fin;



apagate;

termina-ejecucion

finalizar-programa

lunes, 9 de agosto de 2010

Resolver un Laberiento de 1s y 0s

Les dejo un codigo en C de Inteligencia Artificial que resuelve un "laberiento" de 1s y 0s, y dice cuantos movimientos se tuvieron que hacer antes de que se encontrara con un 0 (el camino más largo).Por ejemplo:
1 1 0 1 1 0
0 1 0 0 1 1
0 1 1 1 0 0
0 1 0 1 0 0
0 1 0 1 0 0
Hay 8 movimientos.

El codigo no lo hice yo, y lo veo algo complejo, pero seguro lo encuentran Interesante.

#include"stdio.h"

#include"conio.h"

main()

{

int b[30],y=0,i1,x,i2,o=0;

clrscr();

printf("introduce 5 lineas con 6 digitos en sistema binario \n");

for (i1=0;i1<5;i1++)

{

for (i2=0;i2<=5;i2++)

{

o=((i1*6)+(i2));

scanf("%i",&b[o]);

if (b[o]!=0 && b[o]!=1)

b[o]=1;

}

printf("\n");

}

clrscr();

if (b[0]!=1)

printf ("error el primer numero debe ser 1");

else

{

if(b[1]==1)

b[1]=2;

if(b[6]==1)

b[6]=2;



for (i1=2;i1<=9;i1++)

{

for (i2=1;i2<30;i2++)

if (b[i2]==i1)

{

if (b[i2+1]==1)

b[i2+1]=i1+1;

if (b[i2+6]==1)

b[i2+6]=i1+1;

}

}

for (i2=1;i2<30;i2++)

if (b[i2]>1)

{

if (b[i2]>y)

y=b[i2];

b[i2]=1;

}

for (i1=0;i1<5;i1++)

{

for (i2=0;i2<=5;i2++)

{

o=((i1*6)+(i2));

printf("%i",b[o]);

}

printf("\n");

}

}

printf("el numero maximo de movimientos es %i",y-1);

getch();

return 0;

}

martes, 3 de agosto de 2010

Dados 4 números, comprobar cual combinación de operaciones entre ellos que se acerca más al 5to Número

Quizas es un codigo muy largo, con ciertas cosas innecesarias que pueden reducirse.

Funciona asi:
Por ejemplo, ingresamos los siguientes números:
1
1
1
1

y el Quinto es -1. Entonces, el resultado sería:
1+1+1+1=4
1-1-1-1=-2
1-1+1-1=0
1+1-1+1=2
1-1-1+1=0
1+1+1-1=2
1-1+1+1=2
1+1-1-1=0

La diferencia es 1 en la operación 2
La diferencia es 1 en la operación 3
La diferencia es 1 en la operación 5
La diferencia es 1 en la operación 8

Se los dejo si les es util:


#include
#include

main ()

{

int a,b,c,d,num,f,e,g;

int a1,a2,a3,a4,a5,a6,a7,a8;

int dif[8];

clrscr();

printf("Ingresa numero 1:");

scanf("%d",&a);

printf("\nIngresa numero 2:");

scanf("%d",&b);

printf("\nIngresa numero 3:");

scanf("%d",&c);

printf("\nIngresa numero 4:");

scanf("%d",&d);

printf("\nIngresa otro numero:");

scanf("%d",&num);



a1=a+b+c+d;
a2=a-b-c-d;
a3=a-b+c-d;
a4=a+b-c+d;
a5=a-b-c+d;
a6=a+b+c-d;
a7=a-b+c+d;
a8=a+b-c-d;

printf("\n %d + %d + %d + %d = %d", a,b,c,d,a1);

printf("\n %d - %d - %d - %d = %d", a,b,c,d,a2);

printf("\n %d - %d + %d - %d = %d", a,b,c,d,a3);

printf("\n %d + %d - %d + %d = %d", a,b,c,d,a4);

printf("\n %d - %d - %d + %d = %d", a,b,c,d,a5);

printf("\n %d + %d + %d - %d = %d", a,b,c,d,a6);

printf("\n %d - %d + %d + %d = %d", a,b,c,d,a7);

printf("\n %d + %d - %d - %d = %d", a,b,c,d,a8);


dif[0]=a1-num;

if (dif[0]<0)

dif[0]=dif[0]*(-1);



dif[1]=a2-num;

if (dif[1]<0)

dif[1]=dif[1]*(-1);


dif[2]=a3-num;

if (dif[2]<0)

dif[2]=dif[2]*(-1);



dif[3]=a4-num;

if (dif[3]<0)

dif[3]=dif[3]*(-1);



dif[4]=a5-num;

if (dif[4]<0)

dif[4]=dif[4]*(-1);



dif[5]=a6-num;

if (dif[5]<0)

dif[5]=dif[5]*(-1);



dif[6]=a7-num;

if (dif[6]<0)

dif[6]=dif[6]*(-1);



dif[7]=a8-num;

if (dif[7]<0)

dif[7]=dif[7]*(-1);



for (f=0;f<=7;f++)

{

g=0;

for (e=0;e<=7;e++)

{

if (dif[f]>dif[e])

g++;

}

if (g==0)

printf("\nLa diferencia es %d en la operacion %d",dif[f],f+1);

}



getch();

}