¡La tinta negra oscura ha salpicado por toda su hoja blanca de papel de impresora! La solución obvia es doblar el papel para que las partes en blanco y negro se unan y ambas se vuelvan grises a medida que la tinta se difunde. Luego despliegue y vuelva a plegar hasta que su papel esté igualmente gris.
Encontrar la mejor manera de hacer estos pliegues es su tarea en este desafío de codificación. Este Pastebin contiene cuatro cuadrículas de diferentes tamaños de unos y ceros. Cada cuadrícula representa un trozo de papel salpicado de tinta que debe volverse gris. Los ceros son papel y los unos son tinta.
En estas cuadrículas, solo son válidos los pliegues horizontales y verticales a lo largo de los espacios entre líneas y columnas. Cuando se realiza un pliegue, se promedian los pares de valores superpuestos. Los pliegues se hacen uno a la vez y siempre se despliegan. Los pliegues solo cambian la distribución de la tinta, no el tamaño del papel.
Rn denota doblar el borde izquierdo de la cuadrícula a la derecha, comenzando después de la enésima columna. Dn denota doblar el borde superior de la cuadrícula hacia abajo, comenzando después de la enésima fila. (n es 1 indexado)
Ejemplo
Dada esta cuadrícula
0 1 1 1
0 0 0 0
0 0 0 0
un pliegue D1 significa "doblar toda la fila superior hacia abajo y luego desplegar".
0 0.5 0.5 0.5
0 0.5 0.5 0.5
0 0 0 0
Entonces un R2 producirá
0.25 0.5 0.5 0.25
0.25 0.5 0.5 0.25
0 0 0 0
y otro R2 no cambiará nada.
Objetivo
Su objetivo es escribir un algoritmo que encuentre la mejor secuencia de plegado de difusión de tinta para cada una de las cuatro cuadrículas utilizando exactamente 8 pliegues cada vez. Los pliegues pueden ser cualquier combinación de Rs o Ds.
Puntuación
El puntaje de su envío es la suma de sus puntajes para cada cuadrícula. La puntuación de una cuadrícula es la suma de las diferencias absolutas entre cada uno de sus valores y su promedio (su suma dividida por su área). Los puntajes más bajos son mejores. Una puntuación de 0 es perfecta, pero probablemente sea imposible en solo 8 pliegues.
Debe informar sus cuatro secuencias de plegado de 8 pasos con su código en su respuesta. Esto es para que podamos verificar que su algoritmo realmente funcione.
Por favor, póngalos en este formulario:
20*20R1D2R3D4R5D6R7D8
40*20R1D2R3D4R5D6R7D8
40*40R1D2R3D4R5D6R7D8
20*80R1D2R3D4R5D6R7D8
Aquí hay un script de Python que calculará sus puntajes dadas sus secuencias de plegado.
Naturalmente, no debe copiar el envío de secuencia de otra persona. Las secuencias para cada cuadrícula solo pertenecen a la persona que las creó por primera vez.
Aclaraciones
Idealmente, su algoritmo funcionará bien en cualquier cuadrícula, aunque puede adaptarlo a estos específicos.
Debe enviar su código con su secuencia. Para ganar, necesita el conjunto más pequeño de secuencias de plegado de 8 pasos que aún no se ha publicado, y también un algoritmo que resista el escrutinio público. Explica tu código, no lo ofusques.
La cuadrícula nunca debe contener números negativos.
Se aplican lagunas estándar.
fuente
Respuestas:
Pitón
Prueba exhaustivamente diferentes combinaciones de pliegues para los primeros pliegues, luego hace el resto de los pliegues con un enfoque codicioso.
El enfoque exhaustivo está limitado dentro de un rango razonable de pliegues en el centro, de modo que no tomará una eternidad, sin ignorar demasiados pliegues posibles para producir un buen mínimo.
Corrí usando pypy en mi macbook air.
Respuestas:
Salidas:
Puntuación total: 7.91125 + 16.34375 + 42.13 + 32.30875 = 98.69375
Código:
fuente
C, 16.344 (4 minutos 33 segundos)
Mejores movimientos encontrados hasta ahora: D6, D13, R19, D9, D11, R21, D10, R20
Utiliza una mezcla de Monte Carlo y escalada. Podría estar hecho para correr mucho más rápido, estoy seguro.
fuente