研发点购买成本


20

制作《龙与地下城》角色时,滚动能力得分的另一种选择是在称为点购买的功率预算内分配得分。能力得分越高,得分越高,尤其是高端:得分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是我还是给定的挑战缺少了?0o
Zaibis 2015年

1
@Zaibis不确定您的意思。我输入了“最少的字节数获胜”-您的意思是?
xnor 2015年

tmp等等等等:是的
Zaibis

Answers:


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产生1246为这些值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。在ECMAScript的操作ToInt32总是强迫的结果map在这里0,因为多元素阵列将一直ToNumber化到NaN。(如果规范允许单元素数组作为输入,但它需要6个元素,这将是一个问题。)
apsillers 2015年

@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

测试套件

它使用与MartinBüttner相同的基本计算方法,即:

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

话虽如此,计算方法却大不相同。为了生成要减去的数字列表,我使用表达式+14yB8yB8表示“在函数y上的8分叉”。y将数字加倍,因此得出[8, 16]。然后,我们在14上添加列表[14, 8, 16]

接下来,我们将笛卡尔乘积与输入相减,并减去每对值。

接下来,执行最大化操作,我们仅对正值进行过滤,然后对余数求和。


4

萨摩(19字节)

不知道问题是否在我的新语言的最后一次提交之后发布。他们都是两个小时前。但是在此之前使用的所有功能都已添加。

▐[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

(肯定不是最佳选择。)

接受输入的命令行参数并将其通过管道传递给loop |%{...}。每次迭代时,我们将总数$t+=乘以当前数减去8,$_-8再加上索引到哈希表中以获得更昂贵的值@{...}[$_]。然后,我们仅$t在最后输出。


0

(🐂👍)Ox ++,248个字节(62个字符)

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

我正在使用的语言。在此处粘贴代码。


我的浏览器只能显示其中7个字符。
isaacg 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.