В Dungeons & Dragons почти все решается броском кубика. Как правило, если бросок больше или равен указанному значению, ваша попытка сделать то, что вы хотели сделать, увенчается успехом и в противном случае не удастся. Чаще всего для броска используется 20-сторонний штамп (он же d20).
В других случаях используется система вызова навыков. Это похоже на простую систему, описанную выше, но успех определяется тем, успешно ли игрок (-ы) бросает определенное количество раз, прежде чем потерпеть неудачу определенное количество раз. Например, игрок (-ы) могут пытаться взломать несколько замков на двери с ограниченным количеством отмычек. Отдельные успешные броски представляют собой успешный выбор одного из замков, а отдельные неудачные броски представляют собой взлом отмычки. Общий успех означал бы успешное вскрытие всех замков перед тем, как взломать все отмычки.
Кроме того, определенные броски могут быть критическими бросками. На d20 бросок 1 - критический сбой, приводящий к немедленному провалу всего вызова (в приведенном выше примере игрок (-ы) могут случайно предупредить охранника). Бросок 20 - это критический успех, который приводит к немедленному выполнению всего вызова (в приведенном выше примере игрок (-ы) может найти набор ключей для замков, что устраняет необходимость их взлома). В случае критического броска, задача немедленно заканчивается и результат определяется независимо от количества предыдущих успехов и неудач.
В этом задании вам будет предоставлена сложность, количество необходимых успехов и количество неудач, при которых испытание было неудачным. Вы должны смоделировать игрока, пытающегося выполнить вызов, и вывести результат.
вход
3 целых числа, представляющих значение, которое должно быть достигнуто или превышено для достижения успеха на отдельном броске, количество успехов, необходимых для успешного выполнения задания, и количество неудач, при которых испытание не удалось. Порядок и формат входных данных не имеет значения, пока вы указываете, какой порядок вы будете использовать. Сложность будет от 1 до 20 включительно, а количество успехов и неудач будет от 1 до 100 включительно.
Выход
Результаты каждого броска d20 (целые числа по порядку) и общий результат испытания (значение truey / falsey). Формат не имеет значения, пока отдельные результаты находятся в порядке, общий результат идет до или после всех отдельных бросков (например, вы не можете вывести общий результат в середине бросков), и Вы указываете, какой выходной формат вы используете, и используете его последовательно.
Примеры (значения в скобках приведены для пояснения и не должны быть включены):
Входные данные:
12 5 3 (difficulty successes failures)
Выход:
15 (success, 1-0)
10 (failure, 1-1)
5 (failure, 1-2)
16 (success, 2-2)
12 (success, 3-2)
15 (success, 4-2)
19 (success, 5-2)
True (overall success)
Входные данные:
15 2 3 (difficulty failures successes)
Выход:
0 (overall failure)
15 (success, 1-0)
12 (failure, 1-1)
13 (failure, 1-2)
Входные данные:
5 5 10 (successes failures difficulty)
Выход:
11 (success, 1-0)
5 (failure, 1-1)
20 (critical success)
1 (overall success)
Входные данные:
3 10 3 (failures difficulty successes)
Выход:
12 (success, 1-0)
11 (success, 2-0)
1 (critical failure)
False (overall failure)
правила
- Это код-гольф , поэтому выигрывает самый короткий код в байтах
- Вы должны случайным образом выбрать целое значение от 1 до 20 (включительно) для каждого броска. Каждое значение должно иметь одинаковую вероятность быть выбранным (или максимально приближенным к равному).
the number of successes and failures will both be between 1 and 100, inclusive.
Так что, да, есть вероятность, что один сбой приведет к провалу всего вызова.Ответы:
JavaScript,
83787675 байтЭтот код рекурсивно отсчитывает успехи и неудачи по мере их возникновения. Когда либо успехи (
s
) или неудачи (f
) насчитали до0
, как мы закончим сtrue
значением ,!s
когдаs
есть0
или с falsy значением ,f
когдаf
есть0
.Вывод имеет форму регулярного выражения
/^(-\d{1,2})+(0|true)$/
(или, точнее,/^(-[1-9]|-1[0-9]|-20)+(0|true)$/
). То есть входные данные имеют начальный дефис, затем значения броска, обозначенные дефисами, и, наконец, конечный результат (0
илиtrue
), который не выделяется из окончательного броска. Тем не менее, это все еще однозначная грамматика, потому что всегда можно различить конечный результат и конечный результат: последний символ выходных данных (либо0
илиe
) всегда указывает на результат, а окончательный0
всегда читается отдельно от числа (й) последнего броска.Пример выходов для
F(11,3,4)
:Объяснение:
Этот код работает, бросая отрицательные d20 и (ab), используя отрицательные знаки в качестве разделителей.
Числово-минус-логические выражения работают, потому что
true
иfalse
приводятся в1
и0
в числовом контексте. В этом случаеd>-r
будет,1
если бросок будет неудачным и0
если это был успех.источник
Python, 134 байта
Спасибо Pietu1998 за сохраненные байты
Довольно просто, возможно, можно играть в гольф немного больше, но нам нужно было что-то, чтобы начать это. Попробуйте онлайн .
источник
from random import*
и удалитьrandom.
, использоватьrandint(1,20)
вместоrandrange(20)+1
, заменитьand
на*
. Вы также можете поместить окончательный результат в начало вывода, экономя место.Python 2,
123121 байт(Этот ответ смешивает пробелы и табуляции , поэтому первый уровень отступа - это один пробел, а второй - одна вкладка.)
Функция
f
принимает следующие аргументы:a
порог для броска кубика за успех,b
количество успехов, необходимых для общего успеха,c
количество сбоев, необходимых для общего сбоя.На каждом броска либо
b
илиc
уменьшается (но не оба). Пока оба они положительны, они повторяются снова, за исключением случаев критического отказа или критического успеха.Если допустить отсутствие критических успехи или неудачи, когда заканчивается цикл либо
b
илиc
будет равна нулю, но не оба. В этом случае функция просто возвращает текущее значениеc
, которое равно нулю (Falsey), если мы исчерпали все наши ошибки, и положительному (Truthy), если нам это удалось.В качестве бонуса вывод показывает, сколько у вас осталось отказов, что хорошо, если есть (скажем) больше блокировок, которые можно выбрать позже. (Если это не закончилось в критической неудаче или успехе, в этом случае выходные данные будут булевыми вместо int.)
источник
Пип , 39 байт
Кто-то сказал, что хочет увидеть решение на языке игры в гольф.
Я уверен, что здесь не используются какие-либо языковые функции, более новые, чем вопрос. Принимает ввод как аргументы командной строки в следующем порядке: сложность, требуемые успехи, требуемые сбои. Выходы 0 для общего отказа или ненулевое значение для общего успеха.Попробуйте онлайн!
Этот подход является довольно простой стратегией цикла пока один или два, взятые из других решений. Вот версия с комментариями, пробелами и дополнительным выводом:
источник
Ruby 2.2, 75 байт
Основное итеративное решение. Пример выполнения:
Мог бы вывод:
Вы можете увидеть его на IDEONE здесь .
источник
VBA 180 байт
Пример вывода
Последняя цифра вывода будет
0
дляFalse
или1
дляTrue
. Каждый бросок отделяется новой строкой. При этом используется VBA, встроенная в ГСЧ,rnd()
которая известна как не столь случайная , но она должна как можно лучше соответствовать требованиям.источник
SpecBAS - 165 байт
Ввод следует вводить в порядке сложности, успехов, неудач.
Новая версия SpecBAS теперь позволяет "?" вместо
PRINT
и устраняет необходимостьLET
перед присвоением переменных, так что это был хороший способ опробовать их.Поскольку массивы по умолчанию основаны на 1, строка 6 возвращает 0/1, если бросок превосходит сложность, и добавляет 1 для обновления правильного индекса.
источник
Perl 6 ,
10199 байтВвод - это изменяемый массив, содержащий трудности, успехи, неудачи
Вывод - это двухэлементный список, первый элемент - это список свернутых значений, второй - количество оставшихся отказов.
Использование:
источник