我正在编写一个python脚本,该脚本通过pylatex为数学测试生成pdf。到目前为止,我使用的是
str(random.randint(8,32)) +' + ' + str(random.randint(8,121))并且类似于生成随机化分配。
我不想像上面那样硬编码所有东西,但我想使用数据库方法来存储可能的赋值。在这个方向上,我的想法是关系数据库
(student) --n (assignment_type)在每个学生都得到个性化作业的地方,例如Peter将得到以下类型的作业
( (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)")我不确定这种处理问题的方式是不是一个愚蠢的想法。我在此请求您审查我的方法,如果可能的话,请给我一个处理这种数据结构的更好的方向。
发布于 2020-10-19 21:49:51
一个简单的想法:
首先,定义几个随机函数以供以后使用。
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应该以一种处理可变数量的参数的方式编写。
https://stackoverflow.com/questions/64427308
复制相似问题