Battaglia del rischio: andare giù


16

Dati due elenchi di tiri di dado per una battaglia in Rischio, il tuo programma o funzione deve generare quante truppe perde ogni giocatore.

sfondo

Non devi leggere questo, perché è solo uno sfondo. Passa al sottotitolo "Attività" per continuare senza sosta.

Nel gioco del Rischio , un giocatore può attaccare un altro giocatore (in effetti, questo è necessario per vincere). Il risultato di una battaglia è determinato dal lancio di dadi. Ogni battaglia si svolge come una successione di sotto-battaglie in cui ogni giocatore può perdere fino a 2dei propri pezzi dell'esercito.

In una battaglia secondaria, il difensore e l'attaccante lanciano ciascuno diversi dadi il cui numero può variare in base a circostanze irrilevanti per questa sfida. Il dado più valutato dell'attaccante viene confrontato con il dado più valutato del difensore. Se il dado dell'attaccante è più alto del dado del difensore, il difensore perde un pezzo. Altrimenti, l'attaccante perde un pezzo.

Quindi, se entrambi i giocatori hanno almeno due dadi, vengono confrontati i dadi con il secondo valore più alto dei due giocatori. Ancora una volta, se il dado dell'attaccante è più alto del dado del difensore, il difensore perde un pezzo. Altrimenti, l'attaccante perde un pezzo.

(Il difensore vince i pareggi. Se sia il difensore che l'attaccante tirano a 4, l'attaccante perde un pezzo.)

Confronto dei dadi

In questa sotto-battaglia dell'articolo di Wikipedia, i dadi dell'attaccante sono rossi e i dadi del difensore sono bianchi. Il più alto dei dadi dell'attaccante è 4e il più alto dei difensori è 3. Poiché l'attaccante era più alto, il difensore perde un pezzo. I secondi più alti sono 3per l'attaccante e 2per il difensore. Dato che l'attaccante era di nuovo più alto, il difensore perde un altro pezzo. Pertanto, in questa sotto-battaglia, l'attaccante non perde pezzi e il difensore perde 2pezzi.

Si noti che i terzi pezzi più alti non vengono confrontati. Questo perché il difensore non ha più di due dadi in una singola battaglia secondaria, quindi non ci sono pezzi del terzo più alto da confrontare in assoluto.

Compito

Dati i tiri di dado non ordinati (numeri interi compresi tra 1 e 6) sia dell'attaccante che del difensore di una sotto-battaglia di Rischio in qualsiasi forma conveniente, ottieni il numero di pezzi dell'esercito che ogni giocatore perde. L'output può essere in qualsiasi forma conveniente, purché abbia output diversi per indicare le cinque possibilità. Devi indicare quali sono questi diversi output nella tua domanda.

L'output è determinato come segue: iniziare con def=0e atk=0. Se il valore più grande dell'elenco dei tiri di dado dell'attaccante è maggiore del valore più grande dell'elenco dei tiri di dado del difensore, quindi incrementare def. Altrimenti, incremento atk.

Se almeno entrambi gli elenchi di tiri di dado hanno lunghezza 2, quindi: se il secondo valore più grande dell'elenco di tiri di dado dell'attaccante è maggiore del secondo valore più grande dell'elenco, incrementare defe altrimenti aumentare atk.

Infine, il programma o la funzione deve generare un identificatore univoco per ciascuna delle seguenti 5 possibilità di output:

  ╔═══╦═══╗
  ║atk║def║
  ╠═══╬═══╣
  ║ 1 ║ 0 ║
  ║ 0 ║ 1 ║
  ║ 2 ║ 0 ║
  ║ 1 ║ 1 ║
  ║ 0 ║ 2 ║
  ╚═══╩═══╝

Esempio

Difensore: [3, 2] attaccante: [2, 4, 1] massimo del difensore è 3e massimo dell'attaccante 4. 4>3, quindi il def=1 secondo difensore è 2e il secondo attaccante è 2. Not(2>2)così atk=1. L'output potrebbe quindi essere [1,1].

Casi test

