trackler 2.2.1.46 → 2.2.1.47

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 (224) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/nucleotide-count/canonical-data.json +7 -7
  4. data/tracks/c/README.md +1 -1
  5. data/tracks/c/docs/SNIPPET.txt +2 -3
  6. data/tracks/c/exercises/acronym/test/test_acronym.c +8 -0
  7. data/tracks/c/exercises/all-your-base/test/test_all_your_base.c +8 -0
  8. data/tracks/c/exercises/allergies/test/test_allergies.c +8 -0
  9. data/tracks/c/exercises/anagram/test/test_anagram.c +8 -0
  10. data/tracks/c/exercises/atbash-cipher/test/test_atbash_cipher.c +8 -0
  11. data/tracks/c/exercises/beer-song/src/example.c +23 -22
  12. data/tracks/c/exercises/beer-song/src/example.h +3 -3
  13. data/tracks/c/exercises/beer-song/test/test_beer_song.c +8 -0
  14. data/tracks/c/exercises/binary-search/test/test_binary_search.c +8 -0
  15. data/tracks/c/exercises/binary/test/test_binary.c +8 -0
  16. data/tracks/c/exercises/bob/test/test_bob.c +8 -0
  17. data/tracks/c/exercises/clock/test/test_clock.c +8 -0
  18. data/tracks/c/exercises/difference-of-squares/test/test_difference_of_squares.c +8 -0
  19. data/tracks/c/exercises/gigasecond/test/test_gigasecond.c +8 -0
  20. data/tracks/c/exercises/grains/test/test_grains.c +8 -0
  21. data/tracks/c/exercises/hamming/test/test_hamming.c +8 -0
  22. data/tracks/c/exercises/hello-world/src/example.c +0 -2
  23. data/tracks/c/exercises/hello-world/test/test_hello_world.c +8 -0
  24. data/tracks/c/exercises/isogram/test/test_isogram.c +8 -0
  25. data/tracks/c/exercises/largest-series-product/test/test_largest_series_product.c +8 -0
  26. data/tracks/c/exercises/leap/test/test_leap.c +8 -0
  27. data/tracks/c/exercises/meetup/test/test_meetup.c +8 -0
  28. data/tracks/c/exercises/nth-prime/test/test_nth_prime.c +8 -0
  29. data/tracks/c/exercises/nucleotide-count/test/test_nucleotide_count.c +8 -0
  30. data/tracks/c/exercises/palindrome-products/test/test_palindrome_products.c +8 -0
  31. data/tracks/c/exercises/pangram/test/test_pangram.c +8 -0
  32. data/tracks/c/exercises/pascals-triangle/test/test_pascals_triangle.c +8 -0
  33. data/tracks/c/exercises/perfect-numbers/src/example.c +4 -4
  34. data/tracks/c/exercises/perfect-numbers/src/example.h +4 -4
  35. data/tracks/c/exercises/perfect-numbers/src/perfect_numbers.h +4 -4
  36. data/tracks/c/exercises/perfect-numbers/test/test_perfect_numbers.c +23 -13
  37. data/tracks/c/exercises/phone-number/test/test_phone_number.c +8 -0
  38. data/tracks/c/exercises/raindrops/test/test_raindrops.c +5 -1
  39. data/tracks/c/exercises/react/src/example.c +8 -8
  40. data/tracks/c/exercises/react/test/test_react.c +8 -0
  41. data/tracks/c/exercises/rna-transcription/test/test_rna_transcription.c +8 -0
  42. data/tracks/c/exercises/robot-simulator/src/example.c +12 -12
  43. data/tracks/c/exercises/robot-simulator/src/robot_simulator.h +11 -11
  44. data/tracks/c/exercises/robot-simulator/test/test_robot_simulator.c +33 -25
  45. data/tracks/c/exercises/roman-numerals/test/test_roman_numerals.c +8 -0
  46. data/tracks/c/exercises/scrabble-score/test/test_scrabble_score.c +8 -0
  47. data/tracks/c/exercises/series/test/test_series.c +8 -0
  48. data/tracks/c/exercises/sieve/test/test_sieve.c +8 -0
  49. data/tracks/c/exercises/space-age/src/example.h +8 -8
  50. data/tracks/c/exercises/space-age/test/test_space_age.c +16 -8
  51. data/tracks/c/exercises/sum-of-multiples/test/test_sum_of_multiples.c +8 -0
  52. data/tracks/c/exercises/triangle/test/test_triangle.c +8 -0
  53. data/tracks/c/exercises/word-count/test/test_word_count.c +8 -0
  54. data/tracks/cfml/config.json +8 -0
  55. data/tracks/cfml/exercises/anagram/.meta/HINTS.md +0 -0
  56. data/tracks/cfml/exercises/anagram/Anagram.cfc +13 -0
  57. data/tracks/cfml/exercises/anagram/AnagramTest.cfc +79 -0
  58. data/tracks/cfml/exercises/anagram/README.md +29 -0
  59. data/tracks/cfml/exercises/anagram/Solution.cfc +42 -0
  60. data/tracks/cfml/exercises/anagram/SolutionTest.cfc +7 -0
  61. data/tracks/cfml/exercises/anagram/TestRunner.cfc +103 -0
  62. data/tracks/cfml/exercises/anagram/box.json +8 -0
  63. data/tracks/cfml/exercises/anagram/index.cfm +37 -0
  64. data/tracks/common-lisp/config.json +5 -5
  65. data/tracks/csharp/exercises/two-bucket/Example.cs +53 -79
  66. data/tracks/csharp/exercises/two-bucket/TwoBucketTest.cs +2 -2
  67. data/tracks/csharp/generators/Exercises/QueenAttack.cs +3 -3
  68. data/tracks/dart/exercises/leap/test/leap_test.dart +1 -1
  69. data/tracks/delphi/exercises/hamming/uHammingTests.pas +2 -2
  70. data/tracks/delphi/exercises/leap/uLeapTests.pas +11 -38
  71. data/tracks/delphi/exercises/nucleotide-count/uNucleotideCountExample.pas +1 -1
  72. data/tracks/delphi/exercises/nucleotide-count/uNucleotideCountTest.pas +31 -55
  73. data/tracks/ecmascript/config.json +31 -0
  74. data/tracks/ecmascript/config/maintainers.json +5 -5
  75. data/tracks/ecmascript/exercises/accumulate/package.json +1 -1
  76. data/tracks/ecmascript/exercises/acronym/package.json +1 -1
  77. data/tracks/ecmascript/exercises/all-your-base/package.json +1 -1
  78. data/tracks/ecmascript/exercises/allergies/package.json +1 -1
  79. data/tracks/ecmascript/exercises/alphametics/package.json +1 -1
  80. data/tracks/ecmascript/exercises/anagram/package.json +1 -1
  81. data/tracks/ecmascript/exercises/atbash-cipher/package.json +1 -1
  82. data/tracks/ecmascript/exercises/beer-song/package.json +1 -1
  83. data/tracks/ecmascript/exercises/binary-search-tree/package.json +1 -1
  84. data/tracks/ecmascript/exercises/binary-search/package.json +1 -1
  85. data/tracks/ecmascript/exercises/binary/package.json +1 -1
  86. data/tracks/ecmascript/exercises/bob/package.json +1 -1
  87. data/tracks/ecmascript/exercises/bracket-push/package.json +1 -1
  88. data/tracks/ecmascript/exercises/circular-buffer/package.json +1 -1
  89. data/tracks/ecmascript/exercises/clock/package.json +1 -1
  90. data/tracks/ecmascript/exercises/collatz-conjecture/README.md +59 -0
  91. data/tracks/ecmascript/exercises/collatz-conjecture/collatz-conjecture.spec.js +31 -0
  92. data/tracks/ecmascript/exercises/collatz-conjecture/example.js +14 -0
  93. data/tracks/ecmascript/exercises/collatz-conjecture/package.json +69 -0
  94. data/tracks/ecmascript/exercises/connect/package.json +1 -1
  95. data/tracks/ecmascript/exercises/crypto-square/package.json +1 -1
  96. data/tracks/ecmascript/exercises/custom-set/package.json +1 -1
  97. data/tracks/ecmascript/exercises/diamond/package.json +1 -1
  98. data/tracks/ecmascript/exercises/difference-of-squares/package.json +1 -1
  99. data/tracks/ecmascript/exercises/diffie-hellman/package.json +1 -1
  100. data/tracks/ecmascript/exercises/etl/package.json +1 -1
  101. data/tracks/ecmascript/exercises/flatten-array/package.json +1 -1
  102. data/tracks/ecmascript/exercises/food-chain/package.json +1 -1
  103. data/tracks/ecmascript/exercises/gigasecond/package.json +1 -1
  104. data/tracks/ecmascript/exercises/grade-school/package.json +1 -1
  105. data/tracks/ecmascript/exercises/grains/package.json +1 -1
  106. data/tracks/ecmascript/exercises/hamming/package.json +1 -1
  107. data/tracks/ecmascript/exercises/hello-world/package.json +1 -1
  108. data/tracks/ecmascript/exercises/hexadecimal/package.json +1 -1
  109. data/tracks/ecmascript/exercises/isogram/package.json +1 -1
  110. data/tracks/ecmascript/exercises/kindergarten-garden/package.json +1 -1
  111. data/tracks/ecmascript/exercises/largest-series-product/package.json +1 -1
  112. data/tracks/ecmascript/exercises/leap/package.json +1 -1
  113. data/tracks/ecmascript/exercises/linked-list/package.json +1 -1
  114. data/tracks/ecmascript/exercises/list-ops/package.json +1 -1
  115. data/tracks/ecmascript/exercises/luhn/package.json +1 -1
  116. data/tracks/ecmascript/exercises/matrix/package.json +1 -1
  117. data/tracks/ecmascript/exercises/meetup/package.json +1 -1
  118. data/tracks/ecmascript/exercises/minesweeper/package.json +1 -1
  119. data/tracks/ecmascript/exercises/nth-prime/package.json +1 -1
  120. data/tracks/ecmascript/exercises/ocr-numbers/package.json +1 -1
  121. data/tracks/ecmascript/exercises/octal/package.json +1 -1
  122. data/tracks/ecmascript/exercises/palindrome-products/package.json +1 -1
  123. data/tracks/ecmascript/exercises/pangram/package.json +1 -1
  124. data/tracks/ecmascript/exercises/pascals-triangle/package.json +1 -1
  125. data/tracks/ecmascript/exercises/perfect-numbers/package.json +1 -1
  126. data/tracks/ecmascript/exercises/phone-number/package.json +1 -1
  127. data/tracks/ecmascript/exercises/pig-latin/package.json +1 -1
  128. data/tracks/ecmascript/exercises/prime-factors/package.json +1 -1
  129. data/tracks/ecmascript/exercises/proverb/package.json +1 -1
  130. data/tracks/ecmascript/exercises/pythagorean-triplet/package.json +1 -1
  131. data/tracks/ecmascript/exercises/queen-attack/package.json +1 -1
  132. data/tracks/ecmascript/exercises/raindrops/package.json +1 -1
  133. data/tracks/ecmascript/exercises/rna-transcription/package.json +1 -1
  134. data/tracks/ecmascript/exercises/robot-name/package.json +1 -1
  135. data/tracks/ecmascript/exercises/robot-simulator/package.json +1 -1
  136. data/tracks/ecmascript/exercises/roman-numerals/package.json +1 -1
  137. data/tracks/ecmascript/exercises/run-length-encoding/package.json +1 -1
  138. data/tracks/ecmascript/exercises/saddle-points/package.json +1 -1
  139. data/tracks/ecmascript/exercises/say/package.json +1 -1
  140. data/tracks/ecmascript/exercises/scrabble-score/package.json +1 -1
  141. data/tracks/ecmascript/exercises/secret-handshake/package.json +1 -1
  142. data/tracks/ecmascript/exercises/series/package.json +1 -1
  143. data/tracks/ecmascript/exercises/sieve/package.json +1 -1
  144. data/tracks/ecmascript/exercises/simple-cipher/package.json +1 -1
  145. data/tracks/ecmascript/exercises/simple-linked-list/package.json +1 -1
  146. data/tracks/ecmascript/exercises/space-age/package.json +1 -1
  147. data/tracks/ecmascript/exercises/strain/package.json +1 -1
  148. data/tracks/ecmascript/exercises/sublist/package.json +1 -1
  149. data/tracks/ecmascript/exercises/sum-of-multiples/package.json +1 -1
  150. data/tracks/ecmascript/exercises/triangle/package.json +1 -1
  151. data/tracks/ecmascript/exercises/trinary/package.json +1 -1
  152. data/tracks/ecmascript/exercises/twelve-days/package.json +1 -1
  153. data/tracks/ecmascript/exercises/two-bucket/package.json +1 -1
  154. data/tracks/ecmascript/exercises/word-count/package.json +1 -1
  155. data/tracks/ecmascript/exercises/word-search/README.md +58 -0
  156. data/tracks/ecmascript/exercises/word-search/example.js +146 -0
  157. data/tracks/ecmascript/exercises/word-search/package.json +69 -0
  158. data/tracks/ecmascript/exercises/word-search/word-search.spec.js +626 -0
  159. data/tracks/ecmascript/exercises/wordy/package.json +1 -1
  160. data/tracks/ecmascript/package.json +1 -1
  161. data/tracks/elixir/config.json +11 -0
  162. data/tracks/elixir/exercises/luhn/example.exs +26 -46
  163. data/tracks/elixir/exercises/luhn/luhn.exs +0 -13
  164. data/tracks/elixir/exercises/luhn/luhn_test.exs +44 -14
  165. data/tracks/elixir/exercises/transpose/README.md +101 -0
  166. data/tracks/elixir/exercises/transpose/example.exs +46 -0
  167. data/tracks/elixir/exercises/transpose/transpose.exs +22 -0
  168. data/tracks/elixir/exercises/transpose/transpose_test.exs +248 -0
  169. data/tracks/fsharp/exercises/grains/Example.fs +10 -2
  170. data/tracks/fsharp/exercises/grains/Grains.fs +2 -4
  171. data/tracks/fsharp/exercises/grains/GrainsTest.fs +52 -25
  172. data/tracks/fsharp/exercises/phone-number/Example.fs +11 -3
  173. data/tracks/fsharp/exercises/phone-number/PhoneNumber.fs +1 -1
  174. data/tracks/fsharp/exercises/phone-number/PhoneNumberTest.fs +32 -21
  175. data/tracks/fsharp/exercises/prime-factors/Example.fs +6 -13
  176. data/tracks/fsharp/exercises/prime-factors/PrimeFactors.fs +1 -1
  177. data/tracks/fsharp/exercises/prime-factors/PrimeFactorsTest.fs +23 -32
  178. data/tracks/fsharp/exercises/rail-fence-cipher/RailFenceCipherTest.fs +22 -13
  179. data/tracks/fsharp/generators/Exercise.fs +3 -4
  180. data/tracks/fsharp/generators/Generators.fs +31 -0
  181. data/tracks/gnu-apl/bin/run-all-tests +5 -2
  182. data/tracks/java/CONTRIBUTING.md +8 -0
  183. data/tracks/java/POLICIES.md +2 -2
  184. data/tracks/java/config.json +26 -4
  185. data/tracks/java/exercises/triangle/.meta/.version +1 -0
  186. data/tracks/java/exercises/triangle/.meta/src/reference/java/Triangle.java +1 -1
  187. data/tracks/java/exercises/triangle/src/test/java/TriangleTest.java +59 -40
  188. data/tracks/javascript/config.json +30 -0
  189. data/tracks/javascript/config/maintainers.json +8 -8
  190. data/tracks/javascript/exercises/change/example.js +6 -22
  191. data/tracks/javascript/exercises/collatz-conjecture/README.md +57 -0
  192. data/tracks/javascript/exercises/collatz-conjecture/collatz-conjecture.spec.js +37 -0
  193. data/tracks/javascript/exercises/collatz-conjecture/example.js +20 -0
  194. data/tracks/javascript/exercises/protein-translation/example.js +30 -31
  195. data/tracks/javascript/exercises/protein-translation/protein-translation.spec.js +60 -60
  196. data/tracks/javascript/exercises/transpose/README.md +89 -0
  197. data/tracks/javascript/exercises/transpose/example.js +17 -0
  198. data/tracks/javascript/exercises/transpose/transpose.spec.js +67 -0
  199. data/tracks/objective-c/config.json +283 -263
  200. data/tracks/objective-c/exercises/grains/GrainsExample.h +6 -0
  201. data/tracks/objective-c/exercises/grains/GrainsExample.m +19 -0
  202. data/tracks/objective-c/exercises/grains/GrainsTest.m +85 -0
  203. data/tracks/objective-c/exercises/nth-prime/NthPrimeExample.h +6 -0
  204. data/tracks/objective-c/exercises/nth-prime/NthPrimeExample.m +39 -0
  205. data/tracks/objective-c/exercises/nth-prime/NthPrimeTest.m +53 -0
  206. data/tracks/python/config.json +42 -11
  207. data/tracks/python/exercises/change/README.md +34 -0
  208. data/tracks/python/exercises/two-bucket/README.md +47 -0
  209. data/tracks/ruby/README.md +4 -1
  210. data/tracks/ruby/lib/generator/command_line.rb +3 -3
  211. data/tracks/ruby/lib/generator/command_line/generator_optparser.rb +3 -3
  212. data/tracks/ruby/test/generator/command_line/generator_optparser_test.rb +4 -4
  213. data/tracks/ruby/test/generator/command_line_test.rb +5 -5
  214. data/tracks/typescript/config.json +15 -0
  215. data/tracks/typescript/exercises/strain/README.md +60 -0
  216. data/tracks/typescript/exercises/strain/package.json +36 -0
  217. data/tracks/typescript/exercises/strain/strain.example.ts +23 -0
  218. data/tracks/typescript/exercises/strain/strain.test.ts +76 -0
  219. data/tracks/typescript/exercises/strain/strain.ts +0 -0
  220. data/tracks/typescript/exercises/strain/tsconfig.json +22 -0
  221. data/tracks/typescript/exercises/strain/tslint.json +127 -0
  222. data/tracks/typescript/exercises/strain/yarn.lock +2305 -0
  223. metadata +46 -3
  224. data/tracks/ecmascript/package-lock.json +0 -2835
