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.
- checksums.yaml +4 -4
- data/common/exercises/bob/canonical-data.json +1 -20
- data/common/exercises/raindrops/canonical-data.json +18 -0
- data/common/exercises/sublist/canonical-data.json +5 -0
- data/lib/trackler/version.rb +1 -1
- data/tracks/clojure/config.json +5 -0
- data/tracks/clojure/exercises/pig-latin/project.clj +4 -0
- data/tracks/clojure/exercises/pig-latin/src/example.clj +49 -0
- data/tracks/clojure/exercises/pig-latin/test/pig_latin_test.clj +92 -0
- data/tracks/clojure/exercises/robot-name/src/example.clj +8 -11
- data/tracks/clojure/exercises/robot-name/test/robot_name_test.clj +23 -18
- data/tracks/crystal/config.json +6 -0
- data/tracks/crystal/exercises/acronym/spec/acronym_spec.cr +7 -7
- data/tracks/crystal/exercises/forth/spec/forth_spec.cr +198 -0
- data/tracks/crystal/exercises/forth/src/example.cr +187 -0
- data/tracks/crystal/exercises/hello-world/spec/hello_world_spec.cr +3 -3
- data/tracks/crystal/src/generator/exercises/acronym.cr +1 -1
- data/tracks/crystal/src/generator/exercises/exercise_generator.cr +3 -2
- data/tracks/crystal/src/generator/exercises/forth.cr +56 -0
- data/tracks/crystal/src/generator/exercises/templates/example.tt +2 -2
- data/tracks/crystal/src/generator/spec/exercise_generator_spec.cr +5 -3
- data/tracks/csharp/exercises/wordy/WordyTest.cs +2 -2
- data/tracks/elixir/config.json +83 -70
- data/tracks/fsharp/exercises/wordy/WordyTest.fs +1 -1
- data/tracks/go/config.json +28 -3
- data/tracks/go/exercises/all-your-base/all_your_base_test.go +185 -0
- data/tracks/go/exercises/all-your-base/example.go +60 -0
- data/tracks/go/exercises/isogram/example.go +15 -0
- data/tracks/go/exercises/isogram/isogram_test.go +50 -0
- data/tracks/go/exercises/ledger/ledger.go +2 -2
- data/tracks/go/exercises/pangram/example.go +32 -0
- data/tracks/go/exercises/pangram/pangram_test.go +43 -0
- data/tracks/go/exercises/protein-translation/example.go +59 -0
- data/tracks/go/exercises/protein-translation/protein_translation_test.go +69 -0
- data/tracks/go/exercises/tree-building/tree_building.go +1 -1
- data/tracks/go/exercises/twelve-days/example.go +57 -0
- data/tracks/go/exercises/twelve-days/twelve_days_test.go +79 -0
- data/tracks/haskell/.travis.yml +13 -8
- data/tracks/haskell/config.json +6 -0
- data/tracks/haskell/exercises/accumulate/stack.yaml +1 -1
- data/tracks/haskell/exercises/all-your-base/stack.yaml +1 -1
- data/tracks/haskell/exercises/allergies/stack.yaml +1 -1
- data/tracks/haskell/exercises/alphametics/stack.yaml +1 -1
- data/tracks/haskell/exercises/anagram/stack.yaml +1 -1
- data/tracks/haskell/exercises/atbash-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/bank-account/stack.yaml +1 -1
- data/tracks/haskell/exercises/beer-song/stack.yaml +1 -1
- data/tracks/haskell/exercises/binary/stack.yaml +1 -1
- data/tracks/haskell/exercises/binary-search-tree/stack.yaml +1 -1
- data/tracks/haskell/exercises/bob/stack.yaml +1 -1
- data/tracks/haskell/exercises/bowling/HINTS.md +19 -0
- data/tracks/haskell/exercises/bowling/examples/success-standard/package.yaml +16 -0
- data/tracks/haskell/exercises/bowling/examples/success-standard/src/Bowling.hs +84 -0
- data/tracks/haskell/exercises/bowling/package.yaml +19 -0
- data/tracks/haskell/exercises/bowling/src/Bowling.hs +9 -0
- data/tracks/haskell/exercises/bowling/stack.yaml +1 -0
- data/tracks/haskell/exercises/bowling/test/Tests.hs +143 -0
- data/tracks/haskell/exercises/change/stack.yaml +1 -1
- data/tracks/haskell/exercises/clock/stack.yaml +1 -1
- data/tracks/haskell/exercises/connect/stack.yaml +1 -1
- data/tracks/haskell/exercises/crypto-square/stack.yaml +1 -1
- data/tracks/haskell/exercises/custom-set/stack.yaml +1 -1
- data/tracks/haskell/exercises/difference-of-squares/stack.yaml +1 -1
- data/tracks/haskell/exercises/dominoes/stack.yaml +1 -1
- data/tracks/haskell/exercises/etl/stack.yaml +1 -1
- data/tracks/haskell/exercises/food-chain/stack.yaml +1 -1
- data/tracks/haskell/exercises/forth/stack.yaml +1 -1
- data/tracks/haskell/exercises/gigasecond/stack.yaml +1 -1
- data/tracks/haskell/exercises/go-counting/stack.yaml +1 -1
- data/tracks/haskell/exercises/grade-school/stack.yaml +1 -1
- data/tracks/haskell/exercises/grains/stack.yaml +1 -1
- data/tracks/haskell/exercises/hamming/stack.yaml +1 -1
- data/tracks/haskell/exercises/hexadecimal/stack.yaml +1 -1
- data/tracks/haskell/exercises/house/stack.yaml +1 -1
- data/tracks/haskell/exercises/kindergarten-garden/stack.yaml +1 -1
- data/tracks/haskell/exercises/largest-series-product/stack.yaml +1 -1
- data/tracks/haskell/exercises/leap/stack.yaml +1 -1
- data/tracks/haskell/exercises/lens-person/stack.yaml +1 -1
- data/tracks/haskell/exercises/linked-list/stack.yaml +1 -1
- data/tracks/haskell/exercises/list-ops/stack.yaml +1 -1
- data/tracks/haskell/exercises/luhn/stack.yaml +1 -1
- data/tracks/haskell/exercises/matrix/stack.yaml +1 -1
- data/tracks/haskell/exercises/meetup/stack.yaml +1 -1
- data/tracks/haskell/exercises/minesweeper/stack.yaml +1 -1
- data/tracks/haskell/exercises/nth-prime/stack.yaml +1 -1
- data/tracks/haskell/exercises/nucleotide-count/stack.yaml +1 -1
- data/tracks/haskell/exercises/ocr-numbers/stack.yaml +1 -1
- data/tracks/haskell/exercises/octal/stack.yaml +1 -1
- data/tracks/haskell/exercises/palindrome-products/stack.yaml +1 -1
- data/tracks/haskell/exercises/parallel-letter-frequency/stack.yaml +1 -1
- data/tracks/haskell/exercises/pascals-triangle/stack.yaml +1 -1
- data/tracks/haskell/exercises/phone-number/stack.yaml +1 -1
- data/tracks/haskell/exercises/pig-latin/stack.yaml +1 -1
- data/tracks/haskell/exercises/pov/stack.yaml +1 -1
- data/tracks/haskell/exercises/prime-factors/stack.yaml +1 -1
- data/tracks/haskell/exercises/pythagorean-triplet/stack.yaml +1 -1
- data/tracks/haskell/exercises/queen-attack/stack.yaml +1 -1
- data/tracks/haskell/exercises/raindrops/stack.yaml +1 -1
- data/tracks/haskell/exercises/rna-transcription/stack.yaml +1 -1
- data/tracks/haskell/exercises/robot-name/stack.yaml +1 -1
- data/tracks/haskell/exercises/robot-simulator/stack.yaml +1 -1
- data/tracks/haskell/exercises/roman-numerals/stack.yaml +1 -1
- data/tracks/haskell/exercises/saddle-points/stack.yaml +1 -1
- data/tracks/haskell/exercises/say/stack.yaml +1 -1
- data/tracks/haskell/exercises/scrabble-score/stack.yaml +1 -1
- data/tracks/haskell/exercises/secret-handshake/stack.yaml +1 -1
- data/tracks/haskell/exercises/series/stack.yaml +1 -1
- data/tracks/haskell/exercises/sgf-parsing/stack.yaml +1 -1
- data/tracks/haskell/exercises/sieve/stack.yaml +1 -1
- data/tracks/haskell/exercises/simple-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/simple-linked-list/stack.yaml +1 -1
- data/tracks/haskell/exercises/space-age/stack.yaml +1 -1
- data/tracks/haskell/exercises/strain/stack.yaml +1 -1
- data/tracks/haskell/exercises/sublist/stack.yaml +1 -1
- data/tracks/haskell/exercises/sum-of-multiples/stack.yaml +1 -1
- data/tracks/haskell/exercises/triangle/stack.yaml +1 -1
- data/tracks/haskell/exercises/trinary/stack.yaml +1 -1
- data/tracks/haskell/exercises/word-count/stack.yaml +1 -1
- data/tracks/haskell/exercises/wordy/stack.yaml +1 -1
- data/tracks/haskell/exercises/zebra-puzzle/stack.yaml +1 -1
- data/tracks/haskell/exercises/zipper/stack.yaml +1 -1
- data/tracks/java/config.json +13 -1
- data/tracks/java/exercises/etl/src/main/java/Etl.java +3 -3
- data/tracks/java/exercises/hello-world/GETTING_STARTED.md +1 -1
- data/tracks/java/exercises/hello-world/src/main/java/HelloWorld.java +3 -3
- data/tracks/java/exercises/minesweeper/build.gradle +17 -0
- data/tracks/java/exercises/minesweeper/src/example/java/MinesweeperBoard.java +111 -0
- data/tracks/java/exercises/minesweeper/src/main/java/MinesweeperBoard.java +5 -0
- data/tracks/java/exercises/minesweeper/src/test/java/MinesweeperBoardTest.java +295 -0
- data/tracks/java/exercises/nucleotide-count/src/test/java/NucleotideTest.java +67 -67
- data/tracks/java/exercises/series/build.gradle +18 -0
- data/tracks/java/exercises/series/src/example/java/Series.java +39 -0
- data/tracks/java/exercises/series/src/main/java/.keep +0 -0
- data/tracks/java/exercises/series/src/main/java/Series.java +3 -0
- data/tracks/java/exercises/series/src/test/java/.keep +0 -0
- data/tracks/java/exercises/series/src/test/java/SeriesTest.java +154 -0
- data/tracks/java/exercises/settings.gradle +2 -0
- data/tracks/javascript/exercises/custom-set/custom-set.spec.js +130 -84
- data/tracks/javascript/exercises/custom-set/example-gen.js +200 -0
- data/tracks/ocaml/Makefile +5 -1
- data/tracks/ocaml/config.json +2 -1
- data/tracks/ocaml/exercises/anagram/test.ml +35 -24
- data/tracks/ocaml/exercises/bob/example.ml +1 -1
- data/tracks/ocaml/exercises/bob/test.ml +53 -40
- data/tracks/ocaml/exercises/hamming/test.ml +41 -31
- data/tracks/ocaml/exercises/raindrops/test.ml +38 -39
- data/tracks/ocaml/tools/test-generator/.merlin +5 -0
- data/tracks/ocaml/tools/test-generator/Makefile +15 -0
- data/tracks/ocaml/tools/test-generator/_tags +0 -0
- data/tracks/ocaml/tools/test-generator/src/codegen.ml +17 -0
- data/tracks/ocaml/tools/test-generator/src/codegen.mli +7 -0
- data/tracks/ocaml/tools/test-generator/src/leap.json +39 -0
- data/tracks/ocaml/tools/test-generator/src/model.ml +31 -0
- data/tracks/ocaml/tools/test-generator/src/parser.ml +61 -0
- data/tracks/ocaml/tools/test-generator/src/parser.mli +9 -0
- data/tracks/ocaml/tools/test-generator/src/special_cases.ml +12 -0
- data/tracks/ocaml/tools/test-generator/src/special_cases.mli +7 -0
- data/tracks/ocaml/tools/test-generator/src/test_gen.ml +25 -0
- data/tracks/ocaml/tools/test-generator/src/test_generator.ml +62 -0
- data/tracks/ocaml/tools/test-generator/src/test_generator.mli +6 -0
- data/tracks/ocaml/tools/test-generator/src/utils.ml +32 -0
- data/tracks/ocaml/tools/test-generator/src/utils.mli +18 -0
- data/tracks/ocaml/tools/test-generator/templates/anagram/template.ml +17 -0
- data/tracks/ocaml/tools/test-generator/templates/bob/template.ml +15 -0
- data/tracks/ocaml/tools/test-generator/templates/hamming/template.ml +30 -0
- data/tracks/ocaml/tools/test-generator/templates/leap/template.ml +15 -0
- data/tracks/ocaml/tools/test-generator/templates/raindrops/template.ml +15 -0
- data/tracks/ocaml/tools/test-generator/templates/word-count/template.ml +19 -0
- data/tracks/ocaml/tools/test-generator/test/all_tests.ml +11 -0
- data/tracks/ocaml/tools/test-generator/test/codegen_test.ml +20 -0
- data/tracks/ocaml/tools/test-generator/test/model_test.ml +27 -0
- data/tracks/ocaml/tools/test-generator/test/parser_test.ml +73 -0
- data/tracks/ocaml/tools/test-generator/test/special_cases_test.ml +22 -0
- data/tracks/ocaml/tools/test-generator/test/test_generator_test.ml +11 -0
- data/tracks/ocaml/tools/test-generator/test/utils_test.ml +21 -0
- data/tracks/perl5/config.json +1 -1
- data/tracks/perl6/accumulate/accumulate.t +8 -2
- data/tracks/perl6/anagram/Example.pm +1 -1
- data/tracks/perl6/anagram/anagram.t +7 -8
- data/tracks/perl6/binary/Example.pm +1 -1
- data/tracks/perl6/binary/binary.t +7 -8
- data/tracks/perl6/bob/bob.t +1 -3
- data/tracks/perl6/config.json +1 -0
- data/tracks/perl6/grains/grains.t +7 -2
- data/tracks/perl6/leap/leap.t +3 -1
- data/tracks/perl6/raindrops/raindrops.t +8 -2
- data/tracks/perl6/rna-transcription/rna_transcription.t +8 -9
- data/tracks/perl6/robot-name/robot.t +8 -9
- data/tracks/perl6/scrabble-score/Example.pm +1 -1
- data/tracks/perl6/scrabble-score/scrabble_score.t +8 -2
- data/tracks/perl6/word-count/word_count.t +8 -2
- data/tracks/php/config.json +5 -0
- data/tracks/php/exercises/markdown/example.php +85 -0
- data/tracks/php/exercises/markdown/markdown.php +82 -0
- data/tracks/php/exercises/markdown/markdown_test.php +57 -0
- data/tracks/python/exercises/hamming/example.py +3 -0
- data/tracks/python/exercises/hamming/hamming_test.py +40 -14
- data/tracks/python/exercises/rna-transcription/example.py +6 -1
- data/tracks/python/exercises/rna-transcription/rna_transcription_test.py +9 -0
- data/tracks/ruby/config.json +6 -0
- data/tracks/ruby/exercises/dominoes/.version +1 -0
- data/tracks/ruby/exercises/dominoes/dominoes_test.rb +149 -0
- data/tracks/ruby/exercises/dominoes/example.rb +37 -0
- data/tracks/ruby/exercises/dominoes/example.tt +57 -0
- data/tracks/ruby/exercises/pangram/.version +1 -1
- data/tracks/ruby/exercises/pangram/example.rb +2 -2
- data/tracks/ruby/exercises/pangram/example.tt +5 -7
- data/tracks/ruby/exercises/pangram/pangram_test.rb +30 -25
- data/tracks/ruby/exercises/queen-attack/.version +1 -0
- data/tracks/ruby/exercises/queen-attack/example.rb +5 -30
- data/tracks/ruby/exercises/queen-attack/example.tt +22 -0
- data/tracks/ruby/exercises/queen-attack/queen_attack_test.rb +46 -95
- data/tracks/ruby/exercises/triangle/.version +1 -0
- data/tracks/ruby/exercises/triangle/example.rb +15 -22
- data/tracks/ruby/exercises/triangle/example.tt +20 -0
- data/tracks/ruby/exercises/triangle/triangle_test.rb +80 -40
- data/tracks/ruby/lib/dominoes_cases.rb +23 -0
- data/tracks/ruby/lib/pangram_cases.rb +19 -4
- data/tracks/ruby/lib/queen_attack_cases.rb +54 -0
- data/tracks/ruby/lib/triangle_cases.rb +51 -0
- data/tracks/scala/config.json +6 -0
- data/tracks/scala/exercises/dominoes/Example.scala +41 -0
- data/tracks/scala/exercises/dominoes/build.sbt +3 -0
- data/tracks/scala/exercises/dominoes/src/main/scala/Dominoes.scala +4 -0
- data/tracks/scala/exercises/dominoes/src/test/scala/DominoesSuite.scala +91 -0
- metadata +83 -2
@@ -1,14 +1,29 @@
|
|
1
1
|
class PangramCase < OpenStruct
|
2
2
|
def name
|
3
|
-
'test_%s' % description.
|
3
|
+
'test_%s' % description.downcase.tr_s(" -'", '_').sub(/_$/,'')
|
4
4
|
end
|
5
5
|
|
6
|
-
def
|
7
|
-
|
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
|
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
|
data/tracks/scala/config.json
CHANGED
@@ -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,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.
|
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-
|
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
|