trackler 2.2.1.75 → 2.2.1.76

Sign up to get free protection for your applications and to get access to all the features.
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.