Uso de codewars offline

2017/04/16

En lo siguiente se describe como ejecutar los katas de codewars de forma offline.

Para ello se utilizará el proyecto codewars-runner-cli, el cual permite la ejecución de código en distintos lenguajes mediante el uso de docker-compose (docker) y es desarrollado por codewars.

Se descarga el repositorio del proyecto:

$ mkdir -p ~/src
$ cd ~/src
$ git clone --depth=1 git@github.com:Codewars/codewars-runner-cli.git

Se crea un directorio en el cual se descargará la información del kata.

Esto se realiza utilizando el script codewars-kata-download descrito en el post Descarga de katas de codewars

Como ejemplo se descarga el kata a-rule-of-divisibility-by-13 en lenguaje C:

$ mkdir -p ~/workspace/kata
$ cd ~/workspace/kata
$ codewars-kata-download <access-token> a-rule-of-divisibility-by-13 c
$ cd a-rule-of-divisibility-by-13_c

Se prueba la solución del kata utilizando codewars-runner-cli:

$ docker-compose -f ~/src/codewars-runner-cli/docker-compose.yml \
    run --rm c -c "$(cat solution.c)" -f "$(cat tests.c)"

<DESCRIBE::>CoreTests

<IT::>ShouldPassAllTheTestsProvided
Error. Expected 79 but got 140289692680224

<FAILED::>The expression (exp) == (act) is false.

<COMPLETEDIN::>0.034098

<COMPLETEDIN::>

Luego de implementar la función en el archivo solution.c:

$ cat > solution.c <<'END'
long long calculate(long long n)
{
    static int remainders[] = {1, 10, 9, 12, 3, 4};
    static int size = sizeof(remainders)/sizeof(int);
    long long result = 0;
    int index = 0;

    while (n > 0) {
        result += (n % 10) * remainders[index++];
        n /= 10;
        if (index >= size) {
            index = 0;
        }
    }
    return result;
}

long long thirt(long long n)
{
    long long current;
    while (1) {
        current = calculate(n);
        if (n == current) {
            return current;
        }
        n = current;
    }
}
END
$ docker-compose -f ~/src/codewars-runner-cli/docker-compose.yml \
    run --rm c -c "$(cat solution.c)" -f "$(cat tests.c)"

<DESCRIBE::>CoreTests

<IT::>ShouldPassAllTheTestsProvided

<PASSED::>Test Passed

<PASSED::>Test Passed

<PASSED::>Test Passed

<PASSED::>Test Passed

<PASSED::>Test Passed

<COMPLETEDIN::>0.013810

<COMPLETEDIN::>