trackler 2.2.1.75 → 2.2.1.76

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 (78) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/alphametics/canonical-data.json +18 -1
  4. data/problem-specifications/exercises/anagram/canonical-data.json +72 -39
  5. data/problem-specifications/exercises/binary/canonical-data.json +47 -17
  6. data/tracks/clojure/exercises/beer-song/src/beer_song.clj +11 -0
  7. data/tracks/erlang/config.json +10 -0
  8. data/tracks/erlang/exercises/raindrops/README.md +67 -0
  9. data/tracks/erlang/exercises/raindrops/rebar.config +30 -0
  10. data/tracks/erlang/exercises/raindrops/src/example.erl +30 -0
  11. data/tracks/erlang/exercises/raindrops/src/raindrops.app.src +9 -0
  12. data/tracks/erlang/exercises/raindrops/src/raindrops.erl +8 -0
  13. data/tracks/erlang/exercises/raindrops/test/raindrops_tests.erl +50 -0
  14. data/tracks/fsharp/exercises/bob/BobTest.fs +2 -2
  15. data/tracks/fsharp/exercises/bob/Example.fs +10 -4
  16. data/tracks/fsharp/exercises/book-store/BookStoreTest.fs +5 -1
  17. data/tracks/fsharp/exercises/rna-transcription/RnaTranscriptionTest.fs +1 -13
  18. data/tracks/fsharp/generators/CanonicalData.fs +14 -7
  19. data/tracks/fsharp/generators/Exercise.fs +84 -18
  20. data/tracks/fsharp/generators/Generators.fs +65 -62
  21. data/tracks/fsharp/generators/Generators.fsproj +0 -4
  22. data/tracks/fsharp/generators/Options.fs +51 -17
  23. data/tracks/fsharp/generators/Program.fs +34 -7
  24. data/tracks/fsharp/generators/Rendering.fs +2 -1
  25. data/tracks/go/config.json +11 -0
  26. data/tracks/go/exercises/reverse-string/.meta/gen.go +52 -0
  27. data/tracks/go/exercises/reverse-string/README.md +31 -0
  28. data/tracks/go/exercises/reverse-string/cases_test.go +37 -0
  29. data/tracks/go/exercises/reverse-string/example.go +10 -0
  30. data/tracks/go/exercises/reverse-string/reverse_string_test.go +25 -0
  31. data/tracks/haskell/exercises/bob/README.md +2 -0
  32. data/tracks/haskell/exercises/bob/examples/success-standard/src/Bob.hs +7 -3
  33. data/tracks/haskell/exercises/bob/package.yaml +1 -1
  34. data/tracks/haskell/exercises/bob/test/Tests.hs +1 -1
  35. data/tracks/haskell/exercises/isbn-verifier/README.md +25 -20
  36. data/tracks/haskell/exercises/pov/README.md +0 -2
  37. data/tracks/haskell/exercises/secret-handshake/README.md +1 -1
  38. data/tracks/haskell/exercises/simple-cipher/README.md +4 -6
  39. data/tracks/java/config.json +12 -0
  40. data/tracks/java/exercises/beer-song/README.md +1 -1
  41. data/tracks/java/exercises/house/README.md +1 -1
  42. data/tracks/java/exercises/isbn-verifier/README.md +27 -21
  43. data/tracks/java/exercises/kindergarten-garden/README.md +3 -3
  44. data/tracks/java/exercises/meetup/README.md +16 -12
  45. data/tracks/java/exercises/nucleotide-count/README.md +2 -2
  46. data/tracks/java/exercises/palindrome-products/README.md +1 -1
  47. data/tracks/java/exercises/parallel-letter-frequency/.meta/HINTS.md +3 -0
  48. data/tracks/java/exercises/parallel-letter-frequency/.meta/src/reference/java/ParallelLetterFrequency.java +45 -0
  49. data/tracks/java/exercises/parallel-letter-frequency/README.md +30 -0
  50. data/tracks/java/exercises/parallel-letter-frequency/build.gradle +18 -0
  51. data/tracks/java/exercises/parallel-letter-frequency/src/main/java/.keep +0 -0
  52. data/tracks/java/exercises/parallel-letter-frequency/src/test/java/ParallelLetterFrequencyTest.java +235 -0
  53. data/tracks/java/exercises/pig-latin/README.md +1 -0
  54. data/tracks/java/exercises/protein-translation/README.md +4 -2
  55. data/tracks/java/exercises/rectangles/README.md +9 -9
  56. data/tracks/java/exercises/settings.gradle +1 -0
  57. data/tracks/java/exercises/simple-cipher/README.md +4 -6
  58. data/tracks/java/exercises/sum-of-multiples/README.md +3 -3
  59. data/tracks/objective-c/config.json +11 -0
  60. data/tracks/objective-c/exercises/two-fer/TwoFerExample.h +15 -0
  61. data/tracks/objective-c/exercises/two-fer/TwoFerExample.m +21 -0
  62. data/tracks/objective-c/exercises/two-fer/TwoFerTest.m +31 -0
  63. data/tracks/objective-c/xcodeProject/ObjectiveC.xcodeproj/project.pbxproj +18 -0
  64. data/tracks/rust/exercises/bob/Cargo.toml +1 -1
  65. data/tracks/rust/exercises/bob/README.md +2 -0
  66. data/tracks/rust/exercises/bob/example.rs +1 -0
  67. data/tracks/rust/exercises/bob/tests/bob.rs +1 -1
  68. data/tracks/rust/exercises/isbn-verifier/README.md +25 -20
  69. data/tracks/typescript/config.json +13 -0
  70. data/tracks/typescript/exercises/atbash-cipher/README.md +60 -0
  71. data/tracks/typescript/exercises/atbash-cipher/atbash-cipher.example.ts +32 -0
  72. data/tracks/typescript/exercises/atbash-cipher/atbash-cipher.test.ts +73 -0
  73. data/tracks/typescript/exercises/atbash-cipher/atbash-cipher.ts +0 -0
  74. data/tracks/typescript/exercises/atbash-cipher/package.json +36 -0
  75. data/tracks/typescript/exercises/atbash-cipher/tsconfig.json +22 -0
  76. data/tracks/typescript/exercises/atbash-cipher/tslint.json +127 -0
  77. data/tracks/typescript/exercises/atbash-cipher/yarn.lock +2624 -0
  78. metadata +31 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 80d9ad73937e82f0b192f04c668850da9e314fbc
