Hola a todos.
Soy estudiante del grado de informática de la uah, y es la primera vez que entro en este foro. La cuestión es que me han mandado hacer una práctica usando tarjetas gráficas (NVidia, para concretar) que, en principio, debería ser bastante sencilla: El juego de la vida, mundialmente conocido y posiblemente algo trillado para los más entendidos en el tema. Antes de nada, aclarar que mi duda es principalmente matemática, razón por la que recurro a este foro, por lo que si alguno no tiene mucha idea de programación no debe preocuparse: Al final explico claramente donde reside el problema.
La idea del juego, para los que no sepan de que va, es tener una malla de "células" (representada por una matriz bidimensional) que pueden tener dos estados: Viva (1) o Muerta (0). Cada célula Muerta puede "volver a la vida" si hay exactamente tres células vivas entre las ocho posiciones adyacentes (contando también las diagonales). Cada célula Viva muere en caso de tener más de tres células vivas alrededor (sobrepoblación) o menos de dos (soledad).
El problema radica en que, como los entendidos en CUDA y programación paralela sabrán, meter condicionales dentro de un hilo en programación paralela es uno de los crímenes que debemos evitar a toda consta, por lo que un problema que normalmente sería propio de un curso básico de programación se convierte en un verdadero quebradero de cabeza. ¿Cómo implementar el algoritmo para decidir si una célula vive o muere, sin recurrir a estructuras "if..then"?
Y paso a formalizar el problema a nivel más matemático y menos computacional:
- Tenemos dos variables: X e Y.
- X puede tomar valores entre 0 y 1.
- Y puede tomar valores entre 0 y 8.
Buscamos una función f(x,y) tal que:
- f(x,y) no puede ser una función por partes (es decir, debe poder expresarse en una línea, y sin posibilidad de incluir "condiciones" tales como "si x es tal, entonces la función devuelve tal...")
- f(0,3) devuelve 1.
- f(0,y), siendo y distinto de 3, devuelve 0.
- f(1,2) y f(1,3) devuelve 1.
- f(1,y), siendo y distinto de 2 y 3, devuelve 0
¿Hay algo parecido, o estoy pidiendo lo imposible?
Mil gracias a todos los que respondan, resuelvan o no mi problema. Aunque la pregunta es estrictamente matemática, si alguno sabe otra manera de realizar el programa sin recurrir a estos pequeños desvaríos matemáticos también me sirve su respuesta