diff --git a/Makefile b/Makefile index bd04e35..9414a0b 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,11 @@ -FLAKE_FLAGS = --ignore=E501,F401,F403,F405 +IGNORE_ERRORS = E501,F401,F403,F405 +PKG = mathgenerator + +format: + python -m autopep8 --ignore=$(IGNORE_ERRORS) -i $(PKG)/* lint: - python -m flake8 $(FLAKE_FLAGS) + python -m flake8 --ignore=$(IGNORE_ERRORS) $(PKG) test: python -m pytest --verbose -s tests diff --git a/dev-requirements.txt b/dev-requirements.txt index 6e46af4..c29cf4e 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -1,3 +1,4 @@ pytest hypothesis -flake8 \ No newline at end of file +flake8 +autopep8 \ No newline at end of file diff --git a/makeReadme.py b/makeReadme.py index 7ca8f2c..64f7989 100644 --- a/makeReadme.py +++ b/makeReadme.py @@ -1,10 +1,10 @@ -#To use, paste at bottom of mathgen.py code, change line variable and remove all table rows in README.md except for the top 2 and run mathgen.py +# To use, paste at bottom of mathgen.py code, change line variable and remove all table rows in README.md except for the top 2 and run mathgen.py wList = getGenList() allRows = [] -f=open('mathgen.py') -lines=f.readlines() -line = 720 #This has to be changed depending on which line the first generator appears on +f = open('mathgen.py') +lines = f.readlines() +line = 720 # This has to be changed depending on which line the first generator appears on for item in wList: myGen = item[2] prob, sol = myGen() @@ -13,10 +13,10 @@ for item in wList: instName = lines[line] def_name = instName[:instName.find('=')].strip() row = [myGen.id, myGen.title, prob, sol, def_name] - line+=1 + line += 1 allRows.append(row) -g=open('../README.md', "a") +g = open('../README.md', "a") for row in allRows: tableLine = "| " + str(row[0]) + " | " + str(row[1]) + " | " + str(row[2]) + " | " + str(row[3]) + " | " + str(row[4]) + " |\n" g.write(tableLine) diff --git a/mathgenerator/mathgen.py b/mathgenerator/mathgen.py index 44218e6..6f37443 100644 --- a/mathgenerator/mathgen.py +++ b/mathgenerator/mathgen.py @@ -36,7 +36,8 @@ def getGenList(): def additionFunc(maxSum=99, maxAddend=50): a = random.randint(0, maxAddend) - b = random.randint(0, min((maxSum - a), maxAddend)) # The highest value of b will be no higher than the maxsum minus the first number and no higher than the maxAddend as well + # The highest value of b will be no higher than the maxsum minus the first number and no higher than the maxAddend as well + b = random.randint(0, min((maxSum - a), maxAddend)) c = a + b problem = str(a) + "+" + str(b) + "=" solution = str(c) @@ -78,7 +79,7 @@ def binaryComplement1sFunc(maxDigits=10): question += temp answer += "0" if temp == "1" else "1" - problem = question+"=" + problem = question + "=" solution = answer return problem, solution @@ -248,7 +249,8 @@ def areaOfTriangleFunc(maxA=20, maxB=20, maxC=20): c = random.randint(1, maxC) s = (a + b + c) / 2 area = (s * (s - a) * (s - b) * (s - c)) ** 0.5 - problem = "Area of triangle with side lengths: " + str(a) + " " + str(b) + " " + str(c) + " = " + problem = "Area of triangle with side lengths: " + \ + str(a) + " " + str(b) + " " + str(c) + " = " solution = area return problem, solution @@ -259,7 +261,8 @@ def isTriangleValidFunc(maxSideLength=50): sideC = random.randint(1, maxSideLength) sideSums = [sideA + sideB, sideB + sideC, sideC + sideA] sides = [sideC, sideA, sideB] - exists = True & (sides[0] < sideSums[0]) & (sides[1] < sideSums[1]) & (sides[2] < sideSums[2]) + exists = True & (sides[0] < sideSums[0]) & ( + sides[1] < sideSums[1]) & (sides[2] < sideSums[2]) problem = f"Does triangle with sides {sideA}, {sideB} and {sideC} exist?" if exists: solution = "Yes" @@ -352,7 +355,8 @@ def systemOfEquationsFunc(range_x=10, range_y=10, coeff_mult_range=10): # No redundant 1s y_coeff = abs(coeffs[1]) if abs(coeffs[1]) != 1 else '' # Don't include if 0, unless x is also 0 (probably never happens) - y_str = f'{y_coeff}y' if coeffs[1] != 0 else ('' if x_str != '' else '0') + y_str = f'{y_coeff}y' if coeffs[1] != 0 else ( + '' if x_str != '' else '0') return f'{x_str}{op}{y_str} = {coeffs[2]}' problem = f"{coeffToFuncString(new_c1)}, {coeffToFuncString(new_c2)}" @@ -391,7 +395,8 @@ def linearEquationsFunc(n=2, varRange=20, coeffRange=20): soln = [random.randint(-varRange, varRange) for i in range(n)] problem = list() - solution = ", ".join(["{} = {}".format(vars[i], soln[i]) for i in range(n)]) + solution = ", ".join(["{} = {}".format(vars[i], soln[i]) + for i in range(n)]) for _ in range(n): coeff = [random.randint(-coeffRange, coeffRange) for i in range(n)] res = sum([coeff[i] * soln[i] for i in range(n)]) @@ -469,7 +474,8 @@ def combinationsFunc(maxlength=20): b = random.randint(0, 9) solution = int(factorial(a) / (factorial(b) * factorial(a - b))) - problem = "Number of combinations from {} objects picked {} at a time ".format(a, b) + problem = "Number of combinations from {} objects picked {} at a time ".format( + a, b) return problem, solution @@ -615,8 +621,10 @@ def intersectionOfTwoLinesFunc( x = f"{x.numerator}/{x.denominator}" return x - m1 = (random.randint(minM, maxM), random.randint(minDenominator, maxDenominator)) - m2 = (random.randint(minM, maxM), random.randint(minDenominator, maxDenominator)) + m1 = (random.randint(minM, maxM), random.randint( + minDenominator, maxDenominator)) + m2 = (random.randint(minM, maxM), random.randint( + minDenominator, maxDenominator)) b1 = random.randint(minB, maxB) b2 = random.randint(minB, maxB) equation1 = generateEquationString(m1, b1) @@ -642,7 +650,8 @@ def permutationFunc(maxlength=20): a = random.randint(10, maxlength) b = random.randint(0, 9) solution = int(math.factorial(a) / (math.factorial(a - b))) - problem = "Number of Permutations from {} objects picked {} at a time = ".format(a, b) + problem = "Number of Permutations from {} objects picked {} at a time = ".format( + a, b) return problem, solution @@ -685,7 +694,8 @@ def simpleInterestFunc(maxPrinciple=10000, maxRate=10, maxTime=10): b = random.randint(1, maxRate) c = random.randint(1, maxTime) d = (a * b * c) / 100 - problem = "Simple interest for a principle amount of " + str(a) + " dollars, " + str(b) + "% rate of interest and for a time period of " + str(c) + " years is = " + problem = "Simple interest for a principle amount of " + str(a) + " dollars, " + str( + b) + "% rate of interest and for a time period of " + str(c) + " years is = " solution = round(d, 2) return problem, solution @@ -718,7 +728,8 @@ def matrixMultiplicationFunc(maxVal=100): for t in range(n): temp += a[r][t] * b[t][c] res[r].append(temp) - problem = f"Multiply \n{a_string}\n and \n\n{b_string}" # consider using a, b instead of a_string, b_string if the problem doesn't look right + # consider using a, b instead of a_string, b_string if the problem doesn't look right + problem = f"Multiply \n{a_string}\n and \n\n{b_string}" solution = matrixMultiplicationFuncHelper(res) return problem, solution @@ -754,7 +765,8 @@ def powerRuleIntegrationFunc(maxCoef=10, maxExp=10, maxTerms=5): coefficient = random.randint(1, maxCoef) exponent = random.randint(1, maxExp) problem += str(coefficient) + "x^" + str(exponent) - solution += "(" + str(coefficient) + "/" + str(exponent) + ")x^" + str(exponent + 1) + solution += "(" + str(coefficient) + "/" + \ + str(exponent) + ")x^" + str(exponent + 1) solution = solution + " + c" return problem, solution @@ -773,15 +785,18 @@ def fourthAngleOfQuadriFunc(maxAngle=180): def quadraticEquation(maxVal=100): a = random.randint(1, maxVal) c = random.randint(1, maxVal) - b = random.randint(round(math.sqrt(4 * a * c)) + 1, round(math.sqrt(4 * maxVal * maxVal))) + b = random.randint(round(math.sqrt(4 * a * c)) + 1, + round(math.sqrt(4 * maxVal * maxVal))) problem = "Zeros of the Quadratic Equation {}x^2+{}x+{}=0".format(a, b, c) D = math.sqrt(b * b - 4 * a * c) - solution = str([round((-b + D) / (2 * a), 2), round((-b - D) / (2 * a), 2)]) + solution = str([round((-b + D) / (2 * a), 2), + round((-b - D) / (2 * a), 2)]) return problem, solution + def hcfFunc(maxVal=20): a = random.randint(1, maxVal) b = random.randint(1, maxVal) @@ -792,61 +807,67 @@ def hcfFunc(maxVal=20): solution = str(x) return problem, solution + def DiceSumProbFunc(maxDice=3): - a = random.randint(1,maxDice) - b = random.randint(a,6*a) - count=0 - for i in [1,2,3,4,5,6]: - if a==1: - if i==b: - count=count+1 - elif a==2: - for j in [1,2,3,4,5,6]: - if i+j==b: - count=count+1 - elif a==3: - for j in [1,2,3,4,5,6]: - for k in [1,2,3,4,5,6]: - if i+j+k==b: - count=count+1 - problem = "If {} dice are rolled at the same time, the probability of getting a sum of {} =".format(a,b) - solution="{}/{}".format(count, 6**a) + a = random.randint(1, maxDice) + b = random.randint(a, 6 * a) + count = 0 + for i in [1, 2, 3, 4, 5, 6]: + if a == 1: + if i == b: + count = count + 1 + elif a == 2: + for j in [1, 2, 3, 4, 5, 6]: + if i + j == b: + count = count + 1 + elif a == 3: + for j in [1, 2, 3, 4, 5, 6]: + for k in [1, 2, 3, 4, 5, 6]: + if i + j + k == b: + count = count + 1 + problem = "If {} dice are rolled at the same time, the probability of getting a sum of {} =".format( + a, b) + solution = "{}/{}".format(count, 6**a) return problem, solution -def exponentiationFunc(maxBase = 20,maxExpo = 10): + +def exponentiationFunc(maxBase=20, maxExpo=10): base = random.randint(1, maxBase) expo = random.randint(1, maxExpo) problem = f"{base}^{expo} =" solution = str(base ** expo) return problem, solution + def confidenceIntervalFunc(): - n=random.randint(20,40) - j=random.randint(0,3) - lst=random.sample(range(200,300),n) - lst_per=[80 ,90, 95, 99] + n = random.randint(20, 40) + j = random.randint(0, 3) + lst = random.sample(range(200, 300), n) + lst_per = [80, 90, 95, 99] lst_t = [1.282, 1.645, 1.960, 2.576] - mean=0 - sd=0 + mean = 0 + sd = 0 for i in lst: - count= i + mean - mean=count - mean = mean/n + count = i + mean + mean = count + mean = mean / n for i in lst: - x=(i-mean)**2+sd - sd=x - sd=sd/n - standard_error = lst_t[j]*math.sqrt(sd/n) - problem= 'The confidence interval for sample {} with {}% confidence is'.format([x for x in lst], lst_per[j]) - solution= '({}, {})'.format(mean+standard_error, mean-standard_error) + x = (i - mean)**2 + sd + sd = x + sd = sd / n + standard_error = lst_t[j] * math.sqrt(sd / n) + problem = 'The confidence interval for sample {} with {}% confidence is'.format( + [x for x in lst], lst_per[j]) + solution = '({}, {})'.format(mean + standard_error, mean - standard_error) return problem, solution -def surdsComparisonFunc(maxValue = 100, maxRoot = 10): - radicand1,radicand2 = tuple(random.sample(range(1,maxValue),2)) - degree1, degree2 = tuple(random.sample(range(1,maxRoot),2)) + +def surdsComparisonFunc(maxValue=100, maxRoot=10): + radicand1, radicand2 = tuple(random.sample(range(1, maxValue), 2)) + degree1, degree2 = tuple(random.sample(range(1, maxRoot), 2)) problem = f"Fill in the blanks {radicand1}^(1/{degree1}) _ {radicand2}^(1/{degree2})" - first = math.pow(radicand1, 1/degree1) - second = math.pow(radicand2, 1/degree2) + first = math.pow(radicand1, 1 / degree1) + second = math.pow(radicand2, 1 / degree2) solution = "=" if first > second: solution = ">" @@ -854,135 +875,203 @@ def surdsComparisonFunc(maxValue = 100, maxRoot = 10): solution = "<" return problem, solution + def fibonacciSeriesFunc(minNo=1): - n = random.randint(minNo,20) + n = random.randint(minNo, 20) + def createFibList(n): - l=[] + fibList = [] for i in range(n): - if i<2: - l.append(i) + if i < 2: + fibList.append(i) else: - val = l[i-1]+l[i-2] - l.append(val) - return l - fibList=createFibList(n) - problem = "The Fibonacci Series of the first "+str(n)+" numbers is ?" + val = fibList[i - 1] + fibList[i - 2] + fibList.append(val) + return fibList + fibList = createFibList(n) + problem = "The Fibonacci Series of the first " + str(n) + " numbers is ?" solution = fibList - return problem,solution + return problem, solution -def basicTrigonometryFunc(angles=[0,30,45,60,90],functions=["sin","cos","tan"]): #Handles degrees in quadrant one - angle=random.choice(angles) - function=random.choice(functions) - problem=f"What is {function}({angle})?" - expression='math.'+function+'(math.radians(angle))' - result_fraction_map={0.0:"0",0.5:"1/2",0.71:"1/√2",0.87:"√3/2",1.0:"1",0.58:"1/√3",1.73:"√3"} +# Handles degrees in quadrant one +def basicTrigonometryFunc(angles=[0, 30, 45, 60, 90], functions=["sin", "cos", "tan"]): + angle = random.choice(angles) + function = random.choice(functions) - solution=result_fraction_map[round(eval(expression),2)] if round(eval(expression),2)<=99999 else "∞" #for handling the ∞ condition + problem = f"What is {function}({angle})?" + expression = 'math.' + function + '(math.radians(angle))' + result_fraction_map = {0.0: "0", 0.5: "1/2", 0.71: "1/√2", + 0.87: "√3/2", 1.0: "1", 0.58: "1/√3", 1.73: "√3"} - return problem,solution + solution = result_fraction_map[round(eval(expression), 2)] if round( + eval(expression), 2) <= 99999 else "∞" # for handling the ∞ condition -def sumOfAnglesOfPolygonFunc(maxSides = 12): + return problem, solution + + +def sumOfAnglesOfPolygonFunc(maxSides=12): side = random.randint(3, maxSides) sum = (side - 2) * 180 problem = f"Sum of angles of polygon with {side} sides = " solution = sum return problem, solution -def dataSummaryFunc(number_values=15,minval=5,maxval=50): - random_list=[] + +def dataSummaryFunc(number_values=15, minval=5, maxval=50): + random_list = [] for i in range(number_values): - n=random.randint(minval,maxval) + n = random.randint(minval, maxval) random_list.append(n) - a=sum(random_list) - mean=a/number_values - var=0 + a = sum(random_list) + mean = a / number_values + var = 0 for i in range(number_values): - var+=(random_list[i]-mean)**2 + var += (random_list[i] - mean)**2 print(random_list) print(mean) - print(var/number_values) - print((var/number_values)**0.5) - problem="Find the mean,standard deviation and variance for the data"+str(random_list) - solution="The Mean is {} , Standard Deviation is {}, Variance is {}".format(mean,var/number_values,(var/number_values)**0.5) - return problem,solution + print(var / number_values) + print((var / number_values)**0.5) + problem = "Find the mean,standard deviation and variance for the data" + \ + str(random_list) + solution = "The Mean is {} , Standard Deviation is {}, Variance is {}".format( + mean, var / number_values, (var / number_values)**0.5) + return problem, solution -def surfaceAreaSphere(maxSide = 20, unit = 'm'): + +def surfaceAreaSphere(maxSide=20, unit='m'): r = random.randint(1, maxSide) problem = f"Surface area of Sphere with radius = {r}{unit} is" ans = 4 * math.pi * r * r solution = f"{ans} {unit}^2" return problem, solution -def volumeSphereFunc(maxRadius = 100): - r=random.randint(1,maxRadius) - problem=f"Volume of sphere with radius {r} m = " - ans=(4*math.pi/3)*r*r*r + + +def volumeSphereFunc(maxRadius=100): + r = random.randint(1, maxRadius) + problem = f"Volume of sphere with radius {r} m = " + ans = (4 * math.pi / 3) * r * r * r solution = f"{ans} m^3" - return problem,solution + return problem, solution # || Class Instances + # Format is: #