4
- data.tar.gz: 3eb23d8619d0d5c8059a1793d64e8b482e7dea52
3
+ metadata.gz: 79799be12a69e3d773b971560233cbce02723e65
4
+ data.tar.gz: 512eaf42a3697418bbf9b0b872cd7b66d6142918
5
5
  SHA512:
6
- metadata.gz: 5edf73f1a9cb08b3bb438651bc1752af1bd024b59af89ce6f780b5fd068574a56e2de7825e1d10eebc0284bf0109408c1538ea1bc97cbd633497f137a80c9810
7
- data.tar.gz: 02a9704e07f1cdbd57c72b4b33cfd7838ecbe42f8d8bff1cbd0a580b07d81c003b5a1c214429b95190b787f8c65f82c1e04191f62979d16bb4b1e794817d7e8c
6
+ metadata.gz: ae84f0368ddd212bbc239e085a287c0eed76361561cbc05b755f1c26b86a4e8cd3b8970ee516d78648a0690b85d506cbea78537a181c5ed6101889b8f4386fc2
7
+ data.tar.gz: fc4764ba08a8a4b6abf351ef4200fae2ef9790334baad16274f77540c99396b736dc91626b225e27964d8c59bce6be6ba182d3134bedbc2597f486f7b5cb6985
@@ -1,3 +1,3 @@
1
1
  module Trackler
