trackler 2.1.0.0 → 2.1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (148) hide show
  1. checksums.yaml +4 -4
  2. data/common/exercises/connect/description.md +2 -1
  3. data/common/exercises/crypto-square/canonical-data.json +2 -2
  4. data/common/exercises/two-bucket/canonical-data.json +27 -1
  5. data/lib/trackler/version.rb +1 -1
  6. data/tracks/c/exercises/perfect-numbers/src/example.c +8 -4
  7. data/tracks/clojure/config.json +5 -0
  8. data/tracks/clojure/exercises/secret-handshake/project.clj +4 -0
  9. data/tracks/clojure/exercises/secret-handshake/src/example.clj +19 -0
  10. data/tracks/clojure/exercises/secret-handshake/test/secret_handshake_test.clj +55 -0
  11. data/tracks/cpp/.travis.yml +4 -3
  12. data/tracks/cpp/README.md +1 -1
  13. data/tracks/cpp/config.json +171 -67
  14. data/tracks/cpp/docs/ABOUT.md +2 -2
  15. data/tracks/cpp/docs/INSTALLATION.md +22 -28
  16. data/tracks/cpp/docs/TESTS.md +1 -1
  17. data/tracks/cpp/exercises/anagram/CMakeLists.txt +2 -9
  18. data/tracks/cpp/exercises/beer-song/CMakeLists.txt +2 -9
  19. data/tracks/cpp/exercises/binary/CMakeLists.txt +2 -9
  20. data/tracks/cpp/exercises/bob/CMakeLists.txt +2 -9
  21. data/tracks/cpp/exercises/clock/CMakeLists.txt +2 -9
  22. data/tracks/cpp/exercises/clock/clock_test.cpp +188 -64
  23. data/tracks/cpp/exercises/clock/example.cpp +17 -12
  24. data/tracks/cpp/exercises/clock/example.h +1 -0
  25. data/tracks/cpp/exercises/crypto-square/CMakeLists.txt +2 -9
  26. data/tracks/cpp/exercises/difference-of-squares/CMakeLists.txt +2 -9
  27. data/tracks/cpp/exercises/etl/CMakeLists.txt +2 -9
  28. data/tracks/cpp/exercises/etl/etl_test.cpp +5 -5
  29. data/tracks/cpp/exercises/food-chain/CMakeLists.txt +2 -9
  30. data/tracks/cpp/exercises/gigasecond/CMakeLists.txt +2 -9
  31. data/tracks/cpp/exercises/gigasecond/example.cpp +2 -6
  32. data/tracks/cpp/exercises/gigasecond/example.h +2 -2
  33. data/tracks/cpp/exercises/gigasecond/gigasecond_test.cpp +26 -8
  34. data/tracks/cpp/exercises/grade-school/CMakeLists.txt +2 -9
  35. data/tracks/cpp/exercises/grade-school/grade_school_test.cpp +5 -6
  36. data/tracks/cpp/exercises/grains/CMakeLists.txt +2 -9
  37. data/tracks/cpp/exercises/hamming/CMakeLists.txt +2 -9
  38. data/tracks/cpp/exercises/hello-world/CMakeLists.txt +2 -9
  39. data/tracks/cpp/exercises/hexadecimal/CMakeLists.txt +2 -9
  40. data/tracks/cpp/exercises/leap/CMakeLists.txt +2 -9
  41. data/tracks/cpp/exercises/meetup/CMakeLists.txt +2 -9
  42. data/tracks/cpp/exercises/meetup/meetup_test.cpp +1 -1
  43. data/tracks/cpp/exercises/nth-prime/CMakeLists.txt +2 -9
  44. data/tracks/cpp/exercises/nucleotide-count/CMakeLists.txt +2 -9
  45. data/tracks/cpp/exercises/nucleotide-count/nucleotide_count_test.cpp +3 -4
  46. data/tracks/cpp/exercises/phone-number/CMakeLists.txt +2 -9
  47. data/tracks/cpp/exercises/prime-factors/CMakeLists.txt +2 -9
  48. data/tracks/cpp/exercises/queen-attack/CMakeLists.txt +2 -9
  49. data/tracks/cpp/exercises/raindrops/CMakeLists.txt +2 -9
  50. data/tracks/cpp/exercises/rna-transcription/CMakeLists.txt +2 -9
  51. data/tracks/cpp/exercises/robot-name/CMakeLists.txt +2 -9
  52. data/tracks/cpp/exercises/roman-numerals/CMakeLists.txt +2 -9
  53. data/tracks/cpp/exercises/say/CMakeLists.txt +2 -9
  54. data/tracks/cpp/exercises/scrabble-score/CMakeLists.txt +2 -9
  55. data/tracks/cpp/exercises/series/CMakeLists.txt +2 -9
  56. data/tracks/cpp/exercises/series/series_test.cpp +11 -11
  57. data/tracks/cpp/exercises/sieve/CMakeLists.txt +2 -9
  58. data/tracks/cpp/exercises/space-age/CMakeLists.txt +2 -9
  59. data/tracks/cpp/exercises/sum-of-multiples/CMakeLists.txt +2 -9
  60. data/tracks/cpp/exercises/triangle/CMakeLists.txt +2 -9
  61. data/tracks/cpp/exercises/trinary/CMakeLists.txt +2 -9
  62. data/tracks/cpp/exercises/word-count/CMakeLists.txt +2 -9
  63. data/tracks/cpp/exercises/word-count/word_count_test.cpp +14 -15
  64. data/tracks/go/README.md +27 -13
  65. data/tracks/go/config.json +1 -0
  66. data/tracks/go/exercises/connect/.meta/gen.go +1 -3
  67. data/tracks/go/exercises/connect/cases_test.go +2 -1
  68. data/tracks/go/exercises/custom-set/.meta/gen.go +122 -101
  69. data/tracks/go/exercises/custom-set/cases_test.go +13 -4
  70. data/tracks/go/exercises/custom-set/custom_set_test.go +2 -2
  71. data/tracks/go/exercises/hamming/.meta/gen.go +1 -3
  72. data/tracks/go/exercises/hamming/cases_test.go +7 -1
  73. data/tracks/go/exercises/hamming/example.go +1 -1
  74. data/tracks/go/exercises/hamming/hamming_test.go +1 -1
  75. data/tracks/go/exercises/hello-world/{hello_example_test.go → example_helloworld_test.go} +0 -0
  76. data/tracks/go/exercises/house/house_test.go +8 -8
  77. data/tracks/go/exercises/meetup/.meta/gen.go +1 -3
  78. data/tracks/go/exercises/meetup/cases_test.go +2 -1
  79. data/tracks/go/exercises/palindrome-products/example.go +1 -1
  80. data/tracks/go/exercises/palindrome-products/palindrome_products_test.go +1 -1
  81. data/tracks/go/exercises/pascals-triangle/pascals_triangle_test.go +24 -4
  82. data/tracks/go/exercises/rna-transcription/.meta/gen.go +1 -3
  83. data/tracks/go/exercises/rna-transcription/cases_test.go +2 -1
  84. data/tracks/go/exercises/roman-numerals/.meta/gen.go +1 -3
  85. data/tracks/go/exercises/roman-numerals/cases_test.go +2 -1
  86. data/tracks/go/exercises/roman-numerals/example.go +1 -1
  87. data/tracks/go/exercises/transpose/.meta/gen.go +1 -3
  88. data/tracks/go/exercises/transpose/cases_test.go +2 -1
  89. data/tracks/go/exercises/transpose/transpose_test.go +5 -0
  90. data/tracks/go/exercises/word-count/.meta/gen.go +1 -3
  91. data/tracks/go/exercises/word-count/cases_test.go +2 -1
  92. data/tracks/go/gen/gen.go +3 -2
  93. data/tracks/java/config.json +5 -0
  94. data/tracks/java/exercises/saddle-points/build.gradle +17 -0
  95. data/tracks/java/exercises/saddle-points/src/example/java/Matrix.java +44 -0
  96. data/tracks/java/exercises/saddle-points/src/example/java/MatrixCoordinate.java +31 -0
  97. data/tracks/java/exercises/saddle-points/src/main/java/Matrix.java +5 -0
  98. data/tracks/java/exercises/saddle-points/src/main/java/MatrixCoordinate.java +31 -0
  99. data/tracks/java/exercises/saddle-points/src/test/java/MatrixTest.java +82 -0
  100. data/tracks/java/exercises/settings.gradle +1 -0
  101. data/tracks/javascript/.travis.yml +3 -1
  102. data/tracks/javascript/Makefile +2 -8
  103. data/tracks/javascript/SETUP.md +1 -2
  104. data/tracks/javascript/docs/INSTALLATION.md +3 -4
  105. data/tracks/javascript/docs/TESTS.md +14 -26
  106. data/tracks/javascript/exercises/hamming/example.js +7 -11
  107. data/tracks/javascript/exercises/hello-world/HINTS.md +3 -3
  108. data/tracks/javascript/exercises/robot-simulator/example.js +72 -73
  109. data/tracks/perl6/config.json +5 -0
  110. data/tracks/perl6/exercises/clock/Clock.pm6 +4 -0
  111. data/tracks/perl6/exercises/clock/Example.pm6 +12 -0
  112. data/tracks/perl6/exercises/clock/clock.t +534 -0
  113. data/tracks/perl6/exercises/clock/example.yaml +16 -0
  114. data/tracks/perl6/exercises/robot-name/Example.pm +11 -4
  115. data/tracks/php/exercises/hello-world/hello-world.php +1 -1
  116. data/tracks/php/exercises/hello-world/hello-world_test.php +1 -11
  117. data/tracks/php/exercises/robot-name/robot-name_test.php +1 -0
  118. data/tracks/purescript/config.json +7 -0
  119. data/tracks/purescript/exercises/largest-series-product/bower.json +16 -0
  120. data/tracks/purescript/exercises/largest-series-product/examples/src/LargestSeriesProduct.purs +31 -0
  121. data/tracks/purescript/exercises/largest-series-product/src/LargestSeriesProduct.purs +3 -0
  122. data/tracks/purescript/exercises/largest-series-product/test/Main.purs +73 -0
  123. data/tracks/python/exercises/sublist/sublist_test.py +94 -55
  124. data/tracks/ruby/README.md +38 -25
  125. data/tracks/ruby/exercises/hamming/example.tt +6 -4
  126. data/tracks/ruby/exercises/hamming/hamming_test.rb +4 -5
  127. data/tracks/ruby/exercises/linked-list/linked_list_test.rb +16 -0
  128. data/tracks/ruby/exercises/luhn/luhn_test.rb +5 -5
  129. data/tracks/ruby/exercises/ocr-numbers/.meta/.version +1 -0
  130. data/tracks/ruby/exercises/ocr-numbers/example.rb +42 -61
  131. data/tracks/ruby/exercises/ocr-numbers/example.tt +21 -0
  132. data/tracks/ruby/exercises/ocr-numbers/ocr_numbers_test.rb +63 -138
  133. data/tracks/ruby/lib/generator/exercise_cases.rb +43 -0
  134. data/tracks/ruby/lib/generator/underscore.rb +9 -0
  135. data/tracks/ruby/lib/hamming_cases.rb +9 -14
  136. data/tracks/ruby/lib/luhn_cases.rb +2 -18
  137. data/tracks/ruby/lib/ocr_numbers_cases.rb +20 -0
  138. data/tracks/ruby/lib/pig_latin_cases.rb +2 -12
  139. data/tracks/ruby/test/generator/underscore_test.rb +23 -0
  140. data/tracks/scala/config.json +316 -316
  141. metadata +26 -10
  142. data/tracks/cpp/exercises/etl/require_equal_containers.h +0 -88
  143. data/tracks/cpp/exercises/grade-school/require_equal_containers.h +0 -88
  144. data/tracks/cpp/exercises/nucleotide-count/require_equal_containers.h +0 -88
  145. data/tracks/cpp/exercises/series/require_equal_containers.h +0 -88
  146. data/tracks/cpp/exercises/word-count/require_equal_containers.h +0 -88
  147. data/tracks/javascript/exercises/acronym/package.json +0 -12
  148. data/tracks/javascript/package.json +0 -12
