trackler 2.2.1.51 → 2.2.1.52

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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/saddle-points/description.md +1 -1
  4. data/tracks/cfml/.gitattributes +19 -0
  5. data/tracks/cfml/config.json +180 -186
  6. data/tracks/cfml/tasks/FormatConfig.cfc +26 -0
  7. data/tracks/cfml/tasks/ScaffoldExercise.cfc +1 -1
  8. data/tracks/common-lisp/config.json +26 -9
  9. data/tracks/common-lisp/exercises/acronym/README.md +61 -0
  10. data/tracks/common-lisp/exercises/acronym/acronym-test.lisp +48 -0
  11. data/tracks/common-lisp/exercises/acronym/acronym.lisp +6 -0
  12. data/tracks/common-lisp/exercises/acronym/example.lisp +24 -0
  13. data/tracks/common-lisp/exercises/isogram/README.md +65 -0
  14. data/tracks/common-lisp/exercises/isogram/example.lisp +18 -0
  15. data/tracks/common-lisp/exercises/isogram/isogram-test.lisp +39 -0
  16. data/tracks/common-lisp/exercises/isogram/isogram.lisp +8 -0
  17. data/tracks/delphi/exercises/etl/README.md +1 -1
  18. data/tracks/delphi/exercises/rna-transcription/README.md +1 -1
  19. data/tracks/delphi/exercises/saddle-points/README.md +1 -1
  20. data/tracks/fsharp/exercises/all-your-base/AllYourBaseTest.fs +21 -21
  21. data/tracks/fsharp/exercises/kindergarten-garden/Example.fs +13 -14
  22. data/tracks/fsharp/exercises/kindergarten-garden/KindergartenGarden.fs +1 -3
  23. data/tracks/fsharp/exercises/kindergarten-garden/KindergartenGardenTest.fs +9 -41
  24. data/tracks/fsharp/exercises/phone-number/PhoneNumberTest.fs +12 -12
  25. data/tracks/fsharp/exercises/rna-transcription/RnaTranscriptionTest.fs +8 -8
  26. data/tracks/fsharp/exercises/robot-simulator/RobotSimulator.fs +3 -0
  27. data/tracks/fsharp/exercises/robot-simulator/RobotSimulatorTest.fs +129 -26
  28. data/tracks/fsharp/generators/Common.fs +10 -0
  29. data/tracks/fsharp/generators/Exercise.fs +5 -1
  30. data/tracks/fsharp/generators/Generators.fs +122 -33
  31. data/tracks/fsharp/generators/Output.fs +6 -1
  32. data/tracks/haskell/exercises/crypto-square/README.md +6 -4
  33. data/tracks/haskell/exercises/kindergarten-garden/README.md +10 -10
  34. data/tracks/haskell/exercises/saddle-points/README.md +1 -1
  35. data/tracks/haskell/exercises/space-age/README.md +1 -1
  36. data/tracks/java/config.json +8 -2
  37. data/tracks/java/exercises/queen-attack/.meta/src/reference/java/BoardCoordinate.java +12 -12
  38. data/tracks/java/exercises/queen-attack/.meta/src/reference/java/QueenAttackCalculator.java +14 -14
  39. data/tracks/java/exercises/queen-attack/.meta/version +1 -1
  40. data/tracks/java/exercises/queen-attack/src/test/java/QueenAttackCalculatorTest.java +11 -11
  41. data/tracks/javascript/exercises/prime-factors/example.js +10 -9
  42. data/tracks/julia/config.json +12 -0
  43. data/tracks/julia/exercises/run-length-encoding/README.md +31 -0
  44. data/tracks/julia/exercises/run-length-encoding/example.jl +22 -0
  45. data/tracks/julia/exercises/run-length-encoding/run-length-encoding.jl +7 -0
  46. data/tracks/julia/exercises/run-length-encoding/runtests.jl +29 -0
  47. data/tracks/objective-c/README.md +79 -1
  48. data/tracks/ocaml/config.json +430 -433
  49. data/tracks/ocaml/config/maintainers.json +11 -11
  50. data/tracks/php/config.json +16 -0
  51. data/tracks/php/exercises/all-your-base/README.md +31 -0
  52. data/tracks/php/exercises/all-your-base/all-your-base_test.php +135 -0
  53. data/tracks/php/exercises/all-your-base/example.php +27 -0
  54. data/tracks/php/exercises/series/README.md +21 -0
  55. data/tracks/php/exercises/series/example.php +15 -0
  56. data/tracks/php/exercises/series/series_test.php +64 -0
  57. data/tracks/python/README.md +1 -1
  58. data/tracks/python/config.json +4 -1
  59. data/tracks/python/exercises/forth/forth.py +4 -0
  60. data/tracks/python/exercises/forth/forth_test.py +1 -1
  61. data/tracks/python/exercises/markdown/example.py +1 -1
  62. data/tracks/python/exercises/markdown/markdown_test.py +3 -3
  63. data/tracks/ruby/exercises/two-bucket/.meta/.version +1 -1
  64. data/tracks/ruby/exercises/two-bucket/.meta/solutions/two_bucket.rb +23 -3
  65. data/tracks/ruby/exercises/two-bucket/two_bucket_test.rb +4 -4
  66. metadata +22 -2
