Costo de compra de puntos D&D

20

Al hacer un personaje de Dungeons & Dragons , una alternativa a los puntajes de habilidad rodante es asignarlos dentro de un presupuesto de poder llamado compra de puntos. Los puntajes de habilidad más altos cuestan más puntos, especialmente hacia el extremo superior: un puntaje de 8 es gratis, y aumentar un puntaje en 1 cuesta 1 punto, excepto que subir a 15 o 16 cuesta 2 puntos, y subir a 17 o 18 cuesta 3 puntos.

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

En forma de lista:

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

El costo de compra de puntos se suma para los seis puntajes de habilidad.

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

Dados seis puntajes de habilidad, cada uno de 8 a 18, genera el costo total de compra de puntos. Pocos bytes ganan.

xnor
fuente
2
¿Soy solo yo o falta el desafío? 0o
Zaibis
1
@Zaibis No estoy seguro de lo que quieres decir. Puse "la menor cantidad de bytes ganados", ¿querías decir eso?
xnor
tmp bla, bla, decir: sí
Zaibis

Respuestas:

11

JavaScript (ES7), 44 42 40 bytes

Tachado 44 sigue siendo regular 44 :(

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

¡Gracias a @apsillers por guardar 2 bytes!

Explicación

La parte interesante es -1-~((s-14)**1.3). (s-14)**1.3produce 1, 2, 4y 6para los valores 15 - 18. Cualquier número que sea menor que 15causa un error porque la implementación de JavaScript de exponencial no puede operar en valores negativos con un exponente fraccionario. Básicamente, cualquier valor de s < 15hace que regrese NaN, por lo que -1-~está allí para convertirlo en un número ( 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

Solución ES6 (42 bytes)

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

Prueba

Esta prueba utiliza Math.powen su lugar el operador exponencial ( **) para que pueda ejecutarse en cualquier navegador estándar.

usuario81655
fuente
Un byte más: usar en |tlugar de &&t. La operación ECMAScriptToInt32 siempre obligará al resultado de mapaquí a 0, porque las matrices de elementos múltiples siempre se ToNumberclasificarán como NaN. (Esto sería un problema si la especificación permitió arrays de un solo elemento como entrada, pero requiere 6 elementos.)
apsillers
@apsillers Ooh, ¡es un buen consejo! Gracias
user81655
8

CJam, 18 bytes

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

o

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

Pruébalo aquí.

Explicación

La idea es descomponer el costo en tres componentes:

 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

Los tres componentes pueden calcularse mediante una única resta y restringir el resultado a valores no negativos.

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

Pyth, 14 bytes

s>#0-M*Q+14yB8

Banco de pruebas

Utiliza los mismos medios fundamentales de cálculo que Martin Büttner, a saber:

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

Dicho esto, los medios de cálculo son muy diferentes. Para generar la lista de números para restar, utilizo la expresión +14yB8. yB8significa "Bifurcar 8 en la función y". y dobla los números, entonces esto da [8, 16]. Luego, agregamos 14, dando la lista [14, 8, 16].

Luego, tomamos el producto cartesiano con la entrada y restamos cada par de valores.

A continuación, realice la operación de maximización, simplemente filtramos solo los valores positivos y sumamos el resto.

isaacg
fuente
4

Samau , 19 bytes

No estoy seguro si la pregunta se publica después de la última confirmación de mi nuevo idioma. Ambos son hace 2 horas. Pero todas las características utilizadas aquí se agregaron antes de eso.

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

Samau utiliza CP737 como codificación de caracteres predeterminada.

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

PowerShell, 48 bytes

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

(Estoy bastante seguro de que esto no es óptimo).

Toma argumentos de línea de comandos de entrada y los canaliza en un bucle |%{...}. Cada iteración, incrementamos nuestro total $t+=con el número actual menos 8 $_-8más el resultado de indexar en una tabla hash para los valores más caros @{...}[$_]. Luego simplemente salimos $tal final.

AdmBorkBork
fuente
0

(🐂👍) Ox ++, 248 bytes (62 caracteres)

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

Idioma en el que estoy trabajando. Pega el código aquí .

geokavel
fuente
Mi navegador solo puede mostrar 7 de estos caracteres.
isaacg