def main(option, problem): """Python-based Project Euler command line tool.""" # No problem given (or given option ignores the problem argument) if problem == 0 or option in (skip, verify_all): # Determine the highest problem number in the current directory files = problem_glob() problem = max(int(file[:3]) for file in files) if files else 0 # No Project Euler files in current directory (no glob results) if problem == 0: # Generate the first problem file if option is appropriate if option not in (cheat, preview, verify_all): msg = "No Project Euler files found in the current directory." click.echo(msg) option = generate # Set problem number to 1 problem = 1 # --preview and no problem; preview the next problem elif option is preview: problem += 1 # No option and no problem; generate next file if answer is # correct (verify() will exit if the solution is incorrect) if option is None: verify(Problem(problem)) problem += 1 option = generate # Problem given but no option; decide between generate and verify elif option is None: option = verify if any(Problem(problem).iglob) else generate # Execute function based on option (pass Problem object as argument) option(Problem(problem)) sys.exit(0)
def main(option, problem): """Python-based Project Euler command line tool.""" # No problem given (or given option ignores the problem argument) if problem == 0 or option in {skip, verify_all}: # Determine the highest problem number in the current directory files = problem_glob() problem = max(file.num for file in files) if files else 0 # No Project Euler files in current directory (no glob results) if problem == 0: # Generate the first problem file if option is appropriate if option not in {cheat, preview, verify_all}: msg = "No Project Euler files found in the current directory." click.echo(msg) option = generate # Set problem number to 1 problem = 1 # --preview and no problem; preview the next problem elif option is preview: problem += 1 # No option and no problem; generate next file if answer is # correct (verify() will exit if the solution is incorrect) if option is None: verify(problem) problem += 1 option = generate # Problem given but no option; decide between generate and verify elif option is None: option = verify if Problem(problem).glob else generate # Execute function based on option option(problem) sys.exit(0)
def verify_all(current_p): """ Verifies all problem files in the current directory and prints an overview of the status of each problem. """ # Define various problem statuses keys = ('correct', 'incorrect', 'error', 'skipped', 'missing') symbols = ('C', 'I', 'E', 'S', '.') colours = ('green', 'red', 'yellow', 'cyan', 'white') status = OrderedDict( (key, click.style(symbol, fg=colour, bold=True)) for key, symbol, colour in zip(keys, symbols, colours) ) overview = {} # Search through problem files using glob module files = problem_glob() # No Project Euler files in the current directory if not files: click.echo("No Project Euler files found in the current directory.") sys.exit(1) for file in files: p = Problem(int(file[:3])) # Catch KeyboardInterrupt during verification to allow the user # to skip the verification of a problem if it takes too long try: is_correct = verify(p, filename=file, exit=False) except KeyboardInterrupt: overview[p.num] = status['skipped'] else: if is_correct is None: # error was returned by problem file overview[p.num] = status['error'] elif is_correct: overview[p.num] = status['correct'] elif not is_correct: overview[p.num] = status['incorrect'] # Attempt to add "skipped" suffix to the filename if the # problem file is not the current problem. This is useful # when the --verify-all is used in a directory containing # files generated pre-v1.1 (before files with suffixes) if p.num != current_p.num: rename_file(file, p.suf_name('skipped')) # Separate each verification with a newline click.echo() # Print overview of the status of each problem legend = ', '.join('{0} = {1}'.format(v, k) for k, v in status.items()) click.echo('-' * 63) click.echo(legend + '\n') # Rows needed for overview is based on the current problem number num_of_rows = (current_p.num + 19) // 20 for row in range(1, num_of_rows + 1): low, high = (row * 20) - 19, (row * 20) click.echo("Problems {0:03d}-{1:03d}: ".format(low, high), nl=False) for problem in range(low, high + 1): # Add missing status to problems with no corresponding file status = overview[problem] if problem in overview else '.' # Separate problem indicators into groups of 5 spacer = ' ' if (problem % 5 == 0) else ' ' # Start a new line at the end of each row click.secho(status + spacer, nl=(problem % 20 == 0)) click.echo()
def verify_all(num): """ Verifies all problem files in the current directory and prints an overview of the status of each problem. """ # Define various problem statuses keys = ('correct', 'incorrect', 'error', 'skipped', 'missing') symbols = ('C', 'I', 'E', 'S', '.') colours = ('green', 'red', 'yellow', 'cyan', 'white') status = OrderedDict( (key, click.style(symbol, fg=colour, bold=True)) for key, symbol, colour in zip(keys, symbols, colours)) overview = {} # Search through problem files using glob module files = problem_glob() # No Project Euler files in the current directory if not files: click.echo("No Project Euler files found in the current directory.") sys.exit(1) for file in files: # Catch KeyboardInterrupt during verification to allow the user to # skip the verification of a specific problem if it takes too long try: is_correct = verify(file.num, filename=str(file), exit=False) except KeyboardInterrupt: overview[file.num] = status['skipped'] else: if is_correct is None: # error was returned by problem file overview[file.num] = status['error'] elif is_correct: overview[file.num] = status['correct'] elif not is_correct: overview[file.num] = status['incorrect'] # Attempt to add "skipped" suffix to the filename if the # problem file is not the current problem. This is useful # when the --verify-all is used in a directory containing # files generated pre-v1.1 (before files with suffixes) if file.num != num: file.change_suffix('-skipped') # Separate each verification with a newline click.echo() # Print overview of the status of each problem legend = ', '.join('{} = {}'.format(v, k) for k, v in status.items()) click.echo('-' * 63) click.echo(legend + '\n') # Rows needed for overview is based on the current problem number num_of_rows = (num + 19) // 20 for row in range(1, num_of_rows + 1): low, high = (row * 20) - 19, (row * 20) click.echo("Problems {:03d}-{:03d}: ".format(low, high), nl=False) for problem in range(low, high + 1): # Add missing status to problems with no corresponding file status = overview[problem] if problem in overview else '.' # Separate problem indicators into groups of 5 spacer = ' ' if (problem % 5 == 0) else ' ' # Start a new line at the end of each row click.secho(status + spacer, nl=(problem % 20 == 0)) click.echo()