jueves, 2 de julio de 2015

Sesión 7: Completando la Cara Amarilla

Tras completar la cara blanca, tenemos la cara amarilla incompleta hacia arriba. Es el momento de empezar la segunda etapa consistente en completar esta cara, pero sin que sus vértices estén ordenados. Todo esto, por supuesto, sin deshacer la cara blanca que tanto esfuerzo le ha costado a nuestro robot montar (y a nosotros programar).

Para ello fijémonos en la siguiente imagen:


Esta tabla nos muestra los ocho posibles casos que nos podemos encontrar cuando empecemos a estudiar la cara amarilla. Si la F nos señala la cara frontal del cubo, los cuatro cuadrados  de cada dibujo nos muestran las cuatro caras superiores de los cuatro vértices: estas caras pueden ser la amarilla... O no serlo: en este caso se mostrarán de color gris y las "solapas" amarillas nos mostrarán la situación de la cara amarilla que se ofrecerían, llegado al momento, a los sensores que leen las caras frontal y derecha. Quede claro que el vértice que se ve abajo a la derecha en cada dibujo es el que se ofrece al sensor triple de colores.

Si consideremos que en cada vértice la cara amarilla puede estar en tres caras diferentes y que hay cuatro vértices, las combinaciones serían 3 elevado a cuatro, esto es... ¡81 combinaciones diferentes!. En realidad no son tantas: muchas no son mecánicamente posibles * (por ejemplo, en los ocho casos arriba mostrados ninguno tiene tres caras amarillas hacia arriba). Eso elimina muchas posibilidades dejándolas sólo en 27 casos reales. Por otra parte, estos 27 casos posibles, si los giramos en sentido horario 90º, 180º, o 270º, coinciden unos con otros: en realidad, a efectos de resolución, sólo son dignos de consideración los 8 casos mostrados.

Recordamos que se ha dicho aquí que la secuencia A es la que completa la cara amarilla aunque con los vértices desordenados. Dependiendo de cual de los ocho casos nos encontremos aplicaremos la secuencia A un número de veces diferentes. O no la aplicaremos, si nos encontráramos con el caso 8. En realidad, al aplicar la secuencia A vamos pasando de uno de los ochos casos a otro hasta completar un recorrido que debe terminar en el caso 8 como se muestra a continuación.



Dicho de otra manera, cada flecha roja en el esquema de abajo es una aplicación de la secuencia A. Pero, como veremos posteriormente, la cosa no es tan simple.

Veamos cómo se programa esto en el robot. Lo primero es crear una variable de nombre sumatrinaria: se trata del valor equivalente decimal que tendría un número en base 3 de cuatro dígitos. Para los que no entiendan esto útimo, nos referimos a un número de cuatro cifras donde cada una de estas cifras sólo pueden adoptar los valores 2, 1 y 0. Como ejemplos valdrían 2102 , 0112 , 1021,  2222 ó 0000. El valor decimal equivalente lo obtenemos si sumamos el resultado de multiplicar el primer dígito por 27 (3 al cubo), el segundo dígito multiplicado por 9 (3 al cuadrado), el tercer dígito por 3 (3 elevado a uno) y el cuarto dígito por 1 (3 elevado a cero). Así, el equivalente decimal de 2102 sería 2x27 + 1x9 + 0x3 + 2x1 = 65. La cifra más alta (2222) ofrecería un valor equivalente decimal de 80 y la más baja (0000) equivaldría a 0.


Empezamos asignándole a sumatrinaria el valor 0: constante 0 (maletín con candado) = variable sumatrinaria (maletín).
A continuación aparece el bloque personalizado suma 27. Si lo abrimos vemos en su interior:


Son los ya conocidos bloques personalizados Mesaderecha, Leeresquina y uno nuevo 0o1o2. Si abrimos este último vemos


En este bloque si, tras la lectura del sensor triple de colores, el color amarillo (valor 4) apareciera en la cara superior del vértice, la variable 210 valdría cero. Si aparece en la cara frontal, 210 valdrá 1. Y si el amarillo aparece en la cara derecha, 210 valdrá 2.