@@ -0,0 +1,43 @@
1
+ require 'ostruct'
2
+ require 'json'
3
+
4
+ class ExerciseCase < OpenStruct
5
+ using Generator::Underscore
6
+
7
+ def name
8
+ 'test_%s' % description.underscore
9
+ end
10
+
11
+ def skipped
12
+ index.zero? ? '# skip' : 'skip'
13
+ end
14
+
15
+ protected
16
+
17
+ # used in workload, for example, as
18
+ # "#{assert} Luhn.valid?(#{input.inspect})"
19
+ def assert
20
+ expected ? 'assert' : 'refute'
21
+ end
22
+
23
+ # used in workload, for example, as
24
+ # assert_equal { "PigLatin.translate(#{input.inspect})" }
25
+ def assert_equal
26
+ "assert_equal #{expected.inspect}, #{yield}"
27
+ end
28
+
29
+ # used in workload, for example, as
30
+ # if raises_error?
31
+ # assert_raises(ArgumentError) { test_case }
32
+ # else
33
+ # assert_equal { test_case }
34
+ # end
35
+
36
+ def raises_error?
37
+ expected.to_i == -1
38
+ end
39
+
40
+ def assert_raises(error)
41
+ "assert_raises(#{error}) { #{yield} }"
42
+ end
43
+ end
@@ -0,0 +1,9 @@
1
+ module Generator
2
+ module Underscore
3
+ refine String do
4
+ def underscore
5
+ downcase.gsub(/[- ]/, '_').gsub(/[^\w?]/, '')
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,21 +1,16 @@
1
- require 'exercise_cases'
2
-
3
- class HammingCase < OpenStruct
4
- def name
5
- 'test_%s' % description.gsub(/[ -]/, '_')
6
- end
7
-
1
+ class HammingCase < ExerciseCase
8
2
  def workload
