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..e7cf0eb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -28,6 +28,12 @@ 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 ### 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..796dc00 --- /dev/null +++ b/makeReadme.py @@ -0,0 +1,51 @@ +# 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 = [] +line = lines.index('# Funcs_start - DO NOT REMOVE!\n')+1 # get the first line of the functions in mathgen.py +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] + func_name = instName[:instName.find('=')].strip() # NOTE: renamed 'def_name' to 'func_name' because it suits it more + 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/__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/mathgen.py b/mathgenerator/mathgen.py index f986d76..3bf1417 100644 --- a/mathgenerator/mathgen.py +++ b/mathgenerator/mathgen.py @@ -1,6 +1,7 @@ import random import math import fractions +from .funcs import * genList = [] @@ -20,713 +21,19 @@ class Generator: def __call__(self, **kwargs): return self.func(**kwargs) + # || Non-generator Functions def genById(id): generator = genList[id][2] return(generator()) +# def getGenList(): return(genList) -# || Generator Functions - -def additionFunc(maxSum = 99, maxAddend = 50): - 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 - -# || Class Instances - -#Format is: -# = Generator("<Title>", <id>, <generalized problem>, <generalized solution>, <function name>) +# Format is: +# <title> = Generator("<Title>", <id>, <generalized problem>, <generalized solution>, <function name>) +# 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) @@ -735,46 +42,70 @@ binaryComplement1s = Generator("Binary Complement 1s", 4, "1010=", "0101", binar moduloDivision = Generator("Modulo Division", 5, "a%b=", "c", moduloFunc) squareRoot = Generator("Square Root", 6, "sqrt(a)=", "b", squareRootFunc) powerRuleDifferentiation = Generator("Power Rule Differentiation", 7, "nx^m=", "(n*m)x^(m-1)", powerRuleDifferentiationFunc) -square = Generator("Square", 8,"a^2", "b", squareFunc) -lcm = Generator("LCM (Least Common Multiple)", 9, "LCM of a and b = ", "c", lcmFunc) +square = Generator("Square", 8, "a^2", "b", squareFunc) +lcm = Generator("LCM (Least Common Multiple)", 9,"LCM of a and b = ", "c", lcmFunc) gcd = Generator("GCD (Greatest Common Denominator)", 10, "GCD of a and b = ", "c", gcdFunc) basicAlgebra = Generator("Basic Algebra", 11, "ax + b = c", "d", basicAlgebraFunc) log = Generator("Logarithm", 12, "log2(8)", "3", logFunc) -intDivision = Generator("Easy Division", 13,"a/b=","c",divisionToIntFunc) -decimalToBinary = Generator("Decimal to Binary",14,"Binary of a=","b",DecimalToBinaryFunc) -binaryToDecimal = Generator("Binary to Decimal",15,"Decimal of a=","b",BinaryToDecimalFunc) +intDivision = Generator("Easy Division", 13, "a/b=", "c", divisionToIntFunc) +decimalToBinary = Generator("Decimal to Binary", 14,"Binary of a=", "b", DecimalToBinaryFunc) +binaryToDecimal = Generator("Binary to Decimal", 15,"Decimal of a=", "b", BinaryToDecimalFunc) fractionDivision = Generator("Fraction Division", 16, "(a/b)/(c/d)=", "x/y", divideFractionsFunc) -intMatrix22Multiplication = Generator("Integer Multiplication with 2x2 Matrix", 17, "k * [[a,b],[c,d]]=", "[[k*a,k*b],[k*c,k*d]]", multiplyIntToMatrix22) +intMatrix22Multiplication = Generator("Integer Multiplication with 2x2 Matrix",17, "k * [[a,b],[c,d]]=", "[[k*a,k*b],[k*c,k*d]]", multiplyIntToMatrix22) areaOfTriangle = Generator("Area of Triangle", 18, "Area of Triangle with side lengths a, b, c = ", "area", areaOfTriangleFunc) -doesTriangleExist = Generator("Triangle exists check", 19, "Does triangle with sides a, b and c exist?","Yes/No", isTriangleValidFunc) -midPointOfTwoPoint=Generator("Midpoint of the two point", 20,"((X1,Y1),(X2,Y2))=","((X1+X2)/2,(Y1+Y2)/2)",MidPointOfTwoPointFunc) +doesTriangleExist = Generator("Triangle exists check", 19,"Does triangle with sides a, b and c exist?", "Yes/No", isTriangleValidFunc) +midPointOfTwoPoint = Generator("Midpoint of the two point", 20,"((X1,Y1),(X2,Y2))=", "((X1+X2)/2,(Y1+Y2)/2)", MidPointOfTwoPointFunc) factoring = Generator("Factoring Quadratic", 21, "x^2+(x1+x2)+x1*x2", "(x-x1)(x-x2)", factoringFunc) thirdAngleOfTriangle = Generator("Third Angle of Triangle", 22, "Third Angle of the triangle = ", "angle3", thirdAngleOfTriangleFunc) -systemOfEquations = Generator("Solve a System of Equations in R^2", 23, "2x + 5y = 13, -3x - 3y = -6", "x = -1, y = 3", - systemOfEquationsFunc) -distance2Point = Generator("Distance between 2 points", 24, "Find the distance between (x1,y1) and (x2,y2)","sqrt(distanceSquared)", distanceTwoPointsFunc) +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 +linearEquations = Generator("Linear Equations", 26, "2x+5y=20 & 3x+6y=12", "x=-20 & y=12", linearEquationsFunc)# This has multiple variables whereas #23 has only x and y primeFactors = Generator("Prime Factorisation", 27, "Prime Factors of a =", "[b, c, d, ...]", primeFactorsFunc) fractionMultiplication = Generator("Fraction Multiplication", 28, "(a/b)*(c/d)=", "x/y", multiplyFractionsFunc) -angleRegularPolygon = Generator("Angle of a Regular Polygon",29,"Find the angle of a regular polygon with 6 sides","120",regularPolygonAngleFunc) -combinations = Generator("Combinations of Objects",30, "Combinations available for picking 4 objects at a time from 6 distinct objects ="," 15", combinationsFunc) +angleRegularPolygon = Generator("Angle of a Regular Polygon", 29,"Find the angle of a regular polygon with 6 sides", "120", regularPolygonAngleFunc) +combinations = Generator("Combinations of Objects", 30, "Combinations available for picking 4 objects at a time from 6 distinct objects =", " 15", combinationsFunc) factorial = Generator("Factorial", 31, "a! = ", "b", factorialFunc) -surfaceAreaCubeGen = Generator("Surface Area of Cube", 32, "Surface area of cube with side a units is","b units^2", surfaceAreaCube) -surfaceAreaCuboidGen = Generator("Surface Area of Cuboid", 33, "Surface area of cuboid with sides = a units, b units, c units is","d units^2", surfaceAreaCuboid) -surfaceAreaCylinderGen = Generator("Surface Area of Cylinder", 34, "Surface area of cylinder with height = a units and radius = b units is","c units^2", surfaceAreaCylinder) -volumeCubeGen = Generator("Volum of Cube", 35, "Volume of cube with side a units is","b units^3", volumeCube) -volumeCuboidGen = Generator("Volume of Cuboid", 36, "Volume of cuboid with sides = a units, b units, c units is","d units^3", volumeCuboid) -volumeCylinderGen = Generator("Volume of cylinder", 37, "Volume of cylinder with height = a units and radius = b units is","c units^3", volumeCylinder) -surfaceAreaConeGen = Generator("Surface Area of cone", 38, "Surface area of cone with height = a units and radius = b units is","c units^2", surfaceAreaCone) -volumeConeGen = Generator("Volume of cone", 39, "Volume of cone with height = a units and radius = b units is","c units^3", volumeCone) -commonFactors = Generator("Common Factors", 40, "Common Factors of {a} and {b} = ","[c, d, ...]",commonFactorsFunc) -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) +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) +matrixMultiplication = Generator("Multiplication of two matrices",46, "Multiply two matrices A and B", "C", matrixMultiplicationFunc) +CubeRoot = Generator("Cube Root", 47, "Cuberoot of a upto 2 decimal places is", "b", cubeRootFunc) powerRuleIntegration = Generator("Power Rule Integration", 48, "nx^m=", "(n/m)x^(m+1)", powerRuleIntegrationFunc) -fourthAngleOfQuadrilateral = Generator("Fourth Angle of Quadrilateral",49,"Fourth angle of Quadrilateral with angles a,b,c =","angle4",fourthAngleOfQuadriFunc) +fourthAngleOfQuadrilateral = Generator("Fourth Angle of Quadrilateral", 49,"Fourth angle of Quadrilateral with angles a,b,c =", "angle4", fourthAngleOfQuadriFunc) +quadraticEquationSolve = Generator("Quadratic Equation", 50, "Find the zeros {x1,x2} of the quadratic equation ax^2+bx+c=0", "x1,x2", quadraticEquation) +hcf = Generator("HCF (Highest Common Factor)", 51,"HCF of a and b = ", "c", hcfFunc) +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) \ No newline at end of file diff --git a/setup.py b/setup.py index e07aa01..0b546c2 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name='mathgenerator', - version='1.1.1', + version='1.1.3', description='An open source solution for generating math problems', url='https://github.com/todarith/mathgenerator', author='Luke Weiler', diff --git a/test.py b/test.py new file mode 100644 index 0000000..e5bb2c1 --- /dev/null +++ b/test.py @@ -0,0 +1,6 @@ +from mathgenerator import mathgen + +#test your generators here + +print(mathgen.addition()) +print(mathgen.genById(74)) diff --git a/tests/test_mathgen.py b/tests/test_mathgen.py index ace72a5..7555131 100644 --- a/tests/test_mathgen.py +++ b/tests/test_mathgen.py @@ -5,42 +5,42 @@ 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): +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)