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.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/alphametics/canonical-data.json +29 -11
- data/problem-specifications/exercises/binary-search-tree/canonical-data.json +177 -0
- data/problem-specifications/package.json +2 -2
- data/problem-specifications/yarn.lock +61 -51
- data/tracks/bash/CONTRIBUTING.md +10 -6
- data/tracks/bash/README.md +1 -0
- data/tracks/bash/exercises/acronym/README.md +1 -1
- data/tracks/bash/exercises/anagram/README.md +1 -1
- data/tracks/bash/exercises/anagram/{anagram_tests.sh → anagram_test.sh} +0 -0
- data/tracks/bash/exercises/armstrong-numbers/armstrong_numbers_test.sh +25 -17
- data/tracks/bash/exercises/armstrong-numbers/example.sh +18 -12
- data/tracks/bash/exercises/atbash-cipher/README.md +1 -1
- data/tracks/bash/exercises/atbash-cipher/{atbash_cipher_tests.sh → atbash_cipher_test.sh} +0 -0
- data/tracks/bash/exercises/difference-of-squares/README.md +1 -1
- data/tracks/bash/exercises/gigasecond/README.md +1 -1
- data/tracks/bash/exercises/hamming/README.md +1 -1
- data/tracks/bash/exercises/hello-world/README.md +1 -1
- data/tracks/bash/exercises/leap/README.md +1 -1
- data/tracks/bash/exercises/luhn/README.md +1 -1
- data/tracks/bash/exercises/nucleotide-count/README.md +1 -1
- data/tracks/bash/exercises/pangram/README.md +1 -1
- data/tracks/bash/exercises/pangram/{pangram_tests.sh → pangram_test.sh} +0 -0
- data/tracks/bash/exercises/phone-number/README.md +1 -1
- data/tracks/bash/exercises/phone-number/{phone_number_tests.sh → phone_number_test.sh} +0 -0
- data/tracks/bash/exercises/raindrops/README.md +1 -1
- data/tracks/bash/exercises/rna-transcription/README.md +1 -1
- data/tracks/bash/exercises/triangle/example.sh +23 -4
- data/tracks/bash/exercises/triangle/triangle_test.sh +17 -0
- data/tracks/bash/exercises/two-fer/README.md +1 -1
- data/tracks/bash/exercises/word-count/README.md +1 -1
- data/tracks/c/config.json +11 -0
- data/tracks/c/exercises/complex-numbers/README.md +67 -0
- data/tracks/c/exercises/complex-numbers/makefile +27 -0
- data/tracks/c/exercises/complex-numbers/src/complex_numbers.c +46 -0
- data/tracks/c/exercises/complex-numbers/src/complex_numbers.h +19 -0
- data/tracks/c/exercises/complex-numbers/src/example.c +80 -0
- data/tracks/c/exercises/complex-numbers/test/test_complex_numbers.c +397 -0
- data/tracks/c/exercises/complex-numbers/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/complex-numbers/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/complex-numbers/test/vendor/unity_internals.h +701 -0
- data/tracks/crystal/.github/stale.yml +18 -0
- data/tracks/csharp/exercises/bob/README.md +3 -2
- data/tracks/ecmascript/config.json +4 -4
- data/tracks/fsharp/exercises/bob/README.md +4 -2
- data/tracks/fsharp/exercises/react/ReactTest.fs +137 -74
- data/tracks/fsharp/generators/Generators.fs +76 -0
- data/tracks/go/exercises/tree-building/tree_test.go +15 -0
- data/tracks/haskell/.travis.yml +1 -1
- data/tracks/haskell/exercises/accumulate/stack.yaml +1 -1
- data/tracks/haskell/exercises/acronym/package.yaml +1 -1
- data/tracks/haskell/exercises/acronym/stack.yaml +1 -1
- data/tracks/haskell/exercises/all-your-base/package.yaml +1 -1
- data/tracks/haskell/exercises/all-your-base/stack.yaml +1 -1
- data/tracks/haskell/exercises/all-your-base/test/Tests.hs +6 -6
- data/tracks/haskell/exercises/allergies/package.yaml +1 -1
- data/tracks/haskell/exercises/allergies/stack.yaml +1 -1
- data/tracks/haskell/exercises/alphametics/stack.yaml +1 -1
- data/tracks/haskell/exercises/anagram/package.yaml +1 -1
- data/tracks/haskell/exercises/anagram/stack.yaml +1 -1
- data/tracks/haskell/exercises/atbash-cipher/package.yaml +1 -1
- data/tracks/haskell/exercises/atbash-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/bank-account/stack.yaml +1 -1
- data/tracks/haskell/exercises/beer-song/stack.yaml +1 -1
- data/tracks/haskell/exercises/binary-search-tree/package.yaml +1 -1
- data/tracks/haskell/exercises/binary-search-tree/stack.yaml +1 -1
- data/tracks/haskell/exercises/binary-search-tree/test/Tests.hs +3 -0
- data/tracks/haskell/exercises/binary/stack.yaml +1 -1
- data/tracks/haskell/exercises/bob/package.yaml +1 -1
- data/tracks/haskell/exercises/bob/stack.yaml +1 -1
- data/tracks/haskell/exercises/bowling/stack.yaml +1 -1
- data/tracks/haskell/exercises/bracket-push/package.yaml +1 -1
- data/tracks/haskell/exercises/bracket-push/stack.yaml +1 -1
- data/tracks/haskell/exercises/change/package.yaml +1 -1
- data/tracks/haskell/exercises/change/stack.yaml +1 -1
- data/tracks/haskell/exercises/clock/stack.yaml +1 -1
- data/tracks/haskell/exercises/collatz-conjecture/package.yaml +1 -1
- data/tracks/haskell/exercises/collatz-conjecture/stack.yaml +1 -1
- data/tracks/haskell/exercises/complex-numbers/stack.yaml +1 -1
- data/tracks/haskell/exercises/connect/package.yaml +1 -1
- data/tracks/haskell/exercises/connect/stack.yaml +1 -1
- data/tracks/haskell/exercises/crypto-square/package.yaml +1 -1
- data/tracks/haskell/exercises/crypto-square/stack.yaml +1 -1
- data/tracks/haskell/exercises/custom-set/stack.yaml +1 -1
- data/tracks/haskell/exercises/diamond/package.yaml +1 -1
- data/tracks/haskell/exercises/diamond/stack.yaml +1 -1
- data/tracks/haskell/exercises/difference-of-squares/package.yaml +1 -1
- data/tracks/haskell/exercises/difference-of-squares/stack.yaml +1 -1
- data/tracks/haskell/exercises/dominoes/package.yaml +1 -1
- data/tracks/haskell/exercises/dominoes/stack.yaml +1 -1
- data/tracks/haskell/exercises/etl/stack.yaml +1 -1
- data/tracks/haskell/exercises/food-chain/stack.yaml +1 -1
- data/tracks/haskell/exercises/forth/stack.yaml +1 -1
- data/tracks/haskell/exercises/gigasecond/stack.yaml +1 -1
- data/tracks/haskell/exercises/go-counting/stack.yaml +1 -1
- data/tracks/haskell/exercises/grade-school/stack.yaml +1 -1
- data/tracks/haskell/exercises/grains/stack.yaml +1 -1
- data/tracks/haskell/exercises/hamming/stack.yaml +1 -1
- data/tracks/haskell/exercises/hello-world/stack.yaml +1 -1
- data/tracks/haskell/exercises/hexadecimal/stack.yaml +1 -1
- data/tracks/haskell/exercises/house/stack.yaml +1 -1
- data/tracks/haskell/exercises/isbn-verifier/examples/success-standard/src/IsbnVerifier.hs +1 -0
- data/tracks/haskell/exercises/isbn-verifier/package.yaml +1 -1
- data/tracks/haskell/exercises/isbn-verifier/stack.yaml +1 -1
- data/tracks/haskell/exercises/isbn-verifier/test/Tests.hs +4 -0
- data/tracks/haskell/exercises/isogram/stack.yaml +1 -1
- data/tracks/haskell/exercises/kindergarten-garden/stack.yaml +1 -1
- data/tracks/haskell/exercises/largest-series-product/stack.yaml +1 -1
- data/tracks/haskell/exercises/leap/stack.yaml +1 -1
- data/tracks/haskell/exercises/lens-person/stack.yaml +1 -1
- data/tracks/haskell/exercises/linked-list/stack.yaml +1 -1
- data/tracks/haskell/exercises/list-ops/stack.yaml +1 -1
- data/tracks/haskell/exercises/luhn/package.yaml +1 -1
- data/tracks/haskell/exercises/luhn/stack.yaml +1 -1
- data/tracks/haskell/exercises/luhn/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/matrix/stack.yaml +1 -1
- data/tracks/haskell/exercises/meetup/package.yaml +1 -1
- data/tracks/haskell/exercises/meetup/stack.yaml +1 -1
- data/tracks/haskell/exercises/minesweeper/stack.yaml +1 -1
- data/tracks/haskell/exercises/nth-prime/stack.yaml +1 -1
- data/tracks/haskell/exercises/nucleotide-count/stack.yaml +1 -1
- data/tracks/haskell/exercises/ocr-numbers/stack.yaml +1 -1
- data/tracks/haskell/exercises/octal/stack.yaml +1 -1
- data/tracks/haskell/exercises/palindrome-products/stack.yaml +1 -1
- data/tracks/haskell/exercises/pangram/stack.yaml +1 -1
- data/tracks/haskell/exercises/parallel-letter-frequency/stack.yaml +1 -1
- data/tracks/haskell/exercises/pascals-triangle/stack.yaml +1 -1
- data/tracks/haskell/exercises/perfect-numbers/stack.yaml +1 -1
- data/tracks/haskell/exercises/phone-number/stack.yaml +1 -1
- data/tracks/haskell/exercises/pig-latin/stack.yaml +1 -1
- data/tracks/haskell/exercises/pov/stack.yaml +1 -1
- data/tracks/haskell/exercises/prime-factors/stack.yaml +1 -1
- data/tracks/haskell/exercises/pythagorean-triplet/stack.yaml +1 -1
- data/tracks/haskell/exercises/queen-attack/stack.yaml +1 -1
- data/tracks/haskell/exercises/rail-fence-cipher/package.yaml +1 -1
- data/tracks/haskell/exercises/rail-fence-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/raindrops/stack.yaml +1 -1
- data/tracks/haskell/exercises/rna-transcription/package.yaml +1 -1
- data/tracks/haskell/exercises/rna-transcription/stack.yaml +1 -1
- data/tracks/haskell/exercises/rna-transcription/test/Tests.hs +0 -12
- data/tracks/haskell/exercises/robot-name/stack.yaml +1 -1
- data/tracks/haskell/exercises/robot-simulator/stack.yaml +1 -1
- data/tracks/haskell/exercises/roman-numerals/stack.yaml +1 -1
- data/tracks/haskell/exercises/rotational-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/run-length-encoding/stack.yaml +1 -1
- data/tracks/haskell/exercises/saddle-points/stack.yaml +1 -1
- data/tracks/haskell/exercises/say/stack.yaml +1 -1
- data/tracks/haskell/exercises/scrabble-score/stack.yaml +1 -1
- data/tracks/haskell/exercises/secret-handshake/stack.yaml +1 -1
- data/tracks/haskell/exercises/series/stack.yaml +1 -1
- data/tracks/haskell/exercises/sgf-parsing/stack.yaml +1 -1
- data/tracks/haskell/exercises/sieve/stack.yaml +1 -1
- data/tracks/haskell/exercises/simple-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/simple-linked-list/stack.yaml +1 -1
- data/tracks/haskell/exercises/space-age/stack.yaml +1 -1
- data/tracks/haskell/exercises/spiral-matrix/stack.yaml +1 -1
- data/tracks/haskell/exercises/strain/stack.yaml +1 -1
- data/tracks/haskell/exercises/sublist/stack.yaml +1 -1
- data/tracks/haskell/exercises/sum-of-multiples/stack.yaml +1 -1
- data/tracks/haskell/exercises/triangle/stack.yaml +1 -1
- data/tracks/haskell/exercises/trinary/stack.yaml +1 -1
- data/tracks/haskell/exercises/twelve-days/stack.yaml +1 -1
- data/tracks/haskell/exercises/word-count/stack.yaml +1 -1
- data/tracks/haskell/exercises/wordy/stack.yaml +1 -1
- data/tracks/haskell/exercises/zebra-puzzle/stack.yaml +1 -1
- data/tracks/haskell/exercises/zipper/stack.yaml +1 -1
- data/tracks/java/config.json +12 -0
- data/tracks/java/exercises/alphametics/.meta/src/reference/java/Alphametics.java +125 -0
- data/tracks/java/exercises/alphametics/.meta/src/reference/java/UnsolvablePuzzleException.java +2 -0
- data/tracks/java/exercises/alphametics/.meta/src/version +1 -0
- data/tracks/java/exercises/alphametics/README.md +47 -0
- data/tracks/java/exercises/alphametics/build.gradle +18 -0
- data/tracks/java/exercises/alphametics/src/main/java/.keep +0 -0
- data/tracks/java/exercises/alphametics/src/main/java/UnsolvablePuzzleException.java +2 -0
- data/tracks/java/exercises/alphametics/src/test/java/AlphameticsTest.java +150 -0
- data/tracks/java/exercises/beer-song/.meta/src/reference/java/BeerSong.java +5 -4
- data/tracks/java/exercises/beer-song/.meta/version +1 -0
- data/tracks/java/exercises/beer-song/src/test/java/BeerSongTest.java +24 -16
- data/tracks/java/exercises/binary-search/.meta/version +1 -0
- data/tracks/java/exercises/book-store/.meta/version +1 -0
- data/tracks/java/exercises/book-store/src/test/java/BookStoreTest.java +15 -8
- data/tracks/java/exercises/circular-buffer/.meta/version +1 -0
- data/tracks/java/exercises/list-ops/.meta/version +1 -1
- data/tracks/java/exercises/list-ops/src/test/java/ListOpsTest.java +1 -1
- data/tracks/java/exercises/nth-prime/.meta/version +1 -0
- data/tracks/java/exercises/settings.gradle +1 -0
- data/tracks/java/exercises/tournament/.meta/version +1 -0
- data/tracks/java/exercises/transpose/.meta/version +1 -0
- data/tracks/java/exercises/transpose/src/test/java/TransposeTest.java +29 -74
- data/tracks/java/exercises/wordy/.meta/version +1 -0
- data/tracks/javascript/.eslintignore +0 -1
- data/tracks/javascript/config.json +13 -3
- data/tracks/javascript/exercises/bowling/example.js +24 -10
- data/tracks/javascript/exercises/forth/README.md +56 -0
- data/tracks/javascript/exercises/forth/example.js +66 -0
- data/tracks/javascript/exercises/forth/forth.spec.js +259 -0
- data/tracks/lua/config.json +92 -81
- data/tracks/lua/exercises/accumulate/README.md +42 -0
- data/tracks/lua/exercises/beer-song/README.md +1 -1
- data/tracks/lua/exercises/bob/README.md +2 -0
- data/tracks/lua/exercises/crypto-square/README.md +6 -4
- data/tracks/lua/exercises/house/README.md +1 -1
- data/tracks/lua/exercises/isbn-verifier/README.md +25 -20
- data/tracks/lua/exercises/kindergarten-garden/README.md +3 -3
- data/tracks/lua/exercises/meetup/README.md +16 -12
- data/tracks/lua/exercises/nucleotide-count/README.md +2 -2
- data/tracks/lua/exercises/phone-number/README.md +1 -1
- data/tracks/lua/exercises/pov/README.md +0 -2
- data/tracks/lua/exercises/queen-attack/README.md +22 -22
- data/tracks/lua/exercises/rectangles/README.md +9 -9
- data/tracks/lua/exercises/reverse-string/README.md +23 -0
- data/tracks/lua/exercises/reverse-string/example.lua +7 -0
- data/tracks/lua/exercises/reverse-string/reverse-string_spec.lua +24 -0
- data/tracks/lua/exercises/secret-handshake/README.md +1 -1
- data/tracks/lua/exercises/space-age/README.md +1 -2
- data/tracks/lua/exercises/sum-of-multiples/README.md +3 -3
- data/tracks/perl6/exercises/two-fer/README.md +1 -1
- data/tracks/python/exercises/luhn/luhn_test.py +1 -1
- 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
|
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,
|
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.
|
20
|
+
beerSong.sing(99, 1));
|
21
21
|
}
|
22
22
|
|
23
23
|
@Ignore("Remove to run test")
|
24
24
|
@Test
|
25
|
-
public void
|
26
|
-
assertEquals("
|
27
|
-
"Take one down and pass it around,
|
28
|
-
beerSong.
|
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
|
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.
|
36
|
+
beerSong.sing(2, 1));
|
37
37
|
}
|
38
38
|
|
39
39
|
@Ignore("Remove to run test")
|
40
40
|
@Test
|
41
|
-
public void
|
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.
|
44
|
+
beerSong.sing(1, 1));
|
45
45
|
}
|
46
46
|
|
47
47
|
@Ignore("Remove to run test")
|
48
48
|
@Test
|
49
|
-
public void
|
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.
|
52
|
+
beerSong.sing(0, 1));
|
53
53
|
}
|
54
54
|
|
55
55
|
@Ignore("Remove to run test")
|
56
56
|
@Test
|
57
|
-
public void
|
58
|
-
assertEquals("
|
59
|
-
"Take one down and pass it around,
|
60
|
-
"
|
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
|
74
|
+
beerSong.sing(2, 3));
|
67
75
|
}
|
68
76
|
|
69
77
|
@Ignore("Remove to run test")
|
@@ -0,0 +1 @@
|
|
1
|
+
1.1.0
|
@@ -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(
|
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.
|
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.
|
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.
|
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
|
}
|
@@ -0,0 +1 @@
|
|
1
|
+
1.0.1
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
2.0.0
|
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0
|
@@ -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
|
@@ -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 >
|
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 >
|
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 ===
|
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
|
42
|
-
if (state.spareLastFrame && state.rollNumber === 1) { score
|
43
|
-
if (state.twoStrikesInARow && state.rollNumber === 1) { score
|
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
|
-
|
50
|
-
|
51
|
-
|
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
|
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;
|