Skip to content

Commit 8c54e2e

Browse files
feat(problems): add use_pretty_numbers function (#41)
- sets a global that causes `rand_number` to return pretty coefficients for use in problems (1-12 ints) - when turned off generate floats and large ints as before.
1 parent 9fb5c24 commit 8c54e2e

File tree

2 files changed

+45
-5
lines changed

2 files changed

+45
-5
lines changed

libraries/mathy_python/mathy/problems.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
common_variables = list("xyz")
1212
variables = list("abcdfghjklmnopqrstuvwxyz")
1313
max_const = 12
14+
_pretty_numbers = True
1415

1516

1617
class MathyTermTemplate(BaseModel):
@@ -109,12 +110,27 @@ def maybe_power(percent_chance=80, max_power=4, or_else=""):
109110
return or_else
110111

111112

113+
def use_pretty_numbers(enabled: bool = True):
114+
"""Determine if problems should include only pretty numbers or
115+
a whole range of integers and floats. Using pretty numbers will
116+
restrict the numbers that are generated to integers between 1 and
117+
12. When not using pretty numbers, floats and large integers will
118+
be included in the output from `rand_number`"""
119+
global _pretty_numbers
120+
_pretty_numbers = enabled
121+
122+
112123
def rand_number():
113-
min_value = -10000
114-
max_value = 10000
124+
global _pretty_numbers
125+
if _pretty_numbers:
126+
min_value = 1
127+
max_value = 12
128+
else:
129+
min_value = -10000
130+
max_value = 10000
115131
# Use an integer?
116-
if rand_bool(66):
117-
if rand_bool(50):
132+
if _pretty_numbers or rand_bool(66):
133+
if _pretty_numbers or rand_bool(50):
118134
result = random.randint(min_value, max_value)
119135
else:
120136
result = random.randint(1, max_const)
@@ -539,4 +555,3 @@ def gen_move_around_blockers_two(number_blockers: int, powers_probability: float
539555
three_exp,
540556
)
541557
return problem, complexity
542-
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import pytest
2+
import random
3+
from mathy.problems import rand_number, use_pretty_numbers
4+
5+
6+
def test_number_generation() -> None:
7+
8+
random.seed(1337)
9+
10+
# When using pretty number generation, all values
11+
# are in range 1-12 and are always integers
12+
use_pretty_numbers(True)
13+
pretty_numbers = [rand_number() for _ in range(256)]
14+
outside_range_floats = [f for f in pretty_numbers if f < 1 or f > 12]
15+
pretty_floats = [f for f in pretty_numbers if isinstance(f, float)]
16+
assert len(outside_range_floats) == 0
17+
assert len(pretty_floats) == 0
18+
19+
# When not using pretty numbers, values can be floats and large integers
20+
use_pretty_numbers(False)
21+
rand_numbers = [rand_number() for _ in range(256)]
22+
large_ints = [f for f in rand_numbers if isinstance(f, int) and f > 12]
23+
rand_floats = [f for f in rand_numbers if isinstance(f, float)]
24+
assert len(large_ints) > 0
25+
assert len(rand_floats) > 0

0 commit comments

Comments
 (0)