2010-05-08 14 views
23

Quindi sto scrivendo un semplice gioco Rock, Paper, Scissors in C (è per un compito a proposito, anche se la cosa principale è imparare le prese. Sospetto che sarà dovuto prima che ottenga una buona risposta). Ho impostato come Rock = 0, Paper = 1 e Scissors = 2. C'è un one-liner facile per determinare chi vince? Ho provato a giocarci su carta, ma non riuscivo a capire nessun motivo.One-liner per determinare chi vince in Rock, Paper, Scissors

+1

Se questa domanda non riguarda la parte socket dell'assegnazione, potrebbe facilmente essere convertita in un '[code-golf]'. – Pops

+5

6 minuti per una buona risposta, quando è dovuto il tuo incarico? –

+0

Come nota, in genere assegnerei quei valori (rock, carta, forbici, dinamite) a stringhe o caratteri. In generale è una cattiva pratica renderli un numero perché logicamente non vorrai mai aggiungerli. Questo non è importante per i problemi di assegnazione, ma è bene prendere l'abitudine, quindi quando hai problemi più grandi non ti prendono a calci in culo. – sixtyfootersdude

risposta

77
winner = (3 + player1 - player2) % 3; 

Questo darà 1 se il giocatore 1 vince, 2 se il giocatore 2 vince, 0 per un pareggio.

Spiegazione: nella sequenza Rock=0, Paper=1, Scissors=2, ogni articolo sconfigge il precedente. Questo è vero anche se consideriamo la sequenza come involucro (ovvero, l'ultimo elemento precede il primo).

Per mettere questo in termini più matematici, per qualsiasi elemento X:

  • X viene sconfitto da (X+1) % 3.
  • X sconfitte (X+2) % 3.

Da questo, si può dimostrare che (3+X-Y) % 3 è 1 se X sconfigge Y o Y 2 se sconfigge X.

Aggiunta 3 è necessaria per forzare il risultato di essere non negativo: Il modulo di un numero negativo sarà negativo o pari a zero in C99 e dipendente dall'implementazione in C89.

+12

Questo è brillante, ma un one-liner ha bisogno di almeno 3 linee di documentazione. –

+2

+1 Mettimi in una stanza con due scimmie e tre scrittori di tipo per tutta l'eternità e non lo faremmo mai !!! –

+0

Penso che c abbia questo tipo di costrutto: '(3 + player1 - player2)% 3 == 1? winner = "player1": (3 + player1 - player2)% 3 == 2? winner = "player2": winner = "everyone"; ' – sixtyfootersdude

Problemi correlati