trackler 2.2.1.6 → 2.2.1.7

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.
Files changed (236) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/tracks/c/README.md +27 -0
  4. data/tracks/coffeescript/config.json +1 -0
  5. data/tracks/coldfusion/config.json +1 -1
  6. data/tracks/crystal/README.md +27 -7
  7. data/tracks/crystal/config/maintainers.json +25 -0
  8. data/tracks/crystal/generator/spec/remote_data_file_spec.cr +1 -1
  9. data/tracks/crystal/generator/src/exercise_generator.cr +1 -1
  10. data/tracks/crystal/generator/src/remote_data_file.cr +2 -2
  11. data/tracks/csharp/config.json +1 -2
  12. data/tracks/csharp/config/maintainers.json +55 -0
  13. data/tracks/csharp/docs/EXERCISE_README_INSERT.md +1 -1
  14. data/tracks/csharp/exercises/accumulate/README.md +1 -1
  15. data/tracks/csharp/exercises/acronym/README.md +1 -1
  16. data/tracks/csharp/exercises/all-your-base/README.md +1 -1
  17. data/tracks/csharp/exercises/allergies/README.md +1 -1
  18. data/tracks/csharp/exercises/alphametics/README.md +1 -1
  19. data/tracks/csharp/exercises/anagram/README.md +1 -1
  20. data/tracks/csharp/exercises/atbash-cipher/README.md +1 -1
  21. data/tracks/csharp/exercises/bank-account/README.md +1 -1
  22. data/tracks/csharp/exercises/beer-song/README.md +1 -1
  23. data/tracks/csharp/exercises/binary-search-tree/README.md +1 -1
  24. data/tracks/csharp/exercises/binary-search/README.md +1 -1
  25. data/tracks/csharp/exercises/bob/README.md +1 -1
  26. data/tracks/csharp/exercises/book-store/README.md +1 -1
  27. data/tracks/csharp/exercises/bowling/README.md +1 -1
  28. data/tracks/csharp/exercises/bracket-push/README.md +1 -1
  29. data/tracks/csharp/exercises/change/README.md +1 -1
  30. data/tracks/csharp/exercises/circular-buffer/README.md +1 -1
  31. data/tracks/csharp/exercises/clock/README.md +1 -1
  32. data/tracks/csharp/exercises/connect/README.md +1 -1
  33. data/tracks/csharp/exercises/crypto-square/README.md +1 -1
  34. data/tracks/csharp/exercises/custom-set/README.md +1 -1
  35. data/tracks/csharp/exercises/diamond/README.md +1 -1
  36. data/tracks/csharp/exercises/difference-of-squares/README.md +1 -1
  37. data/tracks/csharp/exercises/diffie-hellman/README.md +1 -1
  38. data/tracks/csharp/exercises/dominoes/README.md +1 -1
  39. data/tracks/csharp/exercises/dot-dsl/README.md +1 -1
  40. data/tracks/csharp/exercises/error-handling/README.md +1 -1
  41. data/tracks/csharp/exercises/etl/README.md +1 -1
  42. data/tracks/csharp/exercises/flatten-array/README.md +1 -1
  43. data/tracks/csharp/exercises/food-chain/README.md +1 -1
  44. data/tracks/csharp/exercises/forth/README.md +1 -1
  45. data/tracks/csharp/exercises/gigasecond/README.md +1 -1
  46. data/tracks/csharp/exercises/go-counting/README.md +1 -1
  47. data/tracks/csharp/exercises/grade-school/README.md +1 -1
  48. data/tracks/csharp/exercises/grains/README.md +1 -1
  49. data/tracks/csharp/exercises/grep/README.md +1 -1
  50. data/tracks/csharp/exercises/hamming/README.md +1 -1
  51. data/tracks/csharp/exercises/hangman/README.md +1 -1
  52. data/tracks/csharp/exercises/hello-world/README.md +1 -1
  53. data/tracks/csharp/exercises/house/README.md +1 -1
  54. data/tracks/csharp/exercises/isogram/README.md +1 -1
  55. data/tracks/csharp/exercises/kindergarten-garden/README.md +1 -1
  56. data/tracks/csharp/exercises/largest-series-product/README.md +1 -1
  57. data/tracks/csharp/exercises/leap/README.md +1 -1
  58. data/tracks/csharp/exercises/ledger/README.md +1 -1
  59. data/tracks/csharp/exercises/linked-list/README.md +1 -1
  60. data/tracks/csharp/exercises/list-ops/README.md +1 -1
  61. data/tracks/csharp/exercises/luhn/README.md +1 -1
  62. data/tracks/csharp/exercises/markdown/README.md +1 -1
  63. data/tracks/csharp/exercises/matrix/README.md +1 -1
  64. data/tracks/csharp/exercises/meetup/README.md +1 -1
  65. data/tracks/csharp/exercises/minesweeper/README.md +1 -1
  66. data/tracks/csharp/exercises/nth-prime/README.md +1 -1
  67. data/tracks/csharp/exercises/nucleotide-count/README.md +1 -1
  68. data/tracks/csharp/exercises/ocr-numbers/README.md +1 -1
  69. data/tracks/csharp/exercises/palindrome-products/README.md +1 -1
  70. data/tracks/csharp/exercises/pangram/README.md +1 -1
  71. data/tracks/csharp/exercises/parallel-letter-frequency/README.md +1 -1
  72. data/tracks/csharp/exercises/pascals-triangle/README.md +1 -1
  73. data/tracks/csharp/exercises/perfect-numbers/README.md +1 -1
  74. data/tracks/csharp/exercises/phone-number/README.md +1 -1
  75. data/tracks/csharp/exercises/pig-latin/README.md +1 -1
  76. data/tracks/csharp/exercises/poker/README.md +1 -1
  77. data/tracks/csharp/exercises/pov/README.md +1 -1
  78. data/tracks/csharp/exercises/prime-factors/README.md +1 -1
  79. data/tracks/csharp/exercises/protein-translation/README.md +1 -1
  80. data/tracks/csharp/exercises/proverb/README.md +1 -1
  81. data/tracks/csharp/exercises/pythagorean-triplet/README.md +1 -1
  82. data/tracks/csharp/exercises/queen-attack/README.md +1 -1
  83. data/tracks/csharp/exercises/rail-fence-cipher/README.md +1 -1
  84. data/tracks/csharp/exercises/raindrops/README.md +1 -1
  85. data/tracks/csharp/exercises/react/README.md +1 -1
  86. data/tracks/csharp/exercises/rectangles/README.md +1 -1
  87. data/tracks/csharp/exercises/rna-transcription/README.md +1 -1
  88. data/tracks/csharp/exercises/robot-name/README.md +1 -1
  89. data/tracks/csharp/exercises/robot-simulator/README.md +1 -1
  90. data/tracks/csharp/exercises/roman-numerals/README.md +1 -1
  91. data/tracks/csharp/exercises/rotational-cipher/README.md +1 -1
  92. data/tracks/csharp/exercises/run-length-encoding/README.md +1 -1
  93. data/tracks/csharp/exercises/saddle-points/README.md +1 -1
  94. data/tracks/csharp/exercises/say/README.md +1 -1
  95. data/tracks/csharp/exercises/scale-generator/README.md +1 -1
  96. data/tracks/csharp/exercises/scrabble-score/README.md +1 -1
  97. data/tracks/csharp/exercises/secret-handshake/README.md +1 -1
  98. data/tracks/csharp/exercises/series/README.md +1 -1
  99. data/tracks/csharp/exercises/sgf-parsing/README.md +1 -1
  100. data/tracks/csharp/exercises/sieve/README.md +1 -1
  101. data/tracks/csharp/exercises/simple-cipher/README.md +1 -1
  102. data/tracks/csharp/exercises/simple-linked-list/README.md +1 -1
  103. data/tracks/csharp/exercises/space-age/README.md +1 -1
  104. data/tracks/csharp/exercises/strain/README.md +1 -1
  105. data/tracks/csharp/exercises/sublist/README.md +1 -1
  106. data/tracks/csharp/exercises/sum-of-multiples/README.md +1 -1
  107. data/tracks/csharp/exercises/tournament/README.md +1 -1
  108. data/tracks/csharp/exercises/transpose/README.md +1 -1
  109. data/tracks/csharp/exercises/tree-building/README.md +1 -1
  110. data/tracks/csharp/exercises/triangle/README.md +1 -1
  111. data/tracks/csharp/exercises/twelve-days/README.md +1 -1
  112. data/tracks/csharp/exercises/two-bucket/README.md +1 -1
  113. data/tracks/csharp/exercises/variable-length-quantity/README.md +1 -1
  114. data/tracks/csharp/exercises/word-count/README.md +1 -1
  115. data/tracks/csharp/exercises/word-search/README.md +1 -1
  116. data/tracks/csharp/exercises/wordy/README.md +1 -1
  117. data/tracks/csharp/exercises/zebra-puzzle/README.md +1 -1
  118. data/tracks/csharp/exercises/zipper/README.md +1 -1
  119. data/tracks/d/config.json +1 -0
  120. data/tracks/dart/config/maintainers.json +15 -0
  121. data/tracks/ecmascript/config.json +76 -193
  122. data/tracks/ecmascript/exercises/twelve-days/README.md +66 -0
  123. data/tracks/ecmascript/exercises/twelve-days/example.js +53 -0
  124. data/tracks/ecmascript/exercises/twelve-days/package.json +68 -0
  125. data/tracks/ecmascript/exercises/twelve-days/twelve-days.spec.js +106 -0
  126. data/tracks/factor/config.json +1 -1
  127. data/tracks/fsharp/config/maintainers.json +35 -0
  128. data/tracks/go/config.json +82 -38
  129. data/tracks/go/config/maintainers.json +13 -22
  130. data/tracks/go/exercises/bowling/cases_test.go +11 -11
  131. data/tracks/go/exercises/forth/cases_test.go +7 -7
  132. data/tracks/go/exercises/forth/example.go +1 -1
  133. data/tracks/go/exercises/forth/forth_test.go +1 -1
  134. data/tracks/go/exercises/hamming/cases_test.go +7 -7
  135. data/tracks/go/exercises/hamming/hamming.go +1 -1
  136. data/tracks/go/exercises/phone-number/cases_test.go +2 -7
  137. data/tracks/go/exercises/phone-number/example.go +1 -1
  138. data/tracks/go/exercises/phone-number/phone_number_test.go +1 -1
  139. data/tracks/go/exercises/rna-transcription/cases_test.go +7 -7
  140. data/tracks/go/exercises/secret-handshake/cases_test.go +1 -1
  141. data/tracks/groovy/config.json +1 -0
  142. data/tracks/haxe/config.json +1 -1
  143. data/tracks/java/.travis.yml +1 -1
  144. data/tracks/java/config/maintainers.json +20 -0
  145. data/tracks/java/exercises/custom-set/src/test/java/CustomSetTest.java +1 -1
  146. data/tracks/java/exercises/word-count/src/test/java/WordCountTest.java +1 -1
  147. data/tracks/javascript/config.json +229 -247
  148. data/tracks/kotlin/config/maintainers.json +35 -0
  149. data/tracks/lfe/config/maintainers.json +15 -0
  150. data/tracks/lisp/config/maintainers.json +55 -0
  151. data/tracks/ocaml/config.json +0 -5
  152. data/tracks/ocaml/config/maintainers.json +25 -0
  153. data/tracks/perl5/config/maintainers.json +25 -0
  154. data/tracks/perl6/config/maintainers.json +25 -0
  155. data/tracks/pony/config/maintainers.json +15 -0
  156. data/tracks/pony/exercises/atbash-cipher/example.pony +2 -2
  157. data/tracks/pony/exercises/beer-song/example.pony +1 -1
  158. data/tracks/pony/exercises/bob/example.pony +1 -1
  159. data/tracks/pony/exercises/difference-of-squares/example.pony +1 -1
  160. data/tracks/pony/exercises/hamming/test.pony +12 -12
  161. data/tracks/pony/exercises/pascals-triangle/example.pony +1 -1
  162. data/tracks/pony/exercises/pascals-triangle/test.pony +6 -6
  163. data/tracks/pony/exercises/rna-transcription/test.pony +3 -3
  164. data/tracks/pony/exercises/roman-numerals/test.pony +3 -3
  165. data/tracks/purescript/config/maintainers.json +35 -0
  166. data/tracks/r/config.json +140 -81
  167. data/tracks/r/exercises/collatz-conjecture/README.md +43 -0
  168. data/tracks/r/exercises/collatz-conjecture/collatz-conjecture.R +3 -0
  169. data/tracks/r/exercises/collatz-conjecture/example.R +13 -0
  170. data/tracks/r/exercises/collatz-conjecture/test_collatz-conjecture.R +28 -0
  171. data/tracks/r/exercises/nucleotide-count/README.md +43 -0
  172. data/tracks/r/exercises/nucleotide-count/example.R +17 -0
  173. data/tracks/r/exercises/nucleotide-count/nucleotide-count.R +3 -0
  174. data/tracks/r/exercises/nucleotide-count/test_nucleotide-count.R +51 -0
  175. data/tracks/r/exercises/pangram/README.md +25 -0
  176. data/tracks/r/exercises/pangram/example.R +14 -0
  177. data/tracks/r/exercises/pangram/pangram.R +3 -0
  178. data/tracks/r/exercises/pangram/test_pangram.R +42 -0
  179. data/tracks/r/exercises/triangle/.meta/hints.md +4 -0
  180. data/tracks/r/exercises/triangle/README.md +41 -0
  181. data/tracks/r/exercises/triangle/example.R +23 -0
  182. data/tracks/r/exercises/triangle/test_triangle.R +72 -0
  183. data/tracks/r/exercises/triangle/triangle.R +3 -0
  184. data/tracks/rust/config.json +32 -1
  185. data/tracks/rust/config/maintainers.json +1 -6
  186. data/tracks/rust/exercises/acronym/tests/acronym.rs +1 -1
  187. data/tracks/rust/exercises/beer-song/example.rs +1 -1
  188. data/tracks/rust/exercises/circular-buffer/example.rs +8 -10
  189. data/tracks/rust/exercises/circular-buffer/tests/circular-buffer.rs +2 -2
  190. data/tracks/rust/exercises/clock/.meta/hints.md +10 -0
  191. data/tracks/rust/exercises/clock/Cargo.lock +4 -0
  192. data/tracks/rust/exercises/clock/Cargo.toml +6 -0
  193. data/tracks/rust/exercises/clock/README.md +57 -0
  194. data/tracks/rust/exercises/clock/example.rs +32 -0
  195. data/tracks/{ocaml/exercises/point-mutations/example.ml → rust/exercises/clock/src/lib.rs} +0 -0
  196. data/tracks/rust/exercises/clock/tests/clock.rs +331 -0
  197. data/tracks/rust/exercises/custom-set/tests/custom-set.rs +3 -3
  198. data/tracks/rust/exercises/dominoes/example.rs +1 -1
  199. data/tracks/rust/exercises/grade-school/example.rs +1 -1
  200. data/tracks/rust/exercises/hamming/example.rs +1 -1
  201. data/tracks/rust/exercises/nth-prime/Cargo.lock +4 -0
  202. data/tracks/rust/exercises/nth-prime/Cargo.toml +6 -0
  203. data/tracks/rust/exercises/nth-prime/README.md +47 -0
  204. data/tracks/rust/exercises/nth-prime/example.rs +28 -0
  205. data/tracks/rust/exercises/nth-prime/src/lib.rs +0 -0
  206. data/tracks/rust/exercises/nth-prime/tests/nth-prime.rs +30 -0
  207. data/tracks/rust/exercises/parallel-letter-frequency/example.rs +1 -1
  208. data/tracks/rust/exercises/phone-number/example.rs +1 -1
  209. data/tracks/rust/exercises/pythagorean-triplet/Cargo.lock +4 -0
  210. data/tracks/rust/exercises/pythagorean-triplet/Cargo.toml +6 -0
  211. data/tracks/rust/exercises/pythagorean-triplet/README.md +56 -0
  212. data/tracks/rust/exercises/pythagorean-triplet/example.rs +11 -0
  213. data/tracks/rust/exercises/pythagorean-triplet/src/lib.rs +0 -0
  214. data/tracks/rust/exercises/pythagorean-triplet/tests/pythagorean-triplet.rs +6 -0
  215. data/tracks/rust/exercises/rna-transcription/tests/rna-transcription.rs +1 -1
  216. data/tracks/rust/exercises/robot-name/tests/robot-name.rs +2 -2
  217. data/tracks/rust/exercises/say/example.rs +4 -4
  218. data/tracks/rust/exercises/say/tests/say.rs +4 -4
  219. data/tracks/rust/exercises/tournament/example.rs +2 -2
  220. data/tracks/scala/config/maintainers.json +10 -6
  221. data/tracks/scala/exercises/bracket-push/example.scala +2 -2
  222. data/tracks/scala/exercises/bracket-push/src/test/scala/BracketPushTest.scala +74 -0
  223. data/tracks/scala/exercises/crypto-square/example.scala +9 -9
  224. data/tracks/scala/exercises/crypto-square/src/test/scala/CryptoSquareTest.scala +33 -41
  225. data/tracks/scala/testgen/src/main/scala/BracketPushTestGenerator.scala +9 -38
  226. data/tracks/scala/testgen/src/main/scala/CryptoSquareTestGenerator.scala +17 -0
  227. data/tracks/sml/config.json +1 -1
  228. data/tracks/swift/config/maintainers.json +35 -0
  229. data/tracks/swift/docs/ABOUT.md +15 -5
  230. data/tracks/vimscript/config/maintainers.json +35 -0
  231. metadata +58 -8
  232. data/tracks/ocaml/exercises/point-mutations/Makefile +0 -8
  233. data/tracks/ocaml/exercises/point-mutations/README.md +0 -81
  234. data/tracks/ocaml/exercises/point-mutations/dna.mli +0 -6
  235. data/tracks/scala/exercises/bracket-push/src/test/scala/BracketsTest.scala +0 -68
  236. data/tracks/scala/exercises/crypto-square/src/main/scala/CryptoSquare.scala +0 -11
