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
@@ -1,18 +1,21 @@
1
+ // This file was auto-generated based on version 1.1.0 of the canonical data.
2
+
1
3
  module TwoFerTest
2
4
 
3
- open Xunit
4
5
  open FsUnit.Xunit
6
+ open Xunit
5
7
 
6
8
  open TwoFer
7
9
 
8
10
  [<Fact>]
9
11
  let ``No name given`` () =
10
- getResponse None |> should equal "One for you, one for me."
12
+ name None |> should equal "One for you, one for me."
11
13
 
12
14
  [<Fact(Skip = "Remove to run test")>]
13
15
  let ``A name given`` () =
14
- getResponse (Some "Alice") |> should equal "One for Alice, one for me."
16
+ name (Some "Alice") |> should equal "One for Alice, one for me."
15
17
 
16
18
  [<Fact(Skip = "Remove to run test")>]
17
19
  let ``Another name given`` () =
18
- getResponse (Some "Bob") |> should equal "One for Bob, one for me."
20
+ name (Some "Bob") |> should equal "One for Bob, one for me."
21
+
@@ -2,7 +2,6 @@
2
2
  module Generators.Common
3
3
 
4
4
  open System
5
- open System.IO
6
5
  open Serilog
7
6
  open Newtonsoft.Json.Linq
8
7
 
@@ -55,7 +54,7 @@ module Option =
55
54
  match value with
56
55
  | :? int64 as i -> if i < 0L then None else Some value
57
56
  | :? int32 as i -> if i < 0 then None else Some value
58
- | _ -> None
57
+ | _ -> Some value
59
58
 
60
59
  let ofNonFalse (value: obj) =
61
60
  match value with
@@ -67,6 +66,11 @@ module Option =
67
66
  | :? JToken as jToken when not (isNull jToken.["error"]) -> None
68
67
  | _ -> Some value
69
68
 
69
+ let ofNonEmptyString (value: string) =
70
+ match String.IsNullOrEmpty value with
71
+ | true -> None
72
+ | false -> Some value
73
+
70
74
  module String =
71
75
  open Humanizer
72
76
 
@@ -1,14 +1,11 @@
1
1
  module Generators.Exercise
2
2
 
3
3
  open System
4
- open System.Globalization
5
- open System.Collections.Generic
6
4
  open System.IO
7
5
  open System.Reflection
8
6
  open Newtonsoft.Json.Linq
9
7
  open Humanizer
10
8
  open Serilog
11
- open Input
12
9
  open Output
13
10
 
14
11
  [<AbstractClass>]
@@ -16,6 +13,7 @@ type Exercise() =
16
13
  // Allow changes in canonical data
17
14
  abstract member MapCanonicalData : CanonicalData -> CanonicalData
18
15
  abstract member MapCanonicalDataCase : CanonicalDataCase -> CanonicalDataCase
16
+ abstract member MapCanonicalDataCaseProperties : CanonicalDataCase * Map<string, obj> -> Map<string, obj>
19
17
  abstract member MapCanonicalDataCaseProperty : CanonicalDataCase * string * obj -> obj
20
18
 
21
19
  // Convert canonical data to representation used when rendering
@@ -81,11 +79,12 @@ type Exercise() =
81
79
  { canonicalData with Cases = List.map this.MapCanonicalDataCase canonicalData.Cases }
82
80
 
83
81
  default this.MapCanonicalDataCase canonicalDataCase =
84
- let updatedProperties =
85
- canonicalDataCase.Properties
86
- |> Map.map (fun key value -> this.MapCanonicalDataCaseProperty (canonicalDataCase, key, value))
82
+ { canonicalDataCase with
83
+ Properties = this.MapCanonicalDataCaseProperties (canonicalDataCase, canonicalDataCase.Properties) }
87
84
 
88
- { canonicalDataCase with Properties = updatedProperties }
85
+ default this.MapCanonicalDataCaseProperties (canonicalDataCase, properties) =
86
+ properties
87
+ |> Map.map (fun key value -> this.MapCanonicalDataCaseProperty (canonicalDataCase, key, value))
89
88
 
90
89
  default this.MapCanonicalDataCaseProperty (canonicalDataCase, key, value) = value
91
90
 
@@ -234,17 +233,19 @@ type Exercise() =
234
233
 