@@ -2,5 +2,13 @@
2
2
 
3
3
  open System.Numerics
4
4
 
5
- let square (n:int) = 2I ** (n - 1)
6
- let total = [1..64] |> List.sumBy square
5
+ let square (n:int) =
6
+ if n <= 0 || n > 64 then
7
+ Error "Invalid input"
8
+ else
9
+ Ok (2I ** (n - 1) |> uint64)
10
+
11
+ let total =
12
+ [1..64]
13
+ |> List.map square
14
+ |> List.reduce (fun x y -> match x, y with Ok a, Ok b -> Ok (a + b) | _ -> Error "Invalid input")
@@ -1,6 +1,4 @@
1
1
  module Grains
2
2
 
3
- open System.Numerics
4
-
5
- let square (n: int): BigInteger = failwith "You need to implement this function."
6
- let total: BigInteger = failwith "You need to implement this function."
3
+ let square (n: int): Result<uint64,string> = failwith "You need to implement this function."
4
+ let total: Result<uint64,string> = failwith "You need to implement this function."
@@ -1,37 +1,64 @@
1
+ // This file was auto-generated based on version 1.0.0 of the canonical data.
2
+
1
3
  module GrainsTest
2
4
 
3
- open Xunit
4
5
  open FsUnit.Xunit
