trackler 2.2.1.47 → 2.2.1.48

Sign up to get free protection for your applications and to get access to all the features.
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