Autor Tema: ¿Cómo sé cuando el dibujo inverso ya fue hecho, sin grabarlo?

0 Usuarios y 1 Visitante están viendo este tema.

02 Noviembre, 2024, 03:42 pm
Leído 585 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Lo modifiqué un poco pero lo que tengo es básicamente esto, veanlo un poco y se los explico:

Al inicio los dibujos de 3x3 quedaron mal porque el grabador tardó en iniciar.
Luego está bien, creo, y casi al final capta dibujos simétricos a otros ya hechos, y esos no los muestra. Por ejemplo:
NBBB
BBBB
BBBB
BBBB
Donde N es negro y B blanco, es simétrico a:
BBBN
BBBB
BBBB
BBBB
que fue mostrado antes (en teoría, porque empieza mostrando una diagonal así / no viene al caso el por qué). Siempre me refiero a simetría considerando un espejo así |; o sea, la izquierda simétrica a la derecha.

Bueno ¿cómo saber cuando un dibujo es simétrico a otro ya mostrado?
Lo he pensado bastante y hasta lo hablé con GPT pero parece que sigo confuso...

En vez de B y N se puede decir 1 y 2, entonces tendríamos que los números más bajos se producen antes, si consideramos que esto:
BBB
BBB
BBN
es:
111
111
112
que es:
111111112
entonces, sé que:
111111211
es simétrico a uno ya hecho ¿pero por qué, cual es la condición, el indicador? Una vez que se obtiene un número así, el programa debe detectar que el simétrico a ese ya fue hecho ¿cómo logro que lo detecte? Tengo que captar el valor, como he puesto, a partir de los colores, y... en ese ejemplo, si el valor de 1 fila es mayor a su inverso, ese dibujo es simétrico a uno ya hecho. Pero eso no sé si sirve siempre, por ejemplo:
BBN
NBB
BBB
Bueno, puede ser que sea así... ¿qué me dicen?