235
234
  default this.AdditionalNamespaces = []
236
235
 
237
- let createExercises filteredExercises =
236
+ let createExercises filteredExercise =
238
237
 
239
238
  let isConcreteExercise (exerciseType: Type) =
240
239
  not exerciseType.IsAbstract && typeof<Exercise>.IsAssignableFrom(exerciseType)
241
240
 
242
- let isFilteredExercises (exerciseType: Type) =
243
- Seq.isEmpty filteredExercises ||
244
- Seq.exists (String.equals exerciseType.Name) filteredExercises ||
245
- Seq.exists (String.equals (exerciseType.Name.Kebaberize())) filteredExercises
241
+ let isFilteredExercise exercise (exerciseType: Type) =
242
+ String.equals exercise exerciseType.Name ||
243
+ String.equals exercise (exerciseType.Name.Kebaberize())
246
244
 
247
- let includeExercise (exerciseType: Type) = isConcreteExercise exerciseType && isFilteredExercises exerciseType
245
+ let includeExercise (exerciseType: Type) =
246
+ match filteredExercise with
247
+ | None -> isConcreteExercise exerciseType
248
+ | Some exercise -> isConcreteExercise exerciseType && isFilteredExercise exercise exerciseType
248
249
 
249
250
  let assemblyTypes = Assembly.GetEntryAssembly().GetTypes()
250
251
 
@@ -2,7 +2,6 @@ module Generators.Generators
2
2
 
3
3
  open System
4
4
  open System.Globalization
5
- open Humanizer
6
5
  open Newtonsoft.Json.Linq
7
6
  open Output
8
7
  open Exercise
@@ -56,6 +55,34 @@ type Allergies() =
56
55
  | "substance" -> string value
57
56
  | _ -> base.RenderInput (canonicalDataCase, key, value)
58
57
 
58
+ type Alphametics() =
59
+ inherit Exercise()
60
+
61
+ member this.formatMap<'TKey, 'TValue> (value: obj) =
62
+ if isNull value then
63
+ "None"
64
+ else
65
+ let input = value :?> JObject
66
+ let dict = input.ToObject<Collections.Generic.Dictionary<'TKey, 'TValue>>();
67
+ let formattedList =
68
+ dict
69
+ |> Seq.map (fun kv -> formatTuple (kv.Key, kv.Value))
70
+ |> formatMultiLineList
71
+
72
+ if (formattedList.Contains("\n")) then
73
+ sprintf "%s\n%s\n%s" formattedList (indent 2 "|> Map.ofList") (indent 2 "|> Some")
74
+ else
75
+ sprintf "%s |> Map.ofList |> Some" formattedList
76
+
77
+ override this.RenderExpected (canonicalDataCase, key, value) = this.formatMap<char, int> value
78
+
79
+ override this.PropertiesWithIdentifier canonicalDataCase = this.Properties canonicalDataCase
80
+
81
+ type Anagram() =
82
+ inherit Exercise()
83
+
84
+ override this.PropertiesWithIdentifier canonicalDataCase = ["candidates"]
85
+
59
86
  type BeerSong() =
60
87
  inherit Exercise()
61
88
 
@@ -134,6 +161,25 @@ type Clock() =
134
161
  | _ ->
135
162
  base.RenderSut canonicalDataCase
136
163
 
164
+ type Connect() =
165
+ inherit Exercise()
166
+
167
+ override this.RenderExpected (canonicalDataCase, key, value) =
168
+ match string value with
169
+ | "O" -> "(Some White)"
170
+ | "X" -> "(Some Black)"
171
+ | _ -> "None"
172
+
173
+ override this.RenderInput (canonicalDataCase, key, value) =
174
+ let lines = (value :?> JArray).ToObject<string seq>() |> List.ofSeq
175
+ let padSize = List.last lines |> String.length
176
+
177
+ lines
178
+ |> List.map (fun line -> line.PadRight(padSize) |> formatValue)
179
+ |> formatMultiLineList
180
+
181
+ override this.PropertiesWithIdentifier canonicalDataCase = this.PropertiesUsedAsSutParameter canonicalDataCase
182
+
137
183
  type CryptoSquare() =
138
184
  inherit Exercise()
139
185
 
@@ -155,6 +201,29 @@ type Dominoes() =
155
201
 
