From b0002f68662f1f0624d8c90740b6573eaa65f57a Mon Sep 17 00:00:00 2001 From: LyndonFan Date: Mon, 19 Oct 2020 18:33:07 +0100 Subject: [PATCH 1/2] added baseConversion --- mathgenerator/funcs/baseConversion.py | 42 +++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 mathgenerator/funcs/baseConversion.py diff --git a/mathgenerator/funcs/baseConversion.py b/mathgenerator/funcs/baseConversion.py new file mode 100644 index 0000000..27125ef --- /dev/null +++ b/mathgenerator/funcs/baseConversion.py @@ -0,0 +1,42 @@ +from .__init__ import * + +#base from 2 to 36 +alpha = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + +def fromBaseTenTo(n,toBase): + assert toBase<=36, "{} should be at most 36" + if toBase==2: + return bin(n)[2:] + elif toBase==8: + return oct(n)[2:] + elif toBase==10: + return str(n) + elif toBase==16: + return hex(n)[2:].upper() + res = alpha[n%toBase] + n = n//toBase + while n>0: + res = alpha[n%toBase] + res + n = n//toBase + return res + +# Useful to check answers, but not needed here +# def toBaseTen(n,fromBase): +# assert fromBase<=36, "{} should be at most 36" +# return int(n,fromBase) + +def baseConversion(maxNum = 60000, maxBase = 16): + assert type(maxNum)==int and maxNum>=100 and maxNum<=65536, "maxNum({}) should be an int between 100 and 65536".format(maxNum) + assert type(maxBase)==int and maxBase>=2 and maxBase<=36, "maxBase({}) sholud be an int between 2 and 36 (inclusive)".format(maxBase) + + n = random.randint(40,maxNum) + dist = [10]*10+[2]*5+[16]*5+[i for i in range(2,maxBase+1)] + # set this way since converting to/from bases 2,10,16 are more common -- can be changed if needed. + bases = random.choices(dist,k=2) + while bases[0]==bases[1]: + bases = random.choices(dist,k=2) + + problem = "Convert {} from base {} to base {}.".format(fromBaseTenTo(n,bases[0]),bases[0],bases[1]) + ans = fromBaseTenTo(n,bases[1]) + return problem, ans + From bda4b732790a11372822392f8f42102a74509aa9 Mon Sep 17 00:00:00 2001 From: LyndonFan Date: Mon, 19 Oct 2020 18:36:54 +0100 Subject: [PATCH 2/2] minor edits --- mathgenerator/funcs/baseConversion.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mathgenerator/funcs/baseConversion.py b/mathgenerator/funcs/baseConversion.py index 27125ef..77eae14 100644 --- a/mathgenerator/funcs/baseConversion.py +++ b/mathgenerator/funcs/baseConversion.py @@ -4,7 +4,8 @@ from .__init__ import * alpha = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" def fromBaseTenTo(n,toBase): - assert toBase<=36, "{} should be at most 36" + assert type(toBase)==int and toBase>=2 and toBase<=36, "toBase({}) must be >=2 and <=36" + # trivial cases if toBase==2: return bin(n)[2:] elif toBase==8: @@ -22,12 +23,11 @@ def fromBaseTenTo(n,toBase): # Useful to check answers, but not needed here # def toBaseTen(n,fromBase): -# assert fromBase<=36, "{} should be at most 36" # return int(n,fromBase) def baseConversion(maxNum = 60000, maxBase = 16): - assert type(maxNum)==int and maxNum>=100 and maxNum<=65536, "maxNum({}) should be an int between 100 and 65536".format(maxNum) - assert type(maxBase)==int and maxBase>=2 and maxBase<=36, "maxBase({}) sholud be an int between 2 and 36 (inclusive)".format(maxBase) + assert type(maxNum)==int and maxNum>=100 and maxNum<=65536, "maxNum({}) must be >=100 and <=65536".format(maxNum) + assert type(maxBase)==int and maxBase>=2 and maxBase<=36, "maxBase({}) must be >= 2 and <=36".format(maxBase) n = random.randint(40,maxNum) dist = [10]*10+[2]*5+[16]*5+[i for i in range(2,maxBase+1)]