9
- "Hamming.compute('#{strand1}', '#{strand2}')"
3
+ if raises_error?
4
+ assert_raises(ArgumentError) { test_case }
5
+ else
6
+ assert_equal { test_case }
7
+ end
10
8
  end
11
9
 
12
- def raises_error?
13
- expected.to_i == -1
14
- end
10
+ private
15
11
 
16
- def skipped
17
- index.zero? && '# skip' ||
18
- 'skip'
12
+ def test_case
13
+ "Hamming.compute('#{strand1}', '#{strand2}')"
19
14
  end
20
15
  end
21
16
 
@@ -1,22 +1,6 @@
1
- require 'exercise_cases'
2
-
3
- class LuhnCase < OpenStruct
4
- def name
5
- 'test_%s' % description.tr('- ', '__')
6
- end
7
-
1
+ class LuhnCase < ExerciseCase
8
2
  def workload
9
- %Q(#{assertion} Luhn.valid?(#{input.inspect}))
10
- end
11
-
12
- def skipped
13
- index.zero? ? '# skip' : 'skip'
14
- end
15
-
16
- private
17
-
18
- def assertion
19
- expected ? 'assert' : 'refute'
3
+ "#{assert} Luhn.valid?(#{input.inspect})"
20
4
  end
21
5
  end
22
6
 
@@ -0,0 +1,20 @@
1
+ class OcrNumbersCase < ExerciseCase
2
+ def workload
3
+ if raises_error?
4
+ assert_raises(ArgumentError) { test_case }
5
+ else
6
+ assert_equal { test_case }
7
+ end
8
+ end
9
+
10
+ private
11
+
12
+ def test_case
13
+ %Q(OcrNumbers.convert(#{(input.join("\n")).inspect}))
14
+ end
15
+ end
16
+
17
+ OcrNumbersCases = proc do |data|
18
+ JSON.parse(data)['cases'].flat_map {|section| section['cases'] }.
19
+ map.with_index {|test, index| OcrNumbersCase.new(test.merge('index' => index)) }
20
+ end
@@ -1,16 +1,6 @@
1
- require 'exercise_cases'
2
-
3
- class PigLatinCase < OpenStruct
4
- def name
5
- 'test_%s' % description.tr('- ', '__')
6
- end
7
-
1
+ class PigLatinCase < ExerciseCase
8
2
  def workload
9
- %Q(assert_equal #{expected.inspect}, PigLatin.translate(#{input.inspect}))
10
- end
11
-
12
- def skipped
13
- index.zero? ? '# skip' : 'skip'
3
+ assert_equal { "PigLatin.translate(#{input.inspect})" }
14
4
  end
15
5
  end
16
6
 
@@ -0,0 +1,23 @@
1
+ require_relative '../test_helper'
2
+
3
+ module Generator
4
+ class UnderscoreTest < MiniTest::Test
5
+ using Underscore
6
+
7
+ # at present, we're downcasing everything, including TLAs
8
+ def test_mixed_case
9
+ assert_equal 'A string with TLA'.underscore, 'a_string_with_tla'
10
+ end
11
+
12
+ def test_hyphenated_text
13
+ assert_equal 'large distance in off-by-one strand'.underscore, 'large_distance_in_off_by_one_strand'
14
+ end
15
+
16
+ def test_question_mark
17
+ assert_equal(
18
+ 'Unreadable but correctly sized inputs return ?'.underscore,
19
+ 'unreadable_but_correctly_sized_inputs_return_?'
20
+ )
21
+ end
22
+ end
23
+ end
@@ -29,59 +29,94 @@
29
29
  ]
30
30
  },
31
31
  {
32
- "slug":"run-length-encoding",
32
+ "slug":"leap",
33
33
  "difficulty":1,
34
34
  "topics":[
35
- "Algorithms",
36
- "Transforming",
37
- "Strings"
35
+ "Integers",
36
+ "Mathematics"
38
37
  ]
39
38
  },
40
39
  {
41
- "slug":"hamming",
42
- "difficulty":2,
40
+ "slug":"space-age",
41
+ "difficulty":1,
43
42
  "topics":[
44
- "Strings",
45
- "Filtering",
46
- "Optional values"
43
+ "Dates",
44
+ "Enumerations",
45
+ "Domain-specific languages"
47
46
  ]
48
- },
47
+ },
49
48
  {
50
- "slug":"word-count",
49
+ "slug":"gigasecond",
51
50
  "difficulty":1,
52
51
  "topics":[
53
- "Maps",
54
- "Strings",
55
- "Transforming"
52
+ "Dates",
53
+ "Time",
54
+ "Function Overloading"
56
55
  ]
57
56
  },
58
57
  {
59
- "slug":"pangram",
58
+ "slug":"difference-of-squares",
60
59
  "difficulty":1,
60
+ "topics":[
61
+ "Integers",
62
+ "Mathematics"
63
+ ]
64
+ },
65
+ {
66
+ "slug":"pangram",
67
+ "difficulty":2,
61
68
  "topics":[
62
69
  "Strings"
63
70
  ]
64
71
  },
65
72
  {
66
- "slug":"anagram",
67
- "difficulty":1,
73
+ "slug":"grade-school",
74
+ "difficulty":2,
68
75
  "topics":[
76
+ "Maps",
69
77
  "Sequences",
78
+ "Sorting"
79
+ ]
80
+ },
81
+ {
82
+ "slug":"accumulate",
83
+ "difficulty":2,
84
+ "topics":[
85
+ "Generics",
86
+ "Lists",
87
+ "Transforming"
88
+ ]
89
+ },
90
+ {
91
+ "slug":"raindrops",
92
+ "difficulty":2,
93
+ "topics":[
70
94
  "Strings",
71
- "Filtering"
95
+ "Logic",
96
+ "Transforming"
72
97
  ]
73
98
  },
74
99
  {
75
- "slug":"nucleotide-count",
76
- "difficulty":1,
100
+ "slug":"perfect-numbers",
101
+ "difficulty":2,
77
102
  "topics":[
78
- "Maps",
79
- "Strings"
103
+ "Enumerations",
104
+ "Integers",
105
+ "Mathematics"
106
+ ]
107
+ },
108
+ {
109
+ "slug":"hamming",
110
+ "difficulty":3,
111
+ "topics":[
112
+ "Strings",
113
+ "Filtering",
114
+ "Optional values"
80
115
  ]
81
116
  },
82
117
  {
83
118
  "slug":"phone-number",
84
- "difficulty":1,
119
+ "difficulty":3,
85
120
  "topics":[
86
121
  "Optional values",
87
122
  "Strings",
@@ -91,41 +126,24 @@
91
126
  },
92
127
  {
93
128
  "slug":"strain",
94
- "difficulty":1,
129
+ "difficulty":3,
95
130
  "topics":[
96
131
  "Generics",
97
132
  "Sequences",
98
133
  "Filtering"
99
134
  ]
100
135
  },
101
- {
102
- "slug":"grade-school",
103
- "difficulty":1,
104
- "topics":[
105
- "Maps",
106
- "Sequences",
107
- "Sorting"
108
- ]
109
- },
110
136
  {
111
137
  "slug":"robot-name",
112
- "difficulty":1,
138
+ "difficulty":3,
113
139
  "topics":[
114
140
  "Strings",
115
141
  "Randomness"
116
142
  ]
117
143
  },
118
- {
119
- "slug":"leap",
120
- "difficulty":1,
121
- "topics":[
122
- "Integers",
123
- "Mathematics"
124
- ]
125
- },
126
144
  {
127
145
  "slug":"etl",
128
- "difficulty":1,
146
+ "difficulty":3,
129
147
  "topics":[
130
148
  "Lists",
131
149
  "Maps",
@@ -135,185 +153,183 @@
135
153
  ]
136
154
  },
137
155
  {
138
- "slug":"meetup",
139
- "difficulty":1,
156
+ "slug":"grains",
157
+ "difficulty":3,
140
158
  "topics":[
141
- "Dates"
159
+ "Optional values",
160
+ "Mathematics"
142
161
  ]
143
162
  },
144
163
  {
145
- "slug":"space-age",
146
- "difficulty":1,
164
+ "slug":"scrabble-score",
165
+ "difficulty":3,
147
166
  "topics":[
148
- "Dates",
149
- "Enumerations",
150
- "Domain-specific languages"
167
+ "Strings",
168
+ "Transforming"
151
169
  ]
152
- },
170
+ },
153
171
  {
154
- "slug":"grains",
155
- "difficulty":1,
172
+ "slug":"rna-transcription",
173
+ "difficulty":3,
156
174
  "topics":[
157
175
  "Optional values",
158
- "Mathematics"
176
+ "Strings",
177
+ "Transforming"
159
178
  ]
160
179
  },
161
180
  {
162
- "slug":"gigasecond",
163
- "difficulty":1,
181
+ "slug":"triangle",
182
+ "difficulty":3,
164
183
  "topics":[
165
- "Dates",
166
- "Time",
167
- "Function Overloading"
184
+ "Enumerations",
185
+ "Mathematics"
168
186
  ]
169
187
  },
170
188
  {
171
- "slug":"scrabble-score",
172
- "difficulty":1,
189
+ "slug":"binary-search",
190
+ "difficulty":3,
173
191
  "topics":[
174
- "Strings",
175
- "Transforming"
192
+ "Searching",
193
+ "Arrays",
194
+ "Optional values"
176
195
  ]
177
- },
196
+ },
178
197
  {
179
- "slug":"difference-of-squares",
180
- "difficulty":1,
198
+ "slug":"secret-handshake",
199
+ "difficulty":3,
181
200
  "topics":[
182
- "Integers",
183
- "Mathematics"
201
+ "Lists",
202
+ "Strings",
203
+ "Bitwise operations"
184
204
  ]
185
205
  },
