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 very easily be extended to work with:

  • any programming language usable from the command-line,

  • any runner (shell, Makefile, ant) usable from the command-line,

  • any site that exposes information about contests/problems in an uniform and web-accessible form.

Support

Following sites and runner/language combinations are currently supported. If this bothers you, please check Contribute section.

Sites supported:

Runners/languages supported:

C++

Python

POSIX shell

sh.9 / cpp.9

sh.9 / py.9

OS supported:

  • Linux (tested)

Installation

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

$ pip install --upgrade --user hac

Install as super-user at your own risk:

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

Usage

Special commands that don’t fetch remote data:

$ hac -h             # show help
$ hac --version      # show version
$ hac --copy-config  # copy configuration

Commands that fetch remote data and processes 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.

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 this manner:

  • defaults are taken from hacrc from default-configuration directory (un-modifiable by user),

  • settings are taken from ~/.config/hac/hacrc and those that are present there override settings from hacrc from default-configuration directory,

  • settings are taken from command-line arguments and those that are present there override settings from ~/.config/hac/hacrc and default hacrc.

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-modified files in ~/.config/hac subdirectories to prevent over-shadowing of updated files in default-configuration directory. To remove all files in those directories run (careful, destructive):

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

To copy all default-configuration files in a temporary directory (useful when you want to use any of the default files as a starting point for your custom file).

$ HAC_CONFIG_DIR=~/temp_config hac --copy-config
$ # ... change some files from ~/temp_config and copy them to ~/.config/hac
$ rm -r ~/temp_config   # remove temporary directory

When HAC is started, selected language templates are copied to the destination directories unchanged while selected runner templates are processed (interpolated) with corresponding template-parts. For example cpp.dbg_run.9.sh is interpolated in temp.9.sh at the point where $dbg_run label appears alone in the line in temp.9.sh file.

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 -d0 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 ~/CF527
$ hac -w~/CF527 -d1 -t1 prep http://codeforces.com/527 B C

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

$ cd ~/CF527/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:

$ cd ~/CF527/B
$ ./B.cpp.sh -d 2

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


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