Colonos de Catan - ¡El camino más largo!


16

Este es un tablero final de Settlers of Catan:

Junta de catan

Antecedentes:

Las pequeñas cabañas representan los caminos (los pedazos largos) y los asentamientos (y ciudades). Codificamos la ubicación de estas piezas mediante el siguiente esquema: Desde la parte superior, tenemos una fila de vértices horizontales y bordes donde se puede colocar una carretera. Luego tenemos una columna de solo caminos, y así sucesivamente. Usando R para Rojo, O para Naranja y B para Azul, y _ para nada, el tablero ilustrado se codificaría como:

________RR_R_
__R_
__RR_R_RRR_____R_
B___R
_B_________B__OO_OOR_
B__B_R
BB_BBB_____B____RR_R_
OBB_O
OO__BB_BB__OOO_OO
O_O_
_O_OOO_O_____

Un tablero como este será su cadena de entrada. Cualquier letra [A-Z]puede indicar un color de jugador, pero habrá como máximo cuatro colores (incluido el vacío). Las juntas están garantizadas de otra manera para ser válidas de acuerdo con las reglas de los colonos, lo que significa:

  • Cada color tendrá a lo sumo dos redes de carreteras contiguas, que pueden ser separadas o no por asentamientos / ciudades de otros jugadores (edificios de vértices). Vea el asentamiento naranja separando el camino rojo en el lado derecho de la imagen de muestra.
    • Se garantiza que cada red de carreteras tenga al menos un asentamiento.
  • Se garantiza que todos los asentamientos y ciudades estarán al menos a dos bordes del otro asentamiento / ciudad más cercano (el suyo o no)
  • Un jugador solo puede tener 15 caminos en el tablero de juego.
  • Para los entusiastas de Catan: no hay distinción entre asentamientos y ciudades a los efectos de este problema, por lo que no distingo en la cadena de entrada.

Todo esto es para la especificación de la cadena de "entrada".

Camino más largo:

En los colonos, los jugadores obtienen dos puntos de victoria por tener el "camino más largo". Esto se define como: La ruta única contigua más larga (medida en carreteras) desde el punto de inicio hasta el punto final, que no está dividida por un asentamiento o ciudad de oponentes . Los ciclos están bien, siempre que pueda rastrear la ruta desde un punto de inicio en particular hasta un punto final en particular. Por lo tanto, un bucle de 6 carreteras más una ramificación de la carretera es de longitud 7, pero una con dos ramificaciones de la carretera de 6 en lados opuestos todavía solo vale 7.

En el mapa de ejemplo, el camino Rojo en el lado derecho solo vale 4, porque está bloqueado por un asentamiento Naranja en el lado derecho del tablero (es por eso que los asentamientos están incluidos). El azul tiene un camino de longitud 13, y el naranja tiene un camino de longitud 12. El camino superior del rojo solo vale 7, porque no se conecta a los dos caminos individuales al lado.

Salida:

Todos los jugadores que tienen un camino de la longitud más larga (podría ser más de uno si hay empates), seguido de un espacio en blanco y / o un recuento delimitado por subrayado en la base 10 de cuánto tiempo es ese camino.

Entonces la salida para el tablero de ejemplo sería:

B 13

La declaración del problema:

Puede escribir un programa o función , recibe la placa de entrada a través de STDIN o como un argumento de cadena a su función, que devuelve la salida descrita anteriormente como una cadena o la imprime en STDOUT (o la alternativa más cercana). Opcionalmente, puede incluir una nueva línea final en la salida.

Este es el , el programa más corto gana. Las lagunas estándar están prohibidas, por supuesto .


2
El verdadero problema: el jugador naranja es un imbécil.
corsiKa

From the top, we have a row horizontal vertices and edges where a road can be placed. Then we have a column of only roads, and so forth. Me tomó varios minutos entender qué significaba esto. Debe explicar más claramente que las filas horizontales también incluyen los asentamientos y las ubicaciones de los asentamientos.
DLosc

@corsiKa ¡He tenido a alguien que me hizo eso antes!
Jerry Jeremiah

1
El naranja y el rojo en la imagen son realmente similares. Deberías haber elegido otro color.
mbomb007

Respuestas:


3

Python 2, 445 400 bytes

Soy fanático de los colonos, por lo que este desafío fue divertido.

T="^"
Z=26
A=T*52
for i in range(11):A+=(T*(i%2)*3).join(x for x in raw_input()).center(Z,T)
A+=T*52
def f(c,p=0,l=0,B=A):
 b=l;C=B[0:p]+T+B[p+1:];n=(Z,1)[p%2]
 for i in(p<1)*range(390):
    if(i/Z%2<1&i%2>0)|(i/Z%2>0&i%2<1):b=max(b,f(c,i))
 for i in(p-n,p+n)*(B[p]==c):
    for j in(i-Z,i-1,i+1,i+Z)*(B[i]in c+"_"):b=max(b,f(c,j,l+1,C))
 return b
i=l=0
for x in A:
 if x<T:i=f(x)
 if i>l:c=x;l=i
print c,l

La puntuación refleja la sustitución de cada aparición de 4 espacios con una pestaña.

Explicación

Las líneas antes de la definición de la función leen la entrada y construyen una placa normalizada en una sola variable de cadena. El proceso inserta caracteres "^" en las líneas cortas que representan los segmentos verticales de la carretera. También rellena el tablero con caracteres "^".

^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^________RR_R_^^^^^^^
^^^^^^_^^^_^^^R^^^_^^^^^^^
^^^^__RR_R_RRR_____R_^^^^^
^^^^B^^^_^^^_^^^_^^^R^^^^^
^^_B_________B__OO_OOR_^^^
^^B^^^_^^^_^^^B^^^_^^^R^^^
^^BB_BBB_____B____RR_R_^^^
^^^^O^^^B^^^B^^^_^^^O^^^^^
^^^^OO__BB_BB__OOO_OO^^^^^
^^^^^^O^^^_^^^O^^^_^^^^^^^
^^^^^^_O_OOO_O_____^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^

Cuando se llama con los parámetros predeterminados, la función devuelve la longitud de una carretera de un color determinado. El primer bucle está activo solo cuando se suministró el parámetro de posición (p). Encuentra recursivamente la longitud del camino en cada posición válida del camino, y realiza un seguimiento de la más larga. Cuando hay una carretera en el parámetro de posición, la función agrega recursivamente la longitud de las carreteras adyacentes del mismo color. El camino se reemplaza con un "~" en la copia de trabajo del tablero para asegurarse de que no cuenta segmentos que ya se han contado.

El código que sigue a la definición de la función llama a la función para cada color en el tablero e imprime el color y la longitud de mayor puntuación.

Demo aquí

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.