186
206
  {
187
- "slug":"accumulate",
188
- "difficulty":1,
207
+ "slug":"sieve",
208
+ "difficulty":3,
189
209
  "topics":[
190
- "Generics",
191
- "Lists",
192
- "Transforming"
210
+ "Filtering",
211
+ "Mathematics",
212
+ "Lists"
193
213
  ]
194
214
  },
195
215
  {
196
- "slug":"sublist",
197
- "difficulty":1,
216
+ "slug":"robot-simulator",
217
+ "difficulty":3,
198
218
  "topics":[
199
- "Generics",
200
219
  "Enumerations",
201
- "Lists"
220
+ "Tuples"
202
221
  ]
203
222
  },
204
223
  {
205
- "slug":"rna-transcription",
206
- "difficulty":1,
224
+ "slug":"isogram",
225
+ "difficulty":3,
207
226
  "topics":[
208
- "Optional values",
209
227
  "Strings",
210
- "Transforming"
228
+ "Filtering"
211
229
  ]
212
230
  },
213
231
  {
214
- "slug":"triangle",
215
- "difficulty":1,
232
+ "slug":"clock",
233
+ "difficulty":3,
216
234
  "topics":[
217
- "Enumerations",
218
- "Mathematics"
235
+ "Time",
236
+ "Structural equality"
219
237
  ]
220
238
  },