6
+ open Xunit
7
+
5
8
  open Grains
6
-
9
+
7
10
  [<Fact>]
8
- let ``Test square 1`` () =
9
- square 1 |> should equal 1I
10
-
11
+ let ``Returns the total number of grains on the board`` () =
12
+ let expected: Result<uint64,string> = Ok 18446744073709551615UL
13
+ total |> should equal expected
14
+
11
15
  [<Fact(Skip = "Remove to run test")>]
12
- let ``Test square 2`` () =
13
- square 2 |> should equal 2I
14
-
16
+ let ``1`` () =
17
+ let expected: Result<uint64,string> = Ok 1UL
18
+ square 1 |> should equal expected
19
+
15
20
  [<Fact(Skip = "Remove to run test")>]
16
- let ``Test square 3`` () =
17
- square 3 |> should equal 4I
18
-
21
+ let ``2`` () =
22
+ let expected: Result<uint64,string> = Ok 2UL
23
+ square 2 |> should equal expected
24
+
19
25
  [<Fact(Skip = "Remove to run test")>]
20
- let ``Test square 4`` () =
21
- square 4 |> should equal 8I
22
-
26
+ let ``3`` () =
27
+ let expected: Result<uint64,string> = Ok 4UL
28
+ square 3 |> should equal expected
29
+
23
30
  [<Fact(Skip = "Remove to run test")>]
