Ich möchte Dungeons and Dragons spielen, aber ich habe keine Würfel! Ihre Herausforderung besteht darin, einige D & D-Würfel zu werfen.
Die Eingabeformatspezifikation in Backus-Naur-Form lautet:
<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>
Die optionale Ganzzahl vor dem d
ist die Anzahl der Würfel, die gewürfelt werden sollen. Dies muss mindestens der Fall sein 1
, und der Standardwert ist, 1
wenn er nicht angegeben wird.
Die erforderliche Ganzzahl unmittelbar nach dem d
ist die Anzahl der Seiten, die jeder Würfel hat; es muss zumindest sein 1
. Die Seiten jedes Würfels sind verschiedene aufeinanderfolgende positive ganze Zahlen, beginnend mit 1
.
Der optionale Modifikator kann sein +0
und ist standardmäßig +0
nicht angegeben.
Für die Eingabe 2d10+5
generieren Sie beispielsweise zwei Zufallszahlen von 1 bis einschließlich 10, addieren diese und addieren 5. Anschließend geben Sie das Ergebnis aus.
Wenn Sie erhalten ungültige Eingaben, wie zum Beispiel 2d
, d20+
, 0d4
, 2d5+1+2
, 2+2
, oder irgendetwas anderes , das dieses Format nicht paßt, müssen Sie Ausgang „ Invalid input
“. Andernfalls müssen Sie nur eine einzelne zufällige Ganzzahl ausgeben, die entsprechend der Eingabe gewichtet ist. Zum Beispiel 3d6
sollte mehr 10
s als 4
s produzieren .
Testfälle
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
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes!
02d05+073
eine gültige Eingabe?n
undp
als optional, aber Eingaben, die sie nicht enthalten möchten (d20+
) als ungültig.+
Zeichen sollte nur hinzugefügt werden, wenn der Modifikatorp
bereitgestellt wird.1d4+1d6
für einen Schurken, der mit einem Dolch angreift) oder negativ istp
(z. B.1d20-1
für eine Fähigkeitsüberprüfung ohne Ränge / Training und einen negativen Fähigkeitsmodifikator).2d8 + 1d6 + 4
? Du wirst eine schlechte Zeit habenAntworten:
Perl,
10995939689 BytesErfordert den
-p
Schalter, der zwei der Bytes ausmacht. Probieren Sie es online auf Ideone .Wie es funktioniert
Aufgrund des
-p
Schalters wird eine Zeile aus STDIN gelesen und in gespeichert$_
.Der Befehl
s/^d/1d/
stellt eine 1 voran ,$_
wenn er mit einem d beginnt , dh wenn die Anzahl der Würfel nicht angegeben wurde.Der reguläre Ausdruck
/^(\d+)d(\d+)(\+\d+)?/
prüft, ob die Zeile aus einer Zahl, einem Literal d , einer anderen Zahl und optional einer dritten Zahl mit vorangestelltem + besteht .Wenn es eine Übereinstimmung gibt, werden die Nummern gespeichert in
$1
,$2
und$3
.In diesem Fall wird die Eingabe gültig , wenn und nur wenn
$1
und$2
beide positiv.$d += 1 + rand $2 | 0
Fügt eine pseudozufällig gewählte Ganzzahl von 1 zu der angegebenen Anzahl von Seiten hinzu$d
(anfänglich als Null behandelt).for 1 .. $1
macht das obige einmal für jede ganze Zahl zwischen 1 und der Anzahl der Würfel.Der Befehl
$_ = $1 * $2 ? $d + $3 : 'Invalid input'
führt Folgendes aus:Wenn
$1 * $2
Null ist, wird$_
die Eingabe auf Ungültig gesetzt .Ansonsten ist die Eingabe gültig und setzt
$_
sich aus der Summe der Würfelwürfe und dem Modifikator zusammen.Aufgrund des
-p
Schalters druckt Perl den Inhalt von$_
.Da es keine weiteren Eingabezeilen gibt, wird das Skript beendet.
quelle
-p
würde es nur einen kosten, was eine 108-Byte-Lösung ergibt./^([1-9]\d*)?d([1-9]\d*)(\+\d+)?$/||die"Invalid input$/";$a+=1+int rand$2for(1..$1||1);$_=$a+$3
|0
das Casting auf int, da esrand
einen pseudozufällig ausgewählten float zurückgibt .-e
wäre hier problematisch, sofern Sie nicht die einfachen Anführungszeichen durch doppelte Anführungszeichen ersetzen.Fortran: 145
Missbrauch implizite Typisierung (
i-n
sind alle ganzen Zahlen, alles andere eine echte). Kleine Einschränkung: Die Eingabe muss durch Leerzeichen getrennt sein,2d10+5
muss also als eingegeben werden2 d 10 + 5
, sonst erhalten Sie eineinput conversion error
.quelle
Rubin, 116
Alternative Ruby-Version. Ich habe versucht, einen Weg zu finden, dies ohne die regulären Ausdrücke zu tun, aber die Validierung, die Sie durchführen müssen, ist ohne sie viel schwieriger.
Dieser ist 112 und verwendet Dennis 'cleveren Perl-Algorithmus:
quelle
Javascipt, 158
Besser kann man nicht golfen. Es ist Zeit, wieder an die Arbeit zu gehen.
quelle
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)
hat nur 137 Bytes.02d05+073
.GolfScript (
120106 Bytes)Dies ist nicht nur kürzer als die erste Version, sondern auch eleganter. Der Teil, der das Würfeln tatsächlich macht, ist
Der Rest besteht hauptsächlich aus der Eingabeüberprüfung und ein paar Zeichen zum Parsen.
Online Demo mit Test Framework
quelle
n./
? Vielleicht auch10,n*
für ein Zeichen weniger.J - 130 (45?) Char
Diese Herausforderung scheint ein wenig voreingenommen gegenüber regulären Ausdrücken zu sein, insbesondere wenn ungültige Eingaben unterschieden werden müssen. J hat eine POSIX-Regex-Bibliothek, es ist also nicht so schlimm, aber nicht wie in Perl integriert, sodass J nicht besser abschneidet als andere Sprachen.
Wenn Sie nur die Logik für gültige Ausdrücke implementieren, wie es die Python / PHP-Lösungen scheinen, sind es die vernünftigeren 45 Zeichen:
Bemerkenswerte Bits:
1!:1]1
ist die Eingabe und(rxmatch rxfrom])
die Logik, die die Unterausdrucksübereinstimmungen zurückgibt.Ob die Eingabe zulässig war oder nicht, wird vom Regex-Matching behandelt, sodass wir die Standardwerte für n und p mit festlegen können
0 1 1>.
. Es sieht rückwärts aus (n ist standardmäßig 1 und p ist 0), weil wir|.
die Liste früher umkehren mussten ( ), damit die Logik am Ende in der richtigen Reihenfolge ausgeführt wird.@.
ist die Agenda- Konjunktion, im Wesentlichen eine J-ish switch-Anweisung. Wenn die Übereinstimmungen leer sind (wenn 0 ein Element von $ hape ist:)0 e.$
, geben wir die Fehlermeldung aus, ansonsten würfeln wir:#~
um die Würfel auszurichten,1+?
zu würfeln und+/@,
den Modifikator p hinzuzufügen und Summe.quelle
01d01+01
?TinyMUSH , 239
Die ersten vier Zeilen befassen sich mit der Tatsache, dass "d" ein Alias für den universellen "down" -Exit mit einer integrierten Fehlermeldung ist, wenn diese nicht vorhanden ist. Exits werden vor benutzerdefinierten Befehlen gescannt. Die verbleibenden Zeilen erstellen ein Objekt mit einem benutzerdefinierten Befehl, der die integrierte Funktion die () verwendet.
quelle
PHP, 129
Verwendet einen regulären Ausdruck, um einen Ausdruck zu erstellen, den PHP dann auswertet. Die Eingabe erfolgt über URL:? 0 = Argument . Stellen Sie sicher, dass Sie das + mit% 2b urlenkodieren. So sieht es in besser lesbarer Form aus:
Durch bitweises Invertieren der Zeichenfolgen wird
~
nicht nur ein Zeichen gespeichert, weil Sie keine Anführungszeichen benötigen (PHP geht davon aus, dass es sich um Zeichenfolgen handelt), sondern auch Zeichen, weil Sie die umgekehrten Schrägstriche im regulären Ausdruck nicht umgehen müssen.Der
?:
Operator ist eine Sonderform des ternären Operators.$foo = $a ? $a : $b
ist das gleiche wie$foo = $a ?: $b
.quelle
Java, 378
Ich wollte nur eine Lösung mit Java ausprobieren, die weit von der besten Lösung entfernt ist. Aber hey: Java ist auf keinen Fall eine Golfsprache!
Es erhält die Eingabe von der Kommandozeile. Erster Parameter
args[0]
ist der Eingabewert.Wussten Sie, dass
decode
ist kürzer alsvalueOf
?quelle
Python 3, 184 Bytes
Besteht alle Tests. Wenn null Würfel erlaubt wären, wären es 6 Bytes kürzer, wenn man sie weglässt
(or q)
.quelle
re.match
verankert sich implizit am Anfang, aber nicht am Ende. Mir ist keine andere Regex-Bibliothek bekannt, die das tut.t=int(c or 0)
; und es könnte möglich sein, Ihre Antwort mit der vorhandenen Python-Antwort (die weniger Leerzeichen verwendet) zu kombinieren, um ein paar mehr zu sparen.JavaScript 134
quelle
02d05+073
.Ruby,
167147Verwendet einen regulären Ausdruck, um die ganze Arbeit zu erledigen. Da ich verwende
\d+
, muss ich nur prüfen, ob eine ungültige Eingabe vorliegt, weder einen
noch eine Übereinstimmungm
waren0
, und dass es eine warm
. Wenn eines dieser Elemente gefunden wird, wird es mit einer Meldung ('Invalid input'
) abgebrochen . Dann gibt es nur das Ergebnis aus, da es inzwischen abgebrochen worden wäre, wenn die Eingabe ungültig gewesen wäre.Das Ergebnis-Drucken ist nicht so interessant, aber ...
Ich später geändert
.inject(:+)
zueval(...*?+)
, aber die Idee ist das gleiche.quelle
Python3, 204B
Meins schlägt die bestehende Python-Antwort durch Hinzufügen der erforderlichen Fehlerbehandlung und Lesen
d20
als1d20
statt0d20
:)bearbeiten 2 Tippfehler zu beheben:
I(x) => I(c)
,Invalid Input => Invalid input
bearbeitet, um Regex zu reparieren:
\+?(\d*) => (\+\d+)?
quelle
3d20+
.01d01+01
.