Segna le forbici di carta-roccia


70

Dati due input di stringa di "Rock", "Paper" o "Scissors", determinare il risultato del round RPS . Uscita 1 se vince il primo giocatore, -1 se vince il secondo giocatore o 0 per un pareggio.

Rock Rock -> 0
Rock Paper -> -1
Rock Scissors -> 1
Paper Rock -> 1
Paper Paper -> 0
Paper Scissors -> -1
Scissors Rock -> -1
Scissors Paper -> 1
Scissors Scissors -> 0

È necessario utilizzare le stringhe esatte "Rock", "Paper" e "Scissors" come input. Puoi scegliere se la scelta del primo giocatore viene (coerentemente) data prima o seconda. In alternativa, puoi prenderli come input singolo con un carattere singolo o un separatore vuoto. L'ingresso è garantito uno dei 9 possibili abbinamenti delle tre scelte nel formato di input.

L'output dovrebbe essere un numero 1, 0 o -1, o la sua rappresentazione di stringa. I galleggianti vanno bene. Così sono +1, +0,e -0.

Correlati: Codificare un gioco RPS


Classifica:


Fa un singolo ingresso con separatore vuoto significa ad esempio "rockpaper"?
Emigna,

1
@Emigna Sì, ma maiuscolo come RockPaper.
xnor

15
È stato MOLTO più divertente di quanto mi aspettassi, mio ​​signore, ci sono modi fantastici per farlo.
Magic Octopus Urn

L'input può essere una matrice delle due stringhe?
Luis Mendo,

@LuisMendo Sì.
xnor

Risposte:


73

Groovy, 67 56 50 byte

{a,b->Math.sin(1.3*((int)b[0]-(int)a[0])).round()}

Provalo online!

Si scopre che il gioco del rock, della carta e delle forbici ha una proprietà piuttosto interessante.
Date le stringhe a e b, prendi la prima lettera di ciascuna, questo si traduce in due delle seguenti:R,P,S

L'elenco completo dei possibili valori sono (Quando vengono combinate 2 scelte):

XX=ASCII=Y=Wanted output
RR=82-82=0=0
PP=80-80=0=0
SS=83-83=0=0
RS=82-83=-1=1
RP=82-80=2=-1
PS=80-83=-3=-1
PR=80-82=-2=1
SR=83-82=1=-1
SP=83-80=3=1

Riorganizzare l'elenco in:

-3->-1
-2->1
-1->1
0->0
1->-1
2->-1
3->1