24
- let ``Test square 16`` () =
25
- square 16 |> should equal 32768I
26
-
31
+ let ``4`` () =
32
+ let expected: Result<uint64,string> = Ok 8UL
33
+ square 4 |> should equal expected
34
+
27
35
  [<Fact(Skip = "Remove to run test")>]
28
- let ``Test square 32`` () =
29
- square 32 |> should equal 2147483648I
30
-
36
+ let ``16`` () =
37
+ let expected: Result<uint64,string> = Ok 32768UL
38
+ square 16 |> should equal expected
39
+
31
40
  [<Fact(Skip = "Remove to run test")>]
32
- let ``Test square 64`` () =
33
- square 64 |> should equal 9223372036854775808I
34
-
41
+ let ``32`` () =
42
+ let expected: Result<uint64,string> = Ok 2147483648UL
43
+ square 32 |> should equal expected
44
+
35
45
  [<Fact(Skip = "Remove to run test")>]
36
- let ``Test total grains`` () =
37
- total |> should equal 18446744073709551615I
46
+ let ``64`` () =
47
+ let expected: Result<uint64,string> = Ok 9223372036854775808UL
48
+ square 64 |> should equal expected
49
+
50
+ [<Fact(Skip = "Remove to run test")>]
51
+ let ``Square 0 raises an exception`` () =
52
+ let expected: Result<uint64,string> = Error "Invalid input"
53
+ square 0 |> should equal expected
54
+
55
+ [<Fact(Skip = "Remove to run test")>]
56
+ let ``Negative square raises an exception`` () =
57
+ let expected: Result<uint64,string> = Error "Invalid input"
58
+ square -1 |> should equal expected
59
+
60
+ [<Fact(Skip = "Remove to run test")>]
61
+ let ``Square greater than 64 raises an exception`` () =
62
+ let expected: Result<uint64,string> = Error "Invalid input"
63
+ square 65 |> should equal expected
64
+
@@ -2,10 +2,18 @@
2
2
 