2
- VERSION = "2.2.1.75"
2
+ VERSION = "2.2.1.76"
3
3
  end
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "exercise": "alphametics",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "cases": [
5
5
  {
6
6
  "description": "Solve the alphametics puzzle",
@@ -96,6 +96,23 @@
96
96
  "S": 6,
97
97
  "T": 9
98
98
  }
99
+ },
100
+ {
101
+ "description": "puzzle with ten letters and 41 addends",
102
+ "property": "solve",
103
+ "puzzle": "THIS + A + FIRE + THEREFORE + FOR + ALL + HISTORIES + I + TELL + A + TALE + THAT + FALSIFIES + ITS + TITLE + TIS + A + LIE + THE + TALE + OF + THE + LAST + FIRE + HORSES + LATE + AFTER + THE + FIRST + FATHERS + FORESEE + THE + HORRORS + THE + LAST + FREE + TROLL + TERRIFIES + THE + HORSES + OF + FIRE + THE + TROLL + RESTS + AT + THE + HOLE + OF + LOSSES + IT + IS + THERE + THAT + SHE + STORES + ROLES + OF + LEATHERS + AFTER + SHE + SATISFIES + HER + HATE + OFF + THOSE + FEARS + A + TASTE + RISES + AS + SHE + HEARS + THE + LEAST + FAR + HORSE + THOSE + FAST + HORSES + THAT + FIRST + HEAR + THE + TROLL + FLEE + OFF + TO + THE + FOREST + THE + HORSES + THAT + ALERTS + RAISE + THE + STARES + OF + THE + OTHERS + AS + THE + TROLL + ASSAILS + AT + THE + TOTAL + SHIFT + HER + TEETH + TEAR + HOOF + OFF + TORSO + AS + THE + LAST + HORSE + FORFEITS + ITS + LIFE + THE + FIRST + FATHERS + HEAR + OF + THE + HORRORS + THEIR + FEARS + THAT + THE + FIRES + FOR + THEIR + FEASTS + ARREST + AS + THE + FIRST + FATHERS + RESETTLE + THE + LAST + OF + THE + FIRE + HORSES + THE + LAST + TROLL + HARASSES + THE + FOREST + HEART + FREE + AT + LAST + OF + THE + LAST + TROLL + ALL + OFFER + THEIR + FIRE + HEAT + TO + THE + ASSISTERS + FAR + OFF + THE + TROLL + FASTS + ITS + LIFE + SHORTER + AS + STARS + RISE + THE + HORSES + REST + SAFE + AFTER + ALL + SHARE + HOT + FISH + AS + THEIR + AFFILIATES + TAILOR + A + ROOFS + FOR + THEIR + SAFE == FORTRESSES",
104
+ "expected": {
105
+ "A": 1,
106
+ "E": 0,
107
+ "F": 5,
108
+ "H": 8,
109
+ "I": 7,
110
+ "L": 2,
111
+ "O": 6,
112
+ "R": 3,
113
+ "S": 4,
114
+ "T": 9
115
+ }
99
116
  }
100
117
  ]
