D & D Punktkaufkosten

20

Wenn Sie einen Dungeons & Dragons- Charakter erstellen , können Sie ihn alternativ zu Rollfähigkeitswerten innerhalb eines Kraftbudgets zuweisen, das als Punktkauf bezeichnet wird. Höhere Fähigkeitswerte kosten mehr Punkte, insbesondere im oberen Bereich: Eine Punktzahl von 8 ist kostenlos, und eine Erhöhung um 1 kostet 1 Punkt, außer eine Erhöhung auf 15 oder 16 kostet 2 Punkte und eine Erhöhung auf 17 oder 18 kostet 3 Punkte.

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

In Listenform:

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

Die Punktekaufkosten werden für alle sechs Fähigkeitswerte summiert.

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

Bei sechs Fähigkeitswerten von jeweils 8 bis 18 werden die Gesamtpunktekosten ausgegeben. Wenigste Bytes gewinnt.

xnor
quelle
2
Ähm, bin es nur ich oder fehlt die vorgegebene Herausforderung? 0o
Zaibis
1
@Zaibis Nicht sicher, was du meinst. Ich habe "Wins mit den wenigsten Bytes" eingegeben - meintest du das?
Donnerstag,
tmp bla
bla

Antworten:

11

JavaScript (ES7), 44 42 40 Byte

Durchgestrichen 44 ist immer noch regulär 44 :(

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

Vielen Dank an @apsillers für die Einsparung von 2 Bytes!

Erläuterung

Der interessante Teil ist -1-~((s-14)**1.3). (s-14)**1.3produziert 1, 2, 4und 6für die Werte 15 - 18. Jede Zahl, die kleiner als ist, 15verursacht einen Fehler, da die JavaScript-Implementierung von Exponential nicht mit negativen Werten mit einem Bruchexponenten arbeiten kann. Grundsätzlich s < 15bewirkt jeder Wert für, dass er zurückgegeben wird NaN, sodass der Wert -1-~dort in eine Zahl ( 0) umgewandelt werden kann.

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-Lösung (42 Byte)

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

Prüfung

In diesem Test wird Math.powstattdessen der Exponentialoperator ( **) verwendet, damit er in jedem Standardbrowser ausgeführt werden kann.

user81655
quelle
Ein weiteres Byte: Verwenden Sie |tanstelle von &&t. Die ECMAScript-OperationToInt32 erzwingt immer das Ergebnis von " mapto" 0, da Arrays mit mehreren Elementen immer " ToNumber-ify to" ergeben NaN. (Dies wäre ein Problem, wenn die Spezifikation Einzelelement-Arrays als Eingabe
zulässt
@apsillers Ooh, das ist ein schöner Tipp! Thanks
user81655
8

CJam, 18 Bytes

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

oder

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

Teste es hier.

Erläuterung

Die Idee ist, die Punktkosten in drei Komponenten zu zerlegen:

 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

Alle drei Komponenten können über eine einzige Subtraktion berechnet und das Ergebnis auf nicht negative Werte begrenzt werden.

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
quelle
8

Pyth, 14 Bytes

s>#0-M*Q+14yB8

Testsuite

Dabei werden dieselben grundlegenden Berechnungsmittel wie bei Martin Büttner verwendet:

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

Allerdings sind die Berechnungsmittel sehr unterschiedlich. Um die Liste der zu subtrahierenden Zahlen zu generieren, verwende ich den Ausdruck +14yB8. yB8bedeutet "Bifurkate 8 auf die Funktion y". y verdoppelt Zahlen, also gibt dies [8, 16]. Dann fügen wir 14 hinzu und geben die Liste an [14, 8, 16].

Als nächstes nehmen wir das kartesische Produkt mit der Eingabe und subtrahieren jedes Wertepaar.

Führen Sie als Nächstes die Maximierungsoperation aus, filtern Sie einfach nur nach positiven Werten und addieren Sie den Rest.

isaacg
quelle
4

Samau , 19 Bytes

Ich bin mir nicht sicher, ob die Frage nach dem letzten Commit meiner neuen Sprache veröffentlicht wurde. Sie sind beide vor 2 Stunden. Alle hier verwendeten Funktionen wurden jedoch zuvor hinzugefügt.

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

Samau verwendet CP737 als Standardzeichencodierung.

▐[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
quelle
0

PowerShell, 48 Bytes

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

(Ziemlich sicher, dass dies nicht optimal ist.)

Übernimmt Eingabebefehlszeilenargumente und leitet sie in eine Schleife weiter |%{...}. Bei jeder Iteration erhöhen wir unsere Summe $t+=um die aktuelle Zahl minus 8 $_-8plus das Ergebnis der Indizierung in eine Hash-Tabelle für die teureren Werte @{...}[$_]. Dann geben wir einfach $tam Ende aus.

AdmBorkBork
quelle
0

(🐂👍) Ox ++, 248 Bytes (62 Zeichen)

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

Sprache, an der ich arbeite. Fügen Sie hier den Code ein .

Geokavel
quelle
Mein Browser kann nur 7 dieser Zeichen anzeigen.
Isaacg