3
3
  open System
4
4
 
5
- let parsePhoneNumber (input: string) =
5
+ let private validate (input: string) =
6
+ let isStartDigit digit = List.contains digit ['2'..'9']
7
+
8
+ if isStartDigit input.[0] && isStartDigit input.[3] then
9
+ Some input
10
+ else
11
+ None
12
+
13
+ let clean (input: string) =
6
14
  let digits = input.ToCharArray() |> Array.filter (Char.IsDigit) |> String
7
15
 
8
16
  match digits.Length with
9
- | 10 -> Some digits
10
- | 11 when digits.Chars 0 = '1' -> Some (digits.Substring(1))
17
+ | 10 -> validate digits
18
+ | 11 when digits.Chars 0 = '1' -> validate (digits.Substring(1))
11
19
  | _ -> None
@@ -1,3 +1,3 @@
1
1
  module PhoneNumber
2
2
 
3
- let parsePhoneNumber input = failwith "You need to implement this function."
3
+ let clean input = failwith "You need to implement this function."
@@ -1,46 +1,57 @@
1
+ // This file was auto-generated based on version 1.2.0 of the canonical data.
2
+
1
3
  module PhoneNumberTest
2
4
 
3
- open Xunit
4
5
  open FsUnit.Xunit
6
+ open Xunit
5
7
 
