Koszt zakupu punktu D&D

20

Tworząc postać z Lochów i Smoków , alternatywą dla wyników umiejętności toczenia jest przydzielenie ich w ramach budżetu mocy zwanego kupnem punktów. Wyższe wyniki umiejętności kosztują więcej punktów, szczególnie w górnej części: wynik 8 jest bezpłatny, a podniesienie wyniku o 1 kosztuje 1 punkt, z wyjątkiem podniesienia do 15 lub 16 kosztuje 2 punkty, a podniesienie do 17 lub 18 kosztuje 3 punkty.

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

W formie listy:

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

Koszt zakupu punktu jest sumowany dla wszystkich sześciu punktów umiejętności.

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

Biorąc pod uwagę sześć punktów umiejętności, każdy od 8 do 18, generuje całkowity koszt zakupu punktu. Wygrywa najmniej bajtów.

xnor
źródło
2
Ach, czy to tylko ja, czy brakuje danego wyzwania? 0o
Zaibis,
1
@Zaibis Nie jestem pewien, co masz na myśli. Wprowadziłem „najmniej bajtów wygranych” - miałeś na myśli?
xnor
tmp bla bla powiedzieć: tak
Zaibis

Odpowiedzi:

11

JavaScript (ES7), 44 42 40 bajtów

Przekreślone 44 jest nadal regularne 44 :(

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

Dzięki @apsillers za uratowanie 2 bajtów!

Wyjaśnienie

Interesującą częścią jest -1-~((s-14)**1.3). (s-14)**1.3produkuje 1, 2, 4a 6dla wartości 15 - 18. Dowolna liczba mniejsza niż 15powoduje błąd, ponieważ implementacja JavaScript wykładniczej nie może działać na wartościach ujemnych z wykładnikiem ułamkowym. Zasadniczo dowolna wartość s < 15powoduje, że zwraca NaN, więc -1-~istnieje rzutowanie na liczbę ( 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

Rozwiązanie ES6 (42 bajty)

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

Test

W tym teście zastosowano Math.powzamiast tego wykładniczy operator ( **), dzięki czemu można go uruchomić w dowolnej standardowej przeglądarce.

użytkownik 81655
źródło
Jeszcze jeden bajt: użyj |tzamiast &&t. Operacja ECMAScriptToInt32 zawsze będzie wymuszać wynik maptutaj 0, ponieważ tablice ToNumberwieloelementowe zawsze to potwierdzą NaN. (Byłby to problem, gdyby specyfikacja dopuszczała tablice jednoelementowe jako dane wejściowe, ale wymaga 6 elementów.)
apsillers
@apsillers Ooh, to fajna wskazówka! Dzięki
user81655,
8

CJam, 18 bajtów

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

lub

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

Sprawdź to tutaj.

Wyjaśnienie

Chodzi o rozkład kosztu punktowego na trzy elementy:

 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

Wszystkie trzy składniki można obliczyć za pomocą pojedynczego odjęcia i ograniczenia wyniku do wartości nieujemnych.

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.
Martin Ender
źródło
8

Pyth, 14 bajtów

s>#0-M*Q+14yB8

Zestaw testowy

Wykorzystuje to te same podstawowe metody obliczeń, co Martin Büttner, a mianowicie:

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

Biorąc to pod uwagę, sposoby obliczania są bardzo różne. Aby wygenerować listę liczb do odjęcia, używam wyrażenia +14yB8. yB8oznacza „Bifurcate 8 w funkcji y”. y podwaja liczby, więc daje to [8, 16]. Następnie dodajemy 14, podając listę [14, 8, 16].

Następnie bierzemy iloczyn kartezjański z danymi wejściowymi i odejmujemy każdą parę wartości.

Następnie wykonaj operację maksymalizacji, po prostu filtrujemy tylko wartości dodatnie i sumujemy resztę.

isaacg
źródło
4

Samau , 19 bajtów

Nie jestem pewien, czy pytanie zostało opublikowane po ostatnim zatwierdzeniu mojego nowego języka. Oboje są 2 godziny temu. Ale wszystkie funkcje tutaj użyte zostały dodane wcześniej.

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

Samau używa CP737 jako domyślnego kodowania znaków.

▐[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
alephalpha
źródło
0

PowerShell, 48 bajtów

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

(Jestem pewien, że nie jest to optymalne.)

Pobiera wejściowe argumenty wiersza poleceń i łączy je w pętlę |%{...}. Przy każdej iteracji zwiększamy naszą sumę $t+=o bieżącą liczbę minus 8 $_-8plus wynik indeksowania do tablicy mieszającej dla droższych wartości @{...}[$_]. Następnie po prostu generujemy $tna końcu.

AdmBorkBork
źródło
0

(🐂👍) Ox ++, 248 bajtów (62 znaki)

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

Język, nad którym pracuję. Wklej tutaj kod .

geokavel
źródło
Moja przeglądarka może wyświetlać tylko 7 z tych znaków.
isaacg