101
118
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "exercise": "anagram",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "comments": [
5
5
  "The string argument cases possible matches are passed in as",
6
6
  "individual arguments rather than arrays. Languages can include",
@@ -11,119 +11,152 @@
11
11
  {
12
12
  "description": "no matches",
13
13
  "property": "anagrams",
14
- "subject": "diaper",
15
- "candidates": ["hello", "world", "zombies", "pants"],
14
+ "input": {
15
+ "subject": "diaper",
16
+ "candidates": ["hello", "world", "zombies", "pants"]
17
+ },
16
18
  "expected": []
17
19
  },
18
20
  {
19
21
  "description": "detects simple anagram",
20
22
  "property": "anagrams",
21
- "subject": "ant",
22
- "candidates": ["tan", "stand", "at"],
23
+ "input": {
24
+ "subject": "ant",
25
+ "candidates": ["tan", "stand", "at"]
26
+ },
23
27
  "expected": ["tan"]
24
28
  },
25
29
  {
26
30
  "description": "does not detect false positives",
27
31
  "property": "anagrams",
28
- "subject": "galea",
29
- "candidates": ["eagle"],
32
+ "input": {
33
+ "subject": "galea",
34
+ "candidates": ["eagle"]
35
+ },
30
36
  "expected": []
31
37
  },
32
38
  {
33
39
  "description": "detects two anagrams",
34
40
  "property": "anagrams",
35
- "subject": "master",
36
- "candidates": ["stream", "pigeon", "maters"],
41
+ "input": {
42
+ "subject": "master",
43
+ "candidates": ["stream", "pigeon", "maters"]
44
+ },
37
45
  "expected": ["stream", "maters"]
38
46
  },
39
47
  {
40
48
  "description": "does not detect anagram subsets",
41
49
  "property": "anagrams",
42
- "subject": "good",
43
- "candidates": ["dog", "goody"],
50
+ "input": {
51
+ "subject": "good",
52
+ "candidates": ["dog", "goody"]
53
+ },
44
54
  "expected": []
45
55
  },
46
56
  {
47
57
  "description": "detects anagram",
48
58
  "property": "anagrams",
49
- "subject": "listen",
50
- "candidates": ["enlists", "google", "inlets", "banana"],
59
+ "input": {
60
+ "subject": "listen",
61
+ "candidates": ["enlists", "google", "inlets", "banana"]
62
+ },
51
63
  "expected": ["inlets"]
52
64
  },
53
65
  {
54
66
  "description": "detects three anagrams",
55
67
  "property": "anagrams",
56
- "subject": "allergy",
57
- "candidates": [ "gallery",
58
- "ballerina",
59
- "regally",
60
- "clergy",
61
- "largely",
62
- "leading"
63
- ],
68
+ "input": {
69
+ "subject": "allergy",
70
+ "candidates": [
71
+ "gallery",
72
+ "ballerina",
73
+ "regally",
74
+ "clergy",
75
+ "largely",
76
+ "leading"
77
+ ]
78
+ },
64
79
  "expected": ["gallery", "regally", "largely"]
65
80
  },
66
81
  {
67
82
  "description": "does not detect identical words",
68
83
  "property": "anagrams",
69
- "subject": "corn",
70
- "candidates": ["corn", "dark", "Corn", "rank", "CORN", "cron", "park"],
84
+ "input": {
85
+ "subject": "corn",
86
+ "candidates": ["corn", "dark", "Corn", "rank", "CORN", "cron", "park"]
87
+ },
71
88
  "expected": ["cron"]
72
89
  },
73
90
  {
74
91
  "description": "does not detect non-anagrams with identical checksum",
75
92
  "property": "anagrams",
76
- "subject": "mass",
77
- "candidates": ["last"],
93
+ "input": {
94
+ "subject": "mass",
95
+ "candidates": ["last"]
96
+ },
78
97
  "expected": []
79
98
  },
80
99
  {
81
100
  "description": "detects anagrams case-insensitively",
82
101
  "property": "anagrams",
83
- "subject": "Orchestra",
84
- "candidates": ["cashregister", "Carthorse", "radishes"],
102
+ "input": {
103
+ "subject": "Orchestra",
104
+ "candidates": ["cashregister", "Carthorse", "radishes"]
105
+ },
85
106
  "expected": ["Carthorse"]
86
107
  },
87
108
  {
88
109
  "description": "detects anagrams using case-insensitive subject",
89
110
  "property": "anagrams",
90
- "subject": "Orchestra",
91
- "candidates": ["cashregister", "carthorse", "radishes"],
111
+ "input": {
112
+ "subject": "Orchestra",
113
+ "candidates": ["cashregister", "carthorse", "radishes"]
114
+ },
92
115
  "expected": ["carthorse"]
93
116
  },
94
117
  {
95
118
  "description": "detects anagrams using case-insensitive possible matches",
96
119
  "property": "anagrams",
97
- "subject": "orchestra",
98
- "candidates": ["cashregister", "Carthorse", "radishes"],
120
+ "input": {
121
+ "subject": "orchestra",
122
+ "candidates": ["cashregister", "Carthorse", "radishes"]
123
+ },
99
124
  "expected": ["Carthorse"]
100
125
  },
101
126
  {
102
127
  "description": "does not detect a word as its own anagram",
103
128
  "property": "anagrams",
104
- "subject": "banana",
105
- "candidates": ["Banana"],
129
+ "input": {
130
+ "subject": "banana",
131
+ "candidates": ["Banana"]
132
+ },
106
133
  "expected": []
107
134
  },
108
135
  {
109
136
  "description": "does not detect a anagram if the original word is repeated",
110
137
  "property": "anagrams",
111
- "subject": "go",
112
- "candidates": ["go Go GO"],
138
+ "input": {
139
+ "subject": "go",
140
+ "candidates": ["go Go GO"]
141
+ },
113
142
  "expected": []
114
143
  },
115
144
  {
116
145
  "description": "anagrams must use all letters exactly once",
117
146
  "property": "anagrams",
118
- "subject": "tapper",
119
- "candidates": ["patter"],
147
+ "input": {
148
+ "subject": "tapper",
149
+ "candidates": ["patter"]
150
+ },
120
151
  "expected": []
121
152
  },
122
153
  {
123
154
  "description": "capital word is not own anagram",
124
155
  "property": "anagrams",
125
- "subject": "BANANA",
126
- "candidates": ["Banana"],
156
+ "input": {
157
+ "subject": "BANANA",
158
+ "candidates": ["Banana"]
159
+ },
127
160
  "expected": []
128
161
  }
129
162
  ]
