trackler 2.1.0.21 → 2.1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/tracks/delphi/exercises/allergies/uAllergiesExample.pas +10 -3
- data/tracks/ocaml/.travis-ci.sh +3 -1
- data/tracks/ocaml/exercises/acronym/Makefile +1 -1
- data/tracks/ocaml/exercises/acronym/example.ml +1 -1
- data/tracks/ocaml/exercises/acronym/test.ml +2 -4
- data/tracks/ocaml/exercises/all-your-base/example.ml +1 -1
- data/tracks/ocaml/exercises/all-your-base/test.ml +1 -1
- data/tracks/ocaml/exercises/anagram/example.ml +1 -1
- data/tracks/ocaml/exercises/anagram/test.ml +1 -1
- data/tracks/ocaml/exercises/atbash-cipher/example.ml +1 -1
- data/tracks/ocaml/exercises/atbash-cipher/test.ml +1 -1
- data/tracks/ocaml/exercises/beer-song/example.ml +1 -1
- data/tracks/ocaml/exercises/beer-song/test.ml +1 -1
- data/tracks/ocaml/exercises/binary-search/Makefile +1 -1
- data/tracks/ocaml/exercises/binary-search/example.ml +5 -5
- data/tracks/ocaml/exercises/binary-search/test.ml +1 -1
- data/tracks/ocaml/exercises/bob/example.ml +1 -1
- data/tracks/ocaml/exercises/bob/test.ml +1 -1
- data/tracks/ocaml/exercises/bowling/bowling.mli +1 -1
- data/tracks/ocaml/exercises/bowling/example.ml +1 -1
- data/tracks/ocaml/exercises/bowling/test.ml +1 -1
- data/tracks/ocaml/exercises/bracket-push/example.ml +1 -1
- data/tracks/ocaml/exercises/bracket-push/test.ml +1 -1
- data/tracks/ocaml/exercises/change/example.ml +1 -1
- data/tracks/ocaml/exercises/change/test.ml +1 -1
- data/tracks/ocaml/exercises/connect/example.ml +1 -1
- data/tracks/ocaml/exercises/connect/test.ml +1 -1
- data/tracks/ocaml/exercises/difference-of-squares/example.ml +1 -1
- data/tracks/ocaml/exercises/difference-of-squares/test.ml +1 -1
- data/tracks/ocaml/exercises/dominoes/example.ml +1 -1
- data/tracks/ocaml/exercises/dominoes/test.ml +1 -1
- data/tracks/ocaml/exercises/etl/example.ml +1 -1
- data/tracks/ocaml/exercises/etl/test.ml +1 -1
- data/tracks/ocaml/exercises/grade-school/example.ml +1 -1
- data/tracks/ocaml/exercises/grade-school/grade_school.mli +1 -1
- data/tracks/ocaml/exercises/grade-school/test.ml +1 -1
- data/tracks/ocaml/exercises/hamming/example.ml +1 -1
- data/tracks/ocaml/exercises/hamming/test.ml +1 -1
- data/tracks/ocaml/exercises/hangman/example.ml +1 -1
- data/tracks/ocaml/exercises/hello-world/test.ml +1 -1
- data/tracks/ocaml/exercises/hexadecimal/example.ml +1 -1
- data/tracks/ocaml/exercises/hexadecimal/test.ml +1 -1
- data/tracks/ocaml/exercises/leap/test.ml +1 -1
- data/tracks/ocaml/exercises/list-ops/test.ml +1 -1
- data/tracks/ocaml/exercises/luhn/example.ml +1 -1
- data/tracks/ocaml/exercises/luhn/test.ml +1 -1
- data/tracks/ocaml/exercises/meetup/example.ml +1 -1
- data/tracks/ocaml/exercises/meetup/test.ml +1 -1
- data/tracks/ocaml/exercises/minesweeper/example.ml +1 -1
- data/tracks/ocaml/exercises/minesweeper/test.ml +1 -1
- data/tracks/ocaml/exercises/nucleotide-count/example.ml +1 -1
- data/tracks/ocaml/exercises/nucleotide-count/nucleotide_count.mli +1 -1
- data/tracks/ocaml/exercises/nucleotide-count/test.ml +1 -1
- data/tracks/ocaml/exercises/pangram/example.ml +1 -1
- data/tracks/ocaml/exercises/pangram/test.ml +1 -1
- data/tracks/ocaml/exercises/phone-number/example.ml +1 -1
- data/tracks/ocaml/exercises/phone-number/test.ml +1 -1
- data/tracks/ocaml/exercises/prime-factors/example.ml +1 -1
- data/tracks/ocaml/exercises/prime-factors/test.ml +1 -1
- data/tracks/ocaml/exercises/raindrops/example.ml +1 -1
- data/tracks/ocaml/exercises/raindrops/test.ml +1 -1
- data/tracks/ocaml/exercises/rna-transcription/example.ml +1 -1
- data/tracks/ocaml/exercises/rna-transcription/test.ml +1 -1
- data/tracks/ocaml/exercises/robot-name/example.ml +1 -1
- data/tracks/ocaml/exercises/robot-name/test.ml +1 -1
- data/tracks/ocaml/exercises/roman-numerals/test.ml +1 -1
- data/tracks/ocaml/exercises/run-length-encoding/example.ml +1 -1
- data/tracks/ocaml/exercises/run-length-encoding/test.ml +1 -1
- data/tracks/ocaml/exercises/say/example.ml +1 -1
- data/tracks/ocaml/exercises/say/test.ml +1 -1
- data/tracks/ocaml/exercises/space-age/example.ml +1 -1
- data/tracks/ocaml/exercises/space-age/test.ml +1 -1
- data/tracks/ocaml/exercises/triangle/example.ml +1 -1
- data/tracks/ocaml/exercises/triangle/test.ml +1 -1
- data/tracks/ocaml/exercises/word-count/example.ml +1 -1
- data/tracks/ocaml/exercises/word-count/test.ml +1 -1
- data/tracks/ocaml/exercises/word-count/word_count.mli +1 -3
- data/tracks/ocaml/exercises/zipper/example.ml +1 -1
- data/tracks/ocaml/exercises/zipper/test.ml +1 -1
- data/tracks/ocaml/exercises/zipper/tree.ml +1 -1
- data/tracks/ocaml/exercises/zipper/tree.mli +1 -1
- data/tracks/ocaml/exercises/zipper/zipper.mli +1 -1
- data/tracks/ocaml/tools/test-generator/src/canonical_data_checker.ml +1 -1
- data/tracks/ocaml/tools/test-generator/src/codegen.ml +1 -1
- data/tracks/ocaml/tools/test-generator/src/controller.ml +1 -1
- data/tracks/ocaml/tools/test-generator/src/debug.ml +1 -1
- data/tracks/ocaml/tools/test-generator/src/files.ml +1 -1
- data/tracks/ocaml/tools/test-generator/src/model.ml +1 -1
- data/tracks/ocaml/tools/test-generator/src/parser.ml +5 -5
- data/tracks/ocaml/tools/test-generator/src/special_cases.ml +1 -1
- data/tracks/ocaml/tools/test-generator/src/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/src/test_gen.ml +1 -1
- data/tracks/ocaml/tools/test-generator/src/utils.ml +2 -2
- data/tracks/ocaml/tools/test-generator/templates/acronym/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/all-your-base/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/anagram/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/atbash-cipher/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/beer-song/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/binary-search/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/bob/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/bowling/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/bracket-push/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/change/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/connect/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/difference-of-squares/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/dominoes/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/etl/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/hamming/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/hello-world/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/leap/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/luhn/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/minesweeper/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/pangram/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/phone-number/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/prime-factors/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/raindrops/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/roman-numerals/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/run-length-encoding/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/say/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/space-age/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/triangle/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/word-count/template.ml +1 -1
- data/tracks/ocaml/tools/test-generator/test/all_tests.ml +1 -1
- data/tracks/ocaml/tools/test-generator/test/codegen_test.ml +1 -1
- data/tracks/ocaml/tools/test-generator/test/model_test.ml +1 -1
- data/tracks/ocaml/tools/test-generator/test/parser_test.ml +1 -1
- data/tracks/ocaml/tools/test-generator/test/special_cases_test.ml +1 -1
- data/tracks/ocaml/tools/test-generator/test/template_test.ml +1 -1
- data/tracks/ocaml/tools/test-generator/test/utils_test.ml +1 -1
- data/tracks/r/.travis.yml +13 -2
- data/tracks/r/README.md +35 -16
- data/tracks/r/bin/run_lints.R +30 -0
- data/tracks/r/bin/run_tests.R +35 -0
- data/tracks/r/exercises/anagram/anagram.R +1 -1
- data/tracks/r/exercises/anagram/example.R +5 -5
- data/tracks/r/exercises/anagram/test_anagram.R +1 -15
- data/tracks/r/exercises/bob/bob.R +1 -1
- data/tracks/r/exercises/bob/example.R +2 -2
- data/tracks/r/exercises/bob/test_bob.R +1 -13
- data/tracks/r/exercises/difference-of-squares/example.R +5 -5
- data/tracks/r/exercises/difference-of-squares/test_difference-of-squares.R +2 -0
- data/tracks/r/exercises/grains/example.R +6 -6
- data/tracks/r/exercises/grains/grains.R +2 -2
- data/tracks/r/exercises/grains/test_grains.R +1 -2
- data/tracks/r/exercises/hamming/example.R +3 -3
- data/tracks/r/exercises/hamming/hamming.R +1 -1
- data/tracks/r/exercises/hamming/test_hamming.R +1 -1
- data/tracks/r/exercises/hello-world/example.R +1 -1
- data/tracks/r/exercises/hello-world/test_hello-world.R +1 -1
- data/tracks/r/exercises/isogram/example.R +4 -4
- data/tracks/r/exercises/isogram/isogram.R +1 -1
- data/tracks/r/exercises/isogram/test_isogram.R +1 -1
- data/tracks/r/exercises/largest-series-product/example.R +11 -11
- data/tracks/r/exercises/largest-series-product/largest-series-product.R +2 -2
- data/tracks/r/exercises/largest-series-product/test_largest-series-product.R +16 -16
- data/tracks/r/exercises/leap/leap.R +1 -1
- data/tracks/r/exercises/leap/test_leap.R +1 -1
- data/tracks/r/exercises/luhn/example.R +16 -10
- data/tracks/r/exercises/luhn/test_luhn.R +1 -1
- data/tracks/r/exercises/pascals-triangle/example.R +10 -10
- data/tracks/r/exercises/pascals-triangle/pascals-triangle.R +2 -2
- data/tracks/r/exercises/pascals-triangle/test_pascals-triangle.R +8 -8
- data/tracks/r/exercises/perfect-numbers/example.R +3 -3
- data/tracks/r/exercises/perfect-numbers/perfect-numbers.R +1 -1
- data/tracks/r/exercises/perfect-numbers/test_perfect-numbers.R +12 -12
- data/tracks/r/exercises/phone-number/example.R +8 -8
- data/tracks/r/exercises/phone-number/phone-number.R +1 -1
- data/tracks/r/exercises/phone-number/test_phone-number.R +11 -11
- data/tracks/r/exercises/prime-factors/example.R +2 -2
- data/tracks/r/exercises/prime-factors/prime-factors.R +1 -1
- data/tracks/r/exercises/prime-factors/test_prime-factors.R +1 -1
- data/tracks/r/exercises/raindrops/example.R +12 -11
- data/tracks/r/exercises/raindrops/test_raindrops.R +3 -2
- data/tracks/r/exercises/rna-transcription/example.R +3 -3
- data/tracks/r/exercises/rna-transcription/test_rna-transcription.R +1 -1
- data/tracks/r/exercises/rotational-cipher/example.R +7 -7
- data/tracks/r/exercises/rotational-cipher/test_rotational-cipher.R +3 -2
- data/tracks/r/exercises/scrabble-score/example.R +5 -4
- data/tracks/r/exercises/scrabble-score/scrabble-score.R +1 -1
- data/tracks/r/exercises/scrabble-score/test_scrabble-score.R +12 -12
- data/tracks/r/exercises/secret-handshake/example.R +6 -6
- data/tracks/r/exercises/secret-handshake/test_secret-handshake.R +5 -3
- data/tracks/r/exercises/sieve/test_sieve.R +1 -1
- data/tracks/r/exercises/space-age/example.R +8 -3
- data/tracks/r/exercises/space-age/space-age.R +1 -1
- data/tracks/r/exercises/space-age/test_space-age.R +1 -1
- data/tracks/r/exercises/sum-of-multiples/test_sum-of-multiples.R +1 -1
- data/tracks/r/exercises/tournament/example.R +14 -8
- data/tracks/r/exercises/tournament/test_tournament.R +1 -1
- data/tracks/r/exercises/word-count/example.R +9 -2
- data/tracks/r/exercises/word-count/test_word-count.R +1 -1
- data/tracks/r/exercises/word-count/word-count.R +1 -1
- data/tracks/vimscript/README.md +14 -9
- metadata +4 -2
data/tracks/r/.travis.yml
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
---
|
|
2
|
-
language:
|
|
2
|
+
language: R
|
|
3
|
+
cache: packages
|
|
4
|
+
r:
|
|
5
|
+
- oldrel
|
|
6
|
+
- release
|
|
7
|
+
- devel
|
|
8
|
+
install:
|
|
9
|
+
- R -e "install.packages('testthat')"
|
|
10
|
+
- R -e "install.packages('jsonlite')"
|
|
11
|
+
- R -e "install.packages('lintr')"
|
|
12
|
+
- R -e "install.packages('magrittr')"
|
|
3
13
|
script:
|
|
4
14
|
- bin/fetch-configlet
|
|
5
15
|
- bin/configlet .
|
|
6
|
-
|
|
16
|
+
- R -e "source('bin/run_tests.R')"
|
|
17
|
+
- R -e "source('bin/run_lints.R')"
|
data/tracks/r/README.md
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# xR
|
|
2
2
|
|
|
3
|
+
[](https://travis-ci.org/exercism/xr)
|
|
4
|
+
[](https://gitter.im/exercism/dev?utm_source=share-link&utm_medium=link&utm_campaign=share-link)
|
|
5
|
+
|
|
3
6
|
Exercism problems in R
|
|
4
7
|
|
|
5
8
|
## Contributing Guide
|
|
@@ -52,8 +55,19 @@ A general description of all the files and directories can be found [here](https
|
|
|
52
55
|
|
|
53
56
|
#### Directory structure
|
|
54
57
|
```bash
|
|
58
|
+
├── .gitignore
|
|
59
|
+
├── .travis.yml
|
|
60
|
+
├── .github
|
|
61
|
+
│ └── stale.yml
|
|
62
|
+
├── config.json
|
|
63
|
+
├── README.md
|
|
64
|
+
└── LICENSE
|
|
65
|
+
├── img
|
|
66
|
+
│ └── icon.png
|
|
55
67
|
├── bin
|
|
56
|
-
│
|
|
68
|
+
│ ├── fetch‐configlet
|
|
69
|
+
│ ├── run_lints.R
|
|
70
|
+
│ └── run_tests.R
|
|
57
71
|
├── docs
|
|
58
72
|
│ ├── ABOUT.md
|
|
59
73
|
│ ├── INSTALLATION.md
|
|
@@ -62,31 +76,24 @@ A general description of all the files and directories can be found [here](https
|
|
|
62
76
|
│ └── TESTS.md
|
|
63
77
|
└── exercises
|
|
64
78
|
├── TRACK_HINTS.md
|
|
65
|
-
|
|
79
|
+
├── <exercise-name>
|
|
66
80
|
│ ├── <exercise-name>.R
|
|
67
|
-
│
|
|
81
|
+
│ ├── example.R
|
|
68
82
|
│ └── test_<exercise-name>.R
|
|
69
|
-
|
|
83
|
+
├── <exercise-name>
|
|
70
84
|
│ ├── <exercise-name>.R
|
|
71
|
-
│
|
|
85
|
+
│ ├── example.R
|
|
72
86
|
│ └── test_<exercise-name>.R
|
|
73
87
|
└── ...
|
|
74
|
-
└── img
|
|
75
|
-
└── icon.png
|
|
76
|
-
├── .gitignore
|
|
77
|
-
├── .travis.yml
|
|
78
|
-
├── LICENSE
|
|
79
|
-
├── README.md
|
|
80
|
-
└── config.json
|
|
81
88
|
```
|
|
82
89
|
- `config.json`: Note that every exercise has to be registered here, with a unique name and a difficulty. The sequence order in this file determines the default order in which the exercises are fetched.
|
|
83
90
|
|
|
84
91
|
#### Exercise structure
|
|
85
92
|
Each exercise has the following structure:
|
|
86
|
-
- `HINTS.md` is an optional file containing instructions and/or hints. It is used together with the respective `description.md` for the exercise from [x-common](https://github.com/exercism/x-common) to build the `README.md` file.
|
|
87
93
|
- `<exercise-name>.R` usually contains an empty function declaration, as a starting point for the required solution.
|
|
88
94
|
- `example.R` is the source code of the sample solution.
|
|
89
95
|
- `test_<exercise-name>.R` is the [test suite](#test-suite).
|
|
96
|
+
- `HINTS.md` is an optional file containing instructions and/or hints. It is used together with the respective `description.md` for the exercise from [x-common](https://github.com/exercism/x-common) to build the `README.md` file.
|
|
90
97
|
|
|
91
98
|
### Writing an issue
|
|
92
99
|
To report a bug you should [create an issue](https://help.github.com/articles/creating-an-issue/) [here](https://github.com/exercism/xr/issues).
|
|
@@ -104,17 +111,29 @@ The example solution doesn't have to be perfect, but should pass all of the test
|
|
|
104
111
|
The test suite should be derived from the respective `x-common/exercises/<exercise-name>/canonical-data.json` and comply to some formatting and coding standards (to get an idea you can look at some of the existing tests).
|
|
105
112
|
|
|
106
113
|
### Running tests
|
|
107
|
-
To run the tests for
|
|
114
|
+
To run the tests for just a single exercise, run `source('test_<exercise-name>.R')` from within the exercise's directory. Note that when testing locally you'll need to replace the first line of `test_<exercise-name>.R` (which sources `<exercise-name>.R`) with `source('example.R')`. If you do this, remember to change it back before submitting any pull requests.
|
|
115
|
+
|
|
116
|
+
Alternatively, to run tests for all exercises at once, simply run `source("bin/run_tests.R")`.
|
|
108
117
|
|
|
109
118
|
The example solutions must pass the tests without failures. Additionally the tests should not run longer than a few seconds.
|
|
110
119
|
|
|
111
|
-
In order to be accepted by Travis-CI,
|
|
120
|
+
In order to be accepted by Travis-CI, each exercise must be registered in `config.json`.
|
|
112
121
|
|
|
113
122
|
### Style guide
|
|
114
|
-
|
|
123
|
+
There are a variety of R style guides in circulation and opinions on the topic can vary widely which does make it hard to settle on specific standards. Our preference is to have R code in this repository follow Hadley Wickham's [R style guide](http://adv-r.had.co.nz/Style.html).
|
|
115
124
|
|
|
116
125
|
You are thus encouraged to run [`lintr`](https://github.com/jimhester/lintr) on your R scripts before opening a [pull request](#writing-a-pull-request) in order to check that your code adheres to this style guide before submitting it for review.
|
|
117
126
|
|
|
127
|
+
Note however that at the moment only the following linting rules are strictly enforced:
|
|
128
|
+
|
|
129
|
+
- line length should be less than 80 characters
|
|
130
|
+
- objects should not be in camelCase, snake_case is preferred
|
|
131
|
+
- the assignment operator <- should be used
|
|
132
|
+
- all commas should be followed by a space (but not preceded by one)
|
|
133
|
+
- no absolute paths should be used
|
|
134
|
+
|
|
135
|
+
To perform these specific checks locally, run `source("bin/run_lints.R")`.
|
|
136
|
+
|
|
118
137
|
## License
|
|
119
138
|
|
|
120
139
|
The MIT License (MIT)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
library(lintr)
|
|
2
|
+
|
|
3
|
+
linters <- list(
|
|
4
|
+
a = line_length_linter(80),
|
|
5
|
+
b = camel_case_linter,
|
|
6
|
+
c = assignment_linter,
|
|
7
|
+
d = commas_linter,
|
|
8
|
+
e = absolute_paths_linter
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
files <- list.files(path = "exercises", pattern = ".+\\.R$", recursive = TRUE, full.names = TRUE)
|
|
12
|
+
lints <- lintr:::flatten_lints(lapply(files, function(file) {
|
|
13
|
+
if (interactive()) {
|
|
14
|
+
message(".", appendLF = FALSE)
|
|
15
|
+
}
|
|
16
|
+
lint(file, linters, parse_settings = FALSE)
|
|
17
|
+
}))
|
|
18
|
+
if (interactive()) {
|
|
19
|
+
message()
|
|
20
|
+
}
|
|
21
|
+
lints <- lintr:::reorder_lints(lints)
|
|
22
|
+
class(lints) <- "lints"
|
|
23
|
+
|
|
24
|
+
has_lints <- length(lints) > 0
|
|
25
|
+
lint_output <- NULL
|
|
26
|
+
if (has_lints) {
|
|
27
|
+
lint_output <- paste(collapse = "\n", capture.output(print(lints)))
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
testthat::expect(!has_lints, paste(sep = "\n", "Not lint free", lint_output))
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
library(jsonlite)
|
|
2
|
+
library(testthat)
|
|
3
|
+
library(magrittr)
|
|
4
|
+
|
|
5
|
+
test_exercise <- function(exercise) {
|
|
6
|
+
|
|
7
|
+
solution_file <- paste0(exercise, ".R")
|
|
8
|
+
test_file <- paste0("test_", exercise, ".R")
|
|
9
|
+
|
|
10
|
+
file.copy(
|
|
11
|
+
file.path("..", "exercises", exercise, "example.R"),
|
|
12
|
+
solution_file
|
|
13
|
+
)
|
|
14
|
+
file.copy(
|
|
15
|
+
file.path("..", "exercises", exercise, test_file),
|
|
16
|
+
test_file
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
source(test_file)
|
|
20
|
+
rm(list = ls())
|
|
21
|
+
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
# create temp directory for testing purposes
|
|
25
|
+
temp_dir <- "temp"
|
|
26
|
+
dir.create(temp_dir)
|
|
27
|
+
setwd(temp_dir)
|
|
28
|
+
|
|
29
|
+
# read config and test all exercises
|
|
30
|
+
config <- fromJSON(file.path("..", "config.json"))
|
|
31
|
+
lapply(config$exercises$slug, test_exercise)
|
|
32
|
+
|
|
33
|
+
# clean up
|
|
34
|
+
setwd(dir = "../")
|
|
35
|
+
unlink("temp", recursive = TRUE)
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
anagram <- function(subject,candidates) {
|
|
1
|
+
anagram <- function(subject, candidates) {
|
|
2
2
|
# subject is a string
|
|
3
3
|
# candidates is a character vector
|
|
4
4
|
# break subject into vector of characters
|
|
5
5
|
subject <- tolower(subject)
|
|
6
6
|
test_candidates <- tolower(candidates)
|
|
7
|
-
l <- strsplit(subject,"")[[1]]
|
|
7
|
+
l <- strsplit(subject, "")[[1]]
|
|
8
8
|
# sub out each character from l in candidates
|
|
9
9
|
for (i in l) {
|
|
10
|
-
test_candidates <- sub(i,"",test_candidates)
|
|
10
|
+
test_candidates <- sub(i, "", test_candidates)
|
|
11
11
|
}
|
|
12
|
-
result <- candidates[test_candidates=="" &
|
|
12
|
+
result <- candidates[test_candidates == "" &
|
|
13
13
|
tolower(candidates) != subject &
|
|
14
14
|
nchar(candidates) == length(l)]
|
|
15
|
-
if (length(result)==0) {
|
|
15
|
+
if (length(result) == 0) {
|
|
16
16
|
return(c())
|
|
17
17
|
}
|
|
18
18
|
return(result)
|