trackler 2.0.0.8 → 2.0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (226) hide show
  1. checksums.yaml +4 -4
  2. data/common/exercises/bob/canonical-data.json +1 -20
  3. data/common/exercises/raindrops/canonical-data.json +18 -0
  4. data/common/exercises/sublist/canonical-data.json +5 -0
  5. data/lib/trackler/version.rb +1 -1
  6. data/tracks/clojure/config.json +5 -0
  7. data/tracks/clojure/exercises/pig-latin/project.clj +4 -0
  8. data/tracks/clojure/exercises/pig-latin/src/example.clj +49 -0
  9. data/tracks/clojure/exercises/pig-latin/test/pig_latin_test.clj +92 -0
  10. data/tracks/clojure/exercises/robot-name/src/example.clj +8 -11
  11. data/tracks/clojure/exercises/robot-name/test/robot_name_test.clj +23 -18
  12. data/tracks/crystal/config.json +6 -0
  13. data/tracks/crystal/exercises/acronym/spec/acronym_spec.cr +7 -7
  14. data/tracks/crystal/exercises/forth/spec/forth_spec.cr +198 -0
  15. data/tracks/crystal/exercises/forth/src/example.cr +187 -0
  16. data/tracks/crystal/exercises/hello-world/spec/hello_world_spec.cr +3 -3
  17. data/tracks/crystal/src/generator/exercises/acronym.cr +1 -1
  18. data/tracks/crystal/src/generator/exercises/exercise_generator.cr +3 -2
  19. data/tracks/crystal/src/generator/exercises/forth.cr +56 -0
  20. data/tracks/crystal/src/generator/exercises/templates/example.tt +2 -2
  21. data/tracks/crystal/src/generator/spec/exercise_generator_spec.cr +5 -3
  22. data/tracks/csharp/exercises/wordy/WordyTest.cs +2 -2
  23. data/tracks/elixir/config.json +83 -70
  24. data/tracks/fsharp/exercises/wordy/WordyTest.fs +1 -1
  25. data/tracks/go/config.json +28 -3
  26. data/tracks/go/exercises/all-your-base/all_your_base_test.go +185 -0
  27. data/tracks/go/exercises/all-your-base/example.go +60 -0
  28. data/tracks/go/exercises/isogram/example.go +15 -0
  29. data/tracks/go/exercises/isogram/isogram_test.go +50 -0
  30. data/tracks/go/exercises/ledger/ledger.go +2 -2
  31. data/tracks/go/exercises/pangram/example.go +32 -0
  32. data/tracks/go/exercises/pangram/pangram_test.go +43 -0
  33. data/tracks/go/exercises/protein-translation/example.go +59 -0
  34. data/tracks/go/exercises/protein-translation/protein_translation_test.go +69 -0
  35. data/tracks/go/exercises/tree-building/tree_building.go +1 -1
  36. data/tracks/go/exercises/twelve-days/example.go +57 -0
  37. data/tracks/go/exercises/twelve-days/twelve_days_test.go +79 -0
  38. data/tracks/haskell/.travis.yml +13 -8
  39. data/tracks/haskell/config.json +6 -0
  40. data/tracks/haskell/exercises/accumulate/stack.yaml +1 -1
  41. data/tracks/haskell/exercises/all-your-base/stack.yaml +1 -1
  42. data/tracks/haskell/exercises/allergies/stack.yaml +1 -1
  43. data/tracks/haskell/exercises/alphametics/stack.yaml +1 -1
  44. data/tracks/haskell/exercises/anagram/stack.yaml +1 -1
  45. data/tracks/haskell/exercises/atbash-cipher/stack.yaml +1 -1
  46. data/tracks/haskell/exercises/bank-account/stack.yaml +1 -1
  47. data/tracks/haskell/exercises/beer-song/stack.yaml +1 -1
  48. data/tracks/haskell/exercises/binary/stack.yaml +1 -1
  49. data/tracks/haskell/exercises/binary-search-tree/stack.yaml +1 -1
  50. data/tracks/haskell/exercises/bob/stack.yaml +1 -1
  51. data/tracks/haskell/exercises/bowling/HINTS.md +19 -0
  52. data/tracks/haskell/exercises/bowling/examples/success-standard/package.yaml +16 -0
  53. data/tracks/haskell/exercises/bowling/examples/success-standard/src/Bowling.hs +84 -0
  54. data/tracks/haskell/exercises/bowling/package.yaml +19 -0
  55. data/tracks/haskell/exercises/bowling/src/Bowling.hs +9 -0
  56. data/tracks/haskell/exercises/bowling/stack.yaml +1 -0
  57. data/tracks/haskell/exercises/bowling/test/Tests.hs +143 -0
  58. data/tracks/haskell/exercises/change/stack.yaml +1 -1
  59. data/tracks/haskell/exercises/clock/stack.yaml +1 -1
  60. data/tracks/haskell/exercises/connect/stack.yaml +1 -1
  61. data/tracks/haskell/exercises/crypto-square/stack.yaml +1 -1
  62. data/tracks/haskell/exercises/custom-set/stack.yaml +1 -1
  63. data/tracks/haskell/exercises/difference-of-squares/stack.yaml +1 -1
  64. data/tracks/haskell/exercises/dominoes/stack.yaml +1 -1
  65. data/tracks/haskell/exercises/etl/stack.yaml +1 -1
  66. data/tracks/haskell/exercises/food-chain/stack.yaml +1 -1
  67. data/tracks/haskell/exercises/forth/stack.yaml +1 -1
  68. data/tracks/haskell/exercises/gigasecond/stack.yaml +1 -1
  69. data/tracks/haskell/exercises/go-counting/stack.yaml +1 -1
  70. data/tracks/haskell/exercises/grade-school/stack.yaml +1 -1
  71. data/tracks/haskell/exercises/grains/stack.yaml +1 -1
  72. data/tracks/haskell/exercises/hamming/stack.yaml +1 -1
  73. data/tracks/haskell/exercises/hexadecimal/stack.yaml +1 -1
  74. data/tracks/haskell/exercises/house/stack.yaml +1 -1
  75. data/tracks/haskell/exercises/kindergarten-garden/stack.yaml +1 -1
  76. data/tracks/haskell/exercises/largest-series-product/stack.yaml +1 -1
  77. data/tracks/haskell/exercises/leap/stack.yaml +1 -1
  78. data/tracks/haskell/exercises/lens-person/stack.yaml +1 -1
  79. data/tracks/haskell/exercises/linked-list/stack.yaml +1 -1
  80. data/tracks/haskell/exercises/list-ops/stack.yaml +1 -1
  81. data/tracks/haskell/exercises/luhn/stack.yaml +1 -1
  82. data/tracks/haskell/exercises/matrix/stack.yaml +1 -1
  83. data/tracks/haskell/exercises/meetup/stack.yaml +1 -1
  84. data/tracks/haskell/exercises/minesweeper/stack.yaml +1 -1
  85. data/tracks/haskell/exercises/nth-prime/stack.yaml +1 -1
  86. data/tracks/haskell/exercises/nucleotide-count/stack.yaml +1 -1
  87. data/tracks/haskell/exercises/ocr-numbers/stack.yaml +1 -1
  88. data/tracks/haskell/exercises/octal/stack.yaml +1 -1
  89. data/tracks/haskell/exercises/palindrome-products/stack.yaml +1 -1
  90. data/tracks/haskell/exercises/parallel-letter-frequency/stack.yaml +1 -1
  91. data/tracks/haskell/exercises/pascals-triangle/stack.yaml +1 -1
  92. data/tracks/haskell/exercises/phone-number/stack.yaml +1 -1
  93. data/tracks/haskell/exercises/pig-latin/stack.yaml +1 -1
  94. data/tracks/haskell/exercises/pov/stack.yaml +1 -1
  95. data/tracks/haskell/exercises/prime-factors/stack.yaml +1 -1
  96. data/tracks/haskell/exercises/pythagorean-triplet/stack.yaml +1 -1
  97. data/tracks/haskell/exercises/queen-attack/stack.yaml +1 -1
  98. data/tracks/haskell/exercises/raindrops/stack.yaml +1 -1
  99. data/tracks/haskell/exercises/rna-transcription/stack.yaml +1 -1
  100. data/tracks/haskell/exercises/robot-name/stack.yaml +1 -1
  101. data/tracks/haskell/exercises/robot-simulator/stack.yaml +1 -1
  102. data/tracks/haskell/exercises/roman-numerals/stack.yaml +1 -1
  103. data/tracks/haskell/exercises/saddle-points/stack.yaml +1 -1
  104. data/tracks/haskell/exercises/say/stack.yaml +1 -1
  105. data/tracks/haskell/exercises/scrabble-score/stack.yaml +1 -1
  106. data/tracks/haskell/exercises/secret-handshake/stack.yaml +1 -1
  107. data/tracks/haskell/exercises/series/stack.yaml +1 -1
  108. data/tracks/haskell/exercises/sgf-parsing/stack.yaml +1 -1
  109. data/tracks/haskell/exercises/sieve/stack.yaml +1 -1
  110. data/tracks/haskell/exercises/simple-cipher/stack.yaml +1 -1
  111. data/tracks/haskell/exercises/simple-linked-list/stack.yaml +1 -1
  112. data/tracks/haskell/exercises/space-age/stack.yaml +1 -1
  113. data/tracks/haskell/exercises/strain/stack.yaml +1 -1
  114. data/tracks/haskell/exercises/sublist/stack.yaml +1 -1
  115. data/tracks/haskell/exercises/sum-of-multiples/stack.yaml +1 -1
  116. data/tracks/haskell/exercises/triangle/stack.yaml +1 -1
  117. data/tracks/haskell/exercises/trinary/stack.yaml +1 -1
  118. data/tracks/haskell/exercises/word-count/stack.yaml +1 -1
  119. data/tracks/haskell/exercises/wordy/stack.yaml +1 -1
  120. data/tracks/haskell/exercises/zebra-puzzle/stack.yaml +1 -1
  121. data/tracks/haskell/exercises/zipper/stack.yaml +1 -1
  122. data/tracks/java/config.json +13 -1
  123. data/tracks/java/exercises/etl/src/main/java/Etl.java +3 -3
  124. data/tracks/java/exercises/hello-world/GETTING_STARTED.md +1 -1
  125. data/tracks/java/exercises/hello-world/src/main/java/HelloWorld.java +3 -3
  126. data/tracks/java/exercises/minesweeper/build.gradle +17 -0
  127. data/tracks/java/exercises/minesweeper/src/example/java/MinesweeperBoard.java +111 -0
  128. data/tracks/java/exercises/minesweeper/src/main/java/MinesweeperBoard.java +5 -0
  129. data/tracks/java/exercises/minesweeper/src/test/java/MinesweeperBoardTest.java +295 -0
  130. data/tracks/java/exercises/nucleotide-count/src/test/java/NucleotideTest.java +67 -67
  131. data/tracks/java/exercises/series/build.gradle +18 -0
  132. data/tracks/java/exercises/series/src/example/java/Series.java +39 -0
  133. data/tracks/java/exercises/series/src/main/java/.keep +0 -0
  134. data/tracks/java/exercises/series/src/main/java/Series.java +3 -0
  135. data/tracks/java/exercises/series/src/test/java/.keep +0 -0
  136. data/tracks/java/exercises/series/src/test/java/SeriesTest.java +154 -0
  137. data/tracks/java/exercises/settings.gradle +2 -0
  138. data/tracks/javascript/exercises/custom-set/custom-set.spec.js +130 -84
  139. data/tracks/javascript/exercises/custom-set/example-gen.js +200 -0
  140. data/tracks/ocaml/Makefile +5 -1
  141. data/tracks/ocaml/config.json +2 -1
  142. data/tracks/ocaml/exercises/anagram/test.ml +35 -24
  143. data/tracks/ocaml/exercises/bob/example.ml +1 -1
  144. data/tracks/ocaml/exercises/bob/test.ml +53 -40
  145. data/tracks/ocaml/exercises/hamming/test.ml +41 -31
  146. data/tracks/ocaml/exercises/raindrops/test.ml +38 -39
  147. data/tracks/ocaml/tools/test-generator/.merlin +5 -0
  148. data/tracks/ocaml/tools/test-generator/Makefile +15 -0
  149. data/tracks/ocaml/tools/test-generator/_tags +0 -0
  150. data/tracks/ocaml/tools/test-generator/src/codegen.ml +17 -0
  151. data/tracks/ocaml/tools/test-generator/src/codegen.mli +7 -0
  152. data/tracks/ocaml/tools/test-generator/src/leap.json +39 -0
  153. data/tracks/ocaml/tools/test-generator/src/model.ml +31 -0
  154. data/tracks/ocaml/tools/test-generator/src/parser.ml +61 -0
  155. data/tracks/ocaml/tools/test-generator/src/parser.mli +9 -0
  156. data/tracks/ocaml/tools/test-generator/src/special_cases.ml +12 -0
  157. data/tracks/ocaml/tools/test-generator/src/special_cases.mli +7 -0
  158. data/tracks/ocaml/tools/test-generator/src/test_gen.ml +25 -0
  159. data/tracks/ocaml/tools/test-generator/src/test_generator.ml +62 -0
  160. data/tracks/ocaml/tools/test-generator/src/test_generator.mli +6 -0
  161. data/tracks/ocaml/tools/test-generator/src/utils.ml +32 -0
  162. data/tracks/ocaml/tools/test-generator/src/utils.mli +18 -0
  163. data/tracks/ocaml/tools/test-generator/templates/anagram/template.ml +17 -0
  164. data/tracks/ocaml/tools/test-generator/templates/bob/template.ml +15 -0
  165. data/tracks/ocaml/tools/test-generator/templates/hamming/template.ml +30 -0
  166. data/tracks/ocaml/tools/test-generator/templates/leap/template.ml +15 -0
  167. data/tracks/ocaml/tools/test-generator/templates/raindrops/template.ml +15 -0
  168. data/tracks/ocaml/tools/test-generator/templates/word-count/template.ml +19 -0
  169. data/tracks/ocaml/tools/test-generator/test/all_tests.ml +11 -0
  170. data/tracks/ocaml/tools/test-generator/test/codegen_test.ml +20 -0
  171. data/tracks/ocaml/tools/test-generator/test/model_test.ml +27 -0
  172. data/tracks/ocaml/tools/test-generator/test/parser_test.ml +73 -0
  173. data/tracks/ocaml/tools/test-generator/test/special_cases_test.ml +22 -0
  174. data/tracks/ocaml/tools/test-generator/test/test_generator_test.ml +11 -0
  175. data/tracks/ocaml/tools/test-generator/test/utils_test.ml +21 -0
  176. data/tracks/perl5/config.json +1 -1
  177. data/tracks/perl6/accumulate/accumulate.t +8 -2
  178. data/tracks/perl6/anagram/Example.pm +1 -1
  179. data/tracks/perl6/anagram/anagram.t +7 -8
  180. data/tracks/perl6/binary/Example.pm +1 -1
  181. data/tracks/perl6/binary/binary.t +7 -8
  182. data/tracks/perl6/bob/bob.t +1 -3
  183. data/tracks/perl6/config.json +1 -0
  184. data/tracks/perl6/grains/grains.t +7 -2
  185. data/tracks/perl6/leap/leap.t +3 -1
  186. data/tracks/perl6/raindrops/raindrops.t +8 -2
  187. data/tracks/perl6/rna-transcription/rna_transcription.t +8 -9
  188. data/tracks/perl6/robot-name/robot.t +8 -9
  189. data/tracks/perl6/scrabble-score/Example.pm +1 -1
  190. data/tracks/perl6/scrabble-score/scrabble_score.t +8 -2
  191. data/tracks/perl6/word-count/word_count.t +8 -2
  192. data/tracks/php/config.json +5 -0
  193. data/tracks/php/exercises/markdown/example.php +85 -0
  194. data/tracks/php/exercises/markdown/markdown.php +82 -0
  195. data/tracks/php/exercises/markdown/markdown_test.php +57 -0
  196. data/tracks/python/exercises/hamming/example.py +3 -0
  197. data/tracks/python/exercises/hamming/hamming_test.py +40 -14
  198. data/tracks/python/exercises/rna-transcription/example.py +6 -1
  199. data/tracks/python/exercises/rna-transcription/rna_transcription_test.py +9 -0
  200. data/tracks/ruby/config.json +6 -0
  201. data/tracks/ruby/exercises/dominoes/.version +1 -0
  202. data/tracks/ruby/exercises/dominoes/dominoes_test.rb +149 -0
  203. data/tracks/ruby/exercises/dominoes/example.rb +37 -0
  204. data/tracks/ruby/exercises/dominoes/example.tt +57 -0
  205. data/tracks/ruby/exercises/pangram/.version +1 -1
  206. data/tracks/ruby/exercises/pangram/example.rb +2 -2
  207. data/tracks/ruby/exercises/pangram/example.tt +5 -7
  208. data/tracks/ruby/exercises/pangram/pangram_test.rb +30 -25
  209. data/tracks/ruby/exercises/queen-attack/.version +1 -0
  210. data/tracks/ruby/exercises/queen-attack/example.rb +5 -30
  211. data/tracks/ruby/exercises/queen-attack/example.tt +22 -0
  212. data/tracks/ruby/exercises/queen-attack/queen_attack_test.rb +46 -95
  213. data/tracks/ruby/exercises/triangle/.version +1 -0
  214. data/tracks/ruby/exercises/triangle/example.rb +15 -22
  215. data/tracks/ruby/exercises/triangle/example.tt +20 -0
  216. data/tracks/ruby/exercises/triangle/triangle_test.rb +80 -40
  217. data/tracks/ruby/lib/dominoes_cases.rb +23 -0
  218. data/tracks/ruby/lib/pangram_cases.rb +19 -4
  219. data/tracks/ruby/lib/queen_attack_cases.rb +54 -0
  220. data/tracks/ruby/lib/triangle_cases.rb +51 -0
  221. data/tracks/scala/config.json +6 -0
  222. data/tracks/scala/exercises/dominoes/Example.scala +41 -0
  223. data/tracks/scala/exercises/dominoes/build.sbt +3 -0
  224. data/tracks/scala/exercises/dominoes/src/main/scala/Dominoes.scala +4 -0
  225. data/tracks/scala/exercises/dominoes/src/test/scala/DominoesSuite.scala +91 -0
  226. metadata +83 -2