@@ -1,95 +1,125 @@
1
1
  {
2
2
  "exercise": "binary",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "cases": [
5
5
  {
6
6
  "description": "binary 0 is decimal 0",
7
7
  "property": "decimal",
8
- "binary": "0",
8
+ "input": {
9
+ "binary": "0"
10
+ },
9
11
  "expected": 0
10
12
  },
11
13
  {
12
14
  "description": "binary 1 is decimal 1",
13
15
  "property": "decimal",
14
- "binary": "1",
16
+ "input": {
17
+ "binary": "1"
18
+ },
15
19
  "expected": 1
16
20
  },
17
21
  {
18
22
  "description": "binary 10 is decimal 2",
19
23
  "property": "decimal",
20
- "binary": "10",
24
+ "input": {
25
+ "binary": "10"
26
+ },
21
27
  "expected": 2
22
28
  },
23
29
  {
24
30
  "description": "binary 11 is decimal 3",
25
31
  "property": "decimal",
26
- "binary": "11",
32
+ "input": {
33
+ "binary": "11"
34
+ },
27
35
  "expected": 3
28
36
  },
29
37
  {
30
38
  "description": "binary 100 is decimal 4",
31
39
  "property": "decimal",
32
- "binary": "100",
40
+ "input": {
41
+ "binary": "100"
42
+ },
33
43
  "expected": 4
34
44
  },
35
45
  {
36
46
  "description": "binary 1001 is decimal 9",
37
47
  "property": "decimal",
38
- "binary": "1001",
48
+ "input": {
49
+ "binary": "1001"
50
+ },
39
51
  "expected": 9
40
52
  },
41
53
  {
42
54
  "description": "binary 11010 is decimal 26",
43
55
  "property": "decimal",
44
- "binary": "11010",
56
+ "input": {
57
+ "binary": "11010"
58
+ },
45
59
  "expected": 26
46
60
  },
47
61
  {
48
62
  "description": "binary 10001101000 is decimal 1128",
49
63
  "property": "decimal",
50
- "binary": "10001101000",
64
+ "input": {
65
+ "binary": "10001101000"
66
+ },
51
67
  "expected": 1128
52
68
  },
53
69
  {
54
70
  "description": "binary ignores leading zeros",
55
71
  "property": "decimal",
56
- "binary": "000011111",
72
+ "input": {
73
+ "binary": "000011111"
74
+ },
57
75
  "expected": 31
58
76
  },
59
77
  {
60
78
  "description": "2 is not a valid binary digit",
61
79
  "property": "decimal",
62
- "binary": "2",
80
+ "input": {
81
+ "binary": "2"
82
+ },
63
83
  "expected": null
64
84
  },
65
85
  {
66
86
  "description": "a number containing a non-binary digit is invalid",
67
87
  "property": "decimal",
68
- "binary": "01201",
88
+ "input": {
89
+ "binary": "01201"
90
+ },
69
91
  "expected": null
70
92
  },
71
93
  {
72
94
  "description": "a number with trailing non-binary characters is invalid",
73
95
  "property": "decimal",
74
- "binary": "10nope",
96
+ "input": {
97
+ "binary": "10nope"
98
+ },
75
99
  "expected": null
76
100
  },
77
101
  {
78
102
  "description": "a number with leading non-binary characters is invalid",
79
103
  "property": "decimal",
80
- "binary": "nope10",
104
+ "input": {
105
+ "binary": "nope10"
106
+ },
81
107
  "expected": null
82
108
  },
83
109
  {
84
110
  "description": "a number with internal non-binary characters is invalid",
85
111
  "property": "decimal",
86
- "binary": "10nope10",
112
+ "input": {
113
+ "binary": "10nope10"
114
+ },
87
115
  "expected": null
88
116
  },
89
117
  {
90
- "description": "a number and a word whitespace spearated is invalid",
118
+ "description": "a number and a word whitespace separated is invalid",
91
119
  "property": "decimal",
92
- "binary": "001 nope",
120
+ "input": {
121
+ "binary": "001 nope"
122
+ },
93
123
  "expected": null
94
124
  }
95
125
  ]
@@ -0,0 +1,11 @@
1
+ (ns beer-song)
2
+
3
+ (defn verse
4
+ "Returns the nth verse of the song."
5
+ [n])
6
+
7
+ (defn sing
8
+ "Given a start and an optional end, returns all verses in this interval. If
9
+ end is not given, the whole song from start is sung."
10
+ ([start])
11
+ ([start end]))
@@ -42,6 +42,16 @@
42
42
 
43
43
  ]
