Escriba un programa que sea un políglota en tres idiomas que juegue piedra, papel y tijera .
La entrada para cualquier versión del programa es siempre una de las cadenas rock
o paper
o scissors
.
En el primer idioma, el programa debe generar la opción piedra-papel-tijera que supera la entrada:
Input Output
rock paper
paper scissors
scissors rock
En el segundo idioma, el programa debe generar la opción piedra-papel-tijera que vincula la entrada:
Input Output
rock rock
paper paper
scissors scissors
En el tercer idioma, el programa debe generar la opción piedra-papel-tijera que pierde en la entrada:
Input Output
rock scissors
paper rock
scissors paper
El código más corto en bytes gana. Tiebreaker es la respuesta más votada.
Las entradas y / o salidas pueden tener opcionalmente una nueva línea final, pero de lo contrario solo deberían ser las cadenas simples rock
/ paper
/ scissors
. Es posible utilizar mayúsculas ROCK
, PAPER
, SCISSORS
si se desea.
Es posible que no usar diferentes versiones de un mismo idioma (por ejemplo, Python 2 y 3).
Respuestas:
Python, brainfuck y JavaScript,
10399 bytes ¡ Yay menos de 100 bytes!En Python, esto define una función que supera la entrada, en brainfuck es solo un simple programa cat, y en JavaScript pierde. Aquí hay una versión que le da un nombre a las funciones
f
, y también solicita entradas en JavaScript y Python 3:Pruébelo en línea (versión anterior): Python , brainfuck , JavaScript
Explicación:
En Python,
"""..."""
es una cadena multilínea, que se puede usar como cualquier token. Cuando se coloca solo, no hace nada en absoluto. Lo uso para "ocultar" el código JavaScript de Python. Lo mismo ocurre con el(0,[.5,])
bit, es solo una tupla que contiene ay0
una lista de5
, y también la1//1
parte,//
en Python es la división de enteros, pero comienza un comentario en JavaScript. Aquí está el código despojado de estos tokens:La primera línea se explica por sí misma, solo define la lista
p
para contener las diferentes opciones en piedra, papel o tijera. La segunda línea define una función sin nombre que toma un argumentox
y devuelve la opción que superax
(por ejemplo, el elemento anterior enp
)En JavaScript,
//
denota un comentario de una sola línea. De manera similar a Python, los tokens individuales se ignoran, por lo que el código despojado de estos tokens es:Esto funciona de manera similar a Python, primero configurando la lista
p
para contener las opciones y luego definiendo una función anónima que da la opción perdedora.-~x
es lo mismox+1
pero con mayor precedencia para que pueda omitir los parens.En brainfuck, todos los personajes excepto
+-,.[]<>
se eliminan, dejando esto:El comando
,
lee un byte de entrada, lo.
imprime y realiza un[...]
bucle mientras el valor no es cero. Lo que este programa hace es leer la entrada e imprimirla un carácter a la vez hasta que\0
se encuentre el carácter . Como no tenemos eso en el código, podemos ignorar el resto del programa. En efecto, esto solo hace eco de lo que escriba el usuario, vinculándolos efectivamente.fuente
x=>p[p.indexOf(x)+1]||"rock"//"""
podría acortarse ax=>p[(p.indexOf(x)+1)%3]//"""
1//1,[.5,];
[]
en la segunda línea para guardar más bytes:1//1,;lambda x:p[p.index(x,0)+-1];"""
Python 2, Ruby, Retina,
9083 bytes-7 bytes gracias a Value Ink
Pruébelo en línea: Python , Ruby , Retina
Gana en Ruby, pierde en Python y empata en Retina. Esta solución hace uso del hecho de que
0
es verdad en Ruby pero falsey en Python. También utiliza indexación negativa tanto en Python como en Ruby.fuente
and
tiene prioridad sobre el operadoror
, por lo ques.index(0and STDIN.gets or input())
funciona. Además,gets
es un alias paraSTDIN.gets
en Ruby.V, Brain-flak y Python 2,
97, 86, 81, 77, 75 bytes¡Dos bytes guardados gracias a @ nmjcman101!
¡Esto fue súper divertido! Me gusta mucho esta respuesta porque es un resumen genial de los idiomas que me gustan: mi editor favorito, mi idioma no esotérico favorito y un idioma que escribí. (Técnicamente, Python 3 es mejor, pero Python 2 es más golfista
¯\_(ツ)_/¯
).Pruébalo en línea! en Python (ligeramente modificado para que pueda ver la salida), que imprime lo que pierde en la entrada.
Pruébalo en línea! en Brain-Flak, que imprime lo que se vincula con la entrada.
Pruébalo en línea! en V, que imprime lo que supera la entrada.
Como V se basa en caracteres ASCII no imprimibles, aquí hay un hexdump:
Explicación:
Pitón
En python, esto es muy sencillo. Definimos una lista de los tres elementos y devolvemos el elemento justo antes de la entrada. Dado que
-1
devuelve el elemento posterior, esto funciona de forma circular, y todo es muy sencillo y sencillo. Entonces, todo después#
es un comentario.Brain-Flak
Esto también es extremadamente sencillo en el ataque cerebral. Si tuviéramos que ganar o perder, esto probablemente sería varios cientos de bytes. Pero esto realmente funciona en 0 bytes. Al inicio del programa, toda la entrada se carga en la pila. Al final del programa, toda la pila se imprime implícitamente.
Una vez que eliminamos todos los caracteres irrelevantes, el código que Brain-Flak ve es
Lo que simplemente se evalúa como
1 + -1
, pero dado que este valor no se usa en absoluto, es un NOOP.V
Aquí es donde se pone un poco raro. Nombrar la lista de Python
o
puede haber parecido arbitrario, pero definitivamente no lo es. En V,o
abre una nueva línea y nos pone en modo de inserción. Entonces,se inserta en el búfer. Después de eso, el código relevante es:
Explicación:
fuente
.split()
es más fácil deshacerse de los diversos paréntesis y citas que aparecen en su solución.xx
y reemplazarlo con a2
para hacer el comando2f'
ya='
que será eliminado por eld*
posterior de todos modos. EDITAR: ¿podrías lograrlot.
?CJam , Retina , PHP,
928685 bytesDebe ejecutarse en PHP usando la
-r
bandera.Pruébalo en CJam
Pruébalo en retina
Pruébalo en PHP
CJam
En CJam, todas las letras mayúsculas son variables predefinidas. En la primera línea, muchos de estos valores se insertan en la pila, junto con algunos literales de cadena y matriz. Se realizan algunos incrementos, decrementos y otras operaciones.
Después de todo eso, la pila está envuelta en una matriz (
]
) y se descarta (;
), por lo que nada de eso importa en absoluto. El programa principal de CJam es simplemente:Retina
Esto casi se siente como hacer trampa ...
Retina sustituirá cualquier coincidencia de la expresión regular
ECHO["rock",0,"scissors","paper"][ORD(READLINE())%4];
en la entrada con#];"scissors paper rock"S/rci=
. Cualquiera que sea la coincidencia de esta expresión regular, ciertamente no coincide con nada enrock
,paper
oscissors
, por lo que no se hace ningún cambio. La entrada no modificada se emite implícitamente.PHP
La segunda línea es un comentario, por lo que se ignora.
La primera línea usa el mismo algoritmo que la parte CJam, pero con un orden diferente de los resultados.
fuente
C, C ++, Python;
227226216 bytes¡Ahorré un byte gracias a @Mat!
Define una función
f
en todos los idiomas. Gana en C, empata en Python, pierde en C ++. Como C ++ siempre hace / sLa parte entre el
/*
y el*/
es un bloque de comentarios en C y C ++, mientras que es la declaración de la función lambda en Python. Básicamente compara el primer carácter del argumento de la función y devuelve el movimiento que comienza con esa letra.La parte entre
"""
s es una cadena multilínea en Python, mientras que es la declaración de función en C y C ++.sizeof'b'-1
descubre si el lenguaje actual es C de C ++. Tiene un valor verdadero si el tamaño es diferente a 1, un valor falso de lo contrario. En C los literales son de 4 bytes, mientras que en C ++ son de un solo byte. Luego, después de descubrir el idioma, solo mira la primera letra de la entrada y las salidas en consecuencia.C
Pruébalo en línea!
C ++
Pruébalo en línea!
Pitón
Pruébalo en línea!
fuente
C ++, R, C;
252240226220209 bytesUtiliza la diferencia entre C y C ++ de que el tamaño de un literal de caracteres es de 4 bytes en C y 1 byte en C ++.
C ++:
Pruébalo en línea!
R:
Resultado:
C:
Pruébalo en línea!
fuente
Gawk, Retina, Perl; 68 bytes
(con una nueva línea al final)
Gawk (ganador)
Un poco de basura por el bien de Perl, luego cambie el contenido de la línea (
$_
que es lo mismo que$0
porque la variable_
no está definida) dependiendo de si contiene ak
o ac
, luego imprima el resultado. Ignora cualquier advertencia sobre las secuencias de escape, quise hacer eso.Retina (corbata)
El mismo truco que Basic Sunset y otros: reemplaza las coincidencias de algunas expresiones regulares tontas en la primera línea por el contenido de la segunda línea, así que pasa la entrada.
Perl (perdedor)
Lea una línea y conviértala en mayúsculas, luego elija una palabra basada en una letra que contenga e imprima el resultado. El primer y último paso se envuelven
eval
para ocultarlos de awk.Gawk, Retina
perl -p
; 57 bytesEstoy ingresando esto como una bonificación porque
perl -p
se supone que el cambio de línea de comando es parte del programa según las reglas habituales en este sitio, lo que lo haría no políglota.De nuevo con una nueva línea final para Retina . Esta vez,
perl -p
para imprimir la salida automáticamente, la sobrecarga de perl se reduce significativamente. Puedo dejar que la tarea$_
active una impresión implícita en awk .fuente
perl -p
está vacía, debe ser un error en TIO.> <>, Retina, Python 2:
144127123 bytes1 byte guardado gracias a @Loovjo al eliminar un espacio
4 bytes guardados gracias a @ mbomb007 usando en
input
lugar deraw_input
Publicado en TNB como un desafío , decidí probar esta combinación de idiomas.
> <>
Pruébalo en línea!
La IP comienza a moverse hacia la derecha.
Los posibles caracteres que se tomarán en la entrada son
PRS
(ya que el programa solo toma el primer carácter). Sus valores ASCII son80
,81
y82
.Si la entrada fue rock, entonces esto es lo que sucedería:
De lo contrario, si la entrada fue
SCISSORS
oPAPER
, esto es lo que la IP encontraría:Si la entrada fue
PAPER
, entonces:De lo contrario (si la entrada fue
SCISSORS
):Retina
Pruébalo en línea!
En este caso, Retina considera cada par de dos líneas como un par de partido y sustitución. Por ejemplo, intenta reemplazar cualquier cosa que coincida con la primera línea con la segunda línea, pero como la primera línea nunca coincide, nunca la sustituye por nada, preservando así la entrada.
Python 2
Pruébalo en línea!
El programa Python requiere que se ingrese información entre
"
s.Las dos primeras líneas son comentarios en Python.
fuente
print
de la última línea sea necesario.input()
lugar deraw_input()
.Ruby, Clojure, Common Lisp - 251 bytes
Versión más legible con espacios en blanco:
Clojure siempre gana, Ruby siempre dibuja, Common Lisp siempre pierde.
Para Ruby, todo lo que hay dentro de
'
s es una cadena. Se extiende a través de dos líneas. Luego usa el[]
operador con un argumento de cadena que devuelve la cadena en sí si está presente en la cadena. El resultado se imprime, Ruby simplemente refleja la entrada.La segunda línea es un comentario para Clojure y Common Lisp. Se debe usar un montón de
eval
yquote
porque Clojure necesita asegurarse de que todos los símbolos sean válidos. Sería bueno reutilizar más código, pero incluso lanth
función tiene firmas diferentes en estos idiomas. Básicamente, para Clojure seif()
evalúa como verdadero y va a la primera rama cuando se llama a un mapa hash de posibles variantes con un argumento leído desde stdin. Common Lisp va a la segunda rama, encuentra la posición del argumento de stdin en la lista y devuelve el elemento correspondiente de la lista resultante.Supongo que la parte Common Lisp se puede jugar más al golf.
Véalo en línea: Ruby , Common Lisp , Clojure
fuente
Scala, Javascript y Ook, 167 bytes
Pruébalo en Scala Pruébalo en Javascript Prueba la versión brainfuck de Ook
Scala - gana
Javascript - pierde
Ook! - corbatas
La parte de Ook es el programa simple de brainfuck cat,
,[.,]
trasladado a Ook.fuente
a[(a.indexOf(s)+2)%3]
entonces no necesita configurarloa[-1]="rock"
. Además, ¿no puedes poner el código Ook dentro de la cadena de JavaScript también?