221
239
  {
222
- "slug":"roman-numerals",
223
- "difficulty":1,
240
+ "slug":"matrix",
241
+ "difficulty":4,
224
242
  "topics":[
225
- "Sequences",
226
- "Algorithms",
227
- "Transforming"
243
+ "Strings",
244
+ "Matrices",
245
+ "Parsing",
246
+ "Vectors"
228
247
  ]
229
248
  },
230
249
  {
231
- "slug":"binary-search",
232
- "difficulty":1,
250
+ "slug":"house",
251
+ "difficulty":4,
233
252
  "topics":[
234
- "Searching",
235
- "Arrays",
236
- "Optional values"
253
+ "Strings",
254
+ "Text formatting",
255
+ "Algorithms"
237
256
  ]
238
257
  },
239
258
  {
240
- "slug":"prime-factors",
241
- "difficulty":1,
259
+ "slug":"series",
260
+ "difficulty":4,
242
261
  "topics":[
243
- "Lists",
244
- "Integers",
245
- "Algorithms",
246
- "Mathematics"
262
+ "Strings",
263
+ "Sequences",
264
+ "Transforming"
247
265
  ]
248
266
  },
249
267
  {
250
- "slug":"raindrops",
251
- "difficulty":1,
268
+ "slug":"word-count",
269
+ "difficulty":4,
252
270
  "topics":[
271
+ "Maps",
253
272
  "Strings",
254
- "Logic",
255
273
  "Transforming"
256
274
  ]
257
275
  },
258
276
  {
259
- "slug":"allergies",
260
- "difficulty":1,
277
+ "slug":"anagram",
278
+ "difficulty":4,
261
279
  "topics":[
262
- "Lists",
263
- "Enumerations",
280
+ "Sequences",
281
+ "Strings",
264
282
  "Filtering"
265
283
  ]
266
284
  },
267
285
  {
268
- "slug":"simple-linked-list",
269
- "difficulty":1,
286
+ "slug":"nucleotide-count",
287
+ "difficulty":4,
270
288
  "topics":[
271
- "Classes",
272
- "Lists",
273
- "Transforming",
274
- "Generics"
289
+ "Maps",
290
+ "Strings"
275
291
  ]
276
292
  },
