trackler 2.2.1.54 → 2.2.1.55

Sign up to get free protection for your applications and to get access to all the features.
Files changed (280) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/dominoes/description.md +3 -3
  4. data/problem-specifications/exercises/two-fer/description.md +0 -28
  5. data/tracks/c/config.json +12 -0
  6. data/tracks/c/exercises/queen-attack/README.md +65 -0
  7. data/tracks/c/exercises/queen-attack/makefile +15 -0
  8. data/tracks/c/exercises/queen-attack/src/example.c +25 -0
  9. data/tracks/c/exercises/queen-attack/src/queen_attack.h +19 -0
  10. data/tracks/c/exercises/queen-attack/test/test_queen_attack.c +190 -0
  11. data/tracks/c/exercises/queen-attack/test/vendor/unity.c +1300 -0
  12. data/tracks/c/exercises/queen-attack/test/vendor/unity.h +274 -0
  13. data/tracks/c/exercises/queen-attack/test/vendor/unity_internals.h +701 -0
  14. data/tracks/common-lisp/exercises/acronym/README.md +1 -1
  15. data/tracks/delphi/exercises/two-fer/README.md +0 -28
  16. data/tracks/ecmascript/config.json +41 -0
  17. data/tracks/ecmascript/exercises/accumulate/package.json +5 -3
  18. data/tracks/ecmascript/exercises/acronym/package.json +5 -3
  19. data/tracks/ecmascript/exercises/all-your-base/package.json +5 -3
  20. data/tracks/ecmascript/exercises/allergies/package.json +5 -3
  21. data/tracks/ecmascript/exercises/alphametics/package.json +5 -3
  22. data/tracks/ecmascript/exercises/anagram/package.json +5 -3
  23. data/tracks/ecmascript/exercises/atbash-cipher/package.json +5 -3
  24. data/tracks/ecmascript/exercises/beer-song/package.json +5 -3
  25. data/tracks/ecmascript/exercises/binary-search-tree/package.json +5 -3
  26. data/tracks/ecmascript/exercises/binary-search/package.json +5 -3
  27. data/tracks/ecmascript/exercises/binary/package.json +5 -3
  28. data/tracks/ecmascript/exercises/bob/package.json +5 -3
  29. data/tracks/ecmascript/exercises/bowling/package.json +2 -2
  30. data/tracks/ecmascript/exercises/bracket-push/package.json +5 -3
  31. data/tracks/ecmascript/exercises/change/README.md +44 -0
  32. data/tracks/ecmascript/exercises/change/change.spec.js +80 -0
  33. data/tracks/ecmascript/exercises/change/example.js +120 -0
  34. data/tracks/ecmascript/exercises/change/package.json +69 -0
  35. data/tracks/ecmascript/exercises/circular-buffer/package.json +5 -3
  36. data/tracks/ecmascript/exercises/clock/package.json +5 -3
  37. data/tracks/ecmascript/exercises/collatz-conjecture/package.json +6 -4
  38. data/tracks/ecmascript/exercises/connect/package.json +5 -3
  39. data/tracks/ecmascript/exercises/crypto-square/package.json +5 -3
  40. data/tracks/ecmascript/exercises/custom-set/package.json +5 -3
  41. data/tracks/ecmascript/exercises/diamond/package.json +5 -3
  42. data/tracks/ecmascript/exercises/difference-of-squares/package.json +5 -3
  43. data/tracks/ecmascript/exercises/diffie-hellman/package.json +5 -3
  44. data/tracks/ecmascript/exercises/etl/package.json +5 -3
  45. data/tracks/ecmascript/exercises/flatten-array/package.json +5 -3
  46. data/tracks/ecmascript/exercises/food-chain/package.json +5 -3
  47. data/tracks/ecmascript/exercises/gigasecond/package.json +5 -3
  48. data/tracks/ecmascript/exercises/grade-school/package.json +5 -3
  49. data/tracks/ecmascript/exercises/grains/package.json +5 -3
  50. data/tracks/ecmascript/exercises/hamming/package.json +5 -3
  51. data/tracks/ecmascript/exercises/hello-world/package.json +5 -3
  52. data/tracks/ecmascript/exercises/hexadecimal/package.json +5 -3
  53. data/tracks/ecmascript/exercises/isbn-verifier/README.md +62 -0
  54. data/tracks/ecmascript/exercises/isbn-verifier/example.js +17 -0
  55. data/tracks/ecmascript/exercises/isbn-verifier/isbn-verifier.spec.js +81 -0
  56. data/tracks/ecmascript/exercises/isbn-verifier/package.json +71 -0
  57. data/tracks/ecmascript/exercises/isogram/package.json +5 -3
  58. data/tracks/ecmascript/exercises/kindergarten-garden/package.json +5 -3
  59. data/tracks/ecmascript/exercises/largest-series-product/package.json +5 -3
  60. data/tracks/ecmascript/exercises/leap/package.json +5 -3
  61. data/tracks/ecmascript/exercises/linked-list/package.json +5 -3
  62. data/tracks/ecmascript/exercises/list-ops/package.json +5 -3
  63. data/tracks/ecmascript/exercises/luhn/package.json +5 -3
  64. data/tracks/ecmascript/exercises/matrix/package.json +5 -3
  65. data/tracks/ecmascript/exercises/meetup/package.json +5 -3
  66. data/tracks/ecmascript/exercises/minesweeper/package.json +5 -3
  67. data/tracks/ecmascript/exercises/nth-prime/package.json +5 -3
  68. data/tracks/ecmascript/exercises/ocr-numbers/package.json +5 -3
  69. data/tracks/ecmascript/exercises/octal/package.json +5 -3
  70. data/tracks/ecmascript/exercises/palindrome-products/package.json +5 -3
  71. data/tracks/ecmascript/exercises/pangram/package.json +5 -3
  72. data/tracks/ecmascript/exercises/pascals-triangle/package.json +5 -3
  73. data/tracks/ecmascript/exercises/perfect-numbers/package.json +5 -3
  74. data/tracks/ecmascript/exercises/phone-number/package.json +5 -3
  75. data/tracks/ecmascript/exercises/pig-latin/package.json +5 -3
  76. data/tracks/ecmascript/exercises/prime-factors/package.json +5 -3
  77. data/tracks/ecmascript/exercises/proverb/package.json +5 -3
  78. data/tracks/ecmascript/exercises/pythagorean-triplet/package.json +5 -3
  79. data/tracks/ecmascript/exercises/queen-attack/package.json +5 -3
  80. data/tracks/ecmascript/exercises/raindrops/package.json +5 -3
  81. data/tracks/ecmascript/exercises/rna-transcription/package.json +5 -3
  82. data/tracks/ecmascript/exercises/robot-name/package.json +5 -3
  83. data/tracks/ecmascript/exercises/robot-simulator/package.json +5 -3
  84. data/tracks/ecmascript/exercises/roman-numerals/package.json +5 -3
  85. data/tracks/ecmascript/exercises/run-length-encoding/package.json +5 -3
  86. data/tracks/ecmascript/exercises/saddle-points/package.json +5 -3
  87. data/tracks/ecmascript/exercises/say/package.json +5 -3
  88. data/tracks/ecmascript/exercises/scrabble-score/package.json +5 -3
  89. data/tracks/ecmascript/exercises/secret-handshake/package.json +5 -3
  90. data/tracks/ecmascript/exercises/series/package.json +5 -3
  91. data/tracks/ecmascript/exercises/sieve/package.json +5 -3
  92. data/tracks/ecmascript/exercises/simple-cipher/package.json +5 -3
  93. data/tracks/ecmascript/exercises/simple-linked-list/package.json +5 -3
  94. data/tracks/ecmascript/exercises/space-age/package.json +5 -3
  95. data/tracks/ecmascript/exercises/strain/package.json +5 -3
  96. data/tracks/ecmascript/exercises/sublist/package.json +5 -3
  97. data/tracks/ecmascript/exercises/sum-of-multiples/package.json +5 -3
  98. data/tracks/ecmascript/exercises/transpose/README.md +94 -0
  99. data/tracks/ecmascript/exercises/transpose/example.js +12 -0
  100. data/tracks/ecmascript/exercises/transpose/package.json +71 -0
  101. data/tracks/ecmascript/exercises/transpose/transpose.spec.js +67 -0
  102. data/tracks/ecmascript/exercises/triangle/package.json +5 -3
  103. data/tracks/ecmascript/exercises/trinary/package.json +5 -3
  104. data/tracks/ecmascript/exercises/twelve-days/package.json +5 -3
  105. data/tracks/ecmascript/exercises/two-bucket/package.json +5 -3
  106. data/tracks/ecmascript/exercises/two-fer/package.json +5 -3
  107. data/tracks/ecmascript/exercises/word-count/package.json +5 -3
  108. data/tracks/ecmascript/exercises/word-search/package.json +5 -3
  109. data/tracks/ecmascript/exercises/wordy/package.json +5 -3
  110. data/tracks/ecmascript/package-lock.json +6219 -0
  111. data/tracks/ecmascript/package.json +5 -3
  112. data/tracks/erlang/exercises/collatz-conjecture/src/collatz_conjecture.erl +3 -4
  113. data/tracks/erlang/exercises/collatz-conjecture/src/example.erl +3 -3
  114. data/tracks/erlang/exercises/collatz-conjecture/test/collatz_conjecture_tests.erl +13 -9
  115. data/tracks/erlang/exercises/hello-world/src/hello_world.erl +2 -2
  116. data/tracks/erlang/exercises/leap/src/example.erl +1 -1
  117. data/tracks/erlang/exercises/leap/src/leap.erl +3 -3
  118. data/tracks/erlang/exercises/leap/test/leap_tests.erl +9 -9
  119. data/tracks/erlang/testgen/src/testgen.erl +16 -13
  120. data/tracks/erlang/testgen/src/tgen.erl +65 -38
  121. data/tracks/erlang/testgen/src/tgen_collatz-conjecture.erl +38 -0
  122. data/tracks/erlang/testgen/src/tgen_hello-world.erl +11 -19
  123. data/tracks/erlang/testgen/src/tgen_leap.erl +31 -0
  124. data/tracks/erlang/testgen/src/tgs.erl +80 -0
  125. data/tracks/fsharp/exercises/alphametics/AlphameticsTest.fs +78 -23
  126. data/tracks/fsharp/exercises/anagram/AnagramTest.fs +66 -34
  127. data/tracks/fsharp/exercises/connect/ConnectTest.fs +81 -68
  128. data/tracks/fsharp/exercises/connect/Example.fs +9 -5
  129. data/tracks/fsharp/exercises/food-chain/Example.fs +5 -9
  130. data/tracks/fsharp/exercises/food-chain/FoodChain.fs +2 -2
  131. data/tracks/fsharp/exercises/food-chain/FoodChainTest.fs +143 -75
  132. data/tracks/fsharp/exercises/hamming/Example.fs +8 -4
  133. data/tracks/fsharp/exercises/hamming/Hamming.fs +1 -1
  134. data/tracks/fsharp/exercises/hamming/HammingTest.fs +53 -13
  135. data/tracks/fsharp/exercises/house/Example.fs +5 -6
  136. data/tracks/fsharp/exercises/house/House.fs +3 -1
  137. data/tracks/fsharp/exercises/house/HouseTest.fs +272 -96
  138. data/tracks/fsharp/exercises/meetup/Example.fs +1 -1
  139. data/tracks/fsharp/exercises/meetup/Meetup.fs +1 -1
  140. data/tracks/fsharp/exercises/meetup/MeetupTest.fs +384 -73
  141. data/tracks/fsharp/exercises/ocr-numbers/Example.fs +43 -35
  142. data/tracks/fsharp/exercises/ocr-numbers/OcrNumbersTest.fs +160 -125
  143. data/tracks/fsharp/exercises/two-fer/Example.fs +4 -2
  144. data/tracks/fsharp/exercises/two-fer/TwoFer.fs +1 -1
  145. data/tracks/fsharp/exercises/two-fer/TwoFerTest.fs +7 -4
  146. data/tracks/fsharp/generators/Common.fs +6 -2
  147. data/tracks/fsharp/generators/Exercise.fs +14 -13
  148. data/tracks/fsharp/generators/Generators.fs +145 -2
  149. data/tracks/fsharp/generators/Options.fs +4 -6
  150. data/tracks/fsharp/generators/Output.fs +2 -2
  151. data/tracks/fsharp/generators/Program.fs +4 -3
  152. data/tracks/java/exercises/saddle-points/README.md +1 -1
  153. data/tracks/java/exercises/two-fer/README.md +0 -28
  154. data/tracks/javascript/exercises/beer-song/example.js +18 -14
  155. data/tracks/kotlin/exercises/saddle-points/README.md +1 -1
  156. data/tracks/kotlin/exercises/two-fer/README.md +0 -28
  157. data/tracks/lua/config.json +12 -0
  158. data/tracks/lua/exercises/collatz-conjecture/README.md +43 -0
  159. data/tracks/lua/exercises/collatz-conjecture/collatz-conjecture_spec.lua +33 -0
  160. data/tracks/lua/exercises/collatz-conjecture/example.lua +16 -0
  161. data/tracks/python/config.json +4 -1
  162. data/tracks/python/exercises/binary-search/binary_search_test.py +2 -0
  163. data/tracks/python/exercises/change/change_test.py +2 -0
  164. data/tracks/python/exercises/circular-buffer/circular_buffer_test.py +56 -50
  165. data/tracks/python/exercises/forth/example.py +3 -1
  166. data/tracks/python/exercises/forth/forth_test.py +43 -26
  167. data/tracks/python/exercises/nth-prime/nth_prime.py +1 -1
  168. data/tracks/python/exercises/rna-transcription/README.md +5 -0
  169. data/tracks/python/exercises/rna-transcription/example.py +1 -1
  170. data/tracks/python/exercises/rna-transcription/rna_transcription_test.py +7 -4
  171. data/tracks/python/exercises/robot-simulator/robot_simulator_test.py +9 -7
  172. data/tracks/python/exercises/saddle-points/saddle_points_test.py +15 -5
  173. data/tracks/python/exercises/simple-cipher/simple_cipher.py +7 -1
  174. data/tracks/python/exercises/word-count/example.py +6 -4
  175. data/tracks/python/exercises/word-count/word_count_test.py +49 -22
  176. data/tracks/python/exercises/word-search/word_search_test.py +104 -12
  177. data/tracks/rust/.travis.yml +2 -0
  178. data/tracks/rust/README.md +5 -0
  179. data/tracks/rust/_test/check-exercises.sh +0 -6
  180. data/tracks/rust/_test/ensure-lib-src-rs-exist.sh +19 -0
  181. data/tracks/rust/_test/ensure-stubs-compile.sh +26 -0
  182. data/tracks/rust/config.json +12 -0
  183. data/tracks/rust/config/exercise-readme-insert.md +3 -2
  184. data/tracks/rust/docs/ABOUT.md +2 -2
  185. data/tracks/rust/docs/LEARNING.md +1 -1
  186. data/tracks/rust/docs/RESOURCES.md +1 -1
  187. data/tracks/rust/docs/TESTS.md +2 -2
  188. data/tracks/rust/exercises/accumulate/README.md +3 -2
  189. data/tracks/rust/exercises/acronym/README.md +3 -2
  190. data/tracks/rust/exercises/all-your-base/README.md +3 -2
  191. data/tracks/rust/exercises/allergies/README.md +3 -2
  192. data/tracks/rust/exercises/alphametics/README.md +3 -2
  193. data/tracks/rust/exercises/anagram/README.md +3 -2
  194. data/tracks/rust/exercises/atbash-cipher/README.md +3 -2
  195. data/tracks/rust/exercises/beer-song/README.md +3 -2
  196. data/tracks/rust/exercises/beer-song/src/lib.rs +2 -2
  197. data/tracks/rust/exercises/binary-search/README.md +3 -2
  198. data/tracks/rust/exercises/bob/README.md +3 -2
  199. data/tracks/rust/exercises/bob/src/lib.rs +1 -1
  200. data/tracks/rust/exercises/bowling/README.md +3 -2
  201. data/tracks/rust/exercises/bracket-push/HINTS.md +1 -1
  202. data/tracks/rust/exercises/bracket-push/README.md +4 -3
  203. data/tracks/rust/exercises/circular-buffer/README.md +3 -2
  204. data/tracks/rust/exercises/clock/README.md +3 -2
  205. data/tracks/rust/exercises/collatz-conjecture/README.md +3 -2
  206. data/tracks/rust/exercises/collatz-conjecture/src/lib.rs +1 -1
  207. data/tracks/rust/exercises/crypto-square/README.md +3 -2
  208. data/tracks/rust/exercises/custom-set/README.md +3 -2
  209. data/tracks/rust/exercises/decimal/.meta/ALLOWED_TO_NOT_COMPILE +2 -0
  210. data/tracks/rust/exercises/decimal/README.md +3 -2
  211. data/tracks/rust/exercises/difference-of-squares/README.md +3 -2
  212. data/tracks/rust/exercises/difference-of-squares/src/lib.rs +3 -3
  213. data/tracks/rust/exercises/dominoes/README.md +3 -2
  214. data/tracks/rust/exercises/etl/README.md +3 -2
  215. data/tracks/rust/exercises/forth/README.md +3 -2
  216. data/tracks/rust/exercises/forth/src/lib.rs +3 -0
  217. data/tracks/rust/exercises/gigasecond/README.md +3 -2
  218. data/tracks/rust/exercises/grade-school/README.md +3 -2
  219. data/tracks/rust/exercises/grains/README.md +3 -2
  220. data/tracks/rust/exercises/hamming/README.md +3 -2
  221. data/tracks/rust/exercises/hello-world/GETTING_STARTED.md +1 -1
  222. data/tracks/rust/exercises/hello-world/README.md +3 -2
  223. data/tracks/rust/exercises/hexadecimal/README.md +3 -2
  224. data/tracks/rust/exercises/isogram/.gitignore +8 -0
  225. data/tracks/rust/exercises/isogram/Cargo.toml +3 -0
  226. data/tracks/rust/exercises/isogram/README.md +52 -0
  227. data/tracks/rust/exercises/isogram/example.rs +12 -0
  228. data/tracks/rust/exercises/isogram/src/lib.rs +0 -0
  229. data/tracks/rust/exercises/isogram/tests/isogram.rs +72 -0
  230. data/tracks/rust/exercises/largest-series-product/README.md +3 -2
  231. data/tracks/rust/exercises/leap/README.md +3 -2
  232. data/tracks/rust/exercises/leap/src/lib.rs +1 -1
  233. data/tracks/rust/exercises/luhn-from/README.md +3 -2
  234. data/tracks/rust/exercises/luhn-trait/.meta/description.md +2 -2
  235. data/tracks/rust/exercises/luhn-trait/README.md +5 -4
  236. data/tracks/rust/exercises/luhn/README.md +3 -2
  237. data/tracks/rust/exercises/minesweeper/README.md +3 -2
  238. data/tracks/rust/exercises/nth-prime/README.md +3 -2
  239. data/tracks/rust/exercises/nucleotide-codons/README.md +3 -2
  240. data/tracks/rust/exercises/nucleotide-count/README.md +3 -2
  241. data/tracks/rust/exercises/ocr-numbers/README.md +3 -2
  242. data/tracks/rust/exercises/pangram/README.md +3 -2
  243. data/tracks/rust/exercises/parallel-letter-frequency/HINTS.md +1 -1
  244. data/tracks/rust/exercises/parallel-letter-frequency/README.md +4 -3
  245. data/tracks/rust/exercises/pascals-triangle/README.md +3 -2
  246. data/tracks/rust/exercises/perfect-numbers/README.md +3 -2
  247. data/tracks/rust/exercises/phone-number/README.md +3 -2
  248. data/tracks/rust/exercises/pig-latin/README.md +3 -2
  249. data/tracks/rust/exercises/poker/README.md +3 -2
  250. data/tracks/rust/exercises/prime-factors/README.md +3 -2
  251. data/tracks/rust/exercises/protein-translation/README.md +3 -2
  252. data/tracks/rust/exercises/proverb/README.md +3 -2
  253. data/tracks/rust/exercises/proverb/src/lib.rs +1 -1
  254. data/tracks/rust/exercises/pythagorean-triplet/README.md +3 -2
  255. data/tracks/rust/exercises/queen-attack/README.md +3 -2
  256. data/tracks/rust/exercises/raindrops/README.md +3 -2
  257. data/tracks/rust/exercises/raindrops/src/lib.rs +1 -1
  258. data/tracks/rust/exercises/react/README.md +3 -2
  259. data/tracks/rust/exercises/rectangles/README.md +3 -2
  260. data/tracks/rust/exercises/rna-transcription/README.md +3 -2
  261. data/tracks/rust/exercises/robot-name/README.md +3 -2
  262. data/tracks/rust/exercises/robot-simulator/README.md +3 -2
  263. data/tracks/rust/exercises/roman-numerals/README.md +3 -2
  264. data/tracks/rust/exercises/rotational-cipher/README.md +3 -2
  265. data/tracks/rust/exercises/run-length-encoding/README.md +3 -2
  266. data/tracks/rust/exercises/say/README.md +3 -2
  267. data/tracks/rust/exercises/scrabble-score/README.md +3 -2
  268. data/tracks/rust/exercises/sieve/README.md +3 -2
  269. data/tracks/rust/exercises/space-age/README.md +3 -2
  270. data/tracks/rust/exercises/sublist/README.md +3 -2
  271. data/tracks/rust/exercises/sum-of-multiples/README.md +3 -2
  272. data/tracks/rust/exercises/sum-of-multiples/src/lib.rs +1 -1
  273. data/tracks/rust/exercises/tournament/README.md +3 -2
  274. data/tracks/rust/exercises/triangle/HINTS.md +2 -2
  275. data/tracks/rust/exercises/triangle/README.md +5 -4
  276. data/tracks/rust/exercises/variable-length-quantity/README.md +3 -2
  277. data/tracks/rust/exercises/word-count/README.md +3 -2
  278. data/tracks/rust/exercises/wordy/README.md +3 -2
  279. metadata +38 -3
  280. data/tracks/ecmascript/yarn.lock +0 -3144
