trackler 1.0.4.0 → 1.0.4.1

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 (118) hide show
  1. checksums.yaml +4 -4
  2. data/common/CONTRIBUTING.md +17 -2
  3. data/common/exercises/anagram/canonical-data.json +0 -14
  4. data/common/exercises/pig-latin/canonical-data.json +6 -1
  5. data/common/exercises/raindrops/description.md +4 -4
  6. data/common/exercises/raindrops/metadata.yml +1 -1
  7. data/common/exercises/roman-numerals/metadata.yml +1 -1
  8. data/lib/trackler/version.rb +1 -1
  9. data/tracks/c/config.json +12 -1
  10. data/tracks/c/exercises/roman-numerals/makefile +16 -0
  11. data/tracks/c/exercises/roman-numerals/src/example.c +43 -0
  12. data/tracks/c/exercises/roman-numerals/src/example.h +6 -0
  13. data/tracks/c/exercises/roman-numerals/test/test_roman_numerals.c +126 -0
  14. data/tracks/c/exercises/roman-numerals/test/vendor/unity.c +1300 -0
  15. data/tracks/c/exercises/roman-numerals/test/vendor/unity.h +274 -0
  16. data/tracks/c/exercises/roman-numerals/test/vendor/unity_internals.h +701 -0
  17. data/tracks/clojure/exercises/flatten-array/project.clj +4 -0
  18. data/tracks/csharp/exercises/protein-translation/ProteinTranslationTest.cs +1 -1
  19. data/tracks/elixir/exercises/bowling/bowling_test.exs +157 -62
  20. data/tracks/elixir/exercises/bowling/example.exs +33 -4
  21. data/tracks/erlang/config.json +176 -36
  22. data/tracks/go/.travis.yml +7 -1
  23. data/tracks/go/bin/test-without-stubs +29 -0
  24. data/tracks/go/exercises/robot-simulator/defs.go +1 -1
  25. data/tracks/go/exercises/variable-length-quantity/variable_length_quantity_test.go +31 -25
  26. data/tracks/haskell/.travis.yml +9 -5
  27. data/tracks/haskell/config.json +127 -121
  28. data/tracks/haskell/exercises/leap/src/LeapYear.hs +1 -1
  29. data/tracks/haskell/exercises/space-age/HINTS.md +14 -2
  30. data/tracks/haskell/exercises/space-age/{src/Example.hs → examples/success-double/SpaceAge.hs} +0 -0
  31. data/tracks/haskell/exercises/space-age/examples/success-double/package.yaml +19 -0
  32. data/tracks/haskell/exercises/space-age/examples/success-rational/SpaceAge.hs +24 -0
  33. data/tracks/haskell/exercises/space-age/examples/success-rational/package.yaml +19 -0
  34. data/tracks/haskell/exercises/space-age/src/SpaceAge.hs +4 -1
  35. data/tracks/haskell/exercises/space-age/test/Tests.hs +12 -5
  36. data/tracks/haskell/exercises/word-count/HINTS.md +21 -0
  37. data/tracks/haskell/exercises/word-count/examples/success-newtype/WordCount.hs +31 -0
  38. data/tracks/haskell/exercises/word-count/examples/success-newtype/package.yaml +21 -0
  39. data/tracks/haskell/exercises/word-count/examples/success-simple/WordCount.hs +13 -0
  40. data/tracks/haskell/exercises/word-count/examples/success-simple/package.yaml +20 -0
  41. data/tracks/haskell/exercises/word-count/package.yaml +0 -2
  42. data/tracks/haskell/exercises/word-count/src/WordCount.hs +2 -1
  43. data/tracks/haskell/exercises/word-count/test/Tests.hs +15 -6
  44. data/tracks/haskell/exercises/zebra-puzzle/package.yaml +19 -0
  45. data/tracks/haskell/exercises/zebra-puzzle/src/Example.hs +113 -0
  46. data/tracks/haskell/exercises/zebra-puzzle/src/ZebraPuzzle.hs +12 -0
  47. data/tracks/haskell/exercises/zebra-puzzle/stack.yaml +1 -0
  48. data/tracks/haskell/exercises/zebra-puzzle/test/Tests.hs +13 -0
  49. data/tracks/javascript/exercises/beer-song/beer-song.spec.js +5 -0
  50. data/tracks/lisp/config.json +147 -0
  51. data/tracks/ocaml/config.json +12 -0
  52. data/tracks/ocaml/exercises/atbash-cipher/.merlin +5 -0
  53. data/tracks/ocaml/exercises/atbash-cipher/HINTS.md +17 -0
  54. data/tracks/ocaml/exercises/atbash-cipher/Makefile +11 -0
  55. data/tracks/ocaml/exercises/atbash-cipher/atbash_cipher.mli +5 -0
  56. data/tracks/ocaml/exercises/atbash-cipher/example.ml +47 -0
  57. data/tracks/ocaml/exercises/atbash-cipher/test.ml +37 -0
  58. data/tracks/ocaml/exercises/meetup/.merlin +5 -0
  59. data/tracks/ocaml/exercises/meetup/Makefile +11 -0
  60. data/tracks/ocaml/exercises/meetup/example.ml +63 -0
  61. data/tracks/ocaml/exercises/meetup/meetup.mli +7 -0
  62. data/tracks/ocaml/exercises/meetup/test.ml +786 -0
  63. data/tracks/php/exercises/bowling/bowling_test.php +233 -10
  64. data/tracks/php/exercises/bowling/example.php +49 -6
  65. data/tracks/python/.travis.yml +5 -0
  66. data/tracks/python/config.json +33 -1
  67. data/tracks/python/exercises/flatten-array/example.py +18 -0
  68. data/tracks/python/exercises/flatten-array/flatten_array_test.py +40 -0
  69. data/tracks/python/exercises/robot-name/robot_name_test.py +8 -2
  70. data/tracks/r/config.json +32 -8
  71. data/tracks/ruby/bin/enable-executable +9 -5
  72. data/tracks/ruby/bin/executable-tests-check +7 -3
  73. data/tracks/ruby/bin/local-status-check +4 -4
  74. data/tracks/ruby/config.json +8 -1
  75. data/tracks/ruby/exercises/acronym/acronym_test.rb +0 -1
  76. data/tracks/ruby/exercises/anagram/.version +1 -0
  77. data/tracks/ruby/exercises/anagram/anagram_test.rb +101 -31
  78. data/tracks/ruby/exercises/anagram/example.rb +4 -0
  79. data/tracks/ruby/exercises/anagram/example.tt +19 -0
  80. data/tracks/ruby/exercises/gigasecond/.version +1 -1
  81. data/tracks/ruby/exercises/gigasecond/example.rb +1 -1
  82. data/tracks/ruby/exercises/gigasecond/gigasecond_test.rb +2 -2
  83. data/tracks/ruby/exercises/isogram/.version +1 -0
  84. data/tracks/ruby/exercises/isogram/example.rb +10 -0
  85. data/tracks/ruby/exercises/isogram/example.tt +20 -0
  86. data/tracks/ruby/exercises/isogram/isogram_test.rb +90 -0
  87. data/tracks/ruby/exercises/poker/example.rb +97 -39
  88. data/tracks/ruby/exercises/poker/poker_test.rb +67 -36
  89. data/tracks/ruby/exercises/sieve/.version +1 -0
  90. data/tracks/ruby/exercises/sieve/example.rb +4 -0
  91. data/tracks/ruby/exercises/sieve/example.tt +21 -0
  92. data/tracks/ruby/exercises/sieve/sieve_test.rb +36 -13
  93. data/tracks/ruby/exercises/word-count/example.tt +4 -3
  94. data/tracks/ruby/exercises/word-count/word_count_test.rb +38 -48
  95. data/tracks/ruby/lib/anagram_cases.rb +42 -0
  96. data/tracks/ruby/lib/isogram_cases.rb +24 -0
  97. data/tracks/ruby/lib/sieve_cases.rb +33 -0
  98. data/tracks/ruby/lib/word_count_cases.rb +19 -0
  99. data/tracks/scala/config.json +21 -0
  100. data/tracks/scala/docs/RESOURCES.md +1 -0
  101. data/tracks/scala/exercises/bracket-push/build.sbt +4 -0
  102. data/tracks/scala/exercises/bracket-push/example.scala +23 -0
  103. data/tracks/scala/exercises/bracket-push/src/main/scala/.keep +0 -0
  104. data/tracks/scala/exercises/bracket-push/src/test/scala/BracketsTest.scala +68 -0
  105. data/tracks/scala/exercises/change/src/test/scala/ChangeTest.scala +7 -0
  106. data/tracks/scala/exercises/sgf-parsing/build.sbt +7 -0
  107. data/tracks/scala/exercises/sgf-parsing/example.scala +66 -0
  108. data/tracks/scala/exercises/sgf-parsing/src/main/scala/.keep +0 -0
  109. data/tracks/scala/exercises/sgf-parsing/src/main/scala/Sgf.scala +17 -0
  110. data/tracks/scala/exercises/sgf-parsing/src/test/scala/SgfTest.scala +66 -0
  111. data/tracks/scala/exercises/zebra-puzzle/build.sbt +3 -0
  112. data/tracks/scala/exercises/zebra-puzzle/example.scala +152 -0
  113. data/tracks/scala/exercises/zebra-puzzle/src/main/scala/.keep +0 -0
  114. data/tracks/scala/exercises/zebra-puzzle/src/main/scala/ZebraPuzzle.scala +14 -0
  115. data/tracks/scala/exercises/zebra-puzzle/src/test/scala/ZebraPuzzleTest.scala +11 -0
  116. data/tracks/scala/testgen/src/main/scala/BracketPushTestGenerator.scala +44 -0
  117. metadata +63 -3
  118. data/tracks/haskell/exercises/word-count/src/Example.hs +0 -8