156
202
  override this.PropertiesWithIdentifier canonicalDataCase = this.PropertiesUsedAsSutParameter canonicalDataCase
157
203
 
204
+ type FoodChain() =
205
+ inherit Exercise()
206
+
207
+ let hasMultipleVerses canonicalDataCase = Map.containsKey "end verse" canonicalDataCase.Properties
208
+
209
+ override this.RenderSutProperty canonicalDataCase =
210
+ match hasMultipleVerses canonicalDataCase with
211
+ | true -> "verses"
212
+ | false -> "verse"
213
+
214
+ override this.PropertiesUsedAsSutParameter canonicalDataCase =
215
+ match hasMultipleVerses canonicalDataCase with
216
+ | true -> ["start verse"; "end verse"]
217
+ | false -> ["start verse"]
218
+
219
+ override this.PropertiesWithIdentifier canonicalDataCase = ["expected"]
220
+
221
+ override this.RenderExpected (canonicalDataCase, key, value) =
222
+ (value :?> JArray)
223
+ |> normalizeJArray
224
+ |> Seq.map formatValue
225
+ |> formatMultiLineList
226
+
158
227
  type Gigasecond() =
159
228
  inherit Exercise()
160
229
 
@@ -179,9 +248,34 @@ type Grains() =
179
248
  | "-1" -> "Error \"Invalid input\""
180
249
  | x -> sprintf "Ok %sUL" x
181
250
 
251
+ type Hamming() =
252
+ inherit Exercise()
253
+
254
+ override this.RenderExpected (canonicalDataCase, key, value) =
255
+ value
256
+ |> Option.ofNonError
257
+ |> formatValue
258
+ |> parenthesizeOption
259
+
182
260
  type HelloWorld() =
183
261
  inherit Exercise()
184
262
 
263
+ type House() =
264
+ inherit Exercise()
265
+
266
+ override this.PropertiesUsedAsSutParameter canonicalDataCase =
267
+ match canonicalDataCase.Property with
268
+ | "verses" -> ["start verse"; "end verse"]
269
+ | _ -> base.PropertiesUsedAsSutParameter canonicalDataCase
270
+
271
+ override this.PropertiesWithIdentifier canonicalDataCase = ["expected"]
272
+
273
+ override this.RenderExpected (canonicalDataCase, key, value) =
274
+ (value :?> JArray)
275
+ |> normalizeJArray
276
+ |> Seq.map formatValue
277
+ |> formatMultiLineList
278
+
185
279
  type Isogram() =
186
280
  inherit Exercise()
187
281
 
@@ -215,6 +309,32 @@ type Leap() =
215
309
 
216
310
  type Luhn() =
217
311
  inherit Exercise()
312
+
313
+ type Meetup() =
314
+ inherit Exercise()
315
+
316
+ override this.RenderExpected (canonicalDataCase, key, value) =
317
+ let year = canonicalDataCase.Properties.["year"] :?> int64 |> int
318
+ let month = canonicalDataCase.Properties.["month"] :?> int64 |> int
319
+ let day = canonicalDataCase.Properties.["dayofmonth"] :?> int64 |> int
320
+ DateTime(year, month, day) |> formatDateTime |> parenthesize
321
+
322
+ override this.RenderInput (canonicalDataCase, key, value) =
323
+ match key with
324
+ | "dayofweek" ->
325
+ sprintf "DayOfWeek.%s" (string canonicalDataCase.Properties.["dayofweek"])
326
+ | "week" ->
327
+ sprintf "Schedule.%s" (string canonicalDataCase.Properties.["week"] |> String.upperCaseFirst)
328
+ | _ ->
329
+ base.RenderInput (canonicalDataCase, key, value)
330
+
331
+ override this.MapCanonicalDataCaseProperties (canonicalDataCase, properties) =
332
+ properties |> Map.add "expected" null // Ensure that the "expected" key exists
333
+
334
+ override this.PropertiesUsedAsSutParameter canonicalDataCase =
335
+ ["year"; "month"; "dayofweek"; "week"]
336
+
337
+ override this.AdditionalNamespaces = [typeof<DateTime>.Namespace]
218
338
 
219
339
  type Minesweeper() =
220
340
  inherit Exercise()
@@ -241,6 +361,23 @@ type NthPrime() =
241
361
  |> formatValue
