trackler 2.2.1.85 → 2.2.1.86

Sign up to get free protection for your applications and to get access to all the features.
Files changed (220) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/alphametics/canonical-data.json +29 -11
  4. data/problem-specifications/exercises/binary-search-tree/canonical-data.json +177 -0
  5. data/problem-specifications/package.json +2 -2
  6. data/problem-specifications/yarn.lock +61 -51
  7. data/tracks/bash/CONTRIBUTING.md +10 -6
  8. data/tracks/bash/README.md +1 -0
  9. data/tracks/bash/exercises/acronym/README.md +1 -1
  10. data/tracks/bash/exercises/anagram/README.md +1 -1
  11. data/tracks/bash/exercises/anagram/{anagram_tests.sh → anagram_test.sh} +0 -0
  12. data/tracks/bash/exercises/armstrong-numbers/armstrong_numbers_test.sh +25 -17
  13. data/tracks/bash/exercises/armstrong-numbers/example.sh +18 -12
  14. data/tracks/bash/exercises/atbash-cipher/README.md +1 -1
  15. data/tracks/bash/exercises/atbash-cipher/{atbash_cipher_tests.sh → atbash_cipher_test.sh} +0 -0
  16. data/tracks/bash/exercises/difference-of-squares/README.md +1 -1
  17. data/tracks/bash/exercises/gigasecond/README.md +1 -1
  18. data/tracks/bash/exercises/hamming/README.md +1 -1
  19. data/tracks/bash/exercises/hello-world/README.md +1 -1
  20. data/tracks/bash/exercises/leap/README.md +1 -1
  21. data/tracks/bash/exercises/luhn/README.md +1 -1
  22. data/tracks/bash/exercises/nucleotide-count/README.md +1 -1
  23. data/tracks/bash/exercises/pangram/README.md +1 -1
  24. data/tracks/bash/exercises/pangram/{pangram_tests.sh → pangram_test.sh} +0 -0
  25. data/tracks/bash/exercises/phone-number/README.md +1 -1
  26. data/tracks/bash/exercises/phone-number/{phone_number_tests.sh → phone_number_test.sh} +0 -0
  27. data/tracks/bash/exercises/raindrops/README.md +1 -1
  28. data/tracks/bash/exercises/rna-transcription/README.md +1 -1
  29. data/tracks/bash/exercises/triangle/example.sh +23 -4
  30. data/tracks/bash/exercises/triangle/triangle_test.sh +17 -0
  31. data/tracks/bash/exercises/two-fer/README.md +1 -1
  32. data/tracks/bash/exercises/word-count/README.md +1 -1
  33. data/tracks/c/config.json +11 -0
  34. data/tracks/c/exercises/complex-numbers/README.md +67 -0
  35. data/tracks/c/exercises/complex-numbers/makefile +27 -0
  36. data/tracks/c/exercises/complex-numbers/src/complex_numbers.c +46 -0
  37. data/tracks/c/exercises/complex-numbers/src/complex_numbers.h +19 -0
  38. data/tracks/c/exercises/complex-numbers/src/example.c +80 -0
  39. data/tracks/c/exercises/complex-numbers/test/test_complex_numbers.c +397 -0
  40. data/tracks/c/exercises/complex-numbers/test/vendor/unity.c +1300 -0
  41. data/tracks/c/exercises/complex-numbers/test/vendor/unity.h +274 -0
  42. data/tracks/c/exercises/complex-numbers/test/vendor/unity_internals.h +701 -0
  43. data/tracks/crystal/.github/stale.yml +18 -0
  44. data/tracks/csharp/exercises/bob/README.md +3 -2
  45. data/tracks/ecmascript/config.json +4 -4
  46. data/tracks/fsharp/exercises/bob/README.md +4 -2
  47. data/tracks/fsharp/exercises/react/ReactTest.fs +137 -74
  48. data/tracks/fsharp/generators/Generators.fs +76 -0
  49. data/tracks/go/exercises/tree-building/tree_test.go +15 -0
  50. data/tracks/haskell/.travis.yml +1 -1
  51. data/tracks/haskell/exercises/accumulate/stack.yaml +1 -1
  52. data/tracks/haskell/exercises/acronym/package.yaml +1 -1
  53. data/tracks/haskell/exercises/acronym/stack.yaml +1 -1
  54. data/tracks/haskell/exercises/all-your-base/package.yaml +1 -1
  55. data/tracks/haskell/exercises/all-your-base/stack.yaml +1 -1
  56. data/tracks/haskell/exercises/all-your-base/test/Tests.hs +6 -6
  57. data/tracks/haskell/exercises/allergies/package.yaml +1 -1
  58. data/tracks/haskell/exercises/allergies/stack.yaml +1 -1
  59. data/tracks/haskell/exercises/alphametics/stack.yaml +1 -1
  60. data/tracks/haskell/exercises/anagram/package.yaml +1 -1
  61. data/tracks/haskell/exercises/anagram/stack.yaml +1 -1
  62. data/tracks/haskell/exercises/atbash-cipher/package.yaml +1 -1
  63. data/tracks/haskell/exercises/atbash-cipher/stack.yaml +1 -1
  64. data/tracks/haskell/exercises/bank-account/stack.yaml +1 -1
  65. data/tracks/haskell/exercises/beer-song/stack.yaml +1 -1
  66. data/tracks/haskell/exercises/binary-search-tree/package.yaml +1 -1
  67. data/tracks/haskell/exercises/binary-search-tree/stack.yaml +1 -1
  68. data/tracks/haskell/exercises/binary-search-tree/test/Tests.hs +3 -0
  69. data/tracks/haskell/exercises/binary/stack.yaml +1 -1
  70. data/tracks/haskell/exercises/bob/package.yaml +1 -1
  71. data/tracks/haskell/exercises/bob/stack.yaml +1 -1
  72. data/tracks/haskell/exercises/bowling/stack.yaml +1 -1
  73. data/tracks/haskell/exercises/bracket-push/package.yaml +1 -1
  74. data/tracks/haskell/exercises/bracket-push/stack.yaml +1 -1
  75. data/tracks/haskell/exercises/change/package.yaml +1 -1
  76. data/tracks/haskell/exercises/change/stack.yaml +1 -1
  77. data/tracks/haskell/exercises/clock/stack.yaml +1 -1
  78. data/tracks/haskell/exercises/collatz-conjecture/package.yaml +1 -1
  79. data/tracks/haskell/exercises/collatz-conjecture/stack.yaml +1 -1
  80. data/tracks/haskell/exercises/complex-numbers/stack.yaml +1 -1
  81. data/tracks/haskell/exercises/connect/package.yaml +1 -1
  82. data/tracks/haskell/exercises/connect/stack.yaml +1 -1
  83. data/tracks/haskell/exercises/crypto-square/package.yaml +1 -1
  84. data/tracks/haskell/exercises/crypto-square/stack.yaml +1 -1
  85. data/tracks/haskell/exercises/custom-set/stack.yaml +1 -1
  86. data/tracks/haskell/exercises/diamond/package.yaml +1 -1
  87. data/tracks/haskell/exercises/diamond/stack.yaml +1 -1
  88. data/tracks/haskell/exercises/difference-of-squares/package.yaml +1 -1
  89. data/tracks/haskell/exercises/difference-of-squares/stack.yaml +1 -1
  90. data/tracks/haskell/exercises/dominoes/package.yaml +1 -1
  91. data/tracks/haskell/exercises/dominoes/stack.yaml +1 -1
  92. data/tracks/haskell/exercises/etl/stack.yaml +1 -1
  93. data/tracks/haskell/exercises/food-chain/stack.yaml +1 -1
  94. data/tracks/haskell/exercises/forth/stack.yaml +1 -1
  95. data/tracks/haskell/exercises/gigasecond/stack.yaml +1 -1
  96. data/tracks/haskell/exercises/go-counting/stack.yaml +1 -1
  97. data/tracks/haskell/exercises/grade-school/stack.yaml +1 -1
  98. data/tracks/haskell/exercises/grains/stack.yaml +1 -1
  99. data/tracks/haskell/exercises/hamming/stack.yaml +1 -1
  100. data/tracks/haskell/exercises/hello-world/stack.yaml +1 -1
  101. data/tracks/haskell/exercises/hexadecimal/stack.yaml +1 -1
  102. data/tracks/haskell/exercises/house/stack.yaml +1 -1
  103. data/tracks/haskell/exercises/isbn-verifier/examples/success-standard/src/IsbnVerifier.hs +1 -0
  104. data/tracks/haskell/exercises/isbn-verifier/package.yaml +1 -1
  105. data/tracks/haskell/exercises/isbn-verifier/stack.yaml +1 -1
  106. data/tracks/haskell/exercises/isbn-verifier/test/Tests.hs +4 -0
  107. data/tracks/haskell/exercises/isogram/stack.yaml +1 -1
  108. data/tracks/haskell/exercises/kindergarten-garden/stack.yaml +1 -1
  109. data/tracks/haskell/exercises/largest-series-product/stack.yaml +1 -1
  110. data/tracks/haskell/exercises/leap/stack.yaml +1 -1
  111. data/tracks/haskell/exercises/lens-person/stack.yaml +1 -1
  112. data/tracks/haskell/exercises/linked-list/stack.yaml +1 -1
  113. data/tracks/haskell/exercises/list-ops/stack.yaml +1 -1
  114. data/tracks/haskell/exercises/luhn/package.yaml +1 -1
  115. data/tracks/haskell/exercises/luhn/stack.yaml +1 -1
  116. data/tracks/haskell/exercises/luhn/test/Tests.hs +1 -1
  117. data/tracks/haskell/exercises/matrix/stack.yaml +1 -1
  118. data/tracks/haskell/exercises/meetup/package.yaml +1 -1
  119. data/tracks/haskell/exercises/meetup/stack.yaml +1 -1
  120. data/tracks/haskell/exercises/minesweeper/stack.yaml +1 -1
  121. data/tracks/haskell/exercises/nth-prime/stack.yaml +1 -1
  122. data/tracks/haskell/exercises/nucleotide-count/stack.yaml +1 -1
  123. data/tracks/haskell/exercises/ocr-numbers/stack.yaml +1 -1
  124. data/tracks/haskell/exercises/octal/stack.yaml +1 -1
  125. data/tracks/haskell/exercises/palindrome-products/stack.yaml +1 -1
  126. data/tracks/haskell/exercises/pangram/stack.yaml +1 -1
  127. data/tracks/haskell/exercises/parallel-letter-frequency/stack.yaml +1 -1
  128. data/tracks/haskell/exercises/pascals-triangle/stack.yaml +1 -1
  129. data/tracks/haskell/exercises/perfect-numbers/stack.yaml +1 -1
  130. data/tracks/haskell/exercises/phone-number/stack.yaml +1 -1
  131. data/tracks/haskell/exercises/pig-latin/stack.yaml +1 -1
  132. data/tracks/haskell/exercises/pov/stack.yaml +1 -1
  133. data/tracks/haskell/exercises/prime-factors/stack.yaml +1 -1
  134. data/tracks/haskell/exercises/pythagorean-triplet/stack.yaml +1 -1
  135. data/tracks/haskell/exercises/queen-attack/stack.yaml +1 -1
  136. data/tracks/haskell/exercises/rail-fence-cipher/package.yaml +1 -1
  137. data/tracks/haskell/exercises/rail-fence-cipher/stack.yaml +1 -1
  138. data/tracks/haskell/exercises/raindrops/stack.yaml +1 -1
  139. data/tracks/haskell/exercises/rna-transcription/package.yaml +1 -1
  140. data/tracks/haskell/exercises/rna-transcription/stack.yaml +1 -1
  141. data/tracks/haskell/exercises/rna-transcription/test/Tests.hs +0 -12
  142. data/tracks/haskell/exercises/robot-name/stack.yaml +1 -1
  143. data/tracks/haskell/exercises/robot-simulator/stack.yaml +1 -1
  144. data/tracks/haskell/exercises/roman-numerals/stack.yaml +1 -1
  145. data/tracks/haskell/exercises/rotational-cipher/stack.yaml +1 -1
  146. data/tracks/haskell/exercises/run-length-encoding/stack.yaml +1 -1
  147. data/tracks/haskell/exercises/saddle-points/stack.yaml +1 -1
  148. data/tracks/haskell/exercises/say/stack.yaml +1 -1
  149. data/tracks/haskell/exercises/scrabble-score/stack.yaml +1 -1
  150. data/tracks/haskell/exercises/secret-handshake/stack.yaml +1 -1
  151. data/tracks/haskell/exercises/series/stack.yaml +1 -1
  152. data/tracks/haskell/exercises/sgf-parsing/stack.yaml +1 -1
  153. data/tracks/haskell/exercises/sieve/stack.yaml +1 -1
  154. data/tracks/haskell/exercises/simple-cipher/stack.yaml +1 -1
  155. data/tracks/haskell/exercises/simple-linked-list/stack.yaml +1 -1
  156. data/tracks/haskell/exercises/space-age/stack.yaml +1 -1
  157. data/tracks/haskell/exercises/spiral-matrix/stack.yaml +1 -1
  158. data/tracks/haskell/exercises/strain/stack.yaml +1 -1
  159. data/tracks/haskell/exercises/sublist/stack.yaml +1 -1
  160. data/tracks/haskell/exercises/sum-of-multiples/stack.yaml +1 -1
  161. data/tracks/haskell/exercises/triangle/stack.yaml +1 -1
  162. data/tracks/haskell/exercises/trinary/stack.yaml +1 -1
  163. data/tracks/haskell/exercises/twelve-days/stack.yaml +1 -1
  164. data/tracks/haskell/exercises/word-count/stack.yaml +1 -1
  165. data/tracks/haskell/exercises/wordy/stack.yaml +1 -1
  166. data/tracks/haskell/exercises/zebra-puzzle/stack.yaml +1 -1
  167. data/tracks/haskell/exercises/zipper/stack.yaml +1 -1
  168. data/tracks/java/config.json +12 -0
  169. data/tracks/java/exercises/alphametics/.meta/src/reference/java/Alphametics.java +125 -0
  170. data/tracks/java/exercises/alphametics/.meta/src/reference/java/UnsolvablePuzzleException.java +2 -0
  171. data/tracks/java/exercises/alphametics/.meta/src/version +1 -0
  172. data/tracks/java/exercises/alphametics/README.md +47 -0
  173. data/tracks/java/exercises/alphametics/build.gradle +18 -0
  174. data/tracks/java/exercises/alphametics/src/main/java/.keep +0 -0
  175. data/tracks/java/exercises/alphametics/src/main/java/UnsolvablePuzzleException.java +2 -0
  176. data/tracks/java/exercises/alphametics/src/test/java/AlphameticsTest.java +150 -0
  177. data/tracks/java/exercises/beer-song/.meta/src/reference/java/BeerSong.java +5 -4
  178. data/tracks/java/exercises/beer-song/.meta/version +1 -0
  179. data/tracks/java/exercises/beer-song/src/test/java/BeerSongTest.java +24 -16
  180. data/tracks/java/exercises/binary-search/.meta/version +1 -0
  181. data/tracks/java/exercises/book-store/.meta/version +1 -0
  182. data/tracks/java/exercises/book-store/src/test/java/BookStoreTest.java +15 -8
  183. data/tracks/java/exercises/circular-buffer/.meta/version +1 -0
  184. data/tracks/java/exercises/list-ops/.meta/version +1 -1
  185. data/tracks/java/exercises/list-ops/src/test/java/ListOpsTest.java +1 -1
  186. data/tracks/java/exercises/nth-prime/.meta/version +1 -0
  187. data/tracks/java/exercises/settings.gradle +1 -0
  188. data/tracks/java/exercises/tournament/.meta/version +1 -0
  189. data/tracks/java/exercises/transpose/.meta/version +1 -0
  190. data/tracks/java/exercises/transpose/src/test/java/TransposeTest.java +29 -74
  191. data/tracks/java/exercises/wordy/.meta/version +1 -0
  192. data/tracks/javascript/.eslintignore +0 -1
  193. data/tracks/javascript/config.json +13 -3
  194. data/tracks/javascript/exercises/bowling/example.js +24 -10
  195. data/tracks/javascript/exercises/forth/README.md +56 -0
  196. data/tracks/javascript/exercises/forth/example.js +66 -0
  197. data/tracks/javascript/exercises/forth/forth.spec.js +259 -0
  198. data/tracks/lua/config.json +92 -81
  199. data/tracks/lua/exercises/accumulate/README.md +42 -0
  200. data/tracks/lua/exercises/beer-song/README.md +1 -1
  201. data/tracks/lua/exercises/bob/README.md +2 -0
  202. data/tracks/lua/exercises/crypto-square/README.md +6 -4
  203. data/tracks/lua/exercises/house/README.md +1 -1
  204. data/tracks/lua/exercises/isbn-verifier/README.md +25 -20
  205. data/tracks/lua/exercises/kindergarten-garden/README.md +3 -3
  206. data/tracks/lua/exercises/meetup/README.md +16 -12
  207. data/tracks/lua/exercises/nucleotide-count/README.md +2 -2
  208. data/tracks/lua/exercises/phone-number/README.md +1 -1
  209. data/tracks/lua/exercises/pov/README.md +0 -2
  210. data/tracks/lua/exercises/queen-attack/README.md +22 -22
  211. data/tracks/lua/exercises/rectangles/README.md +9 -9
  212. data/tracks/lua/exercises/reverse-string/README.md +23 -0
  213. data/tracks/lua/exercises/reverse-string/example.lua +7 -0
  214. data/tracks/lua/exercises/reverse-string/reverse-string_spec.lua +24 -0
  215. data/tracks/lua/exercises/secret-handshake/README.md +1 -1
  216. data/tracks/lua/exercises/space-age/README.md +1 -2
  217. data/tracks/lua/exercises/sum-of-multiples/README.md +3 -3
  218. data/tracks/perl6/exercises/two-fer/README.md +1 -1
  219. data/tracks/python/exercises/luhn/luhn_test.py +1 -1
  220. metadata +39 -6
