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