242
362
  |> parenthesizeOption
243
363
 
364
+ type OcrNumbers() =
365
+ inherit Exercise()
366
+
367
+ override this.PropertiesWithIdentifier canonicalDataCase = this.PropertiesUsedAsSutParameter canonicalDataCase
368
+
369
+ override this.RenderExpected (canonicalDataCase, key, value) =
370
+ value
371
+ |> Option.ofNonNegativeInt
372
+ |> formatValue
373
+ |> parenthesizeOption
374
+
375
+ override this.RenderInput (canonicalDataCase, key, value) =
376
+ value :?> JArray
377
+ |> normalizeJArray
378
+ |> Seq.map formatValue
379
+ |> formatMultiLineList
380
+
244
381
  type Pangram() =
245
382
  inherit Exercise()
246
383
 
@@ -471,4 +608,10 @@ type RomanNumerals() =
471
608
  inherit Exercise()
472
609
 
473
610
  type ScrabbleScore() =
474
- inherit Exercise()
611
+ inherit Exercise()
612
+
613
+ type TwoFer() =
614
+ inherit Exercise()
615
+
616
+ override this.RenderInput (canonicalDataCase, key, value) =
617
+ value |> Option.ofObj |> formatValue |> parenthesizeOption
@@ -3,15 +3,13 @@ module Generators.Options
3
3
  open System
4
4
  open System.IO
5
5
  open CommandLine
6
- open Serilog
7
- open Humanizer
8
6
 