@@ -0,0 +1,80 @@
1
+ -module(tgs).
2
+
3
+ -export([
4
+ atom/1,
5
+ call_fun/2,
6
+ call_macro/2,
7
+ define/2,
8
+ export/1,
9
+ include/1,
10
+ module/1,
11
+ parens/1,
12
+ raw/1,
13
+ simple_fun/2,
14
+ simple_fun/3,
15
+ value/1
16
+ ]).
17
+
18
+ module(Name) when is_atom(Name) ->
19
+ do_module(erl_syntax:abstract(Name));
20
+ module(Name) when is_binary(Name) ->
21
+ module(binary_to_list(Name));
22
+ module(Name) when is_list(Name) ->
23
+ do_module(erl_syntax:atom(Name)).
24
+
25
+ do_module(NameAbstract) ->
26
+ erl_syntax:attribute(
27
+ erl_syntax:text("module"), [
28
+ NameAbstract]).
29
+
30
+ export(Exports) when is_list(Exports) ->
31
+ erl_syntax:attribute(
32
+ erl_syntax:text("export"), [
33
+ erl_syntax:list(lists:map(fun fun_tuple_to_text/1, Exports))]).
34
+
35
+ fun_tuple_to_text({Name, Args}) when (is_list(Name) orelse is_binary(Name)) andalso is_list(Args) ->
36
+ Text = io_lib:format("~s/~B", [Name, length(Args)]),
37
+ erl_syntax:text(Text).
38
+
39
+ include(File) when is_list(File) ->
40
+ erl_syntax:attribute(
41
+ erl_syntax:text("include"), [
42
+ erl_syntax:abstract(File)]).
43
+
44
+ define(Name, Substitution) when is_list(Name) ->
45
+ erl_syntax:attribute(
46
+ erl_syntax:text("define"), [
47
+ erl_syntax:text(Name),
48
+ Substitution]).
49
+
50
+ parens(Tree) ->
51
+ erl_syntax:parentheses(Tree).
52
+
53
+ call_fun(Name, Args) when is_list(Name) ->
54
+ erl_syntax:application(
55
+ erl_syntax:text(Name), Args).
56
+
57
+ call_macro(Name, Args) when is_list(Name) ->
58
+ call_fun("?" ++ Name, Args).
59
+
60
+ atom(Name) when is_list(Name); is_atom(Name) ->
61
+ erl_syntax:atom(Name);
62
+ atom(Name) when is_binary(Name) ->
63
+ atom(binary_to_list(Name)).
64
+
65
+ simple_fun(Name, Body) ->
66
+ erl_syntax:function(
67
+ atom(Name), [erl_syntax:clause(none, Body)]).
68
+
69
+ simple_fun(Name, Args, Body) when is_list(Args) ->
70
+ erl_syntax:function(
71
+ atom(Name), [erl_syntax:clause(
72
+ lists:map(fun (Arg) -> erl_syntax:text(Arg) end, Args),
73
+ none,
74
+ Body)]).
75
+
76
+ raw(Text) when is_list(Text) ->
77
+ erl_syntax:text(Text).
78
+
79
+ value(Value) ->
80
+ erl_syntax:abstract(Value).
@@ -1,52 +1,107 @@
1
+ // This file was auto-generated based on version 1.0.0 of the canonical data.
2
+
1
3
  module AlphameticsTest