Defender
Attacker
Output (as [def,atk])
-----
[1]
[1]
[0,1]
-----
[6,6]
[1,1,1]
[0,2]
-----
[1,2]
[5,2,3]
[2,0]
-----
[5]
[3,4]
[0,1]
-----
[4]
[4,5]
[1,0]
-----
[1,3]
[1,2,3]
[1,1]
-----
[4]
[4,5,6]
[1,0]
-----
[4,5]
[6,2]
[1,1]
-----
[5]
[6,1,3]
[1,0]
-----
[5,5]
[4,4,1]
[0,2]
-----
[2,5]
[2,2]
[0,2]
-----
[6,6]
[4,4,3]
[0,2]
-----
[2,1]
[4,3]
[2,0]
-----
[4]
[1,5]
[1,0]
-----
[1]
[5,2]
[1,0]
-----
[6,2]
[4]
[0,1]
-----
[4,2]
[2,5,5]
[2,0]
-----
[2]
[6,6,2]
[1,0]
-----
[6]
[2,6]
[0,1]
-----
[3,1]
[1]
[0,1]
-----
[6,2]
[3,5,2]
[1,1]
-----
[4,2]
[1,1]
[0,2]
-----
[4,3]
[5,4,1]
[2,0]
-----
[5,6]
[1,2]
[0,2]
-----
[3,2]
[4,4]
[2,0]
-----
[2]
[6,3,4]
[1,0]
-----
[1,4]
[6,2,4]
[2,0]
-----
[4,2]
[2,5,4]
[2,0]
-----
[5]
[6,2,1]
[1,0]
-----
[3]
[2,5,4]
[1,0]
-----
[5,4]
[2]
[0,1]
-----
[6,3]
[2,6,5]
[1,1]
-----
[3,1]
[4]
[1,0]
-----
[4]
[6,6,5]
[1,0]
-----
[6,3]
[4,2]
[0,2]
-----
[1,6]
[5,4]
[1,1]
-----
[3,6]
[4,4]
[1,1]
-----
[5,4]
[5,1,1]
[0,2]
-----
[6,3]
[5,4]
[1,1]
-----
[2,6]
[1,2]
[0,2]
-----
[4,2]
[3,5,5]
[2,0]
-----
[1]
[1,2,1]
[1,0]
-----
[4,5]
[1,6]
[1,1]
-----
[1]
[3,5,1]
[1,0]
-----
[6,2]
[6,2]
[0,2]

Implementazione di esempio

Python 2 o 3

def risk(atk_rolls,def_rolls):
    # set the rolls in descending order, e.g. [5,3,2]
    atk_rolls = sorted(atk_rolls,reverse = True)
    def_rolls = sorted(def_rolls,reverse = True)
    # minimum length.
    minlen = min(len(atk_rolls),len(def_rolls))
    atk_lost = 0
    def_lost = 0
    # compare the highest-valued rolls
    if atk_rolls[0]>def_rolls[0]:
        def_lost += 1
    else:
        atk_lost += 1
    if minlen == 2:
        # compare the second-highest-valued rolls
        if atk_rolls[1] > def_rolls[1]:
            def_lost += 1
        else:
            atk_lost += 1
    return [def_lost, atk_lost]    

specificazioni

  • L'input può essere preso come qualsiasi forma che codifica chiaramente solo i tiri del difensore e quelli dell'attaccante.
  • L'output può essere in qualsiasi forma che fornisce un output unico per ciascuna delle cinque possibilità sopra elencate.
  • I tiri del difensore sono un elenco 1o 2numeri interi nel set [1,2,3,4,5,6]. Rotoli Il dell'attaccante sono un elenco di 1per 3interi nel set [1,2,3,4,5,6].
  • Dato che si tratta di , vince il codice più corto in ogni lingua ! Do Non lasciare risposte in lingua golf scoraggiare dalle risposte pubblicazione in altre lingue.

L'ho visto sulla sandbox, bella domanda
Noah Cristino,


L'attaccante perde se il suo tiro massimo è uguale al tiro più alto del difensore, giusto?
Mr. Xcoder,

1
Sì @ Mr.Xcoder, il difensore vince i pareggi.
fireflame241

Quindi ho cancellato il commento :)
Mr. Xcoder il

Risposte:


8

Cancelli NAND, 237

Creato con Logisim

Gli ingressi sono binari senza segno a 3 bit, inseriti a sinistra. Le uscite (2 bit) sono sulla destra.

È troppo grande per adattarsi allo schermo e Logisim non può eseguire lo zoom, quindi l'immagine è in bianco e nero. Scusa :(

Funziona con tutti i casi di test.

Probabilmente esiste un modo migliore per farlo utilizzando un circuito di memoria, che consente di riutilizzare grandi sezioni.


4

Gelatina ,  12  11 byte

NṢ€>/Ṡḟ-o-S

