Je veux jouer à Dungeons and Dragons, mais je n'ai pas de dés! Votre défi est de lancer des dés D&D.
La spécification du format d'entrée sous forme Backus-Naur est:
<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>
L'entier facultatif avant le d
est le nombre de dés à lancer; il doit être au moins 1
, et par défaut 1
s'il n'est pas fourni.
L'entier requis immédiatement après le d
est le nombre de côtés de chaque dé; ça doit être au moins 1
. Les côtés de chaque dé sont des entiers positifs consécutifs distincts commençant à 1
.
Le modificateur facultatif peut être +0
, et il est par défaut +0
s'il n'est pas spécifié.
Par exemple, pour l'entrée 2d10+5
, vous générez deux nombres aléatoires de 1 à 10 inclus, les ajoutez ensemble et en ajoutez 5. Ensuite, vous produirez le résultat.
Si vous recevez une entrée invalide, comme 2d
, d20+
, 0d4
, 2d5+1+2
, 2+2
, ou toute autre chose qui ne correspond pas à ce format, vous devez sortie « Invalid input
». Sinon, vous ne devez générer qu'un seul entier aléatoire, pondéré en fonction de l'entrée. Par exemple, 3d6
devrait produire plus de 10
s que 4
s .
Cas de test
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
Il s'agit de code-golf , donc le code le plus court en octets gagnera!
02d05+073
une entrée valide?n
etp
comme facultatif, mais les entrées qui choisissent de ne pas les inclure (d20+
) comme invalides.+
signe ne devrait être ajouté que si le modificateurp
est fourni.1d4+1d6
pour un voleur sournois attaquant avec un poignard) ou ayant un négatifp
(par exemple,1d20-1
pour un test de compétence sans rang / formation et un modificateur de capacité négatif).2d8 + 1d6 + 4
? Tu vas passer un mauvais momentRéponses:
Perl,
10995939689 octetsNécessite le
-p
commutateur, qui représente deux des octets. Essayez-le en ligne sur Ideone .Comment ça fonctionne
En raison du
-p
commutateur, une ligne est lue à partir de STDIN et stockée dans$_
.La commande
s/^d/1d/
ajoute un 1 à$_
si elle commence par un d , c'est-à-dire si le nombre de dés n'a pas été spécifié.L'expression régulière
/^(\d+)d(\d+)(\+\d+)?/
vérifie si la ligne se compose d'un nombre, d'un d littéral , d'un autre nombre et, éventuellement, d'un troisième nombre précédé d'un signe + .S'il y a un match, les numéros seront enregistrés dans
$1
,$2
et$3
.Dans ce cas, l'entrée sera valide si et seulement si
$1
et$2
sont tous deux positifs.$d += 1 + rand $2 | 0
ajoute un entier choisi de manière pseudo-aléatoire de 1 au nombre spécifié de côtés$d
(initialement traité comme zéro).for 1 .. $1
fait ce qui précède une fois pour chaque entier compris entre 1 et le nombre de dés.La commande
$_ = $1 * $2 ? $d + $3 : 'Invalid input'
effectue les opérations suivantes:Si
$1 * $2
est égal à zéro, il définit$_
une entrée non valide .Sinon, l'entrée est valide et correspond
$_
à la somme des jets de dés et du modificateur.En raison du
-p
commutateur, Perl imprime le contenu de$_
.Puisqu'il n'y a plus de lignes d'entrée, le script se ferme.
la source
-p
ne vous en coûterait qu'un, ce qui en fait une solution de 108 octets./^([1-9]\d*)?d([1-9]\d*)(\+\d+)?$/||die"Invalid input$/";$a+=1+int rand$2for(1..$1||1);$_=$a+$3
|0
pour convertir en int, carrand
retourne un flotteur choisi de manière pseudo-aléatoire .-e
serait problématique ici, à moins que vous ne remplaciez les guillemets simples par des guillemets doubles.Fortran: 145
Abuse le typage implicite (
i-n
sont tous des entiers, tout le reste un réel). Mise en garde mineure: l'entrée doit être séparée par des espaces, donc2d10+5
doit être entrée comme2 d 10 + 5
, sinon vous obtiendrez uninput conversion error
.la source
Rubis, 116
Version alternative Ruby. J'essayais de trouver un moyen de le faire sans les expressions régulières, mais la validation que vous avez à faire est beaucoup plus difficile sans elles.
Celui-ci est 112, en utilisant l'algorithme Perl intelligent de Dennis:
la source
Javascipt, 158
Je ne peux pas mieux jouer au golf que ça. Il est temps de retourner au travail.
la source
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)
n'a que 137 octets.02d05+073
.GolfScript (
120106 octets)Ce n'est pas seulement plus court que la première version, mais aussi plus élégant. La partie qui fait le roulement est
Le reste est principalement la validation des entrées et quelques caractères pour l'analyse.
Démo en ligne avec framework de test
la source
n./
? Peut-être aussi10,n*
pour un personnage de moins.J - 130 (45?) Char
Ce défi semble être un peu biaisé vers les expressions régulières, en particulier avec la nécessité de différencier les entrées invalides. J a une bibliothèque d'expression régulière POSIX, donc ce n'est pas si mal, mais elle n'est pas intégrée comme elle l'est avec Perl, donc J ne fait pas mieux que les autres langages.
Si vous implémentez simplement la logique des expressions valides, comme les solutions Python / PHP semblent le faire, ce sont les 45 caractères les plus raisonnables:
Bits notables:
1!:1]1
est l'entrée et(rxmatch rxfrom])
est la logique qui renvoie les correspondances de sous-expression.Que l'entrée soit légale ou non est gérée par la correspondance d'expression régulière, nous pouvons donc définir les valeurs par défaut pour n et p avec
0 1 1>.
. Il regarde en arrière (n est 1 par défaut et p est 0) car nous avons dû inverser (|.
) la liste plus tôt, afin que la logique à la fin s'exécute dans le bon ordre.@.
est la conjonction Agenda , essentiellement une instruction J-ish switch. Si les correspondances sont vides (si 0 est un e.lement de $ hape:)0 e.$
, nous émettons le message d'erreur, sinon nous passons par lancer les dés:#~
pour définir les dés,1+?
lancer et+/@,
ajouter le modificateur p et somme.la source
01d01+01
?TinyMUSH , 239
Les quatre premières lignes traitent du fait que "d" est un alias pour la sortie universelle "down" avec un message d'échec intégré lorsqu'il n'existe pas; les sorties sont analysées avant les commandes définies par l'utilisateur. Les lignes restantes créent un objet avec une commande définie par l'utilisateur utilisant la fonction die () intégrée.
la source
PHP, 129
Utilise une expression régulière pour créer une expression que PHP évalue ensuite. L'entrée est introduite via url:? 0 = argument . Assurez-vous d'avoir encodé le + en% 2b. Voici à quoi cela ressemble sous une forme plus lisible:
L'inversion au niveau du bit des chaînes en utilisant
~
non seulement enregistre un caractère car vous n'avez pas besoin de guillemets (PHP suppose que ce sont des chaînes) mais enregistre également des caractères car vous n'avez pas à échapper les barres obliques inverses dans l'expression régulière.L'
?:
opérateur est une forme spéciale de l'opérateur ternaire.$foo = $a ? $a : $b
est le même que$foo = $a ?: $b
.la source
Java, 378
Je voulais juste essayer une solution avec Java loin de la meilleure solution. Mais bon: Java n'est en aucun cas un langage de golf!
Il obtient l'entrée de la ligne de commande. Le premier paramètre
args[0]
est la valeur d'entrée.Saviez-vous que
decode
c'est plus court quevalueOf
?la source
Python 3, 184 octets
Réussit tous les tests. Si zéro dé était autorisé, il serait 6 octets plus court en omettant
(or q)
.la source
re.match
s'ancre implicitement au début mais pas à la fin. Je ne connais aucune autre bibliothèque regex qui fait cela.t=int(c or 0)
; et il pourrait être possible de combiner votre réponse avec celle existante en Python (qui utilise moins d'espaces blancs) pour en économiser quelques autres.JavaScript 134
la source
02d05+073
.Ruby,
167147Utilise une expression rationnelle pour effectuer tout le travail. Depuis que je suis à l' aide
\d+
, les seules choses que je dois vérifier les entrées invalides sont qu'il y avait un match, que nin
nim
était0
, et qu'il y avait unm
. Si l'un d'eux est trouvé, il s'interrompt avec un message ('Invalid input'
). Ensuite, il imprime simplement le résultat, car il aurait été abandonné maintenant si l'entrée n'était pas valide.L'impression des résultats n'est pas si intéressante, mais ...
Plus tard, j'ai changé
.inject(:+)
poureval(...*?+)
, mais l'idée est la même.la source
Python3, 204B
Le mien bat la réponse Python existant en ajoutant dans la gestion des erreurs requise et la lecture
d20
comme1d20
plutôt que0d20
:)sous la direction de fixer 2 fautes de frappe:
I(x) => I(c)
,Invalid Input => Invalid input
modifié pour corriger l'expression régulière:
\+?(\d*) => (\+\d+)?
la source
3d20+
.01d01+01
.