D&D noktası satın alma maliyeti


20

Dungeons & Dragons karakteri yaparken , yuvarlanma yeteneği puanlarına bir alternatif olarak , bunları nokta satın alma adı verilen bir güç bütçesine atamaktır. Daha yüksek yetenek puanları, özellikle üst uca doğru daha fazla puana mal olur: 8 puanı ücretsizdir ve 15 veya 16'ya 2 puan yükseltmek ve 17 veya 18'e 3 puan yükseltmek dışında bir puanı 1 puan 1 puan arttırmak.

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

Liste formunda:

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

Puan satın alma maliyeti, altı yetenek puanının tümü için toplanır.

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

Her biri 8'den 18'e kadar olan altı yetenek puanı verildiğinde, toplam puan satın alma maliyeti çıktılanır. En az bayt kazanır.


2
Ähm sadece ben mi yoksa verilen meydan okuma eksik mi? 0o
Zaibis

1
@Zaibis Ne demek istediğinizden emin değilim. "En az bayt kazanır" ı koydum - bunu mu demek istediniz?
xnor

tmp blah blah demek: evet
Zaibis

Yanıtlar:


11

JavaScript (ES7), 44 42 40 bayt

Çarpılan 44 hala normal 44 :(

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

2 bytes tasarrufu için @apsillers'a teşekkürler !

açıklama

İlginç olan kısım -1-~((s-14)**1.3). (s-14)**1.3üretir 1, 2, 4ve 6değerleri için 15 - 18. 15Üstel JavaScript uygulaması kesirli bir üs ile negatif değerler üzerinde çalışamadığından hataya neden olan herhangi bir sayı hataya neden olur. Temel olarak, herhangi bir değer s < 15geri dönmesine neden olur NaN, bu yüzden -1-~onu bir sayıya ( 0) çevirmek için vardır .

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 Çözümü (42 bayt)

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

Ölçek

Bu test, herhangi bir standart tarayıcıda çalışabilmesi Math.powiçin üstel işleç ( **) kullanır .


Bir bayt daha: |tyerine kullanın &&t. ECMAScript operasyonuToInt32 daima sonucunu zorlamak olacak mapburada 0çoklu element diziler hep, çünkü ToNumberhiç -ify NaN. (Spesifikasyon tek elemanlı dizilerin girdi olarak girmesine izin veriyorsa, ancak 6 eleman gerektiriyorsa bu bir sorun olacaktır.)
apsillers

@apsillers Ooh, güzel bir ipucu! Teşekkürler
user81655

8

CJam, 18 bayt

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

veya

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

Burada test edin.

açıklama

Fikir, nokta maliyetini üç bileşene ayrıştırmaktır:

 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

Her üç bileşen de tek bir çıkarma ve sonucu negatif olmayan değerlerle sınırlandırarak hesaplanabilir.

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 bayt

s>#0-M*Q+14yB8

Test odası

Bu Martin Büttner ile aynı temel hesaplama araçlarını kullanır:

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

Bununla birlikte, hesaplama araçları çok farklıdır. Çıkartılacak numaraların listesini oluşturmak için ifadeyi kullanıyorum +14yB8. yB8"y fonksiyonunda Bifurkat 8" anlamına gelir. y sayıları ikiye katlar, bu da verir [8, 16]. Sonra listeyi vererek 14 ekliyoruz [14, 8, 16].

Daha sonra, girişi olan Kartezyen ürünü alır ve her bir değer çiftini çıkarırız.

Daha sonra, maksimizasyon işlemini gerçekleştirin, sadece pozitif değerleri filtreliyoruz ve kalanını topluyoruz.


4

Samau , 19 bayt

Sorunun yeni dilimin son işleminden sonra gönderilip gönderilmediğinden emin değilim . İkisi de 2 saat önceydi. Ancak burada kullanılan tüm özellikler bundan önce eklenmiştir.

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

Samau kullanan CP737 varsayılan karakter kodlama olarak.

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

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

(Bunun en uygun olmadığından eminim.)

Girdi komut satırı bağımsız değişkenlerini alır ve bunları bir döngüye dönüştürür |%{...}. Her bir yinelemede, $t+=mevcut sayımız eksi 8 $_-8artı endeksleme sonucu ile daha pahalı değerler için bir karma tablo haline getiriyoruz @{...}[$_]. Sonra biz sadece $tsonunda çıktı .


0

(🐂👍) Ox ++, 248 bayt (62 karakter)

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

Üzerinde çalıştığım dil. Kodu buraya yapıştırın .


Tarayıcım bu karakterlerden yalnızca 7 tanesini görüntüleyebilir.
isaacg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.