Ci dà una sequenza che sembra inversamente sinusoidale e puoi effettivamente rappresentare questa formula come approssimativamente (e per circa intendo appena appena abbastanza per funzionare, potresti ottenere un'equazione che è morta ma costa più byte):

-sin((4*a[0]-b[0])/PI).roundNearest() = sin(1.3*(b[0]-a[0])).roundNearest()

La semplificazione di 4 / pi a 1.3 è stata suggerita prima da @flawr e poi testata da @titus per un risparmio totale di 6 byte.

Spiegazione dell'equazione

Usando le doppie proprietà di arrotondamento di Groovy, questo produce l'output corretto per le forbici da roccia.


05AB1E , 10 byte (non competitivi)

Ç¥13T/*.½ò

Provalo online!

La stessa risposta è stata trasferita su 05AB1E utilizzando i nuovi comandi aggiunti il ​​26/10/2017.


3
Non potreste renderlo più breve utilizzando tale -sin(x) = sin(-x), che significa semplicemente invertendo l'ordine dei aed be far cadere il leader -? A parte questo, hardcoding un'approssimazione di 4/Picome 1.273potrebbe essere sufficiente, o 1.3o 9/7o 5/4.
flawr

2
PS: suggerisco anche di creare un link per provarlo online in modo che persone come me possano giocare con la tua presentazione =)
flawr

3
È possibile salvare 1 byte con sin(b-a)anziché -sin(a-b). Grande scoperta!
Tito

2
Salva altri 7 byte moltiplicando per 1.3invece di 4/Math.PI; è sufficientemente esatto.
Tito

1
@carusocomputingXX=ASCII=Y=Wanted output RR=82-82=0=0 PP=83-83=0=0 SS=80-80=0=0
CraigR8806,

44

C, 50 35 byte

#define f(i)*(short*)(i+7)%51%4%3-1

Chiama fcon una stringa contenente entrambi i giocatori, senza separatore, e restituirà se vince il primo.

Spiegazione:

Osservando le nove possibili stringhe, si scopre che le coppie di lettere sulle colonne 7 e 8 sono uniche:

       vv
RockPaper
PaperScissors
ScissorsRock
RockRock         // Sneakily taking advantage of the terminating zero
PaperPaper
ScissorsScissors
RockScissors
PaperRock
ScissorsPaper
       ^^

Il cast offset e selvaggio per short*recuperare queste coppie di lettere e interpretarle come numeri:

29285
29545
21107
107
25968
21363
29555
27491
20595

Poi è stata una questione di forza bruta per trovare le 51e 4resti, che viene successivamente applicata ridurre questi numeri per:

3 0 0 1 1 1 2 2 2

Che è semplicemente perfetto per affrontare l'ennesimo residuo alla fine e compensare il risultato.

Guardalo dal vivo su Coliru


Basta non fare nulla di simile -f(i)al calcolo per calcolare il punteggio dell'altro giocatore - ne risulterà un risultato imprevisto!
nneonneo,

4
@nneonneo -(f(i))dovrebbe funzionare bene. Le macro sono divertenti!
nwp,

18

MATLAB / Octave , 63 54 52 byte

È molto conveniente che i codici ASCII delle prime lettere di Rock,Paper,Scissorssiano R=82,P=80,S=83. Se sottraggiamo 79otteniamo convenientemente 3,1,4, che useremo ora come indici di matrice: qui una matrice 4x4 è hardcoded, dove la i,j-esima voce corrisponde al risultato se si inseriscono i valori di poco prima:

     1   2   3   4
  +---------------
1 |  0   0   1  -1
2 |  0   0   0   0
3 | -1   0   0   1
4 |  1   0  -1   0
A(5,5)=0;A(4:7:18)=1;A=A-A';@(x,y)A(x(1)-79,y(1)-79)

Provalo online!


16

Pure Bash, 31

Prendendo in prestito la formula di Dennis :

a=$1$1$2
echo $[(${#a}^67)%3-1]

Provalo online .


Risposta precedente:

Pure Bash, 43 35

echo $[(7+(${#2}^3)-(${#1}^3))%3-1]
  • Ottenere la lunghezza della stringa di ogni argomento ( 4, 5,8 rispettivamente, per il Rock, Paper, Scissors)
  • XOR ciascuna con 3 invia 7, 6, 11(che quando presa mod 3 dare 1, 0, 2)

  • Quindi sottrarre e giocherellare con mod 3 per ottenere il risultato desiderato.

Provalo online .


15

Python , 40 30 byte

lambda x,y:(len(2*x+y)^67)%3-1

Provalo online!

sfondo

Ho iniziato con il modello di funzione

lambda x,y:(len(a*x+b*y)^c)%d-e

e ha eseguito una ricerca della forza bruta per parametri adeguati utilizzando il seguente programma, quindi ne ha scelto uno con un'implementazione di lunghezza minima.

RPS = 'Rock Paper Scissors'.split()
g = lambda x,y:2-(94>>len(6*x+y)%7)%4
r = range(1,10)
R = range(100)

def f(a, b, c, d, e):
    h = lambda x,y:(len(a*x+b*y)^c)%d-e
    return all(g(x, y) == h(x, y) for x in RPS for y in RPS)

[
    print('%2d ' * 5 % (a, b, c, d, e))
    for e in r
    for d in r
    for c in R
    for b in r
    for a in r
    if f(a, b, c, d, e)
]

Provalo online!


14

Mathematica, 32 byte

Mod[{1,-1}.(Length/@#-3)!,3,-1]&

Funzione senza nome che accetta una coppia ordinata di elenchi di caratteri, ad esempio {{"R","o","c","k"},{"P","a","p","e","r"}}, e di ritorno -1|0|1.

Volevo che il codice evitasse non solo le tre parole di input, ma anche il nome della funzione troppo lunga ToCharacterCode; quindi ho lavorato con la lunghezza4,5,8 delle parole di input e cercato una breve funzione di quelle lunghezze che davano risposte distinte modulo 3. (La divisione intera per 2 è matematicamente promettente, ma quelle funzioni hanno nomi troppo lunghi in Mathematica).

Si scopre che prendendo il fattoriale di (la lunghezza - 3) si danno le risposte 1,2,120, che sono 1,-1,0modulo 3. Quindi calcoliamo, modulo 3, la differenza dei due valori (tramite il prodotto punto {1,-1}.{x,y} = x-y, che è un buon modo quando il due valori sono in un elenco).


1
"Si scopre ..." Hai un occhio per queste cose
ngenesi

12

Rubino, 36 35 30 byte

a=->a,b{(a+b)[12]?a<=>b:b<=>a}

Provalo su ideone.com

Uscita di prova:

a=->a,b{(a+b)[12]?a<=>b:b<=>a}

puts a.call("Rock", "Rock")
puts a.call("Rock", "Paper")
puts a.call("Rock", "Scissors")
puts a.call("Paper", "Rock")
puts a.call("Paper", "Paper")
puts a.call("Paper", "Scissors")
puts a.call("Scissors", "Rock")
puts a.call("Scissors", "Paper")
puts a.call("Scissors", "Scissors")

0
-1
1
1
0
-1
-1
1
0

Sfrutta il fatto che 7 dei 9 risultati corretti vengono generati semplicemente effettuando un confronto lessicografico utilizzando l'operatore dell'astronave <=>. Il (a+b)[12]solo inverte gli input al confronto se gli input sono Papere Scissors(e anche Scissors Scissors- ma questo è in 0entrambi i casi).

Grazie a Horváth Dávid per avermi salvato un personaggio e grazie a GB per avermi salvato un altro 5.


Puoi usare una lambda anonima e salvare 2 caratteri.
GB

@IT Se non attribuisco un nome alla funzione, come dovrei chiamarla? Mi sa di barare. Ma grazie per l'altro suggerimento: l'avevo guardato ma lo avevo rifiutato perché ScissorsScissors ha 16 anni, ma vedo che in realtà non importa. :-)
Gareth,


@Dennis Non puoi chiamarlo senza assegnarlo. Mi sembra un tradimento e ingiusto in lingue senza funzioni anonime che devono definire un nome.
Gareth,

Certo che puoi. tio.run/nexus/…
Dennis

10

Python , 39 36 34 33 byte

lambda x,y:2-(94>>len(6*x+y)%7)%4

Provalo online!

Come funziona

Diamo un'occhiata ad alcuni valori della lunghezza di sei copie di x e una copia di y modulo 7 .

                                l(x,y) =:
x        y        len(x) len(y) len(6*x+y)%7
--------------------------------------------
Rock     Rock          4      4            0
Rock     Paper         4      5            1
Rock     Scissors      4      8            4
Paper    Rock          5      4            6
Paper    Paper         5      5            0
Paper    Scissors      5      8            3
Scissors Rock          8      4            3
Scissors Paper         8      5            4
Scissors Scissors      8      8            0

Possiamo codificare i risultati ( {-1, 0, 1} ) mappandoli nel set {0, 1, 2, 3} . Ad esempio, la mappatura t ↦ 2 - t raggiunge questo ed è il suo contrario .

Denotiamo il risultato di x ed y da o (x, y) . Poi:

x        y        l(x,y) o(x,y) 2-o(x,y) (2-o(x,y))<<l(x,y)
-----------------------------------------------------------
Rock     Rock          0      0        2                10₂
Rock     Paper         1     -1        3               110₂
Rock     Scissors      4      1        1            010000₂
Paper    Rock          6      1        1          01000000₂
Paper    Paper         0      0        2                10₂
Paper    Scissors      3     -1        3             11000₂
Scissors Rock          3     -1        3             11000₂
Scissors Paper         4      1        1            010000₂
Scissors Scissors      0      0        2                10₂

Fortunatamente, i bit nelle ultime colonne sono tutti d'accordo tra loro, quindi possiamo OR per formare un singolo intero n e recuperare o (x, y) come 2 - (((n ≫ o (x, y))% 4) . Il valore di n è 94 .


9

Retina , 35 31 byte

G`k P|r S|s R
*\)`.+
-
D`\w+
 .

Provalo online!

Spiegazione

Funziona in due passaggi. Innanzitutto, stampiamo i segni meno per gli input rilevanti. Quindi stampiamo una 0cravatta e una 1altrimenti.

G`k P|r S|s R
*\)`.+
-

Sono due fasi. Nel )secondo stadio li raggruppano insieme, *li rende una corsa a secco (il che significa che la stringa di input verrà ripristinata dopo che sono stati elaborati, ma il risultato verrà stampato) e \sopprime la stampa di un avanzamento riga finale. Le due fasi insieme stamperanno a- se applicabile.

La prima fase è una Gfase rappresentante che mantiene solo la linea se contiene uno k P, r So s R. Questi corrispondono ai casi in cui dobbiamo produrre -1. Se non è uno di questi casi, l'input verrà sostituito con una stringa vuota.

Il secondo stadio sostituisce .+(l'intera stringa, ma solo se contiene almeno un carattere) con -. Quindi questo stampa un -per quei tre casi e nient'altro.

D`\w+
 .

Sono altre due fasi. Il primo stadio è Dun'eduplicazione. Abbina le parole e rimuove i duplicati. Quindi se e solo se l'input è un pareggio, questo lascia cadere la seconda parola.

Il secondo stadio conta il numero di partite di ., che è uno spazio seguito da qualsiasi personaggio. Se l'input è stato un pareggio e la seconda parola è stata rimossa, ciò si traduce in 0. Altrimenti, la seconda parola è ancora in atto e c'è una corrispondenza, quindi viene stampata 1.


Ecco un approccio diverso basato sulle lunghezze della stringa di input. È più lungo del tuo, ma mi chiedo se si possa giocare ancora a golf?
Digital Trauma,

@DigitalTrauma è un'idea davvero chiara, ma non vedo nulla per accorciarla. Penso che dovresti pubblicarlo comunque (e se sposti la prima riga nell'intestazione, TIO non la includerà nel conteggio dei byte).
Martin Ender,

8

05AB1E , 18 17 15 10 9 byte

6 byte salvati con il trucco della lunghezza di input di Digital Trauma

€g3^Æ>3%<

Accetta input come [SecondPlayersChoice,FirstPlayersChoice]

Provalo online! o Convalida tutti i casi di test

Soluzione alternativa a 9 byte: íø¬ÇÆ>3%<

Spiegazione

€g          # length of each in input
  3^        # xor 3
    Æ       # reduce by subtraction
     >      # increment
      3%    # modulus 3
        <   # decrement

Soluzione precedente a 15 byte

A-D{„PSÊiR}Ç`.S

Provalo online! o Convalida tutti i casi di test

Spiegazione

 A-               # remove the lowercase alphabet from the input (leaves a 2 char string)
   D{             # sort a copy of the leftover
     „PSÊ         # check if the copy isn't "PS" (our special case)
         iR}      # if true, reverse the string to get the correct sign
            Ç`    # convert the two letters to their character codes
              .S  # compare their values

Hai battuto il mio divertente :( Ç¥13T/*.½òPERCHÉ FUNZIONA? NESSUNO CONOSCE.
Magic Octopus Urn

@MagicOctopusUrn: Uuuh, quello è sicuramente strano. Quale sarebbe il formato di input per restituire un int come output?
Emigna


@MagicOctopusUrn: Oh sì, mi sono dimenticato di quello. La mia risposta preferita a questa sfida :)
Emigna,

6

Gelatina , 8 byte

L€Iµ-*×Ṡ

Provalo online! (suite di test, esegue il cast di numeri interi per maggiore chiarezza)

Come funziona

L€Iµ-*×Ṡ  Main link. Argument: A (string array)

L€        Take the length of each string.
  I       Increments; compute the forward difference of the length.
   µ      Begin a new chain with the difference d as argument.
    -*    Compute (-1)**d.
      ×Ṡ  Multiply the result with the sign of d.

6

Python 2 , 46 40 byte

lambda x,y:+(x!=y,-1)[x[0]+y[0]in'RPSR']

Provalo online!

Grazie mille a @Dennis per avermi permesso di prendere in prestito il suo codice di prova online e per avermi salvato 6 byte.

modificare

@ hashcode55 - Praticamente come lo descrivi. (x! = y, -1) è una sequenza di due elementi e [x [0] + y [0] in 'RPSR'] sta calcolando quale elemento prendere. Se la prima lettera di x + la prima lettera di y è nell'elenco dei caratteri, verrà valutata True o 1, quindi verrà restituito (x! = Y, -1) [1]. In caso contrario (x! = Y, -1) [0]. È qui che diventa un po 'complicato. Il primo elemento è di per sé efficacemente un altro if. Se x! = Y il primo elemento sarà True, altrimenti sarà False, quindi se x [0] + y [0] in 'RPSR' è falso, verrà restituito True o False a seconda che x == y. Il + è un po 'subdolo e grazie ancora a @Dennis per questo. X! = Y restituirà un vero o falso letterale. Abbiamo bisogno di un 1 o uno 0. Non so ancora come, ma il + fa questa conversione. Posso solo supporre che usando un operatore matematico su Vero / Falso lo costringe a essere visto come l'equivalente intero. Ovviamente il + davanti a -1 restituirà comunque -1.

Spero che sia di aiuto!


Ciao! Potete per favore dirmi come funziona questa sintassi? Logicamente indovinando, (x!=y,-1)questo funziona come se, se la lista genera un vero allora -1 altrimenti x!=y. A che serve quel +segno? Una fonte che documenta questo tipo di sintassi sarebbe davvero utile!
hashcode55,

@ hashcode55 - Ho aggiunto una spiegazione alla mia risposta.
ElPedro,

Per rispondere alla tua incertezza sul +- in questo caso, questo è un vantaggio unario +10, ed è essenzialmente un modo breve per convertire in un numero intero.
FlipTack,

Grazie @ FlipTack. Kinda indovinò che era quello che stava facendo, ma grazie per la spiegazione corretta.
ElPedro,

@ElPedro Grazie mille! Questo mi ha davvero aiutato.
hash55

5

JavaScript (ES6), 46 38 byte

(a,b)=>(4+!b[4]+!b[5]-!a[4]-!a[5])%3-1

Si avvale del fatto che Rock-Paper-Scissors è ciclico. JavaScript non ha né astronave né operatori ternari bilanciati, altrimenti la risposta sarebbe (a,b)=>((b<=>'Rock')-(a<=>'Rock'))%%3.

Modifica: salvato 8 byte grazie a @WashingtonGuedes.


1
@WashingtonGuedes Posso fare anche meglio di così!
Neil,

Potresti curry per salvare 1 byte
MayorMonty il

ho provato a eseguirlo e restituisco sempre 0
Vitim.us

5

MATL , 14 13 byte

TTt_0vic1Z)d)

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

Se il codice ASCII della lettera iniziale della prima stringa viene sottratto da quello della seconda stringa otteniamo il valore nella colonna D in basso. Prendendo modulo 5 fornisce il valore M . Il valore finale tra parentesi è il risultato desiderato, R .

                        D        M     R
                       ---      ---   ---
Rock Rock          ->   0   ->   0   ( 0) 
Rock Paper         ->  −2   ->   3   (−1)
Rock Scissors      ->   1   ->   1   ( 1)
Paper Rock         ->   2   ->   2   ( 1)
Paper Paper        ->   0   ->   0   ( 0)
Paper Scissors     ->   3   ->   3   (−1)
Scissors Rock      ->  −1   ->   4   (−1)
Scissors Paper     ->  −3   ->   2   ( 1)
Scissors Scissors  ->   0   ->   0   ( 0)

Quindi se calcoliamo D e poi M , per ottenere R dobbiamo solo mappare da 0 a 0; 1 e 2 a 1; 3 e 4 a −1. Questo può essere fatto indicizzando in un array di cinque voci pari a 0, 1 o −1. Poiché l'indicizzazione in MATL è basata su 1 e modulare, l'array dovrebbe essere [1, 1, −1, −1, 0](la prima voce ha indice 1, l'ultima ha indice 5 o equivalentemente 0). Infine, l'operazione modulo 5 può fortunatamente essere evitata, poiché è implicitamente eseguita dall'indicizzazione modulare.

TT     % Push [1 1]
t_     % Duplicate, negate: pushes [−1 −1]
0      % Push 0
v      % Concatenate vertically into the 5×1 array [1; 1; −1; −1; 0]
i      % Input cell array of strings
c      % Convert to 2D char array, right-padding with zeros if necessary
1Z)    % Take the first column. Gives a 2×1 array of the initial letters
d      % Difference
)      % Index into array. Implicit display

5

CJam , 12 byte

0XXWW]rcrc-=

I due ingressi sono separati da spazio. Il loro ordine è invertito rispetto a quello nel testo della sfida.

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

Traduzione della mia risposta MATL . Questo sfrutta il fatto che in CJam c(convertito in char) applicato su una stringa prende il suo primo carattere. Inoltre, l'array per il mapping è diverso perché l'indicizzazione in CJam è basata su 0.

0XXWW    e# Push 0, 1, 1, -1, -1
]        e# Pack into an array
rc       e# Read whitespace-separated token as a string, and take its first char
rc       e# Again
-        e# Subtract code points of characters
=        e# Index into array. Implicitly display

5

CJam, 15 14 12 byte

rW=rW=-J+3%(

Prendi il codice ascii dell'ultimo carattere di ogni stringa, quindi restituisce:

(a1 - a2 + 19) % 3 - 1

Provalo qui !


5

Python 3, 54 byte

lambda o,t:(o!=t)*[-1,1]['RPS'['PS'.find(t[0])]!=o[0]]

Provalo online!


4

Java 7, 82 byte

int c(String...a){int x=(a[0].charAt(1)-a[1].charAt(1))%5/2;return x%2==x?x:x/-2;}

Ungolfed:

int c(String... a){
   int x = (a[0].charAt(1) - a[1].charAt(1)) % 5 / 2;
   return x%2 == x
           ? x
           : x / -2;
}

Spiegazione:

  • La seconda lettere sono o, ae c, con i decimali ASCII 111, 97e 99.
  • Se li sottraggiamo l'uno dall'altro per i casi di test, otteniamo i seguenti risultati:
    • 0 (Rock, Rock)
    • 14 (Rock, carta)
    • 12 (Carta, forbici)
    • -14 (Carta, Rock)
    • 0 (Carta, carta)
    • -2 (Carta, forbici)
    • -2 (Forbici, roccia)
    • 2 (Forbici, carta)
    • 0 (Forbici, forbici)
  • Se prendiamo modulo 5 per ciascuno, otteniamo 4, 2, -4, -2, -2, 2.
  • Diviso per 2 xè ora il seguente per i casi di test:
    • x = 0 (Rock, Rock)
    • x = 2 (Rock, Paper)
    • x = 1 (carta, forbici)
    • x = -2 (Carta, Rock)
    • x = 0 (carta, carta)
    • x = -1 (carta, forbici)
    • x = -1 (Forbici, Roccia)
    • x = 1 (forbici, carta)
    • x = 0 (forbici, forbici)
  • Solo 2e -2sono errati e avrebbero dovuto essere -1e 1invece. Quindi se x%2 != x(tutto sopra 1o sotto -1) ci dividiamo -2per sistemare questi due "casi limite".

Codice di prova:

Provalo qui.

class M{
  static int c(String...a){int x=(a[0].charAt(1)-a[1].charAt(1))%5/2;return x%2==x?x:x/-2;}

  public static void main(String[] a){
    String R = "Rock",
           P = "Paper",
           S = "Scissors";
    System.out.println(c(R, R)); // 0
    System.out.println(c(R, P)); // -1
    System.out.println(c(R, S)); // 1
    System.out.println(c(P, R)); // 1
    System.out.println(c(P, P)); // 0
    System.out.println(c(P, S)); // -1
    System.out.println(c(S, R)); // -1
    System.out.println(c(S, P)); // 1
    System.out.println(c(S, S)); // 0
  }
}

Produzione:

0
-1
1
1
0
-1
-1
1
0

Perché la seconda lettera per curiosità? Ho avuto lo stesso approccio (kinda) ma ho usato la prima lettera.
Magic Octopus Urn

@carusocomputing Bene, ho notato che la maggior parte delle altre persone utilizzavano la prima lettera o la lunghezza e volevano provare qualcos'altro. Ho usato il terzo lettere ( c, p, i) con i valori ASCII 99, 112e 105, come sembravano più utili, e ho notato che sarebbe diventato 4, 2, 0 se l'ho fatto modulo 5. Solo allora ho pensato che non avevo per sottrarre entrambi, in modo i 4, 2 e 0 non erano di grande utilità. Dopo alcuni tentennamenti / tentativi ed errori ho provato la seconda lettera e stavo ottenendo risultati più utili con lo stesso modulo 5 ancora presente. Poi sono arrivato rapidamente alla soluzione che ho presentato sopra. :)
Kevin Cruijssen,

@carusocomputing Volevo provare un approccio unico, e considerando che sono abbastanza cattivo con questo tipo di soluzioni, non è breve come alcune altre soluzioni, ma comunque unico (che era il mio obiettivo iniziale). :)
Kevin Cruijssen,

4

dc, 18

1?Z9+2/rZ1+2/-3%-p

Provalo online .

Si noti che i due argomenti vengono passati (separati da spazio) su una riga a STDIN. Gli arg sono racchiusi tra parentesi quadre [ ]poiché è così che dcpiacciono le sue stringhe.

dcha una gestione delle stringhe molto limitata, ma risulta che una delle cose che puoi fare è usare il Zcomando per ottenere una lunghezza della stringa, che fortunatamente è distinta per "Rock", "Paper" e "Scissors", e può essere abbastanza semplicemente aritmetica manipolato per dare il risultato desiderato.



3

Pyth, 16

t%+7h.+mx3ldQ3

Probabilmente potrebbe essere più breve.

        x3ld      # lambda to get string length then XOR with 3
       m    Q     # map over the input (array of 2 strings)
     .+           # difference of the two results
    h             # flatten one-element array
  +7              # add 7
 %           3    # mod 3
t                 # subtract 1 and implicit print

Online .


3

C #, 85 84 byte

Salvato 1 byte, grazie a TheLethalCoder

a=>b=>a==b?0:(a[0]=='R'&b[0]=='S')|(a[0]=='P'&b[0]=='R')|(a[0]=='S'&b[0]=='P')?1:-1;

Accetta due stringhe come input e genera un numero intero. C'è un pareggio, se le due stringhe sono uguali, altrimenti controlla il primo carattere delle stringhe, al fine di determinare quale giocatore vince.


Salvare un byte utilizzando curry, ad esempioa=>b=>...
TheLethalCoder

3

JavaScript, 37 , 32 , 31 byte

a=>b=>a==b?0:!(a+b)[12]^a>b||-1

Se a è uguale a b, output zero.

Altrimenti, xo il risultato del controllo se la lunghezza non è maggiore di 12 (confronto di forbici e carta) con il confronto di un maggiore di b.
Se restituisce 1, restituiscilo.

Se restituisce 0, utilizzare l'operatore OR per sostituire con -1.


Potresti scrivere questo come una funzione a=>b=>al curry per salvare un byte?
FlipTack

Sì. Grazie @FlipTack
Grax32

2

Lotto, 116 byte

@if %1==%2 echo 0&exit/b
@for %%a in (RockScissors PaperRock ScissorsPaper)do @if %%a==%1%2 echo 1&exit/b
@echo -1

2

Perl, 33 byte

32 byte di codice + -pflag.

$_=/(.+) \1/?0:-/k P|r S|s R/||1

Per eseguirlo:

perl -pe '$_=/(.+) \1/?0:-/k P|r S|s R/||1' <<< "Rock Paper"

Hai salvato 3 byte usando la regex della risposta Retina di Martin Ender . (il mio regex precedente era /R.*P|P.*S|S.*R/)

Spiegazione:

Innanzitutto, /(.+) \1/controlla se l'input contiene il doppio della stessa parola, in tal caso, il risultato è 0. Altrimenti, si /k P|r S|s R/occupa del caso in cui si trova la risposta -1. Se quest'ultimo regex è falso, allora -/k P|r S|s R/è falso, quindi torniamo 1.


2

Gelatina , 9 byte

L€^3Iæ%1.

Questo utilizza l'algoritmo della risposta di Bash di @ DigitalTrauma .

Provalo online!

Come funziona

L€^3Iæ%1.  Main link. Argument: A (string array)

L€         Take the length of each string.
  ^3       XOR the lengths bitwise with 3.
    I      Increments; compute the forward difference of both results.
     æ%1.  Balanced modulo 1.5; map the results into the interval (-1.5, 1.5].

Accidenti, stavo per iniziare a leggere su Jelly. Oh bene, eccolo qui in Pyth . +1.
Trauma digitale

2

Japt , 19 byte

-Ms(4*(Uc -Vc)/MP¹r

Provalo qui!

Ispirato alla soluzione di carusocomputing

Vecchia soluzione a 53 byte

W=Ug c X=Vg c W¥X?0:W¥82©X¥83?1:W¥80©X¥82?1:W¥83©X¥80?1:J

Provalo online!

Grazie ancora, ETHproductions!


1
È possibile iniziare utilizzando ©invece di &&, modificando Ug0 cin Ug c(stesso con V) e sostituendolo -1con J. È comunque un po 'più lungo della risposta di JS , forse puoi prendere alcune idee da questo
ETHproductions

@ETHproductions Grazie! Non so come dimenticarmene©
Oliver,

1
In realtà puoi semplicemente farlo W=Uc. Non so perché continuo a dimenticare che cfunziona su qualsiasi stringa: P
ETHproductions

2

PHP, 55 53 byte

<?=(3-(ord($argv[2])%6%4-ord($argv[1])%6%4+3)%3*2)%3;
  • accetta i valori ASCII delle prime lettere (dagli argomenti della riga di comando): 82,80,83
  • % 6: 4,2,5
  • % 4: 0,2,1
  • differenza (ba):
    • PS: 1-2, SR: 2-0, RP: 2-0 -> -1 o 2; + 3,% 3 -> 2
    • SP: 2-1, RS: 0-2, PR: 0-2 -> -2 o 1; + 3,% 3 -> 1
    • RR, PP, SS: 0; + 3,% 3: 0
  • (3-2 * x): -1,1,3
  • % 3: -1,1,0

versione sinusoidale, 49 46 byte

<?=2*sin(1.3*(ord($argv[2])-ord($argv[1])))|0;

un porto golfizzato di risposta carusocomputing :

3 byte salvati da @utente59178


1
Per la versione sinusoidale puoi salvare 3 byte sostituendo round(x)con2*x^0
user59178 il

2

Perl, 25 byte

$_=/kS|rR|sP/-/kP|rS|sR/

Codice 24 byte +1 byte per -p opzione.

L'ingresso dovrebbe essere su stdin senza separatori, ad esempio:

echo PaperRock | perl -pe'$_=/kS|rR|sP/-/kP|rS|sR/'

Il primo regexp cerca la vittoria del primo giocatore, il secondo la sua perdita. La differenza è stampata.


1

Scala, 148 byte

object R extends App{val t=Seq('R','P','S')
val(a,b)=(args(0)(0),args(1)(0))
print(if(a==b)0 else if(t.indexOf(a)%3==(t.indexOf(b)-1)%3)-1 else 1)}

Per fortuna, poiché sono richiesti i punti e virgola per separare più comandi sulla stessa linea, Scala trae vantaggio dall'avere un codice di golf formattabile!

In questo tentativo di golf ho imparato che puoi sostituirlo

"somestring".charAt(index) 

con

"somestring"(index) 

perché Scala ti consente di trattare le stringhe come matrici allo scopo di ottenere caratteri.


Questo può essere immensamente giocato a golf. Per i principianti, ti è permesso fare una funzione invece di un programma completo nella maggior parte delle sfide qui, quindi invece dell'intero oggetto estende la cosa dell'app e estraendo args, prova qualcosa del tipo: def g (a: Seq, b: Seq) = ...
Ethan,

Inoltre, non è necessario stampare il valore. Restituirlo è sufficiente, il che è fantastico quando si gioca a golf alla Scala, poiché il ritorno è gratuito. E puoi migliorarlo ulteriormente usando il trucco pubblicato nella risposta Groovy, che funziona in modo quasi identico in Scala.
Ethan,
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.