python - 数学公式的数据结构
问题描述
我正在研究一个 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)") 我非常不确定这种处理问题的方式是否是一个愚蠢的想法。我特此请您审查我的方法,如果可能的话,请指出我处理这种数据结构的更好方向。
解决方案
一个快速的想法:
首先,定义一些随机函数供以后使用。
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
应该以处理可变数量参数的方式编写。
推荐阅读
- linux - 创建将基于来自 webform 的值构建子域 (linux/whm/cpanel) 的脚本
- jquery - 循环遍历项目列表(跳过并继续计数)
- python - 实时运行多个带有参数的python脚本
- ios - Flutter (iOS):应用程序未列在 Fabric 仪表板中
- python - 如何通过 python-active-directory 模块中的 setup.py 运行单个鼻子测试?
- json - 快速访问 json 的内部信息
- c++ - 将 static_cast 转换为 int 时有关已删除布尔运算符的错误
- c# - 在四边形上应用 8x8 纹理的问题(非常模糊)
- ios - 统一的 UIViewController “成为最前沿”的检测?
- linux - 我们可以从 Cloudformation 中 EC2 实例的元数据中删除实例用户数据吗