diff --git a/.github/ISSUE_TEMPLATE/new-generator-idea.md b/.github/ISSUE_TEMPLATE/new-generator-idea.md new file mode 100644 index 0000000..b986c9f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/new-generator-idea.md @@ -0,0 +1,16 @@ +--- +name: New Generator Idea +about: Use this template if you have an idea for a new generator. +title: '' +labels: New generator, hacktoberfest +assignees: '' + +--- + +**Example Problem:** + +**Example Solution:** + +**Further explanation:** + +**Would you like to be assigned to this:** diff --git a/.github/ISSUE_TEMPLATE/other-issue.md b/.github/ISSUE_TEMPLATE/other-issue.md new file mode 100644 index 0000000..7b37378 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/other-issue.md @@ -0,0 +1,10 @@ +--- +name: Other Issue +about: If your issue lies outside of the other templates +title: '' +labels: '' +assignees: '' + +--- + + diff --git a/.github/ISSUE_TEMPLATE/request-changes-to-a-generator.md b/.github/ISSUE_TEMPLATE/request-changes-to-a-generator.md new file mode 100644 index 0000000..9fa48e2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/request-changes-to-a-generator.md @@ -0,0 +1,12 @@ +--- +name: Request changes to a generator +about: If you find a faulty generator that needs a fix, use this template. +title: '' +labels: bug, hacktoberfest +assignees: '' + +--- + +**Name or Id of generator:** + +**Issue:** 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/CONTRIBUTING.md b/CONTRIBUTING.md index 556fd76..016ce41 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -28,7 +28,14 @@ def additionFunc(maxSum, maxAddend): Before coding, please check README.md to see if someone has already created the generator you plan to make. Skillid is determined by the next available id as can be determined in the table. +#### Restructure Notes +We currently just underwent a large reconstruction of the repository. Here is how you commit to the repo. +* Place your generator instance at the bottom of mathgen.py +* Create a new file in the funcs directory with the same name as your function +* Place `.__init__ import *` at the top of your file and then write your function in the lines beneath it +* Add `from . import *` at the bottom of the `__init__.py` file inside the funcs directory +If you have issues with checks you can try using yapf to fix linter errors or just go through them line by line. ### Provide Ideas If you have an idea for a generator but don't have the time or know-how to create it, you can add it as an issue. If you have a lot of ideas, I would suggest adding them to the table in README.md so that they are easier for our team to manage. diff --git a/Makefile b/Makefile index dbf1f17..9414a0b 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,11 @@ -test: - python -m pytest --verbose -s tests +IGNORE_ERRORS = E501,F401,F403,F405 +PKG = mathgenerator + +format: + python -m autopep8 --ignore=$(IGNORE_ERRORS) -i $(PKG)/* + +lint: + python -m flake8 --ignore=$(IGNORE_ERRORS) $(PKG) + +test: + python -m pytest --verbose -s tests diff --git a/README.md b/README.md index dfc7d41..f2d81dc 100644 --- a/README.md +++ b/README.md @@ -30,54 +30,77 @@ problem, solution = mathgen.genById(0) | Id | Skill | Example problem | Example Solution | Function Name | |------|-----------------------------------|--------------------|-----------------------|--------------------------| -| 0 | Addition | 29+33= | 62 | addition | -| 1 | Subtraction | 62-7= | 55 | subtraction | -| 2 | Multiplication | 93*1= | 93 | multiplication | -| 3 | Division | 59/47= | 1.2553191489361701 | division | -| 4 | Binary Complement 1s | 001110000 | 110001111 | binaryComplement1s | -| 5 | Modulo Division | 89%34= | 21 | moduloDivision | -| 6 | Square Root | sqrt(16)= | 4 | squareRoot | -| 7 | Power Rule Differentiation | 4x^3 | 12x^2 | powerRuleDifferentiation | -| 8 | Square | 12^2= | 144 | square | -| 9 | LCM (Least Common Multiple) | LCM of 10 and 1 = | 10 | lcm | -| 10 | GCD (Greatest Common Denominator) | GCD of 12 and 5 = | 1 | gcd | -| 11 | Basic Algebra | 8x + 7 = 10 | 3/8 | basicAlgebra | -| 12 | Logarithm | log3(729) | 6 | log | -| 13 | Easy Division | 378/21 = | 18 | intDivision | -| 14 | Decimal to Binary | Binary of 4= | 100 | decimalToBinary | -| 15 | Binary to Decimal | 10011 | 19 | binaryToDecimal | -| 16 | Fraction Division | (1/2)/(4/3) | 3/8 | fractionDivision | -| 17 | Integer Multiplication with 2x2 Matrix | 2 * [[0, 7], [7, 7]] = | [[0,14],[14,14]] | intMatrix22Multiplication | -| 18 | Area of Triangle | Area of triangle with side lengths: 9 14 15 = | 61.644140029689765 | areaOfTriangle | -| 19 | Triangle exists check | Does triangle with sides 33, 6 and 43 exist? | No | doesTriangleExist | -| 20 | Midpoint of the two point | (-15,-10),(-5,2)= | (-10.0,-4.0) | midPointOfTwoPoint | -| 21 | Factoring Quadratic | x^2-17x+72 | (x-9)(x-8) | factoring | -| 22 | Third Angle of Triangle | Third angle of triangle with angles 4 and 31 = | 145 | thirdAngleOfTriangle | -| 23 | Solve a System of Equations in R^2 | 4x - 8y = 48, 3x - 8y = 40 | x = 8, y = -2 | systemOfEquations | -| 24 | Distance between 2 points | Find the distance between (-9, -20) and (18, -19) | sqrt(730) | distance2Point | -| 25 | Pythagorean Theorem | The hypotenuse of a right triangle given the other two lengths 18 and 13 = | 22.20 | pythagoreanTheorem | -| 26 | Linear Equations | -11x + -16y = -302 -1x + 20y = 250 | x = 10, y = 12 | linearEquations | -| 27 | Prime Factorisation | Find prime factors of 55 | [5, 11] | primeFactors | -| 28 | Fraction Multiplication | (4/9)*(8/10) | 16/45 | fractionMultiplication | -| 29 | Angle of a Regular Polygon | Find the angle of a regular polygon with 15 sides | 156.0 | angleRegularPolygon | -| 30 | Combinations of Objects | Number of combinations from 13 objects picked 1 at a time | 13 | combinations | +[//]: # list start +| 0 | Addition | 33+23= | 56 | addition | +| 1 | Subtraction | 14-1= | 13 | subtraction | +| 2 | Multiplication | 52*1= | 52 | multiplication | +| 3 | Division | 14/26= | 0.5384615384615384 | division | +| 4 | Binary Complement 1s | 0110111= | 1001000 | binaryComplement1s | +| 5 | Modulo Division | 23%70= | 23 | moduloDivision | +| 6 | Square Root | sqrt(121)= | 11 | squareRoot | +| 7 | Power Rule Differentiation | 3x^2 + 3x^5 + 1x^2 + 6x^4 + 6x^3 | 6x^1 + 15x^4 + 2x^1 + 24x^3 + 18x^2 | powerRuleDifferentiation | +| 8 | Square | 18^2= | 324 | square | +| 9 | LCM (Least Common Multiple) | LCM of 17 and 11 = | 187 | lcm | +| 10 | GCD (Greatest Common Denominator) | GCD of 15 and 12 = | 3 | gcd | +| 11 | Basic Algebra | 2x + 3 = 10 | 7/2 | basicAlgebra | +| 12 | Logarithm | log2(32) | 5 | log | +| 13 | Easy Division | 196/14 = | 14 | intDivision | +| 14 | Decimal to Binary | Binary of 61= | 111101 | decimalToBinary | +| 15 | Binary to Decimal | 1 | 1 | binaryToDecimal | +| 16 | Fraction Division | (2/1)/(10/5) | 1 | fractionDivision | +| 17 | Integer Multiplication with 2x2 Matrix | 16 * [[4, 1], [1, 2]] = | [[64,16],[16,32]] | intMatrix22Multiplication | +| 18 | Area of Triangle | Area of triangle with side lengths: 15 13 11 = | 69.62892717829278 | areaOfTriangle | +| 19 | Triangle exists check | Does triangle with sides 35, 14 and 37 exist? | Yes | doesTriangleExist | +| 20 | Midpoint of the two point | (15,5),(9,10)= | (12.0,7.5) | midPointOfTwoPoint | +| 21 | Factoring Quadratic | x^2-12x+35 | (x-7)(x-5) | factoring | +| 22 | Third Angle of Triangle | Third angle of triangle with angles 37 and 54 = | 89 | thirdAngleOfTriangle | +| 23 | Solve a System of Equations in R^2 | -4x - 8y = 60, -9x + 10y = 51 | x = -9, y = -3 | systemOfEquations | +| 24 | Distance between 2 points | Find the distance between (16, 7) and (19, 14) | sqrt(58) | distance2Point | +| 25 | Pythagorean Theorem | The hypotenuse of a right triangle given the other two lengths 18 and 8 = | 19.70 | pythagoreanTheorem | +| 26 | Linear Equations | -8x + 15y = -109 +6x + -14y = 90 | x = 8, y = -3 | linearEquations | +| 27 | Prime Factorisation | Find prime factors of 130 | [2, 5, 13] | primeFactors | +| 28 | Fraction Multiplication | (8/9)*(3/2) | 4/3 | fractionMultiplication | +| 29 | Angle of a Regular Polygon | Find the angle of a regular polygon with 8 sides | 135.0 | angleRegularPolygon | +| 30 | Combinations of Objects | Number of combinations from 11 objects picked 9 at a time | 55 | combinations | | 31 | Factorial | 2! = | 2 | factorial | -| 32 | Surface Area of Cube | Surface area of cube with side = 13m is | 1014 m^2 | surfaceAreaCubeGen | -| 33 | Surface Area of Cuboid | Surface area of cuboid with sides = 5m, 3m, 7m is | 142 m^2 | surfaceAreaCuboidGen | -| 34 | Surface Area of Cylinder | Surface area of cylinder with height = 15m and radius = 7m is | 967 m^2 | surfaceAreaCylinderGen | +| 32 | Surface Area of Cube | Surface area of cube with side = 17m is | 1734 m^2 | surfaceAreaCubeGen | +| 33 | Surface Area of Cuboid | Surface area of cuboid with sides = 8m, 4m, 17m is | 472 m^2 | surfaceAreaCuboidGen | +| 34 | Surface Area of Cylinder | Surface area of cylinder with height = 32m and radius = 18m is | 5654 m^2 | surfaceAreaCylinderGen | | 35 | Volum of Cube | Volume of cube with side = 11m is | 1331 m^3 | volumeCubeGen | -| 36 | Volume of Cuboid | Volume of cuboid with sides = 6m, 1m, 10m is | 60 m^3 | volumeCuboidGen | -| 37 | Volume of cylinder | Volume of cylinder with height = 26m and radius = 15m is | 18378 m^3 | volumeCylinderGen | -| 38 | Surface Area of cone | Surface area of cone with height = 46m and radius = 14m is | 2730 m^2 | surfaceAreaConeGen | -| 39 | Volume of cone | Volume of cone with height = 7m and radius = 11m is | 886 m^3 | volumeConeGen | -| 40 | Common Factors | Common Factors of 91 and 51 = | [1] | commonFactors | -| 41 | Intersection of Two Lines | Find the point of intersection of the two lines: y = 6/4x + 5 and y = -7/2x + 3 | (-2/5, 22/5) | intersectionOfTwoLines | -| 42 | Permutations | Number of Permutations from 13 objects picked 4 at a time = | 17160 | permutations | -| 43 | Cross Product of 2 Vectors | [-14, 13, 20] X [-5, -18, 19] = | [607, 166, 317] | vectorCross | -| 44 | Compare Fractions | Which symbol represents the comparison between 8/3 and 6/7? | > | compareFractions | -| 45 | Simple Interest | Simple interest for a principle amount of 6128 dollars, 5% rate of interest and for a time period of 5 years is = | 1532.0 | simpleInterest | -| 46 | Multiplication of two matrices | Multiply [[-20, -14, -88, -62, 39, 94, 21, 75, 26], [89, -67, -80, -60, 32, -23, -79, 11, -69], [13, -75, -66, 3, 67, -79, -49, 6, 36], [-44, -84, 68, -27, -86, -95, -71, -77, -62], [45, 58, 89, 82, 30, -83, -23, 51, 95], [11, 46, 100, -15, 60, -34, 85, 50, -44], [93, -100, -62, 63, -73, -64, 90, -15, 23], [-8, 91, -22, 53, -42, 25, 32, -26, 31], [-60, 90, 75, -42, 19, 33, -30, 74, 13]] and [[-80, 54, -39, 37, -99], [31, -28, -31, 64, 73], [-21, -34, -28, -21, -76], [-94, 55, 66, 0, 17], [-28, 25, -65, -74, 100], [76, 74, -96, -98, -5], [-90, -70, -66, -71, -35], [65, 49, -100, 72, -23], [-95, -97, -31, -84, -86]] | [[15409, 6508, -21665, -10161, 5326], [9859, 17962, 3267, 12768, 3119], [-8761, 1272, 8611, 738, 3881], [4489, -5790, 29652, 11947, -5940], [-22167, -8208, -1142, 6747, -10714], [-4628, -5167, -15527, 1404, 243], [-29240, -2432, 11103, 615, -22487], [-5498, -5038, 1462, -100, 2495], [18214, -3238, -15548, 3691, 6061]] | matrixMultiplication | -| 47 | Cube Root | cuberoot of 711 upto 2 decimal places is: | 8.93 | CubeRoot | -| 48 | Power Rule Integration | 3x^1 | (3/1)x^2 + c | powerRuleIntegration | -| 49 | Fourth Angle of Quadrilateral | Fourth angle of quadrilateral with angles 94 , 101, 102 = | 63 | fourthAngleOfQuadrilateral | +| 36 | Volume of Cuboid | Volume of cuboid with sides = 14m, 19m, 1m is | 266 m^3 | volumeCuboidGen | +| 37 | Volume of cylinder | Volume of cylinder with height = 16m and radius = 18m is | 16286 m^3 | volumeCylinderGen | +| 38 | Surface Area of cone | Surface area of cone with height = 48m and radius = 20m is | 4523 m^2 | surfaceAreaConeGen | +| 39 | Volume of cone | Volume of cone with height = 29m and radius = 6m is | 1093 m^3 | volumeConeGen | +| 40 | Common Factors | Common Factors of 59 and 57 = | [1] | commonFactors | +| 41 | Intersection of Two Lines | Find the point of intersection of the two lines: y = -1/4x - 2 and y = 4/5x + 3 | (-100/21, -17/21) | intersectionOfTwoLines | +| 42 | Permutations | Number of Permutations from 13 objects picked 8 at a time = | 51891840 | permutations | +| 43 | Cross Product of 2 Vectors | [4, -11, 9] X [-8, -19, -5] = | [226, -52, -164] | vectorCross | +| 44 | Compare Fractions | Which symbol represents the comparison between 3/7 and 2/4? | < | compareFractions | +| 45 | Simple Interest | Simple interest for a principle amount of 2398 dollars, 9% rate of interest and for a time period of 5 years is = | 1079.1 | simpleInterest | +| 46 | Multiplication of two matrices | Multiply
-50367-26-263
88-3760-1961-56
48-569-87-64-92
-84-50-79-1986-13
02812-1473-49
94-90226-3819
2-1179-7798-77
-877072-3264-99
and
3432-6-3246-2378-81-18
-172449-62-507738-98-64
-23-7843 5-83-5 4-92-16
46-47-9252-25-374451-7
2026703796-73498442
-72-15-80-2458-47-4145-69
|
-8245-1057-423-3535-5692034-63291219-5765
6619 5671073723914001-629110147-73876383
1472-16113318-5565-1257410381 638-236992621
159355983465789913170-6487-48572464210618
359230271220614732120-4126082-6354561
3748-1803-1146020725462-8183242311 947
2400 960229502483 952-19744625-55129372
1132-2067223921884-1227681961949-71485677
| matrixMultiplication | + [ 10584, 13902, 11916, -7446, 4430, 554] + [ -1800, 6587, 14343, 6224, 4525, 4853] + [-12452, -10675, -8693, 427, 2955, 17691]] | matrixMultiplication | +| 47 | Cube Root | cuberoot of 221 upto 2 decimal places is: | 6.05 | CubeRoot | +| 48 | Power Rule Integration | 4x^5 + 2x^5 + 9x^8 + 9x^5 | (4/5)x^6 + (2/5)x^6 + (9/8)x^9 + (9/5)x^6 + c | powerRuleIntegration | +| 49 | Fourth Angle of Quadrilateral | Fourth angle of quadrilateral with angles 27 , 155, 116 = | 62 | fourthAngleOfQuadrilateral | +| 50 | Quadratic Equation | Zeros of the Quadratic Equation 53x^2+200x+78=0 | [-0.44, -3.33] | quadraticEquationSolve | +| 51 | HCF (Highest Common Factor) | HCF of 7 and 4 = | 1 | hcf | +| 52 | Probability of a certain sum appearing on faces of dice | If 2 dice are rolled at the same time, the probability of getting a sum of 11 = | 2/36 | diceSumProbability | +| 53 | Exponentiation | 9^10 = | 3486784401 | exponentiation | +| 54 | Confidence interval For sample S | The confidence interval for sample [266, 201, 278, 209, 229, 275, 216, 234, 219, 276, 282, 281, 208, 247, 265, 273, 286, 202, 231, 207, 251, 203, 259, 288, 291, 260, 210, 263, 222] with 99% confidence is | (260.5668079141175, 231.29526105139982) | confidenceInterval | +| 55 | Comparing surds | Fill in the blanks 15^(1/9) _ 55^(1/1) | < | surdsComparison | +| 56 | Fibonacci Series | The Fibonacci Series of the first 10 numbers is ? | [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] | fibonacciSeries | +| 57 | Trigonometric Values | What is tan(30)? | 1/√3 | basicTrigonometry | +| 58 | Sum of Angles of Polygon | Sum of angles of polygon with 3 sides = | 180 | sumOfAnglesOfPolygon | +| 59 | Mean,Standard Deviation,Variance | Find the mean,standard deviation and variance for the data[36, 13, 31, 23, 38, 34, 24, 20, 41, 14, 19, 31, 11, 49, 49] | The Mean is 28.866666666666667 , Standard Deviation is 143.5822222222222, Variance is 11.982579948501167 | dataSummary | +| 59 | Surface Area of Sphere | Surface area of Sphere with radius = 11m is | 1520.5308443374597 m^2 | surfaceAreaSphereGen | +| 60 | Volume of Sphere | Volume of sphere with radius 73 m = | 1629510.5990953872 m^3 | volumeSphere | +| 61 | nth Fibonacci number | What is the 68th Fibonacci number? | 72723460248141 | nthFibonacciNumberGen | +| 62 | Profit or Loss Percent | Profit percent when CP = 825 and SP = 972 is: | 17.81818181818182 | profitLossPercent | +| 63 | Binary to Hexidecimal | 100000 | 0x20 | binaryToHex | +| 64 | Multiplication of 2 complex numbers | (3+14j) * (-3+16j) = | (-233+6j) | complexNumMultiply | +| 65 | Geometric Progression | For the given GP [4, 16, 64, 256, 1024, 4096] ,Find the value of a,common ratio,8th term value, sum upto 7th term | The value of a is 4, common ratio is 4 , 8th term is 65536 , sum upto 7th term is 21844.0 | geometricprogression | +| 66 | Geometric Mean of N Numbers | Geometric mean of 3 numbers 81 , 35 and 99 = | (81*35*99)^(1/3) = 65.47307713912309 | geometricMean | +| 67 | Harmonic Mean of N Numbers | Harmonic mean of 2 numbers 99 and 25 = | 2/((1/99) + (1/25)) = 39.91935483870967 | harmonicMean | diff --git a/dev-requirements.txt b/dev-requirements.txt index a965899..7b33738 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -1,2 +1,5 @@ -pytest -hypothesis \ No newline at end of file +pytest +hypothesis +flake8 +autopep8 +sympy \ No newline at end of file diff --git a/makeReadme.py b/makeReadme.py new file mode 100644 index 0000000..7a7a66d --- /dev/null +++ b/makeReadme.py @@ -0,0 +1,54 @@ +# 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 +# NOTE: not anymore. but still leaving this comment in. +from mathgenerator.mathgen import * + +wList = getGenList() +lines = [] +with open('mathgenerator/mathgen.py', 'r') as f: + lines = f.readlines() + +allRows = [] +# get the first line of the functions in mathgen.py +line = lines.index('# Funcs_start - DO NOT REMOVE!\n') + 1 +for item in wList: + myGen = item[2] + # NOTE: renamed 'sol' to 'solu' to make it look nicer + prob, solu = myGen() + prob = str(prob).rstrip("\n") + solu = str(solu).rstrip("\n") + # edge case for matrixMultiplication + if item[0] == 46: + print(prob) + + prob = prob.replace("[[", "
") + prob = prob.replace("[", "
") + prob = prob.replace(", ", "") + prob = prob.replace("]]\n", "
") + prob = prob.replace("]\n", "") + print(prob) + + instName = lines[line] + # NOTE: renamed 'def_name' to 'func_name' because it suits it more + func_name = instName[:instName.find('=')].strip() + row = [myGen.id, myGen.title, prob, solu, func_name] + # print(item[1], func_name) + line += 1 + if line > len(lines): + break + allRows.append(row) + +with open('README.md', "r") as g: + lines = g.readlines() + + line = lines.index('[//]: # list start\n') + lines = lines[:line + 1] + + for row in allRows: + tableLine = "| " + str(row[0]) + " | " + str(row[1]) + " | " + str( + row[2]) + " | " + str(row[3]) + " | " + str(row[4]) + " |\n" + lines.append(tableLine) + +with open('README.md', "w") as g: + g.writelines(lines) + +print("New README.md table generated") diff --git a/mathgenerator/__init__.py b/mathgenerator/__init__.py index e69de29..0a261d0 100644 --- a/mathgenerator/__init__.py +++ b/mathgenerator/__init__.py @@ -0,0 +1,23 @@ +genList = [] + + +class Generator: + def __init__(self, title, id, generalProb, generalSol, func): + self.title = title + self.id = id + self.generalProb = generalProb + self.generalSol = generalSol + self.func = func + genList.append([id, title, self]) + + def __str__(self): + return str( + self.id + ) + " " + self.title + " " + self.generalProb + " " + self.generalSol + + def __call__(self, **kwargs): + return self.func(**kwargs) + + +def getGenList(): + return genList diff --git a/mathgenerator/__pycache__/__init__.cpython-37.pyc b/mathgenerator/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 893336f..0000000 Binary files a/mathgenerator/__pycache__/__init__.cpython-37.pyc and /dev/null differ diff --git a/mathgenerator/__pycache__/mathgen.cpython-37.pyc b/mathgenerator/__pycache__/mathgen.cpython-37.pyc deleted file mode 100644 index 418e0a5..0000000 Binary files a/mathgenerator/__pycache__/mathgen.cpython-37.pyc and /dev/null differ diff --git a/mathgenerator/funcs/BinaryToDecimalFunc.py b/mathgenerator/funcs/BinaryToDecimalFunc.py new file mode 100644 index 0000000..9d2b25d --- /dev/null +++ b/mathgenerator/funcs/BinaryToDecimalFunc.py @@ -0,0 +1,12 @@ +from .__init__ import * + + +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 diff --git a/mathgenerator/funcs/DecimalToBinaryFunc.py b/mathgenerator/funcs/DecimalToBinaryFunc.py new file mode 100644 index 0000000..872e105 --- /dev/null +++ b/mathgenerator/funcs/DecimalToBinaryFunc.py @@ -0,0 +1,11 @@ +from .__init__ import * + + +def DecimalToBinaryFunc(max_dec=99): + a = random.randint(1, max_dec) + b = bin(a).replace("0b", "") + + problem = "Binary of " + str(a) + "=" + solution = str(b) + + return problem, solution diff --git a/mathgenerator/funcs/DiceSumProbFunc.py b/mathgenerator/funcs/DiceSumProbFunc.py new file mode 100644 index 0000000..8f05a4f --- /dev/null +++ b/mathgenerator/funcs/DiceSumProbFunc.py @@ -0,0 +1,26 @@ +from .__init__ import * + + +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) + return problem, solution diff --git a/mathgenerator/funcs/MidPointOfTwoPointFunc.py b/mathgenerator/funcs/MidPointOfTwoPointFunc.py new file mode 100644 index 0000000..f8cd8a1 --- /dev/null +++ b/mathgenerator/funcs/MidPointOfTwoPointFunc.py @@ -0,0 +1,12 @@ +from .__init__ import * + + +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 diff --git a/mathgenerator/funcs/__init__.py b/mathgenerator/funcs/__init__.py new file mode 100644 index 0000000..83702eb --- /dev/null +++ b/mathgenerator/funcs/__init__.py @@ -0,0 +1,86 @@ +import random +import math +import fractions + +from .addition import * +from .subtractionFunc import * +from .multiplicationFunc import * +from .divisionFunc import * +from .binaryComplement1sFunc import * +from .moduloFunc import * +from .squareRootFunc import * +from .powerRuleDifferentiationFunc import * +from .squareFunc import * +from .gcdFunc import * +from .lcmFunc import * +from .basicAlgebraFunc import * +from .logFunc import * +from .divisionToIntFunc import * +from .DecimalToBinaryFunc import * +from .BinaryToDecimalFunc import * +from .divideFractionsFunc import * +from .multiplyIntToMatrix22 import * +from .areaOfTriangleFunc import * +from .isTriangleValidFunc import * +from .MidPointOfTwoPointFunc import * +from .factoringFunc import * +from .thirdAngleOfTriangleFunc import * +from .systemOfEquationsFunc import * +from .distanceTwoPointsFunc import * +from .pythagoreanTheoremFunc import * +from .linearEquationsFunc import * +from .primeFactorsFunc import * +from .multiplyFractionsFunc import * +from .regularPolygonAngleFunc import * +from .combinationsFunc import * +from .factorialFunc import * +from .surfaceAreaCube import * +from .volumeCube import * +from .surfaceAreaCuboid import * +from .volumeCuboid import * +from .surfaceAreaCylinder import * +from .volumeCylinder import * +from .surfaceAreaCone import * +from .volumeCone import * +from .commonFactorsFunc import * +from .intersectionOfTwoLinesFunc import * +from .permutationFunc import * +from .vectorCrossFunc import * +from .compareFractionsFunc import * +from .simpleInterestFunc import * +from .matrixMultiplicationFunc import * +from .cubeRootFunc import * +from .powerRuleIntegrationFunc import * +from .fourthAngleOfQuadriFunc import * +from .quadraticEquation import * +from .hcfFunc import * +from .DiceSumProbFunc import * +from .exponentiationFunc import * +from .confidenceIntervalFunc import * +from .surdsComparisonFunc import * +from .fibonacciSeriesFunc import * +from .basicTrigonometryFunc import * +from .sumOfAnglesOfPolygonFunc import * +from .dataSummaryFunc import * +from .surfaceAreaSphere import * +from .volumeSphereFunc import * +from .nthFibonacciNumberFunc import * +from .profitLossPercentFunc import * +from .binaryToHexFunc import * +from .multiplyComplexNumbersFunc import * +from .geomProgrFunc import * +from .geometricMeanFunc import * +from .harmonicMeanFunc import * +from .euclidianNormFunc import * +from .angleBtwVectorsFunc import * +from .absoluteDifferenceFunc import * +from .vectorDotFunc import * +from .binary2sComplement import * +from .matrixInversion import * +from .sectorAreaFunc import * +from .meanMedianFunc import * +from .determinantToMatrix22 import * +from .compoundInterestFunc import * +from .deciToHexaFunc import * +from .percentageFunc import * +from .celsiustofahrenheit import * diff --git a/mathgenerator/funcs/absoluteDifferenceFunc.py b/mathgenerator/funcs/absoluteDifferenceFunc.py new file mode 100644 index 0000000..138c8de --- /dev/null +++ b/mathgenerator/funcs/absoluteDifferenceFunc.py @@ -0,0 +1,12 @@ +from .__init__ import * + + +def absoluteDifferenceFunc(maxA=100, maxB=100): + a = random.randint(-1 * maxA, maxA) + b = random.randint(-1 * maxB, maxB) + absDiff = abs(a - b) + + problem = "Absolute difference between numbers " + \ + str(a) + " and " + str(b) + " = " + solution = absDiff + return problem, solution diff --git a/mathgenerator/funcs/addition.py b/mathgenerator/funcs/addition.py new file mode 100644 index 0000000..df74496 --- /dev/null +++ b/mathgenerator/funcs/addition.py @@ -0,0 +1,15 @@ +from .__init__ import * +from ..__init__ import Generator + + +def additionFunc(maxSum=99, maxAddend=50): + a = random.randint(0, 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 + b = random.randint(0, min((maxSum - a), maxAddend)) + c = a + b + problem = str(a) + "+" + str(b) + "=" + solution = str(c) + return problem, solution + + +addition = Generator("Addition", 0, "a+b=", "c", additionFunc) diff --git a/mathgenerator/funcs/angleBtwVectorsFunc.py b/mathgenerator/funcs/angleBtwVectorsFunc.py new file mode 100644 index 0000000..bd2d0b5 --- /dev/null +++ b/mathgenerator/funcs/angleBtwVectorsFunc.py @@ -0,0 +1,16 @@ +from .euclidianNormFunc import euclidianNormFunc +import math +from .__init__ import * + + +def angleBtwVectorsFunc(v1: list, v2: list): + sum = 0 + for i in v1: + for j in v2: + sum += i * j + + mags = euclidianNormFunc(v1) * euclidianNormFunc(v2) + problem = f"angle between the vectors {v1} and {v2} is:" + solution = math.acos(sum / mags) + # would return the answer in radians + return problem, solution diff --git a/mathgenerator/funcs/areaOfTriangleFunc.py b/mathgenerator/funcs/areaOfTriangleFunc.py new file mode 100644 index 0000000..a795a99 --- /dev/null +++ b/mathgenerator/funcs/areaOfTriangleFunc.py @@ -0,0 +1,15 @@ +from .__init__ import * + + +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 diff --git a/mathgenerator/funcs/arithmeticProgressionSumFunc.py b/mathgenerator/funcs/arithmeticProgressionSumFunc.py new file mode 100644 index 0000000..ca2ada3 --- /dev/null +++ b/mathgenerator/funcs/arithmeticProgressionSumFunc.py @@ -0,0 +1,12 @@ +from .__init__ import * + +def arithmeticProgressionSumFunc (maxd = 100, maxa = 100, maxn = 100): + d = random.randint (-1 * maxd, maxd) + a1 = random.randint (-1 * maxa, maxa) + a2 = a1 + d + a3 = a2 + d + n = random.randint (4, maxn) + apString = str(a1) +', ' + str(a2) +', ' + str(a3) + ' ... ' + problem = 'Find the sum of first ' + str(n) + ' terms of the AP series: ' + apString + solution = n * ((2*a1) + ((n-1)*d))/2 + return problem, solution \ No newline at end of file diff --git a/mathgenerator/funcs/arithmeticProgressionTermFunc.py b/mathgenerator/funcs/arithmeticProgressionTermFunc.py new file mode 100644 index 0000000..f6662d5 --- /dev/null +++ b/mathgenerator/funcs/arithmeticProgressionTermFunc.py @@ -0,0 +1,12 @@ +from .__init__ import * + +def arithmeticProgressionTermFunc (maxd = 100, maxa = 100, maxn = 100): + d = random.randint (-1 * maxd, maxd) + a1 = random.randint (-1 * maxa, maxa) + a2 = a1 + d + a3 = a2 + d + n = random.randint (4, maxn) + apString = str(a1) +', ' + str(a2) +', ' + str(a3) + ' ... ' + problem = 'Find the term number ' + str(n) + ' of the AP series: ' + apString + solution = a1 + ((n-1)*d) + return problen, solution diff --git a/mathgenerator/funcs/basicAlgebraFunc.py b/mathgenerator/funcs/basicAlgebraFunc.py new file mode 100644 index 0000000..d11000d --- /dev/null +++ b/mathgenerator/funcs/basicAlgebraFunc.py @@ -0,0 +1,25 @@ +from .__init__ import * + + +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 + return x + + i = calculate_gcd((c - b), a) + x = f"{(c - b)//i}/{a//i}" + + if (c - b == 0): + x = "0" + elif a == 1 or a == i: + x = f"{c - b}" + + problem = f"{a}x + {b} = {c}" + solution = x + return problem, solution diff --git a/mathgenerator/funcs/basicTrigonometryFunc.py b/mathgenerator/funcs/basicTrigonometryFunc.py new file mode 100644 index 0000000..520b8a3 --- /dev/null +++ b/mathgenerator/funcs/basicTrigonometryFunc.py @@ -0,0 +1,25 @@ +from .__init__ import * + + +# 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) + + 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" + } + + solution = result_fraction_map[round(eval(expression), 2)] if round( + eval(expression), 2) <= 99999 else "∞" # for handling the ∞ condition + return problem, solution diff --git a/mathgenerator/funcs/binary2sComplement.py b/mathgenerator/funcs/binary2sComplement.py new file mode 100644 index 0000000..01af731 --- /dev/null +++ b/mathgenerator/funcs/binary2sComplement.py @@ -0,0 +1,28 @@ +from .__init__ import * + + +def binary2sComplementFunc(maxDigits=10): + digits = random.randint(1, maxDigits) + question = ''.join([str(random.randint(0, 1)) + for i in range(digits)]).lstrip('0') + + answer = [] + for i in question: + answer.append(str(int(not bool(int(i))))) + + carry = True + j = len(answer) - 1 + while j >= 0: + if answer[j] == '0': + answer[j] = '1' + carry = False + break + answer[j] = '0' + j -= 1 + + if j == 0 and carry is True: + answer.insert(0, '1') + + problem = "2's complement of " + question + " =" + solution = ''.join(answer).lstrip('0') + return problem, solution diff --git a/mathgenerator/funcs/binaryComplement1sFunc.py b/mathgenerator/funcs/binaryComplement1sFunc.py new file mode 100644 index 0000000..009feea --- /dev/null +++ b/mathgenerator/funcs/binaryComplement1sFunc.py @@ -0,0 +1,15 @@ +from .__init__ import * + + +def binaryComplement1sFunc(maxDigits=10): + question = '' + answer = '' + + for i in range(random.randint(1, maxDigits)): + temp = str(random.randint(0, 1)) + question += temp + answer += "0" if temp == "1" else "1" + + problem = question + "=" + solution = answer + return problem, solution diff --git a/mathgenerator/funcs/binaryToHexFunc.py b/mathgenerator/funcs/binaryToHexFunc.py new file mode 100644 index 0000000..f06fcfc --- /dev/null +++ b/mathgenerator/funcs/binaryToHexFunc.py @@ -0,0 +1,11 @@ +from .__init__ import * + + +def binaryToHexFunc(max_dig=10): + problem = '' + for i in range(random.randint(1, max_dig)): + temp = str(random.randint(0, 1)) + problem += temp + + solution = hex(int(problem, 2)) + return problem, solution diff --git a/mathgenerator/funcs/celsiustofahrenheit.py b/mathgenerator/funcs/celsiustofahrenheit.py new file mode 100644 index 0000000..0e66be8 --- /dev/null +++ b/mathgenerator/funcs/celsiustofahrenheit.py @@ -0,0 +1,14 @@ +from .__init__ import * +from ..__init__ import Generator + + +def celsiustofahrenheitFunc(maxTemp=100): + celsius = random.randint(-50, maxTemp) + fahrenheit = (celsius * (9 / 5)) + 32 + problem = "Convert " + str(celsius) + " degrees Celsius to degrees Fahrenheit =" + solution = str(fahrenheit) + return problem, solution + + +celsiustofahrenheit = Generator("Celsius To Fahrenheit", 81, + "(C +(9/5))+32=", "F", celsiustofahrenheitFunc) diff --git a/mathgenerator/funcs/combinationsFunc.py b/mathgenerator/funcs/combinationsFunc.py new file mode 100644 index 0000000..f213222 --- /dev/null +++ b/mathgenerator/funcs/combinationsFunc.py @@ -0,0 +1,19 @@ +from .__init__ import * + + +def combinationsFunc(maxlength=20): + def factorial(a): + d = 1 + for i in range(a): + a = (i + 1) * d + d = a + return d + + 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) + + return problem, solution diff --git a/mathgenerator/funcs/commonFactorsFunc.py b/mathgenerator/funcs/commonFactorsFunc.py new file mode 100644 index 0000000..82a0e3b --- /dev/null +++ b/mathgenerator/funcs/commonFactorsFunc.py @@ -0,0 +1,24 @@ +from .__init__ import * + + +def commonFactorsFunc(maxVal=100): + a = x = random.randint(1, maxVal) + b = y = random.randint(1, maxVal) + + if (x < y): + min = x + else: + min = y + + count = 0 + arr = [] + + for i in range(1, min + 1): + if (x % i == 0): + if (y % i == 0): + count = count + 1 + arr.append(i) + + problem = f"Common Factors of {a} and {b} = " + solution = arr + return problem, solution diff --git a/mathgenerator/funcs/compareFractionsFunc.py b/mathgenerator/funcs/compareFractionsFunc.py new file mode 100644 index 0000000..1c4072a --- /dev/null +++ b/mathgenerator/funcs/compareFractionsFunc.py @@ -0,0 +1,26 @@ +from .__init__ import * + + +def compareFractionsFunc(maxVal=10): + a = random.randint(1, maxVal) + b = random.randint(1, maxVal) + c = random.randint(1, maxVal) + d = random.randint(1, maxVal) + + while (a == b): + b = random.randint(1, maxVal) + while (c == d): + d = random.randint(1, maxVal) + + first = a / b + second = c / d + + if (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 diff --git a/mathgenerator/funcs/compoundInterestFunc.py b/mathgenerator/funcs/compoundInterestFunc.py new file mode 100644 index 0000000..7914828 --- /dev/null +++ b/mathgenerator/funcs/compoundInterestFunc.py @@ -0,0 +1,18 @@ +from .__init__ import * + + +def compoundInterestFunc(maxPrinciple=10000, + maxRate=10, + maxTime=10, + maxPeriod=10): + p = random.randint(100, maxPrinciple) + r = random.randint(1, maxRate) + t = random.randint(1, maxTime) + n = random.randint(1, maxPeriod) + A = p * ((1 + (r / (100 * n))**(n * t))) + problem = "Compound Interest for a principle amount of " + str( + p) + " dollars, " + str( + r) + "% rate of interest and for a time period of " + str( + t) + " compounded monthly is = " + solution = round(A, 2) + return problem, solution diff --git a/mathgenerator/funcs/confidenceIntervalFunc.py b/mathgenerator/funcs/confidenceIntervalFunc.py new file mode 100644 index 0000000..b631caf --- /dev/null +++ b/mathgenerator/funcs/confidenceIntervalFunc.py @@ -0,0 +1,31 @@ +from .__init__ import * + + +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] + lst_t = [1.282, 1.645, 1.960, 2.576] + + mean = 0 + sd = 0 + + for i in lst: + 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) + return problem, solution diff --git a/mathgenerator/funcs/cubeRootFunc.py b/mathgenerator/funcs/cubeRootFunc.py new file mode 100644 index 0000000..97b978d --- /dev/null +++ b/mathgenerator/funcs/cubeRootFunc.py @@ -0,0 +1,10 @@ +from .__init__ import * + + +def cubeRootFunc(minNo=1, maxNo=1000): + b = random.randint(minNo, maxNo) + a = b**(1 / 3) + + problem = "cuberoot of " + str(b) + " upto 2 decimal places is:" + solution = str(round(a, 2)) + return problem, solution diff --git a/mathgenerator/funcs/dataSummaryFunc.py b/mathgenerator/funcs/dataSummaryFunc.py new file mode 100644 index 0000000..1059b1f --- /dev/null +++ b/mathgenerator/funcs/dataSummaryFunc.py @@ -0,0 +1,28 @@ +from .__init__ import * + + +def dataSummaryFunc(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 + + # we're printing stuff here? + 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 diff --git a/mathgenerator/funcs/deciToHexaFunc.py b/mathgenerator/funcs/deciToHexaFunc.py new file mode 100644 index 0000000..5958dfa --- /dev/null +++ b/mathgenerator/funcs/deciToHexaFunc.py @@ -0,0 +1,10 @@ +from .__init__ import * + + +def deciToHexaFunc(max_dec=1000): + a = random.randint(0, max_dec) + b = hex(a) + problem = "Binary of " + str(a) + "=" + solution = str(b) + + return problem, solution diff --git a/mathgenerator/funcs/determinantToMatrix22.py b/mathgenerator/funcs/determinantToMatrix22.py new file mode 100644 index 0000000..33b4004 --- /dev/null +++ b/mathgenerator/funcs/determinantToMatrix22.py @@ -0,0 +1,13 @@ +from .__init__ import * + + +def determinantToMatrix22(maxMatrixVal=100): + a = random.randint(0, maxMatrixVal) + b = random.randint(0, maxMatrixVal) + c = random.randint(0, maxMatrixVal) + d = random.randint(0, maxMatrixVal) + + determinant = a * d - b * c + problem = f"Det([[{a}, {b}], [{c}, {d}]]) = " + solution = f" {determinant}" + return problem, solution diff --git a/mathgenerator/funcs/distanceTwoPointsFunc.py b/mathgenerator/funcs/distanceTwoPointsFunc.py new file mode 100644 index 0000000..9fa85c8 --- /dev/null +++ b/mathgenerator/funcs/distanceTwoPointsFunc.py @@ -0,0 +1,14 @@ +from .__init__ import * + + +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 diff --git a/mathgenerator/funcs/divideFractionsFunc.py b/mathgenerator/funcs/divideFractionsFunc.py new file mode 100644 index 0000000..970b28f --- /dev/null +++ b/mathgenerator/funcs/divideFractionsFunc.py @@ -0,0 +1,32 @@ +from .__init__ import * + + +def divideFractionsFunc(maxVal=10): + a = random.randint(1, maxVal) + b = random.randint(1, maxVal) + + while (a == b): + b = random.randint(1, maxVal) + + c = random.randint(1, maxVal) + 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 + return x + + tmp_n = a * d + tmp_d = b * c + + gcd = calculate_gcd(tmp_n, tmp_d) + x = f"{tmp_n//gcd}/{tmp_d//gcd}" + + if (tmp_d == 1 or tmp_d == gcd): + x = f"{tmp_n//gcd}" + # for equal numerator and denominators + problem = f"({a}/{b})/({c}/{d})" + solution = x + return problem, solution diff --git a/mathgenerator/funcs/divisionFunc.py b/mathgenerator/funcs/divisionFunc.py new file mode 100644 index 0000000..930e34b --- /dev/null +++ b/mathgenerator/funcs/divisionFunc.py @@ -0,0 +1,11 @@ +from .__init__ import * + + +def divisionFunc(maxRes=99, maxDivid=99): + a = random.randint(0, maxDivid) + b = random.randint(0, min(maxRes, maxDivid)) + c = a / b + + problem = str(a) + "/" + str(b) + "=" + solution = str(c) + return problem, solution diff --git a/mathgenerator/funcs/divisionToIntFunc.py b/mathgenerator/funcs/divisionToIntFunc.py new file mode 100644 index 0000000..fcc62f5 --- /dev/null +++ b/mathgenerator/funcs/divisionToIntFunc.py @@ -0,0 +1,13 @@ +from .__init__ import * + + +def divisionToIntFunc(maxA=25, maxB=25): + 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 diff --git a/mathgenerator/funcs/euclidianNormFunc.py b/mathgenerator/funcs/euclidianNormFunc.py new file mode 100644 index 0000000..f66329e --- /dev/null +++ b/mathgenerator/funcs/euclidianNormFunc.py @@ -0,0 +1,7 @@ +from .__init__ import * + + +def euclidianNormFunc(v1: list): + problem = f"Euclidian norm or L2 norm of the vector{v1} is:" + solution = sqrt(sum([i**2 for i in v1])) + return problem, solution diff --git a/mathgenerator/funcs/exponentiationFunc.py b/mathgenerator/funcs/exponentiationFunc.py new file mode 100644 index 0000000..a74f378 --- /dev/null +++ b/mathgenerator/funcs/exponentiationFunc.py @@ -0,0 +1,10 @@ +from .__init__ import * + + +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 diff --git a/mathgenerator/funcs/factorialFunc.py b/mathgenerator/funcs/factorialFunc.py new file mode 100644 index 0000000..71dc3a2 --- /dev/null +++ b/mathgenerator/funcs/factorialFunc.py @@ -0,0 +1,15 @@ +from .__init__ import * + + +def factorialFunc(maxInput=6): + a = random.randint(0, maxInput) + n = a + + problem = str(a) + "! = " + b = 1 + + while a != 1 and n > 0: + b *= n + n -= 1 + solution = str(b) + return problem, solution diff --git a/mathgenerator/funcs/factoringFunc.py b/mathgenerator/funcs/factoringFunc.py new file mode 100644 index 0000000..1cb43c0 --- /dev/null +++ b/mathgenerator/funcs/factoringFunc.py @@ -0,0 +1,29 @@ +from .__init__ import * + + +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 diff --git a/mathgenerator/funcs/fibonacciSeriesFunc.py b/mathgenerator/funcs/fibonacciSeriesFunc.py new file mode 100644 index 0000000..60391cb --- /dev/null +++ b/mathgenerator/funcs/fibonacciSeriesFunc.py @@ -0,0 +1,21 @@ +from .__init__ import * + + +def fibonacciSeriesFunc(minNo=1): + n = random.randint(minNo, 20) + + def createFibList(n): + list = [] + for i in range(n): + if i < 2: + list.append(i) + else: + val = list[i - 1] + list[i - 2] + list.append(val) + return list + + fibList = createFibList(n) + + problem = "The Fibonacci Series of the first " + str(n) + " numbers is ?" + solution = fibList + return problem, solution diff --git a/mathgenerator/funcs/fourthAngleOfQuadriFunc.py b/mathgenerator/funcs/fourthAngleOfQuadriFunc.py new file mode 100644 index 0000000..59a05c4 --- /dev/null +++ b/mathgenerator/funcs/fourthAngleOfQuadriFunc.py @@ -0,0 +1,14 @@ +from .__init__ import * + + +def fourthAngleOfQuadriFunc(maxAngle=180): + angle1 = random.randint(1, maxAngle) + 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 diff --git a/mathgenerator/funcs/gcdFunc.py b/mathgenerator/funcs/gcdFunc.py new file mode 100644 index 0000000..505c7fb --- /dev/null +++ b/mathgenerator/funcs/gcdFunc.py @@ -0,0 +1,12 @@ +from .__init__ import * + + +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 + problem = f"GCD of {a} and {b} = " + solution = str(x) + return problem, solution diff --git a/mathgenerator/funcs/geomProgrFunc.py b/mathgenerator/funcs/geomProgrFunc.py new file mode 100644 index 0000000..7c80a7e --- /dev/null +++ b/mathgenerator/funcs/geomProgrFunc.py @@ -0,0 +1,23 @@ +from .__init__ import * + + +def geomProgrFunc(number_values=6, + min_value=2, + max_value=12, + n_term=7, + sum_term=5): + r = random.randint(min_value, max_value) + a = random.randint(min_value, max_value) + n_term = random.randint(number_values, number_values + 5) + sum_term = random.randint(number_values, number_values + 5) + GP = [] + for i in range(number_values): + GP.append(a * (r**i)) + problem = "For the given GP " + str( + GP) + " ,Find the value of a,common ratio," + str( + n_term) + "th term value, sum upto " + str(sum_term) + "th term" + value_nth_term = a * (r**(n_term - 1)) + sum_till_nth_term = a * ((r**sum_term - 1) / (r - 1)) + solution = "The value of a is {}, common ratio is {} , {}th term is {} , sum upto {}th term is {}".format( + a, r, n_term, value_nth_term, sum_term, sum_till_nth_term) + return problem, solution diff --git a/mathgenerator/funcs/geometricMeanFunc.py b/mathgenerator/funcs/geometricMeanFunc.py new file mode 100644 index 0000000..0980979 --- /dev/null +++ b/mathgenerator/funcs/geometricMeanFunc.py @@ -0,0 +1,27 @@ +from .__init__ import * + + +def geometricMeanFunc(maxValue=100, maxNum=4): + a = random.randint(1, maxValue) + b = random.randint(1, maxValue) + c = random.randint(1, maxValue) + d = random.randint(1, maxValue) + num = random.randint(2, 4) + if num == 2: + product = a * b + elif num == 3: + product = a * b * c + elif num == 4: + product = a * b * c * d + + ans = product**(1 / num) + if num == 2: + problem = f"Geometric mean of {num} numbers {a} and {b} = " + solution = f"({a}*{b})^(1/{num}) = {ans}" + elif num == 3: + problem = f"Geometric mean of {num} numbers {a} , {b} and {c} = " + solution = f"({a}*{b}*{c})^(1/{num}) = {ans}" + elif num == 4: + problem = f"Geometric mean of {num} numbers {a} , {b} , {c} , {d} = " + solution = f"({a}*{b}*{c}*{d})^(1/{num}) = {ans}" + return problem, solution diff --git a/mathgenerator/funcs/harmonicMeanFunc.py b/mathgenerator/funcs/harmonicMeanFunc.py new file mode 100644 index 0000000..8aefb41 --- /dev/null +++ b/mathgenerator/funcs/harmonicMeanFunc.py @@ -0,0 +1,28 @@ +from .__init__ import * + + +def harmonicMeanFunc(maxValue=100, maxNum=4): + + a = random.randint(1, maxValue) + b = random.randint(1, maxValue) + c = random.randint(1, maxValue) + d = random.randint(1, maxValue) + num = random.randint(2, 4) + if num == 2: + sum = (1 / a) + (1 / b) + elif num == 3: + sum = (1 / a) + (1 / b) + (1 / c) + elif num == 4: + sum = (1 / a) + (1 / b) + (1 / c) + (1 / d) + + ans = num / sum + if num == 2: + problem = f"Harmonic mean of {num} numbers {a} and {b} = " + solution = f" {num}/((1/{a}) + (1/{b})) = {ans}" + elif num == 3: + problem = f"Harmonic mean of {num} numbers {a} , {b} and {c} = " + solution = f" {num}/((1/{a}) + (1/{b}) + (1/{c})) = {ans}" + elif num == 4: + problem = f"Harmonic mean of {num} numbers {a} , {b} , {c} , {d} = " + solution = f" {num}/((1/{a}) + (1/{b}) + (1/{c}) + (1/{d})) = {ans}" + return problem, solution diff --git a/mathgenerator/funcs/hcfFunc.py b/mathgenerator/funcs/hcfFunc.py new file mode 100644 index 0000000..047fb0c --- /dev/null +++ b/mathgenerator/funcs/hcfFunc.py @@ -0,0 +1,12 @@ +from .__init__ import * + + +def hcfFunc(maxVal=20): + a = random.randint(1, maxVal) + b = random.randint(1, maxVal) + x, y = a, b + while (y): + x, y = y, x % y + problem = f"HCF of {a} and {b} = " + solution = str(x) + return problem, solution diff --git a/mathgenerator/funcs/intersectionOfTwoLinesFunc.py b/mathgenerator/funcs/intersectionOfTwoLinesFunc.py new file mode 100644 index 0000000..eda508e --- /dev/null +++ b/mathgenerator/funcs/intersectionOfTwoLinesFunc.py @@ -0,0 +1,66 @@ +from .__init__ import * + + +def intersectionOfTwoLinesFunc(minM=-10, + maxM=10, + minB=-10, + maxB=10, + minDenominator=1, + maxDenominator=6): + def generateEquationString(m, b): + """ + Generates an equation given the slope and intercept. + It handles cases where m is fractional. + It also ensures that we don't have weird signs such as y = mx + -b. + """ + if m[1] == 1: + m = m[0] + else: + m = f"{m[0]}/{m[1]}" + base = f"y = {m}x" + if b > 0: + return f"{base} + {b}" + elif b < 0: + return f"{base} - {b * -1}" + else: + return base + + def fractionToString(x): + """ + Converts the given fractions.Fraction into a string. + """ + if x.denominator == 1: + x = x.numerator + 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) + b2 = random.randint(minB, maxB) + + equation1 = generateEquationString(m1, b1) + equation2 = generateEquationString(m2, b2) + + problem = "Find the point of intersection of the two lines: " + problem += f"{equation1} and {equation2}" + + m1 = fractions.Fraction(*m1) + m2 = fractions.Fraction(*m2) + # if m1 == m2 then the slopes are equal + # This can happen if both line are the same + # Or if they are parallel + # In either case there is no intersection + + if m1 == m2: + solution = "No Solution" + else: + intersection_x = (b1 - b2) / (m2 - m1) + intersection_y = ((m2 * b1) - (m1 * b2)) / (m2 - m1) + solution = f"({fractionToString(intersection_x)}, {fractionToString(intersection_y)})" + + return problem, solution diff --git a/mathgenerator/funcs/isTriangleValidFunc.py b/mathgenerator/funcs/isTriangleValidFunc.py new file mode 100644 index 0000000..13c7240 --- /dev/null +++ b/mathgenerator/funcs/isTriangleValidFunc.py @@ -0,0 +1,20 @@ +from .__init__ import * + + +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]) + problem = f"Does triangle with sides {sideA}, {sideB} and {sideC} exist?" + + if exists: + solution = "Yes" + return problem, solution + solution = "No" + return problem, solution diff --git a/mathgenerator/funcs/lcmFunc.py b/mathgenerator/funcs/lcmFunc.py new file mode 100644 index 0000000..32e1868 --- /dev/null +++ b/mathgenerator/funcs/lcmFunc.py @@ -0,0 +1,17 @@ +from .__init__ import * + + +def lcmFunc(maxVal=20): + a = random.randint(1, maxVal) + b = random.randint(1, maxVal) + c = a * b + x, y = a, b + + while y: + x, y = y, x % y + d = c // x + + problem = f"LCM of {a} and {b} =" + solution = str(d) + + return problem, solution diff --git a/mathgenerator/funcs/linearEquationsFunc.py b/mathgenerator/funcs/linearEquationsFunc.py new file mode 100644 index 0000000..e2eeb26 --- /dev/null +++ b/mathgenerator/funcs/linearEquationsFunc.py @@ -0,0 +1,29 @@ +from .__init__ import * + + +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)] + 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)]) + 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 diff --git a/mathgenerator/funcs/logFunc.py b/mathgenerator/funcs/logFunc.py new file mode 100644 index 0000000..6fc651b --- /dev/null +++ b/mathgenerator/funcs/logFunc.py @@ -0,0 +1,12 @@ +from .__init__ import * + + +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) + ")" + solution = str(a) + + return problem, solution diff --git a/mathgenerator/funcs/matrixInversion.py b/mathgenerator/funcs/matrixInversion.py new file mode 100644 index 0000000..72c01ca --- /dev/null +++ b/mathgenerator/funcs/matrixInversion.py @@ -0,0 +1,78 @@ +from .__init__ import * +import sympy + + +def matrixInversion(SquareMatrixDimension=3, + MaxMatrixElement=99, + OnlyIntegerElementsInInvertedMatrix=False): + if OnlyIntegerElementsInInvertedMatrix is True: + isItOk = False + Mat = list() + while (isItOk is False): + Mat = list() + for i in range(0, SquareMatrixDimension): + z = list() + for j in range(0, SquareMatrixDimension): + z.append(0) + z[i] = 1 + Mat.append(z) + MaxAllowedMatrixElement = math.ceil( + pow(MaxMatrixElement, 1 / (SquareMatrixDimension))) + randomlist = random.sample(range(0, MaxAllowedMatrixElement + 1), + SquareMatrixDimension) + + for i in range(0, SquareMatrixDimension): + if i == SquareMatrixDimension - 1: + Mat[0] = [ + j + (k * randomlist[i]) + for j, k in zip(Mat[0], Mat[i]) + ] + else: + Mat[i + 1] = [ + j + (k * randomlist[i]) + for j, k in zip(Mat[i + 1], Mat[i]) + ] + + for i in range(1, SquareMatrixDimension - 1): + Mat[i] = [ + sum(i) for i in zip(Mat[SquareMatrixDimension - 1], Mat[i]) + ] + + isItOk = True + for i in Mat: + for j in i: + if j > MaxMatrixElement: + isItOk = False + break + if isItOk is False: + break + + random.shuffle(Mat) + Mat = sympy.Matrix(Mat) + Mat = sympy.Matrix.transpose(Mat) + Mat = Mat.tolist() + random.shuffle(Mat) + Mat = sympy.Matrix(Mat) + Mat = sympy.Matrix.transpose(Mat) + + else: + randomlist = list(sympy.primerange(0, MaxMatrixElement + 1)) + plist = random.sample(randomlist, SquareMatrixDimension) + randomlist = random.sample( + range(0, MaxMatrixElement + 1), + SquareMatrixDimension * SquareMatrixDimension) + randomlist = list(set(randomlist) - set(plist)) + n_list = random.sample( + randomlist, SquareMatrixDimension * (SquareMatrixDimension - 1)) + Mat = list() + for i in range(0, SquareMatrixDimension): + z = list() + z.append(plist[i]) + for j in range(0, SquareMatrixDimension - 1): + z.append(n_list[(i * SquareMatrixDimension) + j - i]) + random.shuffle(z) + Mat.append(z) + Mat = sympy.Matrix(Mat) + problem = 'Inverse of Matrix ' + str(Mat) + ' is:' + solution = str(sympy.Matrix.inv(Mat)) + return problem, solution diff --git a/mathgenerator/funcs/matrixMultiplicationFunc.py b/mathgenerator/funcs/matrixMultiplicationFunc.py new file mode 100644 index 0000000..e2e382f --- /dev/null +++ b/mathgenerator/funcs/matrixMultiplicationFunc.py @@ -0,0 +1,53 @@ +from .__init__ import * + + +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 = [] + for r in range(m): + a.append([]) + for c in range(n): + 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) + + for r in range(m): + res.append([]) + + for c in range(k): + temp = 0 + + for t in range(n): + temp += a[r][t] * b[t][c] + res[r].append(temp) + + # 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 + + +def matrixMultiplicationFuncHelper(inp): + 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 += ", " if j < n - 1 else "" + string += "]\n [" if i < m - 1 else "" + string += "]]" + + return string diff --git a/mathgenerator/funcs/meanMedianFunc.py b/mathgenerator/funcs/meanMedianFunc.py new file mode 100644 index 0000000..4b17846 --- /dev/null +++ b/mathgenerator/funcs/meanMedianFunc.py @@ -0,0 +1,14 @@ +from .__init__ import * + + +def meanMedianFunc(maxlen=10): + randomlist = random.sample(range(1, 99), maxlen) + total = 0 + for n in randomlist: + total = total + n + mean = total / 10 + problem = f"Given the series of numbers {randomlist}. find the arithmatic mean and mdian of the series" + randomlist.sort() + median = (randomlist[4] + randomlist[5]) / 2 + solution = f"Arithmetic mean of the series is {mean} and Arithmetic median of this series is {median}" + return problem, solution diff --git a/mathgenerator/funcs/moduloFunc.py b/mathgenerator/funcs/moduloFunc.py new file mode 100644 index 0000000..2a447c4 --- /dev/null +++ b/mathgenerator/funcs/moduloFunc.py @@ -0,0 +1,11 @@ +from .__init__ import * + + +def moduloFunc(maxRes=99, maxModulo=99): + a = random.randint(0, maxModulo) + b = random.randint(0, min(maxRes, maxModulo)) + c = a % b if b != 0 else 0 + + problem = str(a) + "%" + str(b) + "=" + solution = str(c) + return problem, solution diff --git a/mathgenerator/funcs/multiplicationFunc.py b/mathgenerator/funcs/multiplicationFunc.py new file mode 100644 index 0000000..8ad25f6 --- /dev/null +++ b/mathgenerator/funcs/multiplicationFunc.py @@ -0,0 +1,11 @@ +from .__init__ import * + + +def multiplicationFunc(maxRes=99, maxMulti=99): + a = random.randint(0, maxMulti) + b = random.randint(0, min(int(maxMulti / a), maxRes)) + c = a * b + + problem = str(a) + "*" + str(b) + "=" + solution = str(c) + return problem, solution diff --git a/mathgenerator/funcs/multiplyComplexNumbersFunc.py b/mathgenerator/funcs/multiplyComplexNumbersFunc.py new file mode 100644 index 0000000..f1842c2 --- /dev/null +++ b/mathgenerator/funcs/multiplyComplexNumbersFunc.py @@ -0,0 +1,12 @@ +from .__init__ import * + + +def multiplyComplexNumbersFunc(minRealImaginaryNum=-20, + maxRealImaginaryNum=20): + num1 = complex(random.randint(minRealImaginaryNum, maxRealImaginaryNum), + random.randint(minRealImaginaryNum, maxRealImaginaryNum)) + num2 = complex(random.randint(minRealImaginaryNum, maxRealImaginaryNum), + random.randint(minRealImaginaryNum, maxRealImaginaryNum)) + problem = f"{num1} * {num2} = " + solution = num1 * num2 + return problem, solution diff --git a/mathgenerator/funcs/multiplyFractionsFunc.py b/mathgenerator/funcs/multiplyFractionsFunc.py new file mode 100644 index 0000000..1ec38bb --- /dev/null +++ b/mathgenerator/funcs/multiplyFractionsFunc.py @@ -0,0 +1,32 @@ +from .__init__ import * + + +def multiplyFractionsFunc(maxVal=10): + a = random.randint(1, maxVal) + b = random.randint(1, maxVal) + c = random.randint(1, maxVal) + d = random.randint(1, maxVal) + + while (a == b): + 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 + return x + + tmp_n = a * c + tmp_d = b * d + + gcd = calculate_gcd(tmp_n, tmp_d) + x = f"{tmp_n//gcd}/{tmp_d//gcd}" + + if (tmp_d == 1 or tmp_d == gcd): + x = f"{tmp_n//gcd}" + + problem = f"({a}/{b})*({c}/{d})" + solution = x + return problem, solution diff --git a/mathgenerator/funcs/multiplyIntToMatrix22.py b/mathgenerator/funcs/multiplyIntToMatrix22.py new file mode 100644 index 0000000..7808afe --- /dev/null +++ b/mathgenerator/funcs/multiplyIntToMatrix22.py @@ -0,0 +1,13 @@ +from .__init__ import * + + +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))) + problem = f"{constant} * [[{a}, {b}], [{c}, {d}]] = " + solution = f"[[{a*constant},{b*constant}],[{c*constant},{d*constant}]]" + return problem, solution diff --git a/mathgenerator/funcs/nthFibonacciNumberFunc.py b/mathgenerator/funcs/nthFibonacciNumberFunc.py new file mode 100644 index 0000000..b7475ee --- /dev/null +++ b/mathgenerator/funcs/nthFibonacciNumberFunc.py @@ -0,0 +1,10 @@ +from .__init__ import * + + +def nthFibonacciNumberFunc(maxN=100): + golden_ratio = (1 + math.sqrt(5)) / 2 + n = random.randint(1, maxN) + problem = f"What is the {n}th Fibonacci number?" + ans = round((math.pow(golden_ratio, n) - math.pow(-golden_ratio, -n)) / (math.sqrt(5))) + solution = f"{ans}" + return problem, solution diff --git a/mathgenerator/funcs/percentageFunc.py b/mathgenerator/funcs/percentageFunc.py new file mode 100644 index 0000000..f064f2a --- /dev/null +++ b/mathgenerator/funcs/percentageFunc.py @@ -0,0 +1,11 @@ +from .__init__ import * + + +def percentageFunc(maxValue=99, maxpercentage=99): + a = random.randint(1, maxpercentage) + b = random.randint(1, maxValue) + problem = f"What is {a}% of {b}?" + percentage = a / 100 * b + formatted_float = "{:.2f}".format(percentage) + solution = f"Required percentage = {formatted_float}%" + return problem, solution diff --git a/mathgenerator/funcs/permutationFunc.py b/mathgenerator/funcs/permutationFunc.py new file mode 100644 index 0000000..c62841f --- /dev/null +++ b/mathgenerator/funcs/permutationFunc.py @@ -0,0 +1,11 @@ +from .__init__ import * + + +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) + return problem, solution diff --git a/mathgenerator/funcs/powerRuleDifferentiationFunc.py b/mathgenerator/funcs/powerRuleDifferentiationFunc.py new file mode 100644 index 0000000..a14bd90 --- /dev/null +++ b/mathgenerator/funcs/powerRuleDifferentiationFunc.py @@ -0,0 +1,18 @@ +from .__init__ import * + + +def powerRuleDifferentiationFunc(maxCoef=10, maxExp=10, maxTerms=5): + numTerms = random.randint(1, maxTerms) + problem = "" + solution = "" + + for i in range(numTerms): + if i > 0: + problem += " + " + solution += " + " + coefficient = random.randint(1, maxCoef) + exponent = random.randint(1, maxExp) + + problem += str(coefficient) + "x^" + str(exponent) + solution += str(coefficient * exponent) + "x^" + str(exponent - 1) + return problem, solution diff --git a/mathgenerator/funcs/powerRuleIntegrationFunc.py b/mathgenerator/funcs/powerRuleIntegrationFunc.py new file mode 100644 index 0000000..fb1f62d --- /dev/null +++ b/mathgenerator/funcs/powerRuleIntegrationFunc.py @@ -0,0 +1,21 @@ +from .__init__ import * + + +def powerRuleIntegrationFunc(maxCoef=10, maxExp=10, maxTerms=5): + numTerms = random.randint(1, maxTerms) + problem = "" + solution = "" + + for i in range(numTerms): + if i > 0: + problem += " + " + solution += " + " + 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 += " + c" + return problem, solution diff --git a/mathgenerator/funcs/primeFactorsFunc.py b/mathgenerator/funcs/primeFactorsFunc.py new file mode 100644 index 0000000..852821c --- /dev/null +++ b/mathgenerator/funcs/primeFactorsFunc.py @@ -0,0 +1,22 @@ +from .__init__ import * + + +def primeFactorsFunc(minVal=1, maxVal=200): + a = random.randint(minVal, maxVal) + n = a + i = 2 + factors = [] + + while i * i <= n: + if n % i: + i += 1 + else: + n //= i + factors.append(i) + + if n > 1: + factors.append(n) + + problem = f"Find prime factors of {a}" + solution = f"{factors}" + return problem, solution diff --git a/mathgenerator/funcs/profitLossPercentFunc.py b/mathgenerator/funcs/profitLossPercentFunc.py new file mode 100644 index 0000000..da99f94 --- /dev/null +++ b/mathgenerator/funcs/profitLossPercentFunc.py @@ -0,0 +1,16 @@ +from .__init__ import * + + +def profitLossPercentFunc(maxCP=1000, maxSP=1000): + cP = random.randint(1, maxCP) + sP = random.randint(1, maxSP) + diff = abs(sP - cP) + if (sP - cP >= 0): + profitOrLoss = "Profit" + else: + profitOrLoss = "Loss" + percent = diff / cP * 100 + problem = f"{profitOrLoss} percent when CP = {cP} and SP = {sP} is: " + solution = percent + + return problem, solution diff --git a/mathgenerator/funcs/pythagoreanTheoremFunc.py b/mathgenerator/funcs/pythagoreanTheoremFunc.py new file mode 100644 index 0000000..17bcd82 --- /dev/null +++ b/mathgenerator/funcs/pythagoreanTheoremFunc.py @@ -0,0 +1,11 @@ +from .__init__ import * + + +def pythagoreanTheoremFunc(maxLength=20): + a = random.randint(1, maxLength) + b = random.randint(1, maxLength) + c = (a**2 + b**2)**0.5 + + problem = f"The hypotenuse of a right triangle given the other two lengths {a} and {b} = " + solution = f"{c:.0f}" if c.is_integer() else f"{c:.2f}" + return problem, solution diff --git a/mathgenerator/funcs/quadraticEquation.py b/mathgenerator/funcs/quadraticEquation.py new file mode 100644 index 0000000..7f784fc --- /dev/null +++ b/mathgenerator/funcs/quadraticEquation.py @@ -0,0 +1,15 @@ +from .__init__ import * + + +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 diff --git a/mathgenerator/funcs/regularPolygonAngleFunc.py b/mathgenerator/funcs/regularPolygonAngleFunc.py new file mode 100644 index 0000000..5275bef --- /dev/null +++ b/mathgenerator/funcs/regularPolygonAngleFunc.py @@ -0,0 +1,10 @@ +from .__init__ import * + + +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) + solution = 180 - exteriorAngle + return problem, solution diff --git a/mathgenerator/funcs/sectorAreaFunc.py b/mathgenerator/funcs/sectorAreaFunc.py new file mode 100644 index 0000000..c2ab0bf --- /dev/null +++ b/mathgenerator/funcs/sectorAreaFunc.py @@ -0,0 +1,11 @@ +from .__init__ import * + + +def sectorAreaFunc(maxRadius=49, maxAngle=359): + Radius = random.randint(1, maxRadius) + Angle = random.randint(1, maxAngle) + problem = f"Given radius, {Radius} and angle, {Angle}. Find the area of the sector." + secArea = float((Angle / 360) * math.pi * Radius * Radius) + formatted_float = "{:.5f}".format(secArea) + solution = f"Area of sector = {formatted_float}" + return problem, solution diff --git a/mathgenerator/funcs/simpleInterestFunc.py b/mathgenerator/funcs/simpleInterestFunc.py new file mode 100644 index 0000000..30ca938 --- /dev/null +++ b/mathgenerator/funcs/simpleInterestFunc.py @@ -0,0 +1,15 @@ +from .__init__ import * + + +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 diff --git a/mathgenerator/funcs/squareFunc.py b/mathgenerator/funcs/squareFunc.py new file mode 100644 index 0000000..1d159dc --- /dev/null +++ b/mathgenerator/funcs/squareFunc.py @@ -0,0 +1,10 @@ +from .__init__ import * + + +def squareFunc(maxSquareNum=20): + a = random.randint(1, maxSquareNum) + b = a * a + + problem = str(a) + "^2" + "=" + solution = str(b) + return problem, solution diff --git a/mathgenerator/funcs/squareRootFunc.py b/mathgenerator/funcs/squareRootFunc.py new file mode 100644 index 0000000..e5d2418 --- /dev/null +++ b/mathgenerator/funcs/squareRootFunc.py @@ -0,0 +1,10 @@ +from .__init__ import * + + +def squareRootFunc(minNo=1, maxNo=12): + b = random.randint(minNo, maxNo) + a = b * b + + problem = "sqrt(" + str(a) + ")=" + solution = str(b) + return problem, solution diff --git a/mathgenerator/funcs/subtractionFunc.py b/mathgenerator/funcs/subtractionFunc.py new file mode 100644 index 0000000..a50537e --- /dev/null +++ b/mathgenerator/funcs/subtractionFunc.py @@ -0,0 +1,11 @@ +from .__init__ import * + + +def subtractionFunc(maxMinuend=99, maxDiff=99): + a = random.randint(0, maxMinuend) + b = random.randint(max(0, (a - maxDiff)), a) + c = a - b + + problem = str(a) + "-" + str(b) + "=" + solution = str(c) + return problem, solution diff --git a/mathgenerator/funcs/sumOfAnglesOfPolygonFunc.py b/mathgenerator/funcs/sumOfAnglesOfPolygonFunc.py new file mode 100644 index 0000000..8338698 --- /dev/null +++ b/mathgenerator/funcs/sumOfAnglesOfPolygonFunc.py @@ -0,0 +1,10 @@ +from .__init__ import * + + +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 diff --git a/mathgenerator/funcs/surdsComparisonFunc.py b/mathgenerator/funcs/surdsComparisonFunc.py new file mode 100644 index 0000000..e005d3f --- /dev/null +++ b/mathgenerator/funcs/surdsComparisonFunc.py @@ -0,0 +1,17 @@ +from .__init__ import * + + +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) + + solution = "=" + if first > second: + solution = ">" + elif first < second: + solution = "<" + return problem, solution diff --git a/mathgenerator/funcs/surfaceAreaCone.py b/mathgenerator/funcs/surfaceAreaCone.py new file mode 100644 index 0000000..53799aa --- /dev/null +++ b/mathgenerator/funcs/surfaceAreaCone.py @@ -0,0 +1,13 @@ +from .__init__ import * + + +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) + problem = f"Surface area of cone with height = {a}{unit} and radius = {b}{unit} is" + ans = int(math.pi * b * slopingHeight + math.pi * b * b) + + solution = f"{ans} {unit}^2" + return problem, solution diff --git a/mathgenerator/funcs/surfaceAreaCube.py b/mathgenerator/funcs/surfaceAreaCube.py new file mode 100644 index 0000000..9f9d07f --- /dev/null +++ b/mathgenerator/funcs/surfaceAreaCube.py @@ -0,0 +1,9 @@ +from .__init__ import * + + +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 diff --git a/mathgenerator/funcs/surfaceAreaCuboid.py b/mathgenerator/funcs/surfaceAreaCuboid.py new file mode 100644 index 0000000..95fee71 --- /dev/null +++ b/mathgenerator/funcs/surfaceAreaCuboid.py @@ -0,0 +1,12 @@ +from .__init__ import * + + +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) + solution = f"{ans} {unit}^2" + return problem, solution diff --git a/mathgenerator/funcs/surfaceAreaCylinder.py b/mathgenerator/funcs/surfaceAreaCylinder.py new file mode 100644 index 0000000..eacc0be --- /dev/null +++ b/mathgenerator/funcs/surfaceAreaCylinder.py @@ -0,0 +1,11 @@ +from .__init__ import * + + +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" + ans = int(2 * math.pi * a * b + 2 * math.pi * b * b) + solution = f"{ans} {unit}^2" + return problem, solution diff --git a/mathgenerator/funcs/surfaceAreaSphere.py b/mathgenerator/funcs/surfaceAreaSphere.py new file mode 100644 index 0000000..6b9110d --- /dev/null +++ b/mathgenerator/funcs/surfaceAreaSphere.py @@ -0,0 +1,10 @@ +from .__init__ import * + + +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 diff --git a/mathgenerator/funcs/systemOfEquationsFunc.py b/mathgenerator/funcs/systemOfEquationsFunc.py new file mode 100644 index 0000000..ef63c73 --- /dev/null +++ b/mathgenerator/funcs/systemOfEquationsFunc.py @@ -0,0 +1,47 @@ +from .__init__ import * + + +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) + # Start from reduced echelon form (coeffs 1) + c1 = [1, 0, x] + c2 = [0, 1, y] + + def randNonZero(): + return random.choice( + [i for i in range(-coeff_mult_range, coeff_mult_range) if i != 0]) + + # Add random (non-zero) multiple of equations (rows) to each other + c1_mult = randNonZero() + c2_mult = randNonZero() + new_c1 = [c1[i] + c1_mult * c2[i] for i in range(len(c1))] + new_c2 = [c2[i] + c2_mult * c1[i] for i in range(len(c2))] + # For extra randomness, now add random (non-zero) multiples of original rows + # to themselves + c1_mult = randNonZero() + c2_mult = randNonZero() + new_c1 = [new_c1[i] + c1_mult * c1[i] for i in range(len(c1))] + new_c2 = [new_c2[i] + c2_mult * c2[i] for i in range(len(c2))] + + def coeffToFuncString(coeffs): + # lots of edge cases for perfect formatting! + x_sign = '-' if coeffs[0] < 0 else '' + # No redundant 1s + x_coeff = str(abs(coeffs[0])) if abs(coeffs[0]) != 1 else '' + # If x coeff is 0, dont include x + x_str = f'{x_sign}{x_coeff}x' if coeffs[0] != 0 else '' + # if x isn't included and y is positive, dont include operator + op = ' - ' if coeffs[1] < 0 else (' + ' if x_str != '' else '') + # 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') + return f'{x_str}{op}{y_str} = {coeffs[2]}' + + problem = f"{coeffToFuncString(new_c1)}, {coeffToFuncString(new_c2)}" + solution = f"x = {x}, y = {y}" + return problem, solution + # Add random (non-zero) multiple of equations to each other diff --git a/mathgenerator/funcs/thirdAngleOfTriangleFunc.py b/mathgenerator/funcs/thirdAngleOfTriangleFunc.py new file mode 100644 index 0000000..5268ceb --- /dev/null +++ b/mathgenerator/funcs/thirdAngleOfTriangleFunc.py @@ -0,0 +1,11 @@ +from .__init__ import * + + +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 diff --git a/mathgenerator/funcs/vectorCrossFunc.py b/mathgenerator/funcs/vectorCrossFunc.py new file mode 100644 index 0000000..7506283 --- /dev/null +++ b/mathgenerator/funcs/vectorCrossFunc.py @@ -0,0 +1,14 @@ +from .__init__ import * + + +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] + ] + + problem = str(a) + " X " + str(b) + " = " + solution = str(c) + return problem, solution diff --git a/mathgenerator/funcs/vectorDotFunc.py b/mathgenerator/funcs/vectorDotFunc.py new file mode 100644 index 0000000..011beb3 --- /dev/null +++ b/mathgenerator/funcs/vectorDotFunc.py @@ -0,0 +1,11 @@ +from .__init__ import * + + +def vectorDotFunc(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[0] * b[0] + a[1] * b[1] + a[2] * b[2] + + problem = str(a) + " . " + str(b) + " = " + solution = str(c) + return problem, solution diff --git a/mathgenerator/funcs/volumeCone.py b/mathgenerator/funcs/volumeCone.py new file mode 100644 index 0000000..c237bca --- /dev/null +++ b/mathgenerator/funcs/volumeCone.py @@ -0,0 +1,11 @@ +from .__init__ import * + + +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)) + solution = f"{ans} {unit}^3" + return problem, solution diff --git a/mathgenerator/funcs/volumeCube.py b/mathgenerator/funcs/volumeCube.py new file mode 100644 index 0000000..6a52da4 --- /dev/null +++ b/mathgenerator/funcs/volumeCube.py @@ -0,0 +1,10 @@ +from .__init__ import * + + +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 diff --git a/mathgenerator/funcs/volumeCuboid.py b/mathgenerator/funcs/volumeCuboid.py new file mode 100644 index 0000000..b0a2490 --- /dev/null +++ b/mathgenerator/funcs/volumeCuboid.py @@ -0,0 +1,12 @@ +from .__init__ import * + + +def volumeCuboid(maxSide=20, unit='m'): + a = random.randint(1, maxSide) + b = random.randint(1, maxSide) + c = random.randint(1, maxSide) + + problem = f"Volume of cuboid with sides = {a}{unit}, {b}{unit}, {c}{unit} is" + ans = a * b * c + solution = f"{ans} {unit}^3" + return problem, solution diff --git a/mathgenerator/funcs/volumeCylinder.py b/mathgenerator/funcs/volumeCylinder.py new file mode 100644 index 0000000..38dfd64 --- /dev/null +++ b/mathgenerator/funcs/volumeCylinder.py @@ -0,0 +1,11 @@ +from .__init__ import * + + +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" + ans = int(math.pi * b * b * a) + solution = f"{ans} {unit}^3" + return problem, solution diff --git a/mathgenerator/funcs/volumeSphereFunc.py b/mathgenerator/funcs/volumeSphereFunc.py new file mode 100644 index 0000000..1f94c7f --- /dev/null +++ b/mathgenerator/funcs/volumeSphereFunc.py @@ -0,0 +1,10 @@ +from .__init__ import * + + +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 diff --git a/mathgenerator/mathgen.py b/mathgenerator/mathgen.py index cf87780..f9ef504 100644 --- a/mathgenerator/mathgen.py +++ b/mathgenerator/mathgen.py @@ -1,10 +1,14 @@ import random import math import fractions +from .funcs import * +from .__init__ import getGenList -genList = [] +genList = getGenList() # || Generator class + + class Generator: def __init__(self, title, id, generalProb, generalSol, func): self.title = title @@ -15,776 +19,260 @@ class Generator: genList.append([id, title, self]) def __str__(self): - return str(self.id) + " " + self.title + " " + self.generalProb + " " + self.generalSol + return str( + self.id + ) + " " + self.title + " " + self.generalProb + " " + self.generalSol def __call__(self, **kwargs): return self.func(**kwargs) + # || Non-generator Functions def genById(id): generator = genList[id][2] - return(generator()) + return (generator()) -def getGenList(): - return(genList) -# || Generator Functions +# +# def getGenList(): +# return(genList) -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 - problem = str(a) + "+" + str(b) + "=" - solution = str(c) - return problem, solution - -def subtractionFunc(maxMinuend = 99, maxDiff = 99): - a = random.randint(0, maxMinuend) - 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): - a = random.randint(0, maxMulti) - 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): - a = random.randint(0, maxDivid) - b = random.randint(0, min(maxRes, maxDivid)) - c = a/b - problem = str(a) + "/" + str(b) + "=" - solution = str(c) - return problem, solution - -def binaryComplement1sFunc(maxDigits = 10): - question = '' - answer = '' - for i in range(random.randint(1,maxDigits)): - temp = str(random.randint(0, 1)) - question += temp - answer += "0" if temp == "1" else "1" - - problem = question - solution = answer - return problem, solution - -def moduloFunc(maxRes = 99, maxModulo= 99): - a = random.randint(0, maxModulo) - b = random.randint(0, min(maxRes, maxModulo)) - c = a%b - problem = str(a) + "%" + str(b) + "=" - solution = str(c) - return problem, solution - -def squareRootFunc(minNo = 1, maxNo = 12): - b = random.randint(minNo, maxNo) - a = b*b - problem = "sqrt(" + str(a) + ")=" - solution = str(b) - return problem, solution - -def powerRuleDifferentiationFunc(maxCoef = 10, maxExp = 10, maxTerms = 5): - numTerms = random.randint(1, maxTerms) - problem = "" - solution = "" - for i in range(numTerms): - if i > 0: - problem += " + " - solution += " + " - coefficient = random.randint(1, maxCoef) - exponent = random.randint(1, maxExp) - problem += str(coefficient) + "x^" + str(exponent) - solution += str(coefficient * exponent) + "x^" + str(exponent - 1) - return problem, solution - -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 - 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) - x, y = a, b - c = a * b - while(y): - x, y = y, x % y - d = c // x - problem = f"LCM of {a} and {b} = " - solution = str(d) - return problem, solution - -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 - return x - i = calculate_gcd((c - b), a) - x = f"{(c - b)//i}/{a//i}" - if (c - b == 0): - x = "0" - 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)+")" - 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]) - problem = f"{divisor}/{dividend} = " - 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)+"=" - 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 divideFractionsFunc(maxVal=10): - a = random.randint(1, maxVal) - b = random.randint(1, maxVal) - while (a == b): - b = random.randint(1, maxVal) - c = random.randint(1, maxVal) - 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 - return x - tmp_n = a * d - tmp_d = b * c - gcd = calculate_gcd(tmp_n, tmp_d) - x = f"{tmp_n//gcd}/{tmp_d//gcd}" - if (tmp_d == 1 or tmp_d == gcd): - x = f"{tmp_n//gcd}" - # for equal numerator and denominators - problem = f"({a}/{b})/({c}/{d})" - solution = x - return problem, solution - -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))) - 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): - 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]) - problem = f"Does triangle with sides {sideA}, {sideB} and {sideC} exist?" - if exists: - solution = "Yes" - return problem, solution - 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 - -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 - -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 - -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) - # Start from reduced echelon form (coeffs 1) - c1 = [1, 0, x] - c2 = [0, 1, y] - - def randNonZero(): - return random.choice([i for i in range(-coeff_mult_range, coeff_mult_range) - if i != 0]) - # Add random (non-zero) multiple of equations (rows) to each other - c1_mult = randNonZero() - c2_mult = randNonZero() - new_c1 = [c1[i] + c1_mult * c2[i] for i in range(len(c1))] - new_c2 = [c2[i] + c2_mult * c1[i] for i in range(len(c2))] - - # For extra randomness, now add random (non-zero) multiples of original rows - # to themselves - c1_mult = randNonZero() - c2_mult = randNonZero() - new_c1 = [new_c1[i] + c1_mult * c1[i] for i in range(len(c1))] - new_c2 = [new_c2[i] + c2_mult * c2[i] for i in range(len(c2))] - - def coeffToFuncString(coeffs): - # lots of edge cases for perfect formatting! - x_sign = '-' if coeffs[0] < 0 else '' - # No redundant 1s - x_coeff = str(abs(coeffs[0])) if abs(coeffs[0]) != 1 else '' - # If x coeff is 0, dont include x - x_str = f'{x_sign}{x_coeff}x' if coeffs[0] != 0 else '' - # if x isn't included and y is positive, dont include operator - op = ' - ' if coeffs[1] < 0 else (' + ' if x_str != '' else '') - # 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') - return f'{x_str}{op}{y_str} = {coeffs[2]}' - - problem = f"{coeffToFuncString(new_c1)}, {coeffToFuncString(new_c2)}" - solution = f"x = {x}, y = {y}" - return problem, solution - - # 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) - 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): - a = random.randint(1, maxLength) - b = random.randint(1, maxLength) - c = (a**2 + b**2)**0.5 - problem = f"The hypotenuse of a right triangle given the other two lengths {a} and {b} = " - solution = f"{c:.0f}" if c.is_integer() else f"{c:.2f}" - return problem, solution - -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) ] - - 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)]) - - 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 - i = 2 - factors = [] - while i * i <= n: - if n % i: - i += 1 - else: - n //= i - factors.append(i) - if n > 1: - factors.append(n) - problem = f"Find prime factors of {a}" - solution = f"{factors}" - return problem, solution - -def multiplyFractionsFunc(maxVal=10): - a = random.randint(1, maxVal) - b = random.randint(1, maxVal) - c = random.randint(1, maxVal) - d = random.randint(1, maxVal) - while (a == b): - 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 - return x - tmp_n = a * c - tmp_d = b * d - gcd = calculate_gcd(tmp_n, tmp_d) - x = f"{tmp_n//gcd}/{tmp_d//gcd}" - if (tmp_d == 1 or tmp_d == gcd): - x = f"{tmp_n//gcd}" - problem = f"({a}/{b})*({c}/{d})" - solution = x - return problem, solution - -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) - solution = 180 - exteriorAngle - return problem, solution - -def combinationsFunc(maxlength=20): - - def factorial(a): - d=1 - for i in range(a): - a=(i+1)*d - d=a - return d - 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) - - return problem, solution - -def factorialFunc(maxInput = 6): - a = random.randint(0, maxInput) - n = a - problem = str(a) + "! = " - b = 1 - if a == 1: - solution = str(b) - return problem, solution - else: - while n > 0: - b *= n - n = n - 1 - solution = str(b) - return problem, solution - -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'): - 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'): - 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) - solution = f"{ans} {unit}^2" - return problem, solution - -def volumeCuboid(maxSide = 20, unit = 'm'): - a = random.randint(1, maxSide) - b = random.randint(1, maxSide) - c = random.randint(1, maxSide) - problem = f"Volume of cuboid with sides = {a}{unit}, {b}{unit}, {c}{unit} is" - ans = a * b * c - solution = f"{ans} {unit}^3" - return problem, solution - -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" - ans = int(2 * math.pi * a * b + 2 * math.pi * b * b) - solution = f"{ans} {unit}^2" - return problem, solution - -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" - ans = int(math.pi * b * b * a) - solution = f"{ans} {unit}^3" - return problem, solution - -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) - problem = f"Surface area of cone with height = {a}{unit} and radius = {b}{unit} is" - ans = int(math.pi * b * slopingHeight + math.pi * b * b) - solution = f"{ans} {unit}^2" - return problem, solution - -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)) - solution = f"{ans} {unit}^3" - return problem, solution - -def commonFactorsFunc(maxVal=100): - a = random.randint(1, maxVal) - b = random.randint(1, maxVal) - x, y = a, b - if (x < y): - min = x - else: - min = y - count = 0 - arr = [] - for i in range(1, min + 1): - if (x % i == 0): - if (y % i == 0): - count = count + 1 - arr.append(i) - problem = f"Common Factors of {a} and {b} = " - solution = arr - return problem, solution - -def intersectionOfTwoLinesFunc( - minM=-10, maxM=10, minB=-10, maxB=10, minDenominator=1, maxDenominator=6 -): - def generateEquationString(m, b): - """ - Generates an equation given the slope and intercept. - It handles cases where m is fractional. - It also ensures that we don't have weird signs such as y = mx + -b. - """ - if m[1] == 1: - m = m[0] - else: - m = f"{m[0]}/{m[1]}" - base = f"y = {m}x" - if b > 0: - return f"{base} + {b}" - elif b < 0: - return f"{base} - {b * -1}" - else: - return base - - def fractionToString(x): - """ - Converts the given fractions.Fraction into a string. - """ - if x.denominator == 1: - x = x.numerator - 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) - b2 = random.randint(minB, maxB) - equation1 = generateEquationString(m1, b1) - equation2 = generateEquationString(m2, b2) - problem = "Find the point of intersection of the two lines: " - problem += f"{equation1} and {equation2}" - m1 = fractions.Fraction(*m1) - m2 = fractions.Fraction(*m2) - # if m1 == m2 then the slopes are equal - # This can happen if both line are the same - # Or if they are parallel - # In either case there is no intersection - if m1 == m2: - solution = "No Solution" - else: - intersection_x = (b1 - b2) / (m2 - m1) - intersection_y = ((m2 * b1) - (m1 * b2)) / (m2 - m1) - 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) - 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]] - return str(a) + " X " + str(b) + " = ", str(c) - -def compareFractionsFunc(maxVal=10): - a = random.randint(1, maxVal) - b = random.randint(1, maxVal) - c = random.randint(1, maxVal) - d = random.randint(1, maxVal) - - while (a == b): - b = random.randint(1, maxVal) - while (c == d): - d = random.randint(1, maxVal) - - first=a/b - second=c/d - - if(first>second): - solution=">" - elif(first 0: - problem += " + " - solution += " + " - 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 = solution + " + c" - return problem, solution - - -def fourthAngleOfQuadriFunc(maxAngle = 180): - angle1 = random.randint(1, maxAngle) - 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 arithmeticProgressionFunc (maxd = 100, maxa = 100, maxn = 100): - sumOrTerm = random.randint (0,1) - d = random.randint (-1 * maxd, maxd) - a1 = random.randint (-1 * maxa, maxa) - a2 = a1 + d - a3 = a2 + d - n = random.randint (4, maxn) - apString = str(a1) +'\t' + str(a2) +'\t' + str(a3) + '\t...' - if (sumOrTerm == 0) : #sum - problem = 'Find the sum of first ' + str(n) + ' terms of the AP series: ' + apString - solution = n * ((2*a1) + ((n-1)*d))/2 - else : #term - problem = 'Find the term number ' + str(n) + ' of the AP series: ' + apString - solution = a1 + ((n-1)*d) - return problem, solution - - - -# || Class Instances - -#Format is: -# = Generator("<Title>", <id>, <generalized problem>, <generalized solution>, <function name>) -addition = Generator("Addition", 0, "a+b=", "c", additionFunc) +# Format is: +# <title> = Generator("<Title>", <id>, <generalized problem>, <generalized solution>, <function name>) +# Funcs_start - DO NOT REMOVE! +# addition = Generator("Addition", 0, "a+b=", "c", additionFunc) subtraction = Generator("Subtraction", 1, "a-b=", "c", subtractionFunc) -multiplication = Generator("Multiplication", 2, "a*b=", "c", multiplicationFunc) +multiplication = Generator("Multiplication", 2, "a*b=", "c", + multiplicationFunc) division = Generator("Division", 3, "a/b=", "c", divisionFunc) -binaryComplement1s = Generator("Binary Complement 1s", 4, "1010=", "0101", binaryComplement1sFunc) +binaryComplement1s = Generator("Binary Complement 1s", 4, "1010=", "0101", + binaryComplement1sFunc) 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) -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) +powerRuleDifferentiation = Generator("Power Rule Differentiation", 7, "nx^m=", + "(n*m)x^(m-1)", + powerRuleDifferentiationFunc) +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) -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) -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", +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) +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) -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 -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) +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) +# 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) +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) 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) -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) -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) -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) -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) -arithmeticProgression = Generator ("Arithmetic Progression", 50, "n-Sum or n-Term of an Arithmetic Progression", "Sum or term", arithmeticProgressionFunc) +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) +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) +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) +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) +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) +diceSumProbability = Generator( + "Probability of a certain sum appearing on faces of dice", 52, + "If n dices are rolled then probabilty of getting sum of x is =", "z", + DiceSumProbFunc) +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) +basicTrigonometry = Generator("Trigonometric Values", 57, "What is sin(X)?", + "ans", basicTrigonometryFunc) +sumOfAnglesOfPolygon = Generator("Sum of Angles of Polygon", 58, + "Sum of angles of polygon with n sides = ", + "sum", sumOfAnglesOfPolygonFunc) +dataSummary = Generator("Mean,Standard Deviation,Variance", 59, "a,b,c", + "Mean:a+b+c/3,Std,Var", dataSummaryFunc) +surfaceAreaSphereGen = Generator( + "Surface Area of Sphere", 60, + "Surface area of sphere with radius = a units is", "d units^2", + surfaceAreaSphere) +volumeSphere = Generator("Volume of Sphere", 61, + "Volume of sphere with radius r m = ", + "(4*pi/3)*r*r*r", volumeSphereFunc) +nthFibonacciNumberGen = Generator("nth Fibonacci number", 62, + "What is the nth Fibonacci number", "Fn", + nthFibonacciNumberFunc) +profitLossPercent = Generator( + "Profit or Loss Percent", 63, + "Profit/ Loss percent when CP = cp and SP = sp is: ", "percent", + profitLossPercentFunc) +binaryToHex = Generator("Binary to Hexidecimal", 64, "Hexidecimal of a=", "b", + binaryToHexFunc) +complexNumMultiply = Generator("Multiplication of 2 complex numbers", 65, + "(x + j) (y + j) = ", "xy + xj + yj -1", + multiplyComplexNumbersFunc) +geometricprogression = Generator( + "Geometric Progression", 66, + "Initial value,Common Ratio,nth Term,Sum till nth term =", + "a,r,ar^n-1,sum(ar^n-1", geomProgrFunc) +geometricMean = Generator("Geometric Mean of N Numbers", 67, + "Geometric mean of n numbers A1 , A2 , ... , An = ", + "(A1*A2*...An)^(1/n) = ans", geometricMeanFunc) +harmonicMean = Generator("Harmonic Mean of N Numbers", 68, + "Harmonic mean of n numbers A1 , A2 , ... , An = ", + " n/((1/A1) + (1/A2) + ... + (1/An)) = ans", + harmonicMeanFunc) +eucldianNorm = Generator("Euclidian norm or L2 norm of a vector", 69, + "Euclidian Norm of a vector V:[v1, v2, ......., vn]", + "sqrt(v1^2 + v2^2 ........ +vn^2)", euclidianNormFunc) +angleBtwVectors = Generator( + "Angle between 2 vectors", 70, + "Angle Between 2 vectors V1=[v11, v12, ..., v1n] and V2=[v21, v22, ....., v2n]", + "V1.V2 / (euclidNorm(V1)*euclidNorm(V2))", angleBtwVectorsFunc) +absoluteDifference = Generator( + "Absolute difference between two numbers", 71, + "Absolute difference betweeen two numbers a and b =", "|a-b|", + absoluteDifferenceFunc) +vectorDot = Generator("Dot Product of 2 Vectors", 72, "a . b = ", "c", + vectorDotFunc) +binary2sComplement = Generator("Binary 2's Complement", 73, + "2's complement of 11010110 =", "101010", + binary2sComplementFunc) +invertmatrix = Generator("Inverse of a Matrix", 74, "Inverse of a matrix A is", + "A^(-1)", matrixInversion) +sectorArea = Generator("Area of a Sector", 75, + "Area of a sector with radius, r and angle, a ", "Area", + sectorAreaFunc) +meanMedian = Generator("Mean and Median", 76, + "Mean and median of given set of numbers", + "Mean, Median", meanMedianFunc) +intMatrix22determinant = Generator("Determinant to 2x2 Matrix", 77, + "Det([[a,b],[c,d]]) =", " a * d - b * c", + determinantToMatrix22) +compoundInterest = Generator( + "Compound Interest", 78, + "Compound interest for a principle amount of p dollars, r% rate of interest and for a time period of t years with n times compounded annually is = ", + "A dollars", compoundInterestFunc) +decimalToHexadeci = Generator("Decimal to Hexadecimal", 79, "Binary of a=", + "b", deciToHexaFunc) +percentage = Generator("Percentage of a number", 80, "What is a% of b?", + "percentage", percentageFunc) +celsiustofahrenheit = Generator("Celsius To Fahrenheit", 81, "(C +(9/5))+32=", "F", celsiustofahrenheitFunc) + +arithmeticProgressionTerm = Generator ("AP Term Calculation", 82, + "Find the term number n of the AP series: a1, a2, a3 ..." , + "a-n", arithmeticProgressionTermFunc) + +arithmeticProgressionSum = Generator ("AP Sum Calculation", 83, + "Find the sum of first n terms of the AP series: a1, a2, a3 ...", + "Sum", arithmeticProgressionSumFunc) \ No newline at end of file diff --git a/setup.py b/setup.py index e07aa01..4bfbcd0 100644 --- a/setup.py +++ b/setup.py @@ -1,16 +1,12 @@ from setuptools import setup, find_packages -setup( - name='mathgenerator', - version='1.1.1', - description='An open source solution for generating math problems', - url='https://github.com/todarith/mathgenerator', - author='Luke Weiler', - author_email='lukew25073@gmail.com', - license='MIT', - packages=find_packages(), - install_requires=[ - ], - entry_points={ - } -) +setup(name='mathgenerator', + version='1.1.3', + description='An open source solution for generating math problems', + url='https://github.com/todarith/mathgenerator', + author='Luke Weiler', + author_email='lukew25073@gmail.com', + license='MIT', + packages=find_packages(), + install_requires=[], + entry_points={}) diff --git a/test.py b/test.py new file mode 100644 index 0000000..1302ce5 --- /dev/null +++ b/test.py @@ -0,0 +1,6 @@ +from mathgenerator import mathgen + +# test your generators here + +print(mathgen.addition()) +print(mathgen.genById(79)) diff --git a/tests/test_mathgen.py b/tests/test_mathgen.py index ace72a5..ed9066b 100644 --- a/tests/test_mathgen.py +++ b/tests/test_mathgen.py @@ -5,42 +5,43 @@ 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): +def test_addition(maxSum, maxAddend): assume(maxSum > maxAddend) - problem, solution = additionFunc(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_subtractionFunc(maxMinuend, maxDiff): +def test_subtraction(maxMinuend, maxDiff): assume(maxMinuend > maxDiff) - problem, solution = subtractionFunc(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_multiplicationFunc(maxRes, maxMulti): +def test_multiplication(maxRes, maxMulti): assume(maxRes > maxMulti) - problem, solution = multiplicationFunc(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_divisionFunc(maxRes, maxDivid): +def test_division(maxRes, maxDivid): assume(maxRes > maxDivid) - problem, solution = divisionFunc(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_moduloFunc(maxRes, maxModulo): +def test_moduloDivision(maxRes, maxModulo): assume(maxRes > maxModulo) - problem, solution = moduloFunc(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_squareRootFunc(minNo, maxNo): +@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 = squareRootFunc(minNo, maxNo) + problem, solution = squareRoot.func(minNo, maxNo) assert eval(problem[:-1]) == float(solution)