Skip to main content

hac - Helper for Algorithm Competitions

Project description

hac is highly extensible and configurable command-line tool intended to ease the boring part of solving algorithm problems:

  • preparing directory structure,

  • preparing source-code files,

  • preparing runner files (scripts used for testing solutions),

  • downloading test-cases.

hac can be extended very easily to work with:

  • any programming language usable from the command-line,

  • any runner usable from the command-line (examples: shell scripts, Makefiles, ant scripts),

  • any site that exposes information about contests/problems in an uniform and web-accessible form (examples: Codeforces, Codechef).

Support

If lack of support for particular programming language or site irks you, please check Contribute section. This section contains current up-to-date support info.

Sites supported:

Runner/language combinations supported:

POSIX shell

C++

sh.9 / cpp.9

Python

sh.9 / py.9

OS supported:

  • Linux (tested)

Python versions

  • 2.7

  • 3.3

  • 3.4

Installation

To install hac you need to have pip installed on your system. Since hac messes with the file-system it is strongly advisable to install it as regular user (to mitigate the responsibility that comes with power ;) ):

$ pip install --upgrade --user hac

Install as super-user at your own risk:

user$ # ... switch to super-user
root$ pip install --upgrade hac

Usage

Special commands that don’t fetch remote data:

$ hac --help         # show help
$ hac --version      # show version
$ hac --copy-config  # copy configuration (to ~/.config/hac by default)

Commands that fetch remote data and process it (more info in Examples):

$ hac [options...] (prep | show) (CONTEST | PROBLEM) [PROBLEM [PROBLEM ...]]

For up-to-date list of command-line arguments and switches check hac’s help message.

Examples

1) Display verbose information about:

  • hac’s configuration,

  • available sites, runner and language templates,

  • selected site, contest and problems,

  • problems’ information for Codeforces contest #527.

$ hac -v show http://codeforces.com/527

2a) For problems “B” and “C” from Codeforces contest #527 prepare:

  • source-file from cpp highest priority template (has lowest X among all cpp.X templates),

  • runner from sh.9 template (gets interpolated for cpp language template),

  • pre-tests downloaded from Codeforces.

$ mkdir ~/contests && cd ~/contests
$ hac -d2 -lcpp -rsh.9 prep http://codeforces.com/527 B C

With default configuration any of the following lines is equivalent to the one above:

$ hac -lcpp.9 -rsh.9 prep http://codeforces.com/527 b c
$ hac http://codeforces.com/527 B C
$ hac cf/527 2 3

2b) Write solution for problem “B” and test it on pre-tests:

$ cd 527/B
$ # ... modify B.cpp
$ ./B.cpp.sh -e  # test solution on pre-tests
$ ./B.cpp.sh -c  # clean generated outputs

2c) Debug solution for problem “B” on 2nd pre-test:

$ ./B.cpp.sh -d 2

Tutorial

To copy configuration to user’s local directory (~/.config/hac by default, modifiable with HAC_CONFIG_DIR environment variable) run:

$ hac --copy-config

Modify user specific configuration by changing files in ~/.config/hac. File hacrc is main settings file. Total hac settings are calculated in a cascaded manner (similar in concept to how CSS works) by:

  • taking settings from hacrc from default-configuration directory (not writable by user),

  • overriding above settings with those from ~/.config/hac/hacrc,

  • overriding above settings with those from command-line arguments.

Files in ~/.config/hac sub-directories (lang, runner, site) over-shadow files in default-configuration directory with the same name. For example file ~/.config/hac/lang/temp.9.cpp over-shadows temp.9.cpp in default-configuration directory.

Template-part ~/.config/hac/runner/cpp.exec_compile.9.sh over-shadows cpp.exec_compile.9.sh in default-configuration directory. This template-part gets interpolated in temp.9.sh when runner sh.9 is prepared for any cpp language template. Modifying ~/.config/hac/runner/cpp.exec_compile.9.sh allows us change compilation flags or compiler used for C++ source compilation.

It is best to remove un-customized files in ~/.config/hac/{lang,runner,site} subdirectories to prevent possible over-shadowing of updated files in default-configuration directory (when hac gets updated). To remove all files in those directories run (careful, destructive):

$ rm -r ~/.config/hac/*/*

If you want to use any of the default configuration/template files as a starting point for your customized files, you can:

  • copy all default-configuration files in a temporary directory,

  • modify and move to ~/.config/hac files of interest and throw away others.

$ HAC_CONFIG_DIR=~/temp_config hac --copy-config
$ # ... modify interesting files in ~/temp_config and move them to
$ # ... ~/.config/hac
$ rm -r ~/temp_config   # remove temporary directory

When hac is run to prepare the environment (prep command):

  • selected language templates are copied for each task to the destination directories unchanged,

  • selected runner templates are processed (interpolated) with corresponding template-parts. For example if cpp and sh.9 are selected, contents of cpp.dbg_run.9.sh are interpolated in temp.9.sh (appropriately indented) at the point of where label $dbg_run occurs alone in the line in temp.9.sh file.

Priority labels of runner templates and runner-parts are completely separate from the priority labels of language templates. This means that

  • cpp.dbg_run.9.sh is exclusively a runner-part for temp.9.sh runner template (and not for temp.3.sh or temp.4.sh for example),

  • on the other hand, cpp.dbg_run.9.sh gets interpolated in temp.9.sh when any cpp language template is selected (either cpp.3 or cpp.9 or even cpp.100) with sh.9 runner template.

Authors

Zoran Plesivčak created hac and these fine people have contributed.

Contribute

Contributions are more than welcome! Please see CONTRIBUTING.

Change Log

Please see CHANGELOG.

Licence

Please see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hac-1.0.3.tar.gz (29.4 kB view hashes)

Uploaded Source

Built Distribution

hac-1.0.3-py2.py3-none-any.whl (32.6 kB view hashes)

Uploaded Python 2 Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page