Un collegamento monadico che prende un elenco di Defender, Attackertiri (ciascuno come elenchi), restituendo un numero intero compreso -2e 2compreso (perdite del difensore - perdite dell'attaccante):

result : [def, atk]
    -2 : [  0,   2]
    -1 : [  0,   1]
     0 : [  1,   1]
     1 : [  1,   0]
     2 : [  2,   0]

Provalo online! oppure vedere una suite di test (che associa i risultati al formato OP).

Come?

NṢ€>/Ṡḟ-o-S - Link: list [list Def, list Atk]
N           - negate all the rolls
 Ṣ€         - sort €ach of the lists of -1*rolls (max rolls are to the left now)
    /       - reduce by:
   >        -   is greater than?  (when len(Atk) > len(Def) leaves trailing negatives)
     Ṡ      - sign (maps all negatives to -1; zeros and ones of comparison unchanged)
       -    - literal -1
      ḟ     - filter discard (remove the -1s)
         -  - literal -1
        o   - logical or, vectorises (replaces the zeros with minus ones)
          S - sum

2

Retina , 82 byte

%O^`.
((.)+).*(¶(?<-2>.)+)(?(2)(?!)).*
$1$3
O$`.
$.%`
\d
$*1D
(1+)D1*\1

1+D
A
O`.

Provalo online! La prima linea di input è il dado dell'attaccante, il secondo è il dado del difensore. Returns (su righe separate) AA, AD, DD, Aoppure Da seconda dei casi.


2

Python 2 , 83 75 byte

x=0
k=map(sorted,input())
while all(k):x+=cmp(*map(list.pop,k))or 1
print-x

Provalo online!

L'output è perdite del difensore - perdite dell'attaccante


2

MATL , 23 byte

oH2$S1&Y)Y&t1M>t~b,Y&sD

Provalo online!

Non sono sicuro del perché ai difensori siano concessi più dadi degli attaccanti, ma forse non sono così esperto in Rischio. Il programma principale è giusto >t~,sD, tutti gli altri byte sono lì per consentire diverse lunghezze di input, con un po 'di ordinamento inserito. Input è attaccante seguito da difensore, output è perdite dell'attaccante seguite da perdite del difensore.

o    % Convert input to numeric array, padding with zeroes 
H2$S % Sort row-wise (specified to prevent 1v1 sorting)
1&Y) % Split attacker/defender
Y&t  % Logical and to filter out excess dice. Duplicate for 'do twice' later.
1M>  % Get throws again, decide who won
t~   % And the inverse to decide who lost
b,   % Bubble filter to the top. Do twice:
  Y& % Apply filter
  sD % Sum of losses. Display.

2

JavaScript (SpiderMonkey) , 97 83 78 byte

d=>a=>{for(u=v=0;d.sort()>[]&a.sort()>[];)a.pop()>d.pop()?u++:v++
return[u,v]}

Provalo online!

-4 byte e risolti grazie a @ovs e @Craig Ayre
-1 byte grazie a @Shaggy


Non funziona per un attaccante contro due difensori.
Neil,

Oh hmm non ci ho pensato. Lo
riparerò

2
Questo potrebbe funzionare.
Ovs,

La soluzione di @ ovs supera tutti i casi di test, è possibile salvare anche alcuni byte (il collegamento tio era troppo grande):d=>a=>{for(u=v=0;d.sort()>[]&a.sort()>[];)a.pop()>d.pop()?u++:v++;return[u,v]}
Craig Ayre,

La prima interruzione di riga non è necessaria e ti costa un byte.
Shaggy,

2

Buccia , 10 byte

M#eI¬¤z>Ö>

Provalo online!

Input come due distinti elenchi di rulli, output come nell'op.

Spiegazione

¤z>Ö> ordina ciascun elenco in ordine decrescente, quindi li comprime confrontando gli elementi corrispondenti (e troncando l'elenco più lungo).

M#eI¬crea un elenco di 2 elementi ( e) con conteggi ( #) di valori di verità (tramite identità I) e valori di falsa (tramite negazione logica ¬)


1

Perl 5 , 66 + 1 (-a) = 67 byte

@A=sort split/ /,<>;$b+=@A?pop@A>$_?-1:1:0for reverse sort@F;say$b

Provalo online!

Ingresso:

Due linee. La prima linea è difensore (giocatore 1), la seconda è attaccante (giocatore 2). Rotoli individuali separati da spazi.

Produzione:

Indica un cambiamento efficace nella forza del difensore rispetto all'attaccante.

Output Attacker Defender
   2      0        2        Defender wins both
   1      0        1        Defender wins the only roll
   0      1        1        Attacker wins first, defender wins second
  -1      1        0        Attacker wins the only roll
  -2      2        0        Attacker wins both rolls

"Il programma o la funzione deve generare un identificatore univoco per ciascuna delle 5 possibilità di output." Il tuo ha due output per [1,1]. Modifica la tua risposta per risolvere questo problema (ordina o somma)
fireflame241

Cosa c'è che non va in sei? È più specifico. :) L'ho modificato al costo di 6 byte.
Xcali,


0

R , 46 byte

function(x,y)s(s(y,T)[1:2]>s(x,T)[1:2])
s=sort

Provalo online!

Tutto ciò fa tre tipi e un confronto ... oltre a estrarre i primi due elementi nel mezzo.

L'input è di due vettori di lanci di dadi.

Uscita codificata come segue:

╔═══╦═══╗
║atk║def║
╠═══╬═══╣
║ 10TRUE01FALSE20TRUE  TRUE11FALSE TRUE02FALSE FALSE
╚═══╩═══╝

Funziona perché l'estrazione in R non ricicla l'argomento, ma riempie il risultato NAper raggiungere la lunghezza richiesta.

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.