Chcę grać w Dungeons and Dragons, ale nie mam żadnych kości! Twoim zadaniem jest rzucić kostką D&D.
Specyfikacja formatu wejściowego w postaci Backus-Naur to:
<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>
Opcjonalna liczba całkowita przed d
jest liczbą kości do rzucenia; musi być co najmniej 1
i domyślnie ustawiony, 1
jeśli nie jest dostarczony.
Wymagana liczba całkowita bezpośrednio po d
jest liczbą stron każdej kości; to musi być przynajmniej 1
. Boki każdej kości są odrębnymi kolejnymi dodatnimi liczbami całkowitymi, zaczynając od 1
.
Opcjonalnym modyfikatorem może być +0
i domyślnie jest ustawiony, +0
jeśli nie jest określony.
Na przykład dla danych wejściowych 2d10+5
generujesz dwie liczby losowe od 1 do 10 włącznie, dodajesz je razem i dodajesz 5. Następnie otrzymasz wynik.
Jeśli otrzymasz nieprawidłowe dane, takie jak 2d
, d20+
, 0d4
, 2d5+1+2
, 2+2
, lub cokolwiek innego, co nie pasuje do tego formatu, trzeba wyjście „ Invalid input
”. W przeciwnym razie musisz wyprowadzić tylko jedną losową liczbę całkowitą, ważoną zgodnie z danymi wejściowymi. Na przykład 3d6
powinien produkować więcej 10
s niż 4
s .
Przypadki testowe
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
To jest code-golf , więc wygra najkrótszy kod w bajtach!
02d05+073
jest poprawny wpis?n
ip
jako opcjonalne, ale dane wejściowe, które decydują się nie uwzględniać ich (d20+
) jako niepoprawnych.+
znak należy dodać tylko wtedy, gdyp
podany jest modyfikator .1d4+1d6
Za Rogue'a skradającego się za pomocą sztyletu) lub mający negatywnep
(np.1d20-1
Za sprawdzenie umiejętności bez rang / treningu i modyfikatora negatywnej zdolności).2d8 + 1d6 + 4
? Będziesz miał zły czasOdpowiedzi:
Perl,
10995939689 bajtówWymaga
-p
przełącznika, który odpowiada za dwa bajty. Wypróbuj online na Ideone .Jak to działa
Z powodu
-p
przełącznika wiersz jest odczytywany ze STDIN i zapisywany w$_
.Komenda
s/^d/1d/
poprzedza się 1 do$_
jeżeli zaczyna się od d , to znaczy, jeżeli liczba kości nie został określony.Wyrażenie regularne
/^(\d+)d(\d+)(\+\d+)?/
sprawdza, czy wiersz składa się z liczby, literału d , innej liczby i, opcjonalnie, trzeciej liczby poprzedzonej znakiem + .W przypadku dopasowania liczby zostaną zapisane w
$1
,$2
i$3
.W tym przypadku, wejście będzie ważna tylko wtedy, gdy
$1
i$2
to zarówno pozytywne.$d += 1 + rand $2 | 0
dodaje pseudolosowo wybraną liczbę całkowitą od 1 do określonej liczby stron do$d
(początkowo traktowanych jako zero).for 1 .. $1
robi powyższe raz dla każdej liczby całkowitej od 1 do liczby kości.Polecenie
$_ = $1 * $2 ? $d + $3 : 'Invalid input'
wykonuje następujące czynności:Jeśli
$1 * $2
wynosi zero, ustawia się$_
na Niepoprawne dane wejściowe .W przeciwnym razie dane wejściowe są prawidłowe i ustawiają
$_
sumę rzutów kostką oraz modyfikator.Z powodu
-p
przełącznika Perl drukuje zawartość$_
.Ponieważ nie ma już żadnych wierszy wprowadzania, skrypt kończy działanie.
źródło
-p
kosztowałby Cię tylko jeden, dzięki czemu jest to rozwiązanie 108-bajtowe./^([1-9]\d*)?d([1-9]\d*)(\+\d+)?$/||die"Invalid input$/";$a+=1+int rand$2for(1..$1||1);$_=$a+$3
|0
do rzutowania na int, ponieważrand
zwraca pseudolosowo wybraną liczbę zmiennoprzecinkową .-e
byłoby tutaj problematyczne, chyba że zastąpisz pojedyncze cudzysłowy podwójnymi cudzysłowami.Fortran: 145
Nadużywa niejawnego pisania (
i-n
wszystkie są liczbami całkowitymi, wszystko inne jest prawdziwe). Drobne zastrzeżenie: dane wejściowe muszą być oddzielone spacją, więc2d10+5
należy wprowadzić jako2 d 10 + 5
, w przeciwnym razie otrzymaszinput conversion error
.źródło
Ruby, 116
Alternatywna wersja Ruby. Próbowałem znaleźć sposób, aby to zrobić bez wyrażeń regularnych, ale walidacja, którą musisz zrobić, jest o wiele trudniejsza bez nich.
Ten ma numer 112, wykorzystujący sprytny algorytm Perla Dennisa:
źródło
JavaScript, 158
Nie można lepiej grać w golfa. Czas wrócić do pracy.
źródło
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)
ma tylko 137 bajtów.02d05+073
.GolfScript (
120106 bajtów)Jest to nie tylko krótsze niż pierwsza wersja, ale także bardziej eleganckie. Część, która faktycznie wykonuje rzut kostką, jest
Reszta to głównie sprawdzanie poprawności danych wejściowych i kilka znaków do analizy.
Demo online ze środowiskiem testowym
źródło
n./
? Może także10,n*
o jedną postać mniej.J - 130 (45?) Char
To wyzwanie wydaje się być trochę tendencyjne w stosunku do wyrażeń regularnych, szczególnie z koniecznością różnicowania nieprawidłowych danych wejściowych. J ma bibliotekę wyrażeń regularnych POSIX, więc nie jest tak źle, ale nie jest zintegrowana z Perlem, więc J nie radzi sobie lepiej niż inne języki.
Jeśli tylko implementujesz logikę prawidłowych wyrażeń, takich jak wydaje się, że rozwiązania Python / PHP, to bardziej rozsądne 45 znaków:
Znaczące bity:
1!:1]1
jest wejściem i(rxmatch rxfrom])
logiką, która zwraca dopasowania podwyrażenia.To, czy dane wejściowe były zgodne z prawem, jest obsługiwane przez dopasowanie wyrażenia regularnego, więc możemy ustawić wartości domyślne dla n i p za pomocą
0 1 1>.
. Spogląda wstecz (domyślnie n wynosi 1, a p wynosi 0), ponieważ musieliśmy wcześniej odwrócić (|.
) listę, aby logika na końcu była wykonywana we właściwej kolejności.@.
to koniunkcja Agenda , zasadniczo instrukcja J-ish switch. Jeśli dopasowania są puste (jeśli 0 jest e.lementem $ hape:)0 e.$
, wysyłamy komunikat o błędzie, w przeciwnym razie przechodzimy przez rzucanie kostkami:#~
aby ustalić kości,1+?
rzucić i+/@,
dodać modyfikator p i suma.źródło
01d01+01
?TinyMUSH , 239
Pierwsze cztery wiersze dotyczą faktu, że „d” jest aliasem uniwersalnego wyjścia „w dół” z wbudowanym komunikatem o awarii, gdy nie istnieje; wyjścia są skanowane przed poleceniami zdefiniowanymi przez użytkownika. Pozostałe linie tworzą obiekt za pomocą polecenia zdefiniowanego przez użytkownika, korzystając z wbudowanej funkcji die ().
źródło
PHP, 129
Używa wyrażenia regularnego, aby utworzyć wyrażenie, które następnie PHP ocenia. Dane wejściowe są podawane przez adres url:? 0 = argument . Upewnij się, że urlencode + na% 2b. Oto jak wygląda w bardziej czytelnej formie:
Bitowe odwracanie ciągów za pomocą
~
nie tylko zapisuje znak, ponieważ nie potrzebujesz cudzysłowów (PHP zakłada, że są to ciągi), ale także zapisuje znaki, ponieważ nie musisz uciekać przed odwrotnymi ukośnikami w wyrażeniu regularnym.?:
Operator jest specjalną formą operatora trójskładnikowego.$foo = $a ? $a : $b
jest taki sam jak$foo = $a ?: $b
.źródło
Java, 378
Chciałem tylko wypróbować rozwiązanie z Javą dalekie od najlepszego rozwiązania. Ale hej: Java w żadnym wypadku nie jest językiem golfowym!
Pobiera dane wejściowe z wiersza poleceń. Pierwszy parametr
args[0]
to wartość wejściowa.Czy wiesz, że
decode
jest krótszy niżvalueOf
?źródło
Python 3, 184 bajty
Przechodzi wszystkie testy. Gdyby dozwolone były kości zero, pomijanie byłoby o 6 bajtów krótsze
(or q)
.źródło
re.match
domyślnie zakotwicza na początku, ale nie na końcu. Nie znam żadnej innej biblioteki wyrażeń regularnych, która to robi.t=int(c or 0)
; i może być możliwe połączenie twojej odpowiedzi z istniejącą w Pythonie (która wykorzystuje mniej białych znaków), aby zaoszczędzić jeszcze kilka.JavaScript 134
źródło
02d05+073
.Ruby,
167147Używa wyrażenia regularnego do wykonania całej pracy. Ponieważ używam
\d+
, jedyne rzeczy, które muszę sprawdzić pod kątem nieprawidłowych danych wejściowych, to to, że było dopasowanie, które nie było anin
niem
było0
, i że byłom
. Jeśli którykolwiek zostanie znaleziony, przerywa się komunikatem ('Invalid input'
). Następnie drukuje wynik, ponieważ zostałby przerwany, gdyby dane wejściowe były nieprawidłowe.Drukowanie wyników nie jest tak interesujące, ale ...
Później zmieniłem
.inject(:+)
naeval(...*?+)
, ale pomysł jest taki sam.źródło
Python3, 204B
Kopalnia bije istniejącego Pythona odpowiedź dodając w wymaganej obsługi błędów i czytania
d20
jak1d20
zamiast0d20
:)edytowany naprawić 2 literówki:
I(x) => I(c)
,Invalid Input => Invalid input
edytowane, aby naprawić regex:
\+?(\d*) => (\+\d+)?
źródło
3d20+
.01d01+01
.