首页 > 解决方案 > 数学公式的数据结构

问题描述

我正在研究一个 python 脚本,它通过 pylatex 为数学测试生成 pdf。到目前为止,我正在使用

str(random.randint(8,32)) +' + ' + str(random.randint(8,121))

和类似的生成随机分配。

我不想像上面那样对所有内容进行硬编码,但我想使用数据库方法来存储可能的分配。我在这个方向上的想法是关系数据库

(student) --n (assignment_type)

每个学生都得到个性化的作业,例如彼得将得到类型的作业

( (random sign) (random number 2-8) x (+ or -) (random sign) (random number))    (*)

( (random number 2323-9999):11)

我不确定如何将此数据结构保存在数据库中以及如何将其转换为 python 代码。我的想法是针对数据库表'assignment_type':

INT number of randomized vars
INT number of signs
ARRAY List of signs
ARRAY (lower und upper bound for each random number)
STRING '(s1r1s2r1)'

其中 '(s1r1s2(s3r1))' 将在 python 中转换为上述问题 (*) ("( sign1 random1 sign2 (sign3)random2)") 我非常不确定这种处理问题的方式是否是一个愚蠢的想法。我特此请您审查我的方法,如果可能的话,请指出我处理这种数据结构的更好方向。

标签: pythonmathpylatex

解决方案


一个快速的想法:

首先,定义一些随机函数供以后使用。

import random

def sign_num(a, b):
  n = random.randint(a, b)
  if random.random() < 0.5:
    return '(-{})'.format(n)
  else:
    return str(n)

def num(a, b):
  return str(random.randint(a,b))

def add(a, b, parens=False):
  n1 = num(a, b)
  n2 = num(a, b)
  if parens:
    return '({} + {})'.format(n1, n2)
  else:
    return '{} + {}'.format(n1, n2)

def sign_add(a, b, parens=False):
  n1 = sign_num(a, b)
  n2 = sign_num(a, b)
  if parens:
    return '({} + {})'.format(n1, n2)
  else:
    return '{} + {}'.format(n1, n2)

然后,dict参考所有这些函数:

dico = {'NUM': num, 'SIGNNUM': sign_num, 'ADD': add, 'SIGN_ADD': sign_add}

然后,编写您的解析函数:

def fill_in(txt):
  argv = txt.strip().split()
  return dico[argv[0]](int(argv[1]), int(argv[2]))

def parse(txt):
  if '[' not in txt:
    return txt
  else:
    i = txt.index('[')
    j = txt.index(']')
    return txt[:i] + fill_in(txt[i+1:j])  + parse(txt[j+1:])

现在您可以在模板字符串上调用它们:

parse('[NUM 3 9] x ([ADD 2 9])')
# '8 x (8 + 7)'

有很大的改进空间。特别是,函数fill_in应该以处理可变数量参数的方式编写。


推荐阅读