Pontuação pedra-papel-tesoura

70

Dadas duas entradas de string de "Rock", "Paper" ou "Scissors", determine o resultado da rodada RPS . Saída 1 se o primeiro jogador vencer, -1 se o segundo jogador vencer, ou 0 para um empate.

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

Você deve usar as seqüências exatas "Rock", "Paper" e "Scissors" como entradas. Você pode escolher se a escolha dos primeiros jogadores é (consistentemente) dada em primeiro ou segundo. Como alternativa, você pode tomá-los como uma única entrada com um separador de caractere ou vazio. A entrada é garantida com um dos 9 pares possíveis das três opções no seu formato de entrada.

A saída deve ser um número 1, 0 ou -1 ou sua representação de sequência. Carros alegóricos são bons. Assim são +1, +0,e -0.

Relacionados: Codificando um jogo de RPS


Entre os melhores:

xnor
fonte
Será que uma única entrada com separador vazio significa, por exemplo, "rockpaper"?
Emigna
11
@Emigna Sim, mas em maiúsculas RockPaper.
xnor
15
Isso foi MUITO mais divertido do que eu esperava, meu senhor, existem algumas maneiras legais de fazer isso.
Magic Octopus Urn
A entrada pode ser uma matriz das duas seqüências?
Luis Mendo
@LuisMendo Sim.
Xnor

Respostas:

73

Groovy, 67 56 50 bytes

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

Experimente online!

Acontece que o jogo de pedra, papel e tesoura tem uma propriedade bem legal.
Dadas as seqüências aeb, pegue a primeira letra de cada uma, isso resulta em dois dos seguintes itens:R,P,S

A lista exaustiva de valores possíveis é (quando duas opções são combinadas):

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

Reorganizando a lista para:

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

Nos fornece uma sequência que parece inversamente sinusoidal, e você pode realmente representar essa fórmula como aproximadamente (e por aproximadamente eu quero dizer apenas o suficiente para funcionar, você pode obter uma equação que está morta, mas custa mais bytes):

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

A simplificação de 4 / pi para 1,3 foi sugerida primeiro por @flawr e depois testada por @titus para uma economia total de 6 bytes.

Explicação da equação

Usando as propriedades de duplo arredondamento do groovy, isso resulta na saída correta para pedra-papel-tesoura.


05AB1E , 10 bytes (não concorrência)