44
44
  },
45
+ {
46
+ "uuid": "63259a44-cdec-4e25-ab0e-eddc6f9a9ca1",
47
+ "slug": "raindrops",
48
+ "core": false,
49
+ "unlocked_by": null,
50
+ "difficulty": 1,
51
+ "topics": [
52
+
53
+ ]
54
+ },
45
55
  {
46
56
  "uuid": "8e9a98b1-bf4f-4c94-a258-a8618cc37f55",
47
57
  "slug": "rna-transcription",
@@ -0,0 +1,67 @@
1
+ # Raindrops
2
+
3
+ Convert a number to a string, the contents of which depend on the number's factors.
4
+
5
+ - If the number has 3 as a factor, output 'Pling'.
6
+ - If the number has 5 as a factor, output 'Plang'.
7
+ - If the number has 7 as a factor, output 'Plong'.
8
+ - If the number does not have 3, 5, or 7 as a factor,
9
+ just pass the number's digits straight through.
10
+
11
+ ## Examples
12
+
13
+ - 28's factors are 1, 2, 4, **7**, 14, 28.
14
+ - In raindrop-speak, this would be a simple "Plong".
15
+ - 30's factors are 1, 2, **3**, **5**, 6, 10, 15, 30.
16
+ - In raindrop-speak, this would be a "PlingPlang".
17
+ - 34 has four factors: 1, 2, 17, and 34.
18
+ - In raindrop-speak, this would be "34".
19
+
20
+ ## Running tests
21
+
22
+ In order to run the tests, issue the following command from the exercise
23
+ directory:
24
+
25
+ For running the tests provided, `rebar3` is used as it is the official build and
26
+ dependency management tool for erlang now. Please refer to [the tracks installation
27
+ instructions](http://exercism.io/languages/erlang/installation) on how to do that.
28
+
29
+ In order to run the tests, you can issue the following command from the exercise
30
+ directory.
31
+
32
+ ```bash
33
+ $ rebar3 eunit
34
+ ```
35
+
36
+ ### Test versioning
37
+
38
+ Each problem defines a macro `TEST_VERSION` in the test file and
39
+ verifies that the solution defines and exports a function `test_version`
40
+ returning that same value.
41
+
42
+ To make tests pass, add the following to your solution:
43
+
44
+ ```erlang
45
+ -export([test_version/0]).
46
+
47
+ test_version() ->
48
+ 1.
49
+ ```
50
+
51
+ The benefit of this is that reviewers can see against which test version
52
+ an iteration was written if, for example, a previously posted solution
53
+ does not solve the current problem or passes current tests.
54
+
55
+ ## Questions?
56
+
57
+ For detailed information about the Erlang track, please refer to the
58
+ [help page](http://exercism.io/languages/erlang) on the Exercism site.
59
+ This covers the basic information on setting up the development
60
+ environment expected by the exercises.
61
+
62
+ ## Source
63
+
64
+ A variation on a famous interview question intended to weed out potential candidates from [JumpstartLab](http://jumpstartlab.com).
65
+
66
+ ## Submitting Incomplete Solutions
67
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.