277
293
  {
278
- "slug":"atbash-cipher",
279
- "difficulty":1,
294
+ "slug":"meetup",
295
+ "difficulty":4,
280
296
  "topics":[
281
- "Strings",
282
- "Transforming",
283
- "Security"
297
+ "Dates"
284
298
  ]
285
299
  },
286
300
  {
287
- "slug":"all-your-base",
288
- "difficulty":1,
301
+ "slug":"prime-factors",
302
+ "difficulty":4,
289
303
  "topics":[
290
- "Integers",
291
304
  "Lists",
292
- "Optional values",
293
- "Mathematics",
294
- "Transforming"
305
+ "Integers",
306
+ "Algorithms",
307
+ "Mathematics"
295
308
  ]
296
309
  },
297
310
  {
298
- "slug":"bank-account",
299
- "difficulty":1,
311
+ "slug":"allergies",
312
+ "difficulty":4,
300
313
  "topics":[
301
- "Parallellism"
314
+ "Lists",
315
+ "Enumerations",
316
+ "Filtering"
302
317
  ]
303
318
  },
304
319
  {
305
- "slug":"crypto-square",
306
- "difficulty":1,
320
+ "slug":"all-your-base",
321
+ "difficulty":4,
307
322
  "topics":[
308
- "Strings",
323
+ "Integers",
309
324
  "Lists",
310
- "Security",
325
+ "Optional values",
326
+ "Mathematics",
311
327
  "Transforming"
312
328
  ]
313
329
  },
314
330
  {
315
331
  "slug":"kindergarten-garden",
316
- "difficulty":1,
332
+ "difficulty":4,
317
333
  "topics":[
318
334
  "Enumerations",
319
335
  "Transforming",
@@ -321,147 +337,147 @@
321
337
  ]
322
338
  },
323
339
  {
324
- "slug":"robot-simulator",
325
- "difficulty":1,
326
- "topics":[
327
- "Enumerations",
328
- "Tuples"
329
- ]
330
- },
331
- {
332
- "slug":"isogram",
333
- "difficulty":1,
340
+ "slug":"largest-series-product",
341
+ "difficulty":4,
334
342
  "topics":[
335
343
  "Strings",
336
- "Filtering"
344
+ "Integers",
345
+ "Optional values",
346
+ "Transforming",
347
+ "Mathematics"
337
348
  ]
338
349
  },
339
350
  {
340
- "slug":"bracket-push",
341
- "difficulty":1,
351
+ "slug":"pascals-triangle",
352
+ "difficulty":4,
342
353
  "topics":[
343
- "Strings",
344
- "Parsing"
354
+ "Control-flow (loops)",
355
+ "Lists",
356
+ "Mathematics"
345
357
  ]
346
358
  },
347
359
  {
348
- "slug":"queen-attack",
349
- "difficulty":1,
360
+ "slug":"pythagorean-triplet",
361
+ "difficulty":4,
350
362
  "topics":[
351
- "Strings",
352
- "Optional values",
353
- "Logic",
354
- "Games"
363
+ "Integers",
364
+ "Mathematics",
365
+ "Sequences",
366
+ "Tuples"
355
367
  ]
356
368
  },
357
369
  {
358
- "slug":"binary-search-tree",
359
- "difficulty":1,
370
+ "slug":"saddle-points",
371
+ "difficulty":4,
360
372
  "topics":[
361
- "Searching",
373
+ "Matrices",
362
374
  "Lists",
363
- "Trees",
364
- "Generics"
365
- ]
366
- },
367
- {
368
- "slug":"largest-series-product",
369
- "difficulty":1,
370
- "topics":[
371
- "Strings",
372
- "Integers",
373
- "Optional values",
374
- "Transforming",
375
- "Mathematics"
375
+ "Sets",
376
+ "Tuples"
376
377
  ]
377
378
  },
378
379
  {
379
- "slug":"luhn",
380
- "difficulty":1,
380
+ "slug":"acronym",
381
+ "difficulty":4,
381
382
  "topics":[
382
383
  "Strings",
383
- "Algorithms",
384
384
  "Transforming"
385
385
  ]
386
386
  },
387
387
  {
388
- "slug":"perfect-numbers",
389
- "difficulty":1,
388
+ "slug":"run-length-encoding",
389
+ "difficulty":5,
390
390
  "topics":[
391
- "Enumerations",
392
- "Integers",
393
- "Mathematics"
391
+ "Algorithms",
392
+ "Transforming",
393
+ "Strings"
394
+ ]
395
+ },
396
+ {
397
+ "slug":"roman-numerals",
398
+ "difficulty":5,
399
+ "topics":[
400
+ "Sequences",
401
+ "Algorithms",
402
+ "Transforming"
394
403
  ]
395
404
  },
396
405
  {
397
- "slug":"clock",
398
- "difficulty":1,
406
+ "slug":"simple-linked-list",
407
+ "difficulty":5,
399
408
  "topics":[
400
- "Time",
401
- "Structural equality"
409
+ "Classes",
410
+ "Lists",
411
+ "Transforming",
412
+ "Generics"
402
413
  ]
403
414
  },
404
415
  {
405
- "slug":"matrix",
406
- "difficulty":1,
416
+ "slug":"atbash-cipher",
417
+ "difficulty":5,
407
418
  "topics":[
408
419
  "Strings",
409
- "Matrices",
410
- "Parsing",
411
- "Vectors"
420
+ "Transforming",
421
+ "Security"
412
422
  ]
413
423
  },