Ç¥13T/*.½ò

Experimente online!

Mesma resposta portada para 05AB1E usando os novos comandos adicionados em 26/10/2017.

Urna de polvo mágico
fonte
3
Você não poderia torná-lo mais curto usando esse -sin(x) = sin(-x), isso significa apenas invertendo a ordem de ae be soltando o líder -? Fora isso, codificar uma aproximação 4/Pisemelhante 1.273pode ser suficiente, ou 1.3ou 9/7ou 5/4.
flawr
2
PS: Eu também sugerem fazer um link para experimentá-lo on-line para que as pessoas como eu pode brincar com o seu envio =)
flawr
3
Você pode salvar 1 byte em sin(b-a)vez de -sin(a-b). Ótima descoberta!
Titus
2
Salve outros 7 bytes multiplicando por em 1.3vez de 4/Math.PI; isso é suficientemente exato.
Titus
11
@carusocomputingXX=ASCII=Y=Wanted output RR=82-82=0=0 PP=83-83=0=0 SS=80-80=0=0
CraigR8806
44

C, 50 bytes 35

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

Ligue fcom uma string contendo os dois jogadores, sem separador, e ele retornará se o primeiro vencer.

Explicação:

Observando as nove cadeias possíveis, verifica-se que os pares de letras nas colunas 7 e 8 são únicos:

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

O deslocamento e o elenco selvagem para short*recuperar esses pares de letras e interpretá-los como números:

29285
29545
21107
107
25968
21363
29555
27491
20595

Em seguida, era uma questão de força bruta encontrar os restos 51e 4, que eram aplicados sucessivamente para reduzir esses números a:

3 0 0 1 1 1 2 2 2

O que é perfeito para aplicar mais um restante no final e compensar o resultado.

Veja ao vivo em Coliru

Quentin
fonte
Apenas não faça nada como calcular -f(i)para calcular a pontuação do outro jogador - resultará em uma saída inesperada!
Nneonneo 12/01/19
4
@nneonneo -(f(i))deve funcionar bem. Macros são divertidas!
nwp 12/01
18

MATLAB / Oitava , 63 54 52 bytes

É muito conveniente que os códigos ASCII das primeiras letras de Rock,Paper,Scissorssão R=82,P=80,S=83. Se subtrairmos 79, obtemos de forma conveniente 3,1,4, que usaremos agora como índices de matriz: Aqui uma matriz 4x4 é codificada, onde a i,j-ésima entrada corresponde ao resultado se você inserir os valores imediatamente antes:

     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)

Experimente online!

flawr
fonte
16

Pure Bash, 31

Empréstimos na fórmula de Dennis :

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

Experimente online .


Resposta anterior:

Pure Bash, 43 35

echo $[(7+(${#2}^3)-(${#1}^3))%3-1]
  • Obter o comprimento da corda de cada arg ( 4, 5, 8respectivamente, para Rock, Paper, Scissors)
  • XOR cada um com 3 a dar 7, 6, 11(que, quando tomado mod 3 dão 1, 0, 2)

  • Subtraia e mexa no mod 3 para obter o resultado desejado.

Experimente online .

Trauma Digital
fonte
15

Python , 40 30 bytes

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

Experimente online!

fundo

Comecei com o modelo de função

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

e executou uma pesquisa de força bruta por parâmetros adequados usando o programa a seguir, depois selecionou um com uma implementação de tamanho mínimo.

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)
]

Experimente online!

Dennis
fonte
14

Mathematica, 32 bytes

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

Função sem nome, recebendo um par ordenado de listas de caracteres, como {{"R","o","c","k"},{"P","a","p","e","r"}}, e retornando -1|0|1.

Eu queria que o código evitasse não apenas as três palavras de entrada, mas também o nome da função muito longa ToCharacterCode; então trabalhei com o comprimento 4,5,8das palavras de entrada e procurei uma função curta daqueles comprimentos que davam respostas distintas no módulo 3. (A divisão inteira por 2 é matematicamente promissora, mas essas funções têm nomes muito longos no Mathematica.)

Acontece que tomar o fatorial de (o comprimento - 3) fornece as respostas 1,2,120, que são o 1,-1,0módulo 3. Em seguida, calculamos, no módulo 3, a diferença dos dois valores (via produto escalar {1,-1}.{x,y} = x-y, que é uma boa maneira quando o dois valores estão em uma lista).

Greg Martin
fonte
11
"Acontece ..." Você está de olho nessas coisas
ngenisis
12

Ruby, 36 35 30 bytes

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

Experimente em ideone.com

Saída de teste:

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

Aproveita o fato de que 7 dos 9 resultados corretos são gerados apenas fazendo uma comparação lexicográfica usando o operador de nave espacial <=>. O (a+b)[12]just inverte as entradas para a comparação se as entradas são Papere Scissors(e também Scissors Scissors- mas isso é 0inverso).

Agradeço a Horváth Dávid por me salvar um personagem e a GB por me salvar mais 5.

Gareth
fonte
Você pode usar uma lambda anônima e salvar 2 caracteres.
GB
Se não der um nome à função, como devo chamá-la? Isso cheira a traição para mim. Mas obrigado pela outra dica - eu tinha olhado para ela, mas a rejeitei porque ScissorsScissors tem 16 anos, mas vejo que isso realmente não importa. :-)
Gareth
@ Dennis Você não pode ligar sem atribuir. Parece trapaça para mim e injusto em idiomas sem funções anônimas que precisam definir um nome.
Gareth
Certamente você pode. tio.run/nexus/…
Dennis
10

Python , 39 36 34 33 bytes

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

Experimente online!

Como funciona

Vamos dar uma olhada em alguns valores no comprimento de seis cópias de xe uma cópia de y módulo 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

Podemos codificar os resultados ( {-1, 0, 1} ) mapeando-os no conjunto {0, 1, 2, 3} . Por exemplo, o mapeamento t ↦ 2 - t consegue isso e é inverso.

Vamos denotar o resultado de x e y por o (x, y) . Então:

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₂

Felizmente, todos os bits das últimas colunas concordam entre si; portanto, podemos OR para formar um único inteiro n e recuperar o (x, y) como 2 - ((n ≫ o (x, y))% 4) . O valor de n é 94 .

Dennis
fonte
9

Retina , 35 31 bytes

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

Experimente online!

Explicação

Isso funciona em duas etapas. Primeiro, imprimimos os sinais de menos para as entradas relevantes. Em seguida, imprimimos um 0para gravatas e 1outro.

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

Este é dois estágios. No )segundo estágio, agrupa-os, *faz com que sejam executados a seco (o que significa que a sequência de entrada será restaurada após o processamento, mas o resultado será impresso) e \suprime a impressão de um avanço de linha à direita. Os dois estágios juntos imprimirão um, -se aplicável.

A primeira fase é uma Gfase rep que só mantém a linha se contiver quer k P, r Sou s R. Eles correspondem aos casos em que precisamos produzir -1. Se não for um desses casos, a entrada será substituída por uma sequência vazia.

O segundo estágio substitui .+(a sequência inteira, mas apenas se contiver pelo menos um caractere) por -. Portanto, isso imprime um -para esses três casos e nada mais.

D`\w+
 .

Este é mais dois estágios. O primeiro estágio é uma Ddesduplicação. Combina palavras e remove duplicatas. Portanto, se e somente se a entrada estiver empatada, isso eliminará a segunda palavra.

O segundo estágio conta o número de correspondências de ., que é um espaço seguido por qualquer caractere. Se a entrada foi um empate e a segunda palavra foi removida, isso resulta em 0. Caso contrário, a segunda palavra ainda está no lugar e há uma correspondência, sendo impressa 1.

Martin Ender
fonte
Aqui está uma abordagem diferente com base nos comprimentos das strings de entrada. É mais longo que o seu, mas eu me pergunto se poderia ser jogado mais.
Digital Trauma
@DigitalTrauma é uma ideia muito legal, mas não estou vendo nada para encurtá-la. Eu acho que você deve publicá-lo de qualquer maneira (e se você mover a primeira linha para o cabeçalho, o TIO não o incluirá na contagem de bytes).
Martin Ender
8

05AB1E , 18 17 15 10 9 bytes

6 bytes salvos com o truque de comprimento de entrada do Digital Trauma

€g3^Æ>3%<

Aceita entrada como [SecondPlayersChoice,FirstPlayersChoice]

Experimente online! ou Validar todos os casos de teste

Solução alternativa de 9 bytes: íø¬ÇÆ>3%<

Explicação

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

Solução anterior de 15 bytes

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

Experimente online! ou Validar todos os casos de teste

Explicação

 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
Emigna
fonte
Você bater o meu divertimento um :( Ç¥13T/*.½ò? Por que funciona ninguém sabe.
Magia Octopus Urna
@MagicOctopusUrn: Uuuh, isso com certeza é estranho. Qual seria o formato de entrada para retornar um int como saída?
Emigna
['R','P']: P É um porto disso.
Magic Octopus Urn
@MagicOctopusUrn: Ah sim, eu esqueci disso. Minha resposta favorita para este desafio :)
Emigna
6

Gelatina , 8 bytes

L€Iµ-*×Ṡ

Experimente online! (suíte de teste, lança para inteiro para maior clareza)

Como funciona

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.
Dennis
fonte
6

Python 2 , 46 40 bytes

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

Experimente online!

Muito obrigado ao @Dennis por me emprestar seu código de teste do Try it online e por me salvar 6 bytes.

Editar

@ hashcode55 - Praticamente como você descreve. (x! = y, -1) é uma sequência de dois elementos e [x [0] + y [0] em'RPSR '] está computando qual elemento levar. Se a primeira letra de x + a primeira letra de y estiver na lista de caracteres, ela será avaliada como True ou 1, então (x! = Y, -1) [1] será retornado. Se não for, então (x! = Y, -1) [0]. É aqui que fica um pouco complicado. O primeiro elemento é efetivamente outro se. Se x! = Y, o primeiro elemento será True; caso contrário, será False; portanto, se x [0] + y [0] em 'RPSR' for false, True ou False será retornado, dependendo de x == y. O + é um pouco sorrateiro e obrigado novamente a @Dennis por este. O x! = Y retornará um literal Verdadeiro ou Falso. Precisamos de 1 ou 0. Ainda não sei bem como, mas o + faz essa conversão. Só posso assumir que, usando um operador matemático em True / False, ele está forçando a ser visto como o equivalente inteiro. Obviamente, o + na frente do -1 ainda retornará -1.

Espero que isto ajude!

ElPedro
fonte
Oi! Você pode me dizer como esta sintaxe está funcionando? Adivinhando logicamente, (x!=y,-1)isso está funcionando como se, se a lista gerar um true, então -1 else x!=y. Qual é a utilidade desse +sinal? Uma fonte que documentasse esse tipo de sintaxe seria realmente útil!
precisa saber é o seguinte
@ hashcode55 - Adicionei uma explicação à minha resposta.
ElPedro
Responder à sua incerteza sobre o +- nesse caso, é uma vantagem unária, como +10, e é essencialmente uma maneira curta de converter para um número inteiro.
FlipTack
Obrigado @FlipTack. Meio que adivinhei o que estava fazendo, mas obrigado pela explicação adequada.
ElPedro
@ElPedro Muito obrigado! Isso realmente me ajudou.
precisa saber é o seguinte
5

JavaScript (ES6), 46 38 bytes

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

Faz uso do fato de que pedra-papel-tesoura é cíclica. O JavaScript não possui naves espaciais nem operadores ternários equilibrados; caso contrário, a resposta seria (a,b)=>((b<=>'Rock')-(a<=>'Rock'))%%3.

Editar: salvou 8 bytes graças a @WashingtonGuedes.

Neil
fonte
11
@WashingtonGuedes Eu posso fazer ainda melhor do que isso!
Neil
Você poderia curry para economizar 1 byte
MayorMonty 30/08
Eu tentei executá-lo e sempre retornar 0
Vitim.us
5

MATL , 14 13 bytes

TTt_0vic1Z)d)

Experimente online! Ou verifique todos os casos de teste .

Explicação

Se o código ASCII da letra inicial da primeira string for subtraído do código da segunda string, obteremos o valor na coluna D abaixo. Tomando modulo 5 dá o valor M . O valor final entre parênteses é o resultado desejado, 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)

Assim, se calcularmos D e, em seguida , M , para obter R , precisamos apenas mapear 0 a 0; 1 e 2 a 1; 3 e 4 a -1. Isso pode ser feito indexando em uma matriz de cinco entradas iguais a 0, 1 ou -1. Como a indexação no MATL é baseada em 1 e modular, a matriz deve ser [1, 1, −1, −1, 0](a primeira entrada possui o índice 1, a última possui o índice 5 ou equivalente 0). Finalmente, a operação do módulo 5 pode ser evitada com sorte, porque é implicitamente realizada pela indexação modular.

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
Luis Mendo
fonte
5

CJam , 12 bytes

0XXWW]rcrc-=

As duas entradas são separadas por espaço. Sua ordem é revertida em relação à do texto do desafio.

Experimente online! Ou verifique todos os casos de teste .

Explicação

Tradução da minha resposta MATL . Isso explora o fato de que no CJam c(converter para char) aplicado a uma string obtém seu primeiro caractere. Além disso, a matriz para o mapeamento é diferente porque a indexação no CJam é baseada em 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
Luis Mendo
fonte
5

CJam, 15 14 12 bytes

rW=rW=-J+3%(

Pegue o código ascii do último caractere de cada string e retorne:

(a1 - a2 + 19) % 3 - 1

Teste aqui !

Arnaud
fonte
4

Java 7, 82 bytes

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;
}

Explicação:

  • As segundas letras são o, ae c, com os decimais ASCII 111, 97e 99.
  • Se subtraímos esses dados uns dos outros para os casos de teste, temos os seguintes resultados:
    • 0 (Rock, Rock)
    • 14 (Pedra, papel)
    • 12 (Papel, tesoura)
    • -14 (Papel, Pedra)
    • 0 (Papel, Papel)
    • -2 (Papel, tesoura)
    • -2 (Tesoura, Pedra)
    • 2 (Tesoura, Papel)
    • 0 (Tesoura, Tesoura)
  • Se tomarmos modulo 5 para cada, obtemos 4, 2, -4, -2, -2, 2.
  • Dividido por 2 xagora é o seguinte para os casos de teste:
    • x = 0 (Rocha, Rocha)
    • x = 2 (Rocha, Papel)
    • x = 1 (papel, tesoura)
    • x = -2 (Papel, Rocha)
    • x = 0 (papel, papel)
    • x = -1 (Papel, Tesoura)
    • x = -1 (Tesoura, Pedra)
    • x = 1 (tesoura, papel)
    • x = 0 (tesoura, tesoura)
  • Somente o 2e -2está incorreto, e deveria ter sido -1e, em 1vez disso. Portanto, se x%2 != x(tudo acima 1ou abaixo -1) nos dividirmos -2para consertar esses dois 'casos extremos'.

Código do teste:

Experimente aqui.

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
  }
}

Resultado:

0
-1
1
1
0
-1
-1
1
0
Kevin Cruijssen
fonte
Por que a segunda carta por curiosidade? Eu tive a mesma abordagem (meio), mas usei a primeira letra.
Magic Octopus Urn
@carusocomputing Bem, notei que a maioria das outras pessoas estava usando a primeira letra ou o comprimento e queria tentar outra coisa. I utilizado pela primeira vez a terceira letras ( c, p, i) com os valores ASCII 99, 112e 105, como eles pareciam mais útil, e percebeu que se tornaria 4, 2, 0, se eu fiz módulo 5. Só então eu percebi que eu tinha para subtrair ambos, assim os 4, 2 e 0 não foram muito úteis. Depois de alguma confusão / tentativa e erro, tentei a segunda letra e estava obtendo resultados mais úteis com o mesmo módulo 5 ainda presente. Então, rapidamente cheguei à solução que apresentei acima. :)
Kevin Cruijssen
@carusocomputing Queria tentar uma abordagem única e, considerando que sou muito ruim nesse tipo de solução, ela não é tão curta quanto algumas outras soluções, mas ainda é única (que era meu objetivo inicial). :)
Kevin Cruijssen
4

dc, 18

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

Experimente online .

Observe que os dois argumentos são passados ​​(separados por espaço) em uma linha para STDIN. Os argumentos estão contidos entre colchetes, [ ]pois é assim que dcas cordas são curtidas.

dcO manuseio de cordas é muito limitado, mas uma das coisas que você pode fazer é usar o Zcomando para obter um comprimento de cordas, que felizmente é distinto para "Rock", "Paper" e "Scissors", e pode ser aritmeticamente simples manipulado para dar o resultado desejado.

Trauma Digital
fonte
4

PHP, 34 bytes

<?=md5("BMn$argv[1]$argv[2]")%3-1;
user63956
fonte
3

Pyth, 16

t%+7h.+mx3ldQ3

Provavelmente poderia ser mais curto.

        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 .

Trauma Digital
fonte
3

C #, 85 84 bytes

Guardado 1 byte, graças 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;

Ele aceita duas strings como entrada e gera um número inteiro. Existe um empate, se as duas cordas forem iguais, caso contrário, ele verifica o primeiro caractere das cordas, a fim de determinar qual jogador vence.

Horváth Dávid
fonte
Salvar um byte usando currying iea=>b=>...
TheLethalCoder
3

JavaScript, 37 , 32 , 31 bytes

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

Se a for igual a b, produza zero.

Caso contrário, xou o resultado de verificar se o comprimento não é maior que 12 (comparação de tesoura e papel) com a comparação de maior que b.
Se isso retornar 1, retorne-o.

Se retornar 0, use o operador OR para substituir por -1.

Grax32
fonte
Você poderia escrever isso como uma função a=>b=>ao curry para salvar um byte?
FlipTack
Sim. Obrigado @FlipTack
Grax32
2

Lote, 116 bytes

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

Perl, 33 bytes

32 bytes de código + -psinalizador.

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

Para executá-lo:

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

Economizou 3 bytes usando o regex da resposta Retina de Martin Ender . (meu regex anterior era /R.*P|P.*S|S.*R/)

Explicação:

Primeiro, /(.+) \1/verifica se a entrada contém duas vezes a mesma palavra; se houver, o resultado é 0. Caso contrário, /k P|r S|s R/lida com o caso em que a resposta está -1. Se esse último regex é falso, então -/k P|r S|s R/é falso, então retornamos 1.

dada
fonte
2

Geléia , 9 bytes

L€^3Iæ%1.

Isso usa o algoritmo da resposta Bash do @ DigitalTrauma .

Experimente online!

Como funciona

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].
Dennis
fonte
Droga, eu estava prestes a começar a ler sobre Jelly. Oh bem, aqui está em pyth . +1.
Digital Trauma
2

Japonês , 19 bytes

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

Experimente aqui!

Inspirado na solução de carusocomputing

Solução antiga de 53 bytes

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

Experimente online!

Mais uma vez obrigado, ETHproductions!

Oliver
fonte
11
Você pode começar usando, em ©vez de &&, alterando Ug0 cpara Ug c(o mesmo com V) e substituindo -1por J. Ainda é um pouco maior do que a resposta JS embora, talvez, você pode tomar algumas idéias de que
ETHproductions
@ETHproductions Obrigado! Eu não sei como eu esquecer©
Oliver
11
Na verdade você pode simplesmente fazer W=Uc. Não sei por que continuo esquecendo que cfunciona em qualquer string: P
ETHproductions
2

PHP, 55 53 bytes

<?=(3-(ord($argv[2])%6%4-ord($argv[1])%6%4+3)%3*2)%3;
  • usa os valores ascii das primeiras letras (dos argumentos da linha de comando): 82,80,83
  • % 6: 4,2,5
  • % 4: 0,2,1
  • diferença (ba):
    • PS: 1-2, SR: 2-0, RP: 2-0 -> -1 ou 2; + 3,% 3 -> 2
    • SP: 2-1, RS: 0-2, PR: 0-2 -> -2 ou 1; + 3,% 3 -> 1
    • RR, PP, SS: 0; + 3,% 3: 0
  • (3-2 * x): -1,1,3
  • % 3: -1,1,0

versão senoidal, 49 46 bytes

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

um porto de golfe de resposta de carusocomputing :

3 bytes salvos por @ user59178

Titus
fonte
11
Para a versão seno, pode salvar 3 bytes substituindo round(x)por2*x^0
user59178
2

Perl, 25 bytes

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

Codifique 24 bytes +1 byte para a -popção.

A entrada deve estar no stdin sem separadores, por exemplo:

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

O primeiro regexp procura a vitória do primeiro jogador, a segunda a derrota. A diferença é impressa.

mik
fonte
1

Scala, 148 bytes

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)}

Felizmente, como é necessário ponto e vírgula para separar vários comandos na mesma linha, o Scala se beneficia de ter um código de golfe formatável!

Nesta tentativa de golfe, aprendi que você pode substituir

"somestring".charAt(index) 

com

"somestring"(index) 

porque Scala permite tratar cadeias de caracteres como matrizes com o objetivo de obter caracteres.

Arquimago
fonte
Isso pode ser jogado imensamente. Para iniciantes, você pode executar uma função em vez de um programa completo na maioria dos desafios aqui; portanto, em vez de o objeto inteiro estender o aplicativo e puxar dos argumentos, tente algo como: def g (a: Seq, b: Seq) = ...
Ethan
Além disso, você não precisa imprimir o valor. Devolvê-lo é suficiente, o que é ótimo quando se joga Scala, já que o retorno é gratuito. E você pode aprimorá-lo ainda mais usando o truque publicado na resposta Groovy, que funciona quase de forma idêntica no Scala.
Ethan