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
@@ -2,43 +2,56 @@ defmodule Minesweeper do
2
2
  @doc """
3
3
  Annotate empty spots next to mines with the number of mines next to them.
4
4
  """
5
- @spec annotate([String.t]) :: [String.t]
5
+ @spec annotate([String.t()]) :: [String.t()]
6
6
  def annotate([]), do: []
7
+
7
8
  def annotate(board) do
8
9
  h = length(board)
9
- w = String.length(hd(board)) # Only 7-bit ASCII in the board, so this is safe
10
+ # Only 7-bit ASCII in the board, so this is safe
11
+ w = String.length(hd(board))
12
+
10
13
  annotations =
11
- Enum.reduce(Stream.with_index(board), %{}, fn { line, y }, acc ->
12
- Enum.reduce(Stream.with_index(String.to_char_list(line)), acc, fn
13
- { ?*, x }, acc -> add_adjacents(acc, { x, y }, { w, h })
14
- _, acc -> acc
14
+ Enum.reduce(Stream.with_index(board), %{}, fn {line, y}, acc ->
15
+ Enum.reduce(Stream.with_index(String.to_charlist(line)), acc, fn
16
+ {?*, x}, acc -> add_adjacents(acc, {x, y}, {w, h})
17
+ _, acc -> acc
15
18
  end)
16
19
  end)
17
- Enum.map(Stream.with_index(board), fn { line, y } ->
18
- Enum.map(Stream.with_index(String.to_char_list(line)), fn
19
- { ?*, _ } -> ?* # Don't replace mines
20
- { _, x } -> case annotations[{x, y}] do
21
- nil -> ?\s
22
- n -> ?0 + n
23
- end
24
- end) |> to_string
20
+
21
+ Enum.map(Stream.with_index(board), fn {line, y} ->
22
+ Enum.map(Stream.with_index(String.to_charlist(line)), fn
23
+ # Don't replace mines
24
+ {?*, _} ->
25
+ ?*
26
+
27
+ {_, x} ->
28
+ case annotations[{x, y}] do
29
+ nil -> ?\s
30
+ n -> ?0 + n
31
+ end
32
+ end)
33
+ |> to_string
25
34
  end)
26
35
  end
27
36
 
28
- @adjacent_vecs for x <- [-1, 0, 1], y <- [-1, 0, 1], x != 0 or y != 0, do: { x, y }
37
+ @adjacent_vecs for x <- [-1, 0, 1],
38
+ y <- [-1, 0, 1],
39
+ x != 0 or y != 0,
40
+ do: {x, y}
29
41
 
30
42
  defp add_adjacents(d, c, bounds) do
31
43
  Enum.reduce(@adjacent_vecs, d, fn v, acc ->
32
44
  c1 = add_vec(c, v)
45
+
33
46
  if valid?(c1, bounds) do
34
- Map.update(acc, c1, 1, &(&1+1))
47
+ Map.update(acc, c1, 1, &(&1 + 1))
35
48
  else
36
49
  acc
37
50
  end
38
51
  end)
39
52
  end
40
53
 
41
- defp add_vec({ cx, cy }, { vx, vy }), do: { cx + vx, cy + vy }
54
+ defp add_vec({cx, cy}, {vx, vy}), do: {cx + vx, cy + vy}
42
55
 
43
- defp valid?({ cx, cy }, { w, h }), do: cx >= 0 and cx < w and cy >= 0 and cy < h
56
+ defp valid?({cx, cy}, {w, h}), do: cx >= 0 and cx < w and cy >= 0 and cy < h
44
57
  end
@@ -12,13 +12,13 @@ defmodule Pangram do
12
12
 
13
13
  """
14
14
 
15
- @spec pangram?(String.t) :: boolean
15
+ @spec pangram?(String.t()) :: boolean
16
16
  def pangram?(sentence) do
17
17
  chars =
18
18
  sentence
19
- |> String.downcase
20
- |> to_char_list
19
+ |> String.downcase()
20
+ |> to_charlist
21
21
 
22
- Enum.all? ?a..?z, &(&1 in chars)
22
+ Enum.all?(?a..?z, &(&1 in chars))
23
23
  end
24
24
  end
@@ -2,15 +2,15 @@ if !System.get_env("EXERCISM_TEST_EXAMPLES") do
2
2
  Code.load_file("queen_attack.exs", __DIR__)
3
3
  end
4
4
 
5
- ExUnit.start
6
- ExUnit.configure exclude: :pending, trace: true
5
+ ExUnit.start()
6
+ ExUnit.configure(exclude: :pending, trace: true)
7
7
 
8
8
  defmodule QueenAttackTest do
9
9
  use ExUnit.Case
10
10
 
11
11
  # @tag :pending
12
12
  test "default positions" do
13
- queens = Queens.new
13
+ queens = Queens.new()
14
14
  assert queens.white == {0, 3}
15
15
  assert queens.black == {7, 3}
16
16
  end
@@ -32,80 +32,95 @@ defmodule QueenAttackTest do
32
32
  @tag :pending
33
33
  test "string representation" do
34
34
  queens = Queens.new({2, 4}, {6, 6})
35
- board = String.strip """
36
- _ _ _ _ _ _ _ _
37
- _ _ _ _ _ _ _ _
38
- _ _ _ _ W _ _ _
39
- _ _ _ _ _ _ _ _
40
- _ _ _ _ _ _ _ _
41
- _ _ _ _ _ _ _ _
42
- _ _ _ _ _ _ B _
43
- _ _ _ _ _ _ _ _
44
- """
35
+
36
+ board =
37
+ String.trim("""
38
+ _ _ _ _ _ _ _ _
39
+ _ _ _ _ _ _ _ _
40
+ _ _ _ _ W _ _ _
41
+ _ _ _ _ _ _ _ _
42
+ _ _ _ _ _ _ _ _
43
+ _ _ _ _ _ _ _ _
44
+ _ _ _ _ _ _ B _
45
+ _ _ _ _ _ _ _ _
46
+ """)
47
+
45
48
  assert Queens.to_string(queens) == board
46
49
  end
47
50
 
48
51
  @tag :pending
49
52
  test "another string representation" do
50
53
  queens = Queens.new({7, 1}, {0, 0})
51
- board = String.strip """
52
- B _ _ _ _ _ _ _
53
- _ _ _ _ _ _ _ _
54
- _ _ _ _ _ _ _ _
55
- _ _ _ _ _ _ _ _
56
- _ _ _ _ _ _ _ _
57
- _ _ _ _ _ _ _ _
58
- _ _ _ _ _ _ _ _
59
- _ W _ _ _ _ _ _
60
- """
54
+
55
+ board =
56
+ String.trim("""
57
+ B _ _ _ _ _ _ _
58
+ _ _ _ _ _ _ _ _
59
+ _ _ _ _ _ _ _ _
60
+ _ _ _ _ _ _ _ _
61
+ _ _ _ _ _ _ _ _
62
+ _ _ _ _ _ _ _ _
63
+ _ _ _ _ _ _ _ _
64
+ _ W _ _ _ _ _ _
65
+ """)
66
+
61
67
  assert Queens.to_string(queens) == board
62
68
  end
63
69
 
64
70
  @tag :pending
65
71
  test "yet another string representation" do
66
72
  queens = Queens.new({4, 3}, {3, 4})
67
- board = String.strip """
68
- _ _ _ _ _ _ _ _
69
- _ _ _ _ _ _ _ _
70
- _ _ _ _ _ _ _ _
71
- _ _ _ _ B _ _ _
72
- _ _ _ W _ _ _ _
73
- _ _ _ _ _ _ _ _
74
- _ _ _ _ _ _ _ _
75
- _ _ _ _ _ _ _ _
76
- """
73
+
74
+ board =
75
+ String.trim("""
76
+ _ _ _ _ _ _ _ _
77
+ _ _ _ _ _ _ _ _
78
+ _ _ _ _ _ _ _ _
79
+ _ _ _ _ B _ _ _
80
+ _ _ _ W _ _ _ _
81
+ _ _ _ _ _ _ _ _
82
+ _ _ _ _ _ _ _ _
83
+ _ _ _ _ _ _ _ _
84
+ """)
85
+
77
86
  assert Queens.to_string(queens) == board
78
87
  end
79
88
 
80
89
  @tag :pending
81
90
  test "queen placed on the bottom right corner" do
82
91
  queens = Queens.new({4, 3}, {7, 7})
83
- board = String.strip """
84
- _ _ _ _ _ _ _ _
85
- _ _ _ _ _ _ _ _
86
- _ _ _ _ _ _ _ _
87
- _ _ _ _ _ _ _ _
88
- _ _ _ W _ _ _ _
89
- _ _ _ _ _ _ _ _
90
- _ _ _ _ _ _ _ _
91
- _ _ _ _ _ _ _ B
92
- """
92
+
93
+ board =
94
+ String.trim("""
95
+ _ _ _ _ _ _ _ _
96
+ _ _ _ _ _ _ _ _
97
+ _ _ _ _ _ _ _ _
98
+ _ _ _ _ _ _ _ _
99
+ _ _ _ W _ _ _ _
100
+ _ _ _ _ _ _ _ _
101
+ _ _ _ _ _ _ _ _
102
+ _ _ _ _ _ _ _ B
103
+ """)
104
+
93
105
  assert Queens.to_string(queens) == board
94
106
  end
95
107
 
96
108
  @tag :pending
97
109
  test "queen placed on the edge of the board" do
98
110
  queens = Queens.new({4, 3}, {2, 7})
99
- board = String.strip """
100
- _ _ _ _ _ _ _ _
101
- _ _ _ _ _ _ _ _
102
- _ _ _ _ _ _ _ B
103
- _ _ _ _ _ _ _ _
104
- _ _ _ W _ _ _ _
105
- _ _ _ _ _ _ _ _
106
- _ _ _ _ _ _ _ _
107
- _ _ _ _ _ _ _ _
108
- """
111
+
112
+ board =
113
+ String.trim("""
114
+ _ _ _ _ _ _ _ _
115
+ _ _ _ _ _ _ _ _
116
+ _ _ _ _ _ _ _ B
117
+ _ _ _ _ _ _ _ _
118
+ _ _ _ W _ _ _ _
119
+ _ _ _ _ _ _ _ _
120
+ _ _ _ _ _ _ _ _
121
+ _ _ _ _ _ _ _ _
122
+ """)
123
+
109
124
  assert Queens.to_string(queens) == board
110
125
  end
111
126
 
@@ -31,50 +31,56 @@ defmodule Say do
31
31
  Translate a positive integer into English.
32
32
  """
33
33
 
34
- @spec in_english(Integer.t) :: {atom, String.t}
34
+ @spec in_english(number) :: {atom, String.t()}
35
35
  def in_english(number) when number < 0 or number >= 1_000_000_000_000 do
36
36
  {:error, "number is out of range"}
37
37
  end
38
+
38
39
  def in_english(0), do: {:ok, "zero"}
40
+
39
41
  def in_english(number) do
40
- result = Integer.digits(number)
41
- |> padded_chunk(3, 0)
42
- |> translate_chunks
43
- |> clean_join(" ")
42
+ result =
43
+ Integer.digits(number)
44
+ |> padded_chunk(3, 0)
45
+ |> translate_chunks
46
+ |> clean_join(" ")
44
47
 
45
48
  {:ok, result}
46
49
  end
47
50
 
48
-
49
- @spec translate_chunks(List.t) :: [String.t]
51
+ @spec translate_chunks(list) :: [String.t()]
50
52
  defp translate_chunks(chunks) do
51
53
  translate_chunks(chunks, Enum.count(chunks))
52
54
  end
53
55
 
54
-
55
- @spec translate_chunks(List.t, Integer.t) :: [String.t]
56
+ @spec translate_chunks(list, number) :: [String.t()]
56
57
  defp translate_chunks([chunk], 1), do: [translate_chunk(chunk)]
58
+
57
59
  defp translate_chunks([[0, 0, 0] | remaining], n) do
58
60
  translate_chunks(remaining, n - 1)
59
61
  end
60
- defp translate_chunks([chunk | remaining], n) do
61
- chunk_in_english = [
62
- translate_chunk(chunk),
63
- Enum.at(@separators, n - 2)
64
- ]
65
- |> clean_join(" ")
66
62
 
67
- [ chunk_in_english | translate_chunks(remaining, n - 1) ]
63
+ defp translate_chunks([chunk | remaining], n) do
64
+ chunk_in_english =
65
+ [
66
+ translate_chunk(chunk),
67
+ Enum.at(@separators, n - 2)
68
+ ]
69
+ |> clean_join(" ")
70
+
71
+ [chunk_in_english | translate_chunks(remaining, n - 1)]
68
72
  end
69
73
 
70
-
71
- @spec translate_chunk([Integer.t]) :: String.t
74
+ @spec translate_chunk([number]) :: String.t()
72
75
  defp translate_chunk([0, 0, 0]), do: ""
73
76
  defp translate_chunk([0, 0, ones]), do: ones_in_english(ones)
77
+
74
78
  defp translate_chunk([0, 1, ones]) do
75
79
  ones_in_english(ones + 10)
76
80
  end
81
+
77
82
  defp translate_chunk([0, tens, 0]), do: tens_in_english(tens)
83
+
78
84
  defp translate_chunk([0, tens, ones]) do
79
85
  [
80
86
  tens_in_english(tens),
@@ -82,9 +88,11 @@ defmodule Say do
82
88
  ]
83
89
  |> clean_join("-")
84
90
  end
91
+
85
92
  defp translate_chunk([hundreds, 0, 0]) do
86
93
  "#{ones_in_english(hundreds)} hundred"
87
94
  end
95
+
88
96
  defp translate_chunk([hundreds, tens, ones]) do
89
97
  [
90
98
  translate_chunk([hundreds, 0, 0]),
@@ -93,31 +101,26 @@ defmodule Say do
93
101
  |> clean_join(" ")
94
102
  end
95
103
 
96
-
97
- @spec ones_in_english(Integer.t) :: String.t
104
+ @spec ones_in_english(number) :: String.t()
98
105
  defp ones_in_english(index), do: Enum.at(@small_numbers, index - 1)
99
106
 
100
-
101
- @spec tens_in_english(Integer.t) :: String.t
107
+ @spec tens_in_english(number) :: String.t()
102
108
  defp tens_in_english(index), do: Enum.at(@decades, index - 2)
103
109
 
104
-
105
- @spec clean_join([any], String.t) :: String.t
110
+ @spec clean_join([any], String.t()) :: String.t()
106
111
  defp clean_join(collection, separator) do
107
112
  collection
108
113
  |> reject_blank
109
114
  |> Enum.join(separator)
110
115
  end
111
116
 
112
-
113
117
  @spec reject_blank([any]) :: [any]
114
118
  defp reject_blank(col) do
115
119
  col
116
120
  |> Enum.reject(&(&1 == nil || &1 == ""))
117
121
  end
118
122
 
119
-
120
- @spec padded_chunk([any], Integer.t, any) :: [any]
123
+ @spec padded_chunk([any], number, any) :: [any]
121
124
  defp padded_chunk(list, chunk_size, pad) do
122
125
  pad_size = pad_size(chunk_size, rem(Enum.count(list), chunk_size))
123
126
 
@@ -125,14 +128,13 @@ defmodule Say do
125
128
  |> Enum.chunk(chunk_size)
126
129
  end
127
130
 
128
-
129
- @spec pad_size(Integer.t, Integer.t) :: Integer.t
131
+ @spec pad_size(number, number) :: number
130
132
  defp pad_size(_, 0), do: 0
131
133
  defp pad_size(total, rem), do: total - rem
132
134
 
133
-
134
- @spec pad([any], any, Integer.t) :: [any]
135
+ @spec pad([any], any, number) :: [any]
135
136
  defp pad(list, _, 0), do: list
137
+
136
138
  defp pad(list, pad, count) do
137
139
  [pad] ++ pad(list, pad, count - 1)
138
140
  end
@@ -3,23 +3,24 @@ defmodule Scrabble do
3
3
  word |> letters |> summarize
4
4
  end
5
5
 
6
- defp letters(word), do: word |> String.strip |> String.downcase |> String.codepoints
6
+ defp letters(word), do: word |> String.trim() |> String.downcase() |> String.codepoints()
7
7
 
8
- defp summarize(letters), do: Enum.reduce(letters, 0, fn(letter, acc) -> acc + letter_score(letter) end)
8
+ defp summarize(letters),
9
+ do: Enum.reduce(letters, 0, fn letter, acc -> acc + letter_score(letter) end)
9
10
 
10
11
  @letter_scores [
11
- { "aeilnorstu", 1 },
12
- { "dg", 2 },
13
- { "bcmp", 3 },
14
- { "fhvwy", 4 },
15
- { "k", 5 },
16
- { "jx", 8 },
17
- { "qz", 10 }
12
+ {"aeilnorstu", 1},
13
+ {"dg", 2},
14
+ {"bcmp", 3},
15
+ {"fhvwy", 4},
16
+ {"k", 5},
17
+ {"jx", 8},
18
+ {"qz", 10}
18
19
  ]
19
20
 
20
21
  defp letter_score(letter) do
21
- Enum.find_value @letter_scores, 0, fn({letters, score}) ->
22
+ Enum.find_value(@letter_scores, 0, fn {letters, score} ->
22
23
  String.contains?(letters, letter) && score
23
- end
24
+ end)
24
25
  end
25
26
  end
@@ -2,12 +2,15 @@ defmodule ExercismTestRunner.Mixfile do
2
2
  use Mix.Project
3
3
 
4
4
  def project do
5
- [app: :tests,
6
- version: "0.0.1",
7
- elixir: "~> 1.3",
8
- deps: deps(),
9
- test_paths: ["exercises"],
10
- consolidate_protocols: false]
5
+ [
6
+ app: :tests,
7
+ version: "0.0.1",
8
+ elixir: "~> 1.3",
9
+ deps: deps(),
10
+ test_paths: ["exercises"],
11
+ consolidate_protocols: false,
12
+ dialyzer: [paths: ["tmp/build"]]
13
+ ]
11
14
  end
12
15
 
13
16
  def application do
@@ -15,6 +18,6 @@ defmodule ExercismTestRunner.Mixfile do
15
18
  end
16
19
 
17
20
  defp deps do
18
- [{:poison, "~> 1.4.0"}]
21
+ [{:poison, "~> 1.4.0"}, {:dialyxir, "~> 0.5"}]
19
22
  end
20
23
  end