From 08fc9d0663e90b96ee9d7cb7451aa3ee5c212576 Mon Sep 17 00:00:00 2001 From: YuvalG Date: Sat, 17 Oct 2020 20:05:47 +0300 Subject: [PATCH 1/4] Add flake8 as linter --- .github/workflows/tests.yaml | 44 +- Makefile | 9 +- dev-requirements.txt | 5 +- .../__pycache__/__init__.cpython-37.pyc | Bin 164 -> 0 bytes .../__pycache__/mathgen.cpython-37.pyc | Bin 19103 -> 0 bytes mathgenerator/mathgen.py | 500 ++++++++++-------- tests/test_mathgen.py | 92 ++-- 7 files changed, 358 insertions(+), 292 deletions(-) delete mode 100644 mathgenerator/__pycache__/__init__.cpython-37.pyc delete mode 100644 mathgenerator/__pycache__/mathgen.cpython-37.pyc diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 3252576..cc6cf9d 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -1,21 +1,23 @@ -name: Run tests - -on: [push, pull_request] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: '3.x' - - name: Install dependencies - run: | - python -m pip install -U pip - python -m pip install -r dev-requirements.txt - - name: Test - run: make test +name: Run tests + +on: [push, pull_request] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.x' + - name: Install dependencies + run: | + python -m pip install -U pip + python -m pip install -r dev-requirements.txt + - name: Linter + run: make lint + - name: Test + run: make test diff --git a/Makefile b/Makefile index dbf1f17..bd04e35 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,7 @@ -test: - python -m pytest --verbose -s tests +FLAKE_FLAGS = --ignore=E501,F401,F403,F405 + +lint: + python -m flake8 $(FLAKE_FLAGS) + +test: + python -m pytest --verbose -s tests diff --git a/dev-requirements.txt b/dev-requirements.txt index a965899..6e46af4 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -1,2 +1,3 @@ -pytest -hypothesis \ No newline at end of file +pytest +hypothesis +flake8 \ No newline at end of file diff --git a/mathgenerator/__pycache__/__init__.cpython-37.pyc b/mathgenerator/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 893336fc37f23c5d8be2b5e049b532e5ed6e2ea6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164 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 diff --git a/mathgenerator/mathgen.py b/mathgenerator/mathgen.py index 7bf36d8..b8d9033 100644 --- a/mathgenerator/mathgen.py +++ b/mathgenerator/mathgen.py @@ -4,6 +4,7 @@ import fractions genList = [] + # || Generator class class Generator: def __init__(self, title, id, generalProb, generalSol, func): @@ -20,52 +21,59 @@ class Generator: def __call__(self, **kwargs): return self.func(**kwargs) + # || Non-generator Functions def genById(id): generator = genList[id][2] return(generator()) + def getGenList(): return(genList) # || Generator Functions -def additionFunc(maxSum = 99, maxAddend = 50): + +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 - c = a+b + 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 + c = a + b problem = str(a) + "+" + str(b) + "=" solution = str(c) return problem, solution -def subtractionFunc(maxMinuend = 99, maxDiff = 99): + +def subtractionFunc(maxMinuend=99, maxDiff=99): a = random.randint(0, maxMinuend) - b = random.randint(max(0, (a-maxDiff)), a) - c = a-b + b = random.randint(max(0, (a - maxDiff)), a) + c = a - b problem = str(a) + "-" + str(b) + "=" solution = str(c) return problem, solution -def multiplicationFunc(maxRes = 99, maxMulti = 99): + +def multiplicationFunc(maxRes=99, maxMulti=99): a = random.randint(0, maxMulti) - b = random.randint(0, min(int(maxMulti/a), maxRes)) - c = a*b + b = random.randint(0, min(int(maxMulti / a), maxRes)) + c = a * b problem = str(a) + "*" + str(b) + "=" solution = str(c) return problem, solution -def divisionFunc(maxRes = 99, maxDivid = 99): + +def divisionFunc(maxRes=99, maxDivid=99): a = random.randint(0, maxDivid) b = random.randint(0, min(maxRes, maxDivid)) - c = a/b + c = a / b problem = str(a) + "/" + str(b) + "=" solution = str(c) return problem, solution -def binaryComplement1sFunc(maxDigits = 10): + +def binaryComplement1sFunc(maxDigits=10): question = '' answer = '' - for i in range(random.randint(1,maxDigits)): + for i in range(random.randint(1, maxDigits)): temp = str(random.randint(0, 1)) question += temp answer += "0" if temp == "1" else "1" @@ -74,22 +82,25 @@ def binaryComplement1sFunc(maxDigits = 10): solution = answer return problem, solution -def moduloFunc(maxRes = 99, maxModulo= 99): + +def moduloFunc(maxRes=99, maxModulo=99): a = random.randint(0, maxModulo) b = random.randint(0, min(maxRes, maxModulo)) - c = a%b + c = a % b problem = str(a) + "%" + str(b) + "=" solution = str(c) return problem, solution -def squareRootFunc(minNo = 1, maxNo = 12): + +def squareRootFunc(minNo=1, maxNo=12): b = random.randint(minNo, maxNo) - a = b*b + a = b * b problem = "sqrt(" + str(a) + ")=" solution = str(b) return problem, solution -def powerRuleDifferentiationFunc(maxCoef = 10, maxExp = 10, maxTerms = 5): + +def powerRuleDifferentiationFunc(maxCoef=10, maxExp=10, maxTerms=5): numTerms = random.randint(1, maxTerms) problem = "" solution = "" @@ -103,23 +114,26 @@ def powerRuleDifferentiationFunc(maxCoef = 10, maxExp = 10, maxTerms = 5): solution += str(coefficient * exponent) + "x^" + str(exponent - 1) return problem, solution -def squareFunc(maxSquareNum = 20): + +def squareFunc(maxSquareNum=20): a = random.randint(1, maxSquareNum) b = a * a problem = str(a) + "^2" + "=" solution = str(b) return problem, solution + def gcdFunc(maxVal=20): a = random.randint(1, maxVal) b = random.randint(1, maxVal) x, y = a, b while(y): - x, y = y, x % y + x, y = y, x % y problem = f"GCD of {a} and {b} = " solution = str(x) return problem, solution + def lcmFunc(maxVal=20): a = random.randint(1, maxVal) b = random.randint(1, maxVal) @@ -132,11 +146,13 @@ def lcmFunc(maxVal=20): solution = str(d) return problem, solution -def basicAlgebraFunc(maxVariable = 10): + +def basicAlgebraFunc(maxVariable=10): a = random.randint(1, maxVariable) b = random.randint(1, maxVariable) c = random.randint(b, maxVariable) # calculate gcd + def calculate_gcd(x, y): while(y): x, y = y, x % y @@ -145,44 +161,49 @@ def basicAlgebraFunc(maxVariable = 10): x = f"{(c - b)//i}/{a//i}" if (c - b == 0): x = "0" - elif a == 1 or a == i : + elif a == 1 or a == i: x = f"{c - b}" problem = f"{a}x + {b} = {c}" solution = x return problem, solution + def logFunc(maxBase=3, maxVal=8): a = random.randint(1, maxVal) b = random.randint(2, maxBase) - c = pow(b,a) - problem = "log"+str(b)+"("+str(c)+")" + c = pow(b, a) + problem = "log" + str(b) + "(" + str(c) + ")" solution = str(a) return problem, solution + def divisionToIntFunc(maxA=25, maxB=25): - a = random.randint(1,maxA) - b = random.randint(1,maxB) - divisor = a*b - dividend=random.choice([a,b]) + a = random.randint(1, maxA) + b = random.randint(1, maxB) + divisor = a * b + dividend = random.choice([a, b]) problem = f"{divisor}/{dividend} = " - solution=int(divisor/dividend) - return problem,solution + solution = int(divisor / dividend) + return problem, solution + def DecimalToBinaryFunc(max_dec=99): a = random.randint(1, max_dec) b = bin(a).replace("0b", "") - problem = "Binary of "+str(a)+"=" + problem = "Binary of " + str(a) + "=" solution = str(b) return problem, solution -def BinaryToDecimalFunc(max_dig=10): - problem='' - for i in range(random.randint(1,max_dig)): - temp = str(random.randint(0, 1)) - problem += temp - solution=int(problem, 2); - return problem, solution +def BinaryToDecimalFunc(max_dig=10): + problem = '' + for i in range(random.randint(1, max_dig)): + temp = str(random.randint(0, 1)) + problem += temp + + solution = int(problem, 2) + return problem, solution + def divideFractionsFunc(maxVal=10): a = random.randint(1, maxVal) @@ -193,6 +214,7 @@ def divideFractionsFunc(maxVal=10): d = random.randint(1, maxVal) while (c == d): d = random.randint(1, maxVal) + def calculate_gcd(x, y): while(y): x, y = y, x % y @@ -208,33 +230,36 @@ def divideFractionsFunc(maxVal=10): solution = x return problem, solution -def multiplyIntToMatrix22(maxMatrixVal = 10, maxRes = 100): + +def multiplyIntToMatrix22(maxMatrixVal=10, maxRes=100): a = random.randint(0, maxMatrixVal) b = random.randint(0, maxMatrixVal) c = random.randint(0, maxMatrixVal) d = random.randint(0, maxMatrixVal) - constant = random.randint(0, int(maxRes/max(a,b,c,d))) + constant = random.randint(0, int(maxRes / max(a, b, c, d))) problem = f"{constant} * [[{a}, {b}], [{c}, {d}]] = " solution = f"[[{a*constant},{b*constant}],[{c*constant},{d*constant}]]" return problem, solution -def areaOfTriangleFunc(maxA=20, maxB=20, maxC=20): - a = random.randint(1, maxA) - b = random.randint(1, maxB) - 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) + " = " - solution = area - return problem, solution -def isTriangleValidFunc(maxSideLength = 50): +def areaOfTriangleFunc(maxA=20, maxB=20, maxC=20): + a = random.randint(1, maxA) + b = random.randint(1, maxB) + 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) + " = " + solution = area + return problem, solution + + +def isTriangleValidFunc(maxSideLength=50): sideA = random.randint(1, maxSideLength) sideB = random.randint(1, maxSideLength) 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" @@ -242,51 +267,56 @@ def isTriangleValidFunc(maxSideLength = 50): solution = "No" return problem, solution + def MidPointOfTwoPointFunc(maxValue=20): - x1=random.randint(-20,maxValue) - y1=random.randint(-20,maxValue) - x2=random.randint(-20,maxValue) - y2=random.randint(-20,maxValue) - problem=f"({x1},{y1}),({x2},{y2})=" - solution=f"({(x1+x2)/2},{(y1+y2)/2})" - return problem,solution + x1 = random.randint(-20, maxValue) + y1 = random.randint(-20, maxValue) + x2 = random.randint(-20, maxValue) + y2 = random.randint(-20, maxValue) + problem = f"({x1},{y1}),({x2},{y2})=" + solution = f"({(x1+x2)/2},{(y1+y2)/2})" + return problem, solution -def factoringFunc(range_x1 = 10, range_x2 = 10): - x1 = random.randint(-range_x1, range_x1) - x2 = random.randint(-range_x2, range_x2) - def intParser(z): - if (z == 0): - return "" - if (z > 0): - return "+" + str(z) - if (z < 0): - return "-" + str(abs(z)) - b = intParser(x1 + x2) - c = intParser(x1 * x2) +def factoringFunc(range_x1=10, range_x2=10): + x1 = random.randint(-range_x1, range_x1) + x2 = random.randint(-range_x2, range_x2) + + def intParser(z): + if (z == 0): + return "" + if (z > 0): + return "+" + str(z) + if (z < 0): + return "-" + str(abs(z)) + + b = intParser(x1 + x2) + c = intParser(x1 * x2) + + if (b == "+1"): + b = "+" + + if (b == ""): + problem = f"x^2{c}" + else: + problem = f"x^2{b}x{c}" + + x1 = intParser(x1) + x2 = intParser(x2) + solution = f"(x{x1})(x{x2})" + return problem, solution - if (b == "+1"): - b = "+" - - if (b == ""): - problem = f"x^2{c}" - else: - problem = f"x^2{b}x{c}" - x1 = intParser(x1) - x2 = intParser(x2) - solution = f"(x{x1})(x{x2})" - return problem, solution - def thirdAngleOfTriangleFunc(maxAngle=89): - angle1 = random.randint(1, maxAngle) - angle2 = random.randint(1, maxAngle) - angle3 = 180 - (angle1 + angle2) - problem = f"Third angle of triangle with angles {angle1} and {angle2} = " - solution = angle3 - return problem, solution + angle1 = random.randint(1, maxAngle) + angle2 = random.randint(1, maxAngle) + angle3 = 180 - (angle1 + angle2) + problem = f"Third angle of triangle with angles {angle1} and {angle2} = " + solution = angle3 + return problem, solution -def systemOfEquationsFunc(range_x = 10, range_y = 10, coeff_mult_range=10): + +def systemOfEquationsFunc(range_x=10, range_y=10, coeff_mult_range=10): # Generate solution point first x = random.randint(-range_x, range_x) y = random.randint(-range_y, range_y) @@ -331,17 +361,19 @@ def systemOfEquationsFunc(range_x = 10, range_y = 10, coeff_mult_range=10): # Add random (non-zero) multiple of equations to each other -def distanceTwoPointsFunc(maxValXY = 20, minValXY=-20): - point1X = random.randint(minValXY, maxValXY+1) - point1Y = random.randint(minValXY, maxValXY+1) - point2X = random.randint(minValXY, maxValXY+1) - point2Y = random.randint(minValXY, maxValXY+1) + +def distanceTwoPointsFunc(maxValXY=20, minValXY=-20): + point1X = random.randint(minValXY, maxValXY + 1) + point1Y = random.randint(minValXY, maxValXY + 1) + point2X = random.randint(minValXY, maxValXY + 1) + point2Y = random.randint(minValXY, maxValXY + 1) distanceSq = (point1X - point2X) ** 2 + (point1Y - point2Y) ** 2 solution = f"sqrt({distanceSq})" problem = f"Find the distance between ({point1X}, {point1Y}) and ({point2X}, {point2Y})" return problem, solution -def pythagoreanTheoremFunc(maxLength = 20): + +def pythagoreanTheoremFunc(maxLength=20): a = random.randint(1, maxLength) b = random.randint(1, maxLength) c = (a**2 + b**2)**0.5 @@ -349,29 +381,31 @@ def pythagoreanTheoremFunc(maxLength = 20): solution = f"{c:.0f}" if c.is_integer() else f"{c:.2f}" return problem, solution -def linearEquationsFunc(n = 2, varRange = 20, coeffRange = 20): + +def linearEquationsFunc(n=2, varRange=20, coeffRange=20): if n > 10: print("[!] n cannot be greater than 10") return None, None vars = ['x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g'][:n] - soln = [ random.randint(-varRange, varRange) for i in range(n) ] + soln = [random.randint(-varRange, varRange) for i in range(n)] problem = list() 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)]) - + coeff = [random.randint(-coeffRange, coeffRange) for i in range(n)] + res = sum([coeff[i] * soln[i] for i in range(n)]) + prob = ["{}{}".format(coeff[i], vars[i]) if coeff[i] != 0 else "" for i in range(n)] while "" in prob: prob.remove("") prob = " + ".join(prob) + " = " + str(res) problem.append(prob) - + problem = "\n".join(problem) return problem, solution + def primeFactorsFunc(minVal=1, maxVal=200): a = random.randint(minVal, maxVal) n = a @@ -389,6 +423,7 @@ def primeFactorsFunc(minVal=1, maxVal=200): solution = f"{factors}" return problem, solution + def multiplyFractionsFunc(maxVal=10): a = random.randint(1, maxVal) b = random.randint(1, maxVal) @@ -398,6 +433,7 @@ def multiplyFractionsFunc(maxVal=10): b = random.randint(1, maxVal) while (c == d): d = random.randint(1, maxVal) + def calculate_gcd(x, y): while(y): x, y = y, x % y @@ -412,32 +448,33 @@ def multiplyFractionsFunc(maxVal=10): solution = x return problem, solution -def regularPolygonAngleFunc(minVal = 3,maxVal = 20): + +def regularPolygonAngleFunc(minVal=3, maxVal=20): sideNum = random.randint(minVal, maxVal) problem = f"Find the angle of a regular polygon with {sideNum} sides" - exteriorAngle = round((360/sideNum),2) + exteriorAngle = round((360 / sideNum), 2) solution = 180 - exteriorAngle - return problem, solution - + return problem, solution + + def combinationsFunc(maxlength=20): def factorial(a): - d=1 + d = 1 for i in range(a): - a=(i+1)*d - d=a + a = (i + 1) * d + d = a return d - a= random.randint(10,maxlength) - b=random.randint(0,9) + a = random.randint(10, maxlength) + 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) - - solution= int(factorial(a)/(factorial(b)*factorial(a-b))) - problem= "Number of combinations from {} objects picked {} at a time ".format(a,b) - return problem, solution - -def factorialFunc(maxInput = 6): + + +def factorialFunc(maxInput=6): a = random.randint(0, maxInput) n = a problem = str(a) + "! = " @@ -452,31 +489,35 @@ def factorialFunc(maxInput = 6): solution = str(b) return problem, solution -def surfaceAreaCube(maxSide = 20, unit = 'm'): + +def surfaceAreaCube(maxSide=20, unit='m'): a = random.randint(1, maxSide) problem = f"Surface area of cube with side = {a}{unit} is" ans = 6 * a * a solution = f"{ans} {unit}^2" return problem, solution -def volumeCube(maxSide = 20, unit = 'm'): + +def volumeCube(maxSide=20, unit='m'): a = random.randint(1, maxSide) problem = f"Volume of cube with side = {a}{unit} is" ans = a * a * a solution = f"{ans} {unit}^3" return problem, solution -def surfaceAreaCuboid(maxSide = 20, unit = 'm'): + +def surfaceAreaCuboid(maxSide=20, unit='m'): a = random.randint(1, maxSide) b = random.randint(1, maxSide) c = random.randint(1, maxSide) - + problem = f"Surface area of cuboid with sides = {a}{unit}, {b}{unit}, {c}{unit} is" - ans = 2 * (a*b + b*c + c*a) + ans = 2 * (a * b + b * c + c * a) solution = f"{ans} {unit}^2" return problem, solution -def volumeCuboid(maxSide = 20, unit = 'm'): + +def volumeCuboid(maxSide=20, unit='m'): a = random.randint(1, maxSide) b = random.randint(1, maxSide) c = random.randint(1, maxSide) @@ -485,7 +526,8 @@ def volumeCuboid(maxSide = 20, unit = 'm'): solution = f"{ans} {unit}^3" return problem, solution -def surfaceAreaCylinder(maxRadius = 20, maxHeight = 50,unit = 'm'): + +def surfaceAreaCylinder(maxRadius=20, maxHeight=50, unit='m'): a = random.randint(1, maxHeight) b = random.randint(1, maxRadius) problem = f"Surface area of cylinder with height = {a}{unit} and radius = {b}{unit} is" @@ -493,7 +535,8 @@ def surfaceAreaCylinder(maxRadius = 20, maxHeight = 50,unit = 'm'): solution = f"{ans} {unit}^2" return problem, solution -def volumeCylinder(maxRadius = 20, maxHeight = 50, unit = 'm'): + +def volumeCylinder(maxRadius=20, maxHeight=50, unit='m'): a = random.randint(1, maxHeight) b = random.randint(1, maxRadius) problem = f"Volume of cylinder with height = {a}{unit} and radius = {b}{unit} is" @@ -501,7 +544,8 @@ def volumeCylinder(maxRadius = 20, maxHeight = 50, unit = 'm'): solution = f"{ans} {unit}^3" return problem, solution -def surfaceAreaCone(maxRadius = 20, maxHeight = 50,unit = 'm'): + +def surfaceAreaCone(maxRadius=20, maxHeight=50, unit='m'): a = random.randint(1, maxHeight) b = random.randint(1, maxRadius) slopingHeight = math.sqrt(a**2 + b**2) @@ -510,14 +554,16 @@ def surfaceAreaCone(maxRadius = 20, maxHeight = 50,unit = 'm'): solution = f"{ans} {unit}^2" return problem, solution -def volumeCone(maxRadius = 20, maxHeight = 50, unit = 'm'): + +def volumeCone(maxRadius=20, maxHeight=50, unit='m'): a = random.randint(1, maxHeight) b = random.randint(1, maxRadius) problem = f"Volume of cone with height = {a}{unit} and radius = {b}{unit} is" - ans = int(math.pi * b * b * a * (1/3)) + ans = int(math.pi * b * b * a * (1 / 3)) solution = f"{ans} {unit}^3" return problem, solution + def commonFactorsFunc(maxVal=100): a = random.randint(1, maxVal) b = random.randint(1, maxVal) @@ -537,6 +583,7 @@ def commonFactorsFunc(maxVal=100): solution = arr return problem, solution + def intersectionOfTwoLinesFunc( minM=-10, maxM=10, minB=-10, maxB=10, minDenominator=1, maxDenominator=6 ): @@ -567,7 +614,7 @@ def intersectionOfTwoLinesFunc( else: 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)) b1 = random.randint(minB, maxB) @@ -590,21 +637,24 @@ def intersectionOfTwoLinesFunc( solution = f"({fractionToString(intersection_x)}, {fractionToString(intersection_y)})" return problem, solution + 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) + 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) return problem, solution + def vectorCrossFunc(minVal=-20, maxVal=20): a = [random.randint(minVal, maxVal) for i in range(3)] b = [random.randint(minVal, maxVal) for i in range(3)] - c = [a[1]*b[2] - a[2]*b[1], - a[2]*b[0] - a[0]*b[2], - a[0]*b[1] - a[1]*b[0]] + c = [a[1] * b[2] - a[2] * b[1], + a[2] * b[0] - a[0] * b[2], + a[0] * b[1] - a[1] * b[0]] return str(a) + " X " + str(b) + " = ", str(c) + def compareFractionsFunc(maxVal=10): a = random.randint(1, maxVal) b = random.randint(1, maxVal) @@ -616,79 +666,84 @@ def compareFractionsFunc(maxVal=10): while (c == d): d = random.randint(1, maxVal) - first=a/b - second=c/d + first = a / b + second = c / d - if(first>second): - solution=">" - elif(first second): + solution = ">" + elif(first < second): + solution = "<" else: - solution="=" - - problem = f"Which symbol represents the comparison between {a}/{b} and {c}/{d}?" - return problem,solution + solution = "=" + + problem = f"Which symbol represents the comparison between {a}/{b} and {c}/{d}?" + return problem, solution + + +def simpleInterestFunc(maxPrinciple=10000, maxRate=10, maxTime=10): + a = random.randint(1000, maxPrinciple) + 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 = " + solution = round(d, 2) + return problem, solution -def simpleInterestFunc(maxPrinciple = 10000, maxRate = 10, maxTime = 10): - a = random.randint(1000, maxPrinciple) - 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 = " - solution = round(d, 2) - return problem, solution def matrixMultiplicationFunc(maxVal=100): - m= random.randint(2, 10) - n= random.randint(2, 10) - k= random.randint(2, 10) - #generate matrices a and b - a=[] + m = random.randint(2, 10) + n = random.randint(2, 10) + k = random.randint(2, 10) + # generate matrices a and b + a = [] for r in range(m): a.append([]) for c in range(n): - a[r].append(random.randint(-maxVal,maxVal)) - - b=[] + a[r].append(random.randint(-maxVal, maxVal)) + + b = [] for r in range(n): b.append([]) for c in range(k): b[r].append(random.randint(-maxVal, maxVal)) - res= [] - a_string= matrixMultiplicationFuncHelper(a) - b_string= matrixMultiplicationFuncHelper(b) + res = [] + a_string = matrixMultiplicationFuncHelper(a) + b_string = matrixMultiplicationFuncHelper(b) for r in range(m): res.append([]) for c in range(k): - temp= 0 + temp = 0 for t in range(n): - temp+=a[r][t]*b[t][c] + 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 - solution= matrixMultiplicationFuncHelper(res) + 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 + solution = matrixMultiplicationFuncHelper(res) return problem, solution + def matrixMultiplicationFuncHelper(inp): - m= len(inp) - n= len(inp[0]) - string= "" + m = len(inp) + n = len(inp[0]) + string = "" for i in range(m): for j in range(n): - string+=f"{inp[i][j]: 6d}" - string+=" " - string+="\n" + string += f"{inp[i][j]: 6d}" + string += " " + string += "\n" return string -def cubeRootFunc(minNo = 1, maxNo = 1000): + +def cubeRootFunc(minNo=1, maxNo=1000): b = random.randint(minNo, maxNo) - a = b**(1/3) + a = b**(1 / 3) problem = "cuberoot of " + str(b) + " upto 2 decimal places is:" - solution = str(round(a,2)) + solution = str(round(a, 2)) return problem, solution -def powerRuleIntegrationFunc(maxCoef = 10, maxExp = 10, maxTerms = 5): + +def powerRuleIntegrationFunc(maxCoef=10, maxExp=10, maxTerms=5): numTerms = random.randint(1, maxTerms) problem = "" solution = "" @@ -699,32 +754,33 @@ 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 - -def fourthAngleOfQuadriFunc(maxAngle = 180): + +def fourthAngleOfQuadriFunc(maxAngle=180): angle1 = random.randint(1, maxAngle) - angle2 = random.randint(1, 240-angle1) - angle3 = random.randint(1, 340-(angle1 + angle2)) + angle2 = random.randint(1, 240 - angle1) + angle3 = random.randint(1, 340 - (angle1 + angle2)) sum_ = angle1 + angle2 + angle3 angle4 = 360 - sum_ problem = f"Fourth angle of quadrilateral with angles {angle1} , {angle2}, {angle3} =" solution = angle4 return problem, solution - -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))) - - 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)]) - return problem,solution + +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))) + + 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)]) + return problem, solution def hcfFunc(maxVal=20): @@ -732,15 +788,17 @@ def hcfFunc(maxVal=20): b = random.randint(1, maxVal) x, y = a, b while(y): - x, y = y, x % y + x, y = y, x % y problem = f"HCF of {a} and {b} = " solution = str(x) return problem, solution # || Class Instances -#Format is: -# = Generator("<Title>", <id>, <generalized problem>, <generalized solution>, <function name>) +# Format is: +# <title> = Generator("<Title>", <id>, <generalized problem>, <generalized solution>, <function name>) + + addition = Generator("Addition", 0, "a+b=", "c", additionFunc) subtraction = Generator("Subtraction", 1, "a-b=", "c", subtractionFunc) multiplication = Generator("Multiplication", 2, "a*b=", "c", multiplicationFunc) @@ -749,48 +807,48 @@ binaryComplement1s = Generator("Binary Complement 1s", 4, "1010=", "0101", binar moduloDivision = Generator("Modulo Division", 5, "a%b=", "c", moduloFunc) squareRoot = Generator("Square Root", 6, "sqrt(a)=", "b", squareRootFunc) powerRuleDifferentiation = Generator("Power Rule Differentiation", 7, "nx^m=", "(n*m)x^(m-1)", powerRuleDifferentiationFunc) -square = Generator("Square", 8,"a^2", "b", squareFunc) +square = Generator("Square", 8, "a^2", "b", squareFunc) lcm = Generator("LCM (Least Common Multiple)", 9, "LCM of a and b = ", "c", lcmFunc) gcd = Generator("GCD (Greatest Common Denominator)", 10, "GCD of a and b = ", "c", gcdFunc) basicAlgebra = Generator("Basic Algebra", 11, "ax + b = c", "d", basicAlgebraFunc) log = Generator("Logarithm", 12, "log2(8)", "3", logFunc) -intDivision = Generator("Easy Division", 13,"a/b=","c",divisionToIntFunc) -decimalToBinary = Generator("Decimal to Binary",14,"Binary of a=","b",DecimalToBinaryFunc) -binaryToDecimal = Generator("Binary to Decimal",15,"Decimal of a=","b",BinaryToDecimalFunc) +intDivision = Generator("Easy Division", 13, "a/b=", "c", divisionToIntFunc) +decimalToBinary = Generator("Decimal to Binary", 14, "Binary of a=", "b", DecimalToBinaryFunc) +binaryToDecimal = Generator("Binary to Decimal", 15, "Decimal of a=", "b", BinaryToDecimalFunc) fractionDivision = Generator("Fraction Division", 16, "(a/b)/(c/d)=", "x/y", divideFractionsFunc) intMatrix22Multiplication = Generator("Integer Multiplication with 2x2 Matrix", 17, "k * [[a,b],[c,d]]=", "[[k*a,k*b],[k*c,k*d]]", multiplyIntToMatrix22) areaOfTriangle = Generator("Area of Triangle", 18, "Area of Triangle with side lengths a, b, c = ", "area", areaOfTriangleFunc) -doesTriangleExist = Generator("Triangle exists check", 19, "Does triangle with sides a, b and c exist?","Yes/No", isTriangleValidFunc) -midPointOfTwoPoint=Generator("Midpoint of the two point", 20,"((X1,Y1),(X2,Y2))=","((X1+X2)/2,(Y1+Y2)/2)",MidPointOfTwoPointFunc) +doesTriangleExist = Generator("Triangle exists check", 19, "Does triangle with sides a, b and c exist?", "Yes/No", isTriangleValidFunc) +midPointOfTwoPoint = Generator("Midpoint of the two point", 20, "((X1,Y1),(X2,Y2))=", "((X1+X2)/2,(Y1+Y2)/2)", MidPointOfTwoPointFunc) factoring = Generator("Factoring Quadratic", 21, "x^2+(x1+x2)+x1*x2", "(x-x1)(x-x2)", factoringFunc) thirdAngleOfTriangle = Generator("Third Angle of Triangle", 22, "Third Angle of the triangle = ", "angle3", thirdAngleOfTriangleFunc) systemOfEquations = Generator("Solve a System of Equations in R^2", 23, "2x + 5y = 13, -3x - 3y = -6", "x = -1, y = 3", systemOfEquationsFunc) -distance2Point = Generator("Distance between 2 points", 24, "Find the distance between (x1,y1) and (x2,y2)","sqrt(distanceSquared)", distanceTwoPointsFunc) +distance2Point = Generator("Distance between 2 points", 24, "Find the distance between (x1,y1) and (x2,y2)", "sqrt(distanceSquared)", distanceTwoPointsFunc) pythagoreanTheorem = Generator("Pythagorean Theorem", 25, "The hypotenuse of a right triangle given the other two lengths a and b = ", "hypotenuse", pythagoreanTheoremFunc) -linearEquations = Generator("Linear Equations", 26, "2x+5y=20 & 3x+6y=12", "x=-20 & y=12", linearEquationsFunc) #This has multiple variables whereas #23 has only x and y +linearEquations = Generator("Linear Equations", 26, "2x+5y=20 & 3x+6y=12", "x=-20 & y=12", linearEquationsFunc) # This has multiple variables whereas #23 has only x and y primeFactors = Generator("Prime Factorisation", 27, "Prime Factors of a =", "[b, c, d, ...]", primeFactorsFunc) fractionMultiplication = Generator("Fraction Multiplication", 28, "(a/b)*(c/d)=", "x/y", multiplyFractionsFunc) -angleRegularPolygon = Generator("Angle of a Regular Polygon",29,"Find the angle of a regular polygon with 6 sides","120",regularPolygonAngleFunc) -combinations = Generator("Combinations of Objects",30, "Combinations available for picking 4 objects at a time from 6 distinct objects ="," 15", combinationsFunc) +angleRegularPolygon = Generator("Angle of a Regular Polygon", 29, "Find the angle of a regular polygon with 6 sides", "120", regularPolygonAngleFunc) +combinations = Generator("Combinations of Objects", 30, "Combinations available for picking 4 objects at a time from 6 distinct objects =", " 15", combinationsFunc) factorial = Generator("Factorial", 31, "a! = ", "b", factorialFunc) -surfaceAreaCubeGen = Generator("Surface Area of Cube", 32, "Surface area of cube with side a units is","b units^2", surfaceAreaCube) -surfaceAreaCuboidGen = Generator("Surface Area of Cuboid", 33, "Surface area of cuboid with sides = a units, b units, c units is","d units^2", surfaceAreaCuboid) -surfaceAreaCylinderGen = Generator("Surface Area of Cylinder", 34, "Surface area of cylinder with height = a units and radius = b units is","c units^2", surfaceAreaCylinder) -volumeCubeGen = Generator("Volum of Cube", 35, "Volume of cube with side a units is","b units^3", volumeCube) -volumeCuboidGen = Generator("Volume of Cuboid", 36, "Volume of cuboid with sides = a units, b units, c units is","d units^3", volumeCuboid) -volumeCylinderGen = Generator("Volume of cylinder", 37, "Volume of cylinder with height = a units and radius = b units is","c units^3", volumeCylinder) -surfaceAreaConeGen = Generator("Surface Area of cone", 38, "Surface area of cone with height = a units and radius = b units is","c units^2", surfaceAreaCone) -volumeConeGen = Generator("Volume of cone", 39, "Volume of cone with height = a units and radius = b units is","c units^3", volumeCone) -commonFactors = Generator("Common Factors", 40, "Common Factors of {a} and {b} = ","[c, d, ...]",commonFactorsFunc) +surfaceAreaCubeGen = Generator("Surface Area of Cube", 32, "Surface area of cube with side a units is", "b units^2", surfaceAreaCube) +surfaceAreaCuboidGen = Generator("Surface Area of Cuboid", 33, "Surface area of cuboid with sides = a units, b units, c units is", "d units^2", surfaceAreaCuboid) +surfaceAreaCylinderGen = Generator("Surface Area of Cylinder", 34, "Surface area of cylinder with height = a units and radius = b units is", "c units^2", surfaceAreaCylinder) +volumeCubeGen = Generator("Volum of Cube", 35, "Volume of cube with side a units is", "b units^3", volumeCube) +volumeCuboidGen = Generator("Volume of Cuboid", 36, "Volume of cuboid with sides = a units, b units, c units is", "d units^3", volumeCuboid) +volumeCylinderGen = Generator("Volume of cylinder", 37, "Volume of cylinder with height = a units and radius = b units is", "c units^3", volumeCylinder) +surfaceAreaConeGen = Generator("Surface Area of cone", 38, "Surface area of cone with height = a units and radius = b units is", "c units^2", surfaceAreaCone) +volumeConeGen = Generator("Volume of cone", 39, "Volume of cone with height = a units and radius = b units is", "c units^3", volumeCone) +commonFactors = Generator("Common Factors", 40, "Common Factors of {a} and {b} = ", "[c, d, ...]", commonFactorsFunc) intersectionOfTwoLines = Generator("Intersection of Two Lines", 41, "Find the point of intersection of the two lines: y = m1*x + b1 and y = m2*x + b2", "(x, y)", intersectionOfTwoLinesFunc) -permutations= Generator("Permutations",42, "Total permutations of 4 objects at a time from 10 objects is","5040", permutationFunc) +permutations = Generator("Permutations", 42, "Total permutations of 4 objects at a time from 10 objects is", "5040", permutationFunc) vectorCross = Generator("Cross Product of 2 Vectors", 43, "a X b = ", "c", vectorCrossFunc) -compareFractions=Generator("Compare Fractions",44,"Which symbol represents the comparison between a/b and c/d?",">/</=",compareFractionsFunc) +compareFractions = Generator("Compare Fractions", 44, "Which symbol represents the comparison between a/b and c/d?", ">/</=", compareFractionsFunc) simpleInterest = Generator("Simple Interest", 45, "Simple interest for a principle amount of a dollars, b% rate of interest and for a time period of c years is = ", "d dollars", simpleInterestFunc) -matrixMultiplication = Generator("Multiplication of two matrices", 46, "Multiply two matrices A and B", "C", matrixMultiplicationFunc) -CubeRoot = Generator("Cube Root",47,"Cuberoot of a upto 2 decimal places is","b",cubeRootFunc) +matrixMultiplication = Generator("Multiplication of two matrices", 46, "Multiply two matrices A and B", "C", matrixMultiplicationFunc) +CubeRoot = Generator("Cube Root", 47, "Cuberoot of a upto 2 decimal places is", "b", cubeRootFunc) powerRuleIntegration = Generator("Power Rule Integration", 48, "nx^m=", "(n/m)x^(m+1)", powerRuleIntegrationFunc) -fourthAngleOfQuadrilateral = Generator("Fourth Angle of Quadrilateral",49,"Fourth angle of Quadrilateral with angles a,b,c =","angle4",fourthAngleOfQuadriFunc) +fourthAngleOfQuadrilateral = Generator("Fourth Angle of Quadrilateral", 49, "Fourth angle of Quadrilateral with angles a,b,c =", "angle4", fourthAngleOfQuadriFunc) quadraticEquationSolve = Generator("Quadratic Equation", 50, "Find the zeros {x1,x2} of the quadratic equation ax^2+bx+c=0", "x1,x2", quadraticEquation) hcf = Generator("HCF (Highest Common Factor)", 51, "HCF of a and b = ", "c", hcfFunc) diff --git a/tests/test_mathgen.py b/tests/test_mathgen.py index ace72a5..af38bff 100644 --- a/tests/test_mathgen.py +++ b/tests/test_mathgen.py @@ -1,46 +1,46 @@ -from math import sqrt -from mathgenerator.mathgen import * - -from hypothesis import strategies as st, given, assume - - -@given(maxSum=st.integers(min_value=1), maxAddend=st.integers(min_value=1)) -def test_additionFunc(maxSum, maxAddend): - assume(maxSum > maxAddend) - problem, solution = additionFunc(maxSum, maxAddend) - assert eval(problem[:-1]) == int(solution) - - -@given(maxMinuend=st.integers(min_value=1), maxDiff=st.integers(min_value=1)) -def test_subtractionFunc(maxMinuend, maxDiff): - assume(maxMinuend > maxDiff) - problem, solution = subtractionFunc(maxMinuend, maxDiff) - assert eval(problem[:-1]) == int(solution) - - -@given(maxRes=st.integers(min_value=1), maxMulti=st.integers(min_value=1)) -def test_multiplicationFunc(maxRes, maxMulti): - assume(maxRes > maxMulti) - problem, solution = multiplicationFunc(maxRes, maxMulti) - assert eval(problem[:-1]) == int(solution) - - -@given(maxRes=st.integers(min_value=1), maxDivid=st.integers(min_value=1)) -def test_divisionFunc(maxRes, maxDivid): - assume(maxRes > maxDivid) - problem, solution = divisionFunc(maxRes, maxDivid) - assert eval(problem[:-1]) == float(solution) - - -@given(maxRes=st.integers(min_value=1), maxModulo=st.integers(min_value=1)) -def test_moduloFunc(maxRes, maxModulo): - assume(maxRes > maxModulo) - problem, solution = moduloFunc(maxRes, maxModulo) - assert eval(problem[:-1]) == int(solution) - - -@given(minNo=st.integers(min_value=1), maxNo=st.integers(min_value=1, max_value=2 ** 50)) -def test_squareRootFunc(minNo, maxNo): - assume(maxNo > minNo) - problem, solution = squareRootFunc(minNo, maxNo) - assert eval(problem[:-1]) == float(solution) +from math import sqrt +from mathgenerator.mathgen import * + +from hypothesis import strategies as st, given, assume + + +@given(maxSum=st.integers(min_value=1), maxAddend=st.integers(min_value=1)) +def test_addition(maxSum, maxAddend): + assume(maxSum > maxAddend) + problem, solution = addition.func(maxSum, maxAddend) + assert eval(problem[:-1]) == int(solution) + + +@given(maxMinuend=st.integers(min_value=1), maxDiff=st.integers(min_value=1)) +def test_subtraction(maxMinuend, maxDiff): + assume(maxMinuend > maxDiff) + problem, solution = subtraction.func(maxMinuend, maxDiff) + assert eval(problem[:-1]) == int(solution) + + +@given(maxRes=st.integers(min_value=1), maxMulti=st.integers(min_value=1)) +def test_multiplication(maxRes, maxMulti): + assume(maxRes > maxMulti) + problem, solution = multiplication.func(maxRes, maxMulti) + assert eval(problem[:-1]) == int(solution) + + +@given(maxRes=st.integers(min_value=1), maxDivid=st.integers(min_value=1)) +def test_division(maxRes, maxDivid): + assume(maxRes > maxDivid) + problem, solution = division.func(maxRes, maxDivid) + assert eval(problem[:-1]) == float(solution) + + +@given(maxRes=st.integers(min_value=1), maxModulo=st.integers(min_value=1)) +def test_moduloDivision(maxRes, maxModulo): + assume(maxRes > maxModulo) + problem, solution = moduloDivision.func(maxRes, maxModulo) + assert eval(problem[:-1]) == int(solution) + + +@given(minNo=st.integers(min_value=1), maxNo=st.integers(min_value=1, max_value=2 ** 50)) +def test_squareRoot(minNo, maxNo): + assume(maxNo > minNo) + problem, solution = squareRoot.func(minNo, maxNo) + assert eval(problem[:-1]) == float(solution) From c0a213b90c45bb321aa25c1c2690c62743b20963 Mon Sep 17 00:00:00 2001 From: NarayanAdithya <narayanadithya1234@gmail.com> Date: Sun, 18 Oct 2020 00:05:05 +0530 Subject: [PATCH 2/4] data_mean function --- .../__pycache__/__init__.cpython-37.pyc | Bin 164 -> 160 bytes .../__pycache__/mathgen.cpython-37.pyc | Bin 29724 -> 33916 bytes mathgenerator/mathgen.py | 56 +++++++++++++----- 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/mathgenerator/__pycache__/__init__.cpython-37.pyc b/mathgenerator/__pycache__/__init__.cpython-37.pyc index 893336fc37f23c5d8be2b5e049b532e5ed6e2ea6..8b0d08300961a9cf36125e988780744bcb4225b9 100644 GIT binary patch delta 57 zcmZ3&xPXz{iI<m)fq{YHsY&-lZVM$(XRDad;?$zz7>|G$m(=3ylKg@gkHqBclKiC9 MqO{cFl8Kqt0L~v0h5!Hn delta 61 zcmZ3$xP+10iI<m)fq{Wx=abHf+!kuS&Q>v@#i>QbF#*moE~&-YCHVz00Y&*)smUe9 QF#$!1$t9V|sS{JJ0W}X4lK=n! diff --git a/mathgenerator/__pycache__/mathgen.cpython-37.pyc b/mathgenerator/__pycache__/mathgen.cpython-37.pyc index 82bcec4b454f2a62c9cf0b2088c33baea54dfaef..26c552d300e0698bcd1b325c1363a3d7fbd2a03c 100644 GIT binary patch delta 8720 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 Yg-nDPC9py<MhQj;MkXZ~C72`_0muUfK>z>% delta 4959 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 diff --git a/mathgenerator/mathgen.py b/mathgenerator/mathgen.py index fc1fc53..4e6c751 100644 --- a/mathgenerator/mathgen.py +++ b/mathgenerator/mathgen.py @@ -798,21 +798,21 @@ def surdsComparisonFunc(maxValue = 100, maxRoot = 10): solution = "<" return problem, solution -def fibonacciSeriesFunc(minNo=1): - n = random.randint(minNo,20) - def createFibList(n): - l=[] - for i in range(n): - if i<2: - l.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 ?" - solution = fibList - return problem,solution +# def fibonacciSeriesFunc(minNo=1): +# n = random.randint(minNo,20) +# def createFibList(n): +# l=[] +# for i in range(n): +# if i<2: +# l.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 ?" +# solution = fibList +# return problem,solution def basicTrigonometryFunc(angles=[0,30,45,60,90],functions=["sin","cos","tan"]): #Handles degrees in quadrant one angle=random.choice(angles) @@ -826,6 +826,29 @@ def basicTrigonometryFunc(angles=[0,30,45,60,90],functions=["sin","cos","tan"]): return problem,solution + +def data_desc(number_values=15,minval=5,maxval=50): + random_list=[] + for i in range(number_values): + n=random.randint(minval,maxval) + random_list.append(n) + a=sum(random_list) + mean=a/number_values + var=0 + for i in range(number_values): + 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 + + + + + # || Class Instances #Format is: @@ -887,5 +910,6 @@ diceSumProbability=Generator("Probability of a certain sum appearing on faces of exponentiation = Generator("Exponentiation", 53,"a^b = ","c",exponentiationFunc) confidenceInterval = Generator("Confidence interval For sample S", 54, "With X% confidence", "is (A,B)", confidenceIntervalFunc) surdsComparison = Generator("Comparing surds", 55, "Fill in the blanks a^(1/b) _ c^(1/d)", "</>/=", surdsComparisonFunc) -fibonacciSeries = Generator("Fibonacci Series",56,"fibonacci series of first a numbers","prints the fibonacci series starting from 0 to a",fibonacciSeriesFunc) +# fibonacciSeries = Generator("Fibonacci Series",56,"fibonacci series of first a numbers","prints the fibonacci series starting from 0 to a",fibonacciSeriesFunc) basicTrigonometry=Generator("Trigonometric Values",57,"What is sin(X)?","ans",basicTrigonometryFunc) +data_summary=Generator("Mean,Standard Deviation,Variance",58,"a,b,c","Mean:a+b+c/3,Std,Var",data_desc) \ No newline at end of file From 6b63ecf292390b4ba7fb9b23fc8e0f6f18494eda Mon Sep 17 00:00:00 2001 From: NarayanAdithya <narayanadithya1234@gmail.com> Date: Sun, 18 Oct 2020 00:08:30 +0530 Subject: [PATCH 3/4] Fibinocci uncommented --- mathgenerator/mathgen.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/mathgenerator/mathgen.py b/mathgenerator/mathgen.py index 4e6c751..a12331f 100644 --- a/mathgenerator/mathgen.py +++ b/mathgenerator/mathgen.py @@ -798,21 +798,21 @@ def surdsComparisonFunc(maxValue = 100, maxRoot = 10): solution = "<" return problem, solution -# def fibonacciSeriesFunc(minNo=1): -# n = random.randint(minNo,20) -# def createFibList(n): -# l=[] -# for i in range(n): -# if i<2: -# l.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 ?" -# solution = fibList -# return problem,solution +def fibonacciSeriesFunc(minNo=1): + n = random.randint(minNo,20) + def createFibList(n): + l=[] + for i in range(n): + if i<2: + l.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 ?" + solution = fibList + return problem,solution def basicTrigonometryFunc(angles=[0,30,45,60,90],functions=["sin","cos","tan"]): #Handles degrees in quadrant one angle=random.choice(angles) @@ -910,6 +910,6 @@ diceSumProbability=Generator("Probability of a certain sum appearing on faces of exponentiation = Generator("Exponentiation", 53,"a^b = ","c",exponentiationFunc) confidenceInterval = Generator("Confidence interval For sample S", 54, "With X% confidence", "is (A,B)", confidenceIntervalFunc) surdsComparison = Generator("Comparing surds", 55, "Fill in the blanks a^(1/b) _ c^(1/d)", "</>/=", surdsComparisonFunc) -# fibonacciSeries = Generator("Fibonacci Series",56,"fibonacci series of first a numbers","prints the fibonacci series starting from 0 to a",fibonacciSeriesFunc) +fibonacciSeries = Generator("Fibonacci Series",56,"fibonacci series of first a numbers","prints the fibonacci series starting from 0 to a",fibonacciSeriesFunc) basicTrigonometry=Generator("Trigonometric Values",57,"What is sin(X)?","ans",basicTrigonometryFunc) data_summary=Generator("Mean,Standard Deviation,Variance",58,"a,b,c","Mean:a+b+c/3,Std,Var",data_desc) \ No newline at end of file From a798e9e3e54bb56a33b9ce63ad2073ca405c21a5 Mon Sep 17 00:00:00 2001 From: NarayanAdithya <narayanadithya1234@gmail.com> Date: Sun, 18 Oct 2020 00:20:36 +0530 Subject: [PATCH 4/4] Removed Pycache --- .../__pycache__/__init__.cpython-37.pyc | Bin 160 -> 0 bytes .../__pycache__/mathgen.cpython-37.pyc | Bin 33916 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mathgenerator/__pycache__/__init__.cpython-37.pyc delete mode 100644 mathgenerator/__pycache__/mathgen.cpython-37.pyc diff --git a/mathgenerator/__pycache__/__init__.cpython-37.pyc b/mathgenerator/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 8b0d08300961a9cf36125e988780744bcb4225b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmZ?b<>g{vU|@J^(j5<?AA<-OW@KPsaA06yC}v?`U`SyIX3%8xTggxa5=IceJe{p# zLW@(2ieo$iVq8*-vrF;|VmuO)vrF=mQj5}3i%Vj16H7AEQ}a@b5=-)n(0K9jnR%Hd Z@$q^EmA5!-a`RJ4b5iX<R(u9I0|1=bDnbAN diff --git a/mathgenerator/__pycache__/mathgen.cpython-37.pyc b/mathgenerator/__pycache__/mathgen.cpython-37.pyc deleted file mode 100644 index 26c552d300e0698bcd1b325c1363a3d7fbd2a03c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33916 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