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
.Respuestas:
Groovy,
675650 BytesPruébalo en línea!
Resulta que el juego de piedra, papel y tijera tiene una propiedad bastante genial.
Dadas las cadenas ayb, tome la primera letra de cada una, esto da como resultado dos de los siguientes:
R,P,S
La lista exhaustiva de valores posibles es (cuando se combinan 2 opciones):
Reorganizando la lista para:
Nos da una secuencia que parece inversamente sinusoidal, y en realidad puede representar esta fórmula como aproximadamente (y con aproximadamente me refiero a apenas lo suficiente para funcionar, podría obtener una ecuación que está activa pero cuesta más bytes):
La simplificación de 4 / pi a 1.3 fue sugerida primero por @flawr y luego probada por @titus para un ahorro total de 6 bytes.
Usando las propiedades de redondeo doble de groovy, esto da como resultado la salida correcta para piedra-papel-tijera.
05AB1E , 10 bytes (no competir)
Pruébalo en línea!
Misma respuesta portada a 05AB1E usando los nuevos comandos agregados 26/10/2017.
fuente
-sin(x) = sin(-x)
, eso significa simplemente invirtiendo el orden dea
yb
y soltando el líder-
? Aparte de eso, codificar una aproximación4/Pi
similar1.273
podría ser suficiente, o1.3
o9/7
o5/4
.sin(b-a)
lugar de-sin(a-b)
. Gran descubrimiento!1.3
lugar de4/Math.PI
; eso es suficientemente exacto.XX=ASCII=Y=Wanted output RR=82-82=0=0 PP=83-83=0=0 SS=80-80=0=0
C,
5035 bytesLlame
f
con una cadena que contenga ambos jugadores, sin separador, y devolverá si gana el primero.Explicación:
Al observar las nueve cadenas posibles, resulta que los pares de letras en las columnas 7 y 8 son únicos:
El elenco offset y salvaje para
short*
recuperar estos pares de letras e interpretarlos como números:Luego fue una cuestión de fuerza bruta para encontrar el
51
y los4
restos, que se aplicaron sucesivamente para reducir estos números a:Lo cual es perfecto para agregar otro resto al final y compensar el resultado.
Véalo en vivo en Coliru
fuente
-f(i)
para calcular el puntaje del otro jugador, ¡resultará un resultado inesperado!-(f(i))
debería funcionar bien. ¡Las macros son divertidas!MATLAB / Octave ,
63 5452 bytesEs muy conveniente que los códigos ASCII de las primeras letras de
Rock,Paper,Scissors
seanR=82,P=80,S=83
. Si restamos79
, obtenemos convenientemente3,1,4
, que usaremos ahora como índices matriciales: aquí una matriz 4x4 está codificada, donde lai,j
entrada enésima corresponde al resultado si conecta los valores de antes:Pruébalo en línea!
fuente
Pure Bash, 31
Pedir prestado la fórmula de @ Dennis :
Pruébalo en línea .
Respuesta anterior:
Pure Bash,
43354
,5
,8
respectivamente, para piedra, papel, tijeras)XOR cada uno con 3 para dar
7
,6
,11
(que cuando se toma mod 3 elasticidad1
,0
,2
)Luego reste y toque el mod 3 para obtener el resultado deseado.
Pruébalo en línea .
fuente
Python ,
4030 bytesPruébalo en línea!
Antecedentes
Empecé con la plantilla de funciones.
y ejecuté una búsqueda de fuerza bruta para parámetros adecuados utilizando el siguiente programa, luego seleccionó uno con una implementación de longitud mínima.
Pruébalo en línea!
fuente
Mathematica, 32 bytes
Función sin nombre que toma un par ordenado de listas de caracteres, como, por ejemplo
{{"R","o","c","k"},{"P","a","p","e","r"}}
, y regresa-1|0|1
.Quería que el código evitara no solo las tres palabras de entrada, sino también el nombre de función demasiado largo
ToCharacterCode
; así que trabajé con la longitud4,5,8
de las palabras de entrada en su lugar, y busqué una función corta de esas longitudes que dieron respuestas distintas módulo 3. (La división entera por 2 es matemáticamente prometedora, pero esas funciones tienen nombres demasiado largos en Mathematica).Resulta que tomar el factorial de (la longitud - 3) da las respuestas
1,2,120
, que son el1,-1,0
módulo 3. Luego, simplemente calculamos, el módulo 3, la diferencia de los dos valores (a través del producto punto{1,-1}.{x,y} = x-y
, que es una buena manera cuando el dos valores están en una lista).fuente
Ruby,
363530 bytesPruébalo en ideone.com
Prueba de salida:
Aprovecha el hecho de que 7 de los 9 resultados correctos se generan simplemente haciendo una comparación lexicográfica utilizando el operador de la nave espacial
<=>
. El(a+b)[12]
solo invierte las entradas a la comparación si las entradas sonPaper
yScissors
(y tambiénScissors
Scissors
, pero eso es todo lo0
contrario).Gracias a Horváth Dávid por salvarme un personaje y gracias a GB por salvarme otros 5.
fuente
Python ,
39363433 bytesPruébalo en línea!
Cómo funciona
Echemos un vistazo a algunos valores de la longitud de seis copias de xy una copia de y módulo 7 .
Podemos codificar los resultados ( {-1, 0, 1} ) asignándolos al conjunto {0, 1, 2, 3} . Por ejemplo, el mapeo t ↦ 2 - t logra esto y es su propio inverso.
Denotemos el resultado de x e y por o (x, y) . Entonces:
Afortunadamente, todos los bits en las últimas columnas coinciden entre sí, por lo que podemos OR para formar un solo entero n y recuperar o (x, y) como 2 - ((n ≫ o (x, y))% 4) . El valor de n es 94 .
fuente
Retina ,
3531 bytesPruébalo en línea!
Explicación
Esto funciona en dos pasos. Primero, imprimimos los signos menos para las entradas relevantes. Luego imprimimos un
0
para corbatas y un1
otro.Estas son dos etapas. En
)
la segunda etapa los agrupa, los*
convierte en una ejecución en seco (lo que significa que la cadena de entrada se restaurará después de que se procesaron, pero el resultado se imprimirá) y\
suprime la impresión de un avance de línea final. Las dos etapas juntas imprimirán un-
si corresponde.La primera etapa es una
G
etapa de rep que sólo mantiene la línea si contiene ya seak P
,r S
os R
. Estos corresponden a los casos en los que necesitamos salida-1
. Si no es uno de esos casos, la entrada se reemplazará con una cadena vacía.La segunda etapa reemplaza
.+
(toda la cadena, pero solo si contiene al menos un carácter) con-
. Entonces esto imprime un-
para esos tres casos y nada más.Estas son dos etapas más. La primera etapa es una
D
eduplicación. Coincide con palabras y elimina duplicados. Entonces, si y solo si la entrada es un empate, esto deja caer la segunda palabra.La segunda etapa cuenta el número de coincidencias de
.
, que es un espacio seguido de cualquier personaje. Si la entrada fue un empate y se eliminó la segunda palabra, esto da como resultado0
. De lo contrario, la segunda palabra todavía está en su lugar, y hay una coincidencia, por lo que se imprime en su1
lugar.fuente
05AB1E ,
181715109 bytes6 bytes guardados con el truco de longitud de entrada de Digital Trauma
Toma entrada como
[SecondPlayersChoice,FirstPlayersChoice]
Pruébalo en línea! o validar todos los casos de prueba
Solución alternativa de 9 bytes:
íø¬ÇÆ>3%<
Explicación
Solución anterior de 15 bytes
Pruébalo en línea! o validar todos los casos de prueba
Explicación
fuente
Ç¥13T/*.½ò
¿POR QUÉ FUNCIONA? NADIE SABE.['R','P']
: P Es un puerto de esto.Jalea , 8 bytes
Pruébalo en línea! (conjunto de pruebas, conversiones al entero para mayor claridad)
Cómo funciona
fuente
Python 2 ,
4640 bytesPruébalo en línea!
Muchas gracias a @Dennis por permitirme tomar prestado su código de prueba en línea Pruébalo y por ahorrarme 6 bytes.
Editar
@ hashcode55: más o menos como lo describe. (x! = y, -1) es una secuencia de dos elementos y [x [0] + y [0] en 'RPSR'] está calculando qué elemento tomar. Si la primera letra de x + la primera letra de y está en la lista de caracteres, entonces se evaluará como Verdadero o 1, de modo que (x! = Y, -1) [1] se devolverá. Si no es así (x! = Y, -1) [0]. Aquí es donde se pone un poco complicado. El primer elemento es en sí mismo efectivamente otro if. Si x! = Y, el primer elemento será Verdadero; de lo contrario, será Falso, por lo que si x [0] + y [0] en 'RPSR' es falso, se devolverá Verdadero o Falso dependiendo de si x == y. El + es un poco astuto y gracias de nuevo a @Dennis por este. La x! = Y devolverá un verdadero o falso literal. Necesitamos un 1 o un 0. Todavía no sé cómo pero el + hace esta conversión. Solo puedo suponer que al usar un operador matemático en Verdadero / Falso está obligando a que se vea como el equivalente entero. Obviamente, el + delante del -1 aún devolverá -1.
¡Espero que esto ayude!
fuente
(x!=y,-1)
esto funciona como si, si la lista genera un verdadero, entonces -1 másx!=y
. ¿Cuál es el uso de ese+
signo? ¡Una fuente que documente este tipo de sintaxis sería realmente útil!+
- en este caso, es un plus unario, como+10
, y es esencialmente una forma corta de convertir a un entero.JavaScript (ES6),
4638 bytesHace uso del hecho de que Rock-Paper-Scissors es cíclico. JavaScript no tiene nave espacial ni operadores ternarios balanceados, de lo contrario la respuesta sería
(a,b)=>((b<=>'Rock')-(a<=>'Rock'))%%3
.Editar: guardado 8 bytes gracias a @WashingtonGuedes.
fuente
MATL ,
1413 bytesPruébalo en línea! O verificar todos los casos de prueba .
Explicación
Si el código ASCII de la letra inicial de la primera cadena se resta del de la segunda cadena, obtenemos el valor en la columna D a continuación. Tomando modulo 5 da el valor M . El valor final entre paréntesis es el resultado deseado, R .
Por lo tanto, si calculamos D y luego M , para obtener R solo necesitamos asignar 0 a 0; 1 y 2 a 1; 3 y 4 a −1. Esto se puede hacer indexando en una matriz de cinco entradas igual a 0, 1 o -1. Dado que la indexación en MATL está basada en 1 y es modular, la matriz debería ser
[1, 1, −1, −1, 0]
(la primera entrada tiene el índice 1, la última tiene el índice 5 o equivalente 0). Finalmente, la operación del módulo 5 se puede evitar afortunadamente, porque la indexación modular la lleva a cabo implícitamente.fuente
CJam , 12 bytes
Las dos entradas están separadas por espacios. Su orden se invierte con respecto a eso en el texto del desafío.
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
Traducción de mi respuesta MATL . Esto explota el hecho de que en CJam
c
(convertir a char) aplicado en una cadena toma su primer carácter. Además, la matriz para la asignación es diferente porque la indexación en CJam está basada en 0.fuente
CJam,
151412 bytesTome el código ascii del último carácter de cada cadena, luego devuelve:
(a1 - a2 + 19) % 3 - 1
¡Pruébalo aquí !
fuente
Python 3, 54 bytes
Pruébalo en línea!
fuente
Java 7, 82 bytes
Sin golf:
Explicación:
o
,a
yc
, con los decimales ASCII111
,97
y99
.0
(Rock, Rock)14
(Piedra, papel)12
(Papel, tijeras)-14
(Papel, roca)0
(Papel, papel)-2
(Papel, tijeras)-2
(Tijeras, piedra)2
(Tijeras, papel)0
(Tijeras, tijeras)4
,2
,-4
,-2
,-2
,2
.x
es ahora el siguiente para los casos de prueba:2
y-2
son incorrectos, y deberían haberlo sido-1
y en su1
lugar. Entonces, six%2 != x
(todo arriba1
o abajo-1
) nos dividimos-2
para arreglar estos dos 'casos límite'.Código de prueba:
Pruébalo aquí.
Salida:
fuente
c
,p
,i
) con los valores ASCII99
,112
y105
, como parecían más útil, y se dio cuenta que se convertiría en 4, 2, 0 si lo hiciera módulo 5. Sólo entonces pensé que tenía que restar ambos, por lo los 4, 2 y 0 no fueron de mucha utilidad. Después de un poco de confusión / prueba y error, probé la segunda letra y obtuve resultados más útiles con el mismo módulo 5 todavía presente. Luego llegué rápidamente a la solución que presenté anteriormente. :)dc, 18
Pruébalo en línea .
Tenga en cuenta que los dos argumentos se pasan (separados por espacios) en una línea a STDIN. Los argumentos están contenidos entre corchetes,
[ ]
ya que así es comodc
le gustan sus cadenas.dc
tiene un manejo de cadenas muy limitado, pero resulta que una de las cosas que puede hacer es usar elZ
comando para obtener una longitud de cadena, que afortunadamente es distinta para "Piedra", "Papel" y "Tijeras", y puede ser bastante simple aritméticamente manipulado para dar el resultado deseado.fuente
PHP, 34 bytes
fuente
Pyth, 16
Probablemente podría ser más corto.
En línea .
fuente
C #,
8584 bytesGuardado 1 byte, gracias a TheLethalCoder
Acepta dos cadenas como entrada y genera un número entero. Hay un empate, si las dos cadenas son iguales, de lo contrario, comprueba el primer carácter de las cadenas, para determinar qué jugador gana.
fuente
a=>b=>...
JavaScript,
37,32, 31 bytesSi a es igual a b, salida cero.
De lo contrario, xor el resultado de verificar si la longitud no es mayor a 12 (comparación de tijeras y papel) con la comparación de a mayor que b.
Si esto devuelve 1, devuélvelo.
Si devuelve 0, use el operador OR para reemplazar con -1.
fuente
a=>b=>
para guardar un byte?Lote, 116 bytes
fuente
Perl, 33 bytes
32 bytes de código +
-p
bandera.Para ejecutarlo:
Ahorró 3 bytes usando la expresión regular de la respuesta Retina de Martin Ender . (mi expresión regular anterior era
/R.*P|P.*S|S.*R/
)Explicación:
Primero,
/(.+) \1/
verifica si la entrada contiene el doble de la misma palabra, si es así, el resultado es0
. De lo contrario,/k P|r S|s R/
trata el caso donde está la respuesta-1
. Si esta última expresión regular es falsa, entonces-/k P|r S|s R/
es falsa, entonces volvemos1
.fuente
Jalea , 9 bytes
Esto usa el algoritmo de la respuesta Bash de @ DigitalTrauma .
Pruébalo en línea!
Cómo funciona
fuente
Japt , 19 bytes
Pruébalo aquí!
Inspirado en la solución de carusocomputing
Solución antigua de 53 bytes
Pruébalo en línea!
Gracias de nuevo, ETHproductions!
fuente
©
lugar de&&
, cambiando elUg0 c
aUg c
(lo mismo conV
) y reemplazando-1
conJ
. Sin embargo, todavía es un poco más largo que la respuesta de JS , tal vez pueda tomar algunas ideas de eso©
W=Uc
. No sé por qué sigo olvidando quec
funciona en cualquier cadena: PPHP,
5553 bytesversión sinusoidal,
4946 bytesLa respuesta de un puerto de golf de carusocomputing :
3 bytes guardados por @ user59178
fuente
round(x)
con2*x^0
Perl, 25 bytes
Código 24 bytes +1 byte para la
-p
opción.La entrada debe estar en stdin sin separadores, por ejemplo:
La primera expresión regular busca la victoria del primer jugador, la segunda la pérdida. La diferencia está impresa.
fuente
Scala, 148 bytes
Afortunadamente, dado que se requieren puntos y comas para separar múltiples comandos en la misma línea, ¡Scala se beneficia de tener un código de golf formatable!
En este intento de golf aprendí que puedes reemplazar
con
porque Scala le permite tratar las cadenas como matrices con el fin de obtener caracteres.
fuente