Coloni di Catan - Longest Road!


16

Questa è una tavola finale di Settlers of Catan:

Tavola Catan

Sfondo:

Le strade (i pezzi lunghi del bastone) e gli insediamenti (e le città) sono resi dalle piccole capanne. Codifichiamo il posizionamento di questi pezzi utilizzando il seguente schema: Dall'alto, abbiamo una fila di vertici e bordi orizzontali in cui è possibile posizionare una strada. Quindi abbiamo una colonna di sole strade e così via. Usando R per Red, O per Orange e B per Blue e _ per niente, la scheda raffigurata sarebbe codificata come:

________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_____

Una scheda come questa sarà la tua stringa di input. Qualsiasi lettera [A-Z]può indicare un colore per il giocatore, ma ci saranno al massimo quattro colori (incluso vuoto). Le schede sono altrimenti garantite per essere valide secondo le regole dei coloni, il che significa:

  • Ogni colore avrà al massimo due reti stradali contigue, che possono o meno essere spezzate da insediamenti / città di altri giocatori (edifici di vertici). Guarda l'insediamento arancione rompere la strada rossa sul lato destro dell'immagine campione.
    • Ogni rete stradale ha almeno un insediamento.
  • Tutti gli insediamenti e le città sono garantiti per essere almeno due bordi dall'altro insediamento / città più vicino (il tuo o altro)
  • Un giocatore può avere solo 15 strade sul tabellone.
  • Per gli appassionati di Catan: non esiste distinzione tra insediamenti e città ai fini di questo problema, quindi non distinguo nella stringa di input.

Tutto questo per la specifica della stringa "input".

Strada più lunga:

In Settlers, i giocatori ottengono due punti vittoria per avere la "strada più lunga". Questo è definito come: Il singolo percorso contiguo più lungo (misurato in strade) dal punto iniziale al punto finale, che non è interrotto da un insediamento o una città degli avversari . I cicli vanno bene, purché sia ​​possibile tracciare il percorso da un determinato punto iniziale a un particolare punto finale. Quindi, un ciclo di 6 strade più una diramazione è di lunghezza 7, ma uno con due ramificazioni fuori dal ciclo 6 su lati opposti vale ancora 7.

Nella mappa di esempio, la strada rossa sul lato destro vale solo 4, perché è interrotto da un insediamento arancione sul lato destro del tabellone (ecco perché gli insediamenti sono inclusi). Blue ha una strada di lunghezza 13 e Orange ha una strada di lunghezza 12. La strada principale di Red vale solo 7, perché non si collega alle due strade singole accanto ad essa.

Produzione:

Tutti i giocatori che hanno una strada di lunghezza maggiore (potrebbe essere più di una se ci sono legami), seguito da uno spazio bianco e / o un trattino delimitato da sottolineatura nella base 10 della lunghezza di quella strada.

Quindi l'output per la scheda di esempio sarebbe:

B 13

La dichiarazione del problema:

È possibile scrivere un programma o una funzione , ricevere la scheda di input tramite STDIN o come argomento stringa nella propria funzione, che restituisce l'output sopra descritto come stringa o lo stampa su STDOUT (o alternativa più vicina). Se lo si desidera, è possibile includere una nuova riga finale finale nell'output.

Questo è , il programma più corto vince. Le scappatoie standard sono ovviamente vietate .


2
La vera affermazione del problema: Orange player è un coglione.
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. Mi ci sono voluti diversi minuti per capire cosa significasse. Dovresti spiegare più chiaramente che le righe orizzontali includono anche gli insediamenti e le posizioni degli insediamenti.
DLosc,

@corsiKa Ho avuto qualcuno che me lo faceva prima!
Jerry Jeremiah,

1
L'arancione e il rosso nell'immagine sono molto simili. Avresti dovuto scegliere un altro colore.
mbomb007,

Risposte:


3

Python 2, 445 400 byte

Sono un fan di Settlers, quindi questa sfida è stata divertente.

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

Il punteggio riflette la sostituzione di ogni occorrenza di 4 spazi con una scheda.

Spiegazione

Le righe prima della definizione della funzione leggono l'input e creano una scheda normalizzata in una singola variabile stringa. Il processo inserisce i caratteri "^" nelle linee brevi che rappresentano i segmenti stradali verticali. Inoltre, riempie la scheda di caratteri "^".

^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^________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_____^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^

Quando viene chiamata con i parametri predefiniti, la funzione restituisce la lunghezza di una strada di un determinato colore. Il primo loop è attivo solo quando è stato fornito il parametro position (p). Trova ricorsivamente la lunghezza della strada in ogni posizione valida della strada e tiene traccia di quella più lunga. Quando è presente una strada nel parametro posizione, la funzione aggiunge ricorsivamente la lunghezza delle strade adiacenti dello stesso colore. La strada viene sostituita da una "~" nella copia di lavoro della scheda per garantire che non contenga i segmenti già contati.

Il codice che segue la definizione della funzione chiama la funzione per ciascun colore nel tabellone e stampa il colore e la lunghezza del punteggio più alto.

Dimostralo qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.