@@ -1 +1 @@
1
- 1.0.0
1
+ 2.0.0
@@ -12,7 +12,7 @@ public class QueenAttackCalculatorTest {
12
12
  public ExpectedException expectedException = ExpectedException.none();
13
13
 
14
14
  @Test
15
- public void testQueensThatDoNotShareRankFileOrDiagonalCannotAttack() {
15
+ public void testQueensThatDoNotShareRowColumnOrDiagonalCannotAttack() {
16
16
  final QueenAttackCalculator calculator
17
17
  = new QueenAttackCalculator(new BoardCoordinate(2, 4), new BoardCoordinate(6, 6));
18
18
 
@@ -21,7 +21,7 @@ public class QueenAttackCalculatorTest {
21
21
 
22
22
  @Ignore("Remove to run test")
23
23
  @Test
24
- public void testQueensCanAttackOnTheSameRank() {
24
+ public void testQueensCanAttackOnTheSameRow() {
25
25
  final QueenAttackCalculator calculator
26
26
  = new QueenAttackCalculator(new BoardCoordinate(2, 4), new BoardCoordinate(2, 6));
27
27
 
@@ -30,7 +30,7 @@ public class QueenAttackCalculatorTest {
30
30
 
31
31
  @Ignore("Remove to run test")
32
32
  @Test
33
- public void testQueensCanAttackOnTheSameFile() {
33
+ public void testQueensCanAttackOnTheSameColumn() {
34
34
  final QueenAttackCalculator calculator
35
35
  = new QueenAttackCalculator(new BoardCoordinate(4, 5), new BoardCoordinate(2, 5));
36
36
 
@@ -75,36 +75,36 @@ public class QueenAttackCalculatorTest {
75
75
 
76
76
  @Ignore("Remove to run test")
77
77
  @Test
78
- public void testCoordinateWithNegativeRankNotAllowed() {
78
+ public void testCoordinateWithNegativeRowNotAllowed() {
79
79
  expectedException.expect(IllegalArgumentException.class);
80
- expectedException.expectMessage("Coordinate must have positive rank.");
80
+ expectedException.expectMessage("Coordinate must have positive row.");
81
81
 
82
82
  new BoardCoordinate(-2, 2);
83
83
  }
84
84
 
85
85
  @Ignore("Remove to run test")
86
86
  @Test
87
- public void testCoordinateWithRankGreaterThan7NotAllowed() {
87
+ public void testCoordinateWithRowGreaterThan7NotAllowed() {
88
88
  expectedException.expect(IllegalArgumentException.class);
89
- expectedException.expectMessage("Coordinate must have rank <= 7.");
89
+ expectedException.expectMessage("Coordinate must have row <= 7.");
90
90
 
91
91
  new BoardCoordinate(8, 4);
92
92
  }
93
93
 
94
94
  @Ignore("Remove to run test")
95
95
  @Test
96
- public void testCoordinateWithNegativeFileNotAllowed() {
96
+ public void testCoordinateWithNegativeColumnNotAllowed() {
97
97
  expectedException.expect(IllegalArgumentException.class);
98
- expectedException.expectMessage("Coordinate must have positive file.");
98
+ expectedException.expectMessage("Coordinate must have positive column.");
99
99
 
100
100
  new BoardCoordinate(2, -2);
101
101
  }
102
102
 
103
103
  @Ignore("Remove to run test")
104
104
  @Test
105
- public void testCoordinateWithFileGreaterThan7NotAllowed() {
105
+ public void testCoordinateWithColumnGreaterThan7NotAllowed() {
106
106
  expectedException.expect(IllegalArgumentException.class);
107
- expectedException.expectMessage("Coordinate must have file <= 7.");
107
+ expectedException.expectMessage("Coordinate must have column <= 7.");
108
108
 
109
109
  new BoardCoordinate(4, 8);
110
110
  }
@@ -1,15 +1,16 @@
1
1
  'use strict';
2
2
 
3
3
  exports.for = function (n) {
4
- var prime_factors = [];
5
- var possible_factor = 2;
6
- while (possible_factor * possible_factor <= n) {
7
- while (n % possible_factor === 0) {
8
- prime_factors.push(possible_factor);
9
- n /= possible_factor;
4
+ var primeFactors = [];
5
+ var possibleFactor = 2;
6
+ var number = n;
7
+ while (possibleFactor * possibleFactor <= number) {
8
+ while (number % possibleFactor === 0) {
9
+ primeFactors.push(possibleFactor);
10
+ number /= possibleFactor;
10
11
  }
11
- possible_factor += 1;
12
+ possibleFactor += 1;
12
13
  }
13
- if (n > 1) { prime_factors.push(n); }
14
- return prime_factors;
14
+ if (number > 1) { primeFactors.push(number); }
15
+ return primeFactors;
15
16
  };
@@ -73,6 +73,18 @@
73
73
  "control-flow (if-else statements)"
74
74
  ]
75
75
  },
76
+ {
77
+ "uuid": "3f9e4679-069c-3080-c2a9-f6a6c5795b4e0a27377",
78
+ "slug": "run-length-encoding",
79
+ "core": false,
80
+ "unlocked_by": "nucleotide-count",
81
+ "difficulty": 1,
82
+ "topics": [
83
+ "strings",
84
+ "algorithms",
85
+ "text_formatting"
86
+ ]
87
+ },
76
88
  {
77
89
  "uuid": "4bc9a4f8-fc4d-4e6b-a93c-07069bbc5bc9",
78
90
  "slug": "pangram",
@@ -0,0 +1,31 @@
1
+ # Run Length Encoding
2
+
3
+ Implement run-length encoding and decoding.
4
+
5
+ Run-length encoding (RLE) is a simple form of data compression, where runs
6
+ (consecutive data elements) are replaced by just one data value and count.
7
+
8
+ For example we can represent the original 53 characters with only 13.
9
+
10
+ ```text
11
+ "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB" -> "12WB12W3B24WB"
12
+ ```
13
+
14
+ RLE allows the original data to be perfectly reconstructed from
15
+ the compressed data, which makes it a lossless data compression.
16
+
17
+ ```text
18
+ "AABCCCDEEEE" -> "2AB3CD4E" -> "AABCCCDEEEE"
19
+ ```
20
+
21
+ For simplicity, you can assume that the unencoded string will only contain
22
+ the letters A through Z (either lower or upper case) and whitespace. This way
23
+ data to be encoded will never contain any numbers and numbers inside data to
24
+ be decoded always represent the count for the following character.
25
+ ## Source
26
+
27
+ Wikipedia [https://en.wikipedia.org/wiki/Run-length_encoding](https://en.wikipedia.org/wiki/Run-length_encoding)
28
+
29
+
30
+ ## Submitting Incomplete Solutions
31
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -0,0 +1,22 @@
1
+ function encode(s)
2
+ (length(s) == 0) && (return s)
3
+
4
+ count = 0
5
+ for char in s
6
+ (char == s[1]) ? (count += 1) : break
7
+ end
8
+ count_str = (count == 1) ? "" : dec(count)
9
+ return string(count_str, s[1], encode(s[count + 1 : end]))
10
+ end
11
+
12
+
13
+
14
+ function decode(s)
15
+ function expand(count_str, char)
16
+ count = (count_str == "") ? 1 : parse(Int, count_str)
17
+ return char ^ count
18
+ end
19
+
20
+ result = ""
21
+ return string((expand(rm.captures...) for rm in eachmatch(r"(\d*)(\D)", s))...)
22
+ end
@@ -0,0 +1,7 @@
1
+ function encode(s)
2
+ end
3
+
4
+
5
+
6
+ function decode(s)
7
+ end
@@ -0,0 +1,29 @@
1
+ using Base.Test
2
+
3
+ include("run-length-encoding.jl")
4
+
5
+
6
+ # Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0
7
+ # Encode and decode the strings under the given specifications.
8
+
9
+ @testset "encode strings" begin
10
+ @test encode("") == ""
11
+ @test encode("XYZ") == "XYZ"
12
+ @test encode("AABBBCCCC") == "2A3B4C"
13
+ @test encode("WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB") == "12WB12W3B24WB"
14
+ @test encode("aabbbcccc") == "2a3b4c"
15
+ @test encode(" hsqq qww ") == "2 hs2q q2w2 "
16
+ end
17
+
18
+ @testset "decode strings" begin
19
+ @test decode("") == ""
20
+ @test decode("XYZ") == "XYZ"
21
+ @test decode("2A3B4C") == "AABBBCCCC"
22
+ @test decode("12WB12W3B24WB") == "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB"
23
+ @test decode("2a3b4c") == "aabbbcccc"
24
+ @test decode("2 hs2q q2w2 ") == " hsqq qww "
25
+ end
26
+
27
+ @testset "encode then decode" begin
28
+ @test decode(encode("zzz ZZ zZ")) == "zzz ZZ zZ"
29
+ end
@@ -2,7 +2,85 @@
2
2
 
3
3
  Exercism exercises in Objective-C
4
4
 
5
- ## Contributing Guide
5
+ ## Try it!
6
+ If you've downloaded the [command-line client](http://exercism.io/clients/cli) and have Objective-C installed on your machine, then go ahead and fetch the first problem.
7
+
8
+ ```bash
9
+ exercism fetch objective-c
10
+ ```
11
+
12
+ In order to be able to submit your solution, you'll need to configure the client with your [Exercism API key](http://exercism.io/account/key).
13
+ ```bash
14
+ exercism configure --key=YOUR_EXERCISM_KEY
15
+ ```
16
+
17
+ When you've written a solution, submit it to the site. You'll have to configure the command-line client with your exercism API key before you can submit.
18
+
19
+ ```bash
20
+ exercism submit PATH_TO_FILE
21
+ ```
22
+
23
+ ## Running the tests
24
+ Exercism will only download a test file. You will need to manually create the header and the source file associated with the exercise. You will need to generate an Xcode Project file with the test file, the header file (.h) and the source file (.m). Alternatively, you can use a test runner utility that's described below.
25
+
26
+ ### Creating the project in XCode
27
+ - Start Xcode and create a new project.
28
+ - Select OS X > Application and then Command Line Tool.
29
+ - Click Next and give it a project name using the ExerciseName is advised.
30
+ - Click Next and save the project in exercism's exercise directory.
31
+ - Now that the project is created click on Editor > Add Target.
32
+ - Select OS X > Test and select OS X Unit Testing Bundle.
33
+ - Name the target ExerciseName Tests.
34
+ - In the left pane (known as the navigator), open the Project navigator and expand the folder ExerciseName Tests and open the file ExerciseName_Tests.m.
35
+ - Replace its contents with the test file you got from exercism.
36
+ - In that file, replace all instances of "test_suite" with "ExerciseName_Tests".
37
+ - Navigate to the File Template library in the right pane (or use CTRL+OPTION+CMD+1) and drag the Cocoa Class template into the ExerciseName_Tests folder in the Project navigator.
38
+ - Name it ExerciseName and select ExerciseName Tests as its target.
39
+ - You will now have two new files in your ExerciseName_Tests directory: ExerciseName.h and ExerciseName.m.
40
+ - Click on your project in the Project navigator.
41
+ - Click on ExerciseName Tests in the targets list.
42
+ - Select Build Phases in the editor's navigation.
43
+ - Confirm that both your .m files are in the compile sources list.
44
+ - Use CMD+5 to navigate to the Test navigator.
45
+ - Right click the bundle named ExerciseName Tests and click Enable ExerciseName_Tests.
46
+ - Run the tests by clicking on the right pointing triangle that appears when hovering over the bundle in the Test navigator or use CMD+U.
47
+
48
+ Tests will be run through Xcode.
49
+
50
+ Note: If you receive the error "No visible `@interface` for ExerciseName declares the selector ExerciseSelector," you followed the steps correctly, but haven't written anything in your header/implementation file(s). After you declare your method in the .h file and define it in the .m file, your tests should raise more helpful errors that will lead you towards completing the exercise. Read this [primer on Objective-C Classes](http://blog.teamtreehouse.com/beginners-guide-objective-c-classes-objects) for more in-depth information.
51
+
52
+ ### Using a test runner
53
+ An alternative to manually generating the project file is to use a test runner utility written in ruby, [objc](https://rubygems.org/gems/objc/), that will create a project file for you with the test file, header file and source file.
54
+
55
+ ```bash
56
+ $ gem install objc
57
+ ```
58
+
59
+ Run the tests with
60
+ ```bash
61
+ $ objc -x ExerciseName
62
+ ```
63
+
64
+ (Note the `-x`/`--xcodebuild` flag, which specifies using `xcodebuild` instead of `xctool`. The latter does not work with Xcode's latest releases.)
65
+
66
+ The `objc` utility uses the exercise name to find the test file, ExerciseNameTest.m, the header file, ExerciseName.h and source file ExerciseName.m. The files are inserted into a temporary Xcode Project and then xcodebuild is used to run the tests for the project.
67
+
68
+ While `objc` makes it so you never have to launch Xcode to complete these exercises, the error messages and feedback through the command-line are not as clear as through the Xcode user interface.
69
+
70
+
71
+ ## Help Us Improve the Objective-C Track!
72
+
73
+ Did you find a typo in the README? Is the test suite missing an edge case? We want to know about it.
74
+
75
+ We always welcome GitHub issues and pull requests.
76
+
77
+ If you are new to open source, or are looking for an easy way in, feel free to check out the [good first patch](https://github.com/exercism/objective-c/labels/good%20first%20patch) issues.
78
+
79
+ ### Help Add More Objective-C Exercises
80
+
81
+ The easiest way to add new exercises is to translate existing exercises from other language tracks on Exercism. Here's the [full list of unimplemented exercises in Objective-C](http://exercism.io/languages/objective-c/todo) along with links to all the existing implementations.
82
+
83
+ If you have an idea for a completely new exercise, you can follow [this guide](https://github.com/exercism/docs/blob/master/you-can-help/make-up-new-exercises.md) to add it to the site.
6
84
 
7
85
  The xcode project uses [OCLint](https://github.com/oclint/homebrew-formulae).
8
86
  Please see the [contributing guide](https://github.com/exercism/x-api/blob/master/CONTRIBUTING.md#the-exercise-data)
@@ -1,435 +1,432 @@
1
1
  {
2
- "language": "OCaml",
3
- "active": true,
4
- "exercises": [{
5
- "uuid": "cda3b090-ae52-476b-a782-9cbf43953cf0",
6
- "slug": "hello-world",
7
- "core": false,
8
- "unlocked_by": null,
9
- "difficulty": 1,
10
- "topics": [
11
- "Strings",
12
- "Setting up Ocaml dev environment"
13
- ]
14
- },
15
- {
16
- "uuid": "ea5ca675-e010-470b-8030-d4f84880d799",
17
- "slug": "leap",
18
- "core": false,
19
- "unlocked_by": null,
20
- "difficulty": 1,
21
- "topics": [
22
- "Integers",
23
- "Booleans"
24
- ]
25
- },
26
- {
27
- "uuid": "bff47b0f-4555-40b7-b422-64eaa37cb2f6",
28
- "slug": "hamming",
29
- "core": false,
30
- "unlocked_by": null,
31
- "difficulty": 2,
32
- "topics": [
33
- "Iterating over two lists at once"
34
- ]
35
- },
36
- {
37
- "uuid": "dd066b62-c63e-467c-8dfb-435bcc81d532",
38
- "slug": "raindrops",
39
- "core": false,
40
- "unlocked_by": null,
41
- "difficulty": 2,
42
- "topics": [
43
-
44
- ]
45
- },
46
- {
47
- "uuid": "7fbd4282-9e69-460d-a208-dfafb1850da0",
48
- "slug": "difference-of-squares",
49
- "core": false,
50
- "unlocked_by": null,
51
- "difficulty": 2,
52
- "topics": [
53
- "Mathematics"
54
- ]
55
- },
56
- {
57
- "uuid": "bf9a0fe0-99b2-4a95-8d75-fc02d0c8433c",
58
- "slug": "rna-transcription",
59
- "core": false,
60
- "unlocked_by": null,
61
- "difficulty": 2,
62
- "topics": [
63
- "Transforming"
64
- ]
65
- },
66
- {
67
- "uuid": "0d7a23a9-31a1-4d52-afd6-887d0fc898e2",
68
- "slug": "nucleotide-count",
69
- "core": false,
70
- "unlocked_by": null,
71
- "difficulty": 2,
72
- "topics": [
73
- "Counting"
74
- ]
75
- },
76
- {
77
- "uuid": "be29288a-fcb6-4dce-acc3-be8d86e5454e",
78
- "slug": "etl",
79
- "core": false,
80
- "unlocked_by": null,
81
- "difficulty": 3,
82
- "topics": [
83
- "Transforming"
84
- ]
85
- },
86
- {
87
- "uuid": "870b1229-2f9a-4e23-bb6f-c579375ed701",
88
- "slug": "grade-school",
89
- "core": false,
90
- "unlocked_by": null,
91
- "difficulty": 3,
92
- "topics": [
93
- "Transforming"
94
- ]
95
- },
96
- {
97
- "uuid": "9bcdf9a0-acf3-4437-b0f5-071bf0cf5e02",
98
- "slug": "bob",
99
- "core": false,
100
- "unlocked_by": null,
101
- "difficulty": 3,
102
- "topics": [
103
- "Strings"
104
- ]
105
- },
106
- {
107
- "uuid": "7a3e7667-c7a2-4ba2-b448-599719f78ebc",
108
- "slug": "anagram",
109
- "core": false,
110
- "unlocked_by": null,
111
- "difficulty": 3,
112
- "topics": [
113
- "Strings"
114
- ]
115
- },
116
- {
117
- "uuid": "0621077c-b5af-4e3b-a60c-b6aaa2565224",
118
- "slug": "space-age",
119
- "core": false,
120
- "unlocked_by": null,
121
- "difficulty": 3,
122
- "topics": [
123
- "Arithmetic",
124
- "Floats"
125
- ]
126
- },
127
- {
128
- "uuid": "a43c28f4-8f5c-40f7-90cb-79689c810f95",
129
- "slug": "triangle",
130
- "core": false,
131
- "unlocked_by": null,
132
- "difficulty": 3,
133
- "topics": [
134
- "Mathematics"
135
- ]
136
- },
137
- {
138
- "uuid": "ae5a4fac-84c4-4929-b37e-b0452f761bf8",
139
- "slug": "pangram",
140
- "core": false,
141
- "unlocked_by": null,
142
- "difficulty": 3,
143
- "topics": [
144
- "Strings"
145
- ]
146
- },
147
- {
148
- "uuid": "c4550644-e67a-4bf4-98dc-78fe45b90c53",
149
- "slug": "acronym",
150
- "core": false,
151
- "unlocked_by": null,
152
- "difficulty": 3,
153
- "topics": [
154
- "Strings"
155
- ]
156
- },
157
- {
158
- "uuid": "63134efd-e383-4f00-9f97-80ae75585ca6",
159
- "slug": "all-your-base",
160
- "core": false,
161
- "unlocked_by": null,
162
- "difficulty": 4,
163
- "topics": [
164
- "Mathematics"
165
- ]
166
- },
167
- {
168
- "uuid": "9f7b9da6-afff-4d2b-862e-df1b3a0a7cef",
169
- "slug": "bracket-push",
170
- "core": false,
171
- "unlocked_by": null,
172
- "difficulty": 4,
173
- "topics": [
174
- "Stacks"
175
- ]
176
- },
177
- {
178
- "uuid": "8d21e4be-5e9c-4c73-81c5-b4ee2517d9c7",
179
- "slug": "luhn",
180
- "core": false,
181
- "unlocked_by": null,
182
- "difficulty": 4,
183
- "topics": [
184
- "Arithmetic"
185
- ]
186
- },
187
- {
188
- "uuid": "de60cf70-153d-439e-96c6-8252057c5d82",
189
- "slug": "binary-search",
190
- "core": false,
191
- "unlocked_by": null,
192
- "difficulty": 4,
193
- "topics": [
194
- "Search",
195
- "Algorithms",
196
- "Arrays"
197
- ]
198
- },
199
- {
200
- "uuid": "d9f93301-a8e8-4c90-bbff-e1ec65b435e5",
201
- "slug": "phone-number",
202
- "core": false,
203
- "unlocked_by": null,
204
- "difficulty": 4,
205
- "topics": [
206
- "Strings"
207
- ]
208
- },
209
- {
210
- "uuid": "db90c208-b8ca-4c8c-8061-b9148c80abfe",
211
- "slug": "word-count",
212
- "core": false,
213
- "unlocked_by": null,
214
- "difficulty": 4,
215
- "topics": [
216
- "Strings",
217
- "Counting"
218
- ]
219
- },
220
- {
221
- "uuid": "83c807b1-0aa4-4493-8665-6581c019a6f5",
222
- "slug": "beer-song",
223
- "core": false,
224
- "unlocked_by": null,
225
- "difficulty": 4,
226
- "topics": [
227
- "Strings"
228
- ]
229
- },
230
- {
231
- "uuid": "4281cefe-e4b4-46d4-b6bb-0086448c080f",
232
- "slug": "run-length-encoding",
233
- "core": false,
234
- "unlocked_by": null,
235
- "difficulty": 5,
236
- "topics": [
237
- "Algorithms",
238
- "Transforming"
239
- ]
240
- },
241
- {
242
- "uuid": "8f7fcaad-c588-4495-9f9e-20611187a0a5",
243
- "slug": "roman-numerals",
244
- "core": false,
245
- "unlocked_by": null,
246
- "difficulty": 5,
247
- "topics": [
248
- "Strings"
249
- ]
250
- },
251
- {
252
- "uuid": "67d4fa19-c387-47c4-9262-a6e63d5c0a19",
253
- "slug": "prime-factors",
254
- "core": false,
255
- "unlocked_by": null,
256
- "difficulty": 5,
257
- "topics": [
258
- "Mathematics",
259
- "Algorithms"
260
- ]
261
- },
262
- {
263
- "uuid": "2efe0bf3-cb17-4135-ae95-d7b5b7b61f7f",
264
- "slug": "say",
265
- "core": false,
266
- "unlocked_by": null,
267
- "difficulty": 5,
268
- "topics": [
269
- "Strings"
270
- ]
271
- },
272
- {
273
- "uuid": "8398d903-8208-4807-b735-b4cbf6976f29",
274
- "slug": "palindrome-products",
275
- "core": false,
276
- "unlocked_by": null,
277
- "difficulty": 6,
278
- "topics": [
279
- "Arithmetic"
280
- ]
281
- },
282
- {
283
- "uuid": "51f4aff9-6666-4097-a37e-e2e51fd8f286",
284
- "slug": "robot-name",
285
- "core": false,
286
- "unlocked_by": null,
287
- "difficulty": 6,
288
- "topics": [
289
- "Randomness",
290
- "Mutable state"
291
- ]
292
- },
293
- {
294
- "uuid": "202e8a9a-7a5e-486f-883b-56be298ed665",
295
- "slug": "change",
296
- "core": false,
297
- "unlocked_by": null,
298
- "difficulty": 6,
299
- "topics": [
300
- "Dynamic Programming",
301
- "Algorithms"
302
- ]
303
- },
304
- {
305
- "uuid": "ffde2a94-722a-4193-86b7-d2d591a7223d",
306
- "slug": "list-ops",
307
- "core": false,
308
- "unlocked_by": null,
309
- "difficulty": 6,
310
- "topics": [
311
- "Functional programming"
312
- ]
313
- },
314
- {
315
- "uuid": "020aa7d8-9b4b-4348-9fea-9fbaece3ac66",
316
- "slug": "atbash-cipher",
317
- "core": false,
318
- "unlocked_by": null,
319
- "difficulty": 7,
320
- "topics": [
321
- "Transforming"
322
- ]
323
- },
324
- {
325
- "uuid": "a0468f9b-55d1-45dd-9a2f-476aaf4d6c2e",
326
- "slug": "minesweeper",
327
- "core": false,
328
- "unlocked_by": null,
329
- "difficulty": 7,
330
- "topics": [
331
- "Transforming",
332
- "Arrays"
333
- ]
334
- },
335
- {
336
- "uuid": "638b24d2-5288-4fc2-a70e-a178974f030e",
337
- "slug": "bowling",
338
- "core": false,
339
- "unlocked_by": null,
340
- "difficulty": 7,
341
- "topics": [
342
- "Algorithms"
343
- ]
344
- },
345
- {
346
- "uuid": "791c17d4-09b5-4e11-a433-b45f0c1c752e",
347
- "slug": "dominoes",
348
- "core": false,
349
- "unlocked_by": null,
350
- "difficulty": 7,
351
- "topics": [
352
- "Algorithms",
353
- "Search"
354
- ]
355
- },
356
- {
357
- "uuid": "0bc0bc18-c207-43d0-8b39-8e0e2e87aa72",
358
- "slug": "custom-set",
359
- "core": false,
360
- "unlocked_by": null,
361
- "difficulty": 8,
362
- "topics": [
363
- "Functional programming"
364
- ]
365
- },
366
- {
367
- "uuid": "6a1e1746-c23c-4225-ac8f-f1b31814d6c2",
368
- "slug": "connect",
369
- "core": false,
370
- "unlocked_by": null,
371
- "difficulty": 8,
372
- "topics": [
373
- "Search"
374
- ]
375
- },
376
- {
377
- "uuid": "cd37ff33-d2c3-4420-9ad0-0121e2a04b61",
378
- "slug": "meetup",
379
- "core": false,
380
- "unlocked_by": null,
381
- "difficulty": 9,
382
- "topics": [
383
- "Dates"
384
- ]
385
- },
386
- {
387
- "uuid": "dc870c73-8a38-4b93-83b6-1144538f65bf",
388
- "slug": "forth",
389
- "core": false,
390
- "unlocked_by": null,
391
- "difficulty": 9,
392
- "topics": [
393
- "Interpreters"
394
- ]
395
- },
396
- {
397
- "uuid": "f75ff9fa-59cd-4b23-a2e1-13494d206e92",
398
- "slug": "zipper",
399
- "core": false,
400
- "unlocked_by": null,
401
- "difficulty": 10,
402
- "topics": [
403
- "Functional programming"
404
- ]
405
- },
406
- {
407
- "uuid": "6b2139a0-953d-414a-8d40-641b431318b1",
408
- "slug": "react",
409
- "core": false,
410
- "unlocked_by": null,
411
- "difficulty": 10,
412
- "topics": [
413
- "Reactive programming"
414
- ]
415
- },
416
- {
417
- "uuid": "4a17796e-3faf-48e4-8db4-e39374fee716",
418
- "slug": "hangman",
419
- "core": false,
420
- "unlocked_by": null,
421
- "difficulty": 10,
422
- "topics": [
423
- "Reactive programming"
424
- ]
425
- },
426
- {
427
- "uuid": "d0c937ef-3c7b-40be-891d-3024129b443f",
428
- "slug": "hexadecimal",
429
- "deprecated": true
430
- }
431
- ],
432
- "foregone": [
433
-
434
- ]
2
+ "active": true,
3
+ "exercises": [
4
+ {
5
+ "core": false,
6
+ "difficulty": 1,
7
+ "slug": "hello-world",
8
+ "topics": [
9
+ "setting_up_ocaml_dev_environment",
10
+ "strings"
11
+ ],
12
+ "unlocked_by": null,
13
+ "uuid": "cda3b090-ae52-476b-a782-9cbf43953cf0"
14
+ },
15
+ {
16
+ "core": false,
17
+ "difficulty": 1,
18
+ "slug": "leap",
19
+ "topics": [
20
+ "booleans",
21
+ "integers"
22
+ ],
23
+ "unlocked_by": null,
24
+ "uuid": "ea5ca675-e010-470b-8030-d4f84880d799"
25
+ },
26
+ {
27
+ "core": false,
28
+ "difficulty": 2,
29
+ "slug": "hamming",
30
+ "topics": [
31
+ "iterating_over_two_lists_at_once"
32
+ ],
33
+ "unlocked_by": null,
34
+ "uuid": "bff47b0f-4555-40b7-b422-64eaa37cb2f6"
35
+ },
36
+ {
37
+ "core": false,
38
+ "difficulty": 2,
39
+ "slug": "raindrops",
40
+ "topics": null,
41
+ "unlocked_by": null,
42
+ "uuid": "dd066b62-c63e-467c-8dfb-435bcc81d532"
43
+ },
44
+ {
45
+ "core": false,
46
+ "difficulty": 2,
47
+ "slug": "difference-of-squares",
48
+ "topics": [
49
+ "mathematics"
50
+ ],
51
+ "unlocked_by": null,
52
+ "uuid": "7fbd4282-9e69-460d-a208-dfafb1850da0"
53
+ },
54
+ {
55
+ "core": false,
56
+ "difficulty": 2,
57
+ "slug": "rna-transcription",
58
+ "topics": [
59
+ "transforming"
60
+ ],
61
+ "unlocked_by": null,
62
+ "uuid": "bf9a0fe0-99b2-4a95-8d75-fc02d0c8433c"
63
+ },
64
+ {
65
+ "core": false,
66
+ "difficulty": 2,
67
+ "slug": "nucleotide-count",
68
+ "topics": [
69
+ "counting"
70
+ ],
71
+ "unlocked_by": null,
72
+ "uuid": "0d7a23a9-31a1-4d52-afd6-887d0fc898e2"
73
+ },
74
+ {
75
+ "core": false,
76
+ "difficulty": 3,
77
+ "slug": "etl",
78
+ "topics": [
79
+ "transforming"
80
+ ],
81
+ "unlocked_by": null,
82
+ "uuid": "be29288a-fcb6-4dce-acc3-be8d86e5454e"
83
+ },
84
+ {
85
+ "core": false,
86
+ "difficulty": 3,
87
+ "slug": "grade-school",
88
+ "topics": [
89
+ "transforming"
90
+ ],
91
+ "unlocked_by": null,
92
+ "uuid": "870b1229-2f9a-4e23-bb6f-c579375ed701"
93
+ },
94
+ {
95
+ "core": false,
96
+ "difficulty": 3,
97
+ "slug": "bob",
98
+ "topics": [
99
+ "strings"
100
+ ],
101
+ "unlocked_by": null,
102
+ "uuid": "9bcdf9a0-acf3-4437-b0f5-071bf0cf5e02"
103
+ },
104
+ {
105
+ "core": false,
106
+ "difficulty": 3,
107
+ "slug": "anagram",
108
+ "topics": [
109
+ "strings"
110
+ ],
111
+ "unlocked_by": null,
112
+ "uuid": "7a3e7667-c7a2-4ba2-b448-599719f78ebc"
113
+ },
114
+ {
115
+ "core": false,
116
+ "difficulty": 3,
117
+ "slug": "space-age",
118
+ "topics": [
119
+ "arithmetic",
120
+ "floats"
121
+ ],
122
+ "unlocked_by": null,
123
+ "uuid": "0621077c-b5af-4e3b-a60c-b6aaa2565224"
124
+ },
125
+ {
126
+ "core": false,
127
+ "difficulty": 3,
128
+ "slug": "triangle",
129
+ "topics": [
130
+ "mathematics"
131
+ ],
132
+ "unlocked_by": null,
133
+ "uuid": "a43c28f4-8f5c-40f7-90cb-79689c810f95"
134
+ },
135
+ {
136
+ "core": false,
137
+ "difficulty": 3,
138
+ "slug": "pangram",
139
+ "topics": [
140
+ "strings"
141
+ ],
142
+ "unlocked_by": null,
143
+ "uuid": "ae5a4fac-84c4-4929-b37e-b0452f761bf8"
144
+ },
145
+ {
146
+ "core": false,
147
+ "difficulty": 3,
148
+ "slug": "acronym",
149
+ "topics": [
150
+ "strings"
151
+ ],
152
+ "unlocked_by": null,
153
+ "uuid": "c4550644-e67a-4bf4-98dc-78fe45b90c53"
154
+ },
155
+ {
156
+ "core": false,
157
+ "difficulty": 4,
158
+ "slug": "all-your-base",
159
+ "topics": [
160
+ "mathematics"
161
+ ],
162
+ "unlocked_by": null,
163
+ "uuid": "63134efd-e383-4f00-9f97-80ae75585ca6"
164
+ },
165
+ {
166
+ "core": false,
167
+ "difficulty": 4,
168
+ "slug": "bracket-push",
169
+ "topics": [
170
+ "stacks"
171
+ ],
172
+ "unlocked_by": null,
173
+ "uuid": "9f7b9da6-afff-4d2b-862e-df1b3a0a7cef"
174
+ },
175
+ {
176
+ "core": false,
177
+ "difficulty": 4,
178
+ "slug": "luhn",
179
+ "topics": [
180
+ "arithmetic"
181
+ ],
182
+ "unlocked_by": null,
183
+ "uuid": "8d21e4be-5e9c-4c73-81c5-b4ee2517d9c7"
184
+ },
185
+ {
186
+ "core": false,
187
+ "difficulty": 4,
188
+ "slug": "binary-search",
189
+ "topics": [
190
+ "algorithms",
191
+ "arrays",
192
+ "search"
193
+ ],
194
+ "unlocked_by": null,
195
+ "uuid": "de60cf70-153d-439e-96c6-8252057c5d82"
196
+ },
197
+ {
198
+ "core": false,
199
+ "difficulty": 4,
200
+ "slug": "phone-number",
201
+ "topics": [
202
+ "strings"
203
+ ],
204
+ "unlocked_by": null,
205
+ "uuid": "d9f93301-a8e8-4c90-bbff-e1ec65b435e5"
206
+ },
207
+ {
208
+ "core": false,
209
+ "difficulty": 4,
210
+ "slug": "word-count",
211
+ "topics": [
212
+ "counting",
213
+ "strings"
214
+ ],
215
+ "unlocked_by": null,
216
+ "uuid": "db90c208-b8ca-4c8c-8061-b9148c80abfe"
217
+ },
218
+ {
219
+ "core": false,
220
+ "difficulty": 4,
221
+ "slug": "beer-song",
222
+ "topics": [
223
+ "strings"
224
+ ],
225
+ "unlocked_by": null,
226
+ "uuid": "83c807b1-0aa4-4493-8665-6581c019a6f5"
227
+ },
228
+ {
229
+ "core": false,
230
+ "difficulty": 5,
231
+ "slug": "run-length-encoding",
232
+ "topics": [
233
+ "algorithms",
234
+ "transforming"
235
+ ],
236
+ "unlocked_by": null,
237
+ "uuid": "4281cefe-e4b4-46d4-b6bb-0086448c080f"
238
+ },
239
+ {
240
+ "core": false,
241
+ "difficulty": 5,
242
+ "slug": "roman-numerals",
243
+ "topics": [
244
+ "strings"
245
+ ],
246
+ "unlocked_by": null,
247
+ "uuid": "8f7fcaad-c588-4495-9f9e-20611187a0a5"
248
+ },
249
+ {
250
+ "core": false,
251
+ "difficulty": 5,
252
+ "slug": "prime-factors",
253
+ "topics": [
254
+ "algorithms",
255
+ "mathematics"
256
+ ],
257
+ "unlocked_by": null,
258
+ "uuid": "67d4fa19-c387-47c4-9262-a6e63d5c0a19"
259
+ },
260
+ {
261
+ "core": false,
262
+ "difficulty": 5,
263
+ "slug": "say",
264
+ "topics": [
265
+ "strings"
266
+ ],
267
+ "unlocked_by": null,
268
+ "uuid": "2efe0bf3-cb17-4135-ae95-d7b5b7b61f7f"
269
+ },
270
+ {
271
+ "core": false,
272
+ "difficulty": 6,
273
+ "slug": "palindrome-products",
274
+ "topics": [
275
+ "arithmetic"
276
+ ],
277
+ "unlocked_by": null,
278
+ "uuid": "8398d903-8208-4807-b735-b4cbf6976f29"
279
+ },
280
+ {
281
+ "core": false,
282
+ "difficulty": 6,
283
+ "slug": "robot-name",
284
+ "topics": [
285
+ "mutable_state",
286
+ "randomness"
287
+ ],
288
+ "unlocked_by": null,
289
+ "uuid": "51f4aff9-6666-4097-a37e-e2e51fd8f286"
290
+ },
291
+ {
292
+ "core": false,
293
+ "difficulty": 6,
294
+ "slug": "change",
295
+ "topics": [
296
+ "algorithms",
297
+ "dynamic_programming"
298
+ ],
299
+ "unlocked_by": null,
300
+ "uuid": "202e8a9a-7a5e-486f-883b-56be298ed665"
301
+ },
302
+ {
303
+ "core": false,
304
+ "difficulty": 6,
305
+ "slug": "list-ops",
306
+ "topics": [
307
+ "functional_programming"
308
+ ],
309
+ "unlocked_by": null,
310
+ "uuid": "ffde2a94-722a-4193-86b7-d2d591a7223d"
311
+ },
312
+ {
313
+ "core": false,
314
+ "difficulty": 7,
315
+ "slug": "atbash-cipher",
316
+ "topics": [
317
+ "transforming"
318
+ ],
319
+ "unlocked_by": null,
320
+ "uuid": "020aa7d8-9b4b-4348-9fea-9fbaece3ac66"
321
+ },
322
+ {
323
+ "core": false,
324
+ "difficulty": 7,
325
+ "slug": "minesweeper",
326
+ "topics": [
327
+ "arrays",
328
+ "transforming"
329
+ ],
330
+ "unlocked_by": null,
331
+ "uuid": "a0468f9b-55d1-45dd-9a2f-476aaf4d6c2e"
332
+ },
333
+ {
334
+ "core": false,
335
+ "difficulty": 7,
336
+ "slug": "bowling",
337
+ "topics": [
338
+ "algorithms"
339
+ ],
340
+ "unlocked_by": null,
341
+ "uuid": "638b24d2-5288-4fc2-a70e-a178974f030e"
342
+ },
343
+ {
344
+ "core": false,
345
+ "difficulty": 7,
346
+ "slug": "dominoes",
347
+ "topics": [
348
+ "algorithms",
349
+ "search"
350
+ ],
351
+ "unlocked_by": null,
352
+ "uuid": "791c17d4-09b5-4e11-a433-b45f0c1c752e"
353
+ },
354
+ {
355
+ "core": false,
356
+ "difficulty": 8,
357
+ "slug": "custom-set",
358
+ "topics": [
359
+ "functional_programming"
360
+ ],
361
+ "unlocked_by": null,
362
+ "uuid": "0bc0bc18-c207-43d0-8b39-8e0e2e87aa72"
363
+ },
364
+ {
365
+ "core": false,
366
+ "difficulty": 8,
367
+ "slug": "connect",
368
+ "topics": [
369
+ "search"
370
+ ],
371
+ "unlocked_by": null,
372
+ "uuid": "6a1e1746-c23c-4225-ac8f-f1b31814d6c2"
373
+ },
374
+ {
375
+ "core": false,
376
+ "difficulty": 9,
377
+ "slug": "meetup",
378
+ "topics": [
379
+ "dates"
380
+ ],
381
+ "unlocked_by": null,
382
+ "uuid": "cd37ff33-d2c3-4420-9ad0-0121e2a04b61"
383
+ },
384
+ {
385
+ "core": false,
386
+ "difficulty": 9,
387
+ "slug": "forth",
388
+ "topics": [
389
+ "interpreters"
390
+ ],
391
+ "unlocked_by": null,
392
+ "uuid": "dc870c73-8a38-4b93-83b6-1144538f65bf"
393
+ },
394
+ {
395
+ "core": false,
396
+ "difficulty": 10,
397
+ "slug": "zipper",
398
+ "topics": [
399
+ "functional_programming"
400
+ ],
401
+ "unlocked_by": null,
402
+ "uuid": "f75ff9fa-59cd-4b23-a2e1-13494d206e92"
403
+ },
404
+ {
405
+ "core": false,
406
+ "difficulty": 10,
407
+ "slug": "react",
408
+ "topics": [
409
+ "reactive_programming"
410
+ ],
411
+ "unlocked_by": null,
412
+ "uuid": "6b2139a0-953d-414a-8d40-641b431318b1"
413
+ },
414
+ {
415
+ "core": false,
416
+ "difficulty": 10,
417
+ "slug": "hangman",
418
+ "topics": [
419
+ "reactive_programming"
420
+ ],
421
+ "unlocked_by": null,
422
+ "uuid": "4a17796e-3faf-48e4-8db4-e39374fee716"
423
+ },
424
+ {
425
+ "deprecated": true,
426
+ "slug": "hexadecimal",
427
+ "uuid": "d0c937ef-3c7b-40be-891d-3024129b443f"
428
+ }
429
+ ],
430
+ "foregone": [],
431
+ "language": "OCaml"
435
432
  }