Chi phí mua điểm D & D


20

Khi tạo nhân vật Dungeons & Dragons , một cách khác để ghi điểm khả năng lăn là chỉ định chúng trong ngân sách năng lượng gọi là mua điểm. Điểm số khả năng cao hơn tiêu tốn nhiều điểm hơn, đặc biệt là ở cấp trên: điểm 8 là miễn phí và tăng điểm 1 chi phí 1 điểm, ngoại trừ tăng lên 15 hoặc 16 chi phí 2 điểm và tăng lên 17 hoặc 18 chi phí 3 điểm.

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

Ở dạng danh sách:

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

Chi phí mua điểm được tổng hợp cho tất cả sáu điểm khả năng.

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

Cho sáu điểm khả năng, mỗi 8 đến 18, xuất ra tổng chi phí mua điểm. Ít byte nhất sẽ thắng.


2
Ähm chỉ là tôi hay là chiếc challange bị thiếu? 0o
Zaibis

1
@Zaibis Không chắc ý của bạn là gì. Tôi đặt "ít byte chiến thắng nhất" - ý bạn là sao?
xnor

tmp blah blah để nói: yep
Zaibis

Câu trả lời:


11

JavaScript (ES7), 44 42 40 byte

Vượt qua 44 vẫn là thường xuyên 44 :(

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

Cảm ơn @apsillers đã lưu 2 byte!

Giải trình

Phần thú vị là -1-~((s-14)**1.3). (s-14)**1.3sản xuất 1, 2, 46cho các giá trị 15 - 18. Bất kỳ số nào nhỏ hơn 15gây ra lỗi vì việc triển khai JavaScript theo cấp số nhân không thể hoạt động trên các giá trị âm với số mũ phân số. Về cơ bản, bất kỳ giá trị nào s < 15khiến nó quay trở lại NaN, do đó, -1-~có sẵn để chuyển nó thành một số ( 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

Giải pháp ES6 (42 byte)

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

Kiểm tra

Thử nghiệm này sử dụng Math.powthay cho toán tử mũ ( **) để nó có thể chạy trong bất kỳ trình duyệt tiêu chuẩn nào.


Thêm một byte: sử dụng |tthay vì &&t. Các hoạt động ECMAScriptToInt32 sẽ luôn ép buộc kết quả của mapvào đây để 0, vì mảng yếu tố-đa sẽ luôn ToNumber-ify tới NaN. (Đây sẽ là một vấn đề nếu thông số kỹ thuật cho phép các mảng phần tử đơn làm đầu vào, nhưng nó yêu cầu 6 phần tử.)
apsillers

@apsillers Ooh, đó là một mẹo hay! Cảm ơn
user81655

8

CJam, 18 byte

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

hoặc là

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

Kiểm tra nó ở đây.

Giải trình

Ý tưởng là phân tách chi phí điểm thành ba thành phần:

 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

Tất cả ba thành phần có thể được tính toán thông qua một phép trừ duy nhất và giới hạn kết quả ở các giá trị không âm.

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

Bình thường, 14 byte

s>#0-M*Q+14yB8

Bộ kiểm tra

Điều này sử dụng các phương tiện tính toán cơ bản tương tự như Martin Büttner, cụ thể là:

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

Điều đó đang được nói, các phương tiện tính toán rất khác nhau. Để tạo danh sách các số cần trừ, tôi sử dụng biểu thức +14yB8. yB8có nghĩa là "Bifurcate 8 trên hàm y". y nhân đôi số, vì vậy điều này mang lại [8, 16]. Sau đó, chúng tôi thêm vào ngày 14, đưa ra danh sách [14, 8, 16].

Tiếp theo, chúng tôi lấy sản phẩm của Cartesian với đầu vào và trừ mọi cặp giá trị.

Tiếp theo, thực hiện thao tác tối đa hóa, chúng tôi chỉ đơn giản chỉ lọc các giá trị dương và tính tổng phần còn lại.


4

Samau , 19 byte

Không chắc chắn nếu câu hỏi được đăng sau lần cam kết cuối cùng của ngôn ngữ mới của tôi. Cả hai đều cách đây 2 giờ. Nhưng tất cả các tính năng được sử dụng ở đây đã được thêm vào trước đó.

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

Samau sử dụng CP737 làm mã hóa ký tự mặc định.

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

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

(Khá chắc chắn rằng điều này không tối ưu.)

Đưa các đối số dòng lệnh đầu vào và đưa chúng vào một vòng lặp |%{...}. Mỗi lần lặp lại, chúng tôi tăng tổng số của chúng tôi $t+=với số hiện tại trừ 8 $_-8cộng với kết quả của việc lập chỉ mục thành một hàm băm cho các giá trị đắt hơn @{...}[$_]. Sau đó, chúng tôi chỉ đơn giản là đầu ra $tở cuối.


0

(🐂👍) Ox ++, 248 byte (62 ký tự)

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

Ngôn ngữ tôi đang làm việc. Dán mã vào đây .


Trình duyệt của tôi chỉ có thể hiển thị 7 trong số các ký tự này.
isaacg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.