Quiero probar una nueva forma de código de golf aquí. Al igual que las bonificaciones, no todas las partes del desafío deben completarse, pero cada respuesta debe implementar un subconjunto de cierto tamaño (y hay un núcleo que cada respuesta debe implementar). Por lo tanto, además del golf, este desafío también implica elegir un conjunto de características que combinen bien.
Las normas
Kingdom Builder es un juego de mesa que se juega en una cuadrícula hexadecimal (punta puntiaguda). El tablero está formado por cuatro cuadrantes (aleatorios), cada uno de los cuales tiene 10x10 celdas hexadecimales (por lo que un tablero completo será 20x20). Para los propósitos de este desafío, cada celda hexagonal contiene agua ( W
), montaña ( M
), una ciudad ( T
), un castillo ( C
) o está vacía ( .
). Entonces un cuadrante podría verse como
. . W . . . . . . .
. M W W . . . . . .
. M . . W . . . T .
M M . W . . . . . .
. . M . W W . . . .
. . . . . W W W W W
. T . . . . . . . .
. . W . . C . . . .
. . W W . . . . M .
. . . . . . . M M .
La segunda fila siempre estará desplazada a la derecha de la primera fila. Los jugadores 1
a 4
pueden colocar hasta 40 asentamientos cada uno en las celdas vacías (siguiendo algunas reglas que vamos a pasar por alto para este desafío). Un posible tablero al final del juego es el siguiente:
3 3 W . . . 4 . 4 . . 2 W . 4 . . 4 . 4
3 M W W . 1 1 . . 4 2 W . 3 C 4 4 . . 4
3 M 2 2 W 1 1 1 T 3 2 W 4 3 . 1 4 . 4 .
M M . W 2 2 . . . 2 2 W 3 . 1 1 1 . . .
. 4 M . W W 2 2 2 2 W W 3 . 1 4 . T . .
. . . . . W W W W W . 3 C 1 . . 2 2 2 2
. T 1 1 1 1 . . 2 . . 4 . . . 2 2 M M M
4 . W 4 . C 4 4 . . . . . . 2 M M M M M
. 4 W W . . . 4 M . . W . W . 2 2 2 M M
. . . . . . . M M . . W W . . . . 2 M .
. . . 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 . 1
M 3 3 . . . . . . . . 4 . T 2 . 2 4 1 .
M M . C . 4 . 4 . . . . . 1 2 4 2 1 1 .
M . . 1 . 4 . . . . M M 1 2 . . 2 1 . .
. . . W 1 1 4 1 1 . . . 1 2 . . 2 W W W
. . 1 1 W 1 T . 1 1 1 1 T . . 2 W . 4 .
. 1 1 W . 3 3 . . . . . . . . 2 W 4 C 3
C 1 3 3 3 . 3 . 4 . 4 . 4 . . 2 W 1 1 M
4 3 3 4 . M 4 3 . . . . . . . 2 W . . .
. . . 4 . M M 3 . . 4 4 . 4 . 2 W W . .
Etiquetaremos los cuadrantes como
1 2
3 4
Su tarea será anotar dicho tablero. Hay un puntaje central que siempre se usa y 8 puntajes opcionales, 3 de los cuales se eligen para cada juego. † A continuación, describiré los 9 puntajes y usaré la configuración anterior como ejemplo de cuántos puntos obtendría cada jugador.
† Hay 10 puntajes en el juego real, pero dejaré de lado dos porque nadie quiere jugar golf.
El puntaje central. Un jugador obtiene 3 puntos por cada C
astle al que tiene un acuerdo al lado. Puntajes de ejemplo: 18, 0, 15, 12.
Los puntajes opcionales.
Un jugador obtiene 1 punto por cada fila horizontal en la que tiene al menos un acuerdo.
Puntajes de ejemplo: 14, 20, 12, 16.
Para cada jugador, encuentre la fila horizontal en la que se encuentran la mayoría de sus asentamientos (elija cualquiera en caso de empate). Un jugador obtiene 2 puntos por cada liquidación en esa fila.
Puntajes de ejemplo: 14 (fila 16), 8 (fila 4, 5 o 6), 28 (fila 11), 10 (fila 1).
Un jugador obtiene 1 punto por cada asentamiento que se construya al lado de
W
después.Puntajes de ejemplo: 13, 21, 10, 5.
Un jugador obtiene 1 punto por cada asentamiento al lado de una
M
montaña.Puntajes de ejemplo: 4, 12, 8, 4.
Cuente los asentamientos de cada jugador en cada cuadrante. Por cuadrante, los jugadores con el mayor número de acuerdos obtienen 12 puntos cada uno, los jugadores con el segundo mayor número de acuerdos obtienen 6 puntos cada uno.
Puntajes de ejemplo: 18 (6 + 0 + 6 + 6), 36 (12 + 12 + 0 + 12), 12 (0 + 0 + 12 + 0), 18 (12 + 6 + 0 + 0).
Para cada jugador, determine el cuadrante en el que tienen el menor número de asentamientos. Un jugador obtiene 3 puntos por cada asentamiento en ese cuadrante.
Puntajes de ejemplo: 18 (Cuadrante 2), 0 (Cuadrante 3), 15 (Cuadrante 1 o 2), 27 (Cuadrante 3).
Un jugador obtiene 1 punto por cada grupo conectado de asentamientos.
Puntajes de ejemplo: 7, 5, 6, 29.
Un jugador obtiene 1 punto por cada 2 asentamientos en el grupo más grande de asentamientos conectados del jugador.
Puntajes de ejemplo: 4, 10, 8, 2.
El reto
Al igual que en el juego que se elija 3 de las puntuaciones opcionales, y la puntuación de una tabla determinada en base a la puntuación de núcleo y las tres puntuaciones. Su código debe producir una lista de 4 puntajes. Sin embargo, hay una restricción en la elección: he agrupado los puntajes en 3 grupos y usted debe implementar uno de cada grupo:
- Implementar uno de 1 y 2 .
- Implementar uno de 3, 4, 5 y 6 .
- Implementar uno de 7 y 8 .
Puede escribir un programa o función, tomando datos a través de STDIN, argumento de línea de comando, indicador o parámetro de función. Puede devolver el resultado o imprimirlo en STDOUT.
Puede elegir cualquier formato conveniente de lista / cadena 1D o 2D para la entrada. Es posible que no utilice un gráfico con la información de adyacencia completa. Aquí hay una buena lectura sobre cuadrículas hexagonales si necesita inspiración.
Su salida también puede estar en cualquier formato de cadena o lista conveniente y no ambigua.
Este es el código de golf, por lo que gana la respuesta más corta (en bytes).
Supuestos adicionales
Puedes suponer que ...
- ... cada jugador tiene al menos 1 acuerdo y no hay más de 40 acuerdos de cada jugador.
- ... cada cuadrante contiene una ciudad y dos castillos, o dos ciudades y un castillo.
- ... las ciudades y los castillos están lo suficientemente separados, de modo que ningún asentamiento puede ser adyacente a dos de ellos.
Casos de prueba
Aún usando la tabla anterior, aquí están los puntajes individuales para todas las opciones posibles de mecanismos de puntuación:
Chosen Scores Total Player Scores
1 3 7 52 46 43 62
1 3 8 49 51 45 35
1 4 7 43 37 41 61
1 4 8 40 42 43 34
1 5 7 57 61 45 75
1 5 8 54 66 47 48
1 6 7 57 25 48 84
1 6 8 54 30 50 57
2 3 7 52 34 59 56
2 3 8 49 39 61 29
2 4 7 43 25 57 55
2 4 8 40 30 59 28
2 5 7 57 49 61 69
2 5 8 54 54 63 42
2 6 7 57 13 64 78
2 6 8 54 18 66 51
fuente
Respuestas:
Python 2, 367 bytes
El programa utiliza puntajes 1, 3, 7. La entrada es una lista de listas de caracteres que representan cada celda. Para probar el tablero de ejemplo fácilmente, podemos hacer:
Manejo de la cuadrícula hexadecimal
Como estamos en una cuadrícula hexadecimal, tenemos que tratar con los vecinos de manera un poco diferente. Si utilizamos una cuadrícula 2D tradicional como nuestra representación, entonces
(1, 1)
tenemos:En una inspección más cercana, nos damos cuenta de que las compensaciones dependen de la paridad de la fila en la que se encuentra. El ejemplo anterior es para filas impares, pero en filas pares los desplazamientos son
Lo único que ha cambiado es que los pares primero, segundo, quinto y sexto han tenido su segunda coordenada disminuida en 1.
La función lambda
N
toma un par de coordenadas(row, col)
y devuelve todos los vecinos de la celda dentro de la cuadrícula. La comprensión interna genera los desplazamientos anteriores extrayéndolos de una codificación simple de base 3, incrementando la segunda coordenada si la fila es impar y agrega los desplazamientos a la celda en cuestión para dar a los vecinos. La comprensión externa luego se filtra, dejando solo a los vecinos que están dentro de los límites de la cuadrícula.Sin golf
fuente
def F
ser una función separada en lugar de una función interna? No sek
puede eliminar dedef F:
?F
es la función de relleno de inundación y necesita accesoJ
, por lo que está en el interior para ahorrar en pasarJ
como parámetro (experimentaré un poco para ver si puedo evitar la copia profunda). Sink
embargo, tienes razón , gracias :) (sin embargo, el nuevo código parece un poco raro, debido a que depende del cortocircuito)Programación de conjunto de respuestas, 629 bytes
ASP pertenece a la familia de lenguajes de programación lógica, aquí encarnada por el framework Potassco , en particular Clingo (Grounder Gringo + Solver Clasp). Debido a la limitación del paradigma, no puede tomar una placa dada directamente como salida, por lo que es necesario un preprocesamiento de los datos (aquí realizado en python). Este preprocesamiento no se cuenta en la puntuación total de bytes.
Es mi primer código de golf, y el objetivo es más mostrar un lenguaje que amo que nunca antes había visto en el golf, que ganar el juego. Además, estoy lejos de ser un experto en ASP, por lo que muchas optimizaciones del código se pueden realizar para obtener resultados en menos bytes.
representación del conocimiento
Existe el código de Python que convierte la placa en átomos:
Por ejemplo, los átomos b (para __b__oard) dados para la primera línea del tablero de ejemplo son los siguientes:
Donde b (0,0,3) es un átomo que describe que el jugador 3 tiene un asentamiento en las coordenadas (0; 0).
Resolución ASP
Existe el código ASP, con muchos puntajes opcionales implementados:
Este programa se puede iniciar con el comando:
Y encontrará solo una solución (es una prueba de que solo hay una forma de distribuir los puntos):
Donde s (7,3,6) dice que el jugador 3 gana 6 puntos con la puntuación opcional 7, y s (t, 4,62) dice que el jugador 4 gana 62 puntos en total (núcleo + 1 + 3 + 7).
¡Fácil de analizar para tener una mesa elegante!
fuente