2
4
 
3
- open Xunit
4
5
  open FsUnit.Xunit
6
+ open Xunit
5
7
 
6
8
  open Alphametics
7
9
 
8
10
  [<Fact>]
9
11
  let ``Puzzle with three letters`` () =
10
- let actual = solve "I + BB == ILL"
11
- let expected = ['I', 1; 'B', 9; 'L', 0] |> Map.ofList |> Some
12
- actual |> should equal expected
12
+ let puzzle = "I + BB == ILL"
13
+ let expected =
14
+ [ ('I', 1)
15
+ ('B', 9)
16
+ ('L', 0) ]
17
+ |> Map.ofList
18
+ |> Some
19
+ solve puzzle |> should equal expected
13
20
 
14
21
  [<Fact(Skip = "Remove to run test")>]
15
22
  let ``Solution must have unique value for each letter`` () =
16
- let actual = solve "A == B"
17
- actual |> should equal None
23
+ let puzzle = "A == B"
24
+ let expected = None
25
+ solve puzzle |> should equal expected
18
26
 
19
27
  [<Fact(Skip = "Remove to run test")>]
20
28
  let ``Leading zero solution is invalid`` () =
21
- let actual = solve "ACA + DD == BD"
22
- actual |> should equal None
29
+ let puzzle = "ACA + DD == BD"
30
+ let expected = None
31
+ solve puzzle |> should equal expected
23
32
 
