trackler 2.2.1.10 → 2.2.1.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (240) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +3 -0
  3. data/lib/trackler/version.rb +1 -1
  4. data/problem-specifications/CONTRIBUTING.md +1 -1
  5. data/problem-specifications/TOPICS.txt +1 -0
  6. data/problem-specifications/exercises/accumulate/description.md +0 -3
  7. data/problem-specifications/exercises/hamming/canonical-data.json +3 -3
  8. data/problem-specifications/exercises/house/canonical-data.json +322 -0
  9. data/problem-specifications/exercises/palindrome-products/description.md +2 -2
  10. data/problem-specifications/exercises/simple-cipher/description.md +1 -1
  11. data/tracks/bash/config.json +0 -11
  12. data/tracks/cpp/docs/ABOUT.md +12 -37
  13. data/tracks/csharp/config.json +37 -0
  14. data/tracks/csharp/config/maintainers.json +10 -0
  15. data/tracks/csharp/docs/ABOUT.md +1 -1
  16. data/tracks/csharp/docs/RESOURCES.md +2 -2
  17. data/tracks/csharp/exercises/Exercises.All.sln +50 -8
  18. data/tracks/csharp/exercises/Exercises.Default.sln +50 -8
  19. data/tracks/csharp/exercises/collatz-conjecture/CollatzConjecture.cs +9 -0
  20. data/tracks/csharp/exercises/collatz-conjecture/CollatzConjecture.csproj +18 -0
  21. data/tracks/csharp/exercises/collatz-conjecture/CollatzConjectureTest.cs +43 -0
  22. data/tracks/csharp/exercises/collatz-conjecture/Example.cs +30 -0
  23. data/tracks/csharp/exercises/collatz-conjecture/README.md +38 -0
  24. data/tracks/csharp/exercises/diamond/Diamond.cs +1 -1
  25. data/tracks/csharp/exercises/diamond/Diamond.csproj +3 -1
  26. data/tracks/csharp/exercises/diamond/DiamondTest.cs +39 -21
  27. data/tracks/csharp/exercises/diamond/Example.cs +2 -2
  28. data/tracks/csharp/exercises/diamond/HINTS.md +3 -1
  29. data/tracks/csharp/exercises/spiral-matrix/Example.cs +40 -0
  30. data/tracks/csharp/exercises/spiral-matrix/README.md +36 -0
  31. data/tracks/csharp/exercises/spiral-matrix/SpiralMatrix.cs +9 -0
  32. data/tracks/csharp/exercises/spiral-matrix/SpiralMatrix.csproj +18 -0
  33. data/tracks/csharp/exercises/spiral-matrix/SpiralMatrixTest.cs +78 -0
  34. data/tracks/csharp/exercises/two-fer/Example.cs +16 -0
  35. data/tracks/csharp/exercises/two-fer/README.md +25 -0
  36. data/tracks/csharp/exercises/two-fer/TwoFer.cs +9 -0
  37. data/tracks/csharp/exercises/two-fer/TwoFer.csproj +18 -0
  38. data/tracks/csharp/exercises/two-fer/TwoFerTest.cs +24 -0
  39. data/tracks/dart/README.md +1 -1
  40. data/tracks/dart/docs/EXERCISE_README_INSERT.md +9 -0
  41. data/tracks/dart/docs/INSTALLATION.md +13 -0
  42. data/tracks/dart/docs/LEARNING.md +6 -0
  43. data/tracks/dart/docs/RESOURCES.md +7 -0
  44. data/tracks/dart/docs/TESTS.md +133 -0
  45. data/tracks/delphi/docs/ABOUT.md +18 -5
  46. data/tracks/delphi/docs/Getting_Started_Guide.md +930 -0
  47. data/tracks/delphi/exercises/hamming/uHammingExample.pas +1 -1
  48. data/tracks/delphi/exercises/hamming/uHammingTests.pas +15 -15
  49. data/tracks/ecmascript/.travis.yml +2 -1
  50. data/tracks/ecmascript/Makefile +19 -8
  51. data/tracks/ecmascript/config.json +16 -0
  52. data/tracks/ecmascript/exercises/accumulate/package.json +5 -5
  53. data/tracks/ecmascript/exercises/acronym/package.json +5 -5
  54. data/tracks/ecmascript/exercises/all-your-base/package.json +5 -5
  55. data/tracks/ecmascript/exercises/allergies/package.json +5 -5
  56. data/tracks/ecmascript/exercises/alphametics/package.json +5 -5
  57. data/tracks/ecmascript/exercises/anagram/package.json +5 -5
  58. data/tracks/ecmascript/exercises/atbash-cipher/package.json +5 -5
  59. data/tracks/ecmascript/exercises/beer-song/package.json +5 -5
  60. data/tracks/ecmascript/exercises/binary-search-tree/package.json +5 -5
  61. data/tracks/ecmascript/exercises/binary-search/package.json +5 -5
  62. data/tracks/ecmascript/exercises/binary/package.json +5 -5
  63. data/tracks/ecmascript/exercises/bob/package.json +5 -5
  64. data/tracks/ecmascript/exercises/bracket-push/package.json +5 -5
  65. data/tracks/ecmascript/exercises/circular-buffer/package.json +5 -5
  66. data/tracks/ecmascript/exercises/clock/package.json +5 -5
  67. data/tracks/ecmascript/exercises/connect/package.json +5 -5
  68. data/tracks/ecmascript/exercises/crypto-square/package.json +5 -5
  69. data/tracks/ecmascript/exercises/custom-set/package.json +5 -5
  70. data/tracks/ecmascript/exercises/diamond/package.json +5 -5
  71. data/tracks/ecmascript/exercises/difference-of-squares/package.json +5 -5
  72. data/tracks/ecmascript/exercises/diffie-hellman/package.json +5 -5
  73. data/tracks/ecmascript/exercises/etl/package.json +5 -5
  74. data/tracks/ecmascript/exercises/flatten-array/package.json +5 -5
  75. data/tracks/ecmascript/exercises/food-chain/package.json +5 -5
  76. data/tracks/ecmascript/exercises/gigasecond/package.json +5 -5
  77. data/tracks/ecmascript/exercises/grade-school/package.json +5 -5
  78. data/tracks/ecmascript/exercises/grains/package.json +5 -5
  79. data/tracks/ecmascript/exercises/hamming/package.json +5 -5
  80. data/tracks/ecmascript/exercises/hello-world/package.json +5 -5
  81. data/tracks/ecmascript/exercises/hexadecimal/package.json +5 -5
  82. data/tracks/ecmascript/exercises/isogram/package.json +5 -5
  83. data/tracks/ecmascript/exercises/kindergarten-garden/package.json +5 -5
  84. data/tracks/ecmascript/exercises/largest-series-product/package.json +5 -5
  85. data/tracks/ecmascript/exercises/leap/package.json +5 -5
  86. data/tracks/ecmascript/exercises/linked-list/package.json +5 -5
  87. data/tracks/ecmascript/exercises/list-ops/package.json +5 -5
  88. data/tracks/ecmascript/exercises/luhn/package.json +5 -5
  89. data/tracks/ecmascript/exercises/matrix/package.json +5 -5
  90. data/tracks/ecmascript/exercises/meetup/package.json +5 -5
  91. data/tracks/ecmascript/exercises/minesweeper/package.json +5 -5
  92. data/tracks/ecmascript/exercises/nth-prime/package.json +5 -5
  93. data/tracks/ecmascript/exercises/ocr-numbers/package.json +5 -5
  94. data/tracks/ecmascript/exercises/octal/package.json +5 -5
  95. data/tracks/ecmascript/exercises/palindrome-products/package.json +5 -5
  96. data/tracks/ecmascript/exercises/pangram/package.json +5 -5
  97. data/tracks/ecmascript/exercises/pascals-triangle/package.json +5 -5
  98. data/tracks/ecmascript/exercises/perfect-numbers/package.json +5 -5
  99. data/tracks/ecmascript/exercises/phone-number/package.json +5 -5
  100. data/tracks/ecmascript/exercises/pig-latin/package.json +5 -5
  101. data/tracks/ecmascript/exercises/prime-factors/package.json +5 -5
  102. data/tracks/ecmascript/exercises/pythagorean-triplet/package.json +5 -5
  103. data/tracks/ecmascript/exercises/queen-attack/package.json +5 -5
  104. data/tracks/ecmascript/exercises/raindrops/package.json +5 -5
  105. data/tracks/ecmascript/exercises/rna-transcription/package.json +5 -5
  106. data/tracks/ecmascript/exercises/robot-name/package.json +5 -5
  107. data/tracks/ecmascript/exercises/robot-simulator/package.json +5 -5
  108. data/tracks/ecmascript/exercises/roman-numerals/package.json +5 -5
  109. data/tracks/ecmascript/exercises/run-length-encoding/README.md +59 -0
  110. data/tracks/ecmascript/exercises/run-length-encoding/example.js +13 -0
  111. data/tracks/ecmascript/exercises/run-length-encoding/package.json +69 -0
  112. data/tracks/ecmascript/exercises/run-length-encoding/run-length-encoding.spec.js +59 -0
  113. data/tracks/ecmascript/exercises/saddle-points/package.json +5 -5
  114. data/tracks/ecmascript/exercises/say/package.json +5 -5
  115. data/tracks/ecmascript/exercises/scrabble-score/package.json +5 -5
  116. data/tracks/ecmascript/exercises/secret-handshake/package.json +5 -5
  117. data/tracks/ecmascript/exercises/series/package.json +5 -5
  118. data/tracks/ecmascript/exercises/sieve/package.json +5 -5
  119. data/tracks/ecmascript/exercises/simple-cipher/package.json +5 -5
  120. data/tracks/ecmascript/exercises/space-age/package.json +5 -5
  121. data/tracks/ecmascript/exercises/strain/package.json +5 -5
  122. data/tracks/ecmascript/exercises/sublist/package.json +5 -5
  123. data/tracks/ecmascript/exercises/sum-of-multiples/package.json +5 -5
  124. data/tracks/ecmascript/exercises/triangle/package.json +5 -5
  125. data/tracks/ecmascript/exercises/trinary/package.json +5 -5
  126. data/tracks/ecmascript/exercises/twelve-days/package.json +6 -5
  127. data/tracks/ecmascript/exercises/two-bucket/package.json +5 -5
  128. data/tracks/ecmascript/exercises/word-count/package.json +5 -5
  129. data/tracks/ecmascript/exercises/wordy/package.json +5 -5
  130. data/tracks/ecmascript/package.json +5 -5
  131. data/tracks/ecmascript/yarn.lock +403 -152
  132. data/tracks/elixir/docs/ABOUT.md +7 -20
  133. data/tracks/erlang/docs/ABOUT.md +4 -6
  134. data/tracks/fsharp/config.json +2 -1
  135. data/tracks/fsharp/docs/ABOUT.md +6 -2
  136. data/tracks/gnu-apl/.gitignore +4 -0
  137. data/tracks/gnu-apl/.travis.yml +5 -0
  138. data/tracks/gnu-apl/LICENSE +21 -0
  139. data/tracks/gnu-apl/README.md +67 -0
  140. data/tracks/gnu-apl/bin/fetch-configlet +32 -0
  141. data/tracks/gnu-apl/config.json +15 -0
  142. data/tracks/{scala/exercises/binary-search/src/main/scala/BinarySearch.scala → gnu-apl/config/exercise-readme-insert.md} +0 -0
  143. data/tracks/gnu-apl/config/exercise-readme.go.tmpl +16 -0
  144. data/tracks/gnu-apl/config/maintainers.json +6 -0
  145. data/tracks/gnu-apl/docs/ABOUT.md +0 -0
  146. data/tracks/gnu-apl/docs/INSTALLATION.md +0 -0
  147. data/tracks/gnu-apl/docs/LEARNING.md +0 -0
  148. data/tracks/gnu-apl/docs/RESOURCES.md +0 -0
  149. data/tracks/gnu-apl/docs/TESTS.md +0 -0
  150. data/tracks/gnu-apl/img/.keep +0 -0
  151. data/tracks/go/docs/ABOUT.md +4 -2
  152. data/tracks/go/exercises/pangram/example.go +1 -1
  153. data/tracks/go/exercises/pangram/pangram.go +1 -1
  154. data/tracks/go/exercises/pangram/pangram_test.go +1 -3
  155. data/tracks/groovy/README.md +2 -0
  156. data/tracks/groovy/config.json +25 -20
  157. data/tracks/groovy/docs/ABOUT.md +10 -3
  158. data/tracks/groovy/exercises/difference-of-squares/DifferenceOfSquares.groovy +19 -0
  159. data/tracks/groovy/exercises/difference-of-squares/{SquaresSpec.groovy → DifferenceOfSquaresSpec.groovy} +3 -3
  160. data/tracks/groovy/exercises/difference-of-squares/Example.groovy +1 -1
  161. data/tracks/groovy/exercises/hamming/Hamming.groovy +7 -0
  162. data/tracks/groovy/exercises/leap/Example.groovy +2 -2
  163. data/tracks/groovy/exercises/leap/Leap.groovy +11 -0
  164. data/tracks/groovy/exercises/leap/LeapSpec.groovy +4 -4
  165. data/tracks/groovy/exercises/nth-prime/Example.groovy +1 -1
  166. data/tracks/groovy/exercises/nth-prime/NthPrime.groovy +7 -0
  167. data/tracks/groovy/exercises/nth-prime/{PrimeSpec.groovy → NthPrimeSpec.groovy} +6 -6
  168. data/tracks/groovy/exercises/phone-number/PhoneNumber.groovy +17 -0
  169. data/tracks/groovy/exercises/raindrops/Raindrops.groovy +7 -0
  170. data/tracks/groovy/exercises/rna-transcription/Example.groovy +1 -1
  171. data/tracks/groovy/exercises/rna-transcription/RnaTranscription.groovy +7 -0
  172. data/tracks/groovy/exercises/rna-transcription/{ComplementSpec.groovy → RnaTranscriptionSpec.groovy} +2 -2
  173. data/tracks/groovy/exercises/robot-name/Example.groovy +2 -2
  174. data/tracks/groovy/exercises/robot-name/RobotName.groovy +9 -0
  175. data/tracks/groovy/exercises/robot-name/{RobotSpec.groovy → RobotNameSpec.groovy} +6 -6
  176. data/tracks/groovy/exercises/roman-numerals/Example.groovy +2 -2
  177. data/tracks/groovy/exercises/roman-numerals/RomanNumerals.groovy +7 -0
  178. data/tracks/groovy/exercises/roman-numerals/{RomanSpec.groovy → RomanNumeralsSpec.groovy} +2 -2
  179. data/tracks/groovy/exercises/word-count/Example.groovy +2 -2
  180. data/tracks/groovy/exercises/word-count/{Phrase.groovy → WordCount.groovy} +2 -2
  181. data/tracks/groovy/exercises/word-count/WordCountSpec.groovy +47 -0
  182. data/tracks/java/config.json +84 -74
  183. data/tracks/java/docs/ABOUT.md +11 -5
  184. data/tracks/java/exercises/house/README.md +124 -0
  185. data/tracks/java/exercises/house/build.gradle +18 -0
  186. data/tracks/java/exercises/house/src/example/java/House.java +55 -0
  187. data/tracks/java/exercises/house/src/main/java/.keep +0 -0
  188. data/tracks/java/exercises/house/src/test/java/HouseTest.java +341 -0
  189. data/tracks/java/exercises/minesweeper/src/example/java/MinesweeperBoard.java +3 -3
  190. data/tracks/java/exercises/series/src/test/java/SeriesTest.java +6 -5
  191. data/tracks/java/exercises/settings.gradle +1 -0
  192. data/tracks/java/exercises/two-fer/src/test/java/TwoferTest.java +9 -0
  193. data/tracks/javascript/exercises/circular-buffer/circular-buffer.spec.js +8 -0
  194. data/tracks/javascript/exercises/simple-cipher/README.md +1 -1
  195. data/tracks/kotlin/docs/ABOUT.md +7 -10
  196. data/tracks/lisp/.travis.yml +26 -11
  197. data/tracks/purescript/docs/ABOUT.md +16 -0
  198. data/tracks/r/config.json +1 -1
  199. data/tracks/r/config/maintainers.json +9 -9
  200. data/tracks/r/docs/ABOUT.md +9 -11
  201. data/tracks/r/docs/snippet.txt +10 -0
  202. data/tracks/ruby/docs/ABOUT.md +5 -5
  203. data/tracks/ruby/exercises/collatz-conjecture/.meta/generator/collatz_conjecture_case.rb +1 -2
  204. data/tracks/ruby/exercises/space-age/.meta/generator/space_age_case.rb +1 -2
  205. data/tracks/ruby/exercises/sum-of-multiples/.meta/generator/sum_of_multiples_case.rb +1 -1
  206. data/tracks/ruby/lib/generator/exercise_case.rb +15 -0
  207. data/tracks/scala/exercises/alphametics/src/test/scala/AlphameticsTest.scala +42 -28
  208. data/tracks/scala/exercises/binary-search/example.scala +1 -1
  209. data/tracks/scala/exercises/binary-search/src/main/scala/.keep +0 -0
  210. data/tracks/scala/exercises/binary-search/src/test/scala/BinarySearchTest.scala +13 -22
  211. data/tracks/scala/exercises/bowling/src/main/scala/.keep +0 -0
  212. data/tracks/scala/exercises/bowling/src/test/scala/BowlingSuite.scala +30 -17
  213. data/tracks/scala/exercises/change/src/test/scala/ChangeTest.scala +14 -4
  214. data/tracks/scala/exercises/custom-set/src/test/scala/CustomSetTest.scala +6 -4
  215. data/tracks/scala/exercises/food-chain/example.scala +4 -2
  216. data/tracks/scala/exercises/food-chain/src/test/scala/FoodChainTest.scala +170 -59
  217. data/tracks/scala/exercises/luhn/example.scala +9 -21
  218. data/tracks/scala/exercises/luhn/src/test/scala/LuhnTest.scala +46 -10
  219. data/tracks/scala/testgen/src/main/scala/AlphametricsTestGenerator.scala +42 -0
  220. data/tracks/scala/testgen/src/main/scala/BinarySearchTestGenerator.scala +32 -42
  221. data/tracks/scala/testgen/src/main/scala/BowlingTestGenerator.scala +22 -7
  222. data/tracks/scala/testgen/src/main/scala/ChangeTestGenerator.scala +37 -0
  223. data/tracks/scala/testgen/src/main/scala/CustomSetTestGenerator.scala +25 -20
  224. data/tracks/scala/testgen/src/main/scala/FoodChainTestGenerator.scala +13 -2
  225. data/tracks/scala/testgen/src/main/scala/LuhnTestGenerator.scala +15 -0
  226. data/tracks/scala/testgen/src/main/scala/TestBuilder.scala +10 -0
  227. data/tracks/sml/.travis.yml +9 -2
  228. data/tracks/sml/Makefile +42 -0
  229. data/tracks/sml/docs/EXERCISE_README_INSERT.md +21 -5
  230. data/tracks/sml/docs/RESOURCES.md +1 -1
  231. data/tracks/sml/docs/TESTS.md +2 -2
  232. metadata +67 -17
  233. data/tracks/bash/exercises/word-count/README.md +0 -24
  234. data/tracks/bash/exercises/word-count/example.awk +0 -12
  235. data/tracks/bash/exercises/word-count/example.sh +0 -21
  236. data/tracks/dart/.github/PULL_REQUEST_TEMPLATE.md +0 -23
  237. data/tracks/ecmascript/.babelrc +0 -3
  238. data/tracks/groovy/exercises/roman-numerals/Roman.groovy +0 -33
  239. data/tracks/groovy/exercises/word-count/PhraseSpec.groovy +0 -47
  240. data/tracks/scala/exercises/bowling/src/main/scala/Bowling.scala +0 -11
