trackler 2.2.1.47 → 2.2.1.48

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 (277) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/pangram/canonical-data.json +3 -3
  4. data/tracks/common-lisp/.travis.yml +2 -9
  5. data/tracks/common-lisp/docs/TESTS.md +43 -9
  6. data/tracks/delphi/exercises/nucleotide-count/uNucleotideCountTest.pas +2 -2
  7. data/tracks/elixir/.travis.yml +4 -7
  8. data/tracks/elixir/README.md +2 -6
  9. data/tracks/elixir/bin/dialyzer_check.sh +2 -13
  10. data/tracks/elixir/exercises/allergies/example.exs +3 -2
  11. data/tracks/elixir/exercises/atbash-cipher/example.exs +5 -5
  12. data/tracks/elixir/exercises/bank-account/example.exs +11 -11
  13. data/tracks/elixir/exercises/bob/example.exs +4 -4
  14. data/tracks/elixir/exercises/forth/example.exs +66 -48
  15. data/tracks/elixir/exercises/minesweeper/example.exs +31 -18
  16. data/tracks/elixir/exercises/pangram/example.exs +4 -4
  17. data/tracks/elixir/exercises/queen-attack/queen_attack_test.exs +68 -53
  18. data/tracks/elixir/exercises/say/example.exs +33 -31
  19. data/tracks/elixir/exercises/scrabble-score/example.exs +12 -11
  20. data/tracks/elixir/mix.exs +10 -7
  21. data/tracks/elixir/mix.lock +4 -1
  22. data/tracks/erlang/README.md +2 -0
  23. data/tracks/fsharp/exercises/nth-prime/Example.fs +4 -1
  24. data/tracks/fsharp/exercises/nth-prime/NthPrime.fs +1 -1
  25. data/tracks/fsharp/exercises/nth-prime/NthPrimeTest.fs +12 -32
  26. data/tracks/fsharp/exercises/pangram/PangramTest.fs +3 -3
  27. data/tracks/fsharp/exercises/perfect-numbers/Example.fs +9 -6
  28. data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbers.fs +1 -1
  29. data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbersTest.fs +55 -21
  30. data/tracks/fsharp/generators/Generators.fs +18 -0
  31. data/tracks/gnu-apl/config.json +21 -0
  32. data/tracks/gnu-apl/exercises/hamming/README.md +42 -0
  33. data/tracks/gnu-apl/exercises/hamming/hamming-example.apl +5 -0
  34. data/tracks/gnu-apl/exercises/hamming/hamming.tc +75 -0
  35. data/tracks/gnu-apl/exercises/hello-world/README.md +17 -1
  36. data/tracks/gnu-apl/exercises/leap/README.md +33 -0
  37. data/tracks/gnu-apl/exercises/raindrops/README.md +24 -0
  38. data/tracks/gnu-apl/exercises/raindrops/raindrops-example.apl +8 -0
  39. data/tracks/gnu-apl/exercises/raindrops/raindrops.tc +60 -0
  40. data/tracks/gnu-apl/exercises/rna-transcription/README.md +25 -0
  41. data/tracks/gnu-apl/exercises/rna-transcription/rna-transcription-example.apl +7 -0
  42. data/tracks/gnu-apl/exercises/rna-transcription/rna-transcription.tc +41 -0
  43. data/tracks/gnu-apl/test.apl +13 -0
  44. data/tracks/haskell/config.json +9 -0
  45. data/tracks/haskell/exercises/rotational-cipher/README.md +91 -0
  46. data/tracks/haskell/exercises/rotational-cipher/examples/success-standard/package.yaml +16 -0
  47. data/tracks/haskell/exercises/rotational-cipher/examples/success-standard/src/RotationalCipher.hs +9 -0
  48. data/tracks/haskell/exercises/rotational-cipher/package.yaml +20 -0
  49. data/tracks/haskell/exercises/rotational-cipher/src/RotationalCipher.hs +4 -0
  50. data/tracks/haskell/exercises/rotational-cipher/stack.yaml +1 -0
  51. data/tracks/haskell/exercises/rotational-cipher/test/Tests.hs +77 -0
  52. data/tracks/java/config.json +23 -14
  53. data/tracks/java/config/exercise-readme-insert.md +3 -3
  54. data/tracks/java/config/exercise_readme.go.tmpl +3 -0
  55. data/tracks/java/exercises/accumulate/README.md +4 -3
  56. data/tracks/java/exercises/acronym/.meta/{.version → version} +0 -0
  57. data/tracks/java/exercises/acronym/README.md +4 -3
  58. data/tracks/java/exercises/all-your-base/.meta/{.version → version} +0 -0
  59. data/tracks/java/exercises/all-your-base/README.md +4 -3
  60. data/tracks/java/exercises/allergies/README.md +4 -3
  61. data/tracks/java/exercises/anagram/README.md +4 -3
  62. data/tracks/java/exercises/atbash-cipher/README.md +4 -3
  63. data/tracks/java/exercises/bank-account/README.md +6 -3
  64. data/tracks/java/exercises/beer-song/README.md +4 -3
  65. data/tracks/java/exercises/binary-search-tree/.meta/src/reference/java/BinarySearchTree.java +38 -44
  66. data/tracks/java/exercises/binary-search-tree/README.md +4 -3
  67. data/tracks/java/exercises/binary-search-tree/src/main/java/BinarySearchTree.java +35 -0
  68. data/tracks/java/exercises/binary-search-tree/src/test/java/BinarySearchTreeTest.java +46 -40
  69. data/tracks/java/exercises/binary-search/.meta/hints.md +25 -0
  70. data/tracks/java/exercises/binary-search/.meta/src/reference/java/BinarySearch.java +3 -7
  71. data/tracks/java/exercises/binary-search/README.md +33 -3
  72. data/tracks/java/exercises/binary-search/src/test/java/BinarySearchTest.java +11 -11
  73. data/tracks/java/exercises/binary/README.md +4 -3
  74. data/tracks/java/exercises/bob/README.md +4 -3
  75. data/tracks/java/exercises/book-store/README.md +4 -3
  76. data/tracks/java/exercises/bowling/README.md +4 -3
  77. data/tracks/java/exercises/bracket-push/README.md +4 -3
  78. data/tracks/java/exercises/change/.meta/{.version → version} +0 -0
  79. data/tracks/java/exercises/change/README.md +4 -3
  80. data/tracks/java/exercises/circular-buffer/README.md +4 -3
  81. data/tracks/java/exercises/clock/.meta/{.version → version} +0 -0
  82. data/tracks/java/exercises/clock/README.md +6 -3
  83. data/tracks/java/exercises/collatz-conjecture/.meta/{.version → version} +0 -0
  84. data/tracks/java/exercises/collatz-conjecture/README.md +4 -3
  85. data/tracks/java/exercises/complex-numbers/README.md +4 -3
  86. data/tracks/java/exercises/crypto-square/README.md +4 -3
  87. data/tracks/java/exercises/{rna-transcription/.meta/.version → custom-set/.meta/version} +0 -0
  88. data/tracks/java/exercises/custom-set/README.md +4 -3
  89. data/tracks/java/exercises/custom-set/src/test/java/CustomSetTest.java +103 -251
  90. data/tracks/java/exercises/diamond/.meta/{.version → version} +0 -0
  91. data/tracks/java/exercises/diamond/README.md +4 -3
  92. data/tracks/java/exercises/difference-of-squares/.meta/{.version → version} +0 -0
  93. data/tracks/java/exercises/difference-of-squares/README.md +4 -3
  94. data/tracks/java/exercises/etl/README.md +4 -3
  95. data/tracks/java/exercises/flatten-array/.meta/{.version → version} +0 -0
  96. data/tracks/java/exercises/flatten-array/README.md +4 -3
  97. data/tracks/java/exercises/food-chain/README.md +4 -3
  98. data/tracks/java/exercises/forth/.meta/{.version → version} +0 -0
  99. data/tracks/java/exercises/forth/README.md +3 -3
  100. data/tracks/java/exercises/gigasecond/README.md +4 -3
  101. data/tracks/java/exercises/grade-school/README.md +4 -3
  102. data/tracks/java/exercises/hamming/.meta/{.version → version} +0 -0
  103. data/tracks/java/exercises/hamming/README.md +6 -3
  104. data/tracks/java/exercises/hello-world/README.md +6 -3
  105. data/tracks/java/exercises/hexadecimal/README.md +4 -3
  106. data/tracks/java/exercises/house/README.md +4 -3
  107. data/tracks/java/exercises/isogram/README.md +6 -3
  108. data/tracks/java/exercises/kindergarten-garden/README.md +4 -3
  109. data/tracks/java/exercises/largest-series-product/README.md +4 -3
  110. data/tracks/java/exercises/linked-list/README.md +4 -3
  111. data/tracks/java/exercises/list-ops/.meta/{.version → version} +0 -0
  112. data/tracks/java/exercises/list-ops/README.md +6 -3
  113. data/tracks/java/exercises/luhn/README.md +4 -3
  114. data/tracks/java/exercises/matrix/README.md +4 -3
  115. data/tracks/java/exercises/meetup/README.md +4 -3
  116. data/tracks/java/exercises/minesweeper/.meta/{.version → version} +0 -0
  117. data/tracks/java/exercises/minesweeper/README.md +4 -3
  118. data/tracks/java/exercises/nth-prime/README.md +4 -3
  119. data/tracks/java/exercises/nucleotide-count/README.md +4 -3
  120. data/tracks/java/exercises/ocr-numbers/README.md +4 -3
  121. data/tracks/java/exercises/octal/README.md +4 -3
  122. data/tracks/java/exercises/palindrome-products/README.md +4 -3
  123. data/tracks/java/exercises/pangram/.meta/{.version → version} +0 -0
  124. data/tracks/java/exercises/pangram/README.md +4 -3
  125. data/tracks/java/exercises/pascals-triangle/.meta/{.version → version} +0 -0
  126. data/tracks/java/exercises/pascals-triangle/README.md +4 -3
  127. data/tracks/java/exercises/perfect-numbers/.meta/{.version → version} +0 -0
  128. data/tracks/java/exercises/perfect-numbers/README.md +4 -3
  129. data/tracks/java/exercises/phone-number/README.md +4 -3
  130. data/tracks/java/exercises/pig-latin/README.md +4 -3
  131. data/tracks/java/exercises/poker/README.md +4 -3
  132. data/tracks/java/exercises/prime-factors/README.md +4 -3
  133. data/tracks/java/exercises/pythagorean-triplet/README.md +4 -3
  134. data/tracks/java/exercises/queen-attack/README.md +4 -3
  135. data/tracks/java/exercises/raindrops/README.md +4 -3
  136. data/tracks/java/exercises/rectangles/README.md +4 -3
  137. data/tracks/java/exercises/rna-transcription/.meta/version +1 -0
  138. data/tracks/java/exercises/rna-transcription/README.md +4 -3
  139. data/tracks/java/exercises/robot-name/README.md +4 -3
  140. data/tracks/java/exercises/robot-simulator/README.md +4 -3
  141. data/tracks/java/exercises/roman-numerals/README.md +4 -3
  142. data/tracks/java/exercises/rotational-cipher/README.md +4 -3
  143. data/tracks/java/exercises/run-length-encoding/README.md +4 -3
  144. data/tracks/java/exercises/saddle-points/.meta/{.version → version} +0 -0
  145. data/tracks/java/exercises/saddle-points/README.md +4 -3
  146. data/tracks/java/exercises/scrabble-score/.meta/{.version → version} +0 -0
  147. data/tracks/java/exercises/scrabble-score/README.md +4 -3
  148. data/tracks/java/exercises/secret-handshake/README.md +4 -3
  149. data/tracks/java/exercises/series/README.md +4 -3
  150. data/tracks/java/exercises/sieve/README.md +4 -3
  151. data/tracks/java/exercises/simple-cipher/README.md +6 -3
  152. data/tracks/java/exercises/simple-linked-list/README.md +4 -3
  153. data/tracks/java/exercises/space-age/README.md +4 -3
  154. data/tracks/java/exercises/spiral-matrix/.meta/{.version → version} +0 -0
  155. data/tracks/java/exercises/spiral-matrix/README.md +4 -3
  156. data/tracks/java/exercises/strain/README.md +4 -3
  157. data/tracks/java/exercises/sublist/README.md +4 -3
  158. data/tracks/java/exercises/sum-of-multiples/README.md +4 -3
  159. data/tracks/java/exercises/tournament/README.md +4 -3
  160. data/tracks/java/exercises/transpose/README.md +4 -3
  161. data/tracks/java/exercises/triangle/.meta/{.version → version} +0 -0
  162. data/tracks/java/exercises/triangle/README.md +4 -3
  163. data/tracks/java/exercises/trinary/README.md +4 -3
  164. data/tracks/java/exercises/twelve-days/README.md +4 -3
  165. data/tracks/java/exercises/two-fer/README.md +6 -3
  166. data/tracks/java/exercises/word-count/README.md +4 -3
  167. data/tracks/java/exercises/word-search/.meta/{.version → version} +0 -0
  168. data/tracks/java/exercises/word-search/README.md +4 -3
  169. data/tracks/java/exercises/wordy/README.md +4 -3
  170. data/tracks/julia/config.json +13 -0
  171. data/tracks/julia/exercises/phone-number/README.md +36 -0
  172. data/tracks/julia/exercises/phone-number/example.jl +18 -0
  173. data/tracks/julia/exercises/phone-number/phone-number.jl +3 -0
  174. data/tracks/julia/exercises/phone-number/runtests.jl +49 -0
  175. data/tracks/lua/config.json +505 -494
  176. data/tracks/lua/config/maintainers.json +16 -16
  177. data/tracks/lua/exercises/acronym/README.md +0 -1
  178. data/tracks/lua/exercises/all-your-base/README.md +1 -1
  179. data/tracks/lua/exercises/allergies/README.md +0 -1
  180. data/tracks/lua/exercises/alphametics/README.md +2 -2
  181. data/tracks/lua/exercises/atbash-cipher/README.md +2 -1
  182. data/tracks/lua/exercises/beer-song/README.md +1 -1
  183. data/tracks/lua/exercises/binary/README.md +2 -0
  184. data/tracks/lua/exercises/bowling/README.md +20 -6
  185. data/tracks/lua/exercises/change/README.md +1 -1
  186. data/tracks/lua/exercises/circular-buffer/README.md +13 -6
  187. data/tracks/lua/exercises/crypto-square/README.md +4 -4
  188. data/tracks/lua/exercises/diamond/README.md +6 -6
  189. data/tracks/lua/exercises/etl/README.md +2 -0
  190. data/tracks/lua/exercises/flatten-array/README.md +1 -2
  191. data/tracks/lua/exercises/food-chain/README.md +1 -1
  192. data/tracks/lua/exercises/grade-school/README.md +0 -1
  193. data/tracks/lua/exercises/grains/README.md +0 -1
  194. data/tracks/lua/exercises/house/README.md +1 -2
  195. data/tracks/lua/exercises/isogram/README.md +2 -1
  196. data/tracks/lua/exercises/kindergarten-garden/README.md +13 -13
  197. data/tracks/lua/exercises/leap/README.md +1 -1
  198. data/tracks/lua/exercises/linked-list/README.md +10 -10
  199. data/tracks/lua/exercises/luhn/README.md +7 -7
  200. data/tracks/lua/exercises/matrix/README.md +6 -4
  201. data/tracks/lua/exercises/meetup/README.md +1 -2
  202. data/tracks/lua/exercises/nucleotide-count/README.md +8 -22
  203. data/tracks/lua/exercises/ocr-numbers/README.md +5 -5
  204. data/tracks/lua/exercises/octal/README.md +6 -2
  205. data/tracks/lua/exercises/pangram/README.md +1 -1
  206. data/tracks/lua/exercises/pascals-triangle/README.md +1 -1
  207. data/tracks/lua/exercises/perfect-numbers/README.md +2 -2
  208. data/tracks/lua/exercises/phone-number/README.md +3 -2
  209. data/tracks/lua/exercises/pov/README.md +2 -2
  210. data/tracks/lua/exercises/protein-translation/README.md +4 -5
  211. data/tracks/lua/exercises/pythagorean-triplet/README.md +3 -3
  212. data/tracks/lua/exercises/rail-fence-cipher/README.md +12 -7
  213. data/tracks/lua/exercises/react/README.md +29 -0
  214. data/tracks/lua/exercises/react/example.lua +108 -0
  215. data/tracks/lua/exercises/react/react_spec.lua +160 -0
  216. data/tracks/lua/exercises/rectangles/README.md +7 -7
  217. data/tracks/lua/exercises/roman-numerals/README.md +1 -1
  218. data/tracks/lua/exercises/run-length-encoding/README.md +4 -4
  219. data/tracks/lua/exercises/scrabble-score/README.md +3 -1
  220. data/tracks/lua/exercises/secret-handshake/README.md +1 -1
  221. data/tracks/lua/exercises/space-age/README.md +2 -1
  222. data/tracks/lua/exercises/sum-of-multiples/README.md +0 -3
  223. data/tracks/lua/exercises/tournament/README.md +5 -5
  224. data/tracks/lua/exercises/transpose/README.md +7 -7
  225. data/tracks/lua/exercises/triangle/README.md +9 -6
  226. data/tracks/lua/exercises/variable-length-quantity/README.md +6 -7
  227. data/tracks/lua/exercises/word-count/README.md +1 -2
  228. data/tracks/lua/exercises/word-search/README.md +1 -1
  229. data/tracks/perl6/exercises/leap/Example.pm6 +1 -1
  230. data/tracks/perl6/exercises/leap/Leap.pm6 +1 -1
  231. data/tracks/perl6/exercises/leap/example.yaml +1 -1
  232. data/tracks/perl6/exercises/leap/leap.t +3 -3
  233. data/tracks/php/exercises/transpose/example.php +37 -15
  234. data/tracks/php/exercises/transpose/transpose_test.php +205 -45
  235. data/tracks/purescript/config.json +11 -0
  236. data/tracks/purescript/exercises/collatz-conjecture/README.md +33 -0
  237. data/tracks/purescript/exercises/collatz-conjecture/bower.json +26 -0
  238. data/tracks/purescript/exercises/collatz-conjecture/examples/src/CollatzConjecture.purs +15 -0
  239. data/tracks/purescript/exercises/collatz-conjecture/src/CollatzConjecture.purs +3 -0
  240. data/tracks/purescript/exercises/collatz-conjecture/test/Main.purs +43 -0
  241. data/tracks/python/config.json +10 -2
  242. data/tracks/racket/README.md +38 -33
  243. data/tracks/racket/config.json +10 -0
  244. data/tracks/racket/exercises/collatz-conjecture/README.md +58 -0
  245. data/tracks/racket/exercises/collatz-conjecture/collatz-conjecture-test.rkt +34 -0
  246. data/tracks/racket/exercises/collatz-conjecture/collatz-conjecture.rkt +6 -0
  247. data/tracks/racket/exercises/collatz-conjecture/example.rkt +20 -0
  248. data/tracks/ruby/exercises/allergies/.meta/.version +1 -0
  249. data/tracks/ruby/exercises/allergies/.meta/generator/allergies_case.rb +33 -0
  250. data/tracks/ruby/exercises/allergies/.meta/solutions/allergies.rb +4 -0
  251. data/tracks/ruby/exercises/allergies/allergies_test.rb +42 -9
  252. data/tracks/typescript/config.json +46 -0
  253. data/tracks/typescript/exercises/circular-buffer/README.md +74 -0
  254. data/tracks/typescript/exercises/circular-buffer/circular-buffer.example.ts +51 -0
  255. data/tracks/typescript/exercises/circular-buffer/circular-buffer.test.ts +103 -0
  256. data/tracks/typescript/exercises/circular-buffer/circular-buffer.ts +0 -0
  257. data/tracks/typescript/exercises/circular-buffer/package.json +36 -0
  258. data/tracks/typescript/exercises/circular-buffer/tsconfig.json +22 -0
  259. data/tracks/typescript/exercises/circular-buffer/tslint.json +127 -0
  260. data/tracks/typescript/exercises/circular-buffer/yarn.lock +2305 -0
  261. data/tracks/typescript/exercises/largest-series-product/README.md +51 -0
  262. data/tracks/typescript/exercises/largest-series-product/largest-series-product.example.ts +52 -0
  263. data/tracks/typescript/exercises/largest-series-product/largest-series-product.test.ts +68 -0
  264. data/tracks/typescript/exercises/largest-series-product/largest-series-product.ts +0 -0
  265. data/tracks/typescript/exercises/largest-series-product/package.json +36 -0
  266. data/tracks/typescript/exercises/largest-series-product/tsconfig.json +22 -0
  267. data/tracks/typescript/exercises/largest-series-product/tslint.json +127 -0
  268. data/tracks/typescript/exercises/largest-series-product/yarn.lock +2305 -0
  269. data/tracks/typescript/exercises/robot-simulator/README.md +58 -0
  270. data/tracks/typescript/exercises/robot-simulator/package.json +36 -0
  271. data/tracks/typescript/exercises/robot-simulator/robot-simulator.example.ts +74 -0
  272. data/tracks/typescript/exercises/robot-simulator/robot-simulator.test.ts +150 -0
  273. data/tracks/typescript/exercises/robot-simulator/robot-simulator.ts +0 -0
  274. data/tracks/typescript/exercises/robot-simulator/tsconfig.json +22 -0
  275. data/tracks/typescript/exercises/robot-simulator/tslint.json +127 -0
  276. data/tracks/typescript/exercises/robot-simulator/yarn.lock +2305 -0
  277. metadata +85 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 92efa285942ab95f5a2258104af5760d36739a97
