var QUESTION_ID=106496,OVERRIDE_USER=20260;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/106496/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
RockPaper
.Respostas:
Groovy,
675650 bytesExperimente 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):
Reorganizando a lista para:
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):
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.
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)
Experimente online!
Mesma resposta portada para 05AB1E usando os novos comandos adicionados em 26/10/2017.
fonte
-sin(x) = sin(-x)
, isso significa apenas invertendo a ordem dea
eb
e soltando o líder-
? Fora isso, codificar uma aproximação4/Pi
semelhante1.273
pode ser suficiente, ou1.3
ou9/7
ou5/4
.sin(b-a)
vez de-sin(a-b)
. Ótima descoberta!1.3
vez de4/Math.PI
; isso é suficientemente exato.XX=ASCII=Y=Wanted output RR=82-82=0=0 PP=83-83=0=0 SS=80-80=0=0
C,
50bytes 35Ligue
f
com 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:
O deslocamento e o elenco selvagem para
short*
recuperar esses pares de letras e interpretá-los como números:Em seguida, era uma questão de força bruta encontrar os restos
51
e4
, que eram aplicados sucessivamente para reduzir esses números a:O que é perfeito para aplicar mais um restante no final e compensar o resultado.
Veja ao vivo em Coliru
fonte
-f(i)
para calcular a pontuação do outro jogador - resultará em uma saída inesperada!-(f(i))
deve funcionar bem. Macros são divertidas!MATLAB / Oitava ,
63 5452 bytesÉ muito conveniente que os códigos ASCII das primeiras letras de
Rock,Paper,Scissors
sãoR=82,P=80,S=83
. Se subtrairmos79
, obtemos de forma conveniente3,1,4
, que usaremos agora como índices de matriz: Aqui uma matriz 4x4 é codificada, onde ai,j
-ésima entrada corresponde ao resultado se você inserir os valores imediatamente antes:Experimente online!
fonte
Pure Bash, 31
Empréstimos na fórmula de Dennis :
Experimente online .
Resposta anterior:
Pure Bash,
43354
,5
,8
respectivamente, para Rock, Paper, Scissors)XOR cada um com 3 a dar
7
,6
,11
(que, quando tomado mod 3 dão1
,0
,2
)Subtraia e mexa no mod 3 para obter o resultado desejado.
Experimente online .
fonte
Python ,
4030 bytesExperimente online!
fundo
Comecei com o modelo de função
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.
Experimente online!
fonte
Mathematica, 32 bytes
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 comprimento4,5,8
das 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 o1,-1,0
mó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).fonte
Ruby,
363530 bytesExperimente em ideone.com
Saída de teste:
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ãoPaper
eScissors
(e tambémScissors
Scissors
- mas isso é0
inverso).Agradeço a Horváth Dávid por me salvar um personagem e a GB por me salvar mais 5.
fonte
Python ,
39363433 bytesExperimente 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 .
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:
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 .
fonte
Retina ,
3531 bytesExperimente online!
Explicação
Isso funciona em duas etapas. Primeiro, imprimimos os sinais de menos para as entradas relevantes. Em seguida, imprimimos um
0
para gravatas e1
outro.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
G
fase rep que só mantém a linha se contiver querk P
,r S
ous 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.Este é mais dois estágios. O primeiro estágio é uma
D
desduplicaçã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 em0
. Caso contrário, a segunda palavra ainda está no lugar e há uma correspondência, sendo impressa1
.fonte
05AB1E ,
181715109 bytes6 bytes salvos com o truque de comprimento de entrada do Digital Trauma
Aceita entrada como
[SecondPlayersChoice,FirstPlayersChoice]
Experimente online! ou Validar todos os casos de teste
Solução alternativa de 9 bytes:
íø¬ÇÆ>3%<
Explicação
Solução anterior de 15 bytes
Experimente online! ou Validar todos os casos de teste
Explicação
fonte
Ç¥13T/*.½ò
? Por que funciona ninguém sabe.['R','P']
: P É um porto disso.Gelatina , 8 bytes
Experimente online! (suíte de teste, lança para inteiro para maior clareza)
Como funciona
fonte
Python 2 ,
4640 bytesExperimente 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!
fonte
(x!=y,-1)
isso está funcionando como se, se a lista gerar um true, então -1 elsex!=y
. Qual é a utilidade desse+
sinal? Uma fonte que documentasse esse tipo de sintaxe seria realmente útil!+
- nesse caso, é uma vantagem unária, como+10
, e é essencialmente uma maneira curta de converter para um número inteiro.JavaScript (ES6),
4638 bytesFaz 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.
fonte
MATL ,
1413 bytesExperimente 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 .
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.fonte
CJam , 12 bytes
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.fonte
CJam,
151412 bytesPegue o código ascii do último caractere de cada string e retorne:
(a1 - a2 + 19) % 3 - 1
Teste aqui !
fonte
Python 3, 54 bytes
Experimente online!
fonte
Java 7, 82 bytes
Ungolfed:
Explicação:
o
,a
ec
, com os decimais ASCII111
,97
e99
.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)4
,2
,-4
,-2
,-2
,2
.x
agora é o seguinte para os casos de teste:2
e-2
está incorreto, e deveria ter sido-1
e, em1
vez disso. Portanto, sex%2 != x
(tudo acima1
ou abaixo-1
) nos dividirmos-2
para consertar esses dois 'casos extremos'.Código do teste:
Experimente aqui.
Resultado:
fonte
c
,p
,i
) com os valores ASCII99
,112
e105
, 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. :)dc, 18
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 quedc
as cordas são curtidas.dc
O manuseio de cordas é muito limitado, mas uma das coisas que você pode fazer é usar oZ
comando 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.fonte
PHP, 34 bytes
fonte
Pyth, 16
Provavelmente poderia ser mais curto.
Online .
fonte
C #,
8584 bytesGuardado 1 byte, graças a TheLethalCoder
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.
fonte
a=>b=>...
JavaScript,
37,32, 31 bytesSe 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.
fonte
a=>b=>
ao curry para salvar um byte?Lote, 116 bytes
fonte
Perl, 33 bytes
32 bytes de código +
-p
sinalizador.Para executá-lo:
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 retornamos1
.fonte
Geléia , 9 bytes
Isso usa o algoritmo da resposta Bash do @ DigitalTrauma .
Experimente online!
Como funciona
fonte
Japonês , 19 bytes
Experimente aqui!
Inspirado na solução de carusocomputing
Solução antiga de 53 bytes
Experimente online!
Mais uma vez obrigado, ETHproductions!
fonte
©
vez de&&
, alterandoUg0 c
paraUg c
(o mesmo comV
) e substituindo-1
porJ
. Ainda é um pouco maior do que a resposta JS embora, talvez, você pode tomar algumas idéias de que©
W=Uc
. Não sei por que continuo esquecendo quec
funciona em qualquer string: PPHP,
5553 bytesversão senoidal,
4946 bytesum porto de golfe de resposta de carusocomputing :
3 bytes salvos por @ user59178
fonte
round(x)
por2*x^0
Perl, 25 bytes
Codifique 24 bytes +1 byte para a
-p
opção.A entrada deve estar no stdin sem separadores, por exemplo:
O primeiro regexp procura a vitória do primeiro jogador, a segunda a derrota. A diferença é impressa.
fonte
Scala, 148 bytes
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
com
porque Scala permite tratar cadeias de caracteres como matrizes com o objetivo de obter caracteres.
fonte