trackler 2.0.0.1 → 2.0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (226) hide show
  1. checksums.yaml +4 -4
  2. data/bin/bump-content +3 -1
  3. data/bin/verify-metadata +2 -2
  4. data/common/exercises/alphametics/canonical-data.json +19 -9
  5. data/common/exercises/food-chain/canonical-data.json +7 -1
  6. data/common/exercises/grains/canonical-data.json +66 -0
  7. data/common/exercises/raindrops/description.md +4 -5
  8. data/common/exercises/triangle/canonical-data.json +81 -54
  9. data/lib/trackler/version.rb +1 -1
  10. data/tracks/c/config.json +26 -19
  11. data/tracks/c/exercises/allergies/makefile +15 -0
  12. data/tracks/c/exercises/allergies/src/allergies.h +21 -0
  13. data/tracks/c/exercises/allergies/src/example.c +32 -0
  14. data/tracks/c/exercises/allergies/src/example.h +26 -0
  15. data/tracks/c/exercises/allergies/test/test_allergies.c +203 -0
  16. data/tracks/c/exercises/allergies/test/vendor/unity.c +1300 -0
  17. data/tracks/c/exercises/allergies/test/vendor/unity.h +274 -0
  18. data/tracks/c/exercises/allergies/test/vendor/unity_internals.h +701 -0
  19. data/tracks/c/exercises/atbash-cipher/makefile +16 -0
  20. data/tracks/c/exercises/atbash-cipher/src/example.c +71 -0
  21. data/tracks/c/exercises/atbash-cipher/src/example.h +7 -0
  22. data/tracks/c/exercises/atbash-cipher/test/test_atbash_cipher.c +113 -0
  23. data/tracks/c/exercises/atbash-cipher/test/vendor/unity.c +1300 -0
  24. data/tracks/c/exercises/atbash-cipher/test/vendor/unity.h +274 -0
  25. data/tracks/c/exercises/atbash-cipher/test/vendor/unity_internals.h +701 -0
  26. data/tracks/c/exercises/phone-number/makefile +16 -0
  27. data/tracks/c/exercises/phone-number/src/example.c +66 -0
  28. data/tracks/c/exercises/phone-number/src/example.h +8 -0
  29. data/tracks/c/exercises/phone-number/test/test_phone_number.c +108 -0
  30. data/tracks/c/exercises/phone-number/test/vendor/unity.c +1300 -0
  31. data/tracks/c/exercises/phone-number/test/vendor/unity.h +274 -0
  32. data/tracks/c/exercises/phone-number/test/vendor/unity_internals.h +701 -0
  33. data/tracks/csharp/config.json +8 -0
  34. data/tracks/csharp/exercises/bowling/BowlingTest.cs +188 -33
  35. data/tracks/csharp/exercises/bowling/Example.cs +38 -9
  36. data/tracks/csharp/exercises/rectangles/Example.cs +91 -0
  37. data/tracks/csharp/exercises/rectangles/RectanglesTest.cs +133 -0
  38. data/tracks/elisp/docs/INSTALLATION.org +1 -1
  39. data/tracks/elixir/config.json +8 -66
  40. data/tracks/elixir/docs/LEARNING.md +1 -1
  41. data/tracks/elixir/exercises/diamond/diamond_test.exs +12 -12
  42. data/tracks/elixir/exercises/grep/example.exs +92 -0
  43. data/tracks/elixir/exercises/grep/grep.exs +6 -0
  44. data/tracks/elixir/exercises/grep/grep_test.exs +259 -0
  45. data/tracks/elixir/exercises/markdown/markdown.exs +59 -2
  46. data/tracks/elixir/exercises/nucleotide-count/nucleotide_count_test.exs +4 -4
  47. data/tracks/elixir/exercises/phone-number/phone_number_test.exs +5 -0
  48. data/tracks/fsharp/exercises/bowling/BowlingTest.fs +158 -43
  49. data/tracks/fsharp/exercises/bowling/Example.fs +53 -24
  50. data/tracks/go/config.json +5 -0
  51. data/tracks/go/exercises/diamond/diamond_test.go +227 -0
  52. data/tracks/go/exercises/diamond/example.go +47 -0
  53. data/tracks/go/exercises/food-chain/example.go +1 -1
  54. data/tracks/go/exercises/food-chain/food_chain_test.go +30 -6
  55. data/tracks/go/exercises/nucleotide-count/example.go +21 -8
  56. data/tracks/go/exercises/nucleotide-count/nucleotide_count_test.go +45 -37
  57. data/tracks/haskell/exercises/anagram/test/Tests.hs +1 -11
  58. data/tracks/java/bin/journey-test.sh +165 -128
  59. data/tracks/java/docs/ABOUT.md +5 -8
  60. data/tracks/java/exercises/hello-world/build.gradle +0 -6
  61. data/tracks/java/exercises/hello-world/src/test/java/HelloWorldTest.java +0 -1
  62. data/tracks/java/exercises/meetup/build.gradle +0 -1
  63. data/tracks/java/exercises/meetup/src/example/java/Meetup.java +9 -7
  64. data/tracks/java/exercises/meetup/src/test/java/MeetupTest.java +185 -188
  65. data/tracks/lua/config.json +0 -73
  66. data/tracks/lua/exercises/bowling/bowling_spec.lua +92 -48
  67. data/tracks/lua/exercises/bowling/example.lua +4 -1
  68. data/tracks/objective-c/config.json +9 -30
  69. data/tracks/objective-c/exercises/pangram/PangramExample.h +7 -0
  70. data/tracks/objective-c/exercises/pangram/PangramExample.m +21 -0
  71. data/tracks/objective-c/exercises/pangram/PangramTest.m +51 -0
  72. data/tracks/objective-c/xcodeProject/ObjectiveC.xcodeproj/project.pbxproj +18 -0
  73. data/tracks/ocaml/README.md +46 -1
  74. data/tracks/ocaml/SETUP.md +21 -2
  75. data/tracks/ocaml/config.json +48 -78
  76. data/tracks/perl5/README.md +15 -8
  77. data/tracks/perl5/testall.pl +5 -5
  78. data/tracks/php/config.json +26 -34
  79. data/tracks/php/docs/ABOUT.md +15 -0
  80. data/tracks/php/exercises/allergies/allergies_test.php +121 -0
  81. data/tracks/php/exercises/allergies/example.php +64 -0
  82. data/tracks/php/exercises/etl/etl_test.php +52 -0
  83. data/tracks/php/exercises/etl/example.php +12 -0
  84. data/tracks/php/exercises/nucleotide-count/example.php +25 -0
  85. data/tracks/php/exercises/nucleotide-count/nucleotide-count_test.php +36 -0
  86. data/tracks/php/exercises/pig-latin/example.php +25 -29
  87. data/tracks/php/exercises/pig-latin/pig-latin_test.php +26 -19
  88. data/tracks/php/exercises/space-age/example.php +65 -0
  89. data/tracks/php/exercises/space-age/space-age_test.php +70 -0
  90. data/tracks/php/exercises/triangle/example.php +43 -0
  91. data/tracks/php/exercises/triangle/triangle_test.php +140 -0
  92. data/tracks/pony/exercises/anagram/example.pony +6 -6
  93. data/tracks/pony/exercises/anagram/test.pony +3 -4
  94. data/tracks/pony/exercises/bob/test.pony +23 -23
  95. data/tracks/pony/exercises/difference-of-squares/test.pony +11 -11
  96. data/tracks/pony/exercises/hamming/example.pony +3 -3
  97. data/tracks/pony/exercises/hamming/test.pony +16 -16
  98. data/tracks/pony/exercises/hello-world/test.pony +5 -4
  99. data/tracks/pony/exercises/leap/test.pony +8 -8
  100. data/tracks/python/config.json +18 -0
  101. data/tracks/python/exercises/diamond/diamond_test.py +33 -0
  102. data/tracks/python/exercises/diamond/example.py +15 -0
  103. data/tracks/python/exercises/linked-list/example.py +47 -0
  104. data/tracks/python/exercises/linked-list/linked_list.py +13 -0
  105. data/tracks/python/exercises/linked-list/linked_list_test.py +49 -0
  106. data/tracks/python/exercises/list-ops/example.py +55 -0
  107. data/tracks/python/exercises/list-ops/list_ops.py +38 -0
  108. data/tracks/python/exercises/list-ops/list_ops_test.py +136 -0
  109. data/tracks/ruby/bin/generate +22 -2
  110. data/tracks/ruby/config.json +12 -83
  111. data/tracks/ruby/exercises/allergies/allergies_test.rb +0 -1
  112. data/tracks/ruby/exercises/atbash-cipher/atbash_cipher_test.rb +0 -1
  113. data/tracks/ruby/exercises/beer-song/beer_song_test.rb +1 -2
  114. data/tracks/ruby/exercises/binary/example.rb +0 -1
  115. data/tracks/ruby/exercises/binary-search-tree/binary_search_tree_test.rb +1 -1
  116. data/tracks/ruby/exercises/bowling/.version +1 -0
  117. data/tracks/ruby/exercises/bowling/bowling_test.rb +109 -133
  118. data/tracks/ruby/exercises/bowling/example.rb +7 -7
  119. data/tracks/ruby/exercises/bowling/example.tt +27 -0
  120. data/tracks/ruby/exercises/circular-buffer/circular_buffer_test.rb +0 -2
  121. data/tracks/ruby/exercises/clock/example.rb +0 -2
  122. data/tracks/ruby/exercises/connect/connect_test.rb +0 -1
  123. data/tracks/ruby/exercises/custom-set/custom_set_test.rb +0 -1
  124. data/tracks/ruby/exercises/diamond/diamond_test.rb +0 -1
  125. data/tracks/ruby/exercises/etl/etl_test.rb +1 -1
  126. data/tracks/ruby/exercises/house/house_test.rb +0 -1
  127. data/tracks/ruby/exercises/isogram/isogram_test.rb +2 -2
  128. data/tracks/ruby/exercises/largest-series-product/example.tt +0 -3
  129. data/tracks/ruby/exercises/largest-series-product/largest_series_product_test.rb +0 -4
  130. data/tracks/ruby/exercises/linked-list/linked_list_test.rb +1 -1
  131. data/tracks/ruby/exercises/meetup/meetup_test.rb +0 -1
  132. data/tracks/ruby/exercises/nth-prime/example.tt +0 -2
  133. data/tracks/ruby/exercises/nth-prime/nth_prime_test.rb +0 -2
  134. data/tracks/ruby/exercises/ocr-numbers/ocr_numbers_test.rb +1 -2
  135. data/tracks/ruby/exercises/protein-translation/protein_translation_test.rb +0 -1
  136. data/tracks/ruby/exercises/proverb/proverb_test.rb +1 -3
  137. data/tracks/ruby/exercises/queen-attack/example.rb +3 -1
  138. data/tracks/ruby/exercises/queen-attack/queen_attack_test.rb +34 -8
  139. data/tracks/ruby/exercises/robot-simulator/robot_simulator_test.rb +1 -1
  140. data/tracks/ruby/exercises/strain/strain_test.rb +2 -2
  141. data/tracks/ruby/exercises/tournament/.version +1 -0
  142. data/tracks/ruby/exercises/tournament/example.rb +54 -0
  143. data/tracks/ruby/exercises/tournament/example.tt +23 -0
  144. data/tracks/ruby/exercises/tournament/tournament_test.rb +92 -0
  145. data/tracks/ruby/exercises/transpose/.version +1 -0
  146. data/tracks/ruby/exercises/transpose/example.rb +14 -0
  147. data/tracks/ruby/exercises/transpose/example.tt +22 -0
  148. data/tracks/ruby/exercises/transpose/transpose_test.rb +303 -0
  149. data/tracks/ruby/lib/bowling_cases.rb +46 -0
  150. data/tracks/ruby/lib/isogram_cases.rb +1 -1
  151. data/tracks/ruby/lib/tournament_cases.rb +45 -0
  152. data/tracks/ruby/lib/transpose_cases.rb +45 -0
  153. data/tracks/rust/config.json +2 -0
  154. data/tracks/rust/exercises/bowling/.gitignore +7 -0
  155. data/tracks/rust/exercises/bowling/Cargo.toml +3 -0
  156. data/tracks/rust/exercises/bowling/example.rs +134 -0
  157. data/tracks/rust/exercises/bowling/tests/bowling.rs +373 -0
  158. data/tracks/rust/exercises/grains/.gitignore +7 -0
  159. data/tracks/rust/exercises/grains/Cargo.toml +3 -0
  160. data/tracks/rust/exercises/grains/example.rs +11 -0
  161. data/tracks/rust/exercises/grains/src/lib.rs +7 -0
  162. data/tracks/rust/exercises/grains/tests/grains.rs +63 -0
  163. data/tracks/rust/problems.md +2 -0
  164. data/tracks/scala/README.md +38 -0
  165. data/tracks/scala/config.json +20 -74
  166. data/tracks/scala/exercises/accumulate/src/test/scala/accumulate_test.scala +4 -0
  167. data/tracks/scala/exercises/allergies/src/test/scala/allergies_test.scala +11 -0
  168. data/tracks/scala/exercises/alphametics/build.sbt +6 -0
  169. data/tracks/scala/exercises/alphametics/example.scala +125 -0
  170. data/tracks/scala/exercises/alphametics/src/main/scala/.keep +0 -0
  171. data/tracks/scala/exercises/alphametics/src/test/scala/AlphameticsTest.scala +62 -0
  172. data/tracks/scala/exercises/atbash-cipher/src/test/scala/atbash_test.scala +8 -0
  173. data/tracks/scala/exercises/bank-account/src/test/scala/BankAccountTest.scala +4 -0
  174. data/tracks/scala/exercises/binary/src/test/scala/binary_test.scala +13 -0
  175. data/tracks/scala/exercises/binary-search-tree/src/test/scala/BstTest.scala +11 -0
  176. data/tracks/scala/exercises/bowling/Example.scala +116 -0
  177. data/tracks/scala/exercises/bowling/build.sbt +3 -0
  178. data/tracks/scala/exercises/bowling/src/main/scala/Bowling.scala +11 -0
  179. data/tracks/scala/exercises/bowling/src/test/scala/BowlingSuite.scala +237 -0
  180. data/tracks/scala/exercises/clock/src/test/scala/ClockTest.scala +50 -0
  181. data/tracks/scala/exercises/connect/README.md +17 -0
  182. data/tracks/scala/exercises/connect/src/test/scala/ConnectTest.scala +7 -0
  183. data/tracks/scala/exercises/crypto-square/src/test/scala/{CrytpoSquareTest.scala → CryptoSquareTest.scala} +9 -0
  184. data/tracks/scala/exercises/custom-set/src/test/scala/CustomSetTest.scala +36 -0
  185. data/tracks/scala/exercises/difference-of-squares/src/test/scala/squares_test.scala +8 -0
  186. data/tracks/scala/exercises/forth/src/test/scala/ForthTest.scala +22 -0
  187. data/tracks/scala/exercises/hexadecimal/src/test/scala/HexadecimalTest.scala +8 -0
  188. data/tracks/scala/exercises/kindergarten-garden/src/test/scala/GardenTest.scala +5 -0
  189. data/tracks/scala/exercises/largest-series-product/src/test/scala/SeriesTest.scala +2 -0
  190. data/tracks/scala/exercises/linked-list/src/test/scala/DequeTest.scala +4 -0
  191. data/tracks/scala/exercises/luhn/src/test/scala/LuhnTest.scala +4 -0
  192. data/tracks/scala/exercises/matrix/src/test/scala/MatrixTest.scala +2 -0
  193. data/tracks/scala/exercises/minesweeper/src/test/scala/MinesweeperTest.scala +6 -0
  194. data/tracks/scala/exercises/nth-prime/src/test/scala/PrimeTest.scala +5 -0
  195. data/tracks/scala/exercises/ocr-numbers/src/test/scala/OcrTest.scala +15 -0
  196. data/tracks/scala/exercises/octal/src/test/scala/OctalTest.scala +7 -0
  197. data/tracks/scala/exercises/parallel-letter-frequency/src/test/scala/FrequencyTest.scala +8 -0
  198. data/tracks/scala/exercises/pascals-triangle/src/test/scala/PascalsTriangleTest.scala +5 -0
  199. data/tracks/scala/exercises/pig-latin/src/test/scala/PigLatinTest.scala +4 -0
  200. data/tracks/scala/exercises/pythagorean-triplet/src/test/scala/PythagoreanTripletTest.scala +3 -0
  201. data/tracks/scala/exercises/queen-attack/src/test/scala/QueensTest.scala +5 -0
  202. data/tracks/scala/exercises/robot-simulator/src/test/scala/RobotTest.scala +16 -8
  203. data/tracks/scala/exercises/say/src/test/scala/SayTest.scala +34 -17
  204. data/tracks/scala/exercises/scrabble-score/src/test/scala/scrabble_score_test.scala +6 -0
  205. data/tracks/scala/exercises/secret-handshake/src/test/scala/SecretHandshakeTest.scala +18 -9
  206. data/tracks/scala/exercises/series/src/test/scala/SeriesTest.scala +4 -2
  207. data/tracks/scala/exercises/sieve/src/test/scala/SieveTest.scala +8 -4
  208. data/tracks/scala/exercises/simple-cipher/src/test/scala/CipherTest.scala +17 -9
  209. data/tracks/scala/exercises/sublist/src/test/scala/sublist_test.scala +17 -0
  210. data/tracks/scala/exercises/trinary/src/test/scala/TrinaryTest.scala +14 -7
  211. data/tracks/scala/exercises/wordy/src/test/scala/WordProblemTest.scala +28 -14
  212. data/tracks/scala/project/Build.scala +3 -3
  213. data/tracks/scala/testgen/src/main/scala/BowlingTestGenerator.scala +57 -0
  214. data/tracks/sml/config.json +41 -6
  215. data/tracks/sml/exercises/flatten-array/example.sml +6 -0
  216. data/tracks/sml/exercises/flatten-array/test_flatten_array.sml +10 -0
  217. data/tracks/sml/exercises/nth-prime/example.sml +46 -0
  218. data/tracks/sml/exercises/nth-prime/test_nth_prime.sml +14 -0
  219. data/tracks/sml/exercises/raindrops/example.sml +9 -0
  220. data/tracks/sml/exercises/raindrops/raindrops.sml +2 -0
  221. data/tracks/sml/exercises/raindrops/test_raindrops.sml +95 -0
  222. data/tracks/swift/config.json +269 -328
  223. data/tracks/swift/exercises/pangram/PangramExample.swift +17 -0
  224. data/tracks/swift/exercises/pangram/PangramTest.swift +43 -0
  225. data/tracks/swift/xcodeProject/xSwift.xcodeproj/project.pbxproj +16 -0
  226. metadata +95 -3
