Implementa las tijeras clásicas de papel piedra
Condiciones:
- el usuario ingresará 'r', 'p' o 's'
- el programa generará 'r', 'p' o 's' y el resultado
- la elección del programa ('r', 'p' o 's') tiene que ser pseudoaleatoria ( te estoy mirando Howard )
- El resultado se puede representar con cualquier carácter imprimible, siempre debe haber tres resultados posibles para lo que el usuario ha ingresado (el usuario gana, pierde o es un empate).
- qué sucede si el usuario no ingresa nada, o algo diferente que 'r', 'p' o 's' no deberían ser importantes.
Necesitas:
- Proporcione el código de golf.
- El código no golfista
- ¿Cómo invocas el programa?
- Una muestra de ejecución
Elegiré la respuesta con menos caracteres, si se elige un empate, se elegirá la respuesta más votada.
Buen golf y que la suerte esté siempre a tu favor.
Publicaré una respuesta yo mismo, en Java.
Para los que viven en una montaña debajo de una roca:
r = roca
p = papel
s = tijeras
piedra: gana con tijeras, pierde con papel, un empate con piedra.
papel: gana con piedra, pierde con tijeras, un empate con papel.
tijeras: gana con papel, pierde con piedra, un empate con tijeras.
Posiciones actuales:
- ONU: nombre de usuario
- PL: lenguaje de programación
- CC: recuento de caracteres
- UV: hasta votos
╔══════════════════╦════════════╦══════╦════╗ ║ UN ║ PL ║ CC ║ UV ║ ╠══════════════════╬════════════╬══════╬════╣ ║ Howard ║ GolfScript ║ 6 ║ 15 ║ ║ primo ║ Perl ║ 27 ║ 7 ║ ║ TwiNight ║ APL ║ 31 ║ 4 ║ ║ primo ║ Perl ║ 33 ║ 7 ║ ║ marinus ║ APL ║ 36 ║ 5 ║ ║ primo ║ Perl ║ 38 ║ 7 ║ ║ primo ║ Perl ║ 48 ║ 7 ║ ║ manatwork ║ Ruby ║ 54 ║ 13 ║ ║ w0lf ║ GolfScript ║ 62 ║ 4 ║ ║ tmartin ║ K ║ 67 ║ 2 ║ ║ Abhijit ║ Python 3 ║ 74 ║ 5 ║ ║ beary605 ║ Python 3 ║ 76 ║ 4 ║ ║ rlemon ║ javascript ║ 85 ║ 4 ║ ║ ugoren ║ C ║ 86 ║ 3 ║ ║ Egor Skriptunoff ║ LUA ║ 87 ║ 4 ║ ║ Shmiddty ║ javascript ║ 87 ║ 3 ║ ║ Fors ║ Befunge ║ 107 ║ 3 ║ ║ Briguy37 ║ javascript ║ 117 ║ 2 ║ ║ Vi. ║ Clojure ║ 129 ║ 1 ║ ║ Henrik ║ C# ║ 167 ║ 4 ║ ║ dystroy ║ Go ║ 169 ║ 1 ║ ║ Praveen ║ javascript ║ 250 ║ 0 ║ ║ ryan ║ javascript ║ 256 ║ 1 ║ ║ primo ║ ferNANDo ║ 259 ║ 5 ║ ║ anakata ║ Java ║ 259 ║ 1 ║ ║ epoch ║ Java ║ 387 ║ 1 ║ ║ jdstankosky ║ LOLCODE ║ 1397 ║ 15 ║ ╚══════════════════╩════════════╩══════╩════╝
No puedo seleccionar la respuesta de Howards, ya que fue un intento (exitoso) de doblar las reglas, pero las cambio para hacerlas más explícitas.
La respuesta de 27 caracteres primos no se puede seleccionar porque no es pseudoaleatoria per se
primo -p respuesta, voy a ir con "-p se contaría como 3 bytes: uno para el -, uno para el p, y uno más el espacio en blanco necesario".
Gracias a todos los que respondieron, ¡espero que lo hayan pasado bien!
NOTA: Intentaré editar esto cada dos semanas, ajustar la tabla y cambiar mi respuesta seleccionada si alguien supera la actual, así que si acabas de llegar, ¡publica tu respuesta si quieres!
-p
se contarían como 3 bytes: uno para el-
, uno para elp
y uno más el espacio en blanco necesario. Sin embargo, muchas otras competiciones en CG.SE han contado cada opción como un solo byte. Por lo general, depende del autor de la pregunta decidir qué sistema honrar.Respuestas:
APL, 31
x←'rps'
Asignar cadena'rps'
ax
(?3)⌷
Elija un entero aleatorio 1 ~ 3, elija ese índice dex
⍞,
Anteponer la entrada del usuario a la elección de la máquina⎕←
Cadena resultante de salidax⍳
Convertir a matriz numérica por indexOf enx
-/
Diferencia de los dos números1+|3
Módulo 3 y más 1'TWL'[...]
indexación desde'TWL'
Muestra
El usuario elige roca, el programa elige papel: perder
fuente
LOLCODE, 1397
Nota: envié esto antes de notar que el requisito ganador cambió de popularidad con el tie-break de golf a golf con el tie-break de popularidad.
Realmente no hay ninguna sintaxis estricta, pero estoy seguro de que esto es aceptable.
Si esto se ejecutara con éxito como
RockPaperScissors.LOL
, esto es lo que podrían ser algunos posibles resultados aleatorios:Rock
- Salida:I GUESSED SCIZZORS U WONNED
Paper
- Salida:I GUESSED PAPER NOWAI TIED
Scissors
- Salida:I GUESSED ROCK LOL U LOZED
Tuna
- Salida:WHAT U SAYZ? YOU BURNTED MAH TREAT!
fuente
GolfScript
El código anterior implementa la funcionalidad requerida. Además, asegura que el jugador nunca se enfadará debido a una injusticia (percibida) de la estrategia de la computadora.
Versión sin golf
Cómo invocar el programa
La entrada (un solo carácter de 'r', 'p', 's') debe proporcionarse en STDIN, posiblemente terminado con nueva línea.
Una muestra de ejecución
Explicación del código.
Para todos aquellos que no estén familiarizados con GolfScript, agregaré una explicación detallada de cómo funciona este código. El código existe esencialmente de tres partes.
Notas
Como este no es un código de golf sino un concurso de popularidad, no elegí la versión más corta. Tal vez en caso de empate, un código más corto eliminará mi solución. Sin embargo, para aquellos interesados en el golf, se ofrecen las siguientes posibilidades:
0
como salida para dibujar. Por lo tanto, el programa válido más corto es el código de un solo carácter0
.fuente
n"d"
, como la pregunta decía que la salida debe ser cualquier carácter imprimible, no dice nada sobre el uso de palabras completas.Ruby:
6154 caracteresDe alguna manera explicado:
Todo el problema se reduce a calcular los siguientes resultados:
Donde los números significan:
Para esto utilicé la fórmula: machine_choice - human_choice. Esto ocasionalmente da como resultado un valor negativo, pero como solo se usa como índice y el índice negativo se cuenta hacia atrás, elegirá el elemento de matriz correcto.
Métodos utilizados (otros que
Fixnum
son obvios):inspect
seguido de una nueva línea a la salida estándar del programa ".max.to_i.abs == 0
, rand devuelve un número de punto flotante pseudoaleatorio entre 0.0 y 1.0, que incluye 0.0 y excluye 1.0".Sin golf:
Ejecución de muestra:
fuente
[(c-o.index($_)+3)%3]
se puede reemplazar por[c.-o.index$_]
7 bytes. Además, debe agregar dos a su puntaje como-nl
mínimo.c.
consejo..-
. Los operadores con puntos tienen una precedencia mucho más baja que sus contrapartes sin puntos. Por ejemplo,a/(b+c)
se puede reemplazar pora./b+c
.C # (167 caracteres)
Mi primer intento en el golf.
Golfed
using System;class P{static void Main(string[] i){var m="rspr";var a=m[Environment.TickCount%3];Console.WriteLine(a+" "+(i[0][0]==a?"T":m.Contains(i[0]+a)?"W":"L"));}}
Sin golf
Muestra Run La aplicación requiere entradas de char individuales como argumento 1 a la aplicación, ya sea
r
,s
op
.Todos los resultados posibles
cmd > app.exe r
da salidar T
(rock, tie)cmd > app.exe r
da salidap L
(papel, perdido)cmd > app.exe r
da salidas W
(tijeras, gana)cmd > app.exe p
da salidar W
(rock, win)cmd > app.exe p
da salidap T
(papel, corbata)cmd > app.exe p
da salidas L
(tijeras, perdido)cmd > app.exe s
da salidar L
(roca, perdida)cmd > app.exe s
da salidap W
(papel, ganar)cmd > app.exe s
da salidas T
(tijeras, corbata)fuente
Perl 48 bytes
El guión imprime el resultado desde la perspectiva de la computadora, por ejemplo, si el jugador elige
r
y la computadora eliges
, el resultado esLose
.$%
(formato de número de página) se utiliza para almacenar el movimiento de la computadora, ya que solo puede contener un valor entero, lo que guarda un int int.Sin golf:
Uso de la muestra:
El script también se puede ejecutar de forma interactiva, escribiendo su movimiento seguido de Enter:
Estiramiento de regla
Perl 35 +3 bytes
Requiere el
-p
cambio de línea de comando (contado como 3 bytes). Cada uno de los resultadosWin
,Lose
yDraw
se han mapeado enW
,L
,D
. Se ha excluido la nueva línea entre la elección de la computadora y el resultado.Uso de la muestra:
Perl 30 +3 bytes
Una vez más requiere
-p
. AquíWin
,Lose
yDraw
se han asignado a2
,1
y0
respectivamente. Esto sigue siendo técnicamente compatible, ya que son caracteres imprimibles.Uso de la muestra:
Perl 24 +3 bytes
Requiere
-p
, WLD asigna a2
,1
,0
como antes. Cada uno^T
debe ser reemplazado por un carácter literal ascii 20. Este es ciertamente un poco exagerado;$^T
devuelve el número de segundos desde la época en que se inició el script. Todos los resultados son posibles, pero no califican como pseudoaleatorios.Uso de la muestra:
fuente
APL (
3836)Salidas 'T', 'W' y 'L' para empate, ganar y perder.
Ejecución de muestra:
(El usuario escribe 'p' para papel. La computadora elige 'r' (rock), el usuario gana)
Explicación:
⌽↑⌽∘'TWL'¨⍳3
: genera la siguiente matriz:⍞⍳⍨c←'rps'
: establecerc
en la cadena'rps'
, leer la entrada del usuario y obtener el índice de la entrada del usuario en la cadena (este será un valor de 1 a 3). Este índice se usa como la coordenada Y en la matriz.i←?3
: obtenga un número aleatorio del 1 al 3 y guárdeloi
, esta es la elección de la computadora. Esto se usa como la coordenada X en la matriz.c[i]
: se utilizai
como índice enc
, mostrando la elección de la computadora como 'r', 'p' o 's'.fuente
ferNANDo 1184 (259 golf) bytes
Un intérprete escrito en Python se puede encontrar en la parte inferior de la página vinculada.
ferNANDo es un lenguaje esotérico que admite solo un tipo de variable, booleano, y solo una operación, NAND. Como puede imaginar, esto puede llevar a una lógica bastante larga para realizar tareas aparentemente simples. Tiene soporte para leer desde stdin (un byte a la vez), escribir en stdout (también un byte a la vez), bucles condicionales y también un generador booleano aleatorio.
No hay palabras clave de ningún tipo; Todo es una variable. La función de una declaración está determinada únicamente por el número de variables que contiene. Tampoco hay comentarios, así que hice todo lo posible para que el código se auto comentara. Las últimas cuatro líneas podrían ser un poco confuso, pero probablemente será suficiente decir que se imprime
Win!
,Lose
oDraw
dependiendo del resultado.El script se puede ejecutar de forma interactiva, escribiendo su movimiento seguido de Enter.
Ejemplo de uso (suponiendo que haya nombrado al intérprete
nand.py
):Editar: solo para demostrar que ferNANDo puede competir con Java, aquí hay una versión 'golfizada' de 259 bytes . La lógica es visiblemente diferente; comprueba
not win
ynot tie
, lo que ahorra algunas puertas NAND (porque entonces solo necesito lasnot
versiones de los movimientos del jugador, y porquenot lose
no era necesario para la salida). Sin embargo, no es tan interesante de leer.fuente
o_shi- o_shi- o_shi-
Esto fue un comentario hilarante.q
, pero él hace lo sensato y se vuelve a tirar .Python 3.x: 74 caracteres
Cómo funciona
Basado en el destino, determina qué elección debería basarse en la fórmula
Versión sin golf
Ejecución de la muestra
fuente
Lua, 87
Uso:
Sin golf:
fuente
GolfScript 62
Una solución alternativa de GolfScript, mucho más aburrida que la de Howard :).
El programa elige un movimiento al azar y muestra el resultado desde la perspectiva del usuario.
El código
Ejecución de la muestra
Prueba en línea
Puede ejecutar el programa y experimentar con diferentes entradas aquí: http://golfscript.apphb.com/?c=OydzJwoKJ3Jzc3BwcicuWzZyYW5kPV0nJys6wqdAKy4uJiwoez8pwqdcJ0xvc2UnJ1dpbidpZn17Ozv3py31cmcm3
Sin embargo, tenga en cuenta que el parámetro (movimiento del usuario) que generalmente se pasa en la línea de comando ahora se agrega a la pila en el código mismo (no hay forma de proporcionar parámetros de línea de comando "reales" en esta herramienta en línea).
Versión "no golfista"
No tengo ni idea de lo que significa sin golf cuando se trata de GolfScript, así que intenté agregar comentarios. Esperemos que eso aclare cómo funciona el código y lo haga un poco más legible:
fuente
C,
9286 caracteresImprime la elección de la computadora y el resultado desde el punto de vista del usuario: W = ganas, L = pierdes, T = empate.
La fórmula simple
x-y
, dados los valores ASCII de las opciones, da 0 en el sorteo (obviamente) y un valor único en cada caso.fuente
Python 2 (
86848078), Python 3 - 76 caracteres0 - empate, 1 - perder, 2 - ganar
Sin golf
Como correr:
python file_name_here.py
Problemas:
computadora AI: 35 caracteres
fuente
A
embargo, no creo que lo necesites , y puedes guardar otro personaje confrom random import*
.from random
, porque pensé que no lo había cambiado ...Primero intente sin revisar a los demás.
Golfizado:
10785 bytesla salida es [npc-choice] [1: victoria, 2: pérdida, 3: empate]
sin golf:
fuente
PowerShell:
1441331171119273Código de golf:
Se puede ejecutar directamente desde la consola.
Sin golf, con comentarios:
Algunos ejemplos se ejecutan en la consola:
fuente
JAVA 259 :(
Código altamente no protegido:
Ejecuciones de muestra:
fuente
Befunge: 107 caracteres
Ligeramente torpe. Es encogible, la pregunta es por cuánto.
fuente
JavaScript (87)
Golfizado:
Sin golf:
Simplemente puede pegar el código en la consola de JavaScript de su navegador para ejecutarlo.
Si se me permite imprimir el resultado antes de imprimir la selección de la computadora (83) :
fuente
K, 67
Imprime W, L, D para ganar / perder / empatar.
Sin golf:
O en Q, que es más legible:
Ejecución de muestra:
fuente
Javascript, 117 caracteres
Aquí hay un enfoque del problema basado en datos. Esto probablemente se puede optimizar generando los datos de ganar / perder / dibujar en lugar de asignarlos manualmente, pero es un comienzo :)
Golfizado:
Sin golf:
Finalmente, aquí hay un violín con ambos.
fuente
Javascript: 256
golfizado:
sin golf:
fuente
Clojure:
Mini versión (129 caracteres de código):
fuente
JAVA (387) primer código de golf!
Sin golf
Golfizado (espaciado / sangría)
No es el código más corto, pero mi primer intento
fuente
import java.util.*
2)HashMap l
->Map l
3) lanzar en(int)
lugar de(Integer)
4)new Random().nextInt(3)
5) omitirnew int[][]
6) eliminar yeso para(Character)
7) usar ints en lugar de caracteres.Ir (169)
Golfizado:
Sin golf (formateado por
go fmt
):Correr :
fuente
Pyth , 23
La salida tiene la forma:
Empate: 0 Victoria: 1 Pérdida: 2
Explicación:
Ejecute de la siguiente manera:
Para solo 4 personajes más, podemos usar T para empatar, W para ganar y L para perder:
Todo es igual hasta la diferencia de índices, en cuyo punto usamos la diferencia como índice en la cadena
"TWL"
.Nota: si bien desarrollé este lenguaje después de que se publicó el desafío, no lo había visto hasta hoy. El desafío no influyó en ningún aspecto del lenguaje.
fuente
Groovy, 89
Toma la elección del usuario como argumento. Ejemplo:
fuente
C # y LinqPad 133
golfizado:
sin golf:
salida de muestra (la entrada era s): r> L // La computadora elige rock (r) -> así que perdimos
fuente
JavaScript (79)
Chocando con uno viejo, pero aquí vamos ...
Con la ventaja adicional de que puedes usar cualquier roca que te guste pegnatita, piroxenita, escoria, sovita, kimberlita, trondjemita, toba o cualquier otra. La única limitación es que no puedes usar
p
os
;-)Código de golf:
Los principales trucos utilizados son:
1. u = ~~{}[prompt()]
Uso de objetos
{}
y recuperación de valor por entrada del usuario deprompt()
. Hasta aquí todo bien. Luego, en lugar de tenerlor : 0
, podemos forzarlo a convertirse0
mediante el uso del~~
operador NOT. Se utiliza con frecuencia para números de los pisos, pero también tiene la (ventaja) de no volverNaN
cuando otros operadores haría, como por ejemplo:+{a:1, b:2}['c']
.2. c = new Date%3
La fecha se engaña con frecuencia mediante, por ejemplo, el uso
+new Date
para convertirla en marca de tiempo directamente, de lo contrario se obtendría una representación de cadena. Aquí al usar mod uno logra el mismo efecto.3. 'rps'[c]
Acceso indexado en cadena que permite a las computadoras elegir
0 = r
,1 = p
o2 = s
.4. (u==c ? 2 : !u&c>1 | u&!c | u>1&c )
El código no protegido puede ser algo como esto:
fuente
Golfscript - 29
Esta es una respuesta real esta vez (mirándote,:
n"Draw"
P).Sin golf:
Puede ejecutarlo
ruby golfscript.rb MyCode.txt
, dondeMyCode.txt
está el código del programa.Ejecuciones de muestra (todas con entrada "r", pero funciona con todo) (el empate es 0, la ganancia es 2, la pérdida es 1):
Si desea una explicación de cualquiera de las versiones y / o ve una mejora potencial, dígame.
fuente
Javascript,
657170Sin salida de elección de computadora: 65
Solo para probar que la solución es correcta:
Con salida de elección de computadora: 71
70
y la prueba:
fuente