Split term and sum to 2 functions

This commit is contained in:
Anshita
2020-10-20 00:16:32 +05:30
101 changed files with 2091 additions and 858 deletions

View File

@@ -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:**

10
.github/ISSUE_TEMPLATE/other-issue.md vendored Normal file
View File

@@ -0,0 +1,10 @@
---
name: Other Issue
about: If your issue lies outside of the other templates
title: ''
labels: ''
assignees: ''
---

View File

@@ -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:**

View File

@@ -17,5 +17,7 @@ jobs:
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

View File

@@ -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 .<yourfunc> 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.

View File

@@ -1,2 +1,11 @@
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

121
README.md
View File

@@ -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 <table><tr><td>-50</td><td>36</td><td>7</td><td>-26</td><td>-2</td><td>63</td></tr><tr><td>88</td><td>-37</td><td>60</td><td>-19</td><td>61</td><td>-56</td></tr><tr><td>48</td><td>-5</td><td>69</td><td>-87</td><td>-64</td><td>-92</td></tr><tr><td>-84</td><td>-50</td><td>-79</td><td>-19</td><td>86</td><td>-13</td></tr><tr><td>0</td><td>28</td><td>12</td><td>-14</td><td>73</td><td>-49</td></tr><tr><td>94</td><td>-90</td><td>2</td><td>26</td><td>-38</td><td>19</td></tr><tr><td>2</td><td>-11</td><td>79</td><td>-77</td><td>98</td><td>-77</td></tr><tr><td>-87</td><td>70</td><td>72</td><td>-32</td><td>64</td><td>-99</td></tr></table> and <table><tr><td>34</td><td>32</td><td>-6</td><td>-32</td><td>46</td><td>-23</td><td>78</td><td>-81</td><td>-18</td></tr><tr><td>-17</td><td>24</td><td>49</td><td>-62</td><td>-50</td><td>77</td><td>38</td><td>-98</td><td>-64</td></tr><tr><td>-23</td><td>-78</td><td>43</td><td> 5</td><td>-83</td><td>-5</td><td> 4</td><td>-92</td><td>-16</td></tr><tr><td> 46</td><td>-47</td><td>-92</td><td>52</td><td>-25</td><td>-37</td><td>44</td><td>51</td><td>-7</td></tr><tr><td> 20</td><td>26</td><td>70</td><td>37</td><td>96</td><td>-73</td><td>49</td><td>84</td><td>42</td></tr><tr><td>-72</td><td>-15</td><td>-80</td><td>-24</td><td>58</td><td>-47</td><td>-41</td><td>45</td><td>-69</td></tr></table>| <table><tr><td>-8245</td><td>-1057</td><td>-423</td><td>-3535</td><td>-569</td><td>2034</td><td>-6329</td><td>1219</td><td>-5765</td></tr><tr><td>6619</td><td> 567</td><td>10737</td><td>2391</td><td>4001</td><td>-6291</td><td>10147</td><td>-7387</td><td>6383</td></tr><tr><td>1472</td><td>-161</td><td>13318</td><td>-5565<td>-12574</td><td>10381</td><td> 638<td>-23699</td><td>2621</td></tr><tr><td>1593</td><td>5598</td><td>3465</td><td>7899</td><td>13170</td><td>-6487</td><td>-4857</td><td>24642</td><td>10618</td></tr><tr><td>3592</td><td>3027</td><td>12206</td><td>1473</td><td>2120</td><td>-412</td><td>6082</td><td>-635</td><td>4561</td></tr><tr><td>3748</td><td>-1803<td>-11460</td><td>2072</td><td>5462</td><td>-8183</td><td>2423</td><td>11</td><td> 947</td></tr><tr><td>2400</td><td> 960</td><td>22950</td><td>2483</td><td> 952</td><td>-1974</td><td>4625</td><td>-5512</td><td>9372</td></tr><tr><td>1132</td><td>-2067</td><td>22392</td><td>1884<td>-12276</td><td>8196</td><td>1949</td><td>-7148</td><td>5677</td></tr></table> | 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 |

View File

@@ -1,2 +1,5 @@
pytest
hypothesis
flake8
autopep8
sympy

54
makeReadme.py Normal file
View File

@@ -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("[[", "<table><tr><td>")
prob = prob.replace("[", "<tr><td>")
prob = prob.replace(", ", "</td><td>")
prob = prob.replace("]]\n", "</td></tr></table>")
prob = prob.replace("]\n", "</td></tr>")
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")

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 *

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

File diff suppressed because it is too large Load Diff

View File

@@ -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={})

6
test.py Normal file
View File

@@ -0,0 +1,6 @@
from mathgenerator import mathgen
# test your generators here
print(mathgen.addition())
print(mathgen.genById(79))

Some files were not shown because too many files have changed in this diff Show More