D & D point стоимость покупки


20

При создании персонажа Dungeons & Dragons альтернативой бросающимся способностям является назначение их в рамках бюджета мощности, называемого точечной покупкой. Более высокие оценки способностей стоят больше очков, особенно в верхней части: оценка 8 является бесплатной, а повышение оценки на 1 стоит 1 балл, за исключением повышения до 15 или 16 - 2 балла, а повышение до 17 или 18 - 3 балла.

+-------+------+
| Score | Cost |
+-------+------+
|     8 |    0 |
|     9 |    1 |
|    10 |    2 |
|    11 |    3 |
|    12 |    4 |
|    13 |    5 |
|    14 |    6 |
|    15 |    8 |
|    16 |   10 |
|    17 |   13 |
|    18 |   16 |
+-------+------+

В форме списка:

[(8, 0), (9, 1), (10, 2), (11, 3), (12, 4), (13, 5), (14, 6), (15, 8), (16, 10), (17, 13), (18, 16)]

Стоимость покупки очков суммируется для всех шести очков способностей.

Ability scores: 16   17   8  13   8  12
Point buy cost: 10 + 13 + 0 + 5 + 0 + 4  = 32

С учетом шести показателей способностей, каждое из которых от 8 до 18, выведите общую стоимость покупки. Побеждает несколько байтов.


2
Эмм, это только я, или эта проблема отсутствует? 0о
Zaibis

1
@Zaibis Не уверен, что ты имеешь в виду. Я положил в "побеждать наименьшее количество байтов" - ты это имел ввиду?
xnor

тэмп бла бла сказать: да
Zaibis

Ответы:


11

JavaScript (ES7), 44 42 40 байт

Вычеркнул 44, все еще регулярно 44 :(

a=>a.map(s=>t+=s-9-~((s-14)**1.3),t=0)|t

Спасибо @apsillers за сохранение 2 байта!

объяснение

Интересная часть есть -1-~((s-14)**1.3). (s-14)**1.3производит 1, 2, 4и 6для значений 15 - 18. Любое число меньше, чем 15вызывает ошибку, потому что реализация экспоненциальной JavaScript не может работать с отрицательными значениями с дробным показателем. По сути, любое значение для s < 15заставляет его возвращать NaN, поэтому -1-~есть, чтобы привести его к числу ( 0).

a=>                       // a = input scores as an array of numbers
  a.map(s=>               // for each passed score
    t+=                   // add to the total
      s-9                 // point value = s - 8 (-1 used for next line)
      -~((s-14)**1.3),    // add extra points for scores 15 - 18
    t=0                   // t = total points (this happens BEFORE the map call)
  )
  |t                      // return the total points

Решение ES6 (42 байта)

a=>a.map(s=>t+=s-9-~[1,2,4,6][s-15],t=0)|t

Тестовое задание

Этот тест использует Math.powвместо этого экспоненциальный оператор ( **), чтобы он мог работать в любом стандартном браузере.


Еще один байт: используйте |tвместо &&t. Операция ECMAScriptToInt32 всегда будет приводить к результату mapздесь 0, потому что многоэлементные массивы всегда будут ToNumber-if toNaN . (Это было бы проблемой, если бы спецификация допускала одноэлементные массивы в качестве входных данных, но для этого требуется 6 элементов.)
apsillers

@apsillers О, это хороший совет! Спасибо
user81655

8

CJam, 18 байт

l~[8EG]ff-:~0fe>:+

или

l~[8EG]m*::m0fe>:+

Проверьте это здесь.

объяснение

Идея состоит в том, чтобы разбить стоимость пункта на три составляющих:

 Score: 8  9 10 11 12 13 14 15 16 17 18
        0  1  2  3  4  5  6  7  8  9 10
        0  0  0  0  0  0  0  1  2  3  4
        0  0  0  0  0  0  0  0  0  1  2
       --------------------------------
 Cost:  0  1  2  3  4  5  6  8 10 13 16

Все три компонента могут быть вычислены с помощью одного вычитания и ограничения результата неотрицательными значениями.

l~    e# Read and evaluate input.
[8EG] e# Push [8 14 16].
ff-   e# For each pair from the two lists, subtract one from the other. 
:~    e# Flatten the result.
0fe>  e# Clamp each difference to non-negative values.
:+    e# Sum them all up.

8

Pyth, 14 байт

s>#0-M*Q+14yB8

Тестирование

Здесь используются те же фундаментальные средства расчета, что и у Мартина Бюттнера, а именно:

max(n-8, 0) + max(n-14, 0) + max(n-16, 0)

При этом средства расчета очень разные. Чтобы сгенерировать список чисел для вычитания, я использую выражение +14yB8. yB8означает «Бифуркат 8 на функцию у». у удваивает числа, так что это дает[8, 16] . Затем добавляем 14, давая список [14, 8, 16].

Далее мы берем декартово произведение со входом и вычитаем каждую пару значений.

Затем, выполняя операцию максимизации, мы просто фильтруем только положительные значения и суммируем остаток.


4

Samau , 19 байт

Не уверен, что вопрос будет опубликован после последнего коммита моего нового языка. Они оба 2 часа назад. Но все функции, использованные здесь, были добавлены до этого.

▐[8 14 16]`-o;0>*ΣΣ

Samau использует CP737 в качестве кодировки символов по умолчанию.

▐[8 14 16]`-o;0>*ΣΣ
▐                      read a list of numbers
 [8 14 16]             push [8 14 16]
          `-           push the function [-]
            o          outer product
             ;         duplicate
              0>       for each element, test if it's larger than 0
                *      times
                 ΣΣ    take the sum twice because it's a 2d array

0

PowerShell, 48 байт

$args|%{$t+=$_-8+@{15=1;16=2;17=4;18=10}[$_]};$t

(Уверен, это не оптимально.)

Принимает входные аргументы командной строки и передает их в цикл |%{...}. На каждой итерации мы увеличиваем нашу общую сумму $t+=с текущим числом минус 8 $_-8плюс результат индексации в хеш-таблицу для более дорогих значений @{...}[$_]. Тогда мы просто выводим $tв конце.


0

(🐂👍) Ox ++, 248 байт (62 символа)

🐀👉🌑👺🐁👉🌑👺😂🐀🐟🌗😂🐂👉😷😺😺😷👺🐁👉🐁👏🐂🙌🌙👏🌜🐂🐳🌒🌕🌛👥🌜🐂🙌🌒🌕🌛👏🌜🐂🐳🌒🌗🌛👥🌜🐂🙌🌒🌗🌛👺🐀👍😂👄🐁👄

Язык, на котором я работаю. Вставьте код здесь .


Мой браузер может отображать только 7 из этих символов.
Исаак
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.