Documentos de Académico
Documentos de Profesional
Documentos de Cultura
v=mb5127xJE30
Para empezar a programar, el primer elemento que vamos a usar es
un tablero cuadriculado, similar al del Ajedrez, Damas o Go.
4x4 3x2
Para que veas lo que te decimos, presioná el botón Continuar, y vamos a generar tu
primer tablero: un tablero de 3x3.
¡Muy bien!
Tablero final
0 1 2
2 2
1 1
0 0
0 1 2
Ejercicio 3: El Cabezal
El tablero generado en el ejercicio anterior tenía una celda marcada:
0 1 2
2 2
1 1
0 0
0 1 2
0 1 2 3 4
1 1
0 0
0 1 2 3 4
¡Algo importante! Contamos las filas hacia arriba, y las columnas hacia la
derecha. La primera fila es la de abajo de todo, y la primera columna es la
de la izquierda.
¡Muy bien!
Tablero final
0 1 2
2 2
1 1
0 0
0 1 2
Como podrás ver podemos crear muchísimos tableros distintos, pero ¿el
cabezal se va a quedar siempre en el mismo casillero?
0 1 2 0 1 2
2 2 2 2
1 1 1 1
0 0 0 0
0 1 2 0 1 2
program {
Mover(Norte)
}
Program {Mover(Norte)}
Muy bien! Tu solución pasó todas las pruebas
Tablero inicial
0 1 2
2 2
1 1
0 0
0 1 2
Tablero final
0 1 2
2 2
1 1
0 0
0 1 2
Todo programa tiene exactamente un program: una sección del código que
declara los comandos (acciones) que queremos que la máquina realice sobre
el tablero inicial. Al ejecutar un programa obtendremos un tablero final.
program {
}
program {
Mover(Norte)
}
Creá un programa que en un tablero de 2x4 con el cabezal en el origen (la celda de
abajo a la izquierda), mueva el cabezal tres veces hacia el norte:
Inicial Final
0 1 0 1
3 3 3 3
2 2 2 2
1 1 1 1
0 0 0 0
0 1 0 1
program {Mover(Norte)Mover(Norte)Mover(Norte)}
¡Muy bien! Tu solución pasó todas las pruebas
Tablero inicial
0 1
3 3
2 2
1 1
0 0
0 1
Tablero final
0 1
3 3
2 2
1 1
0 0
0 1
Los lenguajes de programación son creados con algunas palabras que solo se
pueden utilizar con un fin determinado. Se las llama palabras reservadas .
En Gobstones, el lenguaje que estamos utilizando, program es una palabra
reservada.
Pero ojo: la máquina sigue estando ahí y no hay que olvidarla, sólo hacemos esto para
escribir un poco meno
Ejercicio 6: Para todos lados
Como te imaginarás, el cabezal no sólo se puede mover hacia el Norte, y un programa
puede combinar cualquier tipo de movimientos.
Creá un programa que mueva el cabezal dos posiciones hacia el Este y una hacia el Sur,
produciendo el siguiente efecto:
Inicial Final
0 1 2 0 1 2
2 2 2 2
1 1 1 1
0 0 0 0
0 1 2 0 1 2
2 2
1 1
0 0
0 1 2
Tablero final
0 1 2
2 2
1 1
0 0
0 1 2
program {
Mover(Este)
Mover(Este)
Mover(Sur)
}
program {
Mover(Este)
Mover(Sur)
Mover(Este)
}
Moraleja: como te decíamos al principio ¡no hay una sóla forma de resolver un problema!
Y además, el orden, a veces, no es tan importante. Acompañanos a entender mejor esto.
Pero, los humanos, solemos pensar en función del resultado final, es decir,
resaltamos el objetivo del programa. Nos importa más qué hace, y no cómo.
Esta manera denotacional nos llevaría a decir que, simplemente, mueve el
cabezal al noreste.
Por eso hay varias formas de resolver un mismo problema: podemos crear
varios programas que hagan lo mismo (el qué), pero que lo hagan de forma
diferente (el cómo).
Veamos si entendiste esto: creá otro programa que haga lo mismo que el de arriba
(mover hacia el noreste), pero de manera distinta. Ojo: tiene que funcionar en un
tablero de 2x2.
¡Dame una pista!
0 1
1 1
0 0
0 1
Tablero final
0 1
1 1
0 0
0 1
¡Perfecto!
Dicho esto, te vamos a mostrar una forma de hacerlo, simplemente para que
no te asustes tanto cuando te pase de verdad .
¿Y cómo es esa forma? Descubrilo vos: partiendo del tablero que te mostramos acá
abajo, creá un programa que provoque que el cabezal se salga fuera de los límites.
0 1 2
2 2
1 1
0 0
0 1 2
program {Mover(Este)Mover(Este)Mover(Este)}
¡Muy bien! Tu solución pasó todas las pruebas
¡BOOM!
Tablero inicial
0 1 2
2 2
1 1
0 0
0 1 2
Tablero final
EXPLOSIÓN
[1:31]: No se puede mover hacia la dirección Este: cae afuera del tablero.
¡BOOOOOOOOOOOOOOOOOM!
Ey, ¿qué pasó?
Tu programa falló, se rompió, o como lo llamamos en el universo Gobstones: hizo BOOM.
Y, ¿qué significa esto?
Que los comandos que le diste a la computadora no se pueden ejecutar, y hay algo que
vas a tener que cambiar para que funcione. En este ejercicio eso no tiene sentido porque
lo hicimos a propósito, pero tenelo en cuenta para cuando falles en el futuro.
rojas (Rojo);
azules (Azul);
negras (Negro);
y verdes (Verde).
Por ejemplo, este es un tablero con una bolita roja y una negra:
0 1
1
1 1
0 0
1
0 1
0 1 2
2 2
1 1
0 0
0 1 2
program { Poner(Rojo) }
¡Muy bien! Tu solución pasó todas las pruebas
Tablero inicial
0 1 2
2 2
1 1
0 0
0 1 2
Tablero final
0 1 2
2 2
1 1
0 0
1
2
0 1
0 1 2 3 4
1 1
0 0
0 1 2 3 4
y ejecutamos el siguiente programa:
program {
Poner(Rojo)
Poner(Rojo)
Poner(Azul)
Poner(Verde)
Poner(Rojo)
}
el cabezal colocará en la celda actual tres bolitas rojas, una azul y una verde.
0 1 2 3 4
1 1
0 0
4
0 1 2 3
Tablero final
3r 1
1
1
program {
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
Poner(Verde)
Poner(Azul)
}
program {
Poner(Rojo)
Poner(Azul)
Poner(Rojo)
Poner(Verde)
Poner(Rojo)
}
Esto es algo muy interesante que ocurre al programar: podemos trabajar con
cantidades tan grandes como queramos.
Ah, y ahora te toca a vos: creá un programa que ponga cuatro bolitas rojas y tres
bolitas negras en la celda actual.
program{Poner(Rojo)Poner(Rojo)Poner
(Rojo)Poner(Rojo)Poner(Negro)Poner(Negro)Poner(Negro)}
Tablero inicial
0 1 2
2 2
1
1
0 0
0 1 2
4r 3n
aaa
1
1 1
0 0
1
0 1
1
1
0 0
1
0 1
¿Querés saber por qué? Intentá sacar una bolita verde o azul de este tablero y
descubrilo.
Tablero inicial
0 1
program{Sacar(Verde)}
1
1
0 0
1
0 1
¡BOOM!
Tablero inicial Tablero final
0 1
DESASTRE
1 BOOM
1
Esta vez lo que pasó fue que el cabezal intentó sacar una bolita de un color
que no había, y como no sabía qué hacer se autodestruyó. Esto te va a pasar
siempre que intentes sacar una bolita que no exista, así que ¡a prestar
atención!
1
1 1
0 0
1
0 1
Un último esfuercito: usando Sacar, creá un programa que elimine todas las
bolitas de este tablero:
¡Muy bien! Tu solución pasó todas las pruebas
Tablero final program{Sacar(Verde)Sacar(Azul)Sacar(
0 1
Rojo)Sacar(Negro)}
1 1
0 0
0 1
Programas!
¡Felicitaciones, terminaste esta guía! Eso significa que ya sabés de bolitas,
tableros y cabezales, y que podés controlar a éste último con los comandos
Poner
Sacar
Mover
program{Poner(Rojo)Mover(Este)Poner(Negro)}
Tablero de 2x2
Tablero inicial
0 1
1 1
0 0
0 1
Tablero final
0 1
1 1
1
0 0
1
0 1
Tablero de 3x2
Tablero inicial
0 1 2
1 1
0 0
0 1 2
Tablero final
0 1 2
1 1
1
0 0
1
0 1 2
program {
Poner(Rojo)
Mover(Este)
Poner(Negro)
}
Operacionalmente:
Operacionalmente:
1. se mueve al este
2. luego pone una roja
3. luego pone una negra
https://mumuki.io/identity/realms/
Mumuki/protocol/openid-connect/auth?
client_id=Mumuki&redirect_uri=https
%3A%2F%2Fmumuki.io%2Fauth
%2Fidentity
%2Fcallback&response_type=code&state
=0adff49ac9c56ef53e840173a24a587172
b61ea8d62e6699
Ejercicio 2: Combinando comandos
Creá un programa que ponga dos bolitas en la posición inicial, y otras dos en
la celda de al lado hacia el Este. Todas las bolitas deben ser rojas.
Acá te dejamos un ejemplo de cómo debería quedar el tablero:
program {
Poner(Rojo)
Poner(Rojo)
Mover(Este)
Poner(Rojo)
Poner(Rojo)
}
0 1
1
1
0 0
1
0 1
0 1
1 1
0
2
222 2
1 0
2 2
0 1
Ejercicio 3: La fila roja
Creá un programa que a partir de un tablero vacío con el cabezal en el origen,
dibuje una linea de cuatro celdas hacia el Este. Las bolitas deben ser rojas y
debe poner una bolita por celda.
Ademas, el cabezal debe quedar en el extremo final de la línea, como se ve
en la imagen:
0 1 2 3
1
1
0 1 1 1 1 0
1 1 1 1
0
2 1
2 2
2
2
3
Program {
Poner(Rojo)
Mover(Este)
Poner(Rojo)
Mover(Este)
Poner(Rojo)
Mover(Este)
Poner(Rojo)
}
¡Muy bien! Tu solución pasó todas las pruebas
Tablero inicial
0 1 2 3
1
1
0 0
1 1 1
0 1 2 3
Tablero final
0 1 2 3
1 1
0 1 1 1 1 0
1 1 1 1
0
2 1
2 2
2 3
2
3 3
2 1 2
1
1
2 1
1 1 1
0 1 1 1 0
0
2 2
1
2
2 3
program{
Poner(Azul)
Mover(Norte)
Poner(Azul)
Mover(Norte)
Poner(Azul)
Mover(Sur)
Mover(Este)
Poner(Azul)
Mover(Sur)
Poner(Azul)
Mover(Este)
Poner(Azul)
}
Tablero inicial
0 1 2 3
3 3
2 2
1 1
1 1
1 1 1
0 0
0 1 2 3
Tablero final
0 1 2 3
3 3
2
1 1
2 1
1
2 1 2 2
1
1 1 1 1
1
2 1 2 1 2
0 1 0
2 0 1 2 3
Ejercicio 5: Portugal
Creá un programa que dibuje una bandera portuguesa.
La bandera de Portugal se ve así:
Como no nos vamos a poner tan quisquillosos, te vamos a pedir una versión
simplificada, que se tiene que ver así: (tablero final)
0 1 2
1 1 1 1
1
2 2
1 1 1
2
0 1 0
2
1 1 1
0 1 2
program{
Poner(Verde)
Mover(Norte)
Poner(Verde)
Mover(Este)
Poner(Rojo)
Mover(Sur)
Poner(Rojo)
Mover(Este)
Poner(Rojo)
Mover(Norte)
Poner(Rojo)
}
¡Muy bien! Tu solución pasó todas las pruebas
Tablero Inicial
0 1 2
1 1
1 1
0 0
1 1 1
0 1 2
Tablero final
0 1 2
1 1
1 1 1
0 1 1 1 0
2 2 2
1 1 1
0 1 2
0 1 2 3 4
1 1 1 1 1
2 1 1 1 1 2
1
2 2 2 2 2
1 1 1
2
1
1 1 1 1 1
0
1 1 0
1 1 1
2 2 2 2 4 2
0 1 2 3
program{Poner (Azul)
Mover(Norte)
Mover(Norte)
Poner(Azul)
Mover(Este)
Poner(Azul)
Mover(Sur)
Mover(Sur)
Poner(Azul)
Mover(Este)
Poner(Azul)
Mover(Norte)
Poner(Rojo)
Mover(Norte)
Poner(Azul)
Mover(Este)
Poner(Azul)
Mover(Sur)
Mover(Sur)
Poner(Azul)
Mover(Este)
Poner(Azul)
Mover(Norte)
Mover(Norte)
Poner(Azul)
}
¡Muy bien! Tu solución pasó todas las pruebas Tablero Inicial
0 1 2 3 4
1 1 1 1 1
2 2
1 1
1
1 1 1 1 1
0 0
4
0 1 2 3
Tablero Final
0 1 2 3 4
1 1 1 1 1
2 1 1 1 1 2
1
2 2 2 2 2
1 1 1
2
1
1 1 1 1 1
0
1 1 0
1 1 1
2 2 2 2 4 2
0 1 2 3
0 1 2
2 1 1 1 2
2
1 1 1
1 1
2 2 1 1
1 1
0
21 1
21 0
1 1 1
02 1 2 22
Guille se dedica a la jardinería y, aunque no sabemos bien por qué, piensa
que nuestro tablero es un jardín, mejor hagámosle caso así no se enoja.
program {
Sacar(Verde)
Mover(Norte)
Sacar(Verde)
Mover(Norte)
Sacar(Verde)
Mover(Este)
Sacar(Verde)
Mover(Este)
Sacar(Verde)
Mover(Sur)
Sacar(Verde)
Mover(Sur)
Sacar(Verde)
Mover(Oeste)
Sacar(Verde)
Mover(Oeste)
}
¡Muy bien! Tu solución pasó todas las pruebas
Tablero inicial
0 1 2
2 1 2
1 1 1
1 1
1
12 1 2 2
1 1
1
0
21 1 1
1 21 1
0
0
2 1
2 2
2
Tablero final
0 1 2
2 2
1 1 1
1 1
1 1
0 0
1 1 1
0 1 2
program{
Sacar(Rojo)
Poner(Verde)
Mover(Este)
Sacar(Rojo)
Poner(Verde)
Mover(Norte)
Sacar(Rojo)
Poner(Verde)
Mover(Oeste)
Sacar(Rojo)
Poner(Verde)}
¡Muy bien! Tu solución pasó todas las pruebas
Inicial
0 1
1 1 1 1
2 2
1 1
0 1 1 0
2
1 1
0 1 2
Final
0 1
1
1
1 1
1 1
2 2
0
1
1 1
0
0
2 1
Procedimientos
Si llegaste hasta acá, entonces ya sabés:
Ejercicios
program {
Poner(Negro)
Mover(Este)
Poner(Negro)
Mover(Este)
Poner(Negro)
Mover(Norte)
Poner(Negro)
Mover(Oeste)
Poner(Negro)
Mover(Oeste)
Poner(Negro)
Mover(Norte)
Poner(Negro)
Mover(Este)
Poner(Negro)
Mover(Este)
Poner(Negro)
}
1
1 1
1 1 1
1 1 1
¿Lo pensaste? Decinos qué es lo que hace
program {
Poner(Negro)
Mover(Este)
Poner(Negro)
Mover(Este)
Poner(Negro)
Mover(Norte)
Poner(Negro)
Mover(Oeste)
Poner(Negro)
Mover(Oeste)
Poner(Negro)
Mover(Norte)
Poner(Negro)
Mover(Este)
Poner(Negro)
Mover(Este)
Poner(Negro)
}
¡Muy bien!
Tablero Inicial
0 1 2 3
3 3
2 2
1 1
1 1
1 1 1
0 0
0 1 2 3
Tablero final
0 1 2 3
3 3
2 1 1 2
1 1
1 1 1
1
1 1 1
0 1 1
0
0 1 2 3
program {
DibujarCuadradoNegroDeLado3()
}
¡Muy bien! Tu solución pasó todas las pruebas
Tablero Inicial
0 1 2 3
3 3
2 2
1 1
1 1
1 1 1
0 0
0 1 2 3
Tablero final
0 1 2 3
3 3
2 1 1 2
1 1
1 1 1
1
1 1 1
0 1 1
0
0 1 2 3
¡Vamos a averiguarlo!
procedure Poner3Rojas() {
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
}
program {
Poner3Rojas()
}
¿Qué te parece que hace el nuevo procedimiento? Copiá y enviá el código para ver
qué pasa.
procedure Poner3Rojas() {
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
}
program {
Poner3Rojas()
}
¡Muy bien! Tu solución pasó todas las pruebas
Tablero inicial
0 1 2
2 2
1
1
0 0
0 1 2
Tablero final
0 1 2
2 2
1
1
0
0
3
0 1 2
Ahora que ya probamos cómo funcionan, podemos ver las diferencias entre
las sintaxis de programas y procedimientos.
procedure PonerVerdeYAzul() {
Poner(Verde)
Poner(Azul)
}
La computadora solo va a seguir las instrucciones dentro de un
procedimiento cuando sea invocado dentro de un program. ¿Cómo
lo invocamos? Escribimos su nombre seguido por paréntesis ().
program {
PonerVerdeYAzul()
}
procedure PonerNegroYRojo() {
Poner(Negro)
Poner(Rojo)
}
program {
PonerNegroYRojo …….
}
Error No paso las pruebas falto paréntesis derecho e izquierdo
antes del cierre con }
procedure PonerNegroYRojo() {
Poner(Negro)
Poner(Rojo)
}
program {
PonerNegroYRojo ()
}
¡Muy bien! Tu solución pasó todas las pruebas
Tablero Inicial
0 1
1 1
0 0
0 1
Tablero final
0 1
1 1
0 0
0 1
procedure Mover4AlNorte() {
Mover(Norte)
Mover(Norte)
Mover(Norte)
Mover(Norte)
}
program {
Mover4AlNorte()
}
Definí un procedimiento Poner3Verdes que ponga 3 bolitas verdes
en la celda actual e invocalo en el program.
Procedure Poner3Verdes(){
Poner(Verde)
Poner(Verde)
Poner(Verde)
}
program{
Poner3Verde()
}
Ups! Tu solución no se puede ejecutar
Problemas que encontramos:
Detalles
No entiendo, ¡necesito ayuda!
procedure Poner3Verdes(){
Poner(Verde)
Poner(Verde)
Poner(Verde)
}
program{
Poner3Verde()
}
¡Ups! Tu solución no se puede ejecutar
Objetivos que no se cumplieron:
program debe utilizar Poner3Verdes
La solución parece tener un error de tipeo: debe usar Poner3Verdes,
pero usa Poner3Verde. ¿Quizás quisiste decir Poner3Verdes?
Resultados:
Tablero Inicial 1
0 1
1 1
0 0
0 1
Tablero Final
0 1
1 1
0 0
3
0 1
1 1
0 3 3 0
3 3
0 1 2
Biblioteca
procedure Poner3Verdes() {
Poner(Verde)
Poner(Verde)
Poner(Verde)
}
Solución:
procedure Poner3Verdes() {
Poner(Verde)
Poner(Verde)
Poner(Verde)
}
program{
Poner3Verdes()
}
Ver detalles
0 1 2
1 1
0 3 0
3 3
0 1 2
SOLUCION CORRECTA
Tablero inicial
0 1 2
1 1
0 0
3 3
0 1 2
Tablero final esperado
0 1 2
1 1
0 0
3 3
0 1 2
program{
Poner3Verdes()
Mover(Este)
Poner3Verdes()
1 1
0 3 0
3
3
3
0 1 2
Repasemos:
Biblioteca
procedure Poner3Rojas() {
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
}
Solución
program{
Poner3Verdes()
Poner3Verdes()
Poner3Verdes()
program debe utilizar Poner3Rojas
Resultados:
program{
Poner3Rojas()
Poner3Rojas()
Poner3Rojas()
}
¡Muy bien! Tu solución pasó todas las pruebas
Tablero inicial
0 1
1 1
0 0
1
0
Tablero final
0 1
1 1
0
9
9 0
0 1
Biblioteca
procedure Poner3Rojas() {
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
}
Solucion
program{
Poner(3Rojas)
Poner(3Rojas)
Poner(3Rojas)
}
¡Ups! Tu solución no se puede ejecutar
Resultados:
program debe utilizar Poner9Rojas
Poner9Rojas debe utilizar Poner3Rojas
la solución debe declarar Poner9Rojas
La solución parece tener un error de tipeo: debe
usar Poner9Rojas, pero usa Poner3Rojas. ¿Quizás quisiste
decir Poner9Rojas?
Tablero inicial
0 1
1 1
0 0
1
0
Tablero final
0 1
1 1
0
9
9 0
0 1
Tablero inicial
0 1 2
1 1
0 9 0
0 1 2
Tablero final
0 1 2
1 1
0
9
9 0
0 1 2
Solución
program{
Poner9Rojas()
}
¡Ups! Tu solución no se puede ejecutar
Objetivos que no se cumplieron:
Poner9Rojas debe utilizar Poner3Rojas
la solución debe declarar Poner9Rojas
La solución parece tener un error de tipeo: debe usar Poner3Rojas,
pero usa Poner9Rojas. ¿Quizás quisiste decir Poner3Rojas?
Resultados:
Solución
program Poner9Rojas{
Poner3Rojas()
Poner3Rojas()
Poner3Rojas()
}
¡Ups! Tu solución no se puede ejecutar
Problemas que encontramos:
Detalles
Resultados:
procedure Poner9Rojas() {
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
}
program{
Poner3Rojas()
Poner3Rojas()
Poner3Rojas()
}
program {
Poner3Rojas()
Poner3Rojas()
Poner3Rojas()
}
procedure Poner9Rojas() {
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
}
Me dice que funciona pero tengo que mejorar y ya no se que solucion
darle... ayuda por favor..
program {
Poner9Rojas()
}
procedure Poner9Rojas() {
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
}
Tu solución funcionó, pero hay cosas que mejorar
Objetivos que no se cumplieron:
Poner9Rojas debe utilizar Poner3Rojas
La solución parece tener un error de tipeo: debe usar Poner3Rojas, pero
usa Poner9Rojas. ¿Quizás quisiste decir Poner3Rojas?
0 1 2
1 1
0 9 0
0 1 2
Tablero final
0 1 2
1 1
0
9
9 0
0 1 2
0 1 2
1 1
0 9 0
0 1 2
Tablero final
0 1 2
1 1
0
9
9 0
0 1 2
Bueno, ya sabemos cómo crear procedimientos, pero ¿por qué querríamos
hacerlos?
0 1 2
1 1 1
0
0 1 1
1
0 1 2
procedure DibujarPuntaNegra(){
PonerNegro()
}
program{
DibujarPuntaNegra()
Mover(Sur)
DibujarPuntaNegra()
Mover(Este)
DibujarPuntaNegra()
}
¡Ups! Tu solución no se puede ejecutar
Resultados:
procedure DibujarPuntaNegra(){
Poner(Negro)
}
program{
DibujarPuntaNegra()
Mover(Sur)
DibujarPuntaNegra()
Mover(Este)
DibujarPuntaNegra()
}
Tu solución no pasó las pruebas
Respuesta correcta
Respuesta:
procedure DibujarPuntaNegra(){
Poner(Negro)
}
program{
DibujarPuntaNegra()
Mover(Norte)
DibujarPuntaNegra()
Mover(Sur)
Mover(Este)
DibujarPuntaNegra()
}
¡Muy bien! Tu solución pasó todas las pruebas
Tablero Inicial
1
1 2
0 1 2
1 1
0 0
0 1 2
Tablero Final
0 1 2
1 1 1
2
0 1 1 0
0 1 2
0 1 2 3
1
3 3
1
1 1
2 2
1 1
2
1
1 1
1
2
1 1
0 1 0
1
2
2
0 1 2 3
procedure DibujarDosPuntas(){
DibujarPuntaNegra()}
program{
DibujarPuntaNegra)()
Mover(Norte)
DibujarPuntaNegra()
Mover(Sur) Esto esta
Mover(Este) mal incluido por eso dice que la llave
DibujarPuntaNegra() { anterior esta abierta pero nunca
Mover(Este) se cierra
Mover(Norte)
Mover(Norte)
DibujarPuntaNegra()
Mover(Norte)
DibujarPuntaNegra()
Mover(Sur)
Mover(Este)
DibujarPuntaNegra()
}
¡Ups! Tu solución no se puede ejecutar
Resultados:
procedure DibujarDosPuntas() {
DibujarPuntaNegra()
Mover(Norte)
Mover(Norte)
Mover(Este)
DibujarPuntaNegra()
}
program{
DibujarDosPuntas()
SOLUCIÓN
procedure DibujarDosPuntas() {
DibujarPuntaNegra()
Mover(Norte)
Mover(Norte)
Mover(Este)
DibujarPuntaNegra()
}
program{
DibujarDosPuntas()
}
¡Muy bien! Tu solución pasó todas las pruebas
Tablero Inicial
0 1 2 3
3 3
2 2
1 1
1 1
1 1 1
0 0
0 1 2 3
Tablero Final
0 1 2 3
1
3 3
1
1 1
2 2
1 1
2
1
1 1
1
2
1 1
0 1 0
1
2
2
0 1 2 3
program {
IrAlBorde(Este)
}
Inicial
0 1 2 3
1 1
0 0
3
0 1 2
Final
0 1 2 3
1 1
0 0
3
0 1 2
¡Vamos a aprovecharlo!
En este caso tenés que lograr que el cabezal quede en una esquina,
por lo tanto tenés que pensar en dos bordes: Norte y Oeste.
program{
Mover(Norte)
IrAlBorde(Oeste)
}
Tu solución no pasó las pruebas. Además no coloque el procedimiento
Objetivos que no se cumplieron:
program debe utilizar RojoAlBorde
RojoAlBorde debe utilizar IrAlBorde
Resultados de las pruebas:
Tablero de 2x3 con el cabezal abajo a la izquierda: Se obtuvo un
tablero distinto al esperado.
Tablero inicial
0 1
2 2
1 1
0 0
0 1
2 2
1 2
1 1
0 0
0 1
2 2
1 1
0 0
0 1
Tablero inicial
0 1 2
2 2
1 1
0 0
2
0 1
2 2 2
1 1
0 0
2
0 1
2 2
1 1
0 0
2
0 1
program {
RojoAlBorde()
}
Lautaro Daniel A. hace 9 meses
La solución me da bien en un tablero pero me da mal en el otro.
Cómo hago para mover ambos cabezales de manera distinta?
Guillermo Ignacio B. MENTORÍA hace 9 meses
¡Hola Lautaro! Fijate que estás usando el comando Mover(Norte),
el cual mueve el cabezal una sola posición hacia el Norte, pero la
idea es que se mueva hasta el borde Norte (así como se mueve
hasta el borde Oeste).
La solución perfecta del ejercicio es:
procedure RojoAlBorde() {
IrAlBorde(Oeste)
IrAlBorde(Norte)
Poner(Rojo)
}
program {
RojoAlBorde()
}
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
Tablero inicial
0 1
2 2
1 1
0 0
0 1
Tablero final
0 1
2 2
2
1 1
0 0
0 1
2 2
1 1
0 0
2
0 1
Tablero final
0 1 2
2 2 2
1 1
0 0
2
0 1
¡Excelente!
IrAlBorde es una primitiva muy útil para cuando no conocemos las
condiciones de nuestro tablero.
2 2
3 3
3 3 3 3
3 3
1 1
0 0
0 1 2 3
¡Manos a la obra!
Definí dos procedimientos: el procedimiento PonerGuirnalda que coloque 3
bolitas rojas y 3 bolitas verdes en una celda y el
procedimiento DecorarTablero que lo utilice y ponga una guirnalda en cada
esquina superior. Invocá DecorarTablero en el program. Tené en cuenta que
no sabemos la posición inicial donde se encontrará el cabezal.
¡Dame una pista!
No te olvides de utilizar IrAlBorde.
biblioteca
procedure Poner3Verdes(){
Poner(Verde)
Poner(Verde)
Poner(Verde)
}
procedure Poner3Rojas(){
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
}
SOLUCIÓN
procedure PonerGuirnalda(){
Poner3Verdes()
Poner3Rojas()
}
procedure DecorarTablero(){
IrAlBorde(Norte)
IrAlBorde(Oeste)
PonerGuirnalda()
IrAlBorde(Norte)
IrAlBorde(Este)
PonerGuirnalda()
}
program {
DecorarTablero()
}
¡Muy bien! Tu solución pasó todas las pruebas
TABLERO iNICIAL
0 1 2 3
2 2
3 3 3 3
1 1
0 0
0 1 2 3
TABLERO FINAL
0 1 2 3
2 2
3 3
3 3 3 3
3 3
1 1
0 0
0 1 2 3
TABLERO INICIAL
0 1 2 3 4
4 4
3 3
2 2
1 1
0 0
0 1 2 3 4
TABLERO FINAL
0 1 2 3 4
4 3 3 3 3 4
3 3
2 2
1 1
0 0
0 1 2 3 4
Cuanto más complejo sea el problema, más útil nos va a ser pensar una
estrategia y organizar la solución en subtareas ¡y los procedimientos están
para ayudarnos!
1 2
0 3 4
1 1 1 1 1 1 1
2 2 2 1 2 2 2 2 2
1 1
1 1 1 1 1
1
2 1 2 2 2 2 1
2 2 2
0 0
4
0 1 2 3
¿Cómo podemos dibujarla? ¿Cuál es la tarea que se repite? ¿Se puede definir
un nuevo procedimiento para resolverla y aprovecharlo para construir nuestra
solución?
Poner (Verde)
Poner(Azul)
Poner(Roja)
Poner(Negra)}
Procedure Dibujar4Bolitas(){ Esta mal porque se debe definir la consigna
DibujarLineaColorida
IrAlBorde(Norte)Mal
Poner DibujarLineaColorida()Mal
Mover (Este)
Respuesta:
procedure Color(){
Poner(Rojo)
Poner(Verde)
Poner(Negro)
Poner(Azul)
}
procedure DibujarLineaColorida(){
Color()
Mover(Este)
Color()
Mover(Este)
Color()
Mover(Este)
Color()
IrAlBorde(Oeste)
}
program{
DibujarLineaColorida()
}
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
Tablero inicial
0 1 2 3
3 3
2 2
1 1
0 0
0 1 2 3
Tablero final
0 1 2 3
3 3
2 2
2 2 2 2 2 2 22 2
1 1
2 2 2 2 2 2 2
0 0
0 1 2 3
Tablero inicial
0 1 2 3 4
1 1
0 0
4
0 1 2 3
Tablero final
0 1 2 3 4
2 2 2 2 2 2 2 2
1 1
2 2
2 2 2 2 2 2
0 0
4
0 1 2 3
2 2 2 2
2 2 2
2
2
2 2 2 2 2
2 2 2
2
2 2 2
2 2 2 2
2 2
2
2
2
2
2
2
2 2
0 1 2 3 4
4 4
1 1 1 1 1
2 2 1 2 1 2 1 2
3 3
1 1 1 1 1 1 1 1
2
2
1 1 1 1 1 1 1 1
1 1
1 1 1 1 1 1 1 1
1 1 1 1 1
2 2 1 2 1 2 1 2
0 0
1 1
2 2 1 1 1 1 1 1
0 1 2 3 4
Definí un procedimiento DibujarCuadradoColorido que dibuje un
cuadrado de 4×4 celdas en el que cada celda tenga una bolita de
cada color e invocalo en el program. El cabezal debe quedar en la
celda inicial.
Biblioteca
procedure DibujarLineaColorida() {
PonerCeldaColorida()
Mover(Este)
PonerCeldaColorida()
Mover(Este)
PonerCeldaColorida()
Mover(Este)
PonerCeldaColorida()
IrAlBorde(Oeste)
}
procedure PonerCeldaColorida() {
Poner(Verde)
Poner(Rojo)
Poner(Negro)
Poner(Azul)
}
procedimiento DibujarLineaColorida del ejercicio anterior
procedure Color(){
Poner(Rojo)
Poner(Verde)
Poner(Negro)
Poner(Azul)
}
procedure DibujarLineaColorida(){
Color()
Mover(Este)
Color()
Mover(Este)
Color()
Mover(Este)
Color()
IrAlBorde(Oeste)
}
program{
DibujarLineaColorida()
}
Solución
procedure DibujarCuadradoColorido(){
DibujarLineaColorida()
Mover(Norte)
DibujarLineaColorida()
Mover(Norte)
DibujarLineaColorida()
Mover(Norte)
DibujarLineaColorida()
IrAlBorde(Sur)
}
program {DibujarCuadradoColorido()
}
¡Muy bien! Tu solución pasó todas las pruebas
Tablero inicial
0 1 2 3
3 3
2 2
1 1
0 0
3
0 1 2
Tablero final(Todas las celdas llenas con las 4 bolitas en cada una de
colores:Azul-Negra-Verde y Roja
Tablero Final
0 1 2 3
3 2 2 2 2 3
2 2 2 2 2 2
2 2
1 1
0 2 2 2 2 2 2 0
2 2 2 2 2 2
3
0 1 2
Repetición Simple
Como te contábamos cuando empezaste, programar nos da un gran
poder: nos permite automatizar tareas repetitivas y tediosas.
program {
Poner(Azul)
Poner(Azul)
Poner(Azul)
Poner(Azul)
Poner(Azul)
}
1. MoverOeste10
2. La computadora repite por nosotros
3. MoverOeste5 usando repeat
4. No todo es repetir
5. También vale después
6. Repitiendo varios comandos
7. ¿Dónde está el error?
8. Diagonal con una bolita
9. Diagonal "pesada"
10. El caso borde
11. De lado a lado, dibujamos un cuadrado
Ejercicio 1: MoverOeste10
Entremos en calor: definí un procedimiento MoverOeste10 que mueva el cabezal 10 veces
hacia el Oeste.
¡Dame una pista!
Todavía no te dimos ninguna herramienta nueva, así que vas a tener que
resolverlo con lo que sabés hasta ahora. Y sí, es bastante fea la solución que
podés hacer.
procedure MoverOeste10(){
Mover(Oeste)
Mover(Oeste)
Mover(Oeste)
Mover(Oeste)
Mover(Oeste)
Mover(Oeste)
Mover(Oeste)
Mover(Oeste)
Mover(Oeste)
Mover(Oeste)
}
program{MoverOeste10()}
¡Ups! Tu solución no se puede ejecutar Esta mal por agregarle esto
Resultados:
[15:1]: Ya había un programa definido en (?):13:1.
No se puede definir un programa en (?):15:1.
0 1 2 3 4 5 6 7 8 9 10
1 1
0 0
0 1 2 3 4 5 6 7 8 9 10
Tablero final
0 1 2 3 4 5 6 7 8 9 10
1 1
0 0
0 1 2 3 4 5 6 7 8 9 10
¿Te imaginás cómo hacer lo mismo pero 20, 100 o 5000 veces? Sería
bastante molesto, ¿no?
0 1 2 3 4 5 6 7 8 9 10
1 1
0 0
0 1 2 3 4 5 6 7 8 9 10
Tablero final
0 1 2 3 4 5 6 7 8 9 10
1 1
0 0
0 1 2 3 4 5 6 7 8 9 10
Solución
procedure MoverOeste5() {
repeat(5) {
Mover(Oeste)
}
}
¡Muy bien! Tu solución pasó todas las pruebas
Tablero inicial
0 1 2 3 4 5
1 1
0 0
0 1 2 3 4 5
Tablero final
0 1 2 3 4 5
1 1
0 0
0 1 2 3 4 5
Un número entero (o sea, sin decimales), que indica cuántas veces hay que
repetir. Este número va entre paréntesis (()) luego de la palabra repeat.
Y un bloque de código, que va encerrado entre llaves ({}) y especifica qué
comandos se quieren repetir. Es MUY importante que no te los olvides,
porque sino la computadora no va a saber qué es lo que quisiste repetir (y
fallará ).
program {
Mover(Sur)
repeat(4) {
Poner(Rojo)
}
Mover(Norte)
}
Fijate que Mover(Sur) lo
pusimos antes del repeat y Mover(Norte) lo pusimos después. Por
lo tanto cada movimiento se ejecuta solo una vez. Teniendo en
cuenta esto:
0 1 2
2 2
1 1
0 0
2
0 1
Tablero final
0 1 2
2 2
1 1
0 0
2
0 1
procedure MoverNoreste3(){
Mover(Norte)
repeat(3){
Poner(Negra)
}
Mover(Este)
}
¡Ups! Tu solución no se puede ejecutar
Objetivos que no se cumplieron:
Poner3AlNoreste debe usar repeat
la solución debe declarar Poner3AlNoreste
Problemas que encontramos:
Detalles
No entiendo, ¡necesito ayuda!
Solución Valida
procedure Poner3AlNoreste(){
Mover(Norte)
Mover(Este)
repeat(3){
Poner(Negro)
Tablero inicial
0 1 2 3
3 3
2 2
1 1
0 0
0 1 2 3
Tablero final
0 1 2 3
3 3
2 2
1 1
0 0
0 1 2 3
¿Viste qué importante es definir bien qué comandos hay que repetir y cuáles
no?
procedure Poner3AlNoreste() {
Mover(Norte)
repeat(3) {
Mover(Este)
Poner(Negro)
}
}
0 1 2 3
3 3
2 2
1 1 1
1 1
0 0
3
0 1 2
1 1
0 0
0 1 2 3 4
0 1 2 3 4
1 1 1
0
2 0
0 1 2 3 4
Procedure PonerAzulLejos() {
repeat (4){
Mover(Este)
Mover(Este)
Mover(Este)
Mover(Este)
Poner(Azul)
}
}
Program PonerAzulLejos()
¡Ups! Tu solución no se puede ejecutar
Problemas que encontramos:
procedure PonerAzulLejos() {
repeat (4){
Mover(Este)
Mover(Este)
Mover(Este)
Mover(Este)
Poner(Azul)
}
}
program PonerAzulLejos()
¡Ups! Tu solución no se puede ejecutar
Problemas que encontramos:
procedure PonerAzulLejos() {
repeat (4){
Mover(Este)
Mover(Este)
Mover(Este)
Mover(Este)
Poner(Azul)
}
}
program {
Repeat(4)
Mover(Este){
Poner(Azul)}
}
¡Ups! Tu solución no se puede ejecutar
Resultados:
procedure PonerAzulLejos() {
repeat (4){
Mover(Este)
Mover(Este)
Mover(Este)
Mover(Este)
Poner(Azul)
}
}
Tu solución no pasó las pruebas
SOLUCIÓN VALIDA
procedure PonerAzulLejos(){
repeat(4){
Mover(Este)
}
Poner(Azul)
}
¡Muy bien! Tu solución pasó todas las pruebas
Tablero Inicial
0 1 2 3 4
1 1
0 0
0 1 2 3 4
Tablero Final
0 1 2 3 4
1 1 1
0
2 0
0 1 2 3 4
procedure DibujarLineaNegra6() {
Poner(Negro)
Mover(Este)
Poner(Negro)
Mover(Este)
Poner(Negro)
Mover(Este)
Poner(Negro)
Mover(Este)
Poner(Negro)
Mover(Este)
Poner(Negro)
Mover(Este)
}
¿Notás qué es lo que se repite y cuántas veces? Bueno, eso es lo que tenés
que poner en el repeat.
procedure DibujarLineaNegra6(){
repeat(6){
Mover(Este)
}
Poner(Negro)
}
Tu solución no pasó las pruebas
Tablero Inicial
0 1 2 3 4 5 6
1 1
0 0
6
0 1 2 3 4 5
1 1
0 0
1 1 1 1 1 1
6
0 1 2 3 4 5
1 1
0 0
6
0 1 2 3 4 5
procedure DibujarLineaNegra6( ) {
repeat(6) {
Poner(Negro)
Mover(Este) }
}
program { DibujarLineaNegra6()
}
Me da error y el mensaje dice: "Resultados: [9:1]: Ya había un programa
definido en (?):6:1. No se puede definir un programa en (?):9:1." No entiendo
que tengo que hacer, si alguien puede ayudarme por favor, gracias!
program{
repeat(5){
Poner(Azul)
}
}
Lo que debemos hacer en este ejercicio es precisamente utilizar repeat para
no repetir código, la clave aquí está en encontrar qué secuencia de
comandos se repite (eso es lo que tenés que poner entre las llaves {} del
repeat) y cuántas veces se repite esta secuencia (eso va entre los paréntesis
( ) que van luego de la palabra repeat)
Espero haberte ayudado
Saludos
Solución
procedure DibujarLineaNegra6( ) {
repeat(6) {
Poner(Negro)
Mover(Este) }
}
¡Muy bien! Tu solución pasó todas las pruebas
Tablero Inicial
0 1 2 3 4 5 6
1 1
0 0
6
0 1 2 3 4 5
1 1
0 0
1 1 1 1 1 1
6
0 1 2 3 4 5
0 1 0 1 0 1
4 4 4 4 4 4
1
3 3 3 3 3 3
1 1
2 2 2 2 2 2
1 1
1 1 1 1 1 1
1 1
0 0 0 0 0 0
1
0 1 0 1 0 1
procedure LineaRoja4() {
repeat(4) {
Mover(Norte)
Poner(Rojo)
}
}
¿Nos ayudás a corregirla? Te dejamos el código en el editor.
¡Dame una pista!
SOLUCION VALIDA
procedure LineaRoja4() {
repeat(4) {
Poner(Rojo)
Mover(Norte)
}
}
¡Muy bien! Tu solución pasó todas las pruebas
Tablero inicial
0 1
4 4
3 3
2 2
1 1
0 0
0 1
Tablero final
0 1
4 4
3 3
1 1
2 2
1
1
1 1
1
1
0 0
1 1
1
0
4 4
1
3 3
1
1
2 2
1
1
1 1
1
0 1 0
0 1 2 3 4
SOLUCION VALIDA
procedure Diagonal4Azul(){
repeat(4){
Poner(Azul)
Mover(Este)
Mover(Norte)
}
}
¡Muy bien! Tu solución pasó todas las pruebas
Tablero inicial
0 1 2 3 4
4 4
3 3
2 2
1 1
0 0
0 1 2 3 4
TABLERO FINAL
0 1 2 3 4
4 4
1
3 3
1
1
2 2
1
1
1 1 1
1
0 1 0
0 1 2 3 4
¿Qué quiere decir esto? Que en vez de poner 1 bolita en cada celda, ahora
hay que poner 21. Mirá la imagen:
0 1 2 3 4
4 4
3 3
2
1
2 2 2
1 2 1
0 2 0
0 1 2 3 4
A diferencia del anterior, ahora lo que tenés que hacer en cada celda es más
complejo (tenés que hacer más que un simple Poner(Azul)).
procedure DiagonalPesada4Azul(){
repeat(4){
DibujarCeldaAzul21() {
repeat(21)
{
Poner(Azul)
Mover(Este)
Mover(Norte) }
}
}
}
¡Ups! Tu solución no se puede ejecutar
Objetivos que no se cumplieron:
Resultados:
procedure DiagonalPesada4Azul(){
repeat(4){
procedure DibujarCeldaAzul(){
CeldaAzul ( ) {
Poner(Azul)
repeat(21)
Mover(Este)
Mover(Norte) }
}
}
}
Mover(Norte)
Mover(Este)
}
Diego Damian A. hace 14 días
lo que te dice es que en vez de repetir tanto podes hacer dos procesos uno
para la repeticion de las bolitas y otro para el movimiento llamando a las
bolitas
Diana L. MENTORÍA hace 13 días
¡Buenas Camila! ¿Cómo te va?
Como menciona Diego, lo que nos está diciendo es que tenemos una
repetición de lógica que podríamos resolver usando un procedimiento
aparte. Nos dice también que podríamos tener un procedimiento que se
encargue de poner las 21 bolitas azules, este mismo vamos a poder
invocarlo dentro de DiagonalPesada4Azul, ¿te animás a hacerlo?
¡Saludos!
repeat(21){
Poner(Azul)
}
repeat(3) {
BolitaAzul()
Mover(Este
Mover(Norte)
}
Ojo, tené en cuenta que en tu tablero contenes 4 celdas llenas con bolitas.
Recordá, además, que tanto un procedure, como un repeat o un program inician y
finalizan con llaves {} . Dentro de esas llaves, es dónde se escribe nuestro
código. Reveé el tuyo y fijate que no es necesario colocar las llaves que
contienen a IrAlBorde(Este) e IrAlBorde(Norte). Si te sirve de ayuda, te invito a que
cuando realices los ejercicios, escribas un código por línea. Esto te lo
recomiendo para poder organizarte mejor, tanto en la sintaxis y para
observar las acciones que realizan cada uno.
Otro resultado a mejorar:
procedure DiagonalPesada4Azul(){
repeat(21){
Poner(Azul)
}
Mover(Norte)
Mover(Este)
repeat(21){
Poner(Azul)
}
Mover(Norte)
Mover(Este)
repeat(21){
Poner(Azul)
}
Mover(Norte)
Mover(Este)
repeat(21){
Poner(Azul)
}
Mover(Norte)
Mover(Este)
}
Valentin A. hace 22 días
Buenas noches, me dice que esta bien pero puedo mejorar, y no entiendo
que lo que tendria que agregar o modificar
Gaston P. MENTORÍA hace 22 días
¡Hola Valentín!
El resultado sugiere que crees un nuevo procedimiento encargado de
colocar las 21 bolitas azules. Este nuevo procedimiento evitaría lógica
repetida, suplantando repeat() demás, y dando una mayor distribución de
subtareas a los procedimientos del ejercicio.
Como el resultado menciona, es necesario crear un procedimiento que
coloque 21 bolitas azules. Dentro de este nuevo procedimiento, sería ideal
hacer uso de un único repeat(). Una vez creado este procedimiento, podrás
notar que no sería necesario ningún otro repeat().
procedure PonerBolitas(){
Poner (Azul)
Poner (Verde)
Poner (Rojo)
}
procedure Ejemplo (){
PonerBolitas ()
Mover (Sur)
PonerBolitas ()
Mover (Oeste)
PonerBolitas ()
Mover (Este)
Mover (Este)
PonerBolitas ()
Mover (Norte)
Mover (Norte)
}
Bueno, todo bien pero ¿Que pasa con el repeat? Bueno, lo que se repite
serian poner las bolitas y moverse. Ahora sabiendo todo eso, ¿Te animas a
intentarlo de nuevo? ¡Estas reeee cerca! Porque el ejercicio funciona, solo
hay cositas que se podrian implementar.
Otra resolución explicada de los errores y como solucionarlo:
procedure DiagonalPesada4Azul() {
repeat(21){
Poner(Azul)
}
repeat(3) {
Mover(Norte)
Mover(Este)
repeat(21){
Poner(Azul)
}
}
}
Buenas. no puedo solucionar este problema...si alguien me podria ayudar. Me dice
que debo crear un procedimiento que subdivida las tareas.
Lara F. hace 10 meses
¡Hola, Héctor! Las subtareas nos sirven para facilitar la resolución de problemas y evitar
repetir código. En este caso, hay líneas que se repiten (línea 2-3 y línea 8-9) que es la parte
que coloca 21 bolitas azules, entonces lo que podemos hacer es crear un nuevo
procedimiento que se encargué exclusivamente de hacer ese paso de colocar las bolitas. A
ese procedimiento lo podemos llamar Poner21Azules (¡o con el nombre que vos quieras!)
para luego utilizarlo en DiagonalPesada4Azul
Tablero Inicial
0 1 2 3 4
4 4
1
3 3
1
2 2
1
1 1
0 0
0 1 2 3 4
Tablero final
0 1 2 3 4
4 4
3 3
2
1
2 2
1 2 1
0 2 0
0 1 2 3 4
0 1 2 3 4 5
4 4
3 3
2 2
1 1
0 0
0 1 2 3 4 5
Tablero final
0 1 2 3 4 5
4 4
3 2 3
2 2 2
1 2 1
0 0
0 1 2 3 4 5
Muy bien. Aunque el repeat es poderoso y nos ayuda a escribir menos código,
sigue siendo igual de importante la división en subtareas.
procedure LineaNegra4Este() {
repeat(4) {
Poner(Negro)
Mover(Este)
}
}
0 1 2 3
1 1
1 1 1 1
0 0
0 1 2 3
Teniendo en cuenta esto último, definí una nueva versión de LineaNegra4Este que deje el
cabezal en la última celda de la línea.
Ojo: al "sacar un caso para afuera" también vas a tener que reducir el
número de veces que repetís los otros casos.
procedure LineaNegra4Este() {
Poner(Negro)
Mover(Este)
repeat(3) {
Poner(Negro)
Mover(Este)
}
}
0 1 2 3 4
1 1
0 0
0 1 2 3 4
Tablero final esperado
0 1 2 3 4
1 1
0 0
1 1 1 1
0 1 2 3 4
Tablero final obtenido
0 1 2 3 4
1 1
0 0
1 1 1 1
0 1 2 3 4
Con el espacio justo
El programa hizo BOOM.
Tablero inicial
0 1 2 3
1 1
0 0
0 1 2 3
0 1 2 3
1 1
0 1 1 1
0
1
0 1 2 3
procedure LineaNegra4Este() {
Poner(Negro)
repeat(3) {
Poner(Negro) seria asi Invirtiendo Mover(Este)
Mover(Este) Poner(Negro)ypasalaprueba
}
}
Tu solución no pasó las pruebas
Resultados de las pruebas:
Con lugares de sobra
Se obtuvo un tablero distinto al esperado.
Tablero inicial
0 1 2 3 4
1 1
0 0
0 1 2 3 4
0 1 2 3 4
1 1
0 0
1 1 1 1
0 1 2 3 4
Tablero final obtenido
0 1 2 3 4
1 1
0 0
1 1 1 1
0 1 2 3 4
0 1 2 3
1 1
0 0
0 1 2 3
0 1 2 3
1 1
0 1 1 1
0
1
0 1 2 3
0 1 2 3
1 1
0 1 1 1 0
1
0 1 2 3
0 1 2 3 4
1 1
0 0
0 1 2 3 4
Tablero final esperado
0 1 2 3 4
1 1
0 0
1 1 1 1
0 1 2 3 4
0 1 2 3
1 1
0 0
0 1 2 3
0 1 2 3
1 1
0 1 1 1
0
1
0 1 2 3
Siempre que tengas problemas como este vas a poder solucionarlos de la
misma manera: procesando el último caso por separado.
Otra variante menos común, y tal vez más difícil de construir también, es la
de procesar el primer caso aparte:
procedure LineaNegra4Este() {
Poner(Negro)
repeat(3) {
Mover(Este)
Poner(Negro)
}
}
0 1 2 3 0 1 2 3 4 5 0 1 2 3 4
3 5 5 4
1 1 1 1 1 1 1 1
3 4
1 1 1 1
2 4 4 3
1 1 1 1 1
2
1 1 1
3
1 1 1 1
1 3
1 1 1 1 3 2 1 1 1 1
2
1
1 1 1 1
0 2
1 1 1 1 2 1 1 1 1 1
1
0
0 1 2 3 1
1 1 1 1
1 0 0
0 0
0 1 2 3 4
0 1 2 3 4 5
Definí el procedimiento CuadradoNegro4 para dibujar un cuadrado de 4x4 con bolitas
negras. Al empezar, el cabezal se encuentra en la esquina inferior izquierda del
cuadrado (no necesariamente del tablero ) y cuando termine el programa el cabezal
deberá quedar en el extremo superior derecho del cuadrado. No te olvides de
invocar LineaNegra4Este.
Tené en cuenta lo que hablamos en el ejercicio anterior sobre el caso borde.
¡Dame una pista!
Biblioteca
procedure LineaNegra4Este() {
repeat(3) {
Poner(Negro)
Mover(Este)
}
Poner(Negro)
}
procedure CuadradoNegro4(){
LineaNegra4Este() No va Esto lo puedo cambiar por esto porque se repite:
Mover3Oeste() LineaNegra4Este()
LineaNegra4Este() Mover(Norte)
Mover(Norte) Mover3Oeste() }
Mover3Oeste() LineaNegra4Este()
} }
Mover(Oeste)
Mover(Oeste)
Mover(Oeste)
procedure CuadradoNegro4(){
LineaNegra4Este ()
Mover(Norte)
Mover3Oeste()
LineaNegra4Este ()
Mover(Norte)
Mover3Oeste()
}
Procedure Mover3Oeste (){
Mover(Oeste)
Mover(Oeste)
Mover(Oeste)
}
¡Ups! Tu solución no se puede ejecutar
Problemas que encontramos:
CuadradoNegro4 debe usar repeat
Tablero inicial
0 1 2 3
4 4
3 3
2 2
1 1
0 0
3
0 1 2
Tablero final esperado
0 1 2 3
4 4
3 1 3
1
1 1
2 2
1 1 1 1
1 1
1 1 1 1
0 1 0
1 1 1
3
0 1 2
Tablero final obtenido
0 1 2 3
4 4
3 3
2 2
1 1
1 1 1 1
0 1 0
1 1 1
3
0 1 2
0 1 2 3 4
3 3
2 2
1 1
0 0
0 1 2 3 4
Tablero final esperado
0 1 2 3 4
1 1 1 1
3 3
1 1 1 1
1 1 1 1
2 2
1 1 1 1
1 1 1 1
1 1
1 1 1 1
1 1 1 1
0
1 1 1 10
0 1 2 3 4
Tablero final obtenido
0 1 2 3 4
3 3
2 2
1 1 1 1
1 1
1 1 1 1
1 1 1 1
0 1 1 1 10
4
0 1 2 3
LA SOLUCION ES:
procedure CuadradoNegro4(){
repeat(3){
LineaNegra4Este()
repeat(3){
Mover(Oeste)
}
Mover(Norte)
}
LineaNegra4Este()
}
4 4
3 3
2 2
1 1
0 0
0 1 2 3
Tablero final
0 1 2 3
4 4
1 1 1 1
3 3
1 1 1 1
1 1 1 1
2 1 2
1 1
1 1 1 1
1 1
1 1
1 1 1
0 1 10
1 1
0 1 2 3
3 3
2 2
1 1
0 0
0 1 2 3 4
Tablero final
0 1 2 3 4
1 1 1 1
3 1 3
1 1
1 1 1 1
2 2
1 1
1 1 1 1
1 1 1
1 1 1 1
0
1 1 10
4
0 1 2 3
Parámetros
Gracias a los procedimientos empezamos a dividir en subproblemas,
logrando hacer programas más complejos de una manera más fácil y
evitando repetir código.
Ahora vamos a ver como podemos hacerlos más genéricos utilizando
parámetros.
Ejercicios
0 1 2
1 1 1
2 2
1
1 1
1 1 1
1
1 1 1
1
1 1 1
0 0
1 1 1
2
0 1
0 1 2
1 1 1 2
2
1
1 1 1 1
1
0
0
1 1 1
1
1 1 1 1
1
2
0 1
BIBLIOTECA
procedure VolverAtras() {
Mover(Oeste)
Mover(Oeste)
}
procedure Bolitas(){
repeat(3){
Poner(Negro)
}
procedure DibujarLineaNegra3( ) {
repeat(3) {
Bolitas()
Mover(Este) }
}
procedure VolverAtras() {
Mover(Oeste)
Mover(Oeste)
}
program { DibujarLineaNegra3()
}
¡Ups! Tu solución no se puede ejecutar
Problemas que encontramos:
Detalles
Resultados:
[5:1]: Se esperaba un comando.
Se encontró: la palabra clave "procedure".
procedure Bolitas(){
repeat(3){
Poner(Negro)
}
}
procedure DibujarLineaNegra3( ) {
repeat(3) {
Bolitas()
Mover(Este) }
}
procedure VolverAtras() {
Mover(Oeste)
Mover(Oeste)
}
program { DibujarLineaNegra3()
}
¡Ups! Tu solución no se puede ejecutar
Objetivos que no se cumplieron:
DibujarLineaNegra3 debe utilizar VolverAtras
Resultados:
procedure PonerMover () {
Poner (Negro)
Mover (Este)
Poner (Negro)
Mover (Este)
Poner (Negro)
}
procedure DibujarLineaNegra3 () {
PonerMover ()
{
VolverAtras ()
}
}
program {
DibujarLineaNegra3 ()
}
repeat(5){
Poner(Rojo)
}
[13:2]: No se puede mover hacia la dirección Oeste: cae afuera del tablero.
Tablero de 3 por 3
0 1 2
1 1 1 2
2
1 1
1 1 1
1
1
1
0
0
1 1 1
1
1 1
2
0 1
0 1 2
1 1 1 2 1
2
1
1 1 1
1 1
1 1 1
0 0
1 1 1
2
0 1
Tablero de 4 por 4
Tablero inicial
0 1 2 3
3 3
2
2 1
1 1 1 1 1
1 1
0 0
3
0 1 2
1
Tablero FINAL
0 1 2 3
3 3
2 2
1 1
0 1 0
1 1
3
0 1 2
1 1 1 1 1
1
1
1
1 1 1 0
0
2
0 1
0 1 2
1 1 1
2 2
1 1
1
1 1 1
1 1
1 1 1
1 1 1
0 0
1 1 1
2
0 1
Definí el procedimiento DibujarCuadradoNegroDeLado3 que
invocando DibujarLineaNegra3 dibuje un cuadrado negro sobre el tablero. ibl
BIBLIOTECA
procedure VolverAtras() {
Mover(Oeste)
Mover(Oeste)
}
procedure DibujarLineaNegra3() {
/*
...
*/
}
/*
La definición de este procedimiento está oculta pero satisface lo requerido
en el ejercicio anterior.
*/
Resolución mal
procedure DibujarCuadradoNegroDeLado3(){
repeat(3){
DibujarLineaNegra3()
}
procedure DibujarLineaNegra3(){
repeat(2){
Poner(Negro)
Mover(Este)
}
Poner(Negro)
VolverAtras()
}
}
program {
DibujarCuadradoNegroDeLado3()
}
¡Ups! Tu solución no se puede ejecutar
Resultados:
Que nos coloca una bolita roja y una azul dos veces, podemos meter esto
dentro de un repeat al que le decimos que lo ejecute dos veces:
repeat(2){
Poner(Rojo)
Poner(Azul)
}
Fijate que tomamos la repetición de código y lo hicimos más pequeño.
¿Y qué pasa si usamos un repeat(1)? Como vemos en el ejemplo, al repeat le
podemos decir qué cantidad de veces queremos que se repita algo, si le
decimos repeat(1), solamente lo ejecutará una vez:
repeat(1){
Poner(Rojo)
Poner(Azul)
}
Es el equivalente de hacer:
Poner(Rojo)
Poner(Azul)
procedure DibujarCuadradoNegroDeLado3(){
DibujarLineaNegra3()
Mover(Norte)
DibujarLineaNegra3()
Mover(Norte)
DibujarLineaNegra3()
}
program{
DibujarCuadradoNegroDeLado3()
}
Fijate que varias veces dibujamos la línea y nos movemos al Norte, ¿no
podrá eso ir dentro de un repeat? ¿Cuántas veces se repite?
procedure DibujarCuadradoNegroDeLado3(){
repeat(2){
DibujarLineaNegra3()
Mover(Norte)
}
{
DibujarLineaNegra3()
}
program{
DibujarCuadradoNegroDeLado3()
}
SOLUCION VALIDA
procedure DibujarCuadradoNegroDeLado3(){
repeat(2){
DibujarLineaNegra3()
Mover(Norte)
}
{
DibujarLineaNegra3()
}
}
program{
DibujarCuadradoNegroDeLado3()
}
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
Tablero de 3 por 3
0 1 2
2 1 1 1
2
1 1 1 1
1
0 1 1 1
0
2
0 1
0 1 2
1 1 1
2 2
1 1
1
1 1 1
1 1
1 1 1
1 1 1
0 0
1 1 1
2
0 1
Tablero de 4 por 4
Tablero inicial
0 1 2 3
3 3
2 2
1 1
0 0
0 1 2 3
0 1 2 3
3 3
2 1 2
1 1
1 1
0 1 0
1 1
0 1 2 3
Biblioteca
procedure VolverAtras() {
Mover(Oeste)
Mover(Oeste)
}
SOLUCION
procedure DibujarLineaVerde3(){
repeat(2){
Poner(Verde)
Mover(Este)
}
Poner(Verde)
VolverAtras()
}
program{
DibujarLineaVerde3()
}
Tablero de 3 por 3
0 1 2
1 1 1
2 2
1
1 1 1 1
1 1 1
0 1 1
0 1 1 1
1
2 1
0 1 1 1
1
1
0 1 2
1 1
1 1 1 2
2 1
1
1 1 1
1 1
1 1 1
0 0
1 1 1
2
0 1
Tablero de 4 por 4
0 1 2 3
3 3
2
2
1 1 1
1 1
0 0
1
3
0 1 2
¡Excelente! Pero todavía nos faltan dos colores más . Ya te imaginarás lo que
hay que hacer.
procedure VolverAtras() {
Mover(Oeste)
Mover(Oeste)
}
procedure DibujarLineaRoja3(){
repeat(2){
Poner(Rojo)
Mover(Este)
}
Poner(Rojo)
VolverAtras()
}
program{
DibujarLineaRoja3()
}
¡Ups! Tu solución no se puede ejecutar
Objetivos que no se cumplieron:
DibujarLineaAzul3 debe utilizar VolverAtras
DibujarLineaAzul3 debe usar repeat
la solución debe declarar DibujarLineaAzul3
Resultados:
Tablero de 4 por 4
0 1 2 3
3 3
2
2
1 1 1
1 1
0 1 0
1 1
3
0 1 2
¡Muy bien! Pero se volvió medio repetitiva la tarea de dibujar 4
procedimientos casi iguales ¿no? Sólo cambiaba el color, y si a esto le
sumamos que además necesitamos un nuevo procedimiento por cada
cuadrado, ¡la cosa se pone cada vez más aburrida! . ¿Se podrá solucionar de
alguna manera?
procedure Poner3(color) {
repeat(3) {
Poner(color)
}
}
program {
Poner3(Negro)
Poner3(Rojo)
}
Escribí los códigos anteriores en el editor y fijate qué pasa.
procedure Poner3(color) {
repeat(3) {
Poner(color)
}
}
program {
Poner3(Negro)
Poner3(Rojo)
}
0 1
2 2
1 1
0 0
0 1
Tablero final
0 1
2 3 2
3
3
1 1
0 0
1
0
Lo primero que hicimos fue definir un procedimiento, pero con una pequeña
diferencia: toma un parámetro, llamado color.
procedure Poner3(color) {
Poner(color)
Poner(color)
Poner(color)
}
¿Y qué es un parámetro? Son esos nombres que van entre paréntesis para
ser reemplazados por valores concretos cuando invocamos al procedimiento.
Por ejemplo, si lo invocamos así..
program {
Poner3(Negro)
}
Poner(Negro)
Poner(Negro)
Poner(Negro)
Y si lo invocamos así...
program {
Poner3(Rojo)
}
Poner(Rojo)
Poner(Rojo)
Poner(Rojo)
Fijate como cada vez que aparece color se reemplaza por el valor que
le pasamos a Poner . Veamos si se entiende:
BIBLIOTECA
procedure Poner3(color) {
Poner(color)
Poner(color)
Poner(color)
}
Solucion Mal
procedure Poner3(Verde) {
Poner(Verde)
Poner(Verde)
Poner(Verde)
}
program {Poner3(Verde)}
¡Ups! Tu solución no se puede ejecutar
Resultados:
2 2
1 1
0 0
1
0
0 1
2 3 2
3
1 1
0 0
1
0
Ejercicio 7: DibujarLinea3
¡Ahora te toca a vos!
procedure Poner3(color) {
Poner(color)
Poner(color)
Poner(color)
}
Biblioteca
procedure DibujarLineaNegra3() {
repeat(2) {
Poner(Negro)
Mover(Este)
}
Poner(Negro)
VolverAtras()
}
procedure VolverAtras() {
Mover(Oeste)
Mover(Oeste)
}
Resultados:
VolverAtras()
}
Araceli Abigail V. hace 10 meses
Holaa!! Estoy un poco desorientada, pregunto, cual seria el parametro que
me pide... Gracias :)
Sergio Sebastian S. hace 10 meses
Hola Araceli.. lo que te pide es que DibujarLinea3 acepte 1 parametro que
basicamente es que acepte algo para luego usarlo.. te pongo un ejemplo
procedure PintarColor(color){ Poner(color) } En este caso, acepto 1 parametro color
y lo uso abajo en Poner... Se entiende?
procedure DibujarLinea3(Color) {
repeat(2) {
Poner(Color) Este es el error pq lo pongo con mayuscula
Mover(Este) Esto es el identificador
}
Poner(Color)
VolverAtras()
}
0 1 2 3
3 3
2 2
1 1
0 0
3
0 1 2
Tablero final
0 1 2 3
1 1 1
3 3
2 2
1 1
0 1 0
1 1
3
0 1 2
Tablero Inicial
0 1 2 3
3 3
2 2
1 1
0 0
3
0 1 2
Tablero final
0 1 2 3
3 3
2 2
1 1
0
1 1 1 0
3
0 1 2
Tablero Inicial
0 1 2 3
3 3
2 2
1 1
0 0
3
0 1 2
Tablero final
0 1 2 3
3 3
2 2
1 1
0 1 0
1 1
3
0 1 2
Tablero Inicial
0 1 2 3
3 3
2 2
1 1
0 0
3
0 1 2
Tablero final
0 1 2 3
3 3
2 2
1 1
0 0
1 1 1
3
0 1 2
Ejercicio 8: DibujarCuadradoDeLado3
¡Hora del último pasito! Ya definimos un procedimiento para poder dibujar
cuadrados negros (DibujarCuadradoNegroDeLado3), pero todo este asunto de los
parámetros surgió cuando quisimos hacer cuadrados de distintos colores.
Invocando DibujarLinea3, definí el
procedimiento DibujarCuadradoDeLado3 que recibe un color y dibuja un
cuadrado de 3x3 de ese color.
}
Mercedes N. hace 5 meses
[1:34]: Se esperaba un identificador con minúsculas. Se encontró: un
identificador con mayúsculas. A qué se refiere?
Mercedes D. hace 5 meses
Hola Mercedes! El error indicado en el ejercicio hace referencia a que el
parámetro del procedimiento debe estar escrito solo con minusculas. En el
caso del ejercicio, está indicado el parámetro como "Negro". Según el
enunciado, debe recibir un parámetro llamado "color" para que el
procedimiento pueda ser usado con cualquier color. Por otro lado, en el
ejercicio se está usando repeat para indicar que ciertos pasos del
procedimiento se deben repetir dos veces, pero dentro del corchete cada
paso ya está escrito dos veces. Por lo tanto, esa acción se llevará a cabo 4
veces. Por último, para poder visualizar mejor la escritura de la solución
podés utilizar la herramienta "dar formato" que se encuentra a la derecha de
la consola donde se escribe la solución.
DibujarLinea3(color)
Mover(Norte)
DibujarLinea3(color)
Mover(Norte)
DibujarLinea3(color)
}
Yesica R. hace 10 meses
¡Hola! ¿Qué tal? No entiendo en qué momento utilizar repeat
" Tu solución funcionó, pero hay cosas que mejorar Objetivos que no se
cumplieron: DibujarCuadradoDeLado3 debe usar repeat"
Cuando pongo repeat en DibujarCuadradoDeLado3 me repite las bolas
adentro.
Hasta ahora la única solución que encontré fue ésta sin repeat que funciona
pero que me dice que debe mejorar, y no entiendo como proceder
Mayra Nerina M. hace 10 meses
¡Hola Yesica! ¿Como estas? Recordá que el repeat nos ayuda a escribir menos
código, para saber si algo deberia ir dentro de uno, lo que podés hacer es
observar si hay parte del codigo que se está repitiendo. En este caso
DibujarLinea3(color) Mover(Norte). ¡Estás muy cerca de lograrlo!
RESULTADO CORRECTO DEL EJERCICIO
Biblioteca
procedure DibujarLinea3(color) {
repeat(2) {
Poner(color)
Mover(Este)
}
Poner(color)
VolverAtras()
}
procedure VolverAtras() {
Mover(Oeste)
Mover(Oeste)
}
solucion
procedure DibujarCuadradoDeLado3(color){
repeat(2){
DibujarLinea3(color)
Mover(Norte)
}
{
DibujarLinea3(color)
}
}
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
Tablero INICIAL
0 1 2 3
3 3
2 2
1 1
0 0
3
0 1 2
Tablero final (CON TODOS LOS COLORES: NEGRO, AZUL, VERDE, ROJO)
0 1 2 3
3 3
2 2
1 1 1
1 1
1 1 1
0 0
1 1 1
3
0 1 2
Genial, ¡logramos crear un procedimiento que nos sirve para cualquier color!
¿Y cómo se hace esto? Muy fácil, al igual que como hacemos al escribir,
vamos a separar cada parámetro usando comas de esta manera:
0
1 1 1
1
1
1 1 1
0
0 1 2 3
No te preocupes por la posición final del cabezal.
¡Dame una pista!
BIBLIOTECA
procedure DibujarLinea3(color, direccion) {
Poner(color)
Mover(direccion)
Poner(color)
Mover(direccion)
Poner(color)
}
program {
DibujarLinea3(color,direccion)
DibujarLinea3(color,direccion)
DibujarLinea3(color,direccion)
DibujarLinea3(color,direccion)
}
Tu solución no pasó las pruebas
BOOM
[2:17]: La variable "color" no está definida.
program{
DibujarLinea3(Verde,Este)
DibujarLinea3(Rojo,Norte)
Mover(Oeste)
Mover(Oeste)
Mover(Sur)
DibujarLinea3(Azul, Norte)
Mover(Este)
DibujarLinea3(Negro,Este)
program {
DibujarLinea3(Verde, Este)
Mover(Este)
DibujarLinea3(Rojo, Norte)
[...] // Siguen las líneas
program {
DibujarLinea3(Verde, Este)
Mover(Este)
DibujarLinea3(Rojo, Norte)
Mover(Norte)
DibujarLinea3(Negro,Oeste)
Mover(Oeste)
DibujarLinea3(Azul, Sur)
Mover(Azul)
}
Tu solución no pasó las pruebas
1 1
El programa hizo BOOM.
BOOM
[9:3]: El parámetro de "Mover" debería ser una dirección pero es un color.
program {
DibujarLinea3(Verde, Este)
Mover(Este)
DibujarLinea3(Rojo, Norte)
Mover(Norte)
DibujarLinea3(Negro,Oeste)
Mover(Oeste)
DibujarLinea3(Azul, Sur)
Mover(Sur)
}
¡Muy bien! Tu solución pasó todas las pruebas
0 1 2 3
1
3 3
2
2
1
1
1
1
1
1
1 1
1
0
0 1
1 1 1 1
0 1 2 3
Tablero final
0 1 2 3
1 1 1 1
3 1 1 1 3
1
1
2 2
1 1
1
1
1 1 1 1 1
0
1 1 1
1
1
1 1 1
0
0 1 2 3
Como habrás notado, al usar los procedimientos debemos darle un valor a
cada uno de sus parámetros respetando el orden en que fueron definidos.
Biblioteca
SOLUCION
program {
DibujarLinea3(Este, Verde)
Mover(Este)
DibujarLinea3(Norte, Rojo)
Mover(Norte)
DibujarLinea3(Oeste,Negro)
Mover(Oeste)
DibujarLinea3(Sur, Azul)
Mover(Sur)
}
¡Muy bien! Tu solución pasó todas las pruebas
¡BOOM!
BOOM
[12:3]: El parámetro de "Poner" debería ser un color pero es una dirección.
Ok, hizo BOOM , pero ¿qué quiere decir eso de El parámetro de Poner debería ser
un color?
Biblioteca
procedure DibujarLinea3(color, direccion) {
Poner(color)
Mover(direccion)
Poner(color)
Mover(direccion)
Poner(color)
}
Solucion
program {
DibujarLinea3(Verde)
DibujarLinea3(Rojo)
DibujarLinea3(Negro)
DibujarLinea3(Azul)
}
¡Muy bien! Tu solución pasó todas las pruebas
¡BOOM!
BOOM
Triada recibe tres colores por parámetro y pone tres bolitas, una al lado de la
otra hacia el Este, en el mismo orden en que se reciben. El cabezal empieza
en el origen y debe terminar sobre la última bolita de la tríada.
Por ejemplo: Triada(Rojo, Azul, Verde) nos da como tablero resultante:
0 1 2
1
0 1 1 1 0
1 1
2
0 1
0 1 2
1
0
1 1 1 0
1 1
2
0 1
Definí el procedimiento Triada.
Resultados:
Resultados:
[1:31]: Conflicto de nombres: "color" se usa dos veces: como parámetro en (?):1:25, y como parámetro
en (?):1:31.
SOLUCION CORRECTA
procedure Triada(color1,color2,color3){
Poner(color1)
Mover(Este)
Poner(color2)
Mover(Este)
Poner(color3)
}
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
INICIAL
0 1 2
1
0 0
1 1
2
0 1
FINALES
0 1 2
1
0 1 1 1 0
1 1
2
0 1
0 1 2
1
0
1 1 1 0
1 1
2
0 1
¡Terminaste Parámetros!
¡Felicitaciones!
En esta lección aprendimos como los parámetros facilitan nuestra tarea
permitiéndonos crear procedimientos más genéricos. Cuidado al invocar
estos procedimientos, ¡acordate que la cantidad de argumentos y su orden
importa! Los nombres también pero para las personas, no para las
computadoras.
Objetivos
Ejercicios
procedure Diagonal4Azul(){
repeat(4){
Poner(Azul)
Mover(Este)
Mover(Norte)
}
}
Biblioteca
procedure Diagonal4Azul(){
repeat(4){
Poner(Azul)
Mover(Este)
Mover(Norte)
}
}
0 1 2 3 4
4 4
1
3 3
1
1
2 2
1
1 1 1
1
0 1 0
0 1 2 3 4
procedure Diagonal4Azul(){
repeat(4){
Poner(Azul)
Mover(Este)
Mover(Norte)
}
procedure Diagonal4AzulVolviendo(){
repeat(4){
Mover(Oeste)
Mover(Sur)
Poner(Azul)
}
}
}
Diagonal4AzulVolviendo debe usar repeat
Diagonal4AzulVolviendo debe utilizar Diagonal4Azul
la solución debe declarar Diagonal4AzulVolviendo
Resultados:
procedure Diagonal4AzulVolviendo(){
repeat(1){
Diagonal4Azul()}
IrAlBorde(Oeste)
IrAlBorde(Sur)
}
Eric Hernán H. hace 10 meses
Cuando ingreso este procedimiento la devolución de la actividad indica que
funciona pero no está aprobada porque tiene un 'repeat' de más. Sin
embargo, cuando se lo saco (el que esta en la línea 2) la devolución de la
actividad me indica que no está aprobada porque no tiene ningún 'repeat'. A
qué puede deberse este problema?
Le estás diciendo "repeat (1)", y eso es innecesario, Borrá eso y quedaría
bien.
A tener en cuenta, el repeat usalo de (2) para arriba.
Mayra Nerina M. hace 10 meses
¡Hola Eric! ¿Como estas? Como dijo Guillermo arriba, el repeat tiene sentido
cuando es de 2 para arriba. Lo que sucede es que usaste IrAlBorde (Que no
está para nada mal, incluso es mas rapido) pero el ejercicio busca que hagas
el recorrido de la vuelta moviendote por los casilleros con el repeat . Si no
quedó claro, o surge otra consulta, no dudes en preguntarnos. ¡Saludos!
SOLUCION CORRECTA
procedure Diagonal4AzulVolviendo(){
Diagonal4Azul()
repeat (4){
Mover(Oeste)
Mover(Sur)
}
}
3 1
3
2 1
2
1 1
1
0 1
0
0 1 2 3 4
Tablero final
0 1 2 3 4
4 4
1
3 3
1
1
2 2
1
1
1 1
1
1
0 0
1
0 1 2 3 4
¡Bien!
Tenés que acostumbrarte a pensar... ¿No podría usar algún procedimiento
que ya definí antes?
Una gran ventaja de los procedimientos es que, una vez que están escritos,
podés guardártelos para volver a usarlos. Cuando ejercitás en
Mumuki, nosotros ya los guardamos por vos y te dejamos
la Biblioteca lista para usar, pero en la vida real ese trabajo vas a tener que
hacerlo vos.
0 1 2 3 4
6 6
1
5 1 5
1 1
4 1 1 4
1 1 1
3 1 1 1 3
1 1 1
2 1 1 1 2
1 1
1 1 1 1
1
0 1 0
0 1 2 3 4
Biblioteca
procedure Diagonal4AzulVolviendo(){
Diagonal4AzulAvanzando()
repeat(4){
Mover(Sur)
Mover(Oeste)
}
}
procedure Diagonal4AzulAvanzando(){
repeat(4){
Poner(Azul)
Mover(Este)
Mover(Norte)
}
}
YO DI ESTA SOLUCION
procedure BandaDiagonal4(){
repeat(4) {
Poner(Azul)
Mover(Este)
Mover(Norte)
}
}
procedure BandaDiagonalVolviendo(){
BandaDiagonal4()
repeat(4){
Mover(Sur)
Mover(Oeste)
}
}
Tu solución no pasó las pruebas
Objetivos que no se cumplieron:
BandaDiagonal4 debe utilizar Diagonal4AzulVolviendo
6 6
5 5
4 4
1
3 1 3
1
1
1 1
2 2
1 1
1 1
1
1
0 1 0
0 1 2 3 4
}
Mover(Sur)
Mover(Sur)
}
BIBLIOTECA
procedure BandaDiagonal4(){ procedure Diagonal4AzulVolviendo(){
repeat(2){ Diagonal4AzulAvanzando()
Diagonal4AzulVolviendo() repeat(4){
Mover(Norte) Mover(Sur)
} Mover(Oeste)
{ }
Diagonal4AzulVolviendo() }
}
Mover(Sur)
Mover(Sur)
}
¡Muy bien! Tu solución pasó todas las pruebas
Tablero Inicial
0 1 2 3 4
6 6
5 5
4 4
3 3
1
2 2
1 1
1 1
1
0 0
0 1 2 3 4
Tablero Final
0 1 2 3 4
6 6
1
5 1 5
1 1
4 1 1 4
1 1 1
3 1 1 1 3
1 1 1
2 1 1 1 2
1 1
1 1 1 1
1
0 1 0
0 1 2 3 4
1 1
3
0 3 0
2 0
Definí el procedimiento PonerN(cantidad, color).
1
procedure PonerN(3,Azul){
Poner(Azul)
Poner(Azul)
Poner(Azul)
}
¡Ups! Tu solución no se puede ejecutar
Resultados:
[1:18]: Se esperaba un identificador con minúsculas.
Se encontró: un número.
0 1
1 1
3
0 3 0
2
0 1
0 1
1 1
3
0 4 0
2
0 1
¿Qué podríamos representar con bolitas? Por ejemplo una fecha. Una fecha
que debemos recordar es el 24 de marzo de 1976, hoy constituido Día de la
Memoria por la Verdad y la Justicia en Argentina.
0 1 2
24
*
0 0
3
2
0 1
BILIOTECA
procedure PonerN(cantidad,color){
repeat(cantidad){
Poner(color)
}
}
procedure DiaDeLaMemoria(cantidad,color){
repeat(cantidad){
Poner(color)
Mover(Este)
}
{
repeat(cantidad){
Poner(color)
Mover(Este)
}
{
repeat(cantidad){
Poner(color)
}
}
¡Ups! Tu solución no se puede ejecutar
Problemas que encontramos:
Detalles
Resultados:
[18:1]: Se esperaba un comando.
Se encontró: la palabra clave "program".
repeat(3){
Poner(Verde)
Mover(Este)
}
repeat(1976){
Poner(Negro)
}
}
Tu solución no pasó las pruebas
Objetivos que no se cumplieron:
DiaDeLaMemoria debe utilizar PonerN
DiaDeLaMemoria no debe usar repeat
La solución parece tener un error de tipeo: debe usar PonerN, pero
usa Poner. ¿Quizás quisiste decir PonerN?
El programa hizo BOOM.
BOOM
[12:4]: El procedimiento "DiaDeLaMemoria" espera recibir 2 parámetros pero se lo invoca con ningún
argumento.
procedure DiaDeLaMemoria(){
//Nuestro código va acá
}
0 1 2
24 *
0 0
3
2
0 1
final
0 1 2
24
*
0 24 3 0
3 2
0 2
1
2
0 1 2
24
*
0 12 8 0
3 2
0 2
1
2
Biblioteca
procedure PonerN(cantidad,color){
repeat(cantidad){
Poner(color)
}
}
procedure Fecha(dia,mes,anio){
repeat(12){ Aca el error es que se debe poner: Poner(dia,Azul)
Poner(Azul)
}
repeat(8){ Aca igual
Poner(Verde)
}
repeat(1990){ Aca igual
Poner(Negro)
}
}
Tu solución no pasó las pruebas
Objetivos que no se cumplieron:
Fecha debe utilizar PonerN
Fecha no debe usar repeat
0 1 2
24
12 *
0 0
8 3
2
2 0 1
2
BOOM
[9:4]: El procedimiento "Fecha" espera recibir ningún parámetro pero se lo invoca con 3
argumentos.
Otra solución mal
procedure PonerN(){
PonerN(12,Azul)
Mover(Este)
PonerN(8,Verde)
Mover(Este)
PonerN(1990,Negro)
}
¡Ups! Tu solución no se puede ejecutar
Objetivos que no se cumplieron:
Fecha debe utilizar PonerN
la solución debe declarar Fecha
Resultados:
SOLUCION DE LA CONSULTA
procedure Fecha (dia, mes, anio) {
PonerN (dia, Azul)
Mover (Este)
PonerN (mes, Verde)
Mover (Este) El error es este porque se debe poner en vez de 26, anio
PonerN (26,Negro)
}
Yair Horacio D. hace 9 días
Pude resolver el ejercicio, volví a hacerlo mal para poder sacarme una duda. Cuándo se usan los
argumentos? Para qué sirven? No entiendo cuando usarlos... :/
En este caso, los argumentos serían 13, 2 y 1950 para la primera invocación y
16, 8 y 2005 para la segunda. Si no utilizamos parámetros en este caso
tendríamos que hacer dos procedimientos (que además se deberían llamar
diferentes porque no se pueden definir dos procedimientos con el mismo
nombre) para obtener el mismo resultado, lo cual sería muy engorroso. Y si
quisiéramos otra fecha tendríamos que definir otro procedimiento y así
sucesivamente.
0 1 2
24 *
0 12 8 0
3
2
2 0 1
2
Otros valores
0 1 2
24 *
0 4 6 0
3
2
0 2
1
2
Inicial Final
0 1 2 3 0 1 2 3
2 2 2 2
1 1 1 1
0 0 0 0
0 1 2 3 0 1 2 3
procedure PonerN(cantidad,color){
repeat(cantidad){
Poner(color)
}
}
}
¡Ups! Tu solución no se puede ejecutar
repeat(cantidad){
MoverN(3,Oeste)
}
Resolucion mal
procedure MoverN(cantidad,direccion){
repeat(3){
MoverN(3,Oeste)
}
}
Resolucion bien
procedure MoverN(cantidad, direccion){
repeat(cantidad){
Mover(direccion)
}
}
Solucion Correcta
procedure MoverN(cantidad, direccion){
repeat(cantidad){
Mover(direccion)
}
}
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
Tablero inicial
0 1 2
0 0
0 1 2
Tablero final
0 1 2
0 0
0 1 2
Tablero inicial
0
1 1
0 0
0
Tablero final
0
1 1
0 0
¡Perfecto!
Ahora, tenés que mostrarnos que podés dibujar un reloj. Lo que haremos por
ahora es solamente poner los números que aparecen en un típico reloj de
agujas:
El 12 arriba,
El 3 a la derecha,
El 9 a la izquierda, y
el 6 abajo.
program {
DibujarReloj(2)
}
0 1 2 3 4
12
4 4
12
3 9 3
2
9
2 3 3 2
1 2 1
6
0 0
0 1
6
2
2 3 4
¡Dividí en subtareas!
procedure PonerN(cantidad,color){
repeat(cantidad){
Poner(color)
}
}
procedure MoverN(cantidad,direccion){
repeat(cantidad){
Mover(direccion)
}
}
SOLUCION
procedure Agregarhora(hora,direccionIdadireccionVuelta,radio){
(usar esto de la biblioteca)
MoverN(radio, direccionIda)
PonerN(hora,Rojo)
MoverN(radio, direccionVuelta)
}
procedure DibujarReloj(radio){ este puede ser 2, 4 según distancia
Agregarhora(12, Norte, Sur, radio)
Agregarhora(3, Este, Oeste, radio)
Agregarhora(9, Oeste, Este, radio)
Agergarhora(6, Sur, Norte, radio)
}
SOLUCION CORRECTA
procedure Agregarhora(hora,direccionIda,direccionVuelta,radio){
MoverN(radio, direccionIda)
PonerN(hora, Rojo)
MoverN(radio, direccionVuelta)
}
procedure DibujarReloj(radio){
Agregarhora(12, Norte, Sur, radio)
Agregarhora(3, Este, Oeste, radio)
Agregarhora(9, Oeste, Este, radio)
Agregarhora(6, Sur, Norte, radio)
}
Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
Inicial
0 1 2 3 4
4 4
3 3
2 2
9 3
1 1
0 0
6
0 1 2 3 4
Tablero final
0 1 2 3 4
12
4 4
12
3 3
9 3
2 2
9 3
1 1
6
0 0
6
0 1 2 3 4
Tablero inicial
0 1 2
2 2
1 1
0 0
0 1 2
Tablero final
0 1 2
2 12 2
12
9 3
1 1
9 3
6
0 0
6
0 1 2
¿Te fijaste? Estamos usando bolitas para representar la hora de un reloj. Al
programar, usamos las abstracciones que tenemos para modelar cosas del
mundo real.
Y como siempre, es muy importante dividir el problema en subtareas. Y si
puedo no repetir código, ¡Aún mejor!
0 1 2 3 4
1 1
0 3 3 0
3 3 3 3 3 3 3
3
2
0 2
1 2
2 2
3 4 2
Definí el procedimiento LineaEstePesada(peso, color, longitud). Tené en
cuenta que el cabezal debe regresar a la posición inicial. Para eso vas a tener
que invocar MoverN.
Biblioteca
procedure PonerN(cantidad,color){
repeat(cantidad){
Poner(color)
}
}
procedure MoverN(cantidad,direccion){
repeat(cantidad){
Mover(direccion)
}
}
LineaEstePesada debe utilizar MoverN
Resultados:
Solución no valida
1. procedure LineaEstePesada(peso, color, longitud) {
2. repeat(longitud) {
3. PonerN(peso,color)
4. Mover(Este)
5. }
6. MoverN(4,Oeste)
7. }
Tu solución no pasó las pruebas
Resultados de las pruebas: esta esta bien
0 1 2 3 4
1 1
0 0
3 3 3 3 3
0 1 2 3 4
0 1 2 3 4
1 1
0 3 3 0
3 3 3 3 3 3 3
2
0 2
1 2
2 2
3 4
0 1 2 3 4 5 6 7
0 0
7
0 1 2 3 4 5 6
Tablero final
0 1 2 3 4 5 6 7
0 3 3 3 3 3 3 3 0
2 2 2 0
2 1 2 3 2
4
2
5
2
6
7
BOOM
SOLUCION CORRECTA
1. procedure LineaEstePesada(peso, color, longitud){
2. repeat(longitud){
3. PonerN(peso, color)
4. MoverN(1,Este)
5. }
6. MoverN(longitud, Oeste)
7. }
0 1 2 3 4
1 1
0 0
3 3 3 3 3
0 1 2 3 4
0 1 2 3 4
1 1
0 3 3 0
3 3 3 3 3 3 3
2
0 2
1 2
2 2
3 4
0 1 2 3 4 5 6 7
0 0
7
0 1 2 3 4 5 6
Tablero final
0 1 2 3 4 5 6 7
0 3 3 3 3 3 3 3 0
02 2
1
2
2
2
3 2
4
2
5
2
6
7
Definí un procedimiento GuardaDe5(), que haga una "guarda" de 5 azulejos (como las que
decoran las paredes). Cada azulejo está conformado por 1 bolita verde, 5 negras y 9 rojas.
0 1 2 3 4 5
1 1
5 5 5 5 5
1 5 1 1 1 1
0 5 5 0
1 1 1 1 1 1 5
9
9 1
9
5 9 9 9
9 9 9 9 9
1 9 1 1 1 1
1 9
1 1 1 1
0 1 2 3 4 5
procedure PonerN(cantidad,color){
repeat(cantidad){
Poner(color)
}
}
Solucion no valida
procedure GuardaDe5(cantidad, color){
repeat(cantidad){
Poner(color)
Mover(Este)
}
}
Tu solución no pasó las pruebas
Objetivos que no se cumplieron:
GuardaDe5 debe utilizar PonerN
La solución parece tener un error de tipeo: debe usar PonerN, pero
usa Poner. ¿Quizás quisiste decir PonerN?
RESOLUCION NO VALIDA DE LA
CONSULTA
1. procedure AzulejoTric(){
2. PonerN(5,Negro)
3. PonerN(9,Rojo)
4. PonerN(1,Verde)
5. Mover(Este)
6. }
7. procedure GuardaDe5(){
8. repeat(5){
9. AzulejoTric()
10.}
11.IrAlBorde(Este)
12.}
Hola ¿Qué tal Laritza? Lo que has hecho está muy bien, te felicito. Solo que
te estarías olvidando de considerar el "caso borde". Por ejemplo, cuando
repetís por quita vez "AzulejoTric()", te pone la cantidad que le indicaste de
bolas negras, rojas y verdes, y despues le "decís" que vaya hacia el Este. Esto
ultimo no sería un problema para tableros que contengan más de 5
columnas (cantidad de casilleros horizonales). El problema es que cuando
tenés un tablero con justo 5 columnas, el cabezal intentará irse hacia el Este
(en el ultimo "repeat"), y al no poder realizar esa operación (porque no hay
más casilleros hacia el Este), el programa hará BOOM! Para solucionar esto,
debes procesar el último caso por separado. Esto se llama "El caso borde".
Para recordar que es esto, podés ir al ejercicio Nº10 de la Lección Nº4
llamada: "El caso borde". Espero haberte sido de ayuda ¡Saludos!
¡Hola Laritza!
Como bien dice Ariel, nos ayudaría mucho considerar manejar el último
caso de poner bolitas y mover por fuera de nuestro repeat. Esto quiere decir
que en el repeat estamos moviendo hacia el Este cinco veces, cuando
solamente deberiamos de mover cuatro. ¿Cómo lo solucionamos? Tenemos
varias formas distintas:
PonerN(5,Negro)
PonerN(9,Rojo)
PonerN(1,Verde)
1 1
5 5 5 5 5
0 0
9 1 9 1 9 1 9 1 9 1
0 1 2 3 4 5
0 1 2 3 4 5
1 1
5 5 5 5 5
1 5 1 1 1 1 1
0 5 5 5 0
1 1 1 1 1 1 5 1
9
9 1
9
5 9 9 9
9
9 9 9 9 9 9
1 9 1 1 1 1
1 9
1 1 1 1 9
0 1 2 3 4 5
9
5
5
2 2
9 9
9 1 1
1
5
1 9 5 1
9 1
9 1 9 5 5
1 9 9
5 5 5
0 9 5 9 9 0
9
9 1 1 9 9 1
9 1 9
9
1 1
1 1 1
0 1 2
Biblioteca
procedure PonerAzulejo(){
Poner(Verde)
PonerN(5,Negro)
PonerN(9,Rojo)
}
procedure PonerN(cantidad,color){
repeat(cantidad){
Poner(color)
}
}
procedure MoverN(cantidad,direccion){
repeat(cantidad){
Mover(direccion)
}
}
GuardaEnL debe usar repeat
GuardaEnL debe utilizar PonerAzulejo
GuardaEnL debe utilizar MoverN
la solución debe declarar GuardaEnL
Hay que dividir en subtareas. Tené en cuenta qué partes de tu código
se repiten y trasladalas a un nuevo procedimiento.
La solución parece tener un error de tipeo: debe declarar GuardaEnL,
pero declara GuardaenL. ¿Quizás quisiste decir GuardaEnL?
La solución parece tener un error de tipeo: debe usar MoverN, pero
usa Mover. ¿Quizás quisiste decir MoverN?
Resultados:
GuardaEnL debe usar repeat
GuardaEnL debe utilizar PonerAzulejo
GuardaEnL debe utilizar MoverN
la solución debe declarar GuardaEnL
Hay que dividir en subtareas. Tené en cuenta qué partes de tu código
se repiten y trasladalas a un nuevo procedimiento.
La solución parece tener un error de tipeo: debe declarar GuardaEnL,
pero declara GuardaenL. ¿Quizás quisiste decir GuardaEnL?
Resultados:
GuardaEnL debe usar repeat
GuardaEnL debe utilizar PonerAzulejo
GuardaEnL debe utilizar MoverN
la solución debe declarar GuardaEnL
Hay que dividir en subtareas. Tené en cuenta qué partes de tu código
se repiten y trasladalas a un nuevo procedimiento.
La solución parece tener un error de tipeo: debe declarar GuardaEnL,
pero declara GuardaenL. ¿Quizás quisiste decir GuardaEnL?
Resultados:
9
5
5
2 2
9 9
9 1 1
1
5
1 9 5 1
9 1
9 1 9 5 5
1 9 9
5 5 5
0 9 5 9 9 0
9
9 1 1 9 9 1
9 1 9
9
1 1
1 1 1
0 1 2
En esta guía:
Expresiones
¿Sepuedenhacerprogramasque sumen cosas?
¿Y dibujar figuras en distintas direcciones sin tener que especificar cada una
deellas?
¿Y mirar lo que hay en el tablero?
Ejercicios
el número 5;
la cantidad de dedos de una mano;
la suma entre 3 y 2;
el número de continentes que existen en el planeta, según la ONU.
Con esta idea e invocando PonerN, creá un programa que ponga cinco bolitas
negras, PERO sin escribir el número 5.
Ver detalles
Ver detalles
¡Intentemos de nuevo!
El programa hizo BOOM.
SOLUCION CORRECTA
Solucion Biblioteca
program { procedure PonerN(cantidad, color) {
PonerN(3+2,Negro) repeat(cantidad){
Poner(color)
} }
}
¡Muy bien! Tu solución pasó todas las pruebas
Tablero inicial
0 1
1 1
0 0
0 1
Tablero final
0 1
1 1
5
0 0
5
1
0
program {
PonerN(4 + 1, Negro)
}
program {
PonerN(12 - 7, Negro)
}
Y así se nos pueden ocurrir infinitas formas de "decir 5" y sólo una de ellas lo
hace de manera literal (o sea, escribiendo 5).
0 1
1 1
0 6 0
6
0 1
Ver detalles
PonerSuma debe utilizar PonerN
PonerSuma no debe utilizar Poner
¡Corrijamos el problema!
Resultados:
procedure PonerN(cantidad,color){
PonerSuma(cantidad)
Poner(color)
}
¡Ups! Tu solución no se puede ejecutar
Ver detalles
PonerSuma debe utilizar PonerN
PonerSuma debe tener dos parámetros
PonerSuma debe usar +
la solución debe declarar PonerSuma
¡Intentemos de nuevo!
Resultados:
SOLUCION CORRECTA
procedure PonerSuma(x,y){
PonerN(x+y,Rojo)
}
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
0 1
1 1
0 0
6
0 1
0 1
1 1
0 0
6 6
0 1
0 1
1 1
0 9 0
6
9
0 1
1 1
0 0
45 45
5
0 1
1 1
0 0
51 51
5
0 1
Biblioteca
procedure PonerN(cantidad, color) {
repeat(cantidad) {
Poner(color)
}
}
Ver detalles
SOLUCION CORRECTA
procedure ContarGente(micros, autos, bicicletas){
PonerN(40*micros+4*autos+bicicletas, Verde)
Tablero inicial
0 1
1 1
0
0
0 1 45
5
Tablero final
0 1
1 1
0 45 *
0
5
0 1
En Gobstones, como en la matemática, existe la idea de precedencia de
operadores. En criollo, esto quiere decir que hay ciertas operaciones que se
hacen antes que otras, sin la necesidad de usar paréntesis para ello. En
particular, el orden es: primero las multiplicaciones y divisiones, luego las
sumas y las restas (de nuevo, como en matemática).
procedure MoverComoSalmon(direccion) {
Mover(opuesto(direccion))
}
Escribí la solución en el editor y dale Enviar. Vas a ver cómo se mueve el cabezal...
1. procedure MoverComoSalmon(direccion){
2. Mover(opuesto(direccion))
3. }
Tablero inicial
0 1
1 1
0 0
0 1
Tablero final
0 1
1 1
0 0
0 1
Tablero inicial
0 1
1 1
0 0
0 1
Tablero final
0 1
1 1
0 0
1
0
Biblioteca
procedure MoverN(cantidad, direccion) {
repeat(cantidad) {
Mover(direccion)
}
}
Solucion Correcta
procedure CaminarDesconfiado(pasos){
MoverN(pasos div 2, Este)
}
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
Tablero inicial
0 1 2 3 4 5
0 0
0 1 2 3 4 5
Tablero final
0 1 2 3 4 5
0 0
0 1 2 3 4 5
Tablero inicial
0 1 2 3 4 5
0 0
0 1 2 3 4 5
Tablero final
0 1 2 3 4 5
0 0
0 1 2 3 4 5
1 1
0 0
45
0 1
0 1
1 1
1
0
45
5 0
0 1
Inicial
0 1
1 1
0 0
45
0 1
final
0 1
1 1
1
5
0 0
45
0 1
1 1
5
0 1 1 0
45
50 5
1
BOOM
[6:4]: El procedimiento "MoverN" espera recibir 2 parámetros pero se lo invoca con un
argumento.
0 1 2 3
3 3
2 1 2
1
1 1 1
1
0 0
1 1
0 1 2 3
SOLUCION CORRECTA
0 1 2 3
3 3
2 1 2
1
1 1 1
1
0 0
1 1
0 1 2 3
1 2 3
0
1 1 1
1 1 1
0 0
0 1 2 3
Ele(Norte)
0 1 2 3
3 3
2 1 1
2
1 1 1
1
0 2 1
1 1 0
0 1 2 3
Ele(Este)
1
0 1 2 3
3 3
2 1 1
2
1 1 1
1
0 0
1
0 1 2 3
Fijate que lo que hace es dibujar una línea hacia la direccion que le digamos,
del color y longitud que le digamos, y cuando termina de hacerlo vuelve a
la posicion inicial.
Si imaginamos un tablero, en donde nuestro cabezal comienza en la posición
(0,0). Si hacemos Linea(Norte, Rojo, 2), va a dibujar la linea roja dos celdas hacia
arriba y volverá a la posición (0,0), dejandonos en donde comenzamos.
Si tenemos esto en cuenta podemos dividir nuestro problema de dibujar una
L en dos partes, como dijimos: dos líneas.
Linea(direccion, Azul, 3)
1. procedure Ele(direccion){
2. Linea(Norte, Azul, 3)
3. Linea(siguiente(Norte), Azul, 3)
4. }
Hola Hernán! Fijate que ya le estás poniendo una dirección definida a las
lineas! Deja esos valores como parámetros para que varíe dependiendo
de la direccion que le des a Ele(direccion). Por ejemplo, al darle a Ele
dirección Este (Ele(Este)), los valores de abajo no podrán cambiar porque
ya pusiste los valores Norte y Norte, entonces la Linea se hará hacia el
Norte.
Mauro G. hace 10 meses
Hola Hernan, como dijo Maria. En este ejercicio no deberías forzar al
procedure a ir a una dirección definida como Norte, etc, sino utilizar el
argumento "direccion" que es lo que le vas a pasar a la función. A partir
de ahí deberías utilizar solo siguiente o previo dado el caso que
corresponda.
RESOLUCION MIA MAL
1. procedure Linea(direccion, color, longitud) {
2. repeat(longitud) {
3. Poner(color)
4. Mover(direccion)
5. }
6. {MoverN(longitud,opuesto(direccion) )
7. }
8. procedure Ele(direccion, longitud){
9. repeat (longitud) {
10.siguiente(direccion)
11.}
12.}
13.}
SOLUCION CORRECTA
1. procedure Ele(direccion){
2. Linea(direccion, Azul, 3)
3. Linea(siguiente(direccion), Azul, 3)
4. }
¡Muy bien! Tu solución pasó todas las pruebas
Porque siguiente(Norte) es Este. Si luego
ejecutamos Mover(previo(Oeste)) lograremos el siguiente tablero:
procedure PonerMisterioso() {
Mover(siguiente(Este))
Poner(Negro)
Mover(opuesto(Oeste))
Poner(Negro)
Mover(previo(Oeste))
Poner(Negro)
}
ESTA ES
0 1 2
2 1 2
9 1 1
1 1 1 1
9
1 1 1
5 5 5
0 0
9 1 9 1 9 1
0 1 2
Flecha(Oeste)
0 1 2
2 1 2
9 1 1
1 1 1
9
1 1
5 5 5
0 0
9 1 9
1 1 9 1
1
0 1 2
Tené en cuenta que cada vez que nos movamos en una dirección para poner
una bolita vamos a tener que volver a la dirección anterior. Por suerte
tenemos una función para eso, ¿cuál?
EJRCICIO RESUELTO MAL POR MI
1. procedure Flecha(direccion){
2. Mover(siguiente(direccion))
3. Poner(Rojo)
4. Mover(opuesto(direccion))
5. Mover(siguiente(direccion))
6. Poner(Rojo)
7. Mover(opuesto(direccion))
8. Mover(siguiente(direccion))
9. Poner(Rojo)
10.Mover(opuesto(direccion))
11.}
Tu solución no pasó las pruebas
Objetivos que no se cumplieron:
Flecha debe utilizar previo
BOOM
[5:3]: No se puede mover hacia la dirección Este: cae afuera del tablero.
[7:3]: No se puede mover hacia la dirección Este: cae afuera del tablero.
[7:3]: No se puede mover hacia la dirección Sur: cae afuera del tablero.
procedure Flecha(direccion) {
Mover(previo(direccion))
Poner(Rojo)
repeat(2) {
Mover(siguiente(direccion))
}
Poner(Rojo)
Mover(previo(direccion))
Mover(direccion)
Poner(Rojo)
Mover(opuesto(direccion))
}
Marcelo O. hace 10 meses
Buenas noches! Pude resolverlo completando y corrigiendo el codigo
leyendo las preguntas y las respuestas. Pero la realidad es que no me queda
muy claro este ejercicio, creo que es por las funciones "previo" y "siguiente",
al parecer no termino de entender su comportamiento.
Mauro G. hace 10 meses
Hola Marcelo,
El procedure Flecha recibe a direccion como argumento. Lo que te permite
previo y siguiente es conseguir una nueva dirección dependiendo de esta, en
lugar de tener que escribir forzadamente a donde querés que vaya la casilla.
Por lo tanto es un código más general y te permite para muchos más casos.
Imaginate una brújula donde Norte está arriba, Este a la derecha, Sur está
abajo y Oeste a la izquierda. Teniendo en cuenta la rotación de las agujas
del reloj la siguiente dirección a Norte es Este, y la siguiente a Este es Sur,y la
siguiente a Sur es Oeste, y la siguiente a Oeste es Norte. previo muestra lo
mismo, pero hacia el lado contrario. El previo a Norte es Oeste, y así
sucesivamente.
Por ejemplo si el procedure Flecha(direccion) recibe la dirección Norte y le aplicás
un siguiente(direccion) estás 'convirtiendo' a ese Norte en un Este. Pero si vos
no utilizarías esto, tendrías que saber previamente que valor tiene direccion y
ahí ya un programa o un procedure en este caso pierde todo sentido ya que
te serviría para solo un caso o un par de casos.
Hola Marcelo... Para entender bien el problema, tenés que volver a ver y
entender mejor la roseta que muestra el problema anterior a este (8.
Dibujando una L) Allí, en el gráfico te explica que "previo" te devuelve la
primer dirección que está ubicada girando en sentido contrario al
movimiento de las agujas de un reloj, "siguiente" te devuelve la primera
dirección que está ubicada girando en sentido al movimiento normal de las
agujas de un reloj. Entonces, "previo" a Norte está Oeste (porque si
partimos desde Norte y giramos una aguja imaginaria de reloj en sentido
contrario al normal, la primer dirección que encontramos es Oeste). Y
"siguiente" a Norte es Este (porque si partimos desde Norte y giramos una
aguja imaginaria de reloj en sentido normal, la primer dirección que
encontramos es Este). Lo mismo aplica para cualquiera de las direcciones
que se elija. "previo" significa "buscar la primer dirección girando hacia la
izquierda", y "siguiente" significa "buscar la primer dirección girando hacia la
derecha". Saludos.
procedure Flecha(direccion){
Mover(previo(direccion))
Poner(Rojo)
Mover(siguiente(direccion))
Mover(siguiente(direccion))
Poner(Rojo)
Mover(previo(direccion))
Mover(siguiente(direccion))
Mover(previo(direccion))
Mover(direccion)
Poner(Rojo)
Mover(opuesto(direccion))
}
te explica que "previo" te devuelve la primer dirección que está ubicada
girando en sentido contrario al movimiento de las agujas de un reloj
Lo mismo aplica para cualquiera de las direcciones que se elija. "previo"
significa "buscar la primer dirección girando hacia la izquierda", y "siguiente"
significa "buscar la primer dirección girando hacia la derecha".
¡Muy bien! Tu solución pasó todas las pruebas
1. procedure CopiarVerdesEnRojas
2. }
3. procedure PonerN(cantidad, color) {
4. repeat(cantidad) {
5. Poner(color)
6. }
7. }
¡Ups! Tu solución no se puede ejecutar
Problemas que encontramos:
Detalles
1. procedure CopiarVerdesEnRojas(){
2. nroBolitas(Verde)
3. PonerN(nroBolitas(Verde),Rojo)
4. }
Buenas tardes; creo que mi procedimiento es correcto y me marca error
2:13 no veo el porque. Gracias
Mayra M. hace 10 meses
¡Hola Matias! Tu solución esta casi perfecta, salvo por un detalle y es que
no es necesario poner nroBolitas(Verde) ya que esa expresión por si sola
solo nos devuelve un número. Si está muy bien como lo utilizaste en el
PonerN.
Solucion Correcta
1. procedure CopiarVerdesEnRojas(){
2. PonerN(nroBolitas(Verde),Rojo)
3. }
¡Muy bien! Tu solución pasó todas las pruebas
0 1
1 1
0 0
0 1
Tablero final
0 1
1 1
0 0
1
0
1 1
0 0
2
1
0
final
0 1
1 1
0 0
22
1
0
1 1
0 0
2
1
0
final
0 1
1 1
0 0
77
1
0
En este ejercicio, además de aprender una expresión nueva, hiciste algo que nunca habías
hecho hasta ahora: un programa cuyo efecto depende del estado del tablero inicial.
SacarTodas(Rojo) produciría esto:
Inicial
0 1 Final
1 1
0 1
4 3 1 1
0 0 Biblioteca
3
22
0 44 3 0
0 1 procedure SacarN(cantidad, color) {
repeat(cantidad) 0 1 {
Sacar(color)
}
}
Mi solucion mal
1. procedure SacarTodas(cantidad,color){
2. SacarN(nroBolitas(cantidad, color)
3. }
SOLUCION CORRECTA
1. procedure SacarTodas(color){
2. SacarN(nroBolitas(color),color)
3. }
¡Terminaste Expresiones!
Repasemos todo lo que aprendiste en esta guía:
Además de los literales que ya venías usando, existen también otro tipo
de expresiones que realizan algún tipo de operación y pueden depender de
dos cosas: de sus parámetros y del estado del tablero.
Aritméticas: +, -, *, div.
De direcciones: opuesto, siguiente, previo.
Númericas: nroBolitas.
Alternativa Condicional
Hasta ahora, todos los programas y procedimientos que hicimos fueron
sobre tableros conocidos, sabíamos exactamente de qué tamaño era el
tablero, dónde estaba el cabezal y cuántas bolitas había en cada celda.
Ejercicios
procedure SacarAzulConMiedo() {
Sacar(Azul)
}
¡Probalo! Copiá el código anterior en el editor y apretá Enviar.
SOLUCION VALIDA
1. procedure SacarAzulConMiedo() {
2. Sacar(Azul)
3. }
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
0 1
1 1
0
1
0 1
FINAL
0 1
1 1
0 1
Cuando no hay ninguna bolita azul, hace BOOM
BOOM
[2:3]: No se puede sacar una bolita de color Azul: no hay bolitas de ese color.
Funcionó para el primer tablero porque tenía una bolita azul, pero
hizo BOOM para el segundo porque estaba vacío, claro.
procedure SacarAzulConMiedo() {
if (hayBolitas(Azul)) {
Sacar(Azul)
}
}
Solucion correcta
procedure SacarAzulConMiedo() {
if (hayBolitas(Azul)) {
Sacar(Azul)
}
}
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
Cuando hay una bolita azul, la saca
0 1
1 1
0
1
0 1
final
0 1
1 1
0 1
1 1
0 1
0 1
1 1
0 1
¡Bien!
procedure SacarAzulConMiedo() {
if (hayBolitas(Azul)) {
Sacar(Azul)
}
}
Solucion
procedure SacarRojoConMiedo() {
if (hayBolitas(Rojo)) {
Sacar(Rojo)
}
}
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
Cuando hay una bolita roja, la saca
0 1
1 1
0
4
0 1
0 1
1 1
0
3
0 1
Cuando no hay ninguna bolita roja, no hace nada
procedure SacarRojaConMiedo() {
if (hayBolitas(Rojo)) {
Sacar(Rojo)
}
}
Solucion
procedure CompletarCelda() {
if (hayBolitas(Negro)) {
Poner(Rojo)
Poner(Azul)
Poner(Verde)
}
}
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
Cuando hay alguna bolita negra, completa la celda con las otras bolitas
de colores rojo, azul y verde
Cuando no hay ninguna bolita negra, no hace nada
0 1
2 2
1 1
0 0
0 1
puedeMover(Norte) será True.
puedeMover(Sur) será True.
puedeMover(Este) será True.
Pero puedeMover(Oeste) será False
procedure puedeMover(direccion){
if(puedeMover(Este))
Mover(Este)
}
¡Ups! Tu solución no se puede ejecutar
Resultados:
0 1
2 2
1 1
0 0
0 1
0 1
2 2
1 1
0 0
0 1
0 1
2 2
1 1
0 0
0 1
0 1
2 2
1 1
0 0
0 1
¿Y si hubieramos querido movernos hacia el Norte en caso de
que no hubiera celdas al Este?
program {if (puedeMover(Este)){
Mover(Este)}
Mover(Norte)
}
Sabiendo esto, intentá crear un programa que ponga 1 bolita negra sólo si hay menos
de 5 bolitas negras.
BOOM
[3:11]: La variable "negro" no está definida.
Original Negada
SOLUCION CORRECTA
procedure AsegurarUnaBolitaVerde(){
if (not hayBolitas(Verde)){
Poner(Verde)
}
}
EXPRESION
COMANDO PALABRA CLAVE
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
Para estos casos, en Gobstones tenemos una nueva palabra clave que nos
ayuda a cumplir nuestra tarea: el else. En castellano significa si no y hace
justamente lo que necesitamos: ejecuta una serie de acciones si no se
cumple la condición que pusimos en el if.
procedure MoverComoSea() {
if (puedeMover(Oeste)) {
Mover(Oeste)
} else {
Mover(Norte)
}
}
Escribí ese código en el editor y fijate cómo resuelve el problema.
Solución valida
procedure MoverComoSea() {
if (puedeMover(Oeste)) {
Mover(Oeste)
} else {
Mover(Norte)
}
}
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
¡Espectacular!
Apagar una celda implica dos cosas: sacar una bolita verde y agregar una
negra; lo mismo para prender pero en sentido inverso.
Para saber si está prendida o no, basta con fijarse si hay bolitas del color que
querramos.
Inicial Final
0 1 0 1
1 1 1 1
1
1 1
1
1
0 0 0 0
1 1
0 1 0 1
Inicial Final
0 1 0 1
1
1 1 1
1
1 1 1 1
1 1
1
1
0 0 0 0
1
1 1 1 1 1
1
0 1 0 1
PrenderOApagarLuz debe utilizar hayBolitas
Resultados:
Otra solución de la consulta que funciona pero hay que corregir el error
procedure PrenderOApagarLuz() {
if (hayBolitas(Verde)) {
Poner(Negro)
Sacar(Verde)
} else {
if (hayBolitas(Negro)) {
Poner(Verde)
Sacar(Negro)
}
}
}
Vicente I. hace 16 días
Hola! Estoy un poco desorientado aqui. Me dice que la solucion que hice funcionó
pero que se podria mejorar el codigo sacando un if... Estuve intentando de
diferentes formas pero no doy con la solucion correcta.. Si algunx me podria
orientar, se lo agradecería
Norman Adrian M. hace 16 días
y se supone que hay verde o negra....con el primer if preguntas si hay verdes..si es
asi la sacas y pones negra..hasta ahi todo bien...pero sino hay verdes usa el else, no
otro if...porque si no esta la verde, Esta la negra...y resta sacar negra y poner ver
if(condicion)
{
//hacemos algo
}
else
{
//hacemos otra cosa
}
Resolucion mia
procedure PrenderOApagarLuz(hayBolitas){
if (hayBolitas(Verde)){
Sacar (Verde)
}
{else (hayBolitas(Negro)){
Poner (Negro)}
}
Resolucion de la consulta bien PERO CON UN ERROR (El Else debe ir con minúscula)
procedure PrenderOApagarLuz(){
if (hayBolitas(Negro))
{ Sacar(Negro)
Poner(Verde)}
Else {
(Sacar(Verde)
Poner(Negro)
}
}
SOLUCION CORRECTA
procedure PrenderOApagarLuz(){
if (hayBolitas(Negro))
{ Sacar(Negro)
Poner(Verde)}
else{
Sacar(Verde)
Poner(Negro)
}
}
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
Si la celda está apagada, la prende
0 1 2
1 1 1
2 2
1 1 1
1 1
1 1 1
0 0
2
0 1
0 1 2
1 1 1
2 2
1 1 1
1 1
1 1 1
0 0
2
0 1
Funciones
Cuando introdujimos la noción de procedimientos, dijimos que:
son una forma de darle nombre a un grupo de comandos, logrando así que
nuestros programas fueran más entendibles;
nos posiblitan la división en subtareas: para resolver un problema grande, basta
con dividirlo en problemas más chicos y luego combinarlos;
nos ayudan a no repetir código, no volver a escribir lo mismo muchas veces.
Al trabajar con expresiones complejas, rápidamente surge la necesidad de contar con un
mecanismo similar, por los motivos que acabamos de esbozar.
¿Querés saber cuál es ese mecanismo? ¡Empecemos!
Ejercicios
procedure MoverSegunBolitas() {
if (nroBolitas(Azul) + nroBolitas(Negro) + nroBolitas(Rojo) + nroBolitas(Verde) > 10) {
Mover(Este)
} else {
Mover(Norte)
}
}
function nroBolitasTotal() {
return (nroBolitas(Azul) + nroBolitas(Negro) + nroBolitas(Rojo) + nroBolitas(Verde))
}
nroBolitasTotal() -> 12
nroBolitasTotal() -> 5
MoverSegunBolitas debe utilizar nroBolitasTotal
Resultados de las pruebas:
Si hay más de 10 bolitas, se mueve al Este
Si hay menos de 10 bolitas, se mueve al Norte
1. function nroBolitasTotal() {
2. return (nroBolitas(Azul) + nroBolitas(Negro) + nroBolitas(Rojo) + nroBolitas(Verde))
3. }
¿Notas que algo se repite entre el código que puse arriba y con el código
que tenemos que modificar?
procedure MoverSegunBolitas() {
if (nroBolitas(Azul) + nroBolitas(Negro) + nroBolitas(Rojo) + nroBolitas(Verde) > 10) {
Mover(Este)
} else{
Mover(Norte)
}
}
function nroBolitasTotal() {
return (nroBolitas(Azul) + nroBolitas(Negro) + nroBolitas(Rojo) + nroBolitas(Verde))
}
MoverSegunBolitas, versión 2
1. procedure MoverSegunBolitas() {
2. if (nroBolitasTotal() > 10) {
3. Mover(Este)
4. } else {
5. Mover(Norte)
6. }
7. }
Ejercicio 4: todasExcepto
Te toca ahora definir tu primera función: todasExcepto(color). Lo que tiene que
hacer es sencillo, contar cuántas bolitas hay en la celda actual sin tener en
cuenta las del color recibido por parámetro.
Por ejemplo, todasExcepto(Verde) debería contar todas las bolitas azules, negras
y rojas que hay en la celda actual (o dicho de otra forma: todas las bolitas
que hay menos las verdes).
Definí la función todasExcepto para que retorne la cantidad de bolitas que no sean del
color que se le pasa por parámetro.
¡Dame una pista!
Ya definimos una función para contar todas las bolitas (nroBolitasTotal()) y
Gobstones ya trae una para contar las de un color en particular
(nroBolitas(color)).
Sólo te queda pensar cómo combinarlas.
todasExcepto() -> 8
BOOM
[2:9]: La función "nroBolitasTotal" espera recibir ningún parámetro pero se la invoca con un
argumento.
Hola buenas noches !!! Estuve realizando el ejercicio y casi estuve cerca de la
respuesta correcta (por lo que veo) lo que no se es como agregar el
nroBolitasTotal () . Intente de varias formas pero nada, si me pueden guiar
por favor, gracias !!
¡Hola Ángeles!
La idea es que la función nos diga cuantas bolitas hay que no sean del color
que llega por párametro, para eso lo que habría que hacer es calcular
cuantas bolitas hay en total (nroBolitasTotal()) y a eso restarle la cantidad de
bolitas del color que llega por párametro (nroBolitas(color)).
Otra solución con error
1. function todasExcepto(color){
2. return(nroBolitastotal()) - nroBolitas(color)
3. }
¡Ups! Tu solución no se puede ejecutar
Resultados:
SOLUCION CORRECTA
1. function todasExcepto(color){
2. return(nroBolitasTotal()- nroBolitas(color))
3. }
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
todasExcepto() -> 8
todasExcepto() -> 10
Las funciones, como cualquier otra expresión, se pueden usar para definir
nuevas funciones.
Y volvemos así a lo más lindo de la programación: la posibilidad de construir
nuestras propias herramientas parándonos sobre cosas que hicimos antes,
logrando que lo que hacemos sea cada vez más poderoso.
444 33
0 0
22 1
444 33
0 0
9 1
function nroBolitasTotal() {
/*
...
*/
}
/*
Nos dice cuantas bolitas hay si no contamos el color recibido por parámetro. Por ejemplo,
si tenemos un casillero con 1 bolita roja, 2 verdes, 3 negras y 4 azules
todasExcepto(Negro) nos retornaría 7 (1 + 2 + 4).
*/
function todasExcepto(color) {
/*
...
*/
}
1. function rojoEsDominante(){
2. return(nroBolitasTotal()> nroBolitas(color))
3. }
Tu solución no pasó las pruebas
Objetivos que no se cumplieron:
rojoEsDominante debe utilizar todasExcepto
BOOM
[2:41]: La variable "color" no está definida.
BOOM
[2:41]: La variable "color" no está definida.
function rojoEsDominante(){
(nroBolitas(Rojo) > todasExcepto(Rojo)){
return True;
}
}
Creo que está bien, pero me sigue dando error. Creo que no está tomando
como definida la función todasExcepto, no me la pone de otro color como
otras.
Mauro G. hace 10 meses
Hola! El código está bien solo que la forma en la cual lo escribiste no es la
correcta. La comparación que estás haciendo dentro de los parentesis te
devuelve un booleano, y todo esto es básicamente lo que debés devolver
con el return. No es una sintaxis correcta hacer esa comparación y devolver
true.
Mayra M. hace 10 meses
¡Hola Paula! Buen dia, como bien dice Mauro el código está bien, solo que
deberias poner la expresión directamente en el return sin el True. Por otro
lado recordá que en Gobstones no ponemos ;
Otra solución con erroren la consulta
function rojoEsDominante(){
if (nroBolitas(Rojo) > todasExcepto(Rojo)){
return True;
}
else {
return False;
}
}
Martin G. MENTORÍA hace 10 meses
¡Hola Fernando!
No hace falta el if que estás haciendo porque nroBolitas(Rojo) >
todasExcepto(Rojo) ya es un expresión booleana, es decir, ya por sí misma tiene
un valor de verdad (true o false) por lo que no nos hace falta verificarlo con un
if. Entonces, hay que retornar la expresión nroBolitas(Rojo) > todasExcepto(Rojo) y
nada más.
SOLUCION CORRECTA
1. function rojoEsDominante(){
2. return(nroBolitas(Rojo) > todasExcepto(Rojo))
3. }
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
Ejercicio 6: En libertad
Queremos definir la función esLibreCostados(), que determine si el cabezal
tiene libertad para moverse hacia los costados (es decir, Este y Oeste).
Pero, ups, hay un problema más; hay que hacer DOS preguntas: ¿se puede
mover al Este? Y ¿se puede mover al Oeste?.
1. function esLibreCostados(){
2. return(puedeMover(Este)&&puedeMover(Oeste))
3. }
function hayAlgunaBolita(){
return (hayBolitas(Verde)||hayBolitas(Rojo)||hayBolitas(Azul)||
hayBolitas(Negro))
}
Agustín V. hace 29 días
Hola! Me está pasando que generalmente puedo hacer los ejercicios, pero
en varias ocasiones en la descripción de los mismos no hay indicios sobre
qué forma del lenguaje (en este caso sería, "hayBolitas()"), debemos usar, y al
lado del editor no hay nada en la biblioteca. Por ejemplo, yo pude resolver
este ejercicio porque primero lo hice mal y luego el mensaje de error me
decía que tenía que utilizar "hayBolitas()", pero sino cómo hubiese sabido yo
eso? No sé si me explico.
SOLUCION CORRECTA
function hayAlgunaBolita(){
return(hayBolitas(Rojo)||hayBolitas(Verde)||hayBolitas(Azul)||hayBolitas(Negro))
}
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
function estoyEnUnBorde(){
return(puedeMover(Norte)|| puedeMover(Sur)&& puedeMover(Oeste)||
puedeMover(Este))
}
1. function estoyEnUnBorde(){
2. return(not(puedeMover(Norte)|| puedeMover(Sur)&&
puedeMover(Oeste)||puedeMover(Este)))
3. }
Tu solución no pasó las pruebas
Resultados de las pruebas:
estoyEnUnBorde() -> True: Se esperaba True pero se obtuvo False.
El cabezal esta en el borde inferior izquierdo
EstoyEnUnBorde() -> True: Se esperaba True pero se obtuvo False
El cabezal esta en el borde medio derecho
estoyEnUnBorde() -> False El cabezal esta en el medio de la celda
SOLUCION CORRECTA
1. function estoyEnUnBorde(){
2. return(not puedeMover(Norte) || not puedeMover(Sur) || not
puedeMover(Este) || not puedeMover(Oeste))
3. }
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
Pero, ¿no era que las funciones eran puras y no tenían efecto real? ¿Qué
pasa si una función hace BOOM?
BOOM
[2:3]: No se puede mover hacia la dirección Oeste: cae afuera del tablero.
¡BOOM!
SOLUCION CORRECTA
1. function hayBolitasLejosAl(direccion,color,distancia){
2. MoverN(distancia,direccion)
3. return (hayBolitas(color))
4. }
¡Muy bien! Tu solución pasó todas las pruebas
Resultados de las pruebas:
hayBolitasLejosAl()-> True Aquí esta a distancia hacia el norte la bolita del cabezal
hayBolitasLejosAl()->True Aquí esta la bolita a distancia y el cabezal en el este
hayBolitasLejosAl() -> False
Se puede realizar cualquier tipo de acción antes de retornar un valor, y
nada de lo que hagamos tendrá efecto real sobre el tablero.
Interesante esto de las funciones, ¿no?
Biblioteca
procedure PonerN(n, color) {
repeat(n) {
Poner(color)
}
}
procedure SacarN(n, color) {
repeat(n) {
Sacar(color)
}
}
procedure MoverN(n, dir) {
repeat(n) {
Mover(dir)
}
}
function hayBolitasAl(direccion, color) {
Mover(direccion)
return (hayBolitas(color))
}
function estoyRodeadoDe(color) {
return (hayBolitasAl(Norte, color))
(hayBolitasAl(Este,color))
(hayBolitasAl(Oeste,color))
(hayBolitasAl(Sur, color))
}
Hola! me estaría costando encontrar el error, necesito ayuda!
Esta soleado
Tengo auto
Hay una playa cerca
Lo que vamos a hacer es definir una función que una esas condiciones con
un Y lógico, ya que queremos que se cumplan las tres a la vez:
function puedoIrALaPlaya(){
return ( estaSoleado() && tengoAuto() && hayPlayaCerca() )
}
Fijate que tomamos las tres condiciones, las unimos con && (nuestro Y
lógico) y tooodo eso lo retornamos.
Ahora en este ejercicio tenemos 4 condiciones que se tienen que cumplir a
la vez:
SOLUCION CORRECTA
1. function estoyRodeadoDe(color) {
2. return (hayBolitasAl(Norte, color)&&
3. hayBolitasAl(Este,color)&&
4. hayBolitasAl(Oeste,color)&&
5. hayBolitasAl(Sur, color))
6. }
Usando estoyEnUnBorde y estoyRodeadoDe, definí hayLimite.
¡Dame una pista!
Biblioteca
function estoyRodeadoDe(color) {
return (hayBolitasAl(Norte, color) && hayBolitasAl(Este, color) && hayBolitasAl(Sur,
color) && hayBolitasAl(Oeste, color))
}
function estoyEnUnBorde() {
return (not puedeMover(Norte) || not puedeMover(Este) || not puedeMover(Sur) ||
not puedeMover(Oeste))
}
}
¡Así es, último ejercicio de Fundamentos! Este ejercicio nos pide que usando
estoyEnUnBorde y estoyRodeadoDe definamos la función hayLimite. Recordá que
para usar las funciones estoyEnUnBorde y estoyRodeadoDe, al igual que cuando
invocamos un procedimiento, sólo debemos escribir su nombre seguido de
() donde de ser necesario indicaremos el parámetro. Entonces, tenemos que
usar estas dos funciones para resolver este ejercicio, la primera estoyEnUnBorde
ya la estas usando. En vez de usar hayBolitasAl necesitamos usar estoyRodeadoDe
que por parámetro tendrá ¿qué color? Por otro lado el límite puede ser por
alguno de estos factores, o por un borde o por estar rodeado. ¿Qué
operador lógico podemos usar cuando necesitamos que alguna de esas dos
condiciones se cumpla? Intentalo y cualquier cosa siempre podés volver a
escribirnos
SOLUCION CORRECTA
1. function hayLimite(){
2. return (estoyEnUnBorde() || estoyRodeadoDe(Rojo))
3. }
hayLimite() -> True No hay ninguna roja y el cabezal en la esquina inferior izquierda
¡Terminaste Funciones!
Esta lección fue bastante intensa, aprendiste unas cuantas cosas:
¡Sigamos programando!
Lecciones
1. Funciones y tipos de datos
3. Variables y procedimientos
1. ¿Y el tablero?
2. Impresión por pantalla
3. Martin Fierro
4. ¿Y los procedimientos?
5. ¿Y el program?
6. Coerciones
7. El círculo de la vida
8. PIenso que así es más fácil
9. Esto no tiene valor
10. Variables globales
11. La buena fortuna
12. ¿Y esto cuánto vale?
4. Lógica booleana
5. Listas
6. Registros
7. Recorridos
Apéndice
¿Querés saber más? Consultá el apéndice de este capítulo
Sin embargo, en los programas "reales" rara vez trabajamos con tableros y
bolitas de colores: la programación va más allá de eso. ¿Cómo es entonces
esto de vivir fuera del tablero?
¡Acompañanos!
Ejercicios
Sin embargo, como siempre que aprendas un lenguaje nuevo, te vas a topar
con un pequeño detalle: tiene una sintaxis diferente . La buena noticia es
que el cambio no será tan terrible como suena, así que veamos nuestra
primera función JavaScript:
function doble(numero) {
return 2 * numero;
}
function doble(numero) {
return (2* numero)
}
10/2
5
2/10
0.2
CONSOLA
function mitad(numero){ return(1/2*numero)}
=> <function>
Solución
function mitad(numero){ return(1/2*numero)}
¡Muy bien! Tu solución pasó todas las pruebas
doble(3)
function doble(numero) {
return 2 * numero;
}
function siguienteDelDoble(numero) {
return doble(numero) + 1;
}
O incluso mejor:
function doble(numero) {
return 2 * numero;
}
function siguiente(numero) {
return numero + 1;
}
function siguienteDelDoble(numero) {
return siguiente(doble(numero));
}
function anteriorDelTriple(numero) {
return triple(numero) - 1;
}
Tu solución funcionó, pero hay cosas que mejorar
Objetivos que no se cumplieron:
anteriorDelTriple debe utilizar anterior
anterior anterior(1) es 0
anterior anterior(10) es 9
triple triple(1) es 3
triple triple(3) es 9
anteriorDelTriple anteriorDelTriple(1) es 2
anteriorDelTriple anteriorDelTriple(3) es 8
anteriorDelTriple anteriorDelTriple(10) es 29
anteriorDelTriple debe utilizar triple
anteriorDelTriple debe utilizar anterior
la solución debe declarar anteriorDelTriple
Detalles
Resultados de las pruebas:
2 == 0
29 == 9
triple triple(1) es 3
triple triple(3) es 9
anteriorDelTriple anteriorDelTriple(1) es 2 Ver detalles
function doble(numero) {
return 2 * numero;
}
function siguiente(numero) {
return numero + 1;
}
function siguienteDelDoble(numero) {
return siguiente(doble(numero));
}
4+5
Math.round(4.5)
funcionMisteriosa(1, 2, 3) (ya la definimos por vos y la podés usar)
Math.round(4.4)
Math.round(4.6)
Math.max(4, 7)
Math.min(4, 7)
CONSOLA
Math.round(4.4)
=> 4
Math.round(4.6)
=> 5
Math.max(4, 7)
=> 7
Math.min(4, 7)
=> 4
extraer(100, 120)
0 //Ups, quisimos sacar más plata de la que teníamos.
//Nos quedamos con $0
Math.max(100 - 30, 0)
70 // da el máximo entre 70 y 0, que es 70
Math.max(100 - 120, 0)
0 // da el máximo entre -20 y 0, que es 0
Solución
1. function extraer(saldo, monto) {
2. return Math.max(..completar.., ..completar..);
3. }
solucion.js:2
return Math.max(saldo-monto), 0);
^
Hola, hice bien el ejercicio (ahi le puse a proposito la "F" mayuscula para
poder ingresar acá) pero no entendi como probarlo en la consola
Solución correcta
Ah, y si estás pensando “en Gobstones podría haber hecho esto con un if”,
¡tenés razón!. Pero esta solución es mucho más breve y simple .
Solución correcta
function esDiaFavorito(diaDelMes) {
return diaDelMes === 1 ;
}
esDiaFavorito(13)
false
esDiaFavorito(1)
true
leGustaLeer(15)
false
leGustaLeer(45)
true
Tu solución no pasó las pruebas PORQUE NO LEI BIEN LA CONSIGNA QUE ES IGUAL O
MAYOR A 20.
Resultados de las pruebas:
CONSOLA
leGustaLeer(15)
=> false
leGustaLeer(20)
=> true
leGustaLeer(30)
=> false
SOLUCION MIA CORRECTA
function leGustaLeer(librosLeidos) {
return librosLeidos >= 20 ;
}
Consola
leGustaLeer(20)
=> true
leGustaLeer(80)
=> true
leGustaLeer(15)
=> false
¡Muy bien! Tu solución pasó todas las pruebas
¡Bien hecho!
Ejercicio 8: Booleanos
Ahora miremos a los booleanos con un poco más de detalle:
Se pueden negar, mediante el operador !: !hayComida
Se puede hacer la conjunción lógica entre dos booleanos (and,
también conocido en español como y lógico), mediante el
operador &&: hayComida && hayBebida
Se puede hacer la disyunción lógica entre dos booleanos (or, también
conocido en español como o lógico), mediante el
operador ||: unaExpresion || otraExpresion
Veamos si se entiende; definí las siguientes funciones:
estaEntre, que tome tres números y diga si el primero es mayor al segundo y
menor al tercero.
estaFueraDeRango: que tome tres números y diga si el primero es menor al
segundo o mayor al tercero
Ejemplos:
estaEntre(3, 1, 10)
true
estaEntre(90, 1, 10)
false
estaEntre(10, 1, 10)
false
estaFueraDeRango(17, 1, 10)
true
Resultados:
solucion.js:1
function estaEntre(60, 40, 75) {
^^
SyntaxError: Unexpected number
false == true
CONSOLA
true
estaEntre(40, 30, 60)
=> true
estaFueraDeRango(3, 1, 10)
=> false
estaFueraDeRango(60, 40, 30)
=> true
¡Bien hecho!
Ya fueron suficientes booleanos y cuentas por ahora, ¿no? Exploremos algo
más interesante: los strings.
Como se observa, todos los strings están encerrados entre comillas simples
o dobles. ¡Da igual usar unas u otras! Pero sé consistente: por ejemplo, si
abriste comilla doble, tenés que cerrar comilla doble. Además, un string
puede estar formado por (casi) cualquier carácter: letras, números, símbolos,
espacios, etc.
¿Y qué podemos hacer con los strings? Por ejemplo, compararlos, como a
cualquier otro valor:
esFinDeSemana("sábado")
true
esFinDeSemana("martes")
false
solucion.js:2
return feriado === sabado || feriado === domingo)
^
SyntaxError: Unexpected token )
esFinDeSemana("sábado")
esFinDeSemana("domingo")
esFinDeSemana("lunes")
esFinDeSemana("jueves")
CONSOLA
esFinDeSemana ("sabado")
=> true
esFinDeSemana ("lunes")
=> false
esFinDeSemana ("domingo")
=> true
longitud("biblioteca")
10
longitud("babel")
5
"aa" + "bb"
"aabb"
"sus anaqueles " + "registran todas las combinaciones"
"sus anaqueles registran todas las combinaciones"
longitudNombreCompleto("Cosme", "Fulanito")
14
solucion.js:2
return longitud ("nombre" + "apellido");
^^^^^^
SyntaxError: Unexpected token return
Biblioteca
/**/
SOLUCION CORRECTA
function longitudNombreCompleto(nombre,apellido){
return longitud(nombre+apellido+1) ESTE MAS 1 ES POR EL ESPACIO DE SEPARACION
}
¡Muy bien! Tu solución pasó todas las pruebas
CONSOLA
longitudNombreCompleto("juan" , "perez")
=> 10