24
33
  [<Fact(Skip = "Remove to run test")>]
25
34
  let ``Puzzle with four letters`` () =
26
- let actual = solve "AS + A == MOM"
27
- let expected = ['A', 9; 'S', 2; 'M', 1; 'O', 0] |> Map.ofList |> Some
28
- actual |> should equal expected
35
+ let puzzle = "AS + A == MOM"
36
+ let expected =
37
+ [ ('A', 9)
38
+ ('S', 2)
39
+ ('M', 1)
40
+ ('O', 0) ]
41
+ |> Map.ofList
42
+ |> Some
43
+ solve puzzle |> should equal expected
29
44
 
30
45
  [<Fact(Skip = "Remove to run test")>]
31
46
  let ``Puzzle with six letters`` () =
32
- let actual = solve "NO + NO + TOO == LATE"
33
- let expected = ['N', 7; 'O', 4; 'T', 9; 'L', 1; 'A', 0; 'E', 2] |> Map.ofList |> Some
34
- actual |> should equal expected
47
+ let puzzle = "NO + NO + TOO == LATE"
48
+ let expected =
49
+ [ ('N', 7)
50
+ ('O', 4)
51
+ ('T', 9)
52
+ ('L', 1)
53
+ ('A', 0)
54
+ ('E', 2) ]
55
+ |> Map.ofList
56
+ |> Some
57
+ solve puzzle |> should equal expected
35
58
 