@@ -0,0 +1,43 @@
1
+ # Collatz Conjecture
2
+
3
+ The Collatz Conjecture or 3x+1 problem can be summarized as follows:
4
+
5
+ Take any positive integer n. If n is even, divide n by 2 to get n / 2. If n is
6
+ odd, multiply n by 3 and add 1 to get 3n + 1. Repeat the process indefinitely.
7
+ The conjecture states that no matter which number you start with, you will
8
+ always reach 1 eventually.
9
+
10
+ Given a number n, return the number of steps required to reach 1.
11
+
12
+ ## Examples
13
+ Starting with n = 12, the steps would be as follows:
14
+
15
+ 0. 12
16
+ 1. 6
17
+ 2. 3
18
+ 3. 10
19
+ 4. 5
20
+ 5. 16
21
+ 6. 8
22
+ 7. 4
23
+ 8. 2
24
+ 9. 1
25
+
26
+ Resulting in 9 steps. So for input n = 12, the return value would be 9.
27
+
28
+
29
+ ## Installation
30
+ See [this guide](https://github.com/exercism/xr/blob/master/docs/INSTALLATION.md) for instructions on how to setup your local R environment.
31
+
32
+ ## How to implement your solution
33
+ In each problem folder, there is a file named `<exercise_name>.R` containing a function that returns a `NULL` value. Place your implementation inside the body of the function.
34
+
35
+ ## How to run tests
36
+ Inside of RStudio, simply execute the `test_<exercise_name>.R` script. This can be conveniently done with [testthat's `auto_test` function](https://www.rdocumentation.org/packages/testthat/topics/auto_test). Because exercism code and tests are in the same folder, use this same path for both `code_path` and `test_path` parameters. On the command-line, you can also run `Rscript test_<exercise_name>.R`.
37
+
38
+ ## Source
39
+
40
+ An unsolved problem in mathematics named after mathematician Lothar Collatz [https://en.wikipedia.org/wiki/3x_%2B_1_problem](https://en.wikipedia.org/wiki/3x_%2B_1_problem)
41
+
42
+ ## Submitting Incomplete Solutions
43
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -0,0 +1,3 @@
1
+ collatz_step_counter <- function(num) {
2
+
3
+ }
@@ -0,0 +1,13 @@
1
+ collatz_step_counter <- function(num) {
2
+
3
+ if (num <= 0) {
4
+ stop("Only positive numbers are allowed")
5
+ } else if (num == 1) {
6
+ return(0)
7
+ } else if (num %% 2 == 0) {
8
+ return(1 + collatz_step_counter(num/2))
9
+ } else {
10
+ return(1 + collatz_step_counter(3*num + 1))
11
+ }
12
+
13
+ }
@@ -0,0 +1,28 @@
1
+ source("./collatz-conjecture.R")
2
+ library(testthat)
3
+
4
+ test_that("Input of 1 results in 0 steps", {
5
+ expect_equal(collatz_step_counter(1), 0)
6
+ })
7
+
8
+ test_that("Even input with repeated even steps", {
9
+ expect_equal(collatz_step_counter(16), 4)
10
+ })
11
+
12
+ test_that("Input which results in small number of even and odd steps", {
13
+ expect_equal(collatz_step_counter(12), 9)
14
+ })
15
+
16
+ test_that("Input which results in large number of even and odd steps", {
17
+ expect_equal(collatz_step_counter(1000000), 152)
18
+ })
19
+
20
+ test_that("Input of 0 results in an error", {
21
+ expect_error(collatz_step_counter(0))
22
+ })
23
+
24
+ test_that("Negative input results in an error", {
25
+ expect_error(collatz_step_counter(-15))
26
+ })
27
+
28
+ message("All tests passed for exercise: collatz-conjecture")
@@ -0,0 +1,43 @@
1
+ # Nucleotide Count
2
+
3
+ Given a DNA string, compute how many times each nucleotide occurs in the string.
4
+
5
+ DNA is represented by an alphabet of the following symbols: 'A', 'C',
6
+ 'G', and 'T'.
7
+
8
+ Each symbol represents a nucleotide, which is a fancy name for the
9
+ particular molecules that happen to make up a large part of DNA.
10
+
11
+ Shortest intro to biochemistry EVAR:
12
+
13
+ - twigs are to birds nests as
14
+ - nucleotides are to DNA and RNA as
15
+ - amino acids are to proteins as
16
+ - sugar is to starch as
17
+ - oh crap lipids
18
+
19
+ I'm not going to talk about lipids because they're crazy complex.
20
+
21
+ So back to nucleotides.
22
+
23
+ DNA contains four types of them: adenine (`A`), cytosine (`C`), guanine
24
+ (`G`), and thymine (`T`).
25
+
26
+ RNA contains a slightly different set of nucleotides, but we don't care
27
+ about that for now.
28
+
29
+ ## Installation
30
+ See [this guide](https://github.com/exercism/xr/blob/master/docs/INSTALLATION.md) for instructions on how to setup your local R environment.
31
+
32
+ ## How to implement your solution
33
+ In each problem folder, there is a file named `<exercise_name>.R` containing a function that returns a `NULL` value. Place your implementation inside the body of the function.
34
+
35
+ ## How to run tests
36
+ Inside of RStudio, simply execute the `test_<exercise_name>.R` script. This can be conveniently done with [testthat's `auto_test` function](https://www.rdocumentation.org/packages/testthat/topics/auto_test). Because exercism code and tests are in the same folder, use this same path for both `code_path` and `test_path` parameters. On the command-line, you can also run `Rscript test_<exercise_name>.R`.
37
+
38
+ ## Source
39
+
40
+ The Calculating DNA Nucleotides_problem at Rosalind [http://rosalind.info/problems/dna/](http://rosalind.info/problems/dna/)
41
+
42
+ ## Submitting Incomplete Solutions
43
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -0,0 +1,17 @@
1
+ library(magrittr)
2
+
3
+ nucleotide_count <- function(input) {
4
+
5
+ strand_chr <- strsplit(input, "")[[1]]
6
+
7
+ nucleotides <- c("A", "C", "G", "T")
8
+
9
+ if (length(strand_chr) > 0 && !all(strand_chr %in% nucleotides)) {
10
+ stop("Invalid nucleotide in strand")
11
+ }
12
+
13
+ nucleotides %>%
14
+ sapply(function(x) {sum(x == strand_chr)}) %>%
15
+ as.list()
16
+
17
+ }
@@ -0,0 +1,3 @@
1
+ nucleotide_count <- function(input) {
2
+
3
+ }
@@ -0,0 +1,51 @@
1
+ source("./nucleotide-count.R")
2
+ library(testthat)
3
+
4
+ # When comparing lists, all.equal expects the objects to be in the same order
5
+ # This expectation instead checks that a) the set of names are the same and
6
+ # b) each named object is equal
7
+ expect_equal_pairs <- function(object, expected) {
8
+ expect_equal(sort(names(object)),
9
+ sort(names(expected)),
10
+ info = "names in lists differ")
11
+ for (name in names(expected)) {
12
+ expect_equal(object[name], expected[name], info = "list element missing")
13
+ }
14
+ }
15
+
16
+ test_that("all zeros for empty strand", {
17
+ expect_equal_pairs(nucleotide_count(""),
18
+ list(
19
+ A = 0,
20
+ C = 0,
21
+ G = 0,
22
+ T = 0
23
+ ))
24
+ })
25
+
26
+ test_that("3 zeros & 1 count for strand with a single repeated nucleotide", {
27
+ expect_equal_pairs(nucleotide_count("GGGGGGG"),
28
+ list(
29
+ A = 0,
30
+ C = 0,
31
+ G = 7,
32
+ T = 0
33
+ ))
34
+ })
35
+
36
+ test_that("correct counts for strand with multiple nucleotides", {
37
+ expect_equal_pairs(nucleotide_count(
38
+ "AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC"),
39
+ list(
40
+ A = 20,
41
+ C = 12,
42
+ G = 17,
43
+ T = 21
44
+ ))
45
+ })
46
+
47
+ test_that("error for strand with invalid nucleotides", {
48
+ expect_error(nucleotide_count("AGXXACT"))
49
+ })
50
+
51
+ message("All tests passed for exercise: nucleotide-count")
@@ -0,0 +1,25 @@
1
+ # Pangram
2
+
3
+ Determine if a sentence is a pangram. A pangram (Greek: παν γράμμα, pan gramma,
4
+ "every letter") is a sentence using every letter of the alphabet at least once.
5
+ The best known English pangram is:
6
+ > The quick brown fox jumps over the lazy dog.
7
+
8
+ The alphabet used consists of ASCII letters `a` to `z`, inclusive, and is case
9
+ insensitive. Input will not contain non-ASCII symbols.
10
+
11
+ ## Installation
12
+ See [this guide](https://github.com/exercism/xr/blob/master/docs/INSTALLATION.md) for instructions on how to setup your local R environment.
13
+
14
+ ## How to implement your solution
15
+ In each problem folder, there is a file named `<exercise_name>.R` containing a function that returns a `NULL` value. Place your implementation inside the body of the function.
16
+
17
+ ## How to run tests
18
+ Inside of RStudio, simply execute the `test_<exercise_name>.R` script. This can be conveniently done with [testthat's `auto_test` function](https://www.rdocumentation.org/packages/testthat/topics/auto_test). Because exercism code and tests are in the same folder, use this same path for both `code_path` and `test_path` parameters. On the command-line, you can also run `Rscript test_<exercise_name>.R`.
19
+
20
+ ## Source
21
+
22
+ Wikipedia [https://en.wikipedia.org/wiki/Pangram](https://en.wikipedia.org/wiki/Pangram)
23
+
24
+ ## Submitting Incomplete Solutions
25
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -0,0 +1,14 @@
1
+ library(magrittr)
2
+
3
+ is_pangram <- function(input) {
4
+
5
+ input_letters <- gsub("[^A-Za-z]", "", input) %>%
6
+ tolower() %>%
7
+ strsplit("") %>%
8
+ unlist() %>%
9
+ unique() %>%
10
+ sort()
11
+
12
+ identical(input_letters, letters)
13
+
14
+ }
@@ -0,0 +1,3 @@
1
+ is_pangram <- function(input) {
2
+
3
+ }
@@ -0,0 +1,42 @@
1
+ source("./pangram.R")
2
+ library(testthat)
3
+
4
+ test_that("sentence empty", {
5
+ expect_false(is_pangram(""))
6
+ })
7
+
8
+ test_that("pangram with only lower case", {
9
+ expect_true(is_pangram("the quick brown fox jumps over the lazy dog"))
10
+ })
11
+
12
+ test_that("missing character 'x'", {
13
+ expect_false(
14
+ is_pangram("a quick movement of the enemy will jeopardize five gunboats"))
15
+ })
16
+
17
+ test_that("another missing character 'x'", {
18
+ expect_false(is_pangram("the quick brown fish jumps over the lazy dog"))
19
+ })
20
+
21
+ test_that("pangram with underscores", {
22
+ expect_true(is_pangram("the_quick_brown_fox_jumps_over_the_lazy_dog"))
23
+ })
24
+
25
+ test_that("pangram with numbers", {
26
+ expect_true(is_pangram("the 1 quick brown fox jumps over the 2 lazy dogs"))
27
+ })
28
+
29
+ test_that("missing letters replaced by numbers", {
30
+ expect_false(is_pangram("7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog"))
31
+ })
32
+
33
+ test_that("pangram with mixed case and punctuation", {
34
+ expect_true(is_pangram("\"Five quacking Zephyrs jolt my wax bed.\""))
35
+ })
36
+
37
+ test_that("upper and lower case versions of the same character should not be
38
+ counted separately", {
39
+ expect_false(is_pangram("the quick brown fox jumped over the lazy FOX"))
40
+ })
41
+
42
+ message("All tests passed for exercise: pangram")
@@ -0,0 +1,4 @@
1
+
2
+ ## Hint
3
+
4
+ For this exercise you will need to implement a simple S3 class. If you are not familiar with S3, a great starting point is the [chapter on S3](http://adv-r.hadley.nz/s3.html) in Hadley Wickham's book Advanced R.
@@ -0,0 +1,41 @@
1
+ # Triangle
2
+
3
+ Determine if a triangle is equilateral, isosceles, or scalene.
4
+
5
+ An _equilateral_ triangle has all three sides the same length.<br/>
6
+ An _isosceles_ triangle has at least two sides the same length. (It is sometimes
7
+ specified as having exactly two sides the same length, but for the purposes of
8
+ this exercise we'll say at least two.)<br/>
9
+ A _scalene_ triangle has all sides of different lengths.
10
+
11
+ ## Note
12
+
13
+ For a shape to be a triangle at all, all sides have to be of length > 0, and
14
+ the sum of the lengths of any two sides must be greater than or equal to the
15
+ length of the third side. See [Triangle Inequality](https://en.wikipedia.org/wiki/Triangle_inequality).
16
+
17
+ ## Dig Deeper
18
+
19
+ The case where the sum of the lengths of two sides _equals_ that of the
20
+ third is known as a _degenerate_ triangle - it has zero area and looks like
21
+ a single line. Feel free to add your own code/tests to check for degenerate triangles.
22
+
23
+ ## Hint
24
+
25
+ For this exercise you will need to implement a simple S3 class. If you are not familiar with S3, a great starting point is the [chapter on S3](http://adv-r.hadley.nz/s3.html) in Hadley Wickham's book Advanced R.
26
+
27
+ ## Installation
28
+ See [this guide](https://github.com/exercism/xr/blob/master/docs/INSTALLATION.md) for instructions on how to setup your local R environment.
29
+
30
+ ## How to implement your solution
31
+ In each problem folder, there is a file named `<exercise_name>.R` containing a function that returns a `NULL` value. Place your implementation inside the body of the function.
32
+
33
+ ## How to run tests
34
+ Inside of RStudio, simply execute the `test_<exercise_name>.R` script. This can be conveniently done with [testthat's `auto_test` function](https://www.rdocumentation.org/packages/testthat/topics/auto_test). Because exercism code and tests are in the same folder, use this same path for both `code_path` and `test_path` parameters. On the command-line, you can also run `Rscript test_<exercise_name>.R`.
35
+
36
+ ## Source
37
+
38
+ The Ruby Koans triangle project, parts 1 & 2 [http://rubykoans.com](http://rubykoans.com)
39
+
40
+ ## Submitting Incomplete Solutions
41
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -0,0 +1,23 @@
1
+ triangle <- function(x, y, z) {
2
+
3
+ checks <- c(x + y < z,
4
+ x + z < y,
5
+ y + z < x,
6
+ x == 0,
7
+ y == 0,
8
+ z == 0)
9
+
10
+ if (any(checks)) {
11
+ stop("Invalid sides for triangle")
12
+ }
13
+
14
+ unique_sides <- length(unique(c(x, y, z)))
15
+
16
+ triangle_class <- switch(unique_sides,
17
+ c("equilateral", "isosceles"),
18
+ "isosceles",
19
+ "scalene")
20
+
21
+ structure(list(x = x, y = y, z = z), class = triangle_class)
22
+
23
+ }
@@ -0,0 +1,72 @@
1
+ source("./triangle.R")
2
+ library(testthat)
3
+
4
+ test_that("true if all sides are equal", {
5
+ expect_is(triangle(2, 2, 2), "equilateral")
6
+ })
7
+
8
+ test_that("false if any side is unequal", {
9
+ expect_false(any("equilateral" %in% class(triangle(2, 3, 2))))
10
+ })
11
+
12
+ test_that("false if no sides are equal", {
13
+ expect_false(any("equilateral" %in% class(triangle(5, 4, 6))))
14
+ })
15
+
16
+ test_that("not equilateral if sides are zero", {
17
+ expect_error(triangle(0, 0, 0))
18
+ })
19
+
20
+ test_that("sides may be floats", {
21
+ expect_is(triangle(0.5, 0.5, 0.5), "equilateral")
22
+ })
23
+
24
+ test_that("isosceles if last two sides are equal", {
25
+ expect_is(triangle(3, 4, 4), "isosceles")
26
+ })
27
+
28
+ test_that("isosceles if first two sides are equal", {
29
+ expect_is(triangle(4, 4, 3), "isosceles")
30
+ })
31
+
32
+ test_that("isosceles if first and last sides are equal", {
33
+ expect_is(triangle(4, 3, 4), "isosceles")
34
+ })
35
+
36
+ test_that("equilateral triangles are also isosceles", {
37
+ expect_is(triangle(4, 4, 4), "isosceles")
38
+ })
39
+
40
+ test_that("not isosceles if no sides are equal", {
41
+ expect_false(any("isosceles" %in% class(triangle(2, 3, 4))))
42
+ })
43
+
44
+ test_that("not isosceles if triangle inequality is violated", {
45
+ expect_error(triangle(1, 1, 3))
46
+ })
47
+
48
+ test_that("sides may be floats", {
49
+ expect_is(triangle(0.5, 0.4, 0.5), "isosceles")
50
+ })
51
+
52
+ test_that("scalene if no sides are equal", {
53
+ expect_is(triangle(5, 4, 6), "scalene")
54
+ })
55
+
56
+ test_that("not scalene if all sides are equal", {
57
+ expect_false(any("scalene" %in% class(triangle(4, 4, 4))))
58
+ })
59
+
60
+ test_that("not scalene if two sides are equal", {
61
+ expect_false(any("scalene" %in% class(triangle(4, 4, 3))))
62
+ })
63
+
64
+ test_that("not scalene if triangle inequality is violated", {
65
+ expect_error(triangle(7, 3, 2))
66
+ })
67
+
68
+ test_that("sides may be floats", {
69
+ expect_is(triangle(0.5, 0.4, 0.6), "scalene")
70
+ })
71
+
72
+ message("All tests passed for exercise: triangle")