9
7
  type Options = {
10
- [<CommandLine.Option('e', "exercises", Required = false,
11
- HelpText = "Exercises to generate (if not specified, defaults to all exercises).")>] Exercises : seq<string>;
12
- [<CommandLine.Option('d', "canonicaldatadirectory", Required = false,
8
+ [<Option('e', "exercise", Required = false,
9
+ HelpText = "Exercise to generate (if not specified, defaults to all exercises).")>] Exercise : string;
10
+ [<Option('d', "canonicaldatadirectory", Required = false,
13
11
  HelpText = "Canonical data directory. If the directory does not exist, the canonical data will be downloaded.")>] CanonicalDataDirectory : string;
14
- [<CommandLine.Option('s', "skipupdatecanonicaldata", Required = false,
12
+ [<Option('s', "skipupdatecanonicaldata", Required = false,
15
13
  HelpText = "Don't update the canonical data.")>] SkipUpdateCanonicalData : bool;
16
14
  }
17
15
 
@@ -149,11 +149,11 @@ let formatMultiLineCollection (openPrefix, closePostfix) collection =
149
149
  let formatLine i line =
150
150
  match i with
151
151
  | 0 ->
152
- sprintf "%s %s" openPrefix line
152
+ sprintf "%s %s;" openPrefix line
153
153
  | _ when i = length - 1 ->
154
154
  sprintf "%s %s %s" lineIndent line closePostfix
155
155
  | _ ->
156
- sprintf "%s %s" lineIndent line
156
+ sprintf "%s %s;" lineIndent line
157
157
 
158
158
  collection
159
159
  |> Seq.mapi formatLine
@@ -16,8 +16,9 @@ let regenerateTestClasses options =
16
16
  Log.Information("Re-generating test classes...")
17
17
 
18
18
  let regenerateTestClass' = regenerateTestClass options
19
+ let filteredExercise = Option.ofNonEmptyString options.Exercise
19
20
 
20
- createExercises options.Exercises
21
+ createExercises filteredExercise
21
22
  |> Seq.iter regenerateTestClass'
22
23
 
23
24
  Log.Information("Re-generated test classes.")
@@ -27,9 +28,9 @@ let main argv =
27
28
  Logging.setupLogger()
28
29
 
29
30
  match parseOptions argv with
30
- | Result.Ok(options) ->
31
+ | Ok(options) ->
31
32
  regenerateTestClasses options
32
33
  0
33
- | Result.Error(errors) ->
34
+ | Error(errors) ->
34
35
  Log.Error("Error(s) parsing commandline arguments: {Errors}", errors)
35
36
  1
@@ -15,7 +15,7 @@ So say you have a matrix like so:
15
15
  It has a saddle point at (1, 0).
16
16
 
17
17
  It's called a "saddle point" because it is greater than or equal to
18
- every element in its row and the less than or equal to every element in
18
+ every element in its row and less than or equal to every element in
19
19
  its column.
20
20
 
21
21
  A matrix may have zero or more saddle points.
@@ -11,34 +11,6 @@ When X is a name or "you".
11
11
  If the given name is "Alice", the result should be "One for Alice, one for me."
12
12
  If no name is given, the result should be "One for you, one for me."
13
13
 
14
- ## Test-Driven Development
15
-
16
- As programmers mature, they eventually want to test their code.
17
-
18
- Here at Exercism we simulate [Test-Driven
19
- Development](http://en.wikipedia.org/wiki/Test-driven_development) (TDD), where
20
- you write your tests before writing any functionality. The simulation comes in
21
- the form of a pre-written test suite, which will signal that you have solved
22
- the problem.
23
-
24
- It will also provide you with a safety net to explore other solutions without
25
- breaking the functionality.
26
-
27
- ### A typical TDD workflow on Exercism:
28
-
29
- 1. Run the test file and pick one test that's failing.
30
- 2. Write some code to fix the test you picked.
31
- 3. Re-run the tests to confirm the test is now passing.
32
- 4. Repeat from step 1.
33
- 5. Submit your solution (`exercism submit /path/to/file`)
34
-
35
- ## Instructions
36
-
37
- Submissions are encouraged to be general, within reason. Having said that, it's
38
- also important not to over-engineer a solution.
39
-
40
- It's important to remember that the goal is to make code as expressive and
41
- readable as we can.
42
14
 
43
15
  # Java Tips
44
16
 
@@ -15,39 +15,43 @@
15
15
  return str;
16
16
  }
17
17
 
18
- function action(current_verse) {
19
- var sbj, str = '';
18
+ function action(currentVerse) {
19
+ var sbj;
20
+ var str = '';
20
21
 
21
- if (current_verse === 0) {
22
+ if (currentVerse === 0) {
22
23
  str = 'Go to the store and buy some more, ';
23
24
  } else {
24
- sbj = (current_verse === 1 ? 'it' : 'one');
25
+ sbj = (currentVerse === 1 ? 'it' : 'one');
25
26
  str = 'Take ' + sbj + ' down and pass it around, ';
26
27
  }
27
28
 
28
29
  return str;
29
30
  }
30
31
 
31
- function next_bottle(current_verse) {
32
- return bottles(next_verse(current_verse)).toLowerCase() + ' of beer on the wall.\n';
32
+ function nextBottle(currentVerse) {
33
+ return bottles(nextVerse(currentVerse)).toLowerCase() + ' of beer on the wall.\n';
33
34
  }
34
35
 
35
- function next_verse(current_verse) {
36
- return current_verse === 0 ? 99 : (current_verse - 1);
36
+ function nextVerse(currentVerse) {
37
+ return currentVerse === 0 ? 99 : (currentVerse - 1);
37
38
  }
38
39
 
39
40
  function BeerSong() {}
40
41
 
41
42
  BeerSong.prototype.sing = function (first, last) {
42
- if (typeof (first) === 'undefined') {
43
- first = 99;
43
+ var firstVerseBottleCount = first;
44
+ var lastVerseBottleCount = last;
45
+
46
+ if (typeof (firstVerseBottleCount) === 'undefined') {
47
+ firstVerseBottleCount = 99;
44
48
  }
45
- if (typeof (last) === 'undefined') {
46
- last = 0;
49
+ if (typeof (lastVerseBottleCount) === 'undefined') {
50
+ lastVerseBottleCount = 0;
47
51
  }
48
52
 
49
53
  var verses = [];
50
- for (var i = first; i >= last; i--) {
54
+ for (var i = firstVerseBottleCount; i >= lastVerseBottleCount; i--) {
51
55
  verses.push(this.verse(i));
52
56
  }
53
57
 
@@ -58,7 +62,7 @@
58
62
  var line1 = bottles(number) + ' of beer on the wall, ';
59
63
  var line2 = bottles(number).toLowerCase() + ' of beer.\n';
60
64
  var line3 = action(number);
61
- var line4 = next_bottle(number);
65
+ var line4 = nextBottle(number);
62
66
 
63
67
  return [line1, line2, line3, line4].join('');
64
68
  };