36
59
  [<Fact(Skip = "Remove to run test")>]
37
60
  let ``Puzzle with seven letters`` () =
38
- let actual = solve "HE + SEES + THE == LIGHT"
39
- let expected = ['E', 4; 'G', 2; 'H', 5; 'I', 0; 'L', 1; 'S', 9; 'T', 7] |> Map.ofList |> Some
40
- actual |> should equal expected
61
+ let puzzle = "HE + SEES + THE == LIGHT"
62
+ let expected =
63
+ [ ('E', 4)
64
+ ('G', 2)
65
+ ('H', 5)
66
+ ('I', 0)
67
+ ('L', 1)
68
+ ('S', 9)
69
+ ('T', 7) ]
70
+ |> Map.ofList
71
+ |> Some
72
+ solve puzzle |> should equal expected
41
73
 
42
74
  [<Fact(Skip = "Remove to run test")>]
43
75
  let ``Puzzle with eight letters`` () =
44
- let actual = solve "SEND + MORE == MONEY"
45
- let expected = ['S', 9; 'E', 5; 'N', 6; 'D', 7; 'M', 1; 'O', 0; 'R', 8; 'Y', 2] |> Map.ofList |> Some
46
- actual |> should equal expected
76
+ let puzzle = "SEND + MORE == MONEY"
77
+ let expected =
78
+ [ ('S', 9)
79
+ ('E', 5)
80
+ ('N', 6)
81
+ ('D', 7)
82
+ ('M', 1)
83
+ ('O', 0)
84
+ ('R', 8)
85
+ ('Y', 2) ]
86
+ |> Map.ofList
87
+ |> Some
88
+ solve puzzle |> should equal expected
47
89
 