A continuación, multiplicamos 210 por 27 y se lo sumamos a sumatrinaria.

Si volvemos al programa principal 22jun, el siguiente bloque personalizado es Suma 9: es idéntico a suma 27 con la diferencia de que el valor de la variable 210 se multiplica por 9 antes de sumarse a sumatrinaria. Lo mismo podemos decir de Suma 3: la varialbe 210 se multiplica por 3 y se suma a sumatrinaria.


Por último, los bloques Mesaderecha, Leeresquina, 0o1o2 y Suma 1 (me olvidé de agruparlos en un solo bloque) nos aportan el último sumando para el cálculo de la variable sumatrinaria. Este me permitirá distinguir en cuál de los 8 casos se encuentra la cara amarilla del cubo.

Tras un nuevo bloque Mesaderecha, llegamos a un nuevo bloque personalizado: PresecA. Si lo abrimos, vemos...


Así, dependiendo del valor de sumatrinaria ejecutaremos una de 27 secuencias posibles. En la secuencia mostrada en la imagen superior, como resultado de que sumatrinaria valga 13, aparecerá un mensaje en pantalla indicando "Caso 3", le adjudicará a la nueva variable CasosecA el valor 3 y girará la bandeja dos veces hacia la izquierda.

Si hemos entendido lo que hemos hecho (y si no lo hemos entendido, no importa: se explica a continuación), podemos pensar que sería útil publicar aquí una tabla con los 27 valores posibles de sumatrinara, las equivalencias con los 8 casos posibles y los giros que hay que darle al cubo en consecuencia para que coincidan. Pero creo que es algo que se le puede pedir al alumnado. Por ejemplo:
  • el caso 1 se puede presentar de cuatro maneras distintas si, además, giramos su dibujo 90º, 180º ó 270º en sentido horario.
  • el caso 2 sólo puede presentarse de dos  maneras: como se ve en la tabla primera o girado 90º.
  • el caso 8 sólo puede presentarse de una manera: no importa cómo lo giremos.

Si sacamos las 27 maneras en que pueden presentarse en total los 8 casos, podremos calcular los números correspondientes en base 3 y sus equivalentes decimales, además de los giros de bandeja necesarios para que se coloque como se ve en la tabla inicial, lo que tenemos es un bonito ejercicio para que lo hagan los alumnos.

Ahora es cuando explicamos lo que ha hecho el programa: tras el primer giro de la bandeja, esta cara superior de la esquina en estudio (la que se encuentra abajo a la derecha cada dibujo) con el color amarillo hacia arriba en el espacio:  el primer sumando de sumatrinaria valdrá 0x27


A continuación, tras girar el cubo a la derecha, se ha encontrado que la cara amarilla está en la cara frontal. El segundo sumando valdrá 1x9
Tras volver a gira el cubo hacia la derecha, se ha encontrado que la cara amarilla se muestra en la cara frontal: el tercer sumando valdrá 1x3

Y tras el cuarto giro a la derecha,nuevamente la cara amarilla se encuentra en la cara frontal: el cuarto sumando valdrá 1x1.

Sumatrinaria valdrá 0+9+3+1 = 13 y volvemos a girarlo a la derecha dejándolo en la posición inicial.



En consecuencia, identificamos el caso como el 3 de los ocho casos posibles (variable CasesecA = 3) y lo reorientamos girándolo dos veces a la izquierda para que se quede con la orientacion mostrada en la primera tabla primera donde veíamos los ocho casos posibles de la cara amarilla.

En resumen, tras encargarse el bloque PrepsecA de identificar el caso y de girar el cubo para que la cara amarilla incompleta quede orientada como aparece en la tabla primera de esta entrada, el cubo está listo para aplicarle la secuencia A el número de veces que sea necesario. De esto se encarga el bloque personalizado SecAyMesaIq que viene a continuación. Si lo abrimos...


... vemos que si la variable CasosecA vale 3, le aplicamos una secuencia A. Tras los cual  obtenemos un caso 6, pero girado 90º a la derecha:...

