-
-
Notifications
You must be signed in to change notification settings - Fork 46.8k
Add algorithm for testing Project Euler solutions #2471
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
cclauss
merged 14 commits into
TheAlgorithms:master
from
dhruvmanila:project-euler-pytest
Sep 28, 2020
Merged
Changes from 8 commits
Commits
Show all changes
14 commits
Select commit
Hold shift + click to select a range
46725c8
Add file for testing Project Euler solutions
dhruvmanila 25df46b
Remove the importlib import
dhruvmanila 4f9a3c9
Update project_euler/solution_test.py
dhruvmanila 4283fe6
Small tweaks to project_euler/solution_test.py
dhruvmanila e9d1237
Test Project Euler solutions through Travis
dhruvmanila ae1cb20
Improved testing for Project Euler solutions:
dhruvmanila 4af7812
Update validate_solutions.py
dhruvmanila 4616f1c
Use namedtuple for input parameters and answer
dhruvmanila d5117b4
Fix flake8 errors: line too long
dhruvmanila c1b69b2
Small tweaks to validate_solutions.py
dhruvmanila f1d60ac
Add all answers & back to using dictionary
dhruvmanila f90db04
Using pytest for testing Project Euler solutions
dhruvmanila 2fd50e7
Print error messages in oneline format
dhruvmanila 9d62652
Separated answers into a separate file:
dhruvmanila File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,231 @@ | ||
#!/usr/bin/env python3 | ||
import importlib.util | ||
import pathlib | ||
from collections import namedtuple | ||
|
||
# CamelCase as this returns a class object | ||
QuesAndAns = namedtuple("QuesAndAns", "question answer") | ||
|
||
ques_08 = ( | ||
"73167176531330624919225119674426574742355349194934" | ||
"96983520312774506326239578318016984801869478851843" | ||
"85861560789112949495459501737958331952853208805511" | ||
"12540698747158523863050715693290963295227443043557" | ||
"66896648950445244523161731856403098711121722383113" | ||
"62229893423380308135336276614282806444486645238749" | ||
"30358907296290491560440772390713810515859307960866" | ||
"70172427121883998797908792274921901699720888093776" | ||
"65727333001053367881220235421809751254540594752243" | ||
"52584907711670556013604839586446706324415722155397" | ||
"53697817977846174064955149290862569321978468622482" | ||
"83972241375657056057490261407972968652414535100474" | ||
"82166370484403199890008895243450658541227588666881" | ||
"16427171479924442928230863465674813919123162824586" | ||
"17866458359124566529476545682848912883142607690042" | ||
"24219022671055626321111109370544217506941658960408" | ||
"07198403850962455444362981230987879927244284909188" | ||
"84580156166097919133875499200524063689912560717606" | ||
"05886116467109405077541002256983155200055935729725" | ||
"71636269561882670428252483600823257530420752963450" | ||
) | ||
|
||
ques_13 = [ | ||
37107287533902102798797998220837590246510135740250, | ||
46376937677490009712648124896970078050417018260538, | ||
74324986199524741059474233309513058123726617309629, | ||
91942213363574161572522430563301811072406154908250, | ||
23067588207539346171171980310421047513778063246676, | ||
89261670696623633820136378418383684178734361726757, | ||
28112879812849979408065481931592621691275889832738, | ||
44274228917432520321923589422876796487670272189318, | ||
47451445736001306439091167216856844588711603153276, | ||
70386486105843025439939619828917593665686757934951, | ||
62176457141856560629502157223196586755079324193331, | ||
64906352462741904929101432445813822663347944758178, | ||
92575867718337217661963751590579239728245598838407, | ||
58203565325359399008402633568948830189458628227828, | ||
80181199384826282014278194139940567587151170094390, | ||
35398664372827112653829987240784473053190104293586, | ||
86515506006295864861532075273371959191420517255829, | ||
71693888707715466499115593487603532921714970056938, | ||
54370070576826684624621495650076471787294438377604, | ||
53282654108756828443191190634694037855217779295145, | ||
36123272525000296071075082563815656710885258350721, | ||
45876576172410976447339110607218265236877223636045, | ||
17423706905851860660448207621209813287860733969412, | ||
81142660418086830619328460811191061556940512689692, | ||
51934325451728388641918047049293215058642563049483, | ||
62467221648435076201727918039944693004732956340691, | ||
15732444386908125794514089057706229429197107928209, | ||
55037687525678773091862540744969844508330393682126, | ||
18336384825330154686196124348767681297534375946515, | ||
80386287592878490201521685554828717201219257766954, | ||
78182833757993103614740356856449095527097864797581, | ||
16726320100436897842553539920931837441497806860984, | ||
48403098129077791799088218795327364475675590848030, | ||
87086987551392711854517078544161852424320693150332, | ||
59959406895756536782107074926966537676326235447210, | ||
69793950679652694742597709739166693763042633987085, | ||
41052684708299085211399427365734116182760315001271, | ||
65378607361501080857009149939512557028198746004375, | ||
35829035317434717326932123578154982629742552737307, | ||
94953759765105305946966067683156574377167401875275, | ||
88902802571733229619176668713819931811048770190271, | ||
25267680276078003013678680992525463401061632866526, | ||
36270218540497705585629946580636237993140746255962, | ||
24074486908231174977792365466257246923322810917141, | ||
91430288197103288597806669760892938638285025333403, | ||
34413065578016127815921815005561868836468420090470, | ||
23053081172816430487623791969842487255036638784583, | ||
11487696932154902810424020138335124462181441773470, | ||
63783299490636259666498587618221225225512486764533, | ||
67720186971698544312419572409913959008952310058822, | ||
95548255300263520781532296796249481641953868218774, | ||
76085327132285723110424803456124867697064507995236, | ||
37774242535411291684276865538926205024910326572967, | ||
23701913275725675285653248258265463092207058596522, | ||
29798860272258331913126375147341994889534765745501, | ||
18495701454879288984856827726077713721403798879715, | ||
38298203783031473527721580348144513491373226651381, | ||
34829543829199918180278916522431027392251122869539, | ||
40957953066405232632538044100059654939159879593635, | ||
29746152185502371307642255121183693803580388584903, | ||
41698116222072977186158236678424689157993532961922, | ||
62467957194401269043877107275048102390895523597457, | ||
23189706772547915061505504953922979530901129967519, | ||
86188088225875314529584099251203829009407770775672, | ||
11306739708304724483816533873502340845647058077308, | ||
82959174767140363198008187129011875491310547126581, | ||
97623331044818386269515456334926366572897563400500, | ||
42846280183517070527831839425882145521227251250327, | ||
55121603546981200581762165212827652751691296897789, | ||
32238195734329339946437501907836945765883352399886, | ||
75506164965184775180738168837861091527357929701337, | ||
62177842752192623401942399639168044983993173312731, | ||
32924185707147349566916674687634660915035914677504, | ||
99518671430235219628894890102423325116913619626622, | ||
73267460800591547471830798392868535206946944540724, | ||
76841822524674417161514036427982273348055556214818, | ||
97142617910342598647204516893989422179826088076852, | ||
87783646182799346313767754307809363333018982642090, | ||
10848802521674670883215120185883543223812876952786, | ||
71329612474782464538636993009049310363619763878039, | ||
62184073572399794223406235393808339651327408011116, | ||
66627891981488087797941876876144230030984490851411, | ||
60661826293682836764744779239180335110989069790714, | ||
85786944089552990653640447425576083659976645795096, | ||
66024396409905389607120198219976047599490197230297, | ||
64913982680032973156037120041377903785566085089252, | ||
16730939319872750275468906903707539413042652315011, | ||
94809377245048795150954100921645863754710598436791, | ||
78639167021187492431995700641917969777599028300699, | ||
15368713711936614952811305876380278410754449733078, | ||
40789923115535562561142322423255033685442488917353, | ||
44889911501440648020369068063960672322193204149535, | ||
41503128880339536053299340368006977710650566631954, | ||
81234880673210146739058568557934581403627822703280, | ||
82616570773948327592232845941706525094512325230608, | ||
22918802058777319719839450180888072429661980811197, | ||
77158542502016545090413245809786882778948721859617, | ||
72107838435069186155435662884062257473692284509516, | ||
20849603980134001723930671666823555245252804609722, | ||
53503534226472524250874054075591789781264330331690, | ||
] | ||
|
||
# Keep the answer part in str for consistency as some problems could output in str | ||
# Problem 329: 199740353/29386561536000 (Format for this answer is a/b) | ||
# https://github.com/nayuki/Project-Euler-solutions/blob/master/Answers.txt#L191 | ||
ANSWERS = { | ||
1: QuesAndAns(1000, "233168"), | ||
2: QuesAndAns(4_000_000, "4613732"), | ||
3: QuesAndAns(600851475143, "6857"), | ||
4: QuesAndAns(None, "906609"), | ||
5: QuesAndAns(20, "232792560"), | ||
6: QuesAndAns(100, "25164150"), | ||
7: QuesAndAns(10001, "104743"), | ||
8: QuesAndAns(ques_08, "23514624000"), | ||
9: QuesAndAns(1000, "31875000"), | ||
10: QuesAndAns(2_000_000, "142913828922"), | ||
11: QuesAndAns(None, "70600674"), | ||
12: QuesAndAns(None, "76576500"), | ||
13: QuesAndAns(ques_13, "5537376230"), | ||
14: QuesAndAns(1_000_000, "837799"), | ||
15: QuesAndAns(None, "137846528820"), | ||
16: QuesAndAns(1000, "1366"), | ||
17: QuesAndAns(1000, "21124"), | ||
18: QuesAndAns(None, "1074"), | ||
19: QuesAndAns(None, "171"), | ||
} | ||
|
||
PROJECT_EULER_PATH = pathlib.Path.cwd().joinpath("project_euler") | ||
|
||
|
||
def generate_solution_modules(dir_path: pathlib.Path): | ||
# Iterating over every file or directory | ||
for file_path in dir_path.iterdir(): | ||
if file_path.suffix != ".py" or file_path.name.startswith(("_", "test")): | ||
continue | ||
# Importing the source file through the given path | ||
# https://docs.python.org/3/library/importlib.html#importing-a-source-file-directly | ||
spec = importlib.util.spec_from_file_location(file_path.name, str(file_path)) | ||
module = importlib.util.module_from_spec(spec) | ||
spec.loader.exec_module(module) | ||
yield module | ||
|
||
|
||
def test_project_euler() -> int: | ||
wrong_answer, no_solution, solution_args = [[] for _ in range(3)] | ||
for problem_number, ques_ans in ANSWERS.items(): | ||
parameter, expected = ques_ans.question, ques_ans.answer | ||
problem_dir = PROJECT_EULER_PATH.joinpath(f"problem_{problem_number:02}") | ||
# By checking if it's a directory we can write all the problem number and | ||
# answer pair in ANSWERS variable and not worry whether it is actually | ||
# present in the 'project_euler' directory | ||
if problem_dir.is_dir(): | ||
for solution_module in generate_solution_modules(problem_dir): | ||
try: | ||
answer = str(solution_module.solution()) | ||
if answer != expected: | ||
wrong_answer.append( | ||
f"problem_{problem_number:02}/{solution_module.__name__}: " | ||
f"Expected {expected} but got {answer}" | ||
) | ||
# TypeError: If solution() requires arguments | ||
# AttributeError: If the module has no attribute called 'solution' | ||
except AttributeError as err: | ||
no_solution.append( | ||
f"problem_{problem_number:02}/{solution_module.__name__}: {err}" | ||
) | ||
except TypeError as err: | ||
if parameter: | ||
answer = str(solution_module.solution(parameter)) | ||
if answer != expected: | ||
wrong_answer.append( | ||
f"problem_{problem_number:02}/{solution_module.__name__}: " | ||
f"Expected {expected} but got {answer}" | ||
) | ||
else: | ||
solution_args.append( | ||
f"problem_{problem_number:02}/{solution_module.__name__}: {err}" | ||
) | ||
if wrong_answer: | ||
print(f"{len(wrong_answer)} files contain wrong answers:\n") | ||
print("\n".join(wrong_answer) + "\n") | ||
if solution_args: | ||
print( | ||
f"{len(solution_args)} " | ||
f"files require positional arguments for solution() function:\n" | ||
) | ||
print("\n".join(solution_args) + "\n") | ||
if no_solution: | ||
print(f"{len(no_solution)} files have no solution() function:\n") | ||
print("\n".join(no_solution) + "\n") | ||
return len(wrong_answer + solution_args + no_solution) | ||
|
||
|
||
if __name__ == "__main__": | ||
exit_code = test_project_euler() | ||
if exit_code: | ||
import sys | ||
|
||
sys.exit(exit_code) |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.