EasyEuler 1.2.1
A command line tool for Project Euler
License: MIT
Keywords: EasyEuler

EasyEuler
=========

EasyEuler is a configurable command line tool for working with Project
Euler. It provides support for many languages out of the box and adding
more is easy.

This project was inspired by
`EulerPy <https://github.com/iKevinY/EulerPy>`__ and intends to provide
the same functionality for a larger variety of languages.

Installation
============

EasyEuler can be installed from PyPI using
`pip <https://pip.pypa.io/en/latest/>`__:

.. code:: bash

    $ pip install easyeuler

Usage
=====

Use ``create`` to create a new problem file:

.. code:: bash

    $ easyeuler create 1 python
    Written to euler_001.py

    $ cat euler_001.py
    """
    Problem 1: Multiples of 3 and 5

    If we list all the natural numbers below 10 that are multiples of 3 or 5,
    we get 3, 5, 6 and 9. The sum of these multiples is 23.

    Find the sum of all the multiples of 3 or 5 below 1000.

    """

Once you've come up with a solution, output the result and check if it's
correct with ``verify``:

.. code:: bash

    $ easyeuler verify euler_001.py
    Checking output of euler_001.py: [no output]  # output in red

    $ echo print(12345) > euler_001.py
    $ easyeuler verify euler_001.py
    Checking output of euler_001.py: 12345        # incorrect solution, output in red

    $ echo print(42) > euler_001.py
    $ easyeuler verify euler_001.py
    Checking output of euler_001.py: 42           # correct solution, output in green

You can even time the execution of your solutions with the ``time``
flag:

.. code:: bash

    $ easyeuler verify --time euler_001.py
    Checking output of euler_001.py: 42
    CPU times - user: 16.7ms, system: 3.33ms, total: 20ms
    Wall time: 1.02s

...and execute multiple at once:

.. code:: bash

    $ easyeuler verify *
    Checking output of euler_001.py: 42
    Checking output of euler_002.c: 12345
    Checking output of euler_003.py: [error]  # [error] is displayed if an error occurs during execution

Some problems come with additional files, use ``generate-resources`` to
generate those:

.. code:: bash

    $ easyeuler create 22 python
    Written to euler_022.py
    $ cat euler_022.py
    """
    Problem 22: Names scores

    [....]

    This problem references the following resources:

    names.txt

    """

    $ easyeuler generate-resources 22  # specify the problem ID to generate problem-specific resources
    Created names.txt at path .

    $ easyeuler generate-resources     # or leave it empty to generate all resources
    [....]
    Created 326_formula2.gif at path .
    Created 326_formula1.gif at path .
    Created 327_rooms_of_doom.gif at path .
    Created 330_formula.gif at path .

Use ``list`` and ``show`` to browse problems:

.. code:: bash

    $ easyeuler list
    ╒══════╤════════════════════════════════════╤══════════════╕
    │   ID │ Name                               │ Difficulty   │
    ╞══════╪════════════════════════════════════╪══════════════╡
    │    1 │ Multiples of 3 and 5               │ 5%           │
    ├──────┼────────────────────────────────────┼──────────────┤
    │    2 │ Even Fibonacci numbers             │ 5%           │
    ├──────┼────────────────────────────────────┼──────────────┤
    │    3 │ Largest prime factor               │ 5%           │
    ├──────┼────────────────────────────────────┼──────────────┤
    [....]

    $ easyeuler show 2
    Problem 2: Even Fibonacci numbers

    Each new term in the Fibonacci sequence is generated by adding the
    previous two terms. By starting with 1 and 2, the first 10 terms will be:

                      1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

    Find the sum of all the even-valued terms in the sequence which do not
    exceed four million.

Configuration
=============

EasyEuler is designed to be configurable and adaptable to any language
you may want to use it with. It follows the `XDG Base Directory Specification
<https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html>`__
for locating configuration files. The default location is
``$HOME/.config/EasyEuler``.
To see examples of configuration, look at ``config.json`` and the ``templates``
directory inside the package.

Languages
~~~~~~~~~
Adding a new language is as easy as adding a few lines to the ``config.json``
file.

A language has the following general attributes:

-  ``name`` - name of the language. (required)
-  ``extension`` - file extension for the language. (required)
-  ``template`` - name of the template file. (default: ``name``)

These commands are executed in order when using the ``verify`` command:

-  ``build`` - build the file if required.
-  ``execute`` - time this command and compare the output to the solution. (default: ``./{path}``)
-  ``cleanup`` - remove binary files after execution, etc.

Templates
~~~~~~~~~
Templates use the `Jinja2 <http://jinja.pocoo.org>`__ templating engine.
New templates should go in the ``templates`` directory inside the configuration
directory.

Requirements
============

EasyEuler requires `Python
3.5+ <https://www.python.org/downloads/release/python-350/>`__, along
with the `Click <http://click.pocoo.org>`__,
`Jinja2 <http://jinja.pocoo.org>`__ and
`tabulate <https://pypi.python.org/pypi/tabulate>`__ modules.
It has been tested on Windows and Linux and it should work on any other
Unix-based platforms, including macOS.

Contributing
============
Please see `CONTRIBUTING.rst
<https://github.com/Encrylize/EasyEuler/blob/master/CONTRIBUTING.rst>`__
for information on how to contribute to this project.

Acknowledgements
================

The problem descriptions are courtesy of the
`EulerPy <https://github.com/iKevinY/EulerPy>`__ project, which
formatted the descriptions from Kyle Keen's `Local
Euler <http://kmkeen.com/local-euler>`__ project into a human-readable
form.

License
=======

EasyEuler is licensed under the `MIT
license <https://en.wikipedia.org/wiki/MIT_License>`__.