Editar : no he jugado D&D antes, así que cuando hice esta pregunta por primera vez, no la investigué correctamente. Pido disculpas por esto, y estoy haciendo algunas ediciones que podrían invalidar las respuestas para permanecer lo más fiel posible a las reglas dnd 5e. Lo siento.
Un fanático de D&D de una pregunta reciente de Hot Network parece tener algunos problemas para determinar si los hechizos elegidos de un hechicero se alinean con las posibilidades, ¡y creo que deberíamos ayudar!
Introducción
(todo esto ya se describe en la pregunta mencionada anteriormente)
Un hechicero conoce dos hechizos de nivel 1 desde el principio (nivel 1): [1, 1]
Cada vez que un hechicero gana un nivel (excepto los niveles 12, 14, 16, 18, 19 y 20) aprende un nuevo hechizo (obligatorio).
Además, al subir de nivel, uno puede elegir (opcional) reemplazar uno de los hechizos por otro.
Los hechizos aprendidos y reemplazados deben ser un nivel de ranura de hechizo válido que sea la mitad del nivel de tu hechicero redondeado. Ver esta tabla:
Sorcerer level Highest spell level possible
1 1
2 1
3 2
4 2
5 3
6 3
7 4
8 4
9 5
10 5
11 6
12 6
13 7
14 7
15 8
16 8
17 9
18 9
19 9
20 9
Esto significa que en el nivel 3 se pueden tener niveles de hechizo [1, 1, 2, 2]
como este:
Level 1: [1, 1] (initial)
Level 2: [1, 1, 1 (new)]
Level 3: [1, 1, 2 (replaced), 2 (new)]
No es necesario elegir los hechizos de más alto nivel a los que tengas acceso.
Los niveles de hechizo [1, 1, 1, 1]
son perfectamente válidos para un nivel 3.
Por último, recuerda que reemplazar un hechizo es una opción opcional para cada nivel . Esto significa que algunos niveles podrían omitir el reemplazo, mientras que otros lo utilizan.
El reto
Haga un programa o función que tome un número entero (nivel) entre 1 y 20.
También debe tomar una serie de enteros (niveles de hechizo) con valores que van del 1 al 9 en cualquier orden (9 es el nivel máximo de hechizo).
La salida del programa debe ser un valor verdadero / falso que valide si los niveles de hechizo elegidos son válidos para un hechicero del nivel dado.
Casos de prueba
Level: 1
Spells: [1, 1]
Output: true
Level: 8
Spells: [1, 1, 2, 3, 3, 5]
Ouput: false
Reason: A level 8 can't ever have access to a level 5 spell.
Level: 5
Spells: [1, 1, 1, 2, 2, 2, 3]
Output: false
Reason: A level 5 can't have access to 7 spells
Level: 11
Spells: [3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6]
Output: false
Reason: Too many spell upgrades.
The highest valid selection for level 11 is
[3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6]
Este es el código de golf : ¡gana menos bytes!
fuente
[2,2,3,3]
no serían posibles ya que requiere más reemplazo del que tendría acceso un hechicero de ese nivel". ¿No es el hecho de que la lista es de longitud 4 en lugar de 5 una razón más fundamental aquí? (Supongo que[1,3,2,2,3]
es posible para un nivel 4 al pasar del nivel 3[1,1,2(replaced),2(new)]
a[1,3(replaced),2,2,3(new)]
?)Respuestas:
Java (JDK 10) , 191 bytes
Pruébalo en línea!
Explicaciones
Tabla 1: Distribución de hechizos maximizada para cada nivel de hechicero, utilizada a partir de la respuesta de Axoren en la pregunta vinculada .
Créditos
fuente
return l<1&java.util.Arrays.equals(m,new int[9]);
puede serz=0;for(int i:m)z+=i;return l+z==0;
en su lugar. O si los valores enm
nunca pueden ser negativos al final,==0
puede ser<1
.for(int i:m)l|=i;
es aún más inteligente! Buena esa.new int[]{5,6,6,6,7,7,7,8,8,8,9,9,9,9,9}
). Si los ingreso descendiendo (new int[]{9,9,9,9,9,8,8,8,7,7,7,6,6,6,5}
como está escrito en el requisito de ingreso que escribí debajo del golf), funciona. Agregué el caso de prueba para mostrar que realmente funciona.Python 3 , 98 bytes
Pruébalo en línea!
Sin golf:
editar: solución corregida para usar las reglas correctas de D&D
fuente
print(v(20, [6,6,6,6,7,7,7,8,8,8,9,9,9,9,9])) # False
imprime cierto. Debe imprimir falso.min(9,n-1)
única.Carbón , 51 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Toma los niveles de hechizo en orden ascendente como una cadena. Explicación:
Ingrese el nivel.
Realice la decodificación de longitud de ejecución en la cadena que
0544443335
resulta en la cadena11111222233334444555566677788899999
. Luego, esta cadena se corta comenzando en el nivel (1 indexado) y terminando en el nivel duplicado (si es menor que 12) o 6 + 1.5 *, redondeado hacia arriba, excepto para el nivel 19, que se redondea hacia abajo. A0
tiene el sufijo para garantizar que no haya demasiados hechizos.Compara los niveles de hechizo con la subcadena e imprime un
-
si ninguno de ellos es excesivo.fuente
11113
en el nivel4
que es el resultado de ninguna actualización opcional, tomando1
en el nivel 2,1
en el nivel 3 y3
en el nivel 4.JavaScript (ES6), 79 bytes
(level)(array)
Pruébalo en línea!
Código de prueba
A continuación hay un enlace a algún código de prueba que toma el nivel de hechicero como entrada y devuelve una matriz de niveles máximos de hechizos, utilizando la misma lógica que la función anterior.
Pruébalo en línea!
¿Cómo?
Tabla de referencia
Numero de hechizos
Niveles máximos de hechizos
fuente
Groovy , 155 bytes
Genera el mejor libro de hechizos posible, luego verifica que el libro de hechizos pasado al método no sea mejor.
Sin golf, con tipos implícitos hechos explícitos:
Pruébalo en línea!
fuente