48
90
  [<Fact(Skip = "Remove to run test")>]
49
91
  let ``Puzzle with ten letters`` () =
50
- let actual = solve "AND + A + STRONG + OFFENSE + AS + A + GOOD == DEFENSE"
51
- let expected = ['A', 5; 'D', 3; 'E', 4; 'F', 7; 'G', 8; 'N', 0; 'O', 2; 'R', 1; 'S', 6; 'T', 9] |> Map.ofList |> Some
52
- actual |> should equal expected
92
+ let puzzle = "AND + A + STRONG + OFFENSE + AS + A + GOOD == DEFENSE"
93
+ let expected =
94
+ [ ('A', 5)
95
+ ('D', 3)
96
+ ('E', 4)
97
+ ('F', 7)
98
+ ('G', 8)
99
+ ('N', 0)
100
+ ('O', 2)
101
+ ('R', 1)
102
+ ('S', 6)
103
+ ('T', 9) ]
104
+ |> Map.ofList
105
+ |> Some
106
+ solve puzzle |> should equal expected
107
+
@@ -1,57 +1,89 @@
1
+ // This file was auto-generated based on version 1.0.1 of the canonical data.
2
+
1
3
  module AnagramTest
2
4
 
3
- open System
4
- open Xunit
5
5
  open FsUnit.Xunit
6
+ open Xunit
7
+
6
8
  open Anagram
7
9
 
8
10
  [<Fact>]
9
11
  let ``No matches`` () =
10
- let words = ["hello"; "world"; "zombies"; "pants"]
11
- anagrams words "diaper" |> should be Empty
12
+ let candidates = ["hello"; "world"; "zombies"; "pants"]
13
+ anagrams candidates "diaper" |> should be Empty
14
+
15
+ [<Fact(Skip = "Remove to run test")>]
16
+ let ``Detects simple anagram`` () =
17
+ let candidates = ["tan"; "stand"; "at"]
18
+ anagrams candidates "ant" |> should equal ["tan"]
19
+
20
+ [<Fact(Skip = "Remove to run test")>]
21
+ let ``Does not detect false positives`` () =
22
+ let candidates = ["eagle"]
23
+ anagrams candidates "galea" |> should be Empty
24
+
25
+ [<Fact(Skip = "Remove to run test")>]
26
+ let ``Detects two anagrams`` () =
27
+ let candidates = ["stream"; "pigeon"; "maters"]
28
+ anagrams candidates "master" |> should equal ["stream"; "maters"]
12
29
 
13
30
  [<Fact(Skip = "Remove to run test")>]