@@ -1,14 +1,29 @@
1
1
  class PangramCase < OpenStruct
2
2
  def name
3
- 'test_%s' % description.delete("'").gsub(/[ -]/, '_')
3
+ 'test_%s' % description.downcase.tr_s(" -'", '_').sub(/_$/,'')
4
4
  end
5
5
 
6
- def do
7
- 'Pangram.is_pangram?(str)'
6
+ def workload
7
+ [
8
+ "phrase = '#{input}'\n",
9
+ " #{assertion} Pangram.pangram?(phrase), \"#{message}\""
10
+ ].join
11
+ end
12
+
13
+ def message
14
+ "\#{phrase.inspect} #{is_or_isnt} a pangram"
15
+ end
16
+
17
+ def is_or_isnt
18
+ expected ? 'IS' : 'is NOT'
19
+ end
20
+
21
+ def assertion
22
+ expected ? 'assert' : 'refute'
8
23
  end
9
24
 
10
25
  def skipped?
11
- index > 0
26
+ index.zero? ? '# skip' : 'skip'
12
27
  end
13
28
  end
14
29
 
@@ -0,0 +1,54 @@
1
+ class QueenCase < OpenStruct
2
+ def test_name
3
+ "test_#{description.gsub(/[ ]/, '_')}"
4
+ end
5
+
6
+ def skipped
7
+ index.zero? ? '# skip' : 'skip'
8
+ end
9
+
10
+ def parse_position queen
11
+ queen['position'].delete('() ').split(',').map{|i| i.to_i}
12
+ end
13
+ end
14
+
15
+ class QueenAttackCase < QueenCase
16
+ def workload
17
+ """queens = Queens.new white: #{parse_position white_queen}, black: #{parse_position black_queen}
18
+ #{assertion} queens.attack?"""
19
+ end
20
+
21
+ def assertion
22
+ expected ? 'assert' : 'refute'
23
+ end
24
+ end
25
+
26
+ class QueenCreateCase < QueenCase
27
+ def workload
28
+ expected == -1 ? exception : input
29
+ end
30
+
31
+ def input
32
+ "Queens.new white: #{parse_position queen}"
33
+ end
34
+
35
+ def exception
36
+ """assert_raises ArgumentError do
37
+ #{input}
38
+ end"""
39
+ end
40
+ end
41
+
42
+ TYPES = [
43
+ ['create', QueenCreateCase],
44
+ ['can_attack', QueenAttackCase]
45
+ ]
46
+
47
+ QueenAttackCases = proc do |data|
48
+ json = JSON.parse data
49
+ TYPES.flat_map.with_index do |(type, caseClass), i|
50
+ json[type]['cases'].map.with_index do |row, j|
51
+ caseClass.new row.merge('index' => i+j)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,51 @@
1
+ class TriangleCase < OpenStruct
2
+ def test_name
3
+ initial = description.downcase
4
+ replaced = initial.gsub(/(true|false)/, expected_type)
5
+ if initial.eql?(replaced) && !initial.include?(triangle)
6
+ replaced = triangle + ' triangle ' + initial
7
+ end
8
+ 'test_%s' % replaced.tr_s(', -', '_')
9
+ end
10
+
11
+ def workload
12
+ [
13
+ "triangle = Triangle.new(#{sides})",
14
+ indent("#{assert_or_refute} triangle.#{triangle}?, #{failure_message}")
15
+ ].join("\n")
16
+ end
17
+
18
+ def indent(line)
19
+ ' ' * 4 + line
20
+ end
21
+
22
+ def assert_or_refute
23
+ expected ? 'assert' : 'refute'
24
+ end
25
+
26
+ def failure_message
27
+ %Q("Expected '#{expected}', #{expected_type}.")
28
+ end
29
+
30
+ def expected_type
31
+ "triangle is #{expected ? '' : 'not '}#{triangle}"
32
+ end
33
+
34
+ def skipped
35
+ index.zero? ? '# skip' : 'skip'
36
+ end
37
+ end
38
+
39
+ TriangleCases = proc do |data|
40
+ i = 0
41
+ cases = []
42
+ data = JSON.parse(data).select { |key, value| key.to_s.match(/[^#]+/) }
43
+ data.keys.each do |triangle|
44
+ data[triangle]['cases'].each do |row|
45
+ row = row.merge(row.merge('index' => i, 'triangle' => triangle))
46
+ cases << TriangleCase.new(row)
47
+ i += 1
48
+ end
49
+ end
50
+ cases
51
+ end
@@ -384,6 +384,12 @@
384
384
  "topics": [
385
385
  ]
386
386
  },
387
+ {
388
+ "slug": "dominoes",
389
+ "difficulty": 1,
390
+ "topics": [
391
+ ]
392
+ },
387
393
  {
388
394
  "slug": "parallel-letter-frequency",
389
395
  "difficulty": 1,
@@ -0,0 +1,41 @@
1
+ object Dominoes {
2
+ type Domino = (Int, Int)
3
+ type Dominoes = List[Domino]
4
+
5
+ def chain(dominoes: Dominoes): Option[Dominoes] = {
6
+ val solutions = dominoes.permutations map createChain
7
+ solutions find (_.isDefined) flatten
8
+ }
9
+
10
+ private def createChain(dominoes: Dominoes): Option[Dominoes] = {
11
+ val matchingDomino: (Domino, Domino) => Option[Domino] = {
12
+ case ((_, y1), (x2, y2)) =>
13
+ if (y1 == x2) Some((x2, y2))
14
+ else if (y1 == y2) Some((y2, x2))
15
+ else None
16
+ }
17
+ def matchingDominoes(x: Domino, y: Domino): Option[(Domino, Domino)] = {
18
+ matchingDomino(x, y) map ((x, _)) orElse {
19
+ val sx = x.swap
20
+ matchingDomino(sx, y) map ((sx, _))
21
+ }
22
+ }
23
+ def appendDomino(mxs: Option[Dominoes], candidate: Domino): Option[Dominoes] =
24
+ for {
25
+ chainSoFar <- mxs
26
+ lastDomino = chainSoFar.last
27
+ nextDomino <- matchingDomino(lastDomino, candidate)
28
+ } yield chainSoFar :+ nextDomino
29
+
30
+ dominoes match {
31
+ case Nil => Some(Nil)
32
+ case ys@(x::xs) =>
33
+ for {
34
+ (rightDomino, leftDomino) <- matchingDominoes(ys.last, x)
35
+ startChain = Option(List(leftDomino))
36
+ result <- xs.foldLeft(startChain)(appendDomino) if result.last == rightDomino
37
+ } yield result
38
+ }
39
+ }
40
+ }
41
+
@@ -0,0 +1,3 @@
1
+ scalaVersion := "2.11.8"
2
+
3
+ libraryDependencies += "org.scalatest" % "scalatest_2.11" % "2.2.5" % "test"
@@ -0,0 +1,4 @@
1
+ object Dominoes {
2
+
3
+ def chain(dominoes: List[(Int, Int)]): Option[List[(Int, Int)]] = ???
4
+ }
@@ -0,0 +1,91 @@
1
+ import org.scalatest.{FunSuite, Matchers}
2
+
3
+ class DominoesSuite extends FunSuite with Matchers {
4
+
5
+ test("empty input = empty output") {
6
+ check(List(), true)
7
+ }
8
+
9
+ test("singleton input = singleton output") {
10
+ pending
11
+ check(List((1, 1)), true)
12
+ }
13
+
14
+ test("singleton that can't be chained") {
15
+ pending
16
+ check(List((1, 2)), false)
17
+ }
18
+
19
+ test("three elements") {
20
+ pending
21
+ check(List((1, 2), (3, 1), (2, 3)), true)
22
+ }
23
+
24
+ test("can reverse dominoes") {
25
+ pending
26
+ check(List((1, 2), (1, 3), (2, 3)), true)
27
+ }
28
+
29
+ test("can't be chained") {
30
+ pending
31
+ check(List((1, 2), (4, 1), (2, 3)), false)
32
+ }
33
+
34
+ test("disconnected - simple") {
35
+ pending
36
+ check(List((1, 1), (2, 2)), false)
37
+ }
38
+
39
+ test("disconnected - double loop") {
40
+ pending
41
+ check(List((1, 2), (2, 1), (3, 4), (4, 3)), false)
42
+ }
43
+
44
+ test("disconnected - single isolated") {
45
+ pending
46
+ check(List((1, 2), (2, 3), (3, 1), (4, 4)), false)
47
+ }
48
+
49
+ test("need backtrack") {
50
+ pending
51
+ check(List((1, 2), (2, 3), (3, 1), (2, 4), (2, 4)), true)
52
+ }
53
+
54
+ test("separate loops") {
55
+ pending
56
+ check(List((1, 2), (2, 3), (3, 1), (1, 1), (2, 2), (3, 3)), true)
57
+ }
58
+
59
+ test("ten elements") {
60
+ pending
61
+ check(List((1, 2), (5, 3), (3, 1), (1, 2), (2, 4), (1, 6), (2, 3), (3, 4), (5, 6)), true)
62
+ }
63
+
64
+ private def check(input: List[(Int, Int)], hasResult: Boolean): Unit = {
65
+ val result = Dominoes.chain(input)
66
+ if (hasResult) {
67
+ checkChain(result getOrElse fail("should have had a chain, but didn't"), input)
68
+ }
69
+ else assert(result == None)
70
+ }
71
+
72
+ private def checkChain(result: List[(Int, Int)], input: List[(Int, Int)]): Unit = {
73
+ def sortDomino(ab: (Int, Int)): (Int, Int) =
74
+ if (x._1 > x._2) x.swap else x
75
+ def consecutivesShouldMatch(dominoes: List[((Int, Int), Int)]): Unit =
76
+ dominoes.tails foreach {
77
+ case (a@(_,x), i1)::(b@(y,_), i2)::_ =>
78
+ assert(x == y, s"dominoes $i1 and $i2 don't match: $a $b")
79
+ case _ =>
80
+ }
81
+ def endsShouldMatch: Unit =
82
+ if (!result.isEmpty)
83
+ consecutivesShouldMatch(List((result.last, result.length - 1),
84
+ (result.head, 0)))
85
+
86
+ assert(result.map(sortDomino).sorted == input.map(sortDomino).sorted,
87
+ "doesn't consist of input dominoes")
88
+ consecutivesShouldMatch(result.zipWithIndex)
89
+ endsShouldMatch
90
+ }
91
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trackler
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.8
4
+ version: 2.0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katrina Owen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-21 00:00:00.000000000 Z
11
+ date: 2016-11-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip
@@ -820,6 +820,9 @@ files:
820
820
  - tracks/clojure/exercises/phone-number/project.clj
821
821
  - tracks/clojure/exercises/phone-number/src/example.clj
822
822
  - tracks/clojure/exercises/phone-number/test/phone_number_test.clj
823
+ - tracks/clojure/exercises/pig-latin/project.clj
824
+ - tracks/clojure/exercises/pig-latin/src/example.clj
825
+ - tracks/clojure/exercises/pig-latin/test/pig_latin_test.clj
823
826
  - tracks/clojure/exercises/pov/.gitignore
824
827
  - tracks/clojure/exercises/pov/project.clj
825
828
  - tracks/clojure/exercises/pov/src/example.clj
@@ -1126,6 +1129,8 @@ files:
1126
1129
  - tracks/crystal/exercises/bob/src/example.cr
1127
1130
  - tracks/crystal/exercises/bracket-push/spec/bracket_push_spec.cr
1128
1131
  - tracks/crystal/exercises/bracket-push/src/example.cr
1132
+ - tracks/crystal/exercises/forth/spec/forth_spec.cr
1133
+ - tracks/crystal/exercises/forth/src/example.cr
1129
1134
  - tracks/crystal/exercises/gigasecond/spec/gigasecond_spec.cr
1130
1135
  - tracks/crystal/exercises/gigasecond/src/example.cr
1131
1136
  - tracks/crystal/exercises/hamming/spec/hamming_spec.cr
@@ -1153,6 +1158,7 @@ files:
1153
1158
  - tracks/crystal/src/generator/exercises/acronym.cr
1154
1159
  - tracks/crystal/src/generator/exercises/exercise_generator.cr
1155
1160
  - tracks/crystal/src/generator/exercises/exercise_test_case.cr
1161
+ - tracks/crystal/src/generator/exercises/forth.cr
1156
1162
  - tracks/crystal/src/generator/exercises/hello_world.cr
1157
1163
  - tracks/crystal/src/generator/exercises/templates/example.tt
1158
1164
  - tracks/crystal/src/generator/generate.cr
@@ -2552,6 +2558,8 @@ files:
2552
2558
  - tracks/go/exercises/accumulate/example.go
2553
2559
  - tracks/go/exercises/acronym/acronym_test.go
2554
2560
  - tracks/go/exercises/acronym/example.go
2561
+ - tracks/go/exercises/all-your-base/all_your_base_test.go
2562
+ - tracks/go/exercises/all-your-base/example.go
2555
2563
  - tracks/go/exercises/allergies/allergies_test.go
2556
2564
  - tracks/go/exercises/allergies/example.go
2557
2565
  - tracks/go/exercises/anagram/anagram_test.go
@@ -2635,6 +2643,8 @@ files:
2635
2643
  - tracks/go/exercises/hexadecimal/hexadecimal_test.go
2636
2644
  - tracks/go/exercises/house/example.go
2637
2645
  - tracks/go/exercises/house/house_test.go
2646
+ - tracks/go/exercises/isogram/example.go
2647
+ - tracks/go/exercises/isogram/isogram_test.go
2638
2648
  - tracks/go/exercises/kindergarten-garden/example.go
2639
2649
  - tracks/go/exercises/kindergarten-garden/kindergarten_garden_test.go
2640
2650
  - tracks/go/exercises/largest-series-product/cases_test.go
@@ -2673,6 +2683,8 @@ files:
2673
2683
  - tracks/go/exercises/paasio/paasio_test.go
2674
2684
  - tracks/go/exercises/palindrome-products/example.go
2675
2685
  - tracks/go/exercises/palindrome-products/palindrome_products_test.go
2686
+ - tracks/go/exercises/pangram/example.go
2687
+ - tracks/go/exercises/pangram/pangram_test.go
2676
2688
  - tracks/go/exercises/parallel-letter-frequency/example.go
2677
2689
  - tracks/go/exercises/parallel-letter-frequency/frequency.go
2678
2690
  - tracks/go/exercises/parallel-letter-frequency/parallel_letter_frequency_test.go
@@ -2688,6 +2700,8 @@ files:
2688
2700
  - tracks/go/exercises/pov/pov_test.go
2689
2701
  - tracks/go/exercises/prime-factors/example.go
2690
2702
  - tracks/go/exercises/prime-factors/primefactors_test.go
2703
+ - tracks/go/exercises/protein-translation/example.go
2704
+ - tracks/go/exercises/protein-translation/protein_translation_test.go
2691
2705
  - tracks/go/exercises/pythagorean-triplet/example.go
2692
2706
  - tracks/go/exercises/pythagorean-triplet/pythagorean_triplet_test.go
2693
2707
  - tracks/go/exercises/queen-attack/example.go
@@ -2750,6 +2764,8 @@ files:
2750
2764
  - tracks/go/exercises/triangle/triangle_test.go
2751
2765
  - tracks/go/exercises/trinary/example.go
2752
2766
  - tracks/go/exercises/trinary/trinary_test.go
2767
+ - tracks/go/exercises/twelve-days/example.go
2768
+ - tracks/go/exercises/twelve-days/twelve_days_test.go
2753
2769
  - tracks/go/exercises/variable-length-quantity/example.go
2754
2770
  - tracks/go/exercises/variable-length-quantity/variable_length_quantity_test.go
2755
2771
  - tracks/go/exercises/word-count/cases_test.go
@@ -2892,6 +2908,13 @@ files:
2892
2908
  - tracks/haskell/exercises/bob/src/Bob.hs
2893
2909
  - tracks/haskell/exercises/bob/stack.yaml
2894
2910
  - tracks/haskell/exercises/bob/test/Tests.hs
2911
+ - tracks/haskell/exercises/bowling/HINTS.md
2912
+ - tracks/haskell/exercises/bowling/examples/success-standard/package.yaml
2913
+ - tracks/haskell/exercises/bowling/examples/success-standard/src/Bowling.hs
2914
+ - tracks/haskell/exercises/bowling/package.yaml
2915
+ - tracks/haskell/exercises/bowling/src/Bowling.hs
2916
+ - tracks/haskell/exercises/bowling/stack.yaml
2917
+ - tracks/haskell/exercises/bowling/test/Tests.hs
2895
2918
  - tracks/haskell/exercises/change/examples/success-standard/package.yaml
2896
2919
  - tracks/haskell/exercises/change/examples/success-standard/src/Change.hs
2897
2920
  - tracks/haskell/exercises/change/package.yaml
@@ -3475,6 +3498,10 @@ files:
3475
3498
  - tracks/java/exercises/meetup/src/main/java/MeetupSchedule.java
3476
3499
  - tracks/java/exercises/meetup/src/test/java/.keep
3477
3500
  - tracks/java/exercises/meetup/src/test/java/MeetupTest.java
3501
+ - tracks/java/exercises/minesweeper/build.gradle
3502
+ - tracks/java/exercises/minesweeper/src/example/java/MinesweeperBoard.java
3503
+ - tracks/java/exercises/minesweeper/src/main/java/MinesweeperBoard.java
3504
+ - tracks/java/exercises/minesweeper/src/test/java/MinesweeperBoardTest.java
3478
3505
  - tracks/java/exercises/nth-prime/build.gradle
3479
3506
  - tracks/java/exercises/nth-prime/src/example/java/.keep
3480
3507
  - tracks/java/exercises/nth-prime/src/example/java/Prime.java
@@ -3539,6 +3566,12 @@ files:
3539
3566
  - tracks/java/exercises/scrabble-score/src/example/java/Scrabble.java
3540
3567
  - tracks/java/exercises/scrabble-score/src/main/java/.keep
3541
3568
  - tracks/java/exercises/scrabble-score/src/test/java/ScrabbleScoreTest.java
3569
+ - tracks/java/exercises/series/build.gradle
3570
+ - tracks/java/exercises/series/src/example/java/Series.java
3571
+ - tracks/java/exercises/series/src/main/java/.keep
3572
+ - tracks/java/exercises/series/src/main/java/Series.java
3573
+ - tracks/java/exercises/series/src/test/java/.keep
3574
+ - tracks/java/exercises/series/src/test/java/SeriesTest.java
3542
3575
  - tracks/java/exercises/settings.gradle
3543
3576
  - tracks/java/exercises/sieve/build.gradle
3544
3577
  - tracks/java/exercises/sieve/src/example/java/Sieve.java
@@ -3634,6 +3667,7 @@ files:
3634
3667
  - tracks/javascript/exercises/crypto-square/crypto-square.spec.js
3635
3668
  - tracks/javascript/exercises/crypto-square/example.js
3636
3669
  - tracks/javascript/exercises/custom-set/custom-set.spec.js
3670
+ - tracks/javascript/exercises/custom-set/example-gen.js
3637
3671
  - tracks/javascript/exercises/custom-set/example.js
3638
3672
  - tracks/javascript/exercises/diamond/diamond.spec.js
3639
3673
  - tracks/javascript/exercises/diamond/example.js
@@ -4807,6 +4841,35 @@ files:
4807
4841
  - tracks/ocaml/exercises/zipper/tree.mli
4808
4842
  - tracks/ocaml/exercises/zipper/zipper.mli
4809
4843
  - tracks/ocaml/img/icon.png
4844
+ - tracks/ocaml/tools/test-generator/.merlin
4845
+ - tracks/ocaml/tools/test-generator/Makefile
4846
+ - tracks/ocaml/tools/test-generator/_tags
4847
+ - tracks/ocaml/tools/test-generator/src/codegen.ml
4848
+ - tracks/ocaml/tools/test-generator/src/codegen.mli
4849
+ - tracks/ocaml/tools/test-generator/src/leap.json
4850
+ - tracks/ocaml/tools/test-generator/src/model.ml
4851
+ - tracks/ocaml/tools/test-generator/src/parser.ml
4852
+ - tracks/ocaml/tools/test-generator/src/parser.mli
4853
+ - tracks/ocaml/tools/test-generator/src/special_cases.ml
4854
+ - tracks/ocaml/tools/test-generator/src/special_cases.mli
4855
+ - tracks/ocaml/tools/test-generator/src/test_gen.ml
4856
+ - tracks/ocaml/tools/test-generator/src/test_generator.ml
4857
+ - tracks/ocaml/tools/test-generator/src/test_generator.mli
4858
+ - tracks/ocaml/tools/test-generator/src/utils.ml
4859
+ - tracks/ocaml/tools/test-generator/src/utils.mli
4860
+ - tracks/ocaml/tools/test-generator/templates/anagram/template.ml
4861
+ - tracks/ocaml/tools/test-generator/templates/bob/template.ml
4862
+ - tracks/ocaml/tools/test-generator/templates/hamming/template.ml
4863
+ - tracks/ocaml/tools/test-generator/templates/leap/template.ml
4864
+ - tracks/ocaml/tools/test-generator/templates/raindrops/template.ml
4865
+ - tracks/ocaml/tools/test-generator/templates/word-count/template.ml
4866
+ - tracks/ocaml/tools/test-generator/test/all_tests.ml
4867
+ - tracks/ocaml/tools/test-generator/test/codegen_test.ml
4868
+ - tracks/ocaml/tools/test-generator/test/model_test.ml
4869
+ - tracks/ocaml/tools/test-generator/test/parser_test.ml
4870
+ - tracks/ocaml/tools/test-generator/test/special_cases_test.ml
4871
+ - tracks/ocaml/tools/test-generator/test/test_generator_test.ml
4872
+ - tracks/ocaml/tools/test-generator/test/utils_test.ml
4810
4873
  - tracks/pascal/.git
4811
4874
  - tracks/pascal/.gitignore
4812
4875
  - tracks/pascal/.travis.yml
@@ -5076,6 +5139,9 @@ files:
5076
5139
  - tracks/php/exercises/largest-series-product/largest-series-product_test.php
5077
5140
  - tracks/php/exercises/leap/example.php
5078
5141
  - tracks/php/exercises/leap/leap_test.php
5142
+ - tracks/php/exercises/markdown/example.php
5143
+ - tracks/php/exercises/markdown/markdown.php
5144
+ - tracks/php/exercises/markdown/markdown_test.php
5079
5145
  - tracks/php/exercises/minesweeper/example.php
5080
5146
  - tracks/php/exercises/minesweeper/minesweeper_test.php
5081
5147
  - tracks/php/exercises/nucleotide-count/example.php
@@ -5611,6 +5677,10 @@ files:
5611
5677
  - tracks/ruby/exercises/difference-of-squares/difference_of_squares_test.rb
5612
5678
  - tracks/ruby/exercises/difference-of-squares/example.rb
5613
5679
  - tracks/ruby/exercises/difference-of-squares/example.tt
5680
+ - tracks/ruby/exercises/dominoes/.version
5681
+ - tracks/ruby/exercises/dominoes/dominoes_test.rb
5682
+ - tracks/ruby/exercises/dominoes/example.rb
5683
+ - tracks/ruby/exercises/dominoes/example.tt
5614
5684
  - tracks/ruby/exercises/etl/etl_test.rb
5615
5685
  - tracks/ruby/exercises/etl/example.rb
5616
5686
  - tracks/ruby/exercises/flatten-array/example.rb
@@ -5701,7 +5771,9 @@ files:
5701
5771
  - tracks/ruby/exercises/proverb/proverb_test.rb
5702
5772
  - tracks/ruby/exercises/pythagorean-triplet/example.rb
5703
5773
  - tracks/ruby/exercises/pythagorean-triplet/pythagorean_triplet_test.rb
5774
+ - tracks/ruby/exercises/queen-attack/.version
5704
5775
  - tracks/ruby/exercises/queen-attack/example.rb
5776
+ - tracks/ruby/exercises/queen-attack/example.tt
5705
5777
  - tracks/ruby/exercises/queen-attack/queen_attack_test.rb
5706
5778
  - tracks/ruby/exercises/rail-fence-cipher/example.rb
5707
5779
  - tracks/ruby/exercises/rail-fence-cipher/rail_fence_cipher_test.rb
@@ -5759,7 +5831,9 @@ files:
5759
5831
  - tracks/ruby/exercises/transpose/example.rb
5760
5832
  - tracks/ruby/exercises/transpose/example.tt
5761
5833
  - tracks/ruby/exercises/transpose/transpose_test.rb
5834
+ - tracks/ruby/exercises/triangle/.version
5762
5835
  - tracks/ruby/exercises/triangle/example.rb
5836
+ - tracks/ruby/exercises/triangle/example.tt
5763
5837
  - tracks/ruby/exercises/triangle/triangle_test.rb
5764
5838
  - tracks/ruby/exercises/trinary/example.rb
5765
5839
  - tracks/ruby/exercises/trinary/trinary_test.rb
@@ -5789,6 +5863,7 @@ files:
5789
5863
  - tracks/ruby/lib/custom_set_cases.rb
5790
5864
  - tracks/ruby/lib/difference_of_squares_cases.rb
5791
5865
  - tracks/ruby/lib/disable_skip.rb
5866
+ - tracks/ruby/lib/dominoes_cases.rb
5792
5867
  - tracks/ruby/lib/generator.rb
5793
5868
  - tracks/ruby/lib/gigasecond_cases.rb
5794
5869
  - tracks/ruby/lib/hamming_cases.rb
@@ -5799,6 +5874,7 @@ files:
5799
5874
  - tracks/ruby/lib/leap_cases.rb
5800
5875
  - tracks/ruby/lib/nth_prime_cases.rb
5801
5876
  - tracks/ruby/lib/pangram_cases.rb
5877
+ - tracks/ruby/lib/queen_attack_cases.rb
5802
5878
  - tracks/ruby/lib/raindrops_cases.rb
5803
5879
  - tracks/ruby/lib/rna_transcription_cases.rb
5804
5880
  - tracks/ruby/lib/roman_numerals_cases.rb
@@ -5806,6 +5882,7 @@ files:
5806
5882
  - tracks/ruby/lib/sieve_cases.rb
5807
5883
  - tracks/ruby/lib/tournament_cases.rb
5808
5884
  - tracks/ruby/lib/transpose_cases.rb
5885
+ - tracks/ruby/lib/triangle_cases.rb
5809
5886
  - tracks/ruby/lib/two_bucket_cases.rb
5810
5887
  - tracks/ruby/lib/word_count_cases.rb
5811
5888
  - tracks/rust/.git
@@ -6116,6 +6193,10 @@ files:
6116
6193
  - tracks/scala/exercises/difference-of-squares/example.scala
6117
6194
  - tracks/scala/exercises/difference-of-squares/src/main/scala/.keep
6118
6195
  - tracks/scala/exercises/difference-of-squares/src/test/scala/squares_test.scala
6196
+ - tracks/scala/exercises/dominoes/Example.scala
6197
+ - tracks/scala/exercises/dominoes/build.sbt
6198
+ - tracks/scala/exercises/dominoes/src/main/scala/Dominoes.scala
6199
+ - tracks/scala/exercises/dominoes/src/test/scala/DominoesSuite.scala
6119
6200
  - tracks/scala/exercises/etl/build.sbt
6120
6201
  - tracks/scala/exercises/etl/example.scala
6121
6202
  - tracks/scala/exercises/etl/src/main/scala/.keep