6
8
  open PhoneNumber
7
9
 
8
10
  [<Fact>]
9
- let ``Cleans phone number`` () =
10
- parsePhoneNumber "(123) 456-7890" |> should equal <| Some "1234567890"
11
+ let ``Cleans the number`` () =
12
+ clean "(223) 456-7890" |> should equal <| Some "2234567890"
11
13
 
12
14
  [<Fact(Skip = "Remove to run test")>]
13
- let ``Cleans phone number with dots`` () =
14
- parsePhoneNumber "123.456.7890" |> should equal <| Some "1234567890"
15
+ let ``Cleans numbers with dots`` () =
16
+ clean "223.456.7890" |> should equal <| Some "2234567890"
15
17
 
16
18
  [<Fact(Skip = "Remove to run test")>]
17
- let ``Valid when 11 digits and first is 1`` () =
18
- parsePhoneNumber "11234567890" |> should equal <| Some "1234567890"
19
+ let ``Cleans numbers with multiple spaces`` () =
20
+ clean "223 456 7890 " |> should equal <| Some "2234567890"
19
21
 
20
22
  [<Fact(Skip = "Remove to run test")>]
21
- let ``Invalid when 11 digits`` () =
22
- parsePhoneNumber "21234567890" |> should equal None
23
+ let ``Invalid when 9 digits`` () =
24
+ clean "123456789" |> should equal <| None
23
25
 
24
26
  [<Fact(Skip = "Remove to run test")>]
25
- let ``Invalid when 9 digits`` () =
26
- parsePhoneNumber "123456789" |> should equal None
27
+ let ``Invalid when 11 digits does not start with a 1`` () =
28
+ clean "22234567890" |> should equal <| None
27
29
 
28
30
  [<Fact(Skip = "Remove to run test")>]
29
- let ``Invalid when 12 digits`` () =
30
- parsePhoneNumber "123456789012" |> should equal None
31
+ let ``Valid when 11 digits and starting with 1`` () =
32
+ clean "12234567890" |> should equal <| Some "2234567890"
31
33
 
32
34
  [<Fact(Skip = "Remove to run test")>]
33
- let ``Invalid when empty`` () =
34
- parsePhoneNumber "" |> should equal None
35
+ let ``Valid when 11 digits and starting with 1 even with punctuation`` () =
36
+ clean "+1 (223) 456-7890" |> should equal <| Some "2234567890"
35
37
 
36
38
  [<Fact(Skip = "Remove to run test")>]
37
- let ``Invalid when no digits present`` () =
38
- parsePhoneNumber " (-) " |> should equal None
39
+ let ``Invalid when more than 11 digits`` () =
40
+ clean "321234567890" |> should equal <| None
39
41
 
40
42
  [<Fact(Skip = "Remove to run test")>]
41
- let ``Valid with leading characters`` () =
42
- parsePhoneNumber "my parsePhoneNumber is 123 456 7890" |> should equal <| Some "1234567890"
43
+ let ``Invalid with letters`` () =
44
+ clean "123-abc-7890" |> should equal <| None
43
45
 
44
46
  [<Fact(Skip = "Remove to run test")>]
45
- let ``Valid with trailing characters`` () =
46
- parsePhoneNumber "123 456 7890 - bob" |> should equal <| Some "1234567890"
47
+ let ``Invalid with punctuations`` () =
48
+ clean "123-@:!-7890" |> should equal <| None
49
+
50
+ [<Fact(Skip = "Remove to run test")>]
51
+ let ``Invalid if area code does not start with 2-9`` () =
52
+ clean "(123) 456-7890" |> should equal <| None
53
+
54
+ [<Fact(Skip = "Remove to run test")>]
55
+ let ``Invalid if exchange code does not start with 2-9`` () =
56
+ clean "(223) 056-7890" |> should equal <| None
57
+
@@ -2,19 +2,12 @@
2
2
 
3
3
  open System
4
4
 
5
- let possiblePrimes (number: int64): int64 list =
6
- [2L; 3L] @ [for n in 6L..6L..number do
7
- for k in [-1L; 1L] do
8
- yield n + k ]
9
-
10
- let primeFactorsFor number =
11
- let rec loop factors (remainder: int64) (possibleFactors: int64 list) =
12
- match possibleFactors with
13
- | [] -> factors |> List.rev
14
- | factor::xs ->
5
+ let factors number =
6
+ let rec loop factors (remainder: int64) (factorToCheck: int64) =
15
7
  match remainder with
16
8
  | _ when remainder <= 1L -> factors |> List.rev