... Habrá que girarlo 90º a la izquierda para tener el aspecto de la tabla primera.

 


 Si aplicamos una nueva secuencia A, mostrará un caso 4...


...que necesitará también ser girado a la izquierda para ofrecer el ángulo que tiene en la primera tabla


A continuación, tras otra secuencia A llegamos a un caso 7 también girado a la derecha: 



Es necesario pues, otro giro a la izquierda.



Tras una última secuencia A, llegamos al caso 8: hemos completado la cara amarilla, pero con los vértices desordenados.


 Por eso decíamos que la cosa no es tan simple como se muestra en este gráfico.


 Hay que clarificar cuando es necesario aplicar estos giros a la izquierda entre un caso y otro para reorientar la cara amarilla de acuerdo a la tabla primera. Son sólo tres casos:
  • en la transición de 3 a 6
  • en la transición de 6 a 4
  • en la transición de 4 a 7
Así, éstas son las tareas necesarias dependiendo del caso que nos encontremos
Caso 1: Secuencia A + Secuencia A
Caso 2: Secuencia A + Secuencia A + Secuencia A
Caso 3: Secuencia A+ Mesaizquierda + Secuencia A + Mesaizquierda + Secuencia A + Mesaizquierd + Secuencia A
Caso 4: Secuencia A + Mesaizquierda + Secuencia A
Caso 5: Secuencia A + Secuencia A + Mesaizquierda + Secuencia A + Mesaizquierda + Secuencia A
Caso 6: Secuencia A + Mesa Izquierda + Secuencia A + Mesa Izquierda + Secuencia A
Caso 7: Secuencia A
Caso 8: mensaje en pantalla "Secuencia A innecesaria".

Lo que la secuencia A hace realmente es
- no afectar a la cara contraria
- intercambiar la posicion de las piezas situadas en la 1ª y  3ª esquina, dándole un giro en sentido antihorario a la que ocupará la esquina 1ª
- intercambiar la posición de las piezas situadas en la 2ª y 4ª esquina, dándole un giro en sentido horario a la que ocupará la esquina 4ª.

Ya tenemos el cubo con la cara superior blanca completada y ordenada y la cara opuesta amarilla completada sin ordenar. En la siguiente sesión veremos cómo ordenar esta cara y como cuadrar las dos caras para tener el cubo completamente resuelto.


*Salvo que desmontemos el cubo y lo montemos en una configuración imposible a caso hecho.

miércoles, 1 de julio de 2015

Sesión 8: Ordenando la Cara Amarilla

Tras dejar la cara amarilla completada pero desordenada, llega el momento de ordenarla. Se dijo en su momento que para ello utilizábamos la Secuencia B. Reiteradamente, si fuera necesario. Pero una vez más, la cosa no es tan sencilla.

La secuencia B consiste en estos 12 movimientos que ya tenemos reunidos en un bloque personalizado del mismo nombre.

Básicamente lo que consigue es permutar 3 de los cuatro vértices de la cara amarilla, sin cambiar la cara blanca opuesta ya terminada.

Para que la comprender y aplicar la secuencia B, supongamos que vemos el cubo tomando como frontal la cara señalada por la F.


Si ordenamos los vértice de izquierda a derecha y de arriba a abajo, vemos que la secuencia coloca el primer vértice en el lugar del tercero, el segundo en el lugar del primero y el tercero en el lugar del segundo. El cuarto vértice, que podemos tomar como referencia, no se mueve.




Esto nos permitiría resolver el caso mostrado. O, si aplicamos la secuencia dos veces, resolverla para el caso de que el vértice amarillo-rojo-verde estuviera en el primer lugar, el vértice amarillo-naranja-azul en el segundo y el amarillo-verde-naranja en el tercero. Pero hay otras combinaciones que no se resolverían simplemente por la aplicación reiterada de la secuencia B. Al menos, tomando el vértice amarillo-azul-rojo como referencia inmóvil.