414
424
  {
415
- "slug":"house",
416
- "difficulty":1,
425
+ "slug":"simple-cipher",
426
+ "difficulty":5,
417
427
  "topics":[
428
+ "Optional values",
418
429
  "Strings",
419
- "Text formatting",
420
- "Algorithms"
430
+ "Algorithms",
431
+ "Transforming"
421
432
  ]
422
433
  },
423
434
  {
424
- "slug":"zebra-puzzle",
425
- "difficulty":1,
435
+ "slug":"bank-account",
436
+ "difficulty":5,
426
437
  "topics":[
427
- "Logic"
438
+ "Parallellism"
428
439
  ]
429
440
  },
430
441
  {
431
- "slug":"minesweeper",
432
- "difficulty":1,
442
+ "slug":"crypto-square",
443
+ "difficulty":5,
433
444
  "topics":[
434
- "Lists",
435
445
  "Strings",
436
- "Parsing",
446
+ "Lists",
447
+ "Security",
437
448
  "Transforming"
438
449
  ]
439
450
  },
440
451
  {
441
- "slug":"ocr-numbers",
442
- "difficulty":1,
452
+ "slug":"bracket-push",
453
+ "difficulty":5,
443
454
  "topics":[
444
- "Lists",
445
455
  "Strings",
446
- "Parsing",
447
- "Pattern recognition",
448
- "Transforming"
456
+ "Parsing"
449
457
  ]
450
458
  },
451
459
  {
452
- "slug":"wordy",
453
- "difficulty":1,
460
+ "slug":"queen-attack",
461
+ "difficulty":5,
454
462
  "topics":[
455
- "Mathematics",
463
+ "Strings",
456
464
  "Optional values",
457
- "Parsing",
465
+ "Logic",
466
+ "Games"
467
+ ]
468
+ },
469
+ {
470
+ "slug":"luhn",
471
+ "difficulty":5,
472
+ "topics":[
458
473
  "Strings",
474
+ "Algorithms",
459
475
  "Transforming"
460
476
  ]
461
477
  },