17
- | _ when remainder % factor = 0L -> loop (int factor :: factors) (remainder / factor |> int64) possibleFactors
18
- | _ -> loop factors remainder xs
9
+ | _ when remainder % factorToCheck = 0L
10
+ -> loop (int factorToCheck :: factors) (remainder / factorToCheck |> int64) factorToCheck
11
+ | _ -> loop factors remainder (factorToCheck+1L)
19
12
 
20
- loop [] number (possiblePrimes number)
13
+ loop [] number 2L
@@ -1,3 +1,3 @@
1
1
  module PrimeFactors
2
2
 
3
- let primeFactorsFor number = failwith "You need to implement this function."
3
+ let factors number = failwith "You need to implement this function."
@@ -1,46 +1,37 @@
1
+ // This file was auto-generated based on version 1.0.0 of the canonical data.
2
+
1
3
  module PrimeFactorsTest
2
4
 
3
- open Xunit
4
5
  open FsUnit.Xunit
6
+ open Xunit
5
7
 
6
8
  open PrimeFactors
7
9
 
8
10
  [<Fact>]
9
- let ``Test 1`` () =
10
- primeFactorsFor 1L |> should be Empty
11
-
12
- [<Fact(Skip = "Remove to run test")>]
13
- let ``Test 2`` () =
14
- primeFactorsFor 2L |> should equal [2]
15
-
16
- [<Fact(Skip = "Remove to run test")>]
17
- let ``Test 3`` () =
18
- primeFactorsFor 3L |> should equal [3]
11
+ let ``No factors`` () =
12
+ factors 1L |> should be Empty
19
13
 
20
14
  [<Fact(Skip = "Remove to run test")>]
21
- let ``Test 4`` () =
22
- primeFactorsFor 4L |> should equal [2; 2]
23
-
24
- [<Fact(Skip = "Remove to run test")>]
25
- let ``Test 6`` () =
26
- primeFactorsFor 6L |> should equal [2; 3]
27
-
15
+ let ``Prime number`` () =
16
+ factors 2L |> should equal [2]
17
+
28
18
  [<Fact(Skip = "Remove to run test")>]
29
- let ``Test 8`` () =
30
- primeFactorsFor 8L |> should equal [2; 2; 2]
31
-
19
+ let ``Square of a prime`` () =
20
+ factors 9L |> should equal [3; 3]
21
+
32
22
  [<Fact(Skip = "Remove to run test")>]
33
- let ``Test 9`` () =
34
- primeFactorsFor 9L |> should equal [3; 3]
35
-
23
+ let ``Cube of a prime`` () =
24
+ factors 8L |> should equal [2; 2; 2]
25
+
36
26
  [<Fact(Skip = "Remove to run test")>]
37
- let ``Test 27`` () =
38
- primeFactorsFor 27L |> should equal [3; 3; 3]
39
-
27
+ let ``Product of primes and non-primes`` () =
28
+ factors 12L |> should equal [2; 2; 3]
29
+
40
30
  [<Fact(Skip = "Remove to run test")>]
41
- let ``Test 625`` () =
42
- primeFactorsFor 625L |> should equal [5; 5; 5; 5]
43
-
31
+ let ``Product of primes`` () =
32
+ factors 901255L |> should equal [5; 17; 23; 461]
33
+
44
34
  [<Fact(Skip = "Remove to run test")>]
45
- let ``Test 901255`` () =
46
- primeFactorsFor 901255L |> should equal [5; 17; 23; 461]
35
+ let ``Factors include a large prime`` () =
36
+ factors 93819012551L |> should equal [11; 9539; 894119]
37
+
@@ -1,42 +1,51 @@
1
+ // This file was auto-generated based on version 1.0.1 of the canonical data.
2
+
1
3
  module RailFenceCipherTest
2
4
 
3
- open Xunit
4
5
  open FsUnit.Xunit
6
+ open Xunit
5
7
 
6
8
  open RailFenceCipher
7
9
 
8
10
  [<Fact>]
9
11
  let ``Encode with two rails`` () =
10
- let actual = encode 2 "XOXOXOXOXOXOXOXOXO"
12
+ let rails = 2
13
+ let msg = "XOXOXOXOXOXOXOXOXO"
11
14
  let expected = "XXXXXXXXXOOOOOOOOO"
12
- actual |> should equal expected
15
+ encode rails msg |> should equal expected
13
16
 
14
17
  [<Fact(Skip = "Remove to run test")>]
15
18
  let ``Encode with three rails`` () =
16
- let actual = encode 3 "WEAREDISCOVEREDFLEEATONCE"
19
+ let rails = 3
20
+ let msg = "WEAREDISCOVEREDFLEEATONCE"
17
21
  let expected = "WECRLTEERDSOEEFEAOCAIVDEN"
18
- actual |> should equal expected
22
+ encode rails msg |> should equal expected
19
23
 
20
24
  [<Fact(Skip = "Remove to run test")>]