14
- let ``Detect simple anagram`` () =
15
- let words = ["tan"; "stand"; "at"]
16
- let expected = ["tan"]
17
- anagrams words "ant" |> should equal expected
31
+ let ``Does not detect anagram subsets`` () =
32
+ let candidates = ["dog"; "goody"]
33
+ anagrams candidates "good" |> should be Empty
18
34
 
19
35
  [<Fact(Skip = "Remove to run test")>]
20
- let ``Detect multiple anagrams`` () =
21
- let words = ["stream"; "pigeon"; "maters"]
22
- let expected = ["stream"; "maters"]
23
- anagrams words "master" |> should equal expected;
36
+ let ``Detects anagram`` () =
37
+ let candidates = ["enlists"; "google"; "inlets"; "banana"]
38
+ anagrams candidates "listen" |> should equal ["inlets"]
24
39
 
25
40
  [<Fact(Skip = "Remove to run test")>]
26
- let ``Does not confuse different duplicates`` () =
27
- let words = ["eagle"]
28
- anagrams words "galea" |> should be Empty
41
+ let ``Detects three anagrams`` () =
42
+ let candidates = ["gallery"; "ballerina"; "regally"; "clergy"; "largely"; "leading"]
43
+ anagrams candidates "allergy" |> should equal ["gallery"; "regally"; "largely"]
29
44
 
30
45
  [<Fact(Skip = "Remove to run test")>]
31
- let ``Identical word is not anagram`` () =
32
- let words = ["corn"; "dark"; "Corn"; "rank"; "CORN"; "cron"; "park"]
33
- let expected = ["cron"]
34
- anagrams words "corn" |> should equal expected
46
+ let ``Does not detect identical words`` () =
47
+ let candidates = ["corn"; "dark"; "Corn"; "rank"; "CORN"; "cron"; "park"]
48
+ anagrams candidates "corn" |> should equal ["cron"]
35
49
 
36
50
  [<Fact(Skip = "Remove to run test")>]
37
- let ``Eliminate anagrams with same checksum`` () =
38
- let words = ["last"]
39
- anagrams words "mass" |> should be Empty
51
+ let ``Does not detect non-anagrams with identical checksum`` () =
52
+ let candidates = ["last"]
53
+ anagrams candidates "mass" |> should be Empty
40
54
 
41
55
  [<Fact(Skip = "Remove to run test")>]
42
- let ``Eliminate anagram subsets`` () =
43
- let words = ["dog"; "goody"]
44
- anagrams words "good" |> should be Empty
56
+ let ``Detects anagrams case-insensitively`` () =
57
+ let candidates = ["cashregister"; "Carthorse"; "radishes"]
58
+ anagrams candidates "Orchestra" |> should equal ["Carthorse"]
45
59
 
46
60
  [<Fact(Skip = "Remove to run test")>]
47
- let ``Detect anagrams`` () =
48
- let words = ["gallery"; "ballerina"; "regally"; "clergy"; "largely"; "leading"]
49
- let expected = ["gallery"; "regally"; "largely"]
50
- let actual = anagrams words "allergy"
51
- actual |> should equal expected
61
+ let ``Detects anagrams using case-insensitive subject`` () =
62
+ let candidates = ["cashregister"; "carthorse"; "radishes"]
63
+ anagrams candidates "Orchestra" |> should equal ["carthorse"]
52
64
 
53
65
  [<Fact(Skip = "Remove to run test")>]
54
- let ``Anagrams are case insensitive`` () =
55
- let words = ["cashregister"; "Carthorse"; "radishes"]
56
- let expected = ["Carthorse"]
57
- anagrams words "Orchestra" |> should equal expected
66
+ let ``Detects anagrams using case-insensitive possible matches`` () =
67
+ let candidates = ["cashregister"; "Carthorse"; "radishes"]
68
+ anagrams candidates "orchestra" |> should equal ["Carthorse"]
69
+
70
+ [<Fact(Skip = "Remove to run test")>]
71
+ let ``Does not detect a word as its own anagram`` () =
72
+ let candidates = ["Banana"]
73
+ anagrams candidates "banana" |> should be Empty
74
+
75
+ [<Fact(Skip = "Remove to run test")>]
76
+ let ``Does not detect a anagram if the original word is repeated`` () =
77
+ let candidates = ["go Go GO"]
78
+ anagrams candidates "go" |> should be Empty
79
+
80
+ [<Fact(Skip = "Remove to run test")>]
81
+ let ``Anagrams must use all letters exactly once`` () =
82
+ let candidates = ["patter"]
83
+ anagrams candidates "tapper" |> should be Empty
84
+
85
+ [<Fact(Skip = "Remove to run test")>]
86
+ let ``Capital word is not own anagram`` () =
87
+ let candidates = ["Banana"]
88
+ anagrams candidates "BANANA" |> should be Empty
89
+
@@ -1,89 +1,102 @@
1
+ // This file was auto-generated based on version 1.0.0 of the canonical data.
2
+
1
3
  module ConnectTest
2
4
 
3
- open Xunit
4
5
  open FsUnit.Xunit
5
- open System
6
+ open Xunit
6
7
 
7
8
  open Connect
8
9
 
9
- let makeBoard (board: string list) = board |> List.map (fun x -> x.Replace(" ", ""))
10
-
11
10
  [<Fact>]
