Я хочу играть в Dungeons and Dragons, но у меня нет игральных костей! Ваша задача - бросить кубики D & D.
Спецификация формата ввода в форме Бэкуса-Наура :
<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>
Необязательное целое число перед d
: число костей для броска; это должно быть по крайней мере 1
, и по умолчанию, 1
если не предоставлено.
Требуемое целое число сразу же после числа d
- число сторон, которое имеет каждый кубик; это должно быть по крайней мере 1
. Стороны каждого кубика являются различными последовательными положительными целыми числами, начиная с 1
.
Необязательный модификатор может быть +0
, и он по умолчанию, +0
если не указан.
Например, для ввода 2d10+5
вы генерируете два случайных числа от 1 до 10 включительно, складываете их вместе и добавляете 5. Затем вы получите результат.
Если вы получаете неверный ввод, такие как 2d
, d20+
, 0d4
, 2d5+1+2
, 2+2
, или что - нибудь еще , что не соответствует этому формату, вы должны вывести « Invalid input
». В противном случае вы должны вывести только одно случайное целое число, взвешенное в соответствии с входными данными. Например, 3d6
должно выдавать больше 10
s, чем 4
s .
Контрольные примеры
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
Это код-гольф , поэтому выиграет самый короткий код в байтах!
02d05+073
действительным вход?n
иp
как необязательный, но ввод, который выбирает не включать их (d20+
) как недействительный.+
знак должен быть добавлен, только если указан модификаторp
.1d4+1d6
для подлого разбойника, атакующего кинжалом) или отрицательный результатp
(например,1d20-1
для проверки навыка без рангов / тренировок и модификатора отрицательной способности).2d8 + 1d6 + 4
? У тебя будет плохое времяОтветы:
Perl
10995939689 байтТребуется
-p
переключатель, на который приходится два байта. Попробуйте онлайн на Ideone .Как это устроено
Благодаря
-p
переключателю строка читается из STDIN и сохраняется в$_
.Команда
s/^d/1d/
присоединяет 1 , чтобы ,$_
если он начинается с г , то есть, если количество костей не было указано.Регулярное выражение
/^(\d+)d(\d+)(\+\d+)?/
проверяет, состоит ли строка из числа, литерала d , другого числа и, необязательно, третьего числа, которому предшествует знак + .Если есть совпадение, цифры будут сохранены в
$1
,$2
и$3
.В этом случае вход будет действительным, если и только если
$1
и$2
оба положительны.$d += 1 + rand $2 | 0
добавляет псевдослучайно выбранное целое число от 1 до указанного числа сторон$d
(изначально рассматривается как ноль).for 1 .. $1
делает вышеупомянутое один раз для каждого целого числа между 1 и количеством игральных костей.Команда
$_ = $1 * $2 ? $d + $3 : 'Invalid input'
выполняет следующие действия:Если
$1 * $2
ноль, он устанавливает$_
на Неверный ввод .В противном случае вход действителен, и он устанавливает
$_
сумму бросков костей и модификатора.Благодаря
-p
переключателю Perl печатает содержимое$_
.Поскольку дальнейших строк ввода нет, скрипт завершается.
источник
-p
будет стоить всего один, что делает это решение 108 байтов./^([1-9]\d*)?d([1-9]\d*)(\+\d+)?$/||die"Invalid input$/";$a+=1+int rand$2for(1..$1||1);$_=$a+$3
|0
для приведения к int, так какrand
возвращает псевдослучайно выбранный float .-e
было бы здесь проблематично, если только вы не замените одинарные кавычки на двойные.Фортран: 145
Злоупотребляет неявной типизацией (
i-n
все целые числа, все остальное - реальное). Незначительное предостережение: ввод должен быть разделен пробелом, поэтому2d10+5
должен быть введен как2 d 10 + 5
, иначе вы получитеinput conversion error
.источник
Руби, 116
Альтернативная версия Ruby. Я пытался найти способ сделать это без регулярных выражений, но проверка, которую вы должны сделать, намного сложнее без них.
Это 112, используя умный алгоритм Perl Денниса:
источник
Javascipt, 158
Не могу играть в гольф лучше, чем это. Пришло время вернуться к работе.
источник
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)
имеет только 137 байтов.02d05+073
.GolfScript (
120106 байт)Это не только короче первой версии, но и более элегантно. Часть, которая на самом деле делает штамповки
Остальное - в основном проверка ввода и несколько символов для разбора.
Демоверсия онлайн с тестовыми фреймворками
источник
n./
? Возможно также10,n*
на один символ меньше.J - 130 (45?) Символ
Эта проблема, кажется, немного смещена в сторону регулярных выражений, особенно из-за необходимости различать неверный ввод. У J есть библиотека регулярных выражений POSIX, так что это не так уж плохо, но она не интегрирована, как с Perl, поэтому J стоит не лучше, чем другие языки.
Если вы просто реализуете логику для допустимых выражений, как это показывают решения Python / PHP, то это более разумные 45 символов:
Известные биты:
1!:1]1
это вход, и(rxmatch rxfrom])
это логика, которая возвращает совпадения подвыражения.То, был ли ввод допустимым, обрабатывается сопоставлением с регулярным выражением, поэтому мы можем установить значения по умолчанию для n и p с помощью
0 1 1>.
. Он смотрит назад (по умолчанию n равно 1, а p равно 0), поскольку нам пришлось раньше (|.
) перевернуть ( ) список, чтобы логика в конце выполнялась в правильном порядке.@.
является соединением Повестки дня , по сути, оператором переключения J-ish. Если совпадения пустые (если 0 является элементом $ hape:)0 e.$
, мы выдаем сообщение об ошибке, иначе мы переходим к бросанию игральных костей:#~
чтобы выставить кости,1+?
бросить и+/@,
добавить модификатор p и сумма.источник
01d01+01
?TinyMUSH , 239
Первые четыре строки касаются того факта, что «d» является псевдонимом универсального выхода «вниз» со встроенным сообщением об ошибке, когда его не существует; выходы сканируются перед пользовательскими командами. Оставшиеся строки создают объект с помощью пользовательской команды, использующей встроенную функцию die ().
источник
PHP, 129
Использует регулярное выражение для создания выражения, которое затем оценивает PHP. Ввод осуществляется через URL:? 0 = аргумент . Убедитесь, что вы urlencode + до% 2b. Вот как это выглядит в более читаемой форме:
Побитовое инвертирование строк с использованием
~
не только сохраняет символ, потому что вам не нужны кавычки (PHP предполагает, что они являются строками), но также сохраняет символы, потому что вам не нужно экранировать обратную косую черту в регулярном выражении.?:
Оператор представляет собой особую форму тройного оператора.$foo = $a ? $a : $b
так же, как$foo = $a ?: $b
.источник
Ява, 378
Просто хотел попробовать решение с Java далеко не лучшим решением. Но эй: Java ни в коем случае не является языком игры в гольф!
Он получает данные из командной строки. Первый параметр
args[0]
- это входное значение.Знаете ли вы, что
decode
корочеvalueOf
?источник
Python 3, 184 байта
Проходит все тесты. Если бы были разрешены нулевые кубики, они были бы на 6 байтов короче, если их не использовать
(or q)
.источник
re.match
неявно привязывает начало, но не конец. Я не знаю ни о какой другой библиотеке регулярных выражений, которая делает это.t=int(c or 0)
; и может быть возможно объединить ваш ответ с существующим Python (который использует меньше пробелов), чтобы сэкономить пару больше.JavaScript 134
источник
02d05+073
.Рубин,
167147Использует регулярное выражение, чтобы сделать всю работу. Так как я использую
\d+
, единственное, что мне нужно проверить на предмет неверного ввода, это то, что было совпадение, что ни было ,n
ниm
было0
, и было ли этоm
. Если какой-либо из них найден, он завершается с сообщением ('Invalid input'
). Затем он просто печатает результат, так как он бы сейчас прервался, если ввод был неверным.Печать результатов не так интересна, но ...
Позже я изменился
.inject(:+)
наeval(...*?+)
, но идея та же.источник
Python3, 204B
Mine бьет существующий ответ на Python, добавив в требуемой обработки ошибок и чтения ,
d20
как1d20
вместо0d20
:)отредактировано, чтобы исправить 2 опечатки:
I(x) => I(c)
,Invalid Input => Invalid input
отредактировано, чтобы исправить регулярные выражения:
\+?(\d*) => (\+\d+)?
источник
3d20+
.01d01+01
.