El juego de mesa
En el juego de mesa " Carcassonne ", los jugadores colocan fichas haciendo coincidir sus bordes y obtienen los puntajes más altos al crear grandes áreas contiguas de terreno. Los siguientes son (aproximadamente) los tipos y cantidades de fichas incluidas en el juego:
#01
x4
#02
x5
#03
x8
#04
x2
#05
x9
#06
x4
#07
x1
#08
x3
#09
x3
#10
x3
#11
x4
#12
x5
#13
x3
#14
x3
#15
x2
#16
x5
#17
x5
#18
x2
#19
x3
#20
x1
#21
x5
#22
x2
#23
x1
#24
x1
#25
x1
La tarea
Debe colocar un mosaico haciendo coincidir los bordes, mientras trata de mantener las áreas contiguas de terreno más grandes posibles.
Colocación
- Las fichas solo se pueden colocar en uno de los espacios en blanco (hasta 4) adyacentes a cualquier ficha existente (o fichas) en el área de juego.
- Las baldosas se pueden girar 90, 180 o 270 grados.
Coincidencia de bordes
- Los bordes de un mosaico colocado deben coincidir con los bordes en contacto de los (hasta 4) mosaicos vecinos, es decir, los píxeles en contacto son del mismo color.
Terreno contiguo
- "Cerrar un área de terreno" se refiere a colocar un mosaico de manera que cualquier área contigua de color no pueda continuar con más ubicaciones de mosaico.
- Si es posible una ubicación alternativa, se debe elegir sobre cualquier ubicación de mosaico que cierre un área de terreno.
- Si tiene que elegir entre varias ubicaciones de cierre, elija cualquiera. Si tiene que elegir entre varias ubicaciones que no cierran, elija cualquiera.
- No tenga en cuenta # ff00ff (los píxeles de la esquina) al calcular áreas contiguas. Ignore los edificios, es decir, las áreas de color que ya están completamente encerradas dentro de un mosaico.
Entrada
La entrada es dos imágenes:
El área de juego.
- El área de juego inicial consta de mosaico
#11
(un mosaico único). - El área de reproducción aumentada creada como salida también debe ser compatible como entrada.
- El área de juego inicial consta de mosaico
El azulejo a colocar.
- Todos los mosaicos de ejemplo deben ser compatibles como entrada.
Determine los bordes coincidentes / terreno contiguo utilizando solo estos datos de imagen. Sin codificación.
Salida
- La salida es una imagen que muestra el área de juego resultante después de colocar el mosaico.
- La imagen debe ser compatible con su propio programa, es decir, puede usarse como entrada de área de reproducción.
- Si es imposible colocar un mosaico, devuelve un error.
Puedes asumir que
- Los mosaicos son siempre de 55 px por 55 px
- Los mosaicos solo presentarán los colores utilizados actualmente en los mosaicos de ejemplo.
Notas
- Su respuesta debe presentar una salida de ejemplo después de al menos 2 pases (se recomienda más).
- Esta es una representación parcial e inexacta del juego de mesa original, no necesita aplicar ninguna de las reglas o tácticas que no se mencionan aquí.
Puntuación
- Su puntuación es el recuento de bytes de su envío.
- Los datos de imagen no están incluidos en su puntaje.
- La puntuación más baja gana.
Jugando un juego completo
Es posible que desee escribir un guión que use su sumisión para jugar un juego completo, que podría consistir en:
- Colocando un mosaico elegido pseudoaleatoriamente del conjunto completo de 85.
- Devolver el mosaico al conjunto si no se puede colocar.
- Repetir hasta que se hayan colocado todas las fichas, o hasta que no se puedan colocar dos fichas seguidas.
No se incluirá en el recuento de bytes ni mejorará su puntaje, pero es probable que ofrezca una recompensa por este tipo de respuesta.
Respuestas:
Perl 5 con PerlMagick:
875 789763No conté la línea que comienza
sub w
, que se usa para ordenar las posiciones en la distancia al centro para preferir soluciones compactas (ahora funcionan correctamente). En esta versión, el cierre se evita como se solicitó, pero encuentro lo contrario más interesante y fiel al juego. Para lograr eso, cambie la línea$s=$t if!grep...
a$s=$t if grep...
.Uso:
perl car.pl board.png tile.png
. Resultado almacenado encar.png
. El estado de salida es 1 si no se pudo colocar el mosaico.Script para ejecutar un juego completo. Se asume que el código anterior se encuentra en el archivo
car.pl
y las baldosas se almacenan entiles
el directorio llamado01.png
a25.png
.Esto corre bastante lento ahora. 8-12 minutos en mi máquina. Con cierre preferido: con cierre evitado (tenga en cuenta que nada está cerrado).
fuente
Common Lisp,
26502221199211861111 bytesActualización: golf "fácil" ahora hecho, más ganancias requerirán mayores cambios.Actualización 2: con la competencia cada vez más feroz, la nueva versión ya no favorece las posiciones dentro del rectángulo actual del campo de juego (eso sería 57 bytes adicionales). Esta opción, así como una optimización de velocidad simple, está habilitada de forma predeterminada en la versión descargable con el simulador, pero no en la respuesta oficial a continuación.Actualización 3: Cambios menores en la interfaz para mayores ganancias de conteo de bytes.
También creé una interfaz de usuario web simple. El paquete completo (un único archivo LISP y las imágenes de mosaico) se puede descargar aquí . Para probarlo, instale
hunchentoot
,zpng
ypng-read
con quiclisp, carguecarcassonne.lisp
y conécteselocalhost:8080
. El código ha sido probado en CCL / Windows y SBCL / Linux. Las bibliotecas mencionadas anteriormente solo son necesarias para la parte de UI / simulador; la solución en sí es ANSI Common Lisp simple.Todos los avances de línea y el espaciado de inicio de línea son solo para cosméticos, para garantizar la legibilidad, y no se cuentan en la suma total.
Debe llamar a la función
c
con dos argumentos: el campo de juego actual y el mosaico para colocar. Ambos deben ser matrices 2D; el mosaico 55x55 y el campo un múltiplo de eso. Además, la matriz de campo debe ser ajustable. La función devuelve una lista de dos elementos con el nuevo campo como primer argumento. El segundo elemento esNIL
si el mosaico no se puede colocar, o de lo contrario, una lista que contiene las coordenadas superior izquierda y la rotación del último mosaico en esa matriz y la puntuación para ese mosaico. Esta información puede usarse para fines de visualización.Tenga en cuenta que en otras llamadas, debe usar el nuevo campo devuelto
c
incluso si el segundo elemento de la lista esNIL
(la matriz original puede haber sidoadjust-array
editada y, por lo tanto, invalidada).El código ahora es un poco lento, la optimización de conteo de bytes resulta en cálculos redundantes. El siguiente ejemplo se completó en aproximadamente tres minutos en mi sistema.
Ejemplo de ejecución para las 85 fichas:
Captura de pantalla de la interfaz de usuario web:
fuente
DarkBASIC Pro:
207819321744 bytesACTUALIZACIÓN: solo más esfuerzo de golf
ACTUALIZACIÓN: ahora cumple totalmente con las especificaciones, incluida la preferencia de opciones sin cierre.
Elegí DarkBASIC porque, aunque es bastante detallado, proporciona un conjunto de comandos extremadamente sencillo y sencillo para manipular imágenes.
Subí un EXE para personas que no tienen el compilador DarkBASIC ( Windows ).
fuente