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)]

6つの能力スコアすべてについて、ポイント購入コストが合計されます。

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

それぞれ8〜18の6つの能力スコアが与えられると、合計ポイント購入コストが出力されます。最少バイトが勝ちます。


2
ああ、それは私だけですか、それとも与えられたチャレンジはありませんか?0o
ザイビス

1
@Zaibisどういう意味かわかりません。私は「最少バイト数勝利」を入れました-あなたはそれを意味しましたか?
XNOR

tmp
何とか

回答:


11

JavaScript(ES7)、44 42 40バイト

取り消し線44は、まだ通常の44です:(

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

2バイトを節約してくれた@apsillersに感謝します!

説明

興味深い部分は-1-~((s-14)**1.3)(s-14)**1.3生産124および6値について15 - 1815JavaScript実装の指数関数は小数指数を持つ負の値を操作できないため、これより小さい数値はエラーを引き起こします。基本的に、の値は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代わりに指数演算子(**)が使用されるため、任意の標準ブラウザーで実行できます。


もう1バイト:の|t代わりに使用します&&tECMAScriptの操作は、ToInt32常に結果強制変換されますmapここには0、多素子アレイは常にますので、ToNumberに-ify NaN。(仕様が単一要素配列を入力として許可する場合、これは問題になりますが、6要素が必要です。)
apsillers

@apsillersああ、それはいいヒントです!ありがとう
user81655

8

CJam、18バイト

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

または

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

ここでテストしてください。

説明

この考え方は、ポイントコストを3つのコンポーネントに分解することです。

 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

3つのコンポーネントはすべて、1回の減算で計算でき、結果を非負の値に制限できます。

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は数値を2倍にします[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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.