462
478
  {
463
479
  "slug":"food-chain",
464
- "difficulty":1,
480
+ "difficulty":5,
465
481
  "topics":[
466
482
  "Text formatting",
467
483
  "Algorithms"
@@ -469,7 +485,7 @@
469
485
  },
470
486
  {
471
487
  "slug":"linked-list",
472
- "difficulty":1,
488
+ "difficulty":5,
473
489
  "topics":[
474
490
  "Lists",
475
491
  "Generics",
@@ -478,16 +494,28 @@
478
494
  },
479
495
  {
480
496
  "slug":"custom-set",
481
- "difficulty":1,
497
+ "difficulty":5,
482
498
  "topics":[
483
499
  "Sets",
484
500
  "Lists",
485
501
  "Generics"
486
502
  ]
487
503
  },
504
+ {
505
+ "slug":"parallel-letter-frequency",
506
+ "difficulty":5,
507
+ "topics":[
508
+ "Maps",
509
+ "Sequences",
510
+ "Strings",
511
+ "Parallellism",
512
+ "Transforming",
513
+ "Dictionaries"
514
+ ]
515
+ },
488
516
  {
489
517
  "slug":"nth-prime",
490
- "difficulty":1,
518
+ "difficulty":6,
491
519
  "topics":[
492
520
  "Optional values",
493
521
  "Algorithms",
@@ -496,7 +524,7 @@
496
524
  },
497
525
  {
498
526
  "slug":"palindrome-products",
499
- "difficulty":1,
527
+ "difficulty":6,
500
528
  "topics":[
501
529
  "Sets",
502
530
  "Strings",
@@ -505,102 +533,95 @@
505
533
  ]
506
534
  },
507
535
  {
508
- "slug":"pascals-triangle",
509
- "difficulty":1,
536
+ "slug":"ocr-numbers",
537
+ "difficulty":6,
510
538
  "topics":[
511
- "Control-flow (loops)",
512
539
  "Lists",
513
- "Mathematics"
540
+ "Strings",
541
+ "Parsing",
542
+ "Pattern recognition",
543
+ "Transforming"
514
544
  ]
515
545
  },
516
- {
546
+ {
517
547
  "slug":"pig-latin",
518
- "difficulty":1,
548
+ "difficulty":6,
519
549
  "topics":[
520
550
  "Strings",
521
551
  "Transforming"
522
552
  ]
523
553
  },
524
554
  {
525
- "slug":"pythagorean-triplet",
526
- "difficulty":1,
555
+ "slug":"binary-search-tree",
556
+ "difficulty":6,
527
557
  "topics":[
528
- "Integers",
529
- "Mathematics",
530
- "Sequences",
531
- "Tuples"
558
+ "Searching",
559
+ "Lists",
560
+ "Trees",
561
+ "Generics"
532
562
  ]
533
563
  },
534
564
  {
535
- "slug":"saddle-points",
536
- "difficulty":1,
565
+ "slug":"rail-fence-cipher",
566
+ "difficulty":6,
537
567
  "topics":[
538
- "Matrices",
539
- "Lists",
540
- "Sets",
541
- "Tuples"
568
+ "Strings",
569
+ "Algorithms",
570
+ "Transforming"
542
571
  ]
543
572
  },
544
573
  {
545
- "slug":"say",
546
- "difficulty":1,
574
+ "slug":"bowling",
575
+ "difficulty":6,
547
576
  "topics":[
548
- "Strings",
549
- "Transforming",
550
- "Text formatting",
551
- "Optional values"
577
+ "Algorithms",
578
+ "Control-flow (if-else statements)",
579
+ "Lists"
552
580
  ]
553
- },
581
+ },
554
582
  {
555
- "slug":"alphametics",
556
- "difficulty":1,
583
+ "slug":"dominoes",
584
+ "difficulty":7,
557
585
  "topics":[
558
- "Maps",
586
+ "Lists",
559
587
  "Optional values",
560
- "Strings",
561
- "Parsing"
588
+ "Tuples",
589
+ "Games"
562
590
  ]
563
591
  },
564
- {
565
- "slug":"secret-handshake",
566
- "difficulty":1,
592
+ {
593
+ "slug":"sublist",
594
+ "difficulty":7,
567
595
  "topics":[
568
- "Lists",
569
- "Strings",
570
- "Bitwise operations"
596
+ "Generics",
597
+ "Enumerations",
598
+ "Lists"
571
599
  ]
572
600
  },
573
601
  {
574
- "slug":"series",
575
- "difficulty":1,
602
+ "slug":"minesweeper",
603
+ "difficulty":7,
576
604
  "topics":[
605
+ "Lists",
577
606
  "Strings",
578
- "Sequences",
607
+ "Parsing",
579
608
  "Transforming"
580
609
  ]
581
610
  },
582
611
  {
583
- "slug":"sieve",
584
- "difficulty":1,
612
+ "slug":"wordy",
613
+ "difficulty":7,
585
614
  "topics":[
586
- "Filtering",
587
615
  "Mathematics",
588
- "Lists"
589
- ]
590
- },
591
- {
592
- "slug":"simple-cipher",
593
- "difficulty":1,
594
- "topics":[
595
616
  "Optional values",
617
+ "Parsing",
596
618
  "Strings",
597
- "Algorithms",
598
619
  "Transforming"
599
620
  ]
600
621
  },
601
622
  {
602
623
  "slug":"change",
603
- "difficulty":1,
624
+ "difficulty":7,
604
625
  "topics":[
605
626
  "Integers",
606
627
  "Lists",
@@ -610,7 +631,7 @@
610
631
  },
611
632
  {
612
633
  "slug":"connect",
613
- "difficulty":1,
634
+ "difficulty":8,
614
635
  "topics":[
615
636
  "Recursion",
616
637
  "Graphs",
@@ -621,55 +642,60 @@
621
642
  ]
622
643
  },
623
644
  {
624
- "slug":"rail-fence-cipher",
625
- "difficulty":1,
645
+ "slug":"zebra-puzzle",
646
+ "difficulty":8,
626
647
  "topics":[
627
- "Strings",
628
- "Algorithms",
629
- "Transforming"
648
+ "Logic"
630
649
  ]
631
650
  },
632
651
  {
633
- "slug":"dominoes",
634
- "difficulty":1,
652
+ "slug":"say",
653
+ "difficulty":8,
635
654
  "topics":[
636
- "Lists",
637
- "Optional values",
638
- "Tuples",
639
- "Games"
655
+ "Strings",
656
+ "Transforming",
657
+ "Text formatting",
658
+ "Optional values"
640
659
  ]
641
660
  },
642
661
  {
643
- "slug":"parallel-letter-frequency",
644
- "difficulty":1,
662
+ "slug":"alphametics",
663
+ "difficulty":9,
645
664
  "topics":[
646
665
  "Maps",
647
- "Sequences",
666
+ "Optional values",
648
667
  "Strings",
649
- "Parallellism",
650
- "Transforming",
651
- "Dictionaries"
668
+ "Parsing"
652
669
  ]
653
670
  },
654
671
  {
655
672
  "slug":"sgf-parsing",
656
- "difficulty":1,
673
+ "difficulty":9,
657
674
  "topics":[
658
675
  "Parsing",
659
676
  "Transforming"
660
677
  ]
661
678
  },
662
679
  {
663
- "slug":"acronym",
664
- "difficulty":1,
680
+ "slug":"lens-person",
681
+ "difficulty":9,
665
682
  "topics":[
666
- "Strings",
667
- "Transforming"
683
+
684
+ ]
685
+ },
686
+ {
687
+ "slug":"variable-length-quantity",
688
+ "difficulty":9,
689
+ "topics":[
690
+ "Discriminated unions",
691
+ "Lists",
692
+ "Algorithms",
693
+ "Bitwise operations"
668
694
  ]
669
695
  },
670
696
  {
671
697
  "slug":"zipper",
672
- "difficulty":1,
698
+ "difficulty":10,
673
699
  "topics":[
674
700
  "Generics",
675
701
  "Optional values",
@@ -678,38 +704,12 @@
678
704
  },
679
705
  {
680
706
  "slug":"forth",
681
- "difficulty":1,
707
+ "difficulty":10,
682
708
  "topics":[
683
709
  "Strings",
684
710
  "Mathematics",
685
711
  "Parsing"
686
712
  ]
687
- },
688
- {
689
- "slug":"lens-person",
690
- "difficulty":1,
691
- "topics":[
692
-
693
- ]
694
- },
695
- {
696
- "slug":"bowling",
697
- "difficulty":6,
698
- "topics":[
699
- "Algorithms",
700
- "Control-flow (if-else statements)",
701
- "Lists"
702
- ]
703
- },
704
- {
705
- "slug":"variable-length-quantity",
706
- "difficulty":1,
707
- "topics":[
708
- "Discriminated unions",
709
- "Lists",
710
- "Algorithms",
711
- "Bitwise operations"
712
- ]
713
713
  }
714
714
  ],
715
715
  "deprecated":[