Calcule mi geometría sagrada [cerrado]

10

En el juego de rol de mesa llamado Pathfinder, hay una hazaña que los personajes pueden tomar llamada Sacred Geometry , que permite a un personaje que tiene mejorar sus hechizos a cambio de hacer algunas matemáticas: para usarla, el personaje tira un número de seis lados. dados iguales a sus rangos en una habilidad particular, consulta una tabla basada en su nivel de hechizo para determinar qué tres números primos son las "Constantes principales" para ese nivel de hechizo, luego calcula si es posible o no producir una de las Constantes principales realizando alguna combinación de suma, resta, multiplicación y división y agrupación entre paréntesis en todos los números obtenidos.

La tabla de Constantes Prime por Nivel de Hechizo es la siguiente:

+-------------+-----------------+
| Spell Level | Prime Constants |
+-------------+-----------------+
| 1st         | 3, 5, 7         |
| 2nd         | 11, 13, 17      |
| 3rd         | 19, 23, 29      |
| 4th         | 31, 37, 41      |
| 5th         | 43, 47, 53      |
| 6th         | 59, 61, 67      |
| 7th         | 71, 73, 79      |
| 8th         | 83, 89, 97      |
| 9th         | 101, 103, 107   |
+-------------+-----------------+

Entonces, por ejemplo, si un personaje tiene 5 rangos de habilidad y está lanzando un hechizo de 4to nivel, lanzaría cinco dados de seis lados y necesitaría poder calcular un valor de 31, 37 o 41. Si ellos sacó un 6, 6, 4, 3 y 1, entonces podrían producir un valor de 37 realizando el siguiente cálculo: (6 × 6) + (4 - 3) × 1 = 37, o podrían producir un valor de 41 haciendo ([6 + 6] × 3) + 4 + 1 = 41. Como resultado, su lanzamiento del hechizo tendría éxito.

Para este rompecabezas de programación, su trabajo es escribir una función con dos parámetros de entrada, Nivel de hechizo y Rangos de habilidad, tirar un número de dados de seis lados igual al parámetro de Rangos de habilidad, luego calcular si puede producir (al menos) uno de las constantes principales asociadas con el parámetro Nivel de hechizo, luego generan un valor booleano.

Las respuestas se clasificarían principalmente por la eficiencia de su algoritmo (estoy bastante seguro de que un algoritmo de fuerza bruta se escalaría muy rápidamente a medida que aumenta el parámetro Skill Ranks), y luego por el tamaño del código fuente enviado en bytes.

nick012000
fuente
No creo que Pathfinder requiera que el personaje tire los dados, sino el jugador , ¿verdad?
mbomb007
3
Además, ¿cómo piensa clasificar la eficiencia del algoritmo que alguien usa?
mbomb007
Solo por curiosidad, ¿por qué el programa funciona para usted? ¿No sería más útil si proporcionaras los resultados de la tirada en lugar del rango de habilidad (sin mencionar que es más fácil de probar) ...?
Triggernometry
1
@ mbomb007 Siempre hay un xkcd relevante.
Khuldraeseth na'Barya
3
Por defecto, la aleatoriedad no tiene que ser justa, pero sí debe abarcar todas las posibilidades. Sin embargo, en este caso, los pasos adicionales en el medio no son observables, por lo que, básicamente, una presentación solo tendría que emitir aleatoriamente verdadero o falso. Sería mejor si las respuestas tomaran los valores de los dados como entrada en su lugar
Jo King

Respuestas:

1

Python 2.7, 285 bytes

from itertools import*
from random import*
def f(s,r):
 p=[];n=1;k=1;P=1;d=choices('123456',k=r);D=permutations(d,r);O=product('+-*/',repeat=r-1)
 while-~s*3>n:p+=P%k*[k];n,k,P=n+P%k,k+1,P*k*k
 return any(n in{eval('int(%s)'%'%s'.join(i)%o)for i in D for o in O}for n in p[-4:-1])

Técnicamente se ajusta a las especificaciones del desafío. Solo devuelve Verdadero / Falso, no expone las tiradas de dados utilizadas o la expresión utilizada para la persona que llama.

Además, este algoritmo ignora la agrupación, ya que podemos realizar las mismas operaciones sin agrupar utilizando en su lugar la ordenación. (Esto no sería cierto si la exponenciación fuera una de las posibles operaciones, por ejemplo).

Tiempo de ejecución exponencial, ya que genera todas las posibilidades y luego comprueba si existe al menos una solución.

Triggernometry
fuente