¿Cuantas combinaciones podemos encontrarnos? Si tomamos la cuarta esquina (amarillo-azul-rojo) como referencia, la siguiente esquina en ofrecerse al lector del colores tras un bloque Mesaderecha sería la que hemos llamada tercera esquina y ésta ofrecerías tres posibilidades (los trés vértices restantes). Si volvemos a gira la bandeja hacia la derecha para leer la que hemos llamado primera esquina, para cada una de aquellas tres posibilidadades, sólo hay dos posibilidades (los dos vértices restantes) que dejan también definidos los colores por eliminación de la que sería la última esquina por leer: la segunda (en otras palabras: no es necesario muestrear esta segunda-última esquina).

En consecuencia, si tomamos la cuarta esquina (amarillo-azul-rojo) como referencia, sólo hay seis casos posibles (3x2) en esta cara amarilla desordenada. Sólo falta definir qué combinación de secuencias B sería necesaria para ordenar esta cara amarilla en cada uno de estos 6 casos. Bueno, tres están ya definidos: los dos comentados y el caso de que nos encontráramos la cara amarilla ya ordenada y no fuera necesario aplicar la secuencia B.

Retomemos el programa principal 22jun en el punto en que lo dejamos.



Si abrimos el primer bloque personalizado Enc esqAmAzR,...


 ... vemos que consiste en
  • Un giro de la bandeja del cubo hacia la izquierda (Mesaizquierda)
  • Un muestreo de los colores del vértice (Leeresquina)
  • Un cálculo del valor numérico identificativo de esa esquina (Proddiv)
  • Una comparación del valor Proddiv obtenido con la constante 96
  • Que todo los anterior está dentro de un bucle condicionado a que la variable Proddiv sea igual a 96.
  • Y un mensaje en pantalla del ladrillo.

Básicamente se trata de girar para comprobar si está ahí el vértice amarillo-azul-rojo, que convertiremos en referencia. Si lo encontramos, saldremos del bucle y un mensaje en pantalla nos dirá que ya lo ha encontrado. Si no, volverá a empezar el bucle hasta que encuentre el vértice girando el cubo.

Este sería un buen momento para mostrar los valores numéricos de la variable Proddiv que tendrían estos vértices.


Aunque es obvio que en estos momentos sólo nos interesan las cuatro primeras combinaciones, me gustaría resaltar que hay valores de Provdiv que coinciden con otros de la cara blanca como 30, 120, 600 ó 720. Esto no debería significar ningún problema porque, cuando resolvíamos la cara blanca del cubo, lo primero que hacíamos era comprobar si el vértice tenía una cara blanca. Esto evita la confusión con los vértices con una cara amarilla.

El siguiente bloque personalizado del programa principal es  SecByMesas.



Si lo abrimos,...


... vemos que lo primero que hace es girar a la derecha, muestrear los colores del vértice y calcular la variable Proddiv de este vértice. Este vértice es el que llamamos tercero puesto que anteriormente habíamos hallado el vértice cuarto (am-az-ro) para usarlo como referencia.

A continuación, y dependiendo del valor Proddiv de este tercer vértice (120, 400 ó 720), escogemos un "camino" entre los tres posibles de una bifurcación (el que se muestra en la ilustración es el asociaciado a 400. Pero en su primeros cinco bloques no es diferente de los otros dos).

Dentro de estos tres "caminos" giramos otra vez la bandeja a la derecha, muestreamos los colores de la esquina y calculamos el valor Proddiv de ésta, que sería la llamada primera esquina. Este valor sólo puede ser uno de los restantes: si 96 era el valor de la referencia y, en el caso mostrado en la ilustración, la tercera esquina valía 400, las esquina que estamos estudiando ahora sólo puede tener como valores 120 ó 720. Por eso, la bifurcación dirigida por este valor es de las "clásicas" o de "dos caminos". Pero antes de hacer estos "itinerarios" conviene girar la bandeja dos veces a la izquierda para devolver el vértice am-az-ro a la esquina cuarta (o de referencia).

Estos dos "caminos" son:
  • el primero, es el ejemplo que se indicó gráficamente al principio de la entrada. Basta con aplicar una secuencia B para que la cara amarilla quede completada y ordenada.
  • el segundo es más complicado: para su resolución son necesarias dos secuencias B, dos giros de la bandeja a la derecha y otra secuencia B más.