21
25
  let ``Encode with ending in the middle`` () =
22
- let actual = encode 4 "EXERCISES"
26
+ let rails = 4
27
+ let msg = "EXERCISES"
23
28
  let expected = "ESXIEECSR"
24
- actual |> should equal expected
29
+ encode rails msg |> should equal expected
25
30
 
26
31
  [<Fact(Skip = "Remove to run test")>]
27
32
  let ``Decode with three rails`` () =
28
- let actual = decode 3 "TEITELHDVLSNHDTISEIIEA"
33
+ let rails = 3
34
+ let msg = "TEITELHDVLSNHDTISEIIEA"
29
35
  let expected = "THEDEVILISINTHEDETAILS"
30
- actual |> should equal expected
36
+ decode rails msg |> should equal expected
31
37
 
32
38
  [<Fact(Skip = "Remove to run test")>]
33
39
  let ``Decode with five rails`` () =
34
- let actual = decode 5 "EIEXMSMESAORIWSCE"
40
+ let rails = 5
41
+ let msg = "EIEXMSMESAORIWSCE"
35
42
  let expected = "EXERCISMISAWESOME"
36
- actual |> should equal expected
43
+ decode rails msg |> should equal expected
37
44
 
38
45
  [<Fact(Skip = "Remove to run test")>]
39
46
  let ``Decode with six rails`` () =
40
- let actual = decode 6 "133714114238148966225439541018335470986172518171757571896261"
47
+ let rails = 6
48
+ let msg = "133714114238148966225439541018335470986172518171757571896261"
41
49
  let expected = "112358132134558914423337761098715972584418167651094617711286"
42
- actual |> should equal expected
50
+ decode rails msg |> should equal expected
51
+
@@ -204,11 +204,10 @@ type Exercise() =
204
204
 
205
205
  default this.RenderSutParameters canonicalDataCase =
206
206
  let sutParameterProperties = this.PropertiesUsedAsSutParameter canonicalDataCase
207
+ let renderSutParameter key = this.RenderSutParameter (canonicalDataCase, key, Map.find key canonicalDataCase.Properties)
207
208
 
208
- canonicalDataCase.Properties
209
- |> Map.filter (fun key value -> List.contains key sutParameterProperties)
210
- |> Map.fold (fun acc key value -> this.RenderSutParameter (canonicalDataCase, key, value) :: acc) []
211
- |> List.rev
209
+ sutParameterProperties
210
+ |> List.map renderSutParameter
212
211
 
213
212
  default this.RenderSutParameter (canonicalDataCase, key, value) =
214
213
  this.RenderValueOrIdentifier (canonicalDataCase, key, value)
@@ -117,6 +117,18 @@ type Gigasecond() =
117
117
 
118
118
  override this.AdditionalNamespaces = [typeof<DateTime>.Namespace]
119
119
 
120
+ type Grains() =
121
+ inherit Exercise()
122
+
123
+ override this.PropertiesWithIdentifier canonicalDataCase = ["expected"]
124
+
125
+ override this.IdentifierTypeAnnotation (canonicalDataCase, key, value) = Some "Result<uint64,string>"
126
+
127
+ override this.RenderExpected (canonicalDataCase, key, value) =
128
+ match string value with
129
+ | "-1" -> "Error \"Invalid input\""
130
+ | x -> sprintf "Ok %sUL" x
131
+
120
132
  type HelloWorld() =
121
133
  inherit Exercise()
122
134
 
@@ -167,9 +179,21 @@ type Minesweeper() =
167
179
  type Pangram() =
168
180
  inherit Exercise()
169
181
 
182
+ type PhoneNumber() =
183
+ inherit Exercise()
184
+
185
+ override this.RenderExpected (canonicalDataCase, key, value) =
186
+ value |> Option.ofObj |> formatValue |> backwardPipe
187
+
170
188
  type PigLatin() =
171
189
  inherit Exercise()
172
190
 
191
+ type PrimeFactors() =
192
+ inherit Exercise()
193
+
194
+ override this.RenderInput (canonicalDataCase, key, value) =
195
+ base.RenderInput (canonicalDataCase, key, value) |> sprintf "%sL"
196
+
173
197
  type QueenAttack() =
174
198
  inherit Exercise()
175
199
 
@@ -189,6 +213,13 @@ type QueenAttack() =
189
213
 
190
214
  override this.PropertiesWithIdentifier canonicalDataCase = ["white_queen"; "black_queen"]
191
215
 
216
+ type RailFenceCipher() =
217
+ inherit Exercise()
218
+
219
+ override this.PropertiesWithIdentifier canonicalDataCase = ["rails"; "msg"; "expected"]
220
+
221
+ override this.PropertiesUsedAsSutParameter canonicalDataCase = ["rails"; "msg"]
222
+
192
223
  type Raindrops() =
193
224
  inherit Exercise()
194
225