@@ -1,5 +1,5 @@
1
1
  class BeerSong {
2
- String verse(int number) {
2
+ private String verse(int number) {
3
3
  switch (number) {
4
4
  case 0:
5
5
  return "No more bottles of beer on the wall, no more bottles of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall.\n\n";
@@ -12,7 +12,8 @@ class BeerSong {
12
12
  }
13
13
  }
14
14
 
15
- String sing(int start, int stop) {
15
+ String sing(int start, int takeDown) {
16
+ int stop = start - takeDown + 1;
16
17
  StringBuilder songOutput = new StringBuilder();
17
18
 
18
19
  for (int i=start; i>=stop; i--) {
@@ -23,6 +24,6 @@ class BeerSong {
23
24
  }
24
25
 
25
26
  String singSong() {
26
- return sing(99,0);
27
+ return sing(99, 100);
27
28
  }
28
- }
29
+ }
@@ -0,0 +1 @@
1
+ 2.1.0
@@ -17,53 +17,61 @@ public class BeerSongTest {
17
17
  public void singFirstVerse() {
18
18
  assertEquals("99 bottles of beer on the wall, 99 bottles of beer.\n" +
19
19
  "Take one down and pass it around, 98 bottles of beer on the wall.\n\n",
20
- beerSong.verse(99));
20
+ beerSong.sing(99, 1));
21
21
  }
22
22
 
23
23
  @Ignore("Remove to run test")
24
24
  @Test
25
- public void singMiddleVerse() {
26
- assertEquals("44 bottles of beer on the wall, 44 bottles of beer.\n" +
27
- "Take one down and pass it around, 43 bottles of beer on the wall.\n\n",
28
- beerSong.verse(44));
25
+ public void singLastGenericVerse() {
26
+ assertEquals("3 bottles of beer on the wall, 3 bottles of beer.\n" +
27
+ "Take one down and pass it around, 2 bottles of beer on the wall.\n\n",
28
+ beerSong.sing(3, 1));
29
29
  }
30
30
 
31
31
  @Ignore("Remove to run test")
32
32
  @Test
33
- public void singThirdToLastVerse() {
33
+ public void verseWithTwoBottles() {
34
34
  assertEquals("2 bottles of beer on the wall, 2 bottles of beer.\n" +
35
35
  "Take one down and pass it around, 1 bottle of beer on the wall.\n\n",
36
- beerSong.verse(2));
36
+ beerSong.sing(2, 1));
37
37
  }
38
38
 
39
39
  @Ignore("Remove to run test")
40
40
  @Test
41
- public void singPenultimateVerse() {
41
+ public void verseWithOneBottle() {
42
42
  assertEquals("1 bottle of beer on the wall, 1 bottle of beer.\n" +
43
43
  "Take it down and pass it around, no more bottles of beer on the wall.\n\n",
44
- beerSong.verse(1));
44
+ beerSong.sing(1, 1));
45
45
  }
46
46
 
47
47
  @Ignore("Remove to run test")
48
48
  @Test
49
- public void singLastVerse() {
49
+ public void verseWithZeroBottles() {
50
50
  assertEquals("No more bottles of beer on the wall, no more bottles of beer.\n" +
51
51
  "Go to the store and buy some more, 99 bottles of beer on the wall.\n\n",
52
- beerSong.verse(0));
52
+ beerSong.sing(0, 1));
53
53
  }
54
54
 
55
55
  @Ignore("Remove to run test")
56
56
  @Test
57
- public void singLastFourVerses() {
58
- assertEquals("3 bottles of beer on the wall, 3 bottles of beer.\n" +
59
- "Take one down and pass it around, 2 bottles of beer on the wall.\n\n" +
60
- "2 bottles of beer on the wall, 2 bottles of beer.\n" +
57
+ public void singFirstTwoVerses() {
58
+ assertEquals("99 bottles of beer on the wall, 99 bottles of beer.\n" +
59
+ "Take one down and pass it around, 98 bottles of beer on the wall.\n\n" +
60
+ "98 bottles of beer on the wall, 98 bottles of beer.\n" +
61
+ "Take one down and pass it around, 97 bottles of beer on the wall.\n\n",
62
+ beerSong.sing(99, 2));
63
+ }
64
+
65
+ @Ignore("Remove to run test")
66
+ @Test
67
+ public void singLastThreeVerses() {
68
+ assertEquals("2 bottles of beer on the wall, 2 bottles of beer.\n" +
61
69
  "Take one down and pass it around, 1 bottle of beer on the wall.\n\n" +
62
70
  "1 bottle of beer on the wall, 1 bottle of beer.\n" +
63
71
  "Take it down and pass it around, no more bottles of beer on the wall.\n\n" +
64
72
  "No more bottles of beer on the wall, no more bottles of beer.\n" +
65
73
  "Go to the store and buy some more, 99 bottles of beer on the wall.\n\n",
66
- beerSong.sing(3,0));
74
+ beerSong.sing(2, 3));
67
75
  }
68
76
 
69
77
  @Ignore("Remove to run test")
@@ -0,0 +1 @@
1
+ 1.2.0
@@ -23,21 +23,21 @@ public class BookStoreTest {
23
23
  @Test
24
24
  public void onlyASingleBook() {
25
25
  List<Integer> books = Collections.singletonList(1);
26
- assertEquals(8, bookStore.calculateBasketCost(books), EQUALITY_TOLERANCE);
26
+ assertEquals(8.00, bookStore.calculateBasketCost(books), EQUALITY_TOLERANCE);
27
27
  }
28
28
 
29
29
  @Ignore("Remove to run test")
30
30
  @Test
31
31
  public void twoOfSameBook() {
32
- List<Integer> books = Arrays.asList(1, 1);
33
- assertEquals(16, bookStore.calculateBasketCost(books), EQUALITY_TOLERANCE);
32
+ List<Integer> books = Arrays.asList(2, 2);
33
+ assertEquals(16.00, bookStore.calculateBasketCost(books), EQUALITY_TOLERANCE);
34
34
  }
35
35
 
36
36
  @Ignore("Remove to run test")
37
37
  @Test
38
38
  public void emptyBasket() {
39
39
  List<Integer> books = Collections.emptyList();
40
- assertEquals(0, bookStore.calculateBasketCost(books), EQUALITY_TOLERANCE);
40
+ assertEquals(0.00, bookStore.calculateBasketCost(books), EQUALITY_TOLERANCE);
41
41
  }
42
42
 
43
43
  @Ignore("Remove to run test")
@@ -51,21 +51,21 @@ public class BookStoreTest {
51
51
  @Test
52
52
  public void threeDifferentBooks() {
53
53
  List<Integer> books = Arrays.asList(1, 2, 3);
54
- assertEquals(21.6, bookStore.calculateBasketCost(books), EQUALITY_TOLERANCE);
54
+ assertEquals(21.60, bookStore.calculateBasketCost(books), EQUALITY_TOLERANCE);
55
55
  }
56
56
 
57
57
  @Ignore("Remove to run test")
58
58
  @Test
59
59
  public void fourDifferentBooks() {
60
60
  List<Integer> books = Arrays.asList(1, 2, 3, 4);
61
- assertEquals(25.6, bookStore.calculateBasketCost(books), EQUALITY_TOLERANCE);
61
+ assertEquals(25.60, bookStore.calculateBasketCost(books), EQUALITY_TOLERANCE);
62
62
  }
63
63
 
64
64
  @Ignore("Remove to run test")
65
65
  @Test
66
66
  public void fiveDifferentBooks() {
67
67
  List<Integer> books = Arrays.asList(1, 2, 3, 4, 5);
68
- assertEquals(30, bookStore.calculateBasketCost(books), EQUALITY_TOLERANCE);
68
+ assertEquals(30.00, bookStore.calculateBasketCost(books), EQUALITY_TOLERANCE);
69
69
  }
70
70
 
71
71
  @Ignore("Remove to run test")
@@ -79,7 +79,7 @@ public class BookStoreTest {
79
79
  @Test
80
80
  public void groupOfFourPlusGroupOfTwoIsCheaperThanTwoGroupsOfThree() {
81
81
  List<Integer> books = Arrays.asList(1, 1, 2, 2, 3, 4);
82
- assertEquals(40.8, bookStore.calculateBasketCost(books), EQUALITY_TOLERANCE);
82
+ assertEquals(40.80, bookStore.calculateBasketCost(books), EQUALITY_TOLERANCE);
83
83
  }
84
84
 
85
85
  @Ignore("Remove to run test")
@@ -110,4 +110,11 @@ public class BookStoreTest {
110
110
  assertEquals(75.20, bookStore.calculateBasketCost(books), EQUALITY_TOLERANCE);
111
111
  }
112
112
 
113
+ @Ignore("Remove to run test")
114
+ @Test
115
+ public void fourGroupsOfFourAreCheaperThanTwoGroupsEachOfFiveAndThree() {
116
+ List<Integer> books = Arrays.asList(1, 1, 2, 2, 3, 3, 4, 5, 1, 1, 2, 2, 3, 3, 4, 5);
117
+ assertEquals(102.4, bookStore.calculateBasketCost(books), EQUALITY_TOLERANCE);
118
+ }
119
+
113
120
  }
@@ -1 +1 @@
1
- 1.0.0
1
+ 2.0.0
@@ -179,5 +179,5 @@ public class ListOpsTest {
179
179
  Arrays.asList('7', '5', '3', '1'),
180
180
  ListOps.reverse(Arrays.asList('1', '3', '5', '7')));
181
181
  }
182
-
182
+
183
183
  }
@@ -0,0 +1 @@
1
+ 2.0.0
@@ -2,6 +2,7 @@ include 'accumulate'
2
2
  include 'acronym'
3
3
  include 'all-your-base'
4
4
  include 'allergies'
5
+ include 'alphametics'
5
6
  include 'anagram'
6
7
  include 'armstrong-numbers'
7
8
  include 'atbash-cipher'
@@ -0,0 +1 @@
1
+ 1.3.0
@@ -0,0 +1 @@
1
+ 1.1.0
@@ -129,6 +129,35 @@ public class TransposeTest {
129
129
  assertEquals(expected, transpose.transpose(input));
130
130
  }
131
131
 
132
+ @Ignore("Remove to run test")
133
+ @Test
134
+ public void mixedLineLength() {
135
+ String input = "The longest line.\n" +
136
+ "A long line.\n" +
137
+ "A longer line.\n" +
138
+ "A line.";
139
+
140
+ String expected = "TAAA\n" +
141
+ "h \n" +
142
+ "elll\n" +
143
+ " ooi\n" +
144
+ "lnnn\n" +
145
+ "ogge\n" +
146
+ "n e.\n" +
147
+ "glr\n" +
148
+ "ei \n" +
149
+ "snl\n" +
150
+ "tei\n" +
151
+ " .n\n" +
152
+ "l e\n" +
153
+ "i .\n" +
154
+ "n\n" +
155
+ "e\n" +
156
+ ".";
157
+
158
+ assertEquals(expected, transpose.transpose(input));
159
+ }
160
+
132
161
  @Ignore("Remove to run test")
133
162
  @Test
134
163
  public void square() {
@@ -187,78 +216,4 @@ public class TransposeTest {
187
216
  assertEquals(expected, transpose.transpose(input));
188
217
  }
189
218
 
190
- @Ignore("Remove to run test")
191
- @Test
192
- public void manyLines() {
193
- String input = "Chor. Two households, both alike in dignity,\n" +
194
- "In fair Verona, where we lay our scene,\n" +
195
- "From ancient grudge break to new mutiny,\n" +
196
- "Where civil blood makes civil hands unclean.\n" +
197
- "From forth the fatal loins of these two foes\n" +
198
- "A pair of star-cross'd lovers take their life;\n" +
199
- "Whose misadventur'd piteous overthrows\n" +
200
- "Doth with their death bury their parents' strife.\n" +
201
- "The fearful passage of their death-mark'd love,\n" +
202
- "And the continuance of their parents' rage,\n" +
203
- "Which, but their children's end, naught could remove,\n" +
204
- "Is now the two hours' traffic of our stage;\n" +
205
- "The which if you with patient ears attend,\n" +
206
- "What here shall miss, our toil shall strive to mend.";
207
-
208
- String expected = "CIFWFAWDTAWITW\n" +
209
- "hnrhr hohnhshh\n" +
210
- "o oeopotedi ea\n" +
211
- "rfmrmash cn t\n" +
212
- ".a e ie fthow \n" +
213
- " ia fr weh,whh\n" +
214
- "Trnco miae ie\n" +
215
- "w ciroitr btcr\n" +
216
- "oVivtfshfcuhhe\n" +
217
- " eeih a uote \n" +
218
- "hrnl sdtln is\n" +
219
- "oot ttvh tttfh\n" +
220
- "un bhaeepihw a\n" +
221
- "saglernianeoyl\n" +
222
- "e,ro -trsui ol\n" +
223
- "h uofcu sarhu \n" +
224
- "owddarrdan o m\n" +
225
- "lhg to'egccuwi\n" +
226
- "deemasdaeehris\n" +
227
- "sr als t ists\n" +
228
- ",ebk 'phool'h,\n" +
229
- " reldi ffd \n" +
230
- "bweso tb rtpo\n" +
231
- "oea ileutterau\n" +
232
- "t kcnoorhhnatr\n" +
233
- "hl isvuyee'fi \n" +
234
- " atv es iisfet\n" +
235
- "ayoior trr ino\n" +
236
- "l lfsoh ecti\n" +
237
- "ion vedpn l\n" +
238
- "kuehtteieadoe \n" +
239
- "erwaharrar,fas\n" +
240
- " nekt te rh\n" +
241
- "ismdsehphnnosa\n" +
242
- "ncuse ra-tau l\n" +
243
- " et tormsural\n" +
244
- "dniuthwea'g t \n" +
245
- "iennwesnr hsts\n" +
246
- "g,ycoi tkrttet\n" +
247
- "n ,l r s'a anr\n" +
248
- "i ef 'dgcgdi\n" +
249
- "t aol eoe,v\n" +
250
- "y nei sl,u; e\n" +
251
- ", .sf to l \n" +
252
- " e rv d t\n" +
253
- " ; ie o\n" +
254
- " f, r \n" +
255
- " e e m\n" +
256
- " . m e\n" +
257
- " o n\n" +
258
- " v d\n" +
259
- " e .\n" +
260
- " ,";
261
-
262
- assertEquals(expected, transpose.transpose(input));
263
- }
264
219
  }
@@ -0,0 +1 @@
1
+ 1.0.0
@@ -2,7 +2,6 @@ big-integer.js
2
2
  exercises/alphametics
3
3
  exercises/binary-search
4
4
  exercises/binary-search-tree
5
- exercises/bowling
6
5
  exercises/bracket-push
7
6
  exercises/custom-set
8
7
  exercises/flatten-array
@@ -1128,10 +1128,8 @@
1128
1128
  "topics": [
1129
1129
  "Control-flow (conditionals)",
1130
1130
  "Control-flow (loops)",
1131
- "Polymorphism",
1132
1131
  "Strings",
1133
- "Pattern recognition",
1134
- "Regular expressions"
1132
+ "Pattern recognition"
1135
1133
  ]
1136
1134
  },
1137
1135
  {
@@ -1186,6 +1184,18 @@
1186
1184
  "pattern_matching",
1187
1185
  "strings"
1188
1186
  ]
1187
+ },
1188
+ {
1189
+ "uuid": "b3dbc935-536e-4910-994d-4a519b511b6a",
1190
+ "slug": "forth",
1191
+ "core": false,
1192
+ "unlocked_by": "saddle-points",
1193
+ "difficulty": 8,
1194
+ "topics": [
1195
+ "stacks",
1196
+ "parsing",
1197
+ "domain_specific_languages"
1198
+ ]
1189
1199
  }
1190
1200
  ],
1191
1201
  "foregone": [],
@@ -5,6 +5,9 @@ function Bowling(rolls) {
5
5
  }
6
6
 
7
7
  Bowling.prototype.score = function () {
8
+ var maxFrames = 10;
9
+ var maxPins = 10;
10
+
8
11
  var initialState = {
9
12
  frameNumber: 1,
10
13
  rollNumber: 1,
@@ -17,7 +20,7 @@ Bowling.prototype.score = function () {
17
20
  };
18
21
 
19
22
  var finalState = this.rolls.reduce(function (state, roll) {
20
- if (roll < 0 || roll > 10) {
23
+ if (roll < 0 || roll > maxFrames ) {
21
24
  throw new Error('Pins must have a value from 0 to 10');
22
25
  }
23
26
 
@@ -25,11 +28,11 @@ Bowling.prototype.score = function () {
25
28
  throw new Error('Pin count exceeds pins on the lane');
26
29
  }
27
30
 
28
- if (state.frameNumber > 10) {
31
+ if (state.frameNumber > maxFrames ) {
29
32
  throw new Error('Should not be able to roll after game is over');
30
33
  }
31
34
 
32
- var finalFrame = state.frameNumber === 10;
35
+ var finalFrame = state.frameNumber === maxFrames;
33
36
  var strike = state.rollNumber === 1 && roll === 10;
34
37
  var spare = state.rollNumber === 2 && roll === state.pinsRemaining;
35
38
  var frameOver = finalFrame
@@ -38,17 +41,19 @@ Bowling.prototype.score = function () {
38
41
 
39
42
  var score = state.score + roll;
40
43
 
41
- if (state.strikeLastFrame && state.rollNumber < 3) { score += roll; }
42
- if (state.spareLastFrame && state.rollNumber === 1) { score += roll; }
43
- if (state.twoStrikesInARow && state.rollNumber === 1) { score += roll; }
44
+ if (state.strikeLastFrame && state.rollNumber < 3) { score = incrementScore(score, roll); }
45
+ if (state.spareLastFrame && state.rollNumber === 1) { score = incrementScore(score, roll); }
46
+ if (state.twoStrikesInARow && state.rollNumber === 1) { score = incrementScore(score, roll); }
44
47
 
45
48
  var next = {};
46
49
 
47
50
  next.frameNumber = frameOver ? state.frameNumber + 1 : state.frameNumber;
48
51
  next.rollNumber = frameOver ? 1 : state.rollNumber + 1;
49
- next.pinsRemaining = finalFrame
50
- ? ((strike || spare) ? 10 : state.pinsRemaining - roll)
51
- : (frameOver ? 10 : state.pinsRemaining - roll);
52
+ if ( finalFrame ) {
53
+ next.pinsRemaining = (strike || spare) ? maxPins : pinsRemaining(state.pinsRemaining, roll);
54
+ } else {
55
+ next.pinsRemaining = frameOver ? maxPins : pinsRemaining(state.pinsRemaining, roll);
56
+ }
52
57
  next.spareLastFrame = frameOver ? spare : state.spareLastFrame;
53
58
  next.strikeLastFrame = frameOver ? strike : state.strikeLastFrame;
54
59
  next.twoStrikesInARow = frameOver ? strike && state.strikeLastFrame : state.twoStrikesInARow;
@@ -58,11 +63,20 @@ Bowling.prototype.score = function () {
58
63
  return next;
59
64
  }, initialState);
60
65
 
61
- if (finalState.frameNumber !== 11) {
66
+ if (finalState.frameNumber <= maxFrames ) {
62
67
  throw new Error('Score cannot be taken until the end of the game');
63
68
  }
64
69
 
65
70
  return finalState.score;
66
71
  };
67
72
 
73
+ function incrementScore(score, roll) {
74
+ return score + roll;
75
+ }
76
+
77
+ function pinsRemaining(pins, roll) {
78
+ return pins - roll;
79
+ }
80
+
81
+
68
82
  module.exports = Bowling;