Quiero jugar Dungeons and Dragons, ¡pero no tengo ningún dado! Su desafío es tirar algunos dados D&D.
La especificación del formato de entrada en formato Backus-Naur es:
<valid-input> ::= <opt-integer> "d" <integer> <opt-modifier>
<opt-integer> ::= | <integer>
<opt-modifier> ::= | "+" <integer>
<integer> ::= "0" | "1" | "2" | "3" | "4" | "5" |
"6" | "7" | "8" | "9" | <integer> <integer>
El número entero opcional antes del d
es el número de dados a tirar; debe ser al menos 1
, y su valor predeterminado es 1
si no se proporciona.
El número entero requerido inmediatamente después de d
es el número de lados que tiene cada dado; debe ser al menos 1
. Los lados de cada dado son enteros positivos consecutivos distintos que comienzan en 1
.
El modificador opcional puede ser +0
, y su valor predeterminado es +0
si no se especifica.
Por ejemplo, para la entrada 2d10+5
, genera dos números aleatorios del 1 al 10 inclusive, los suma y suma 5. Luego, generará el resultado.
Si recibe una entrada no válida, como por ejemplo 2d
, d20+
, 0d4
, 2d5+1+2
, 2+2
, o cualquier otra cosa que no encaja en este formato, debe de salida " Invalid input
". De lo contrario, debe generar solo un número entero aleatorio, ponderado de acuerdo con la entrada. Por ejemplo, 3d6
debería producir más 10
s que 4
s .
Casos de prueba
Input Minimum possible output Maximum possible output
d1 1 1
d6 1 6
d1+3 4 4
d20+3 4 23
2d1 2 2
2d6+2 4 14
d01 1 1
d01+0 1 1
01d01+01 2 2
3d20+10 13 70
d Invalid input
d0 Invalid input
d+0 Invalid input
d0+0 Invalid input
0d1 Invalid input
0d1+1 Invalid input
d1+ Invalid input
1d Invalid input
1d1+ Invalid input
1d+1 Invalid input
2d+2d Invalid input
d2+d2 Invalid input
d2+2+2 Invalid input
d2-1 Invalid input
-d2 Invalid input
-2d2 Invalid input
4*3 Invalid input
4*d2 Invalid input
Este es el código de golf , ¡así que el código más corto en bytes ganará!
02d05+073
una entrada válida?n
yp
como opcional, pero entrada que elige no incluirlos (d20+
) como no válidos.+
signo solo debe agregarse sip
se proporciona el modificador .1d4+1d6
para un pícaro que ataca con una daga) o que tiene un negativop
(por ejemplo,1d20-1
para una verificación de habilidad sin rangos / entrenamiento y un modificador de habilidad negativo).2d8 + 1d6 + 4
? Vas a pasar un mal momentoRespuestas:
Perl,
10995939689 bytesRequiere el
-p
conmutador, que representa dos de los bytes. Pruébelo en línea en Ideone .Cómo funciona
Debido al
-p
cambio, se lee una línea de STDIN y se almacena en ella$_
.El comando
s/^d/1d/
antepone un 1 a$_
si comienza con una d , es decir, si no se ha especificado el número de dados.La expresión regular
/^(\d+)d(\d+)(\+\d+)?/
verifica si la línea consiste en un número, un literal d , otro número y, opcionalmente, un tercer número precedido por un signo + .Si hay una coincidencia, los números se guardarán en
$1
,$2
y$3
.En este caso, la entrada será válida si y solo si
$1
y$2
son ambos positivos.$d += 1 + rand $2 | 0
agrega un número entero pseudoaleatoriamente elegido de 1 al número especificado de lados a$d
(inicialmente tratado como cero).for 1 .. $1
hace lo anterior una vez por cada entero entre 1 y el número de dados.El comando
$_ = $1 * $2 ? $d + $3 : 'Invalid input'
hace lo siguiente:Si
$1 * $2
es cero, se establece$_
como entrada inválida .De lo contrario, la entrada es válida y se establece
$_
en la suma de los dados y el modificador.Debido al
-p
cambio, Perl imprime el contenido de$_
.Como no hay más líneas de entrada, el script sale.
fuente
-p
solo le costaría uno, lo que lo convierte en una solución de 108 bytes./^([1-9]\d*)?d([1-9]\d*)(\+\d+)?$/||die"Invalid input$/";$a+=1+int rand$2for(1..$1||1);$_=$a+$3
|0
para convertir a int, ya querand
devuelve un flotante elegido al azar .-e
sería problemático aquí, a menos que reemplace las comillas simples con comillas dobles.Fortran: 145
Abusa de la escritura implícita (
i-n
todos son enteros, todo lo demás es real). Advertencia menor: la entrada debe estar separada por espacios, por lo que2d10+5
debe ingresarse como2 d 10 + 5
, de lo contrario obtendrá uninput conversion error
.fuente
Ruby, 116
Versión alternativa de Ruby. Estaba tratando de encontrar una manera de hacerlo sin las expresiones regulares, pero la validación que tienes que hacer es mucho más difícil sin ellas.
Este es 112, usando el inteligente algoritmo Perl de Dennis:
fuente
Javascipt, 158
No puedo jugar al golf mejor que esto. Es hora de volver al trabajo.
fuente
s="Invalid input";if(m=prompt().match(/^([1-9]\d*)?d([1-9]\d*)(\+\d+)?$/))for(s=m[3]|0,i=0;i<(m[1]||1);i++)s+=Math.random()*m[2]+1|0;alert(s)
tiene solo 137 bytes.02d05+073
.GolfScript (
120106 bytes)Esto no solo es más corto que la primera versión, sino también más elegante. La parte que realmente tira el dado es
El resto es principalmente validación de entrada y algunos caracteres para el análisis.
Demostración en línea con marco de prueba
fuente
n./
? Quizás también10,n*
para un personaje menos.J - 130 (45?) Char
Este desafío parece estar un poco sesgado hacia las expresiones regulares, especialmente al tener que diferenciar entradas no válidas. J tiene una biblioteca de expresiones regulares POSIX, por lo que no está tan mal, pero no está integrada como lo está con Perl, por lo que a J no le va mejor que a otros idiomas.
Si solo está implementando la lógica para expresiones válidas, como parecen ser las soluciones Python / PHP, son los 45 caracteres más razonables:
Bits notables:
1!:1]1
es la entrada y(rxmatch rxfrom])
es la lógica que devuelve las coincidencias de subexpresión.La coincidencia de expresiones regulares maneja si la entrada fue legal o no, por lo que podemos establecer los valores predeterminados para n y p con
0 1 1>.
. Se ve hacia atrás (n es 1 por defecto y p es 0) porque tuvimos que invertir (|.
) la lista anteriormente, para que la lógica al final se ejecute en el orden correcto.@.
es la conjunción de Agenda , esencialmente una declaración de cambio J-ish. Si las coincidencias están vacías (si 0 es un elemento electrónico del $ hape:)0 e.$
, emitimos el mensaje de error, de lo contrario, pasamos a tirar los dados:#~
para colocar los dados,1+?
tirar y+/@,
agregar el modificador p y suma.fuente
01d01+01
?TinyMUSH , 239
Las primeras cuatro líneas tratan el hecho de que "d" es un alias para la salida universal "inactiva" con un mensaje de falla incorporado cuando no existe; las salidas se analizan antes de los comandos definidos por el usuario. Las líneas restantes crean un objeto con un comando definido por el usuario que hace uso de la función incorporada die ().
fuente
PHP, 129
Utiliza una expresión regular para crear una expresión que PHP luego evalúa. La entrada se introduce a través de url:? 0 = argumento . Asegúrese de urlencode el + a% 2b. Así es como se ve en una forma más legible:
La inversión bit a bit de las cadenas usando
~
no solo guarda un carácter porque no necesita comillas (PHP asume que son cadenas) sino que también guarda caracteres porque no tiene que escapar de las barras diagonales inversas en la expresión regular.El
?:
operador es una forma especial del operador ternario.$foo = $a ? $a : $b
es el mismo que$foo = $a ?: $b
.fuente
Java, 378
Solo quería probar una solución con Java lejos de ser la mejor solución. Pero bueno: ¡Java no es un lenguaje de golf en ningún caso!
Obtiene la entrada de la línea de comando. El primer parámetro
args[0]
es el valor de entrada.¿Sabías que
decode
es más corto quevalueOf
?fuente
Python 3, 184 bytes
Pasa todas las pruebas. Si se permitieran cero dados, sería 6 bytes más corto al omitirlos
(or q)
.fuente
re.match
ancla implícitamente al principio pero no al final. No conozco ninguna otra biblioteca de expresiones regulares que haga eso.t=int(c or 0)
; y podría ser posible combinar su respuesta con la existente de Python (que usa menos espacios en blanco) para ahorrar un par más.JavaScript 134
fuente
02d05+073
.Rubí,
167147Utiliza una expresión regular para hacer todo el trabajo. Como estoy usando
\d+
, lo único que necesito para verificar si hay entradas no válidas es que hubo una coincidencia, quen
ni lom
hubo0
, y que hubo unam
. Si se encuentra alguno de esos, aborta con un mensaje ('Invalid input'
). Luego solo imprime el resultado, ya que ya habría abortado si la entrada no fuera válida.La impresión de resultados no es tan interesante, pero ...
Más tarde cambié
.inject(:+)
aeval(...*?+)
, pero la idea es la misma.fuente
Python3, 204B
Mine supera la respuesta de Python existente al agregar el manejo de errores requerido y la lectura
d20
en1d20
lugar de0d20
:)editado para fijar 2 errores tipográficos:
I(x) => I(c)
,Invalid Input => Invalid input
editado para arreglar regex:
\+?(\d*) => (\+\d+)?
fuente
3d20+
.01d01+01
.