如何解决数学公式的数据结构
我正在研究一个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,parens=False):
n1 = sign_num(a,b)
n2 = sign_num(a,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
的写法应能处理可变数量的参数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。