Вартість купівлі та розробки D&D


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
Ähm це тільки я, або відсутній даний виклик? 0о
Zaibis

1
@Zaibis Не впевнений, що ти маєш на увазі. Я вклав "найменше байтових виграшів" - ти це мав на увазі?
xnor

Відповіді:


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-ify до NaN. (Це було б проблемою, якщо специфікація дозволила ввести введення одноелементних масивів як вхідних даних, але для цього потрібно 6 елементів.)
apsillers

@apsillers О, це приємна порада! Дякую
користувач81655

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

Піт, 14 байт

s>#0-M*Q+14yB8

Тестовий набір

Для цього використовуються ті ж основні засоби розрахунку, що і Мартін Бюттнер, а саме:

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

За словами, засоби розрахунку дуже різні. Для створення списку чисел для віднімання я використовую вираз +14yB8. yB8означає "Біфуркація 8 на функції у". y подвоює числа, тому це дає [8, 16]. Потім додаємо 14, даючи список [14, 8, 16].

Далі беремо декартовий продукт з введенням і віднімаємо кожну пару значень.

Далі, виконавши операцію максимізації, ми просто фільтруємо лише позитивні значення та підсумовуємо решту.


4

Самау , 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 цих символів.
isaacg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.