Lo que yo hacía es otra cosa, sólo comparaba 2 valores, concatenaba todo:
Código: [Seleccionar]
} else if (MinCuadraditoPintado < CuadraditoCentraloCD) {
// El dibujo puede ser simétrico...
// a otro ya mostrado. ¿Lo es?
// Captar valor (colores) de cada fila;
// si es mayor al inverso, sí:
Valor = "";
ValorInverso = "";
PunteroDeFilas = 0;
do {
PunteroDeFilas++;
PunteroDeColumnas = 1;
PunteroInverso = CuadraditosPorFila;
do {
Valor = Valor+eval("Cuadradito"+PunteroDeFilas+"_"+PunteroDeColumnas);
ValorInverso = eval("Cuadradito"+PunteroDeFilas+"_"+PunteroInverso)+ValorInverso;
PunteroDeColumnas++;
PunteroInverso--;
} while (PunteroInverso > 0);
} while (PunteroDeFilas < CuadraditosPorFila);
// Preparar Puntero para generar el próximo dibujo:
Puntero = MaxPosiciondePuntero;
if (Valor < ValorInverso) {
// trace ("  El dibujo es simétrico a otro ya mostrado.");
DibujosSimetricos++;
El 1er if es porque, supongo, un dibujo sólo puede ser simétrico a otro ya hecho si en su fila superior tiene pintado un cuadradito a la izquierda, es como una intuición, no sé explicar el por qué ¿uds qué piensan?

Además en Valor < ValorInverso tendría que haber puesto > y otro problema es que estoy concatenando 0s (negro) y 1s (blanco) así que tengo que ajustar todo eso que no me di cuenta xP
Es más fácil que 0 sea no pintado, pero como el color negro es 000000 (00 en rojo, en verde y en azul) y se entiende como 0, uso 0...

Por otro lado, también me gustaría que me ayuden no ya a detectar esos dibujos, sino a evitarlos. Eso tiene puede tener que ver con poner el puntero (el indicador de qué cuadradito se modificará) en cierto sitio en vez de simplemente en el inferior derecho. Lo que hago por ahora es que cuando se pinta el superior central izquierdo pongo el puntero en el superior más derecho, porque en ese momento el dibujo es:
BNBB
BBBB
BBBB
BBBB
y hasta que se pinte el superior más derecho todos los dibujos serán simétricos a otros ya hechos, creo... ¿Hay algún otro truco que pueda usar para evitar que se produzcan simétricos a otros ya hechos?

04 Noviembre, 2024, 04:51 am
Respuesta #1

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Hice esto, no sé si está bien:
Código: [Seleccionar]
// El dibujo puede ser simétrico...
// a otro ya mostrado. ¿Lo es?
// Esto puede cambiar:
DibujoEsSimetrico = "No";
// Captar valor (colores) de cada fila;
// si alguna es menor al inverso, sí:
PunteroDeFilas = 0;
do {
Valor = "";
ValorInverso = "";
PunteroDeFilas++;
PunteroDeColumnas = 0;
do {
PunteroDeColumnas++;
Valor = Valor+eval("Cuadradito"+PunteroDeFilas+"_"+PunteroDeColumnas);
ValorInverso = eval("Cuadradito"+PunteroDeFilas+"_"+PunteroDeColumnas)+ValorInverso;
} while (PunteroDeColumnas < CuadraditosPorFila);
// trace("Valor: "+Valor);
// trace("ValorInverso: "+ValorInverso);
if (Valor < ValorInverso) {
DibujoEsSimetrico = "Sí";
break;
}
} while (PunteroDeFilas < CuadraditosPorFila);
if (DibujoEsSimetrico == "Sí") {
// trace ("  El dibujo es simétrico a otro ya mostrado.");
DibujosSimetricos++;
// Al Puntero ponerlo al final de la fila...
// captada como simétrica, para posiblemente...
// evitar algunos otros dibujos simétricos:
Puntero = CuadraditosPorFila*PunteroDeFilas;
}

EDIT: Asumo que esto poco tiene que ver con Matemática o no les interesa o no saben, así que no hablo más del tema, pero quería aclarar que me equivoqué, dejo el razonamiento que escribí:
Citar
1er captado:
NBN   010
BBN   110
NNB   001
El simétrico es:
NBN   010
NBB   011
BNN   100
Creo que no es simétrico a uno ya realizado, porque si nos basamos en la última línea sí, antes de NBB se produjo BNN, pero la 2nda línea indica que el 1er dibujo es anterior al 2ndo. Los dibujos con números más altos se hacen 1ero.
010110001 >
010011100
¿entonces mi método anterior estaba bien? ¿por qué lo cambié? Antes de ver debo comer.
Me confunde que parece haber 2 perspectivas correctas, aunque contradictorias. Tengo escrito:
"NBNN se está considerando simétrico pero no está bien porque NNBN no se hizo". O sea:
NBNN   NNBN
0100   0010
Ya he visto que si tiene Bs a la izquierda, no se hizo, por ejemplo:
BBBN   NBBB
No, ya se hizo. Bs a la izquierda se hizo antes.
1110   0111   Número mayor se hizo antes.
Bueno, entonces: NBNN, 0100, se hizo antes que NNBN, 0010. Ok. Entonces mi método anterior, concatenar toda fila, estaba bien, pero no es necesario, basta ir chequeando filas y:
> Si el valor > al inverso, el dibujo es ok.
> sino, si el valor < al inverso, es simétrico.
> sino (==) hay que seguir probando.
A ver, si tengo BBBN, es 1110, que es > 0111, y está ok. Si tengo el caso inverso, lo inverso, ok. Lo aplico.
Ahora el 1er simétrico captado es:
NBN
BNB
NBB
Correcto. Continué probando y parece bien.

Código: [Seleccionar]
} else if (MinCuadraditoPintado < CuadraditoCentraloCD) {
// El dibujo puede ser simétrico...
// a otro ya mostrado. ¿Lo es?
// Esto puede cambiar:
DibujoEsSimetrico = "No";
// Captar valor (colores) de cada fila;
// si alguna es menor al inverso, sí:
PunteroDeFilas = 0;
do {
Valor = "";
ValorInverso = "";
PunteroDeFilas++;
PunteroDeColumnas = 0;
do {
PunteroDeColumnas++;
Valor = Valor+eval("Cuadradito"+PunteroDeFilas+"_"+PunteroDeColumnas);
ValorInverso = eval("Cuadradito"+PunteroDeFilas+"_"+PunteroDeColumnas)+ValorInverso;
} while (PunteroDeColumnas < CuadraditosPorFila);
// trace("Valor: "+Valor);
// trace("ValorInverso: "+ValorInverso);
if (Valor < ValorInverso) {
DibujoEsSimetrico = "Sí";
break;
} else if (Valor > ValorInverso) {
// Es ok:
break;
}
} while (PunteroDeFilas < CuadraditosPorFila);
// Este if es probablemente innecesario,
// porque se supone que el dibujo será simétrico u ok,
// antes de que se terminen de comparar todas las filas.
if (DibujoEsSimetrico == "Sí") {
// trace ("  El dibujo es simétrico a otro ya mostrado.");
DibujosSimetricos++;
// Al Puntero ponerlo al final de la fila...
// captada como simétrica, para posiblemente...
// evitar algunos otros dibujos simétricos:
Puntero = CuadraditosPorFila*PunteroDeFilas;
gotoAndStop (5);
// Variar();
} else {
DibujosOk++;
// trace ("  Mostrando dibujo nro: "+DibujosOk);
// Preparar Puntero para generar el próximo dibujo:
Puntero = MaxPosiciondePuntero;
play ();
}

También parece que, cuando hay pintados seguidos desde el principio de la fila, pintar el del final no evita simetría a un dibujo anterior. En fin, seguiré pensando, pero no comentando aquí.