trackler 1.0.4.0 → 1.0.4.1

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