Escribo un analizador rodante de dados personalizado (snicker si es necesario) en python. Básicamente, quiero utilizar la evaluación estándar de matemáticas además de añadir la 'd' del operador:Cómo evaluar una expresión matemática personalizada en Python
#xdy
sum = 0
for each in range(x):
sum += randInt(1, y)
return sum
Así que, por ejemplo, 1d6 + 2d6 + 2d6-72 + 4d100 = (5) + (1 + 1) + (6 + 2) -72+ (5 + 39 + 38 + 59) = 84
Estaba usando regex para reemplazar todos los 's con la suma y luego usar eval, pero mi expresión regular se vino abajo cuando se trata de paréntesis en cualquier lado. ¿Hay una forma más rápida de hacer esto que implementar mi propio análisis recursivo? Tal vez agregar un operador a eval?
Editar: Parece que he dado un mal ejemplo, ya que el ejemplo anterior funciona con mi versión actual. Lo que estoy buscando es una forma de evaluar, por ejemplo, (5+ (6d6)) d (7-2 * (1d4)).
Por "se vino abajo", solo quería decir que mi expresión actual de expresiones regulares falló. He sido demasiado vago sobre mi fracaso, lo siento por la confusión. Aquí está mi código actual:
def evalDice(roll_matchgroup):
roll_split = roll_matchgroup.group('roll').split('d')
print roll_split
roll_list = []
for die in range(int(roll_split[0])):
roll = random.randint(1,int(roll_split[1]))
roll_list.append(roll)
def EvalRoll(roll):
if not roll: return 0
rollPattern = re.compile('(?P<roll>\d*d\d+)')
roll_string = rollPattern.sub(evalDice, roll.lower())
para esto, "1d6 + 4d100" funciona muy bien, pero "(1d6 + 4) d100" o incluso "1d6 + 4d (100)" falla.
¿Puede mostrarnos qué ha intentado y cómo ha fallado? –
Terminó haciendo una función auxiliar recursiva. ¡Gracias por toda la ayuda! – taynaron