4
- data.tar.gz: c64b182d5ac840e3ab7e756817b2270630ca6b4a
3
+ metadata.gz: ec68899acf97545d543c40f4bef852453e55c1e1
4
+ data.tar.gz: 829b5be04375b44cb89e7575d0d8116805d70d48
5
5
  SHA512:
6
- metadata.gz: a61f170722b0b12d153f9264c27801a9f7b54fdba704dd90fa59fe6539f8492caaf32c073617f2d3b4736ca066b53550038da87fdacb1c9d1fa229bc8a001add
7
- data.tar.gz: 2228b20ec990d55cb2cdad808b17bb300cd2166fafce70bc394adbecccdf9d0c4315a140f5805f5c8df6aa1219a47456a1a57f9560f45d15896dde1169a0d734
6
+ metadata.gz: 12372ce3823eb15f1203cebb8164ea17ed425491ce7bcd0958c57769b393ac4b83bb54eb1a732542b3110ba2b9e113c0a9bf3524de352729b4e27b94949359d2
7
+ data.tar.gz: '09d000ded12e61b97617d0a59fc7d1b8933a4091905e9e9455ddcc60756767f282a1d1ab7c18c0a2e1104dc1aba01ba2be2f7e35e1eea26af73d77ead9f5426f'
@@ -1,3 +1,3 @@
1
1
  module Trackler
