ค่าใช้จ่ายในการซื้อ 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
ฉันเป็นแค่ฉันหรือการท้าทายที่ได้รับหายไป? 0o
Zaibis

1
@Zaibis ไม่แน่ใจว่าคุณหมายถึงอะไร ฉันใส่ใน "น้อยที่สุด bytes ชนะ" - คุณหมายความว่าอย่างไร
xnor

tmp blah blah ที่จะพูด: yep
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จะNaNเป็น (นี่จะเป็นปัญหาหากสเป็คอนุญาตให้ใช้องค์ประกอบแบบอาร์เรย์เดียวเป็นอินพุต แต่ต้องใช้องค์ประกอบ 6 องค์ประกอบ)
apsillers

@apsillers Ooh นั่นเป็นคำแนะนำที่ดี! ขอขอบคุณ
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

ชุดทดสอบ

สิ่งนี้ใช้วิธีการคำนวณพื้นฐานแบบเดียวกับ Martin Büttnerกล่าวคือ:

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

ที่ถูกกล่าวว่าวิธีการคำนวณแตกต่างกันมาก +14yB8เพื่อสร้างรายการของตัวเลขที่จะลบผมใช้การแสดงออก yB8หมายถึง "Bifurcate 8 บนฟังก์ชัน y" Y [8, 16]คู่หมายเลขดังนั้นนี้จะช่วยให้ จากนั้นเราจะเพิ่มในวันที่ 14 [14, 8, 16]ให้รายการ

ต่อไปเราจะนำผลิตภัณฑ์คาร์ทีเซียนที่มีการป้อนข้อมูลและลบค่าทุกคู่

ถัดไปทำการดำเนินการขยายใหญ่สุดเราเพียงกรองค่าบวกเท่านั้นและรวมส่วนที่เหลือ


4

Samau , 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

(ค่อนข้างแน่ใจว่านี่ไม่ใช่วิธีที่ดีที่สุด)

|%{...}ใช้อาร์กิวเมนต์ใส่คำสั่งเส้นและท่อพวกเขาเป็นห่วง แต่ละซ้ำเราเพิ่มทั้งหมดของเรา$t+=มีจำนวนปัจจุบันลบ 8 $_-8บวกผลมาจากการจัดทำดัชนีลง Hashtable @{...}[$_]สำหรับค่ามากขึ้นมีราคาแพง จากนั้นเราก็ส่งออก$tในตอนท้าย


0

(🐂👍) Ox ++, 248 ไบต์ (62 ตัวอักษร)

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

ภาษาฉันกำลังทำงาน วางในรหัสที่นี่


เบราว์เซอร์ของฉันสามารถแสดงอักขระเหล่านี้ได้ 7 ตัวเท่านั้น
isaacg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.