@@ -54,7 +54,9 @@ before_script:
54
54
  # -cpu 2 is for our problems that involve concurrency to test that they
55
55
  # perform as expected on multiple cores.
56
56
  script:
57
- - GOARCH=$TESTARCH RACE=$RACE ./bin/test-without-stubs
57
+ - if [ -n "$STATIC_CHECKERS" ]; then ./bin/test-without-stubs fmt; fi
58
+ - if [ -n "$STATIC_CHECKERS" ]; then ./bin/test-without-stubs vet; fi
59
+ - if [ -z "$STATIC_CHECKERS" ]; then ./bin/test-without-stubs; fi
58
60
 
59
61
  # special cases for the build matrix are that go 1.4.3 can't be tested 32 bit
60
62
  # and that tip is allowed to fail. Broken tips are extremely rare these days
@@ -63,6 +65,10 @@ matrix:
63
65
  exclude:
64
66
  - go: 1.4.3
65
67
  env: TESTARCH=386
68
+ include:
69
+ # Keep this in sync with the latest version.
70
+ - go: 1.7
71
+ env: STATIC_CHECKERS=1
66
72
  allow_failures:
67
73
  - go: tip
68
74
  - go: 1.4.3
@@ -19,8 +19,13 @@ for dir in exercises/*; do
19
19
  fi
20
20
  done
21
21
 
22
+ root=$(pwd)
23
+
22
24
  cleanup () {
23
25
  echo "moving stub files back"
26
+ # the cd for go fmt or go vet could leave us in an unexpected place.
27
+ # cd to a known place.
28
+ cd "$root"
24
29
 
25
30
  # could use `rename` here, but it's not uniform among platforms.
26
31
  # some renames take two arguments while others take a single regex.
@@ -33,6 +38,30 @@ cleanup () {
33
38
 
34
39
  trap cleanup EXIT INT TERM
35
40
 
41
+ if [ "$1" = "fmt" ]; then
42
+ for dir in exercises/*; do
43
+ cd $dir
44
+ if [ -n "$(go fmt)" ]; then
45
+ echo "please run 'go fmt' on $dir" >&2
46
+ exit 1
47
+ fi
48
+ cd "$root"
49
+ done
50
+ exit 0
51
+ fi
52
+
53
+ if [ "$1" = "vet" ]; then
54
+ for dir in exercises/*; do
55
+ cd $dir
56
+ if ! go vet; then
57
+ echo "please follow the 'go vet' suggestions in $dir" >&2
58
+ exit 1
59
+ fi
60
+ cd "$root"
61
+ done
62
+ exit 0
63
+ fi
64
+
36
65
  # This is the last command in the file,
37
66
  # so the exit status of this script is the exit status of go test.
38
67
  # If this ever changes, remember to preserve the exit status acordingly.
@@ -5,7 +5,7 @@ import "fmt"
5
5
  // definitions used in step 1
6
6
 
7
7
  var Step1Robot struct {
8
- X, Y int
8
+ X, Y int
9
9
  Dir
10
10
  }
11
11
 
@@ -5,37 +5,43 @@ import (
5
5
  "testing"
6
6
  )
7
7
 
8
- func TestEncodeDecodeVarint(t *testing.T) {
9
- testCases := []struct {
10
- input []byte
11
- output uint32
12
- size int
13
- }{
14
- 0: {[]byte{0x7F}, 127, 1},
15
- 1: {[]byte{0x81, 0x00}, 128, 1},
16
- 2: {[]byte{0xC0, 0x00}, 8192, 1},
17
- 3: {[]byte{0xFF, 0x7F}, 16383, 1},
18
- 4: {[]byte{0x81, 0x80, 0x00}, 16384, 2},
19
- 5: {[]byte{0xFF, 0xFF, 0x7F}, 2097151, 2},
20
- 6: {[]byte{0x81, 0x80, 0x80, 0x00}, 2097152, 3},
21
- 7: {[]byte{0xC0, 0x80, 0x80, 0x00}, 134217728, 3},
22
- 8: {[]byte{0xFF, 0xFF, 0xFF, 0x7F}, 268435455, 3},
23
-
24
- 9: {[]byte{0x82, 0x00}, 256, 1},
25
- 10: {[]byte{0x81, 0x10}, 144, 1},
26
- }
8
+ var testCases = []struct {
9
+ input []byte
10
+ output uint32
11
+ size int
12
+ }{
13
+ 0: {[]byte{0x7F}, 127, 1},
14
+ 1: {[]byte{0x81, 0x00}, 128, 1},
15
+ 2: {[]byte{0xC0, 0x00}, 8192, 1},
16
+ 3: {[]byte{0xFF, 0x7F}, 16383, 1},
17
+ 4: {[]byte{0x81, 0x80, 0x00}, 16384, 2},
18
+ 5: {[]byte{0xFF, 0xFF, 0x7F}, 2097151, 2},
19
+ 6: {[]byte{0x81, 0x80, 0x80, 0x00}, 2097152, 3},
20
+ 7: {[]byte{0xC0, 0x80, 0x80, 0x00}, 134217728, 3},
21
+ 8: {[]byte{0xFF, 0xFF, 0xFF, 0x7F}, 268435455, 3},
22
+ 9: {[]byte{0x82, 0x00}, 256, 1},
23
+ 10: {[]byte{0x81, 0x10}, 144, 1},
24
+ }
27
25
 
26
+ func TestDecodeVarint(t *testing.T) {
28
27
  for i, tc := range testCases {
29
- t.Logf("test case %d - %#v\n", i, tc.input)
30
28
  o, size := DecodeVarint(tc.input)
31
29
  if o != tc.output {
32
- t.Fatalf("expected %d\ngot\n%d\n", tc.output, o)
33
- }
34
- if size != tc.size {
35
- t.Fatalf("expected encoding size of %d bytes\ngot %d bytes\n", tc.size, size)
30
+ t.Fatalf("FAIL: case %d - expected %d got %d\n", i, tc.output, o)
31
+ } else if size != tc.size {
32
+ t.Fatalf("FAIL: case %d - expected encoding size of %d bytes\ngot %d bytes\n", i, tc.size, size)
33
+ } else {
34
+ t.Logf("PASS: case %d - %#v\n", i, tc.input)
36
35
  }
36
+ }
37
+ }
38
+
39
+ func TestEncodeVarint(t *testing.T) {
40
+ for i, tc := range testCases {
37
41
  if encoded := EncodeVarint(tc.output); bytes.Compare(encoded, tc.input) != 0 {
38
- t.Fatalf("%d - expected %#v\ngot\n%#v\n", tc.output, tc.input, encoded)
42
+ t.Fatalf("FAIL: case %d - %d \nexpected\t%#v\ngot\t\t%#v\n", i, tc.output, tc.input, encoded)
43
+ } else {
44
+ t.Logf("PASS: case %d - %#v\n", i, tc.input)
39
45
  }
40
46
  }
41
47
  }
@@ -52,12 +52,12 @@ script:
52
52
  for exercise in ${TRAVIS_BUILD_DIR}/exercises/* ; do
53
53
  pushd ${exercise}
54
54
 
55
- # `stack --work-dir` fails if not targeting a subdirectory, so we just
56
- # symbolic-link `.stack-work` to a subfolder in the cache directory.
57
- mkdir -p "${HOME}/.foldercache/${exercise}/.stack-work"
58
- ln -f -s "${HOME}/.foldercache/${exercise}/.stack-work"
59
-
60
55
  if [ -f src/Example.hs ]; then
56
+ # `stack --work-dir` fails if not targeting a subdirectory, so we just
57
+ # symbolic-link `.stack-work` to a subfolder in the cache directory.
58
+ mkdir -p "${HOME}/.foldercache/${exercise}/.stack-work"
59
+ ln -f -s "${HOME}/.foldercache/${exercise}/.stack-work"
60
+
61
61
  # Here we prepare the exercise to be tested by Stack.
62
62
  MODULE=`sed -n 's/ *module \+\([a-zA-Z0-9]\+\).*/\1/p' src/Example.hs`