2
- VERSION = "2.2.1.47"
2
+ VERSION = "2.2.1.48"
3
3
  end
@@ -3,7 +3,7 @@
3
3
  "comments": [
4
4
  "A pangram is a sentence using every letter of the alphabet at least once."
5
5
  ],
6
- "version": "1.2.0",
6
+ "version": "1.3.0",
7
7
  "cases": [
8
8
  {
9
9
  "description": "Check if the given string is an pangram",
@@ -36,9 +36,9 @@
36
36
  "expected": false
37
37
  },
38
38
  {
39
- "description": "another missing character 'x'",
39
+ "description": "another missing character, e.g. 'h'",
40
40
  "property": "isPangram",
41
- "input": "the quick brown fish jumps over the lazy dog",
41
+ "input": "five boxing wizards jump quickly at it",
42
42
  "expected": false
43
43
  },
44
44
  {
@@ -13,22 +13,15 @@ env:
13
13
  - PATH=~/.roswell/bin:$PATH
14
14
  - ROSWELL_INSTALL_DIR=$HOME/.roswell
15
15
  matrix:
16
- - LISP=sbcl
16
+ - LISP=sbcl-bin
17
17
  - LISP=abcl-bin
18
- - LISP=allegro
19
18
  - LISP=ccl-bin
20
19
  - LISP=ecl
21
- - LISP=clasp
22
20
  - LISP=clisp
23
- - LISP=cmu-bin
24
- #- LISP=sbcl-bin
25
21
 
26
22
  matrix:
27
23
  fast_finish: true
28
- allow_failures:
29
- - env: LISP=clasp
30
- - env: LISP=clisp
31
- - env: LISP=cmu-bin
24
+
32
25
 
33
26
  install:
34
27
  - curl -L 'https://raw.githubusercontent.com/snmsts/roswell/release/scripts/install-for-ci.sh' | sh
@@ -9,18 +9,52 @@ with `(lisp-unit:run-tests :all :point-mutations-test)`.
9
9
 
10
10
  ## Making your first Common Lisp solution
11
11
 
12
- To create lisp code that can be loaded with `(load "dna")`
13
- for the first exercise, put this code in `dna.lisp`:
12
+ To create lisp code that can be loaded with `(load "hamming")`
13
+ for the first exercise, put this code in `hamming.lisp`:
14
14
 
15
15
  ```lisp
16
- (in-package #:cl-user)
17
- (defpackage #:dna
18
- (:use #:common-lisp)
19
- (:export #:hamming-distance))
16
+ (defpackage #:hamming
17
+ (:use #:cl)
18
+ (:export #:distance))
20
19
 
21
- (in-package #:dna)
20
+ (in-package #:hamming)
22
21
 
23
- (defun hamming-distance (dna1 dna2)
24
- "Determine number of mutations between DNA strands by computing the Hamming Distance."
22
+ (defun distance (dna1 dna2)
23
+ "Number of positional differences in two equal length dna strands."
24
+ ;;; your solution here
25
25
  )
26
26
  ```
27
+
28
+ ## How to run the tests
29
+
30
+ If you have a running Lisp implementation you can load the test file
31
+ with the command: `(load "hamming-tests")`.
32
+
33
+ If instead you'd like to do it from the command line the command you
34
+ need to run depends upon the implementation. Please refer to the
35
+ documentation for your implementation. Here we'll give examples of how
36
+ to do it in two common implementations:
37
+ [Clisp](https://clisp.sourceforge.io) & [SBCL](http://www.sbcl.org).
38
+
39
+ It is important to make sure that the command you run will load the
40
+ implementation's init file, which is needed to ensure QuickLisp is
41
+ loaded, then loads the test file, then exits back the command line.
42
+
43
+ ### Clisp
44
+
45
+ Either of the following commands will work:
46
+
47
+ ```
48
+ clisp -i ~/.clisprc.lisp hamming-test.lisp
49
+ ```
50
+
51
+ ```
52
+ clisp -i hamming-test.lisp -x '(ext:exit)'
53
+ ```
54
+
55
+ ### SBCL
56
+
57
+ ```
58
+ sbcl --load hamming-test.lisp --quit
59
+ ```
60
+
@@ -18,11 +18,11 @@ type
18
18
 
19
19
  [Test]
20
20
  [Ignore]
21
- procedure strand_with_repeated_nucleotide;
21
+ procedure can_count_one_nucleotide_in_single_character_input;
22
22
 
23
23
  [Test]
24
24
  [Ignore]
25
- procedure can_count_one_nucleotide_in_single_character_input;
25
+ procedure strand_with_repeated_nucleotide;
26
26
 
27
27
  [Test]
28
28
  [Ignore]
@@ -1,14 +1,11 @@
1
1
  language: elixir
2
2
  elixir:
3
- - 1.3.2
4
- - 1.4.0-rc.1
3
+ - 1.4.5
4
+ - 1.5.2
5
5
 
6
6
  otp_release:
7
- - 19.0
8
-
9
- matrix:
10
- allow_failures:
11
- - elixir: 1.4.0-rc.1
7
+ - 19.3
8
+ - 20.1
12
9
 
13
10
  script:
14
11
  - bin/fetch-configlet
@@ -6,7 +6,7 @@ Exercism Exercises in Elixir
6
6
 
7
7
  ## Setup
8
8
 
9
- The exercises currently target Elixir 1.3.2 and Erlang/OTP 19. Detailed
9
+ The exercises currently target Elixir 1.5.2 and Erlang/OTP 20. Detailed
10
10
  installation instructions can be found at
11
11
  [http://elixir-lang.org/install.html](http://elixir-lang.org/install.html).
12
12
 
@@ -32,7 +32,7 @@ Please keep the following in mind:
32
32
  best to discuss these changes before doing the work.
33
33
 
34
34
  - Follow the coding standards found in
35
- [The Elixir Style Guide](https://github.com/niftyn8/elixir_style_guide).
35
+ [The Elixir Style Guide](https://github.com/lexmag/elixir-style-guide).
36
36
 
37
37
  - Watch out for trailing spaces, extra blank lines, and spaces in blank lines.
38
38
 
@@ -40,10 +40,6 @@ Please keep the following in mind:
40
40
  exercise directory. They will not be included when the user fetches the
41
41
  exercise.
42
42
 
43
- - Please do not add a README or README.md file to the exercise directory. The
44
- READMEs are constructed using shared metadata, which lives in the
45
- [exercism/x-common](https://github.com/exercism/x-common) repository.
46
-
47
43
  - Each problem should have a test suite, an example solution, and a template
48
44
  file for the real implementation. The example solution should be named
49
45
  `example.exs`.
@@ -10,19 +10,8 @@ do
10
10
  done
11
11
 
12
12
  elixirc -o ./tmp/build ./tmp/src/*.exs
13
-
14
- if [ $CI ]; then
15
- export PLT_FILENAME=elixir-${TRAVIS_ELIXIR_VERSION:=1.3.2}_${TRAVIS_OTP_RELEASE:=19.0}.plt
16
- export PLT_LOCATION=./tmp/$PLT_FILENAME
17
- wget -O $PLT_LOCATION https://github.com/danielberkompas/travis_elixir_plts/blob/master/elixir-${TRAVIS_ELIXIR_VERSION}_${TRAVIS_OTP_RELEASE}.plt?raw=true
18
-
19
- dialyzer --no_check_plt --plt $PLT_LOCATION --no_native ./tmp/build;
20
- RESULT=$?
21
- else
22
- dialyzer ./tmp/build;
23
- RESULT=$?
24
- fi
25
-
13
+ mix dialyzer
14
+ RESULT=$?
26
15
  rm -rf ./tmp
27
16
 
28
17
  exit $RESULT
@@ -14,7 +14,8 @@ defmodule Allergies do
14
14
 
15
15
  def list(flags) do
16
16
  Enum.with_index(@allergens)
17
- |> Enum.filter_map(&(flagged? flags, &1), fn({item, _}) -> item end)
17
+ |> Enum.filter(&flagged?(flags, &1))
18
+ |> Enum.map(fn {item, _} -> item end)
18
19
  end
19
20
 
20
21
  def allergic_to?(flags, item) do
@@ -22,6 +23,6 @@ defmodule Allergies do
22
23
  end
23
24
 
24
25
  defp flagged?(flags, {_, index}) do
25
- (flags &&& (1 <<< index)) > 0
26
+ (flags &&& 1 <<< index) > 0
26
27
  end
27
28
  end
@@ -9,12 +9,12 @@ defmodule Atbash do
9
9
  iex> Atbash.encode("completely insecure")
10
10
  "xlnko vgvob rmhvx fiv"
11
11
  """
12
- @spec encode(String.t) :: String.t
12
+ @spec encode(String.t()) :: String.t()
13
13
  def encode(plaintext) do
14
14
  plaintext |> normalize |> transpose |> chunk |> Enum.join(" ")
15
15
  end
16
16
 
17
- @spec decode(String.t) :: String.t
17
+ @spec decode(String.t()) :: String.t()
18
18
  def decode(cipher) do
19
19
  cipher |> normalize |> transpose
20
20
  end
@@ -25,9 +25,9 @@ defmodule Atbash do
25
25
 
26
26
  defp transpose(text) do
27
27
  text
28
- |> String.to_char_list
28
+ |> String.to_charlist()
29
29
  |> Enum.map(&convert/1)
30
- |> List.to_string
30
+ |> List.to_string()
31
31
  end
32
32
 
33
33
  defp convert(character) do
@@ -35,6 +35,6 @@ defmodule Atbash do
35
35
  end
36
36
 
37
37
  defp chunk(input) do
38
- Regex.scan(~r(.{1,5}), input) |> List.flatten
38
+ Regex.scan(~r(.{1,5}), input) |> List.flatten()
39
39
  end
40
40
  end
@@ -8,20 +8,20 @@ defmodule BankAccount do
8
8
  ## Callbacks
9
9
 
10
10
  def init(_args) do
11
- { :ok, 0 }
11
+ {:ok, 0}
12
12
  end
13
13
 
14
14
  def handle_call(:balance, _from, balance) do
15
- { :reply, balance, balance }
15
+ {:reply, balance, balance}
16
16
  end
17
17
 
18
- def handle_call({ :update, amount }, _from, balance) do
19
- { :reply, :ok, balance + amount }
18
+ def handle_call({:update, amount}, _from, balance) do
19
+ {:reply, :ok, balance + amount}
20
20
  end
21
21
 
22
22
  def handle_call(:close, _from, balance) do
23
23
  # We stop normally and return :stopped to the caller.
24
- { :stop, :normal, :stopped, balance }
24
+ {:stop, :normal, :stopped, balance}
25
25
  end
26
26
 
27
27
  ## Interface for tests
@@ -36,7 +36,7 @@ defmodule BankAccount do
36
36
  """
37
37
  @spec open_bank() :: account
38
38
  def open_bank() do
39
- { :ok, pid } = :gen_server.start_link(BankAccount, [], [])
39
+ {:ok, pid} = GenServer.start_link(__MODULE__, [], [])
40
40
  pid
41
41
  end
42
42
 
@@ -45,7 +45,7 @@ defmodule BankAccount do
45
45
  """
46
46
  @spec close_bank(account) :: any
47
47
  def close_bank(account) do
48
- :gen_server.call(account, :close)
48
+ GenServer.stop(account)
49
49
  end
50
50
 
51
51
  @doc """
@@ -54,9 +54,9 @@ defmodule BankAccount do
54
54
  @spec balance(account) :: integer
55
55
  def balance(account) do
56
56
  if Process.alive?(account) do
57
- :gen_server.call(account, :balance)
57
+ GenServer.call(account, :balance)
58
58
  else
59
- { :error, :account_closed }
59
+ {:error, :account_closed}
60
60
  end
61
61
  end
62
62
 
@@ -65,9 +65,9 @@ defmodule BankAccount do
65
65
  """
66
66
  def update(account, amount) do
67
67
  if Process.alive?(account) do
68
- :gen_server.call(account, { :update, amount })
68
+ GenServer.call(account, {:update, amount})
69
69
  else
70
- { :error, :account_closed }
70
+ {:error, :account_closed}
71
71
  end
72
72
  end
73
73
  end
@@ -19,17 +19,17 @@ defmodule Bob do
19
19
 
20
20
  def hey(input) do
21
21
  cond do
22
- silent?(input) -> "Fine. Be that way!"
22
+ silent?(input) -> "Fine. Be that way!"
23
23
  question?(input) -> "Sure."
24
24
  shouting?(input) -> "Whoa, chill out!"
25
- true -> "Whatever."
25
+ true -> "Whatever."
26
26
  end
27
27
  end
28
28
 
29
- defp silent?(input), do: "" == String.strip(input)
29
+ defp silent?(input), do: "" == String.trim(input)
30
30
  defp shouting?(input), do: input == String.upcase(input) && letters?(input)
31
31
  defp question?(input), do: String.ends_with?(input, "?")
32
- defp letters?(input), do: Regex.match?(~r/\p{L}+/, input)
32
+ defp letters?(input), do: Regex.match?(~r/\p{L}+/, input)
33
33
  end
34
34
 
35
35
  # Another approach which abstracts knowing about string categories
@@ -1,70 +1,75 @@
1
1
  defmodule Forth do
2
2
  defmodule State do
3
+ @type t :: %__MODULE__{}
4
+
3
5
  defstruct stack: [], defs: %{}, input: []
4
6
  end
5
7
 
6
- @opaque evaluator :: State.t
8
+ @opaque evaluator :: State.t()
7
9
 
8
10
  defmodule Primitives do
9
11
  def defs do
10
12
  %{
11
- "+" => &math_op(&1, :+) ,
12
- "-" => &math_op(&1, :-) ,
13
- "*" => &math_op(&1, :*) ,
14
- "/" => &math_op(&1, :/) ,
15
- "DUP" => &dup/1 ,
16
- "DROP" => &drop/1 ,
17
- "SWAP" => &swap/1 ,
18
- "OVER" => &over/1
19
- }
13
+ "+" => &math_op(&1, :+),
14
+ "-" => &math_op(&1, :-),
15
+ "*" => &math_op(&1, :*),
16
+ "/" => &math_op(&1, :/),
17
+ "DUP" => &dup/1,
18
+ "DROP" => &drop/1,
19
+ "SWAP" => &swap/1,
20
+ "OVER" => &over/1
21
+ }
20
22
  end
21
23
 
22
24
  defp math_op(s, op) do
23
- { s, [a, b] } = pop(s, 2)
24
- res = case op do
25
- :+ -> a + b
26
- :- -> a - b
27
- :* -> a * b
28
- :/ when b == 0 -> raise Forth.DivisionByZero
29
- :/ -> div(a, b)
30
- end
25
+ {s, [a, b]} = pop(s, 2)
26
+
27
+ res =
28
+ case op do
29
+ :+ -> a + b
30
+ :- -> a - b
31
+ :* -> a * b
32
+ :/ when b == 0 -> raise Forth.DivisionByZero
33
+ :/ -> div(a, b)
34
+ end
35
+
31
36
  push(s, res)
32
37
  end
33
38
 
34
39
  defp dup(s) do
35
- { s, [x] } = pop(s, 1)
36
- %{s | stack: [x,x|s.stack]}
40
+ {s, [x]} = pop(s, 1)
41
+ %{s | stack: [x, x | s.stack]}
37
42
  end
38
43
 
39
44
  defp drop(s) do
40
- { s, _ } = pop(s, 1)
45
+ {s, _} = pop(s, 1)
41
46
  s
42
47
  end
43
48
 
44
49
  defp swap(s) do
45
- { s, [a, b] } = pop(s, 2)
46
- %{s | stack: [a,b|s.stack]}
50
+ {s, [a, b]} = pop(s, 2)
51
+ %{s | stack: [a, b | s.stack]}
47
52
  end
48
53
 
49
54
  defp over(s) do
50
55
  case s.stack do
51
56
  [b, a | t] -> %{s | stack: [a, b, a | t]}
52
- _ -> raise Forth.StackUnderflow
57
+ _ -> raise Forth.StackUnderflow
53
58
  end
54
59
  end
55
60
 
56
61
  # Pops and returns in reverse order (so the patterns catching those args can
57
62
  # be written in the way you'd think about them in Forth).
58
63
  defp pop(s, n) do
59
- { stack, acc } = do_pop(s.stack, n, [])
60
- { %{s | stack: stack}, acc }
64
+ {stack, acc} = do_pop(s.stack, n, [])
65
+ {%{s | stack: stack}, acc}
61
66
  end
62
67
 
63
- defp do_pop(stack, 0, acc), do: { stack, acc }
64
- defp do_pop([h|t], n, acc), do: do_pop(t, n-1, [h|acc])
65
- defp do_pop([], _, _), do: raise Forth.StackUnderflow
68
+ defp do_pop(stack, 0, acc), do: {stack, acc}
69
+ defp do_pop([h | t], n, acc), do: do_pop(t, n - 1, [h | acc])
70
+ defp do_pop([], _, _), do: raise(Forth.StackUnderflow)
66
71
 
67
- defp push(s, x), do: %{s | stack: [x|s.stack]}
72
+ defp push(s, x), do: %{s | stack: [x | s.stack]}
68
73
  end
69
74
 
70
75
  @doc """
@@ -72,29 +77,34 @@ defmodule Forth do
72
77
  """
73
78
  @spec new() :: evaluator
74
79
  def new() do
75
- %State{defs: Primitives.defs}
80
+ %State{defs: Primitives.defs()}
76
81
  end
77
82
 
78
83
  @doc """
79
84
  Evaluate an input string, updating the evaluator state.
80
85
  """
81
- @spec eval(evaluator, String.t) :: evaluator
86
+ @spec eval(evaluator, String.t()) :: evaluator
82
87
  def eval(ev, s) do
83
88
  do_eval(%{ev | input: ev.input ++ tokenize(s)})
84
89
  end
85
90
 
86
91
  defp do_eval(s = %State{input: []}), do: s
87
- defp do_eval(s = %State{stack: stack, input: [h|t]}) when is_integer(h) do
88
- do_eval(%{s | stack: [h|stack], input: t})
92
+
93
+ defp do_eval(s = %State{stack: stack, input: [h | t]}) when is_integer(h) do
94
+ do_eval(%{s | stack: [h | stack], input: t})
89
95
  end
90
- defp do_eval(s = %State{input: [":",h|t]}) do
96
+
97
+ defp do_eval(s = %State{input: [":", h | t]}) do
91
98
  if is_binary(h) do
92
99
  w = String.upcase(h)
93
100
  # Find the ";", otherwise just return the current state and wait for the
94
101
  # user to finish the definition.
95
102
  case Enum.split_while(t, &(&1 != ";")) do
96
- { _, [] } -> s # ";" not found
97
- { ws, [";" | r] } ->
103
+ # ";" not found
104
+ {_, []} ->
105
+ s
106
+
107
+ {ws, [";" | r]} ->
98
108
  do_eval(%{s | defs: Map.put(s.defs, w, ws), input: r})
99
109
  end
100
110
  else
@@ -102,14 +112,22 @@ defmodule Forth do
102
112
  raise Forth.InvalidWord, word: h
103
113
  end
104
114
  end
105
- defp do_eval(s = %State{defs: defs, input: [h|t]}) when is_binary(h) do
115
+
116
+ defp do_eval(s = %State{defs: defs, input: [h | t]}) when is_binary(h) do
106
117
  w = String.upcase(h)
118
+
107
119
  case defs[w] do
108
- nil -> raise Forth.UnknownWord, word: w
109
- d when is_function(d) -> do_eval(d.(%{s | input: t}))
120
+ nil ->
121
+ raise Forth.UnknownWord, word: w
122
+
123
+ d when is_function(d) ->
124
+ do_eval(d.(%{s | input: t}))
125
+
110
126
  # To evaluate a user defined function we'll just put the function
111
127
  # definition in the input list. That should do the trick.
112
- d when is_list(d) -> do_eval(%{s | input: d ++ t})
128
+ d
129
+ when is_list(d) ->
130
+ do_eval(%{s | input: d ++ t})
113
131
  end
114
132
  end
115
133
 
@@ -118,8 +136,8 @@ defmodule Forth do
118
136
  |> Stream.map(&hd/1)
119
137
  |> Enum.map(fn t ->
120
138
  case Integer.parse(t) do
121
- { i, "" } -> i
122
- _ -> t
139
+ {i, ""} -> i
140
+ _ -> t
123
141
  end
124
142
  end)
125
143
  end
@@ -128,7 +146,7 @@ defmodule Forth do
128
146
  Return the current stack as a string with the element on top of the stack
129
147
  being the rightmost element in the string.
130
148
  """
131
- @spec format_stack(evaluator) :: String.t
149
+ @spec format_stack(evaluator) :: String.t()
132
150
  def format_stack(%State{stack: stack}) do
133
151
  # Enum.join calls to_string on each element, no need to do that ourselves.
134
152
  Enum.reverse(stack) |> Enum.join(" ")
@@ -141,13 +159,13 @@ defmodule Forth.StackUnderflow do
141
159
  end
142
160
 
143
161
  defmodule Forth.InvalidWord do
144
- defexception [word: nil]
145
- def message(e), do: "invalid word: #{inspect e.word}"
162
+ defexception word: nil
163
+ def message(e), do: "invalid word: #{inspect(e.word)}"
146
164
  end
147
165
 
148
166
  defmodule Forth.UnknownWord do
149
- defexception [word: nil]
150
- def message(e), do: "unknown word: #{inspect e.word}"
167
+ defexception word: nil
168
+ def message(e), do: "unknown word: #{inspect(e.word)}"
151
169
  end
152
170
 
153
171
  defmodule Forth.DivisionByZero do