@@ -1,9 +1,16 @@
1
1
  [Groovy](http://www.groovy-lang.org/) is the Apache Foundation's powerful, optionally typed, dynamic language, which also features static-typing and static compilation capabilities.
2
2
 
3
- Groovy is aimed at improving developer productivity thanks to a concise, easy to learn syntax. It facilitates scripting, Domain-Specific Language authoring, runtime and compile-time meta-programming, and functional programming.
3
+ Groovy is aimed at improving developer productivity thanks to a concise, easy to learn syntax.
4
+ It facilitates scripting, Domain-Specific Language authoring, runtime and compile-time meta-programming, and functional programming.
4
5
 
5
6
  It allows access to the entire ecosystem of Java libraries, and integrates seamlessly with Java applications.
6
7
 
7
- It can be used as a simple scripting language or added to complicated Java frameworks. It powers technologies like Gradle, Spock, Ratpack, Grails, and scripting in Jenkins.
8
+ It can be used as a simple scripting language or added to complicated Java frameworks.
9
+ It powers technologies like:
10
+ * Gradle,
11
+ * Spock,
12
+ * Ratpack,
13
+ * Grails,
14
+ * and scripting in Jenkins.
8
15
 
9
- Also, it is fun.
16
+ Also, it is fun.
@@ -0,0 +1,19 @@
1
+ class DifferenceOfSquares {
2
+
3
+ def DifferenceOfSquares(num) {
4
+ throw new UnsupportedOperationException('Constructor implementation is missing')
5
+ }
6
+
7
+ def squareOfSums() {
8
+ throw new UnsupportedOperationException('Method implementation is missing')
9
+ }
10
+
11
+ def sumOfSquares() {
12
+ throw new UnsupportedOperationException('Method implementation is missing')
13
+ }
14
+
15
+ def difference() {
16
+ throw new UnsupportedOperationException('Method implementation is missing')
17
+ }
18
+
19
+ }
@@ -6,7 +6,7 @@ class SquaresSpec extends Specification {
6
6
  @Unroll("can square the sum of the numbers up to #integer")
7
7
  def "can square the sum up to the given integer"() {
8
8
  expect:
9
- new Squares(integer).squareOfSums() == result
9
+ new DifferenceOfSquares(integer).squareOfSums() == result
10
10
  where:
11
11
  integer | result
12
12
  5 | 225
@@ -18,7 +18,7 @@ class SquaresSpec extends Specification {
18
18
  @Unroll("can sum the squares up to #integer")
19
19
  def 'can sum the squares up to the given integer'() {
20
20
  expect:
21
- new Squares(integer).sumOfSquares() == result
21
+ new DifferenceOfSquares(integer).sumOfSquares() == result
22
22
  where:
23
23
  integer | result
24
24
  5 | 55
@@ -30,7 +30,7 @@ class SquaresSpec extends Specification {
30
30
  @Unroll("can subtract sum of squares from square of sums of #integer")
31
31
  def 'can subtract sum of squares from square of sums'() {
32
32
  expect:
33
- new Squares(integer).difference() == result
33
+ new DifferenceOfSquares(integer).difference() == result
34
34
  where:
35
35
  integer | result
36
36
  0 | 0
@@ -1,4 +1,4 @@
1
- class Squares {
1
+ class DifferenceOfSquares {
2
2
 
3
3
  def naturalNum
4
4
 
@@ -0,0 +1,7 @@
1
+ class Hamming {
2
+
3
+ def compute(strand1, strand2) {
4
+ throw new UnsupportedOperationException('Method implementation is missing')
5
+ }
6
+
7
+ }
@@ -1,8 +1,8 @@
1
- class Year {
1
+ class Leap {
2
2
 
3
3
  Integer year
4
4
 
5
- Year(Integer year) {
5
+ Leap(Integer year) {
6
6
  this.year = year
7
7
  }
8
8
 
@@ -0,0 +1,11 @@
1
+ class Leap {
2
+
3
+ Leap(Integer year) {
4
+ throw new UnsupportedOperationException('Constructor implementation is missing')
5
+ }
6
+
7
+ def isLeapYear() {
8
+ throw new UnsupportedOperationException('Method implementation is missing')
9
+ }
10
+
11
+ }
@@ -4,22 +4,22 @@ import spock.lang.*
4
4
  class LeapSpec extends Specification {
5
5
 
6
6
  def 'a year not divisible by 4 is not a leap year'() {
7
- expect: new Year(2015).isLeapYear() == false
7
+ expect: new Leap(2015).isLeapYear() == false
8
8
  }
9
9
 
10
10
  @Ignore
11
11
  def 'a year divisible by 4, but not 100, is a leap year'() {
12
- expect: new Year(2016).isLeapYear() == true
12
+ expect: new Leap(2016).isLeapYear() == true
13
13
  }
14
14
 
15
15
  @Ignore
16
16
  def 'a year divisible by 100, but not 400, is not a leap year'() {
17
- expect: new Year(2100).isLeapYear() == false
17
+ expect: new Leap(2100).isLeapYear() == false
18
18
  }
19
19
 
20
20
  @Ignore
21
21
  def 'a year divisible by 400 is a leap year'() {
22
- expect: new Year(2000).isLeapYear() == true
22
+ expect: new Leap(2000).isLeapYear() == true
23
23
  }
24
24
 
25
25
  }
@@ -1,4 +1,4 @@
1
- class Prime {
1
+ class NthPrime {
2
2
 
3
3
  private static def isPrime(int n) {
4
4
  def sqrt = Math.ceil(Math.sqrt(n))
@@ -0,0 +1,7 @@
1
+ class NthPrime {
2
+
3
+ static nth(int n) {
4
+ throw new UnsupportedOperationException('Method implementation is missing')
5
+ }
6
+
7
+ }
@@ -1,26 +1,26 @@
1
1
  @Grab('org.spockframework:spock-core:1.0-groovy-2.4')
2
2
  import spock.lang.*
3
3
 
4
- class PrimeSpec extends Specification {
4
+ class NthPrimeSpec extends Specification {
5
5
 
6
6
  def 'can calculate the first prime'() {
7
- expect: Prime.nth(1) == 2
7
+ expect: NthPrime.nth(1) == 2
8
8
  }
9
9
 
10
10
  def 'can calculate the second prime'() {
11
- expect: Prime.nth(2) == 3
11
+ expect: NthPrime.nth(2) == 3
12
12
  }
13
13
 
14
14
  def 'can calculate the sixth prime'() {
15
- expect: Prime.nth(6) == 13
15
+ expect: NthPrime.nth(6) == 13
16
16
  }
17
17
 
18
18
  def 'can calculate a big prime'() {
19
- expect: Prime.nth(10001) == 104743
19
+ expect: NthPrime.nth(10001) == 104743
20
20
  }
21
21
 
22
22
  def 'throws exception when asked for the zeroth prime'() {
23
- when: Prime.nth(0)
23
+ when: NthPrime.nth(0)
24
24
  then: thrown(ArithmeticException)
25
25
  }
26
26
 
@@ -0,0 +1,17 @@
1
+ class PhoneNumber {
2
+
3
+ String areaCode, exchange, subscriber
4
+
5
+ public PhoneNumber(String input) {
6
+ throw new UnsupportedOperationException('Constructor implementation is missing')
7
+ }
8
+
9
+ String getNumber() {
10
+ throw new UnsupportedOperationException('Method implementation is missing')
11
+ }
12
+
13
+ String toString() {
14
+ throw new UnsupportedOperationException('Method implementation is missing')
15
+ }
16
+
17
+ }
@@ -0,0 +1,7 @@
1
+ class Raindrops {
2
+
3
+ def convert(num) {
4
+ throw new UnsupportedOperationException('Method implementation is missing')
5
+ }
6
+
7
+ }
@@ -1,4 +1,4 @@
1
- class Complement {
1
+ class RnaTranscription {
2
2
 
3
3
  private def dnaMap = ["G":"C","C":"G","T":"A","A":"U"]
4
4
  private def rnaMap = ["C":"G","G":"C","A":"T","U":"A"]
@@ -0,0 +1,7 @@
1
+ class RnaTranscription {
2
+
3
+ def ofDNA(strand) {
4
+ throw new UnsupportedOperationException('Method implementation is missing')
5
+ }
6
+
7
+ }
@@ -1,10 +1,10 @@
1
1
  @Grab('org.spockframework:spock-core:1.0-groovy-2.4')
2
2
  import spock.lang.*
3
3
 
4
- class ComplementTest extends Specification {
4
+ class RnaTranscriptionSpec extends Specification {
5
5
 
6
6
  @Shared
7
- def complement = new Complement()
7
+ def complement = new RnaTranscription()
8
8
 
9
9
  def 'the rna complement of cytosine is guanine'() {
10
10
  expect: complement.ofDNA('C') == 'G'
@@ -1,11 +1,11 @@
1
- class Robot {
1
+ class RobotName {
2
2
  String name
3
3
 
4
4
  private def letters = "A".."Z"
5
5
  private def rand = new Random()
6
6
  private def usedNames = new ArrayList()
7
7
 
8
- def Robot() {
8
+ def RobotName() {
9
9
  reset()
10
10
  }
11
11
 
@@ -0,0 +1,9 @@
1
+ class RobotName {
2
+
3
+ String name
4
+
5
+ def RobotName() {
6
+ throw new UnsupportedOperationException('Constructor implementation is missing')
7
+ }
8
+
9
+ }
@@ -1,16 +1,16 @@
1
1
  @Grab('org.spockframework:spock-core:1.0-groovy-2.4')
2
2
  import spock.lang.*
3
3
 
4
- class RobotSpec extends Specification {
4
+ class RobotNameSpec extends Specification {
5
5
 
6
6
  def 'generates a name'() {
7
- expect: new Robot().name =~ /^[a-zA-Z]{2}\d{3}$/
7
+ expect: new RobotName().name =~ /^[a-zA-Z]{2}\d{3}$/
8
8
  }
9
9
 
10
10
  @Ignore
11
11
  def 'generates the same name when called again'() {
12
12
  given:
13
- def robot = new Robot()
13
+ def robot = new RobotName()
14
14
  expect:
15
15
  robot.name == robot.name
16
16
  }
@@ -18,8 +18,8 @@ class RobotSpec extends Specification {
18
18
  @Ignore
19
19
  def 'different robots generate different names'() {
20
20
  given:
21
- def robot = new Robot()
22
- def other_robot = new Robot()
21
+ def robot = new RobotName()
22
+ def other_robot = new RobotName()
23
23
  expect:
24
24
  robot.name != other_robot.name
25
25
  }
@@ -27,7 +27,7 @@ class RobotSpec extends Specification {
27
27
  @Ignore
28
28
  def 'can be reset to generate another name'() {
29
29
  given:
30
- def robot = new Robot()
30
+ def robot = new RobotName()
31
31
  def name_before_reset = robot.name
32
32
  robot.reset()
33
33
  def name_after_reset = robot.name
@@ -1,5 +1,5 @@
1
- class Roman {
2
- def Roman() {
1
+ class RomanNumerals {
2
+ def RomanNumerals() {
3
3
  Integer.metaClass.getRoman = {->
4
4
  def romanMappings = [
5
5
  1000:"M",
@@ -0,0 +1,7 @@
1
+ class RomanNumerals {
2
+ def RomanNumerals() {
3
+ Integer.metaClass.getRoman = {->
4
+ // RETURN the roman representation of an Integer here
5
+ }
6
+ }
7
+ }
@@ -1,10 +1,10 @@
1
1
  @Grab('org.spockframework:spock-core:1.0-groovy-2.4')
2
2
  import spock.lang.*
3
3
 
4
- class RomanSpec extends Specification {
4
+ class RomanNumeralsSpec extends Specification {
5
5
 
6
6
  // register metaclass on Integers
7
- def setup() { new Roman() }
7
+ def setup() { new RomanNumerals() }
8
8
 
9
9
  @Unroll
10
10
  def "can convert arabic #arabic to roman #roman"() {
@@ -1,7 +1,7 @@
1
- class Phrase {
1
+ class WordCount {
2
2
  String input
3
3
 
4
- def Phrase(s) {
4
+ def WordCount(s) {
5
5
  input = s
6
6
  }
7
7
 
@@ -1,6 +1,6 @@
1
- class Phrase {
1
+ class WordCount {
2
2
 
3
- def Phrase(s) {
3
+ def WordCount(s) {
4
4
  // YOUR CODE HERE
5
5
  }
6
6
 
@@ -0,0 +1,47 @@
1
+ @Grab('org.spockframework:spock-core:1.0-groovy-2.4')
2
+ import spock.lang.*
3
+
4
+ class WordCountSpec extends Specification {
5
+
6
+ def 'count one word' () {
7
+ expect: ["word":1] == new WordCount("word").wordCount()
8
+ }
9
+
10
+ def 'count one of each' () {
11
+ expect: ["one":1,"of":1,"each":1] == new WordCount("one of each").wordCount()
12
+ }
13
+
14
+ def 'count multiple occurrences' () {
15
+ def wordCount = new WordCount("one fish two fish red fish blue fish")
16
+ expect: ["one":1,"fish":4,"two":1,"red":1,"blue":1] == wordCount.wordCount()
17
+ }
18
+
19
+ def 'count everything only once' () {
20
+ def wordCount = new WordCount("all the kings horses and all the kings men")
21
+ // call wordCount 2x to verify
22
+ wordCount.wordCount()
23
+ expect: ["all":2,"the":2,"kings":2,"horses":1,"and":1,"men":1] == wordCount.wordCount()
24
+ }
25
+
26
+ def 'ignore punctuation' () {
27
+ def wordCount = new WordCount('car : carpet as java : javascript!!&@$%^&')
28
+ expect: ["car":1,"carpet":1,"as":1,"java":1,"javascript":1] == wordCount.wordCount()
29
+ }
30
+
31
+ def 'handle no spaces' () {
32
+ expect: ["one":1,"two":1,"three":1] == new WordCount("one,two,three").wordCount()
33
+ }
34
+
35
+ def 'include numbers' () {
36
+ expect: ["testing":2,"1":1,"2":1] == new WordCount("testing, 1, 2 testing").wordCount()
37
+ }
38
+
39
+ def 'normalize case' () {
40
+ expect: ["go":3] == new WordCount("go Go GO").wordCount()
41
+ }
42
+
43
+ def 'handle apostrophes' () {
44
+ def wordCount = new WordCount("First: don't laugh. Then: don't cry.")
45
+ expect: ["first":1,"don't":2,"laugh":1,"then":1,"cry":1] == wordCount.wordCount()
46
+ }
47
+ }
@@ -5,7 +5,7 @@
5
5
  {
6
6
  "uuid": "f77dc7e3-35a8-4300-a7c8-2c1765e9644d",
7
7
  "slug": "hello-world",
8
- "core": false,
8
+ "core": true,
9
9
  "unlocked_by": null,
10
10
  "difficulty": 1,
11
11
  "topics": [
@@ -15,7 +15,7 @@
15
15
  {
16
16
  "uuid": "74515d45-565b-4be2-96c4-77e58efa9257",
17
17
  "slug": "two-fer",
18
- "core": false,
18
+ "core": true,
19
19
  "unlocked_by": null,
20
20
  "difficulty": 1,
21
21
  "topics": [
@@ -45,7 +45,7 @@
45
45
  {
46
46
  "uuid": "ce899ca6-9cc7-47ba-b76f-1bbcf2630b76",
47
47
  "slug": "hamming",
48
- "core": false,
48
+ "core": true,
49
49
  "unlocked_by": null,
50
50
  "difficulty": 3,
51
51
  "topics": [
@@ -55,7 +55,7 @@
55
55
  {
56
56
  "uuid": "bf1641c8-dc0d-4d38-9cfe-b4c132ea3553",
57
57
  "slug": "gigasecond",
58
- "core": false,
58
+ "core": true,
59
59
  "unlocked_by": null,
60
60
  "difficulty": 3,
61
61
  "topics": [
@@ -85,7 +85,7 @@
85
85
  {
86
86
  "uuid": "afae9f2d-8baf-4bd7-8d7c-d486337f7c97",
87
87
  "slug": "scrabble-score",
88
- "core": false,
88
+ "core": true,
89
89
  "unlocked_by": null,
90
90
  "difficulty": 3,
91
91
  "topics": [
@@ -96,7 +96,7 @@
96
96
  "uuid": "d916e4f8-fda1-41c0-ab24-79e8fc3f1272",
97
97
  "slug": "raindrops",
98
98
  "core": false,
99
- "unlocked_by": null,
99
+ "unlocked_by": "two-fer",
100
100
  "difficulty": 3,
101
101
  "topics": [
102
102
 
@@ -105,7 +105,7 @@
105
105
  {
106
106
  "uuid": "b0da59c6-1b55-405c-b163-007ebf09f5e8",
107
107
  "slug": "difference-of-squares",
108
- "core": false,
108
+ "core": true,
109
109
  "unlocked_by": null,
110
110
  "difficulty": 3,
111
111
  "topics": [
@@ -115,7 +115,7 @@
115
115
  {
116
116
  "uuid": "71c7c174-7e2c-43c2-bdd6-7515fcb12a91",
117
117
  "slug": "secret-handshake",
118
- "core": false,
118
+ "core": true,
119
119
  "unlocked_by": null,
120
120
  "difficulty": 3,
121
121
  "topics": [
@@ -126,7 +126,7 @@
126
126
  "uuid": "d0dcc898-ec38-4822-9e3c-1a1829c9b2d9",
127
127
  "slug": "perfect-numbers",
128
128
  "core": false,
129
- "unlocked_by": null,
129
+ "unlocked_by": "difference-of-squares",
130
130
  "difficulty": 3,
131
131
  "topics": [
132
132
 
@@ -136,7 +136,7 @@
136
136
  "uuid": "2f244afc-3e7b-4f89-92af-e2b427f4ef35",
137
137
  "slug": "sum-of-multiples",
138
138
  "core": false,
139
- "unlocked_by": null,
139
+ "unlocked_by": "perfect-numbers",
140
140
  "difficulty": 4,
141
141
  "topics": [
142
142
 
@@ -146,7 +146,7 @@
146
146
  "uuid": "5227a76c-8ecb-4e5f-b023-6af65a057c41",
147
147
  "slug": "luhn",
148
148
  "core": false,
149
- "unlocked_by": null,
149
+ "unlocked_by": "hamming",
150
150
  "difficulty": 4,
151
151
  "topics": [
152
152
 
@@ -155,7 +155,7 @@
155
155
  {
156
156
  "uuid": "c1d4e0b4-6a0f-4be9-8222-345966621f53",
157
157
  "slug": "matrix",
158
- "core": false,
158
+ "core": true,
159
159
  "unlocked_by": null,
160
160
  "difficulty": 4,
161
161
  "topics": [
@@ -165,7 +165,7 @@
165
165
  {
166
166
  "uuid": "ec268d8e-997b-4553-8c67-8bdfa1ecb888",
167
167
  "slug": "triangle",
168
- "core": false,
168
+ "core": true,
169
169
  "unlocked_by": null,
170
170
  "difficulty": 4,
171
171
  "topics": [
@@ -176,7 +176,7 @@
176
176
  "uuid": "b7310b6e-435c-4d5f-b2bd-31e586d0f238",
177
177
  "slug": "largest-series-product",
178
178
  "core": false,
179
- "unlocked_by": null,
179
+ "unlocked_by": "luhn",
180
180
  "difficulty": 4,
181
181
  "topics": [
182
182
 
@@ -186,7 +186,7 @@
186
186
  "uuid": "6791d01f-bae4-4b63-ae76-86529ac49e36",
187
187
  "slug": "sieve",
188
188
  "core": false,
189
- "unlocked_by": null,
189
+ "unlocked_by": "sum-of-multiples",
190
190
  "difficulty": 4,
191
191
  "topics": [
192
192
 
@@ -196,7 +196,7 @@
196
196
  "uuid": "581afdbb-dfb6-4dc5-9554-a025b5469a3c",
197
197
  "slug": "twelve-days",
198
198
  "core": false,
199
- "unlocked_by": null,
199
+ "unlocked_by": "raindrops",
200
200
  "difficulty": 4,
201
201
  "topics": [
202
202
 
@@ -205,7 +205,7 @@
205
205
  {
206
206
  "uuid": "9eb41883-55ef-4681-b5ac-5c2259302772",
207
207
  "slug": "rotational-cipher",
208
- "core": false,
208
+ "core": true,
209
209
  "unlocked_by": null,
210
210
  "difficulty": 4,
211
211
  "topics": [
@@ -216,7 +216,7 @@
216
216
  "uuid": "0b92ffee-c092-4ab1-ad78-76c8cf80e1b5",
217
217
  "slug": "kindergarten-garden",
218
218
  "core": false,
219
- "unlocked_by": null,
219
+ "unlocked_by": "matrix",
220
220
  "difficulty": 4,
221
221
  "topics": [
222
222
 
@@ -226,7 +226,7 @@
226
226
  "uuid": "1500d39a-c9d9-4d3a-9e77-fdc1837fc6ad",
227
227
  "slug": "collatz-conjecture",
228
228
  "core": false,
229
- "unlocked_by": null,
229
+ "unlocked_by": "triangle",
230
230
  "difficulty": 4,
231
231
  "topics": [
232
232
 
@@ -236,7 +236,7 @@
236
236
  "uuid": "2c69db99-648d-4bd7-8012-1fbdeff6ca0a",
237
237
  "slug": "nth-prime",
238
238
  "core": false,
239
- "unlocked_by": null,
239
+ "unlocked_by": "collatz-conjecture",
240
240
  "difficulty": 4,
241
241
  "topics": [
242
242
 
@@ -245,7 +245,7 @@
245
245
  {
246
246
  "uuid": "8dfc2f0d-1141-46e9-95e2-6f35ccf6f160",
247
247
  "slug": "saddle-points",
248
- "core": false,
248
+ "core": true,
249
249
  "unlocked_by": null,
250
250
  "difficulty": 4,
251
251
  "topics": [
@@ -256,7 +256,7 @@
256
256
  "uuid": "ecbd997b-86f4-4e11-9ff0-706ac2899415",
257
257
  "slug": "diamond",
258
258
  "core": false,
259
- "unlocked_by": null,
259
+ "unlocked_by": "twelve-days",
260
260
  "difficulty": 4,
261
261
  "topics": [
262
262
 
@@ -266,7 +266,7 @@
266
266
  "uuid": "c3e89c7c-3a8a-4ddc-b653-9b0ff9e1d7d8",
267
267
  "slug": "isogram",
268
268
  "core": false,
269
- "unlocked_by": null,
269
+ "unlocked_by": "pangram",
270
270
  "difficulty": 4,
271
271
  "topics": [
272
272
 
@@ -275,7 +275,7 @@
275
275
  {
276
276
  "uuid": "a732a838-8170-458a-a85e-d6b4c46f97a1",
277
277
  "slug": "flatten-array",
278
- "core": false,
278
+ "core": true,
279
279
  "unlocked_by": null,
280
280
  "difficulty": 5,
281
281
  "topics": [
@@ -286,7 +286,7 @@
286
286
  "uuid": "38bc80ae-d842-4c04-a797-48edf322504d",
287
287
  "slug": "pig-latin",
288
288
  "core": false,
289
- "unlocked_by": null,
289
+ "unlocked_by": "rna-transcription",
290
290
  "difficulty": 5,
291
291
  "topics": [
292
292
 
@@ -296,7 +296,7 @@
296
296
  "uuid": "5f9139e7-9fbb-496a-a0d7-a946283033de",
297
297
  "slug": "phone-number",
298
298
  "core": false,
299
- "unlocked_by": null,
299
+ "unlocked_by": "largest-series-product",
300
300
  "difficulty": 5,
301
301
  "topics": [
302
302
 
@@ -306,7 +306,7 @@
306
306
  "uuid": "2d80fdfc-5bd7-4b67-9fbe-8ab820d89051",
307
307
  "slug": "nucleotide-count",
308
308
  "core": false,
309
- "unlocked_by": null,
309
+ "unlocked_by": "phone-number",
310
310
  "difficulty": 5,
311
311
  "topics": [
312
312
 
@@ -315,7 +315,7 @@
315
315
  {
316
316
  "uuid": "3603b770-87a5-4758-91f3-b4d1f9075bc1",
317
317
  "slug": "word-count",
318
- "core": false,
318
+ "core": true,
319
319
  "unlocked_by": null,
320
320
  "difficulty": 5,
321
321
  "topics": [
@@ -326,7 +326,7 @@
326
326
  "uuid": "4499a3f9-73a7-48bf-8753-d5b6abf588c9",
327
327
  "slug": "run-length-encoding",
328
328
  "core": false,
329
- "unlocked_by": null,
329
+ "unlocked_by": "rotational-cipher",
330
330
  "difficulty": 5,
331
331
  "topics": [
332
332
 
@@ -335,7 +335,7 @@
335
335
  {
336
336
  "uuid": "d7c2eed9-64c7-4c4a-b45d-c787d460337f",
337
337
  "slug": "robot-name",
338
- "core": false,
338
+ "core": true,
339
339
  "unlocked_by": null,
340
340
  "difficulty": 5,
341
341
  "topics": [
@@ -346,7 +346,7 @@
346
346
  "uuid": "599c08ec-7338-46ed-99f8-a76f78f724e6",
347
347
  "slug": "prime-factors",
348
348
  "core": false,
349
- "unlocked_by": null,
349
+ "unlocked_by": "nth-prime",
350
350
  "difficulty": 5,
351
351
  "topics": [
352
352
 
@@ -356,7 +356,7 @@
356
356
  "uuid": "6a617ddb-04e3-451c-bb30-27ccd0be9125",
357
357
  "slug": "allergies",
358
358
  "core": false,
359
- "unlocked_by": null,
359
+ "unlocked_by": "secret-handshake",
360
360
  "difficulty": 5,
361
361
  "topics": [
362
362
 
@@ -366,7 +366,7 @@
366
366
  "uuid": "34cd328c-cd96-492b-abd4-2b8716cdcd9a",
367
367
  "slug": "bob",
368
368
  "core": false,
369
- "unlocked_by": null,
369
+ "unlocked_by": "diamond",
370
370
  "difficulty": 5,
371
371
  "topics": [
372
372
 
@@ -376,7 +376,7 @@
376
376
  "uuid": "d2a76905-1c8c-4b03-b4f7-4fbff19329f3",
377
377
  "slug": "pascals-triangle",
378
378
  "core": false,
379
- "unlocked_by": null,
379
+ "unlocked_by": "kindergarten-garden",
380
380
  "difficulty": 5,
381
381
  "topics": [
382
382
 
@@ -386,7 +386,7 @@
386
386
  "uuid": "85aa50ac-0141-49eb-bc6f-62f3f7a97647",
387
387
  "slug": "bracket-push",
388
388
  "core": false,
389
- "unlocked_by": null,
389
+ "unlocked_by": "flatten-array",
390
390
  "difficulty": 5,
391
391
  "topics": [
392
392
 
@@ -396,7 +396,7 @@
396
396
  "uuid": "af80d7f4-c7d0-4d0b-9c30-09da120f6bb9",
397
397
  "slug": "series",
398
398
  "core": false,
399
- "unlocked_by": null,
399
+ "unlocked_by": "nucleotide-count",
400
400
  "difficulty": 5,
401
401
  "topics": [
402
402
 
@@ -406,7 +406,7 @@
406
406
  "uuid": "d36ce010-210f-4e9a-9d6c-cb933e0a59af",
407
407
  "slug": "atbash-cipher",
408
408
  "core": false,
409
- "unlocked_by": null,
409
+ "unlocked_by": "run-length-encoding",
410
410
  "difficulty": 5,
411
411
  "topics": [
412
412
 
@@ -416,7 +416,7 @@
416
416
  "uuid": "163fcc6b-c054-4232-a88b-0aded846a6eb",
417
417
  "slug": "spiral-matrix",
418
418
  "core": false,
419
- "unlocked_by": null,
419
+ "unlocked_by": "pascals-triangle",
420
420
  "difficulty": 6,
421
421
  "topics": [
422
422
 
@@ -426,7 +426,7 @@
426
426
  "uuid": "3e728cd4-5e5f-4c69-8a53-bc36d020fcdb",
427
427
  "slug": "roman-numerals",
428
428
  "core": false,
429
- "unlocked_by": null,
429
+ "unlocked_by": "series",
430
430
  "difficulty": 6,
431
431
  "topics": [
432
432
 
@@ -436,7 +436,17 @@
436
436
  "uuid": "57b76837-4610-466f-9373-d5c2697625f1",
437
437
  "slug": "transpose",
438
438
  "core": false,
439
- "unlocked_by": null,
439
+ "unlocked_by": "spiral-matrix",
440
+ "difficulty": 6,
441
+ "topics": [
442
+
443
+ ]
444
+ },
445
+ {
446
+ "uuid": "6b51aca3-3451-4a64-ad7b-00b151d7548a",
447
+ "slug": "house",
448
+ "core": false,
449
+ "unlocked_by": "bob",
440
450
  "difficulty": 6,
441
451
  "topics": [
442
452
 
@@ -446,7 +456,7 @@
446
456
  "uuid": "dd3e6fd6-5359-4978-acd7-c39374cead4d",
447
457
  "slug": "food-chain",
448
458
  "core": false,
449
- "unlocked_by": null,
459
+ "unlocked_by": "house",
450
460
  "difficulty": 6,
451
461
  "topics": [
452
462
 
@@ -456,7 +466,7 @@
456
466
  "uuid": "56943095-de76-40bf-b42b-fa3e70f8df5e",
457
467
  "slug": "beer-song",
458
468
  "core": false,
459
- "unlocked_by": null,
469
+ "unlocked_by": "food-chain",
460
470
  "difficulty": 6,
461
471
  "topics": [
462
472
 
@@ -466,7 +476,7 @@
466
476
  "uuid": "5404109e-3ed9-4691-8eaf-af8b36024a44",
467
477
  "slug": "queen-attack",
468
478
  "core": false,
469
- "unlocked_by": null,
479
+ "unlocked_by": "scrabble-score",
470
480
  "difficulty": 6,
471
481
  "topics": [
472
482
 
@@ -476,7 +486,7 @@
476
486
  "uuid": "76d28d97-75d3-47eb-bb77-3d347b76f1b6",
477
487
  "slug": "etl",
478
488
  "core": false,
479
- "unlocked_by": null,
489
+ "unlocked_by": "word-count",
480
490
  "difficulty": 6,
481
491
  "topics": [
482
492
 
@@ -485,7 +495,7 @@
485
495
  {
486
496
  "uuid": "7ba5084d-3b75-4406-a0d7-87c26387f9c0",
487
497
  "slug": "linked-list",
488
- "core": false,
498
+ "core": true,
489
499
  "unlocked_by": null,
490
500
  "difficulty": 6,
491
501
  "topics": [
@@ -496,7 +506,7 @@
496
506
  "uuid": "b4af5da1-601f-4b0f-bfb8-4a381851090c",
497
507
  "slug": "grade-school",
498
508
  "core": false,
499
- "unlocked_by": null,
509
+ "unlocked_by": "etl",
500
510
  "difficulty": 6,
501
511
  "topics": [
502
512
 
@@ -506,7 +516,7 @@
506
516
  "uuid": "993bde9d-7774-4e7a-a381-9eee75f28ecb",
507
517
  "slug": "robot-simulator",
508
518
  "core": false,
509
- "unlocked_by": null,
519
+ "unlocked_by": "allergies",
510
520
  "difficulty": 6,
511
521
  "topics": [
512
522
 
@@ -515,7 +525,7 @@
515
525
  {
516
526
  "uuid": "50136dc3-caf7-4fa1-b7bd-0cba1bea9176",
517
527
  "slug": "binary-search",
518
- "core": false,
528
+ "core": true,
519
529
  "unlocked_by": null,
520
530
  "difficulty": 6,
521
531
  "topics": [
@@ -526,7 +536,7 @@
526
536
  "uuid": "416a1489-12af-4593-8540-0f55285c96b4",
527
537
  "slug": "minesweeper",
528
538
  "core": false,
529
- "unlocked_by": null,
539
+ "unlocked_by": "queen-attack",
530
540
  "difficulty": 6,
531
541
  "topics": [
532
542
 
@@ -536,7 +546,7 @@
536
546
  "uuid": "3310a3cd-c0cb-45fa-8c51-600178be904a",
537
547
  "slug": "wordy",
538
548
  "core": false,
539
- "unlocked_by": null,
549
+ "unlocked_by": "robot-simulator",
540
550
  "difficulty": 6,
541
551
  "topics": [
542
552
 
@@ -546,7 +556,7 @@
546
556
  "uuid": "f7c2e4b5-1995-4dfe-b827-c9aff8ac5332",
547
557
  "slug": "all-your-base",
548
558
  "core": false,
549
- "unlocked_by": null,
559
+ "unlocked_by": "sieve",
550
560
  "difficulty": 6,
551
561
  "topics": [
552
562
 
@@ -555,7 +565,7 @@
555
565
  {
556
566
  "uuid": "a242efc5-159d-492b-861d-12a1459fb334",
557
567
  "slug": "bank-account",
558
- "core": false,
568
+ "core": true,
559
569
  "unlocked_by": null,
560
570
  "difficulty": 6,
561
571
  "topics": [
@@ -566,7 +576,7 @@
566
576
  "uuid": "4b3f7771-c642-4278-a3d9-2fb958f26361",
567
577
  "slug": "bowling",
568
578
  "core": false,
569
- "unlocked_by": null,
579
+ "unlocked_by": "minesweeper",
570
580
  "difficulty": 6,
571
581
  "topics": [
572
582
 
@@ -576,7 +586,7 @@
576
586
  "uuid": "fb10dc2f-0ba1-44b6-8365-5e48e86d1283",
577
587
  "slug": "anagram",
578
588
  "core": false,
579
- "unlocked_by": null,
589
+ "unlocked_by": "isogram",
580
590
  "difficulty": 7,
581
591
  "topics": [
582
592
 
@@ -586,7 +596,7 @@
586
596
  "uuid": "d2aedbd7-092a-43d0-8a5e-ae3ebd5b9c7f",
587
597
  "slug": "sublist",
588
598
  "core": false,
589
- "unlocked_by": null,
599
+ "unlocked_by": "linked-list",
590
600
  "difficulty": 7,
591
601
  "topics": [
592
602
 
@@ -596,7 +606,7 @@
596
606
  "uuid": "b53bde52-cb5f-4d43-86ec-18aa509d62f9",
597
607
  "slug": "word-search",
598
608
  "core": false,
599
- "unlocked_by": null,
609
+ "unlocked_by": "bowling",
600
610
  "difficulty": 7,
601
611
  "topics": [
602
612
 
@@ -606,7 +616,7 @@
606
616
  "uuid": "e3e5ffe5-cfc1-467e-a28a-da0302130144",
607
617
  "slug": "simple-linked-list",
608
618
  "core": false,
609
- "unlocked_by": null,
619
+ "unlocked_by": "sublist",
610
620
  "difficulty": 7,
611
621
  "topics": [
612
622
 
@@ -616,7 +626,7 @@
616
626
  "uuid": "0a2d18aa-7b5e-4401-a952-b93d2060694f",
617
627
  "slug": "binary-search-tree",
618
628
  "core": false,
619
- "unlocked_by": null,
629
+ "unlocked_by": "binary-search",
620
630
  "difficulty": 7,
621
631
  "topics": [
622
632
 
@@ -626,7 +636,7 @@
626
636
  "uuid": "602511d5-7e89-4def-b072-4dd311816810",
627
637
  "slug": "meetup",
628
638
  "core": false,
629
- "unlocked_by": null,
639
+ "unlocked_by": "gigasecond",
630
640
  "difficulty": 7,
631
641
  "topics": [
632
642
 
@@ -636,7 +646,7 @@
636
646
  "uuid": "162bebdc-9bf2-43c0-8460-a91f5fc16147",
637
647
  "slug": "crypto-square",
638
648
  "core": false,
639
- "unlocked_by": null,
649
+ "unlocked_by": "atbash-cipher",
640
650
  "difficulty": 7,
641
651
  "topics": [
642
652
 
@@ -646,7 +656,7 @@
646
656
  "uuid": "57eeac00-741c-4843-907a-51f0ac5ea4cb",
647
657
  "slug": "poker",
648
658
  "core": false,
649
- "unlocked_by": null,
659
+ "unlocked_by": "word-search",
650
660
  "difficulty": 7,
651
661
  "topics": [
652
662
  "Parsing",
@@ -658,7 +668,7 @@
658
668
  "uuid": "97c8fcd4-85b6-41cb-9de2-b4e1b4951222",
659
669
  "slug": "clock",
660
670
  "core": false,
661
- "unlocked_by": null,
671
+ "unlocked_by": "all-your-base",
662
672
  "difficulty": 7,
663
673
  "topics": [
664
674
 
@@ -668,7 +678,7 @@
668
678
  "uuid": "5cbc6a67-3a53-4aad-ae68-ff469525437f",
669
679
  "slug": "ocr-numbers",
670
680
  "core": false,
671
- "unlocked_by": null,
681
+ "unlocked_by": "roman-numerals",
672
682
  "difficulty": 8,
673
683
  "topics": [
674
684
 
@@ -678,7 +688,7 @@
678
688
  "uuid": "626dc25a-062c-4053-a8c1-788e4dc44ca0",
679
689
  "slug": "circular-buffer",
680
690
  "core": false,
681
- "unlocked_by": null,
691
+ "unlocked_by": "simple-linked-list",
682
692
  "difficulty": 8,
683
693
  "topics": [
684
694
  "Queues",
@@ -690,7 +700,7 @@
690
700
  "uuid": "64cda115-919a-4eef-9a45-9ec5d1af98cc",
691
701
  "slug": "rectangles",
692
702
  "core": false,
693
- "unlocked_by": null,
703
+ "unlocked_by": "ocr-numbers",
694
704
  "difficulty": 8,
695
705
  "topics": [
696
706
 
@@ -700,7 +710,7 @@
700
710
  "uuid": "e5f05d00-fe5b-4d78-b2fa-934c1c9afb32",
701
711
  "slug": "book-store",
702
712
  "core": false,
703
- "unlocked_by": null,
713
+ "unlocked_by": "bracket-push",
704
714
  "difficulty": 8,
705
715
  "topics": [
706
716
 
@@ -710,7 +720,7 @@
710
720
  "uuid": "f654831f-c34b-44f5-9dd5-054efbb486f2",
711
721
  "slug": "simple-cipher",
712
722
  "core": false,
713
- "unlocked_by": null,
723
+ "unlocked_by": "crypto-square",
714
724
  "difficulty": 8,
715
725
  "topics": [
716
726
 
@@ -720,7 +730,7 @@
720
730
  "uuid": "52d11278-0d65-4b5b-b387-1374fced3243",
721
731
  "slug": "complex-numbers",
722
732
  "core": false,
723
- "unlocked_by": null,
733
+ "unlocked_by": "prime-factors",
724
734
  "difficulty": 8,
725
735
  "topics": [
726
736
 
@@ -730,7 +740,7 @@
730
740
  "uuid": "a9836565-5c39-4285-b83a-53408be36ccc",
731
741
  "slug": "list-ops",
732
742
  "core": false,
733
- "unlocked_by": null,
743
+ "unlocked_by": "circular-buffer",
734
744
  "difficulty": 8,
735
745
  "topics": [
736
746
 
@@ -740,7 +750,7 @@
740
750
  "uuid": "bac1f4bc-eea9-43c1-8e95-097347f5925e",
741
751
  "slug": "change",
742
752
  "core": false,
743
- "unlocked_by": null,
753
+ "unlocked_by": "book-store",
744
754
  "difficulty": 8,
745
755
  "topics": [
746
756
 
@@ -750,7 +760,7 @@
750
760
  "uuid": "873c05de-b5f5-4c5b-97f0-d1ede8a82832",
751
761
  "slug": "palindrome-products",
752
762
  "core": false,
753
- "unlocked_by": null,
763
+ "unlocked_by": "clock",
754
764
  "difficulty": 8,
755
765
  "topics": [
756
766
 
@@ -760,7 +770,7 @@
760
770
  "uuid": "88505f95-89e5-4a08-8ed2-208eb818cdf1",
761
771
  "slug": "pythagorean-triplet",
762
772
  "core": false,
763
- "unlocked_by": null,
773
+ "unlocked_by": "complex-numbers",
764
774
  "difficulty": 9,
765
775
  "topics": [
766
776
 
@@ -770,7 +780,7 @@
770
780
  "uuid": "f0c0316d-3fb5-455e-952a-91161e7fb298",
771
781
  "slug": "forth",
772
782
  "core": false,
773
- "unlocked_by": null,
783
+ "unlocked_by": "wordy",
774
784
  "difficulty": 9,
775
785
  "topics": [
776
786
 
@@ -780,7 +790,7 @@
780
790
  "uuid": "377fe38b-08ad-4f3a-8118-a43c10f7b9b2",
781
791
  "slug": "custom-set",
782
792
  "core": false,
783
- "unlocked_by": null,
793
+ "unlocked_by": "list-ops",
784
794
  "difficulty": 10,
785
795
  "topics": [
786
796