Autor Tema: ¿Cuando un dibujo es simétrico a uno anterior?

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

18 Octubre, 2024, 03:57 am
Leído 446 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Mi programa produce dibujos en blanco y negro. Empieza así:
BBBN
BBNB
BNBB
NBBB
No viene al caso por qué. Cada letra representa el color de uno de sus cuadraditos.

Va pintando desde abajo hacia la izquierda, haciendo todas las combinaciones posibles:
BBBN
BBNB
BNBB
NBBN
luego:
BBBN
BBNB
BNBB
NBNB
luego:
BBBN
BBNB
BNBB
NBNN
etc.

Según lo entiendo, el 1er simétrico que debe captar es:
BNBB
BBBB
BBBB
BBBB
es simétrico a:
BBNB
BBBB
BBBB
BBBB
Simétrico se refiere a que si se invierte cada fila, el dibujo queda como alguno anterior, ya producido. Ese de abajo se produjo antes que el de arriba.

Según eso, un dibujo puede ser simétrico desde que se pinta el cuadradito de arriba, anterior al medio, es:
Math.floor(CuadraditosPorFila/2);
En este caso, como hay 4 cuadraditos por fila, va a ser 4/2, que da 2.

¿Pero cómo indico a la PC cuando es anterior y cuando no? Pensé que debí invertir cada fila y si la inversión era igual entonces era simétrico, pero eso es otra cosa. Por ejemplo:
NBBN
BBBB
BBBB
BBBB
visto al revés (las filas) es igual, pero ese dibujo, al derecho o al revés, no se produjo antes.

Lo que se me ocurre tiene que ver con cómo puede ser descrito con números el dibujo, pero no sé la solución detallada y busco una más simple. Por ejemplo este dibujo:
BNBB
BNBN
BBBB
BBBB
que por cierto, visto al revés no es igual, pero ya fue producido su contrario, puede ser descrito como:
0100010100000000
si al invertir cada fila, el número es menor:
0010101000000000
entonces el dibujo ya fue producido.
No sé si funciona. ¿Qué me recomiendan?

Aquí tienen un video, no presten atención a lo de aislados y pequeños, sólo tengan en cuenta que si un dibujo es considerado aislado o pequeño no será considerado simétrico, ni Ok. Igual como dije mi contador de simétricos está mal. Así es ese contador:
Código: [Seleccionar]
// ¿El dibujo es simétrico a otro ya mostrado?
// Esto puede que cambie:
DibujoEsSimetrico = "No";
if (SimetriaPosible == "Sí") {
// Se captarán los colores de cada fila y al revés:
// Si son distintos, ya no, el dibujo no es simétrico.
Fila = 0;
// Para captar de una nueva fila:
do {
ColoresDeFila = "";
InversionDeFila = "";
Fila++;
Columna = 0;
ColumnaInversa = CuadraditosPorFila+1;
// Captar nueva fila:
do {
Columna++;
CuadraditoaCaptar = (Fila-1)*CuadraditosPorFila+Columna;
ColoresDeFila = ColoresDeFila+eval("ColordeCuadradito"+CuadraditoaCaptar);
ColumnaInversa--;
InversoaCaptar = (Fila-1)*CuadraditosPorFila+ColumnaInversa;
InversionDeFila = InversionDeFila+eval("ColordeCuadradito"+InversoaCaptar);
} while (Columna<HastaColumna);
// ¿Los colores en las filas son simétricos?
trace ("ColoresDeFila: "+ColoresDeFila);
trace ("InversionDeFila: "+InversionDeFila);
if (ColoresDeFila != InversionDeFila) {
// DibujoesSimetrico = "No";
// Terminar el análisis:
Fila = CuadraditosPorFila;
}
} while (Fila<CuadraditosPorFila);
if (ColoresDeFila == InversionDeFila) {
DibujoEsSimetrico = "Sí";
// trace ("  El dibujo es simétrico a otro ya mostrado.");
DibujosSimetricos++;
// Preparar Puntero para generar el próximo dibujo:
Puntero = MaxPosiciondePuntero;
Variar();
}
Está mal.

El video:

20 Octubre, 2024, 09:53 am
Respuesta #1

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Creo que ya hallé la respuesta, es que si hay un cuadradito pintado en la izquierda de la fila superior, debe haber alguno en la derecha de dicha fila.

Por ejemplo: NNBB
ya fue producido, su simétrico, con BBNN.

En cambio, BNBN, no, porque ese sería NBNB pero el mínimo cuadradito pintado hasta ahora fue el 2, no el 1.

El centro no aplica, debe ser a la derecha del centro. Por ejemplo: BNNBB
fue producido, su simétrico, con BBNNB

El cuadradito izquierdo más cercano al centro es:
Floor(Largo/2)

El cuadradito derecho más cercano al centro creo que es:
Ceil(Largo/2)+1
Ejemplos:
Código: [Seleccionar]
3/2 = 1.5 su ceil = 2 +1=3
4/2 = 2 su ceil = 2 +1=3
5/2 = 2.5 su ceil = 3 +1=4
Quisiera que me digan si está bien y si se puede simplificar esa fórmula.