12
- let ``Empty board has no winner`` () =
13
- let lines = [". . . . . ";
14
- " . . . . . ";
15
- " . . . . . ";
16
- " . . . . . ";
17
- " . . . . ."]
18
- let board = makeBoard lines
19
- resultFor board |> should equal None
11
+ let ``An empty board has no winner`` () =
12
+ let board =
13
+ [ ". . . . . "
14
+ " . . . . . "
15
+ " . . . . . "
16
+ " . . . . . "
17
+ " . . . . ." ]
18
+ winner board |> should equal None
20
19
 
21
20
  [<Fact(Skip = "Remove to run test")>]
22
- let ``1x1 board with black stone`` () =
23
- let lines = ["X"]
24
- let board = makeBoard lines
25
- resultFor board |> should equal <| Some Black
21
+ let ``X can win on a 1x1 board`` () =
22
+ let board = ["X"]
23
+ winner board |> should equal (Some Black)
26
24
 
27
25
  [<Fact(Skip = "Remove to run test")>]
28
- let ``1x1 board with white stone`` () =
29
- let lines = ["O"]
30
- let board = makeBoard lines
31
- resultFor board |> should equal <| Some White
26
+ let ``O can win on a 1x1 board`` () =
27
+ let board = ["O"]
28
+ winner board |> should equal (Some White)
32
29
 
33
30
  [<Fact(Skip = "Remove to run test")>]
34
- let ``Convoluted path`` () =
35
- let lines = [". X X . . ";
36
- " X . X . X ";
37
- " . X . X . ";
38
- " . X X . . ";
39
- " O O O O O"]
40
- let board = makeBoard lines
41
- resultFor board |> should equal <| Some Black
31
+ let ``Only edges does not make a winner`` () =
32
+ let board =
33
+ [ "O O O X "
34
+ " X . . X "
35
+ " X . . X "
36
+ " X O O O" ]
37
+ winner board |> should equal None
42
38
 
43
39
  [<Fact(Skip = "Remove to run test")>]
44
- let ``Rectangle, black wins`` () =
45
- let lines = [". O . . ";
46
- " O X X X ";
47
- " O X O . ";
48
- " X X O X ";
49
- " . O X ."]
50
- let board = makeBoard lines
51
- resultFor board |> should equal <| Some Black
40
+ let ``Illegal diagonal does not make a winner`` () =
41
+ let board =
42
+ [ "X O . . "
43
+ " O X X X "
44
+ " O X O . "
45
+ " . O X . "
46
+ " X X O O" ]
47
+ winner board |> should equal None
52
48
 
53
49
  [<Fact(Skip = "Remove to run test")>]
54
- let ``Rectangle, white wins`` () =
55
- let lines = [". O . . ";
56
- " O X X X ";
57
- " O O O . ";
58
- " X X O X ";
59
- " . O X ."]
60
- let board = makeBoard lines
61
- resultFor board |> should equal <| Some White
50
+ let ``Nobody wins crossing adjacent angles`` () =
51
+ let board =
52
+ [ "X . . . "
53
+ " . X O . "
54
+ " O . X O "
55
+ " . O . X "
56
+ " . . O ." ]
57
+ winner board |> should equal None
62
58
 
63
59
  [<Fact(Skip = "Remove to run test")>]
64
- let ``Spiral, black wins`` () =
65
- let lines = ["OXXXXXXXX";
66
- "OXOOOOOOO";
67
- "OXOXXXXXO";
68
- "OXOXOOOXO";
69
- "OXOXXXOXO";
70
- "OXOOOXOXO";
71
- "OXXXXXOXO";
72
- "OOOOOOOXO";
73
- "XXXXXXXXO"]
74
- let board = makeBoard lines
75
- resultFor board |> should equal <| Some Black
60
+ let ``X wins crossing from left to right`` () =
61
+ let board =
62
+ [ ". O . . "
63
+ " O X X X "
64
+ " O X O . "
65
+ " X X O X "
66
+ " . O X ." ]
67
+ winner board |> should equal (Some Black)
76
68
 
77
69
  [<Fact(Skip = "Remove to run test")>]
78
- let ``Spiral, nobody wins`` () =
79
- let lines = ["OXXXXXXXX";
80
- "OXOOOOOOO";
81
- "OXOXXXXXO";
82
- "OXOXOOOXO";
83
- "OXOX.XOXO";
84
- "OXOOOXOXO";
85
- "OXXXXXOXO";
86
- "OOOOOOOXO";
87
- "XXXXXXXXO"]
88
- let board = makeBoard lines
89
- resultFor board |> should equal None
70
+ let ``O wins crossing from top to bottom`` () =
71
+ let board =
72
+ [ ". O . . "
73
+ " O X X X "
74
+ " O O O . "
75
+ " X X O X "
76
+ " . O X ." ]
77
+ winner board |> should equal (Some White)
78
+
79
+ [<Fact(Skip = "Remove to run test")>]
80
+ let ``X wins using a convoluted path`` () =
81
+ let board =
82
+ [ ". X X . . "
83
+ " X . X . X "
84
+ " . X . X . "
85
+ " . X X . . "
86
+ " O O O O O" ]
87
+ winner board |> should equal (Some Black)
88
+
89
+ [<Fact(Skip = "Remove to run test")>]
90
+ let ``X wins using a spiral path`` () =
91
+ let board =
92
+ [ "O X X X X X X X X "
93
+ " O X O O O O O O O "
94
+ " O X O X X X X X O "
95
+ " O X O X O O O X O "
96
+ " O X O X X X O X O "
97
+ " O X O O O X O X O "
98
+ " O X X X X X O X O "
99
+ " O O O O O O O X O "
100
+ " X X X X X X X X O" ]
101
+ winner board |> should equal (Some Black)
102
+