De las seis posibilidades de ordenación que ofrece la cara amarilla, tres ofrecen cierta complicación. Para hallar la combinación de secuencias B y de giros de bandeja que permita su resolución es necesario cierto ejercicio mental con la ayuda de un lápiz y un papel que se le puede exigir a los alumnos.

En todo caso, las seis posibilidades con las seis secuencias que ordenan la cara amarilla se muestran a continuación.
  • Esquina 3ª (120) + esquina 1ª (400) = Mesaizquierda + Mesaizquierda + Secuencia B.
  • Esquina 3ª (120)+ esquina1ª (720) = Mensaje en pantalla "Secuencia B innecesaria": la cara amarilla está ya ordenada.
  • Esquina 3ª (400) + esquina 1ª (120) = Secuencia B
  • Esquina 3ª (400) + esquina 1ª (720) = Secuencia B + Secuencia B + Mesaderecha + Mesaderecha + Secuencia B
  • Esquina 3ª (720) + esquina 1ª (120) = Secuencia B + Mesaderecha + Mesaderecha + Secuencia B
  • Esquina 3ª (720) + esquina 1ª (400) = Mesaizquierda + Secuencia B
Ya tenemos la cara amarilla completada y ordenada al igual que su cara opuesta blanca. Ya sólo nos queda girar una de ellas para que coincidan los colores de sus caras adyacentes. De eso se encargan los dos siguientes bloques personalizados del programa principal 22jun.

El primero es Enc esqAm-Az-R: ya lo conocemos de antes. Es el que gira la bandeja hasta encontrar el vértice amarillo-azul-rojo.
El segundo es Tachan (pronúnciese Ta-chán: es la coda del programa). Si lo abrimos, ...


...vemos que, una vez encontrada el vértice am-az-ro, damos dos volteos: ahora tenemos la cara blanca hacia arriba y la amarilla hacia abajo. Acto seguido, leemos un vértice de la cara blanca ordenada y calculamos su valor Proddiv para elegir una de las cuatro posibilidades de la bifurcación siguiente.
  • si el vértice encontrado es el blanco-negro-verde (120): hace falta girar 90º la cara amarilla (ahora cara inferior) a la izquierda.
  • si el vértice encontrado es el  blanco-verde-rojo (216): hace falta girar 90º la cara amarilla dos veces a la izquierda (o a la derecha).
  • si el vértice encontrado es el blanco-azul-negro (720): no hace falta nada. La cara blanca y la amarilla ya coinciden en sus caras adyacentes.
  • si el vértice encontrado es el blanco-rojo-azul (900): hace falta girar 90º la cara amarilla hacia la derecha.
En este vídeo vemos una demostración casi completa de la secuencia B (empieza a grabar ya empezada la secuencia A  y se queda el móvil sin batería justo antes de terminar).



Demasiado exhaustos para acordarnos de poner un mensaje en pantalla o un pitido (*) celebrando que hemos terminado de programar la resolución del cubo, colocamos el bloque Stop y finalizamos la ejecución del programa.

En este otro vídeo empezamos ofreciéndole al prototipo el cubo con la cara blanca ya realizada. Evidentemente, aun así comprueba las ocho esquinas en busca de vértices con caras blanca. Es interesante porque perfectamente la secuencia A y la secuencia B, equivocándose sólo en el momento del Tachán: estaba depurando el programa.



Este otro vídeo muestra la resolución completa con un error al final del todo en la secuencia B: comienza a aplicarla sin tener la precaución de hacer dos giros de bandeja a la izquierda para volver a la esquina de referencia. De ahí el fallo último.


(*) En líneas generales, no conviene colocar a modo de "chivatos" bloques "visualizar" con gráficos o bloques "sonido" variados, para no engordar innecesariamente el tamaño del programa compilado: ya sabemos que con los 70 KB de la memoria del ladrillo vamos muy justitos. Nuestros chivatos serán mensajes de texto y un único tipo de pitido.