@@ -5,11 +5,13 @@ class SieveTest extends FunSuite with Matchers {
5
5
  Sieve.primesUpTo(10) should be (List(2, 3, 5, 7))
6
6
  }
7
7
 
8
- test("primes up to 11") {
8
+ test("primes up to 11") {
9
+ pending
9
10
  Sieve.primesUpTo(11) should be (List(2, 3, 5, 7, 11))
10
11
  }
11
12
 
12
- test("primes up to 1000") {
13
+ test("primes up to 1000") {
14
+ pending
13
15
  Sieve.primesUpTo(1000) should be (List(
14
16
  2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
15
17
  73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151,
@@ -24,11 +26,13 @@ class SieveTest extends FunSuite with Matchers {
24
26
  919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997))
25
27
  }
26
28
 
27
- test("first thousand primes") {
29
+ test("first thousand primes") {
30
+ pending
28
31
  Sieve.primesUpTo(7919).size should be (1000)
29
32
  }
30
33
 
31
- test("edge cases") {
34
+ test("edge cases") {
35
+ pending
32
36
  Sieve.primesUpTo(1) should be (List())
33
37
  Sieve.primesUpTo(2) should be (List(2))
34
38
  }
@@ -12,43 +12,51 @@ class CipherTest extends FunSuite with Matchers {
12
12
  cipher.decode(cipher.key.substring(0, 10)) should be ("aaaaaaaaaa")
13
13
  }
14
14
 
15
- test("Invalid key - contains caps") {
16
- intercept[IllegalArgumentException] {
15
+ test("Invalid key - contains caps") {
16
+ pending
17
+ intercept[IllegalArgumentException] {
17
18
  Cipher(Some("ABCD"))
18
19
  }
19
20
  }
20
21
 
21
- test("Invalid key - contains numerics") {
22
+ test("Invalid key - contains numerics") {
23
+ pending
22
24
  intercept[IllegalArgumentException] {
23
25
  Cipher(Some("123"))
24
26
  }
25
27
  }
26
28
 
27
- test("Invalid key - is empty") {
29
+ test("Invalid key - is empty") {
30
+ pending
28
31
  intercept[IllegalArgumentException] {
29
32
  Cipher(Some(""))
30
33
  }
31
34
  }
32
35
 
33
- test("Substitution cipher - can encode") {
36
+ test("Substitution cipher - can encode") {
37
+ pending
34
38
  Cipher(Some("abcdefghij")).encode("aaaaaaaaaa") should be ("abcdefghij")
35
39
  }
36
40
 
37
- test("Substitution cipher - can decode") {
41
+ test("Substitution cipher - can decode") {
42
+ pending
38
43
  Cipher(Some("abcdefghij")).decode("abcdefghij") should be ("aaaaaaaaaa")
39
44
  }
40
45
 
41
- test("Substitution cipher - is reversible") {
46
+ test("Substitution cipher - is reversible") {
47
+ pending
42
48
  val cipher = Cipher(Some("abcdefghij"))
43
49
  cipher.decode(cipher.encode("abcdefghij")) should be ("abcdefghij")
44
50
  }
45
51
 
46
- test("Substitution cipher - can double shift") {
52
+ test("Substitution cipher - can double shift") {
53
+ pending
47
54
  val cipher = Cipher(Some("iamapandabear"))
48
55
  cipher.encode("iamapandabear") should be ("qayaeaagaciai")
49
56
  }
50
57
 
51
- test("Substitution cipher - can wrap") {
58
+ test("Substitution cipher - can wrap") {
59
+ pending
52
60
  Cipher(Some("abcdefghij")).encode("zzzzzzzzzz") should be ("zabcdefghi")
53
61
  }
54
62
  }
@@ -6,75 +6,92 @@ class SublistSpecs extends FunSuite with Matchers {
6
6
  }
7
7
 
8
8
  test("empty is a sublist of anything") {
9
+ pending
9
10
  Sublist.sublist(List(), List('a', 's', 'd', 'f')) should be (Sublist.Sublist)
10
11
  }
11
12
 
12
13
  test("anything is a superlist of empty") {
14
+ pending
13
15
  Sublist.sublist(List('a', 's', 'd', 'f'), List()) should be (Sublist.Superlist)
14
16
  }
15
17
 
16
18
  test("List(1) is not List(2)") {
19
+ pending
17
20
  Sublist.sublist(List(1), List(2)) should be (Sublist.Unequal)
18
21
  }
19
22
 
20
23
  test("compare larger equal lists") {
24
+ pending
21
25
  val xs = List.fill(1000)("x")
22
26
  Sublist.sublist(xs, xs) should be (Sublist.Equal)
23
27
  }
24
28
 
25
29
  test("sublist at start") {
30
+ pending
26
31
  Sublist.sublist(List(1, 2, 3), List(1, 2, 3, 4, 5)) should be (Sublist.Sublist)
27
32
  }
28
33
 
29
34
  test("sublist in middle") {
35
+ pending
30
36
  Sublist.sublist(List(4, 3, 2), List(5, 4, 3, 2, 1)) should be (Sublist.Sublist)
31
37
  }
32
38
 
33
39
  test("sublist at end") {
40
+ pending
34
41
  Sublist.sublist(List(3, 4, 5), List(1, 2, 3, 4, 5)) should be (Sublist.Sublist)
35
42
  }
36
43
 
37
44
  test("partially matching sublist at start") {
45
+ pending
38
46
  Sublist.sublist(List(1, 1, 2), List(1, 1, 1, 2)) should be (Sublist.Sublist)
39
47
  }
40
48
 
41
49
  test("sublist early in huge list") {
50
+ pending
42
51
  val xs = List.range(1, 1000000)
43
52
  Sublist.sublist(List(3, 4, 5), xs) should be (Sublist.Sublist)
44
53
  }
45
54
 
46
55
  test("huge sublist not in huge list") {
56
+ pending
47
57
  val l1 = List.range(10, 1000001)
48
58
  val l2 = List.range(1, 1000000)
49
59
  Sublist.sublist(l1, l2) should be (Sublist.Unequal)
50
60
  }
51
61
 
52
62
  test("superlist at start") {
63
+ pending
53
64
  Sublist.sublist(List(1, 2, 3, 4, 5), List(1, 2, 3)) should be (Sublist.Superlist)
54
65
  }
55
66
 
56
67
  test("superlist in middle") {
68
+ pending
57
69
  Sublist.sublist(List(5, 4, 3, 2, 1), List(4, 3, 2)) should be (Sublist.Superlist)
58
70
  }
59
71
 
60
72
  test("superlist at end") {
73
+ pending
61
74
  Sublist.sublist(List(1, 2, 3, 4, 5), List(3, 4, 5)) should be (Sublist.Superlist)
62
75
  }
63
76
 
64
77
  test("partially matching superlist at start") {
78
+ pending
65
79
  Sublist.sublist(List(1, 1, 1, 2), List(1, 1, 2)) should be (Sublist.Superlist)
66
80
  }
67
81
 
68
82
  test("superlist early in huge list") {
83
+ pending
69
84
  val l1 = List.range(1, 1000000)
70
85
  Sublist.sublist(l1, List(3, 4, 5)) should be (Sublist.Superlist)
71
86
  }
72
87
 
73
88
  test("recurring values sublist") {
89
+ pending
74
90
  Sublist.sublist(List(1, 2, 1, 2, 3), List(1, 2, 3, 1, 2, 1, 2, 3, 2, 1)) should be (Sublist.Sublist)
75
91
  }
76
92
 
77
93
  test("recurring values unequal") {
94
+ pending
78
95
  Sublist.sublist(List(1, 2, 1, 2, 3), List(1, 2, 3, 1, 2, 3, 2, 3, 2, 1)) should be (Sublist.Unequal)
79
96
  }
80
97
  }
@@ -7,7 +7,8 @@ class TrinaryTest extends FlatSpec with Matchers {
7
7
  }
8
8
  }
9
9
 
10
- it should "invalid trinary should error" in {
10
+ it should "invalid trinary should error" in {
11
+ pending
11
12
  intercept[IllegalArgumentException] {
12
13
  Trinary.trinaryToInt("1239")
13
14
  }
@@ -21,33 +22,39 @@ class TrinaryTest extends FlatSpec with Matchers {
21
22
  }
22
23
  }
23
24
 
24
- it should "handle zeros" in {
25
+ it should "handle zeros" in {
26
+ pending
25
27
  Trinary.trinaryToInt("0") should equal(0)
26
28
  Trinary.trinaryToInt("00000000") should equal(0)
27
29
  }
28
30
 
29
- it should "handle single digit" in {
31
+ it should "handle single digit" in {
32
+ pending
30
33
  Trinary.trinaryToInt("2") should equal(2)
31
34
  }
32
35
 
33
- it should "handle multiple digits" in {
36
+ it should "handle multiple digits" in {
37
+ pending
34
38
  Trinary.trinaryToInt("10") should equal(3)
35
39
  Trinary.trinaryToInt("12") should equal(5)
36
40
  Trinary.trinaryToInt("222") should equal(26)
37
41
  Trinary.trinaryToInt("1122000120") should equal(32091)
38
42
  }
39
43
 
40
- it should "handle Int 0" in {
44
+ it should "handle Int 0" in {
45
+ pending
41
46
  Trinary.intToTrinary(0) should equal("0")
42
47
  }
43
48
 
44
- it should "handle Int to multi digit trinary" in {
49
+ it should "handle Int to multi digit trinary" in {
50
+ pending
45
51
  Trinary.intToTrinary(4) should equal("11")
46
52
  Trinary.intToTrinary(26) should equal("222")
47
53
  Trinary.intToTrinary(32091) should equal("1122000120")
48
54
  }
49
55
 
50
- it should "handle Int to trinary with trailing zeros" in {
56
+ it should "handle Int to trinary with trailing zeros" in {
57
+ pending
51
58
  Trinary.intToTrinary(3) should equal("10")
52
59
  }
53
60
  }
@@ -6,62 +6,76 @@ class WordProblemTest extends FlatSpec with Matchers {
6
6
  WordProblem("What is 1 plus 1?") should equal(Some(2))
7
7
  }
8
8
 
9
- it should "handle addition with negative numbers" in {
9
+ it should "handle addition with negative numbers" in {
10
+ pending
10
11
  WordProblem("What is -1 plus -10?") should equal(Some(-11))
11
12
  }
12
13
 
13
- it should "handle repeated addition" in {
14
+ it should "handle repeated addition" in {
15
+ pending
14
16
  WordProblem("What is 1 plus 1 plus 1?") should equal(Some(3))
15
17
  }
16
18
 
17
- it should "handle simple subtraction" in {
19
+ it should "handle simple subtraction" in {
20
+ pending
18
21
  WordProblem("What is 1 minus 1?") should equal(Some(0))
19
22
  }
20
23
 
21
- it should "handle subtraction with negative numbers" in {
24
+ it should "handle subtraction with negative numbers" in {
25
+ pending
22
26
  WordProblem("What is 4 minus -12?") should equal(Some(16))
23
27
  }
24
28
 
25
- it should "handle repeated subtraction" in {
29
+ it should "handle repeated subtraction" in {
30
+ pending
26
31
  WordProblem("What is 20 minus 4 minus 13?") should equal(Some(3))
27
32
  }
28
33
 
29
- it should "handle simple multiplication" in {
34
+ it should "handle simple multiplication" in {
35
+ pending
30
36
  WordProblem("What is 10 multiplied by 10?") should equal(Some(100))
31
37
  }
32
38
 
33
- it should "handle multiplication with negative numbers" in {
39
+ it should "handle multiplication with negative numbers" in {
40
+ pending
34
41
  WordProblem("What is -10 multiplied by -10?") should equal(Some(100))
35
42
  }
36
43
 
37
- it should "handle repeated multiplication" in {
44
+ it should "handle repeated multiplication" in {
45
+ pending
38
46
  WordProblem("What is 2 multiplied by -2 multiplied by 3?") should equal(Some(-12))
39
47
  }
40
48
 
41
- it should "handle simple division" in {
49
+ it should "handle simple division" in {
50
+ pending
42
51
  WordProblem("What is 10 divided by 10?") should equal(Some(1))
43
52
  }
44
53
 
45
- it should "handle division with negative numbers" in {
54
+ it should "handle division with negative numbers" in {
55
+ pending
46
56
  WordProblem("What is 33 divided by -3?") should equal(Some(-11))
47
57
  }
48
58
 
49
- it should "handle repeated division" in {
59
+ it should "handle repeated division" in {
60
+ pending
50
61
  WordProblem("What is -12 divided by 2 divided by -3?") should equal(Some(2))
51
62
  }
52
63
 
53
- it should "handle mixed operations" in {
64
+ it should "handle mixed operations" in {
65
+ pending
54
66
  WordProblem("What is 1 plus 5 minus -2?") should equal(Some(8))
55
67
  WordProblem("What is 17 minus 6 plus 3?") should equal(Some(14))
56
68
  WordProblem("What is -3 plus 7 multiplied by -2?") should equal(Some(-8))
57
69
  }
58
70
 
59
- it should "handle invalid word problem" in {
71
+ it should "handle invalid word problem" in {
72
+ pending
60
73
  WordProblem("What is 1 plus 5 minus -2?") should equal(Some(8))
61
74
  }
62
75
 
63
76
  // Test for "Extension"
64
- ignore should "handle powers" in {
77
+ ignore should "handle powers" in {
78
+ pending
65
79
  WordProblem("What is 2 raised to the 5?") should equal(Some(32))
66
80
  }
67
81
  }
@@ -44,11 +44,11 @@ object XScalaBuild extends Build {
44
44
  throw new IllegalArgumentException(s"Could not parse $configJsonFile as JSON")
45
45
  }
46
46
  configObj
47
- .get("problems")
47
+ .get("exercises")
48
48
  .map(_.asInstanceOf[JSONArray].list)
49
49
  .getOrElse {
50
- throw new IllegalArgumentException(s"Could not find array 'problems' in $configJsonFile")
50
+ throw new IllegalArgumentException(s"Could not find array 'exercises' in $configJsonFile")
51
51
  }
52
- .collect { case problem: String => problem }
52
+ .collect { case problem: JSONObject => problem.obj("slug").toString }
53
53
  }
54
54
  }
@@ -0,0 +1,57 @@
1
+ import play.api.libs.json.Json
2
+
3
+ import scala.io.Source
4
+
5
+ class BowlingTestGenerator {
6
+ implicit val testCaseReader = Json.reads[BowlingTestCase]
7
+
8
+ private val filename = "bowling.json"
9
+ private val fileContents = Source.fromFile(filename).getLines.mkString
10
+ private val json = Json.parse(fileContents)
11
+
12
+ def write {
13
+ print("import org.scalatest.{FunSuite, Matchers}" + System.lineSeparator())
14
+ print(System.lineSeparator())
15
+ print("class BowlingSuite extends FunSuite with Matchers {" + System.lineSeparator())
16
+
17
+ writeTestCases()
18
+
19
+ print("}" + System.lineSeparator())
20
+ }
21
+
22
+ private def writeTestCases(): Unit = {
23
+ println("// " + (json \ "score" \ "description").get.as[List[String]].mkString(" "))
24
+
25
+ val testCases = (json \ "score" \ "cases").get.as[List[BowlingTestCase]]
26
+
27
+ testCases.foreach(tc => {
28
+ print("\ttest(\"" + tc.description + "\") {" + System.lineSeparator())
29
+ println("pending")
30
+ print("val score = List(")
31
+ print(tc.rolls.map(roll => roll.toString).mkString(", "))
32
+ println(").foldLeft(Bowling())((acc, roll) => acc.roll(roll)).score()")
33
+
34
+ println("score match {")
35
+ if (tc.expected == -1) {
36
+ println("case Right(_) => fail(\"Unexpected score returned. Failure expected\")")
37
+ println("case Left(_) => ")
38
+ } else {
39
+ println("case Right(n) => assert(n == " + tc.expected.toString + ")")
40
+ println("case Left(_) => fail(\"" + tc.description + "\")")
41
+ }
42
+ println("}")
43
+ print("\t}" + System.lineSeparator())
44
+ print(System.lineSeparator())
45
+ })
46
+ }
47
+ }
48
+
49
+ case class BowlingTestCase(description: String,
50
+ rolls: List[Int],
51
+ expected: Int)
52
+
53
+ object BowlingTestGenerator {
54
+ def main(args: Array[String]): Unit = {
55
+ new BowlingTestGenerator().write
56
+ }
57
+ }
@@ -5,12 +5,47 @@
5
5
  "checklist_issue": 8,
6
6
  "active": false,
7
7
  "test_pattern": "^test_*.sml$",
8
- "problems": [
9
- "accumulate",
10
- "allergies",
11
- "anagram",
12
- "binary",
13
- "hamming"
8
+ "exercises": [
9
+ {
10
+ "slug": "accumulate",
11
+ "difficulty": 1,
12
+ "topics": []
13
+ },
14
+ {
15
+ "slug": "allergies",
16
+ "difficulty": 1,
17
+ "topics": []
18
+ },
19
+ {
20
+ "slug": "anagram",
21
+ "difficulty": 1,
22
+ "topics": []
23
+ },
24
+ {
25
+ "slug": "binary",
26
+ "difficulty": 1,
27
+ "topics": []
28
+ },
29
+ {
30
+ "slug": "flatten-array",
31
+ "difficulty": 1,
32
+ "topics": []
33
+ },
34
+ {
35
+ "slug": "hamming",
36
+ "difficulty": 1,
37
+ "topics": []
38
+ },
39
+ {
40
+ "slug": "raindrops",
41
+ "difficulty": 1,
42
+ "topics": []
43
+ },
44
+ {
45
+ "slug": "nth-prime",
46
+ "difficulty": 1,
47
+ "topics": []
48
+ }
14
49
  ],
15
50
  "deprecated": [
16
51
 
@@ -0,0 +1,6 @@
1
+ datatype 'a nestedList =
2
+ Leaf of 'a (* leaf *)
3
+ | Node of 'a nestedList list (* node *)
4
+
5
+ fun flatten (Leaf x) = [x]
6
+ | flatten (Node xs) = List.concat (map flatten xs)
@@ -0,0 +1,10 @@
1
+ use "example.sml";
2
+ val test_cases = [
3
+ ((Node [Leaf 1, Node [Leaf 2, Node [], Leaf 3, Node [Leaf 4, Leaf 5]]]), [1,2,3,4,5])
4
+ ];
5
+
6
+ fun run_tests [] = []
7
+ | run_tests ((input,expected)::ts) =
8
+ (flatten input = expected) :: run_tests ts
9
+
10
+ val allTestsPass = List.foldl (fn (x,y) => x andalso y) true (run_tests test_cases);
@@ -0,0 +1,46 @@
1
+ exception EmptyList
2
+ datatype 'a lazylist = Nil | Cons of ('a * (unit -> 'a lazylist));
3
+ fun next s = let
4
+ fun next' Nil = raise EmptyList
5
+ | next' (Cons(a,f)) = f()
6
+ in
7
+ next' s
8
+ end ;
9
+
10
+ fun hd s = let
11
+ fun hd' Nil = raise EmptyList
12
+ | hd' (Cons(a, _)) = a
13
+ in
14
+ hd' s
15
+ end ;
16
+
17
+ fun allPrimes n = let
18
+ fun isPrime n = let
19
+ fun factors n = let
20
+ fun factors' 0 acc = acc
21
+ | factors' c acc = if (n mod c) = 0
22
+ then factors' (c-1) (c :: acc)
23
+ else factors' (c-1) acc
24
+ in
25
+ factors' (n div 2) []
26
+ end
27
+ in
28
+ (List.length (factors n)) = 1
29
+ end
30
+
31
+ fun nextPrime n = let
32
+ val nextN = if (n mod 2) = 0 then n + 1 else n + 2
33
+ in
34
+ if isPrime nextN then nextN else nextPrime nextN
35
+ end
36
+
37
+ in
38
+ Cons(n, fn () => (allPrimes (nextPrime n)))
39
+ end ;
40
+
41
+ fun nthPrime n = let
42
+ fun nthPrime' 0 s = hd s
43
+ | nthPrime' n s = nthPrime' (n-1) (next s)
44
+ in
45
+ nthPrime' (n-1) (allPrimes 2)
46
+ end ;
@@ -0,0 +1,14 @@
1
+ use "example.sml";
2
+
3
+ val test_cases = [
4
+ (1, 2),
5
+ (2, 3),
6
+ (9, 23),
7
+ (100, 541)
8
+ ];
9
+
10
+ fun run_tests [] = []
11
+ | run_tests ((n, expected)::ts) =
12
+ (nthPrime n = expected) :: run_tests ts
13
+
14
+ val allTestsPass = List.foldl (fn (x,y) => x andalso y) true (run_tests test_cases);
@@ -0,0 +1,9 @@
1
+ fun convert (n: int): string =
2
+ let
3
+ fun f m s = if n mod m = 0 then s else ""
4
+ val sound = String.concat [f 3 "Pling", f 5 "Plang", f 7 "Plong"]
5
+ in
6
+ if sound = ""
7
+ then Int.toString n
8
+ else sound
9
+ end
@@ -0,0 +1,2 @@
1
+ fun convert (n: int): string =
2
+ raise Fail "'convert' is not implemented"
@@ -0,0 +1,95 @@
1
+ use "example.sml";
2
+
3
+ val test_cases = [
4
+ {
5
+ number = 1,
6
+ expected = "1"
7
+ },
8
+ {
9
+ number = 3,
10
+ expected = "Pling"
11
+ },
12
+ {
13
+ number = 5,
14
+ expected = "Plang"
15
+ },
16
+ {
17
+ number = 7,
18
+ expected = "Plong"
19
+ },
20
+ {
21
+ number = 6,
22
+ expected = "Pling"
23
+ },
24
+ {
25
+ number = 8,
26
+ expected = "8"
27
+ },
28
+ {
29
+ number = 9,
30
+ expected = "Pling"
31
+ },
32
+ {
33
+ number = 10,
34
+ expected = "Plang"
35
+ },
36
+ {
37
+ number = 14,
38
+ expected = "Plong"
39
+ },
40
+ {
41
+ number = 15,
42
+ expected = "PlingPlang"
43
+ },
44
+ {
45
+ number = 21,
46
+ expected = "PlingPlong"
47
+ },
48
+ {
49
+ number = 25,
50
+ expected = "Plang"
51
+ },
52
+ {
53
+ number = 27,
54
+ expected = "Pling"
55
+ },
56
+ {
57
+ number = 35,
58
+ expected = "PlangPlong"
59
+ },
60
+ {
61
+ number = 49,
62
+ expected = "Plong"
63
+ },
64
+ {
65
+ number = 52,
66
+ expected = "52"
67
+ },
68
+ {
69
+ number = 105,
70
+ expected = "PlingPlangPlong"
71
+ },
72
+ {
73
+ number = 3125,
74
+ expected = "Plang"
75
+ }
76
+ ]
77
+
78
+ fun run_tests _ [] = []
79
+ | run_tests f (x :: xs) =
80
+ let
81
+ fun aux { number, expected } =
82
+ let
83
+ val output = f number
84
+ val is_correct = output = expected
85
+ val expl =
86
+ "convert " ^ (Int.toString number) ^ ": " ^
87
+ (if not is_correct then "FAILED" else "PASSED") ^ "\n"
88
+ in
89
+ (print (expl); is_correct)
90
+ end
91
+ in
92
+ (aux x) :: run_tests f xs
93
+ end
94
+
95
+ val allTestsPass = List.all (fn x => x) (run_tests convert test_cases)