Autor Tema: Contar cuántos cuadraditos pintados aislados hay en un dibujo.

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

02 Junio, 2024, 08:10 pm
Leído 1018 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Por ejemplo aquí se considera que no hay:

En este contexto lo blanco no se considera pintado, es fondo. Todos los cuadraditos pintados tienen al menos 1 pintado al lado (diagonal también cuenta).

Estoy haciendo un generador de dibujos así y quiero que no muestre (o que no genere, sería lo ideal) los que tengan cierta cantidad de cuadraditos pintados aislados. La cantidad depende del tamaño del dibujo, no importa aquí cual es. El dibujo se va modificando de a 1 cuadradito, se pinta uno, o se despinta uno (o más) y se pinta otro. Así, debo hacer algo como:
- Cuando se pinte uno nuevo, mirar si al lado hay otro. Si no hay, incrementar el contador de aislados. Si hay, ver si ese o esos estaban aislados, en cuyo caso disminuir el contador cuanto corresponda (según cuantos eran los aislados).
- Cuando se despinte uno, mirar si hay cuadraditos pintados al lado. Si no hay, disminuir el contador de aislados. Si hay, mirar al lado de cada uno y aumentar el contador de aislados por cada uno que haya quedado aislado.

Mi pregunta es: ¿Hay un modo más fácil? ¿es posible que lo haga GPT o algo así? Es que es mucho código... Por ahora hice esto y luego vi que no sirven else ifs, sólo ifs:
Código: [Seleccionar]
// Para juzgar:
// ¿El dibujo tiene menos de Largo/2 cuadraditos aislados?
// Se actualizará el contador de pintados aislados:
// De cada pintado al lado del recién pintado,
// se verá si estaba aislado,
// en cuyo caso disminuirá el contador.
// Si no hay pintados al lado del nuevo, aumentará.
CuadraditoAislado = "Sí";
// ¿El modificado es el inferior derecho?
if (Puntero == MaxPosiciondePuntero) {
// Sí, ver el -1 (izquierdo), -L (up) y -L-1 (iu):
// xSS
// xS*
if (eval("ColordeCuadradito"+(Puntero-1)) == 1) {
CuadraditoAislado = "No";
}


if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila-1)) == 1) {
CuadraditoAislado = "No";
}
} else if (Puntero > MinCuadraditoInferior) {
// Inferior no en una esquina,
// contar el +1 (derecho), -1, -L+1 (du), -L y -L-1:
// SSS
// S*S
if (eval("ColordeCuadradito"+(Puntero+1)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero-1) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila+1)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila-1)) == 1) {
CuadraditoAislado = "No";
}
} else if (Puntero == MinCuadraditoInferior) {
// Inferior izquierdo,
// contar el +1, -L+1 y -L:
// SSx
// *Sx
if (eval("ColordeCuadradito"+(Puntero+1)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila+1)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila)) == 1) {
CuadraditoAislado = "No";
}
} else if (Puntero > CuadraditosPorFila) {
// No es superior.
if (Puntero%CuadraditosPorFila == 0) {
// Central derecho,
// contar el +L, +L-1, -1, -L y -L-1:
// xSS
// xS*
// xSS
if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila-1)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero-1)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila-1)) == 1) {
CuadraditoAislado = "No";
}
} else if (Puntero%CuadraditosPorFila != 1) {
// Central, contar todos los contiguos:
// SSS
// S*S
// SSS
if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila+1)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila-1)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero+1)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero-1)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila+1)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila-1)) == 1) {
CuadraditoAislado = "No";
}
} else {
// Central izquierdo,
// contar el +L+1, +L, +1, -L+1 y -L:
// SSx
// *Sx
// SSx
if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila+1)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero+1)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila+1)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila)) == 1) {
CuadraditoAislado = "No";
}
}
} else if (Puntero == CuadraditosPorFila) {
// Superior derecho,
// contar el +L+1, +L y +1:
// *Sx
// SSx
if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila+1)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero+1)) == 1) {
CuadraditoAislado = "No";
}
} else if (Puntero > 1) {
// Superior cemtral,
// contar el +L+1, +L, +L-1, +1 y -1:
// S*S
// SSS
if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila+1)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila-1)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero+1)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero-1)) == 1) {
CuadraditoAislado = "No";
}
} else {
// Superior izquierdo,
// contar el +L+1, +L y +1:
// *Sx
// SSx
if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila+1)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila)) == 1) {
CuadraditoAislado = "No";
} else if (eval("ColordeCuadradito"+(Puntero-1)) == 1) {
CuadraditoAislado = "No";
}
}
if (CuadraditoAislado == "Sí") {
CuadraditosAislados++;
}
Es decir, ahí sólo estoy viendo si el cuadradito nuevo está aislado ¡me falta ver si sus contiguos lo estaban! (o si lo están sin contar al nuevo) y me falta el caso en que se despinta un cuadradito. ¿Tal vez se podrían usar functions para evitar repetir código? No sé bien cómo. Además, siendo tanto, puede que haya cometido algún error :/

02 Junio, 2024, 08:26 pm
Respuesta #1

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Tienes que reutilizar código, cada vez que modifiques el dibujo, debes hacer un ciclo que recorra los $$n^2$$ cuadraditos y chequee que ninguno  de los 8, 5 o 3 cuadraditos adyacentes  que lo rodean  este pintado,  si así sucede , ese dibujo no te sirve y aumentas el contador , entonces cambias el dibujo,  si logras completar el ciclo entonces tendrás un dibujo que cumple con tus premisas.
Saludos  \(\mathbb {R}^3\)

03 Junio, 2024, 12:07 am
Respuesta #2

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Mirar todos los cuadraditos cuando se modifica 1 no es necesario, aunque tal vez sea más fácil eso.

03 Junio, 2024, 03:10 am
Respuesta #3

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Mirar todos los cuadraditos cuando se modifica 1 no es necesario, aunque tal vez sea más fácil eso.


Si de un analisis a otro solo varia el color de un solo  cuadrado, entonces debes checar que si se enciende, tenga alguno de los 8 ,5 o 3 encendido también.


Pero en el caso que corras una secuencia donde el cuadrado pintado cambia de posicion, entonces son 2 cuadrados los que modifican color mientras uno nuevo  enciende el viejo es apagado, y debes checar que el que se apaga no deje otro cuadrado solo y eso no es fácil de pronosticar cuales casillas checar, es mas facil  pero mas lento checar  todo el cuadrado, con un código reutilizable.[size=78%]  [/size]
Saludos  \(\mathbb {R}^3\)