微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

数学公式的数据结构

如何解决数学公式的数据结构

我正在研究一个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 举报,一经查实,本站将立刻删除。