63
63
  mv src/Example.hs "src/${MODULE}.hs"
@@ -68,6 +68,10 @@ script:
68
68
  exit 1
69
69
  else
70
70
  for example in examples/*/ ; do
71
+ examplename=$(basename "$example")
72
+ mkdir -p "${HOME}/.foldercache/${exercise}/${examplename}/.stack-work"
73
+ ln -f -s "${HOME}/.foldercache/${exercise}/${examplename}/.stack-work"
74
+
71
75
  echo "testing ${example}"
72
76
  rm -f src/*.hs
73
77
  mv ${example}/*.hs src
@@ -11,398 +11,404 @@
11
11
  ]
12
12
  },
13
13
  {
14
- "slug": "accumulate",
14
+ "slug": "space-age",
15
15
  "difficulty": 1,
16
16
  "topics": [
17
17
  ]
18
18
  },
19
19
  {
20
- "slug": "sublist",
20
+ "slug": "bob",
21
21
  "difficulty": 1,
22
22
  "topics": [
23
23
  ]
24
24
  },
25
25
  {
26
- "slug": "grains",
26
+ "slug": "rna-transcription",
27
27
  "difficulty": 1,
28
28
  "topics": [
29
29
  ]
30
30
  },
31
31
  {
32
- "slug": "bob",
32
+ "slug": "sum-of-multiples",
33
33
  "difficulty": 1,
34
34
  "topics": [
35
35
  ]
36
36
  },
37
37
  {
38
- "slug": "sum-of-multiples",
38
+ "slug": "difference-of-squares",
39
39
  "difficulty": 1,
40
40
  "topics": [
41
41
  ]
42
42
  },
43
43
  {
44
- "slug": "strain",
45
- "difficulty": 1,
44
+ "slug": "grains",
45
+ "difficulty": 2,
46
46
  "topics": [
47
47
  ]
48
48
  },
49
49
  {
50
50
  "slug": "hamming",
51
- "difficulty": 1,
51
+ "difficulty": 2,
52
52
  "topics": [
53
53
  ]
54
54
  },
55
55
  {
56
- "slug": "rna-transcription",
57
- "difficulty": 1,
56
+ "slug": "nucleotide-count",
57
+ "difficulty": 2,
58
58
  "topics": [
59
59
  ]
60
60
  },
61
61
  {
62
- "slug": "space-age",
63
- "difficulty": 1,
62
+ "slug": "grade-school",
63
+ "difficulty": 2,
64
64
  "topics": [
65
65
  ]
66
66
  },
67
67
  {
68
- "slug": "anagram",
69
- "difficulty": 1,
68
+ "slug": "etl",
69
+ "difficulty": 2,
70
70
  "topics": [
71
71
  ]
72
72
  },
73
73
  {
74
- "slug": "phone-number",
75
- "difficulty": 1,
74
+ "slug": "raindrops",
75
+ "difficulty": 2,
76
76
  "topics": [
77
77
  ]
78
78
  },
79
79
  {
80
- "slug": "nucleotide-count",
81
- "difficulty": 1,
80
+ "slug": "accumulate",
81
+ "difficulty": 3,
82
82
  "topics": [
83
83
  ]
84
84
  },
85
85
  {
86
- "slug": "grade-school",
87
- "difficulty": 1,
86
+ "slug": "strain",
87
+ "difficulty": 3,
88
88
  "topics": [
89
89
  ]
90
90
  },
91
91
  {
92
- "slug": "simple-linked-list",
93
- "difficulty": 1,
92
+ "slug": "phone-number",
93
+ "difficulty": 3,
94
94
  "topics": [
95
95
  ]
96
96
  },
97
97
  {
98
- "slug": "list-ops",
99
- "difficulty": 1,
98
+ "slug": "beer-song",
99
+ "difficulty": 3,
100
100
  "topics": [
101
101
  ]
102
102
  },
103
103
  {
104
- "slug": "word-count",
105
- "difficulty": 1,
104
+ "slug": "triangle",
105
+ "difficulty": 3,
106
106
  "topics": [
107
107
  ]
108
108
  },
109
109
  {
110
- "slug": "etl",
111
- "difficulty": 1,
110
+ "slug": "scrabble-score",
111
+ "difficulty": 3,
112
112
  "topics": [
113
113
  ]
114
114
  },
115
115
  {
116
- "slug": "robot-name",
117
- "difficulty": 1,
116
+ "slug": "kindergarten-garden",
117
+ "difficulty": 3,
118
118
  "topics": [
119
119
  ]
120
120
  },
121
121
  {
122
- "slug": "meetup",
123
- "difficulty": 1,
122
+ "slug": "robot-simulator",
123
+ "difficulty": 3,
124
124
  "topics": [
125
125
  ]
126
126
  },
127
127
  {
128
- "slug": "beer-song",
129
- "difficulty": 1,
128
+ "slug": "secret-handshake",
129
+ "difficulty": 3,
130
130
  "topics": [
131
131
  ]
132
132
  },
133
133
  {
134
- "slug": "triangle",
135
- "difficulty": 1,
134
+ "slug": "anagram",
135
+ "difficulty": 4,
136
136
  "topics": [
137
137
  ]
138
138
  },
139
139
  {
140
- "slug": "scrabble-score",
141
- "difficulty": 1,
140
+ "slug": "simple-linked-list",
141
+ "difficulty": 4,
142
142
  "topics": [
143
143
  ]
144
144
  },
145
145
  {
146
- "slug": "roman-numerals",
147
- "difficulty": 1,
146
+ "slug": "list-ops",
147
+ "difficulty": 4,
148
148
  "topics": [
149
149
  ]
150
150
  },
151
151
  {
152
- "slug": "prime-factors",
153
- "difficulty": 1,
152
+ "slug": "word-count",
153
+ "difficulty": 4,
154
154
  "topics": [
155
155
  ]
156
156
  },
157
157
  {
158
- "slug": "raindrops",
159
- "difficulty": 1,
158
+ "slug": "meetup",
159
+ "difficulty": 4,
160
160
  "topics": [
161
161
  ]
162
162
  },
163
163
  {
164
- "slug": "allergies",
165
- "difficulty": 1,
164
+ "slug": "roman-numerals",
165
+ "difficulty": 4,
166
166
  "topics": [
167
167
  ]
168
168
  },
169
169
  {
170
- "slug": "atbash-cipher",
171
- "difficulty": 1,
170
+ "slug": "prime-factors",
171
+ "difficulty": 4,
172
+ "topics": [
173
+ ]
174
+ },
175
+ {
176
+ "slug": "allergies",
177
+ "difficulty": 4,
172
178
  "topics": [
173
179
  ]
174
180
  },
175
181
  {
176
182
  "slug": "all-your-base",
177
- "difficulty": 1,
183
+ "difficulty": 4,
178
184
  "topics": [
179
185
  ]
180
186
  },
181
187
  {
182
- "slug": "bank-account",
183
- "difficulty": 1,
188
+ "slug": "largest-series-product",
189
+ "difficulty": 4,
184
190
  "topics": [
185
191
  ]
186
192
  },
187
193
  {
188
- "slug": "crypto-square",
189
- "difficulty": 1,
194
+ "slug": "clock",
195
+ "difficulty": 4,
190
196
  "topics": [
191
197
  ]
192
198
  },
193
199
  {
194
- "slug": "kindergarten-garden",
195
- "difficulty": 1,
200
+ "slug": "matrix",
201
+ "difficulty": 4,
196
202
  "topics": [
197
203
  ]
198
204
  },
199
205
  {
200
- "slug": "robot-simulator",
201
- "difficulty": 1,
206
+ "slug": "house",
207
+ "difficulty": 4,
202
208
  "topics": [
203
209
  ]
204
210
  },
205
211
  {
206
- "slug": "queen-attack",
207
- "difficulty": 1,
212
+ "slug": "pascals-triangle",
213
+ "difficulty": 4,
208
214
  "topics": [
209
215
  ]
210
216
  },
211
217
  {
212
- "slug": "binary-search-tree",
213
- "difficulty": 1,
218
+ "slug": "pythagorean-triplet",
219
+ "difficulty": 4,
214
220
  "topics": [
215
221
  ]
216
222
  },
217
223
  {
218
- "slug": "difference-of-squares",
219
- "difficulty": 1,
224
+ "slug": "saddle-points",
225
+ "difficulty": 4,
220
226
  "topics": [
221
227
  ]
222
228
  },
223
229
  {
224
- "slug": "largest-series-product",
225
- "difficulty": 1,
230
+ "slug": "series",
231
+ "difficulty": 4,
226
232
  "topics": [
227
233
  ]
228
234
  },
229
235
  {
230
- "slug": "luhn",
231
- "difficulty": 1,
236
+ "slug": "sieve",
237
+ "difficulty": 4,
232
238
  "topics": [
233
239
  ]
234
240
  },
235
241
  {
236
- "slug": "clock",
237
- "difficulty": 1,
242
+ "slug": "atbash-cipher",
243
+ "difficulty": 5,
238
244
  "topics": [
239
245
  ]
240
246
  },
241
247
  {
242
- "slug": "matrix",
243
- "difficulty": 1,
248
+ "slug": "crypto-square",
249
+ "difficulty": 5,
244
250
  "topics": [
245
251
  ]
246
252
  },
247
253
  {
248
- "slug": "house",
249
- "difficulty": 1,
254
+ "slug": "nth-prime",
255
+ "difficulty": 5,
250
256
  "topics": [
251
257
  ]
252
258
  },
253
259
  {
254
- "slug": "minesweeper",
255
- "difficulty": 1,
260
+ "slug": "binary-search-tree",
261
+ "difficulty": 5,
256
262
  "topics": [
257
263
  ]
258
264
  },
259
265
  {
260
- "slug": "ocr-numbers",
261
- "difficulty": 1,
266
+ "slug": "luhn",
267
+ "difficulty": 5,
262
268
  "topics": [
263
269
  ]
264
270
  },
265
271
  {
266
- "slug": "wordy",
267
- "difficulty": 1,
272
+ "slug": "queen-attack",
273
+ "difficulty": 5,
268
274
  "topics": [
269
275
  ]
270
276
  },
271
277
  {
272
- "slug": "food-chain",
273
- "difficulty": 1,
278
+ "slug": "ocr-numbers",
279
+ "difficulty": 5,
274
280
  "topics": [
275
281
  ]
276
282
  },
277
283
  {
278
- "slug": "linked-list",
279
- "difficulty": 1,
284
+ "slug": "food-chain",
285
+ "difficulty": 5,
280
286
  "topics": [
281
287
  ]
282
288
  },
283
289
  {
284
290
  "slug": "custom-set",
285
- "difficulty": 1,
291
+ "difficulty": 5,
286
292
  "topics": [
287
293
  ]
288
294
  },
289
295
  {
290
- "slug": "nth-prime",
291
- "difficulty": 1,
296
+ "slug": "parallel-letter-frequency",
297
+ "difficulty": 5,
292
298
  "topics": [
293
299
  ]
294
300
  },
295
301
  {
296
- "slug": "palindrome-products",
297
- "difficulty": 1,
302
+ "slug": "simple-cipher",
303
+ "difficulty": 6,
298
304
  "topics": [
299
305
  ]
300
306
  },
301
307
  {
302
- "slug": "pascals-triangle",
303
- "difficulty": 1,
308
+ "slug": "palindrome-products",
309
+ "difficulty": 6,
304
310
  "topics": [
305
311
  ]
306
312
  },
307
313
  {
308
- "slug": "pig-latin",
309
- "difficulty": 1,
314
+ "slug": "robot-name",
315
+ "difficulty": 6,
310
316
  "topics": [
311
317
  ]
312
318
  },
313
319
  {
314
- "slug": "pythagorean-triplet",
315
- "difficulty": 1,
320
+ "slug": "pig-latin",
321
+ "difficulty": 6,
316
322
  "topics": [
317
323
  ]
318
324
  },
319
325
  {
320
- "slug": "saddle-points",
321
- "difficulty": 1,
326
+ "slug": "say",
327
+ "difficulty": 6,
322
328
  "topics": [
323
329
  ]
324
330
  },
325
331
  {
326
- "slug": "say",
327
- "difficulty": 1,
332
+ "slug": "bank-account",
333
+ "difficulty": 6,
328
334
  "topics": [
329
335
  ]
330
336
  },
331
337
  {
332
- "slug": "secret-handshake",
333
- "difficulty": 1,
338
+ "slug": "sublist",
339
+ "difficulty": 6,
334
340
  "topics": [
335
341
  ]
336
342
  },
337
343
  {
338
- "slug": "series",
339
- "difficulty": 1,
344
+ "slug": "linked-list",
345
+ "difficulty": 6,
340
346
  "topics": [
341
347
  ]
342
348
  },
343
349
  {
344
- "slug": "sieve",
345
- "difficulty": 1,
350
+ "slug": "zebra-puzzle",
351
+ "difficulty": 7,
346
352
  "topics": [
347
353
  ]
348
354
  },
349
355
  {
350
- "slug": "simple-cipher",
351
- "difficulty": 1,
356
+ "slug": "minesweeper",
357
+ "difficulty": 7,
352
358
  "topics": [
353
359
  ]
354
360
  },
355
361
  {
356
- "slug": "change",
357
- "difficulty": 1,
362
+ "slug": "wordy",
363
+ "difficulty": 7,
358
364
  "topics": [
359
365
  ]
360
366
  },
361
367
  {
362
- "slug": "connect",
363
- "difficulty": 1,
368
+ "slug": "change",
369
+ "difficulty": 7,
364
370
  "topics": [
365
371
  ]
366
372
  },
367
373
  {
368
- "slug": "parallel-letter-frequency",
369
- "difficulty": 1,
374
+ "slug": "connect",
375
+ "difficulty": 8,
370
376
  "topics": [
371
377
  ]
372
378
  },
373
379
  {
374
380
  "slug": "sgf-parsing",
375
- "difficulty": 1,
381
+ "difficulty": 9,
376
382
  "topics": [
377
383
  ]
378
384
  },
379
385
  {
380
386
  "slug": "go-counting",
381
- "difficulty": 1,
387
+ "difficulty": 9,
382
388
  "topics": [
383
389
  ]
384
390
  },
385
391
  {
386
- "slug": "zipper",
387
- "difficulty": 1,
392
+ "slug": "lens-person",
393
+ "difficulty": 9,
388
394
  "topics": [
389
395
  ]
390
396
  },
391
397
  {
392
- "slug": "forth",
393
- "difficulty": 1,
398
+ "slug": "zipper",
399
+ "difficulty": 10,
394
400
  "topics": [
395
401
  ]
396
402
  },
397
403
  {
398
- "slug": "lens-person",
399
- "difficulty": 1,
404
+ "slug": "forth",
405
+ "difficulty": 10,
400
406
  "topics": [
401
407
  ]
402
408
  },
403
409
  {
404
410
  "slug": "pov",
405
- "difficulty": 1,
411
+ "difficulty": 10,
406
412
  "topics": [
407
413
  ]
408
414
  }