trackler 2.0.0.1 → 2.0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/bump-content +3 -1
- data/bin/verify-metadata +2 -2
- data/common/exercises/alphametics/canonical-data.json +19 -9
- data/common/exercises/food-chain/canonical-data.json +7 -1
- data/common/exercises/grains/canonical-data.json +66 -0
- data/common/exercises/raindrops/description.md +4 -5
- data/common/exercises/triangle/canonical-data.json +81 -54
- data/lib/trackler/version.rb +1 -1
- data/tracks/c/config.json +26 -19
- data/tracks/c/exercises/allergies/makefile +15 -0
- data/tracks/c/exercises/allergies/src/allergies.h +21 -0
- data/tracks/c/exercises/allergies/src/example.c +32 -0
- data/tracks/c/exercises/allergies/src/example.h +26 -0
- data/tracks/c/exercises/allergies/test/test_allergies.c +203 -0
- data/tracks/c/exercises/allergies/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/allergies/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/allergies/test/vendor/unity_internals.h +701 -0
- data/tracks/c/exercises/atbash-cipher/makefile +16 -0
- data/tracks/c/exercises/atbash-cipher/src/example.c +71 -0
- data/tracks/c/exercises/atbash-cipher/src/example.h +7 -0
- data/tracks/c/exercises/atbash-cipher/test/test_atbash_cipher.c +113 -0
- data/tracks/c/exercises/atbash-cipher/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/atbash-cipher/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/atbash-cipher/test/vendor/unity_internals.h +701 -0
- data/tracks/c/exercises/phone-number/makefile +16 -0
- data/tracks/c/exercises/phone-number/src/example.c +66 -0
- data/tracks/c/exercises/phone-number/src/example.h +8 -0
- data/tracks/c/exercises/phone-number/test/test_phone_number.c +108 -0
- data/tracks/c/exercises/phone-number/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/phone-number/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/phone-number/test/vendor/unity_internals.h +701 -0
- data/tracks/csharp/config.json +8 -0
- data/tracks/csharp/exercises/bowling/BowlingTest.cs +188 -33
- data/tracks/csharp/exercises/bowling/Example.cs +38 -9
- data/tracks/csharp/exercises/rectangles/Example.cs +91 -0
- data/tracks/csharp/exercises/rectangles/RectanglesTest.cs +133 -0
- data/tracks/elisp/docs/INSTALLATION.org +1 -1
- data/tracks/elixir/config.json +8 -66
- data/tracks/elixir/docs/LEARNING.md +1 -1
- data/tracks/elixir/exercises/diamond/diamond_test.exs +12 -12
- data/tracks/elixir/exercises/grep/example.exs +92 -0
- data/tracks/elixir/exercises/grep/grep.exs +6 -0
- data/tracks/elixir/exercises/grep/grep_test.exs +259 -0
- data/tracks/elixir/exercises/markdown/markdown.exs +59 -2
- data/tracks/elixir/exercises/nucleotide-count/nucleotide_count_test.exs +4 -4
- data/tracks/elixir/exercises/phone-number/phone_number_test.exs +5 -0
- data/tracks/fsharp/exercises/bowling/BowlingTest.fs +158 -43
- data/tracks/fsharp/exercises/bowling/Example.fs +53 -24
- data/tracks/go/config.json +5 -0
- data/tracks/go/exercises/diamond/diamond_test.go +227 -0
- data/tracks/go/exercises/diamond/example.go +47 -0
- data/tracks/go/exercises/food-chain/example.go +1 -1
- data/tracks/go/exercises/food-chain/food_chain_test.go +30 -6
- data/tracks/go/exercises/nucleotide-count/example.go +21 -8
- data/tracks/go/exercises/nucleotide-count/nucleotide_count_test.go +45 -37
- data/tracks/haskell/exercises/anagram/test/Tests.hs +1 -11
- data/tracks/java/bin/journey-test.sh +165 -128
- data/tracks/java/docs/ABOUT.md +5 -8
- data/tracks/java/exercises/hello-world/build.gradle +0 -6
- data/tracks/java/exercises/hello-world/src/test/java/HelloWorldTest.java +0 -1
- data/tracks/java/exercises/meetup/build.gradle +0 -1
- data/tracks/java/exercises/meetup/src/example/java/Meetup.java +9 -7
- data/tracks/java/exercises/meetup/src/test/java/MeetupTest.java +185 -188
- data/tracks/lua/config.json +0 -73
- data/tracks/lua/exercises/bowling/bowling_spec.lua +92 -48
- data/tracks/lua/exercises/bowling/example.lua +4 -1
- data/tracks/objective-c/config.json +9 -30
- data/tracks/objective-c/exercises/pangram/PangramExample.h +7 -0
- data/tracks/objective-c/exercises/pangram/PangramExample.m +21 -0
- data/tracks/objective-c/exercises/pangram/PangramTest.m +51 -0
- data/tracks/objective-c/xcodeProject/ObjectiveC.xcodeproj/project.pbxproj +18 -0
- data/tracks/ocaml/README.md +46 -1
- data/tracks/ocaml/SETUP.md +21 -2
- data/tracks/ocaml/config.json +48 -78
- data/tracks/perl5/README.md +15 -8
- data/tracks/perl5/testall.pl +5 -5
- data/tracks/php/config.json +26 -34
- data/tracks/php/docs/ABOUT.md +15 -0
- data/tracks/php/exercises/allergies/allergies_test.php +121 -0
- data/tracks/php/exercises/allergies/example.php +64 -0
- data/tracks/php/exercises/etl/etl_test.php +52 -0
- data/tracks/php/exercises/etl/example.php +12 -0
- data/tracks/php/exercises/nucleotide-count/example.php +25 -0
- data/tracks/php/exercises/nucleotide-count/nucleotide-count_test.php +36 -0
- data/tracks/php/exercises/pig-latin/example.php +25 -29
- data/tracks/php/exercises/pig-latin/pig-latin_test.php +26 -19
- data/tracks/php/exercises/space-age/example.php +65 -0
- data/tracks/php/exercises/space-age/space-age_test.php +70 -0
- data/tracks/php/exercises/triangle/example.php +43 -0
- data/tracks/php/exercises/triangle/triangle_test.php +140 -0
- data/tracks/pony/exercises/anagram/example.pony +6 -6
- data/tracks/pony/exercises/anagram/test.pony +3 -4
- data/tracks/pony/exercises/bob/test.pony +23 -23
- data/tracks/pony/exercises/difference-of-squares/test.pony +11 -11
- data/tracks/pony/exercises/hamming/example.pony +3 -3
- data/tracks/pony/exercises/hamming/test.pony +16 -16
- data/tracks/pony/exercises/hello-world/test.pony +5 -4
- data/tracks/pony/exercises/leap/test.pony +8 -8
- data/tracks/python/config.json +18 -0
- data/tracks/python/exercises/diamond/diamond_test.py +33 -0
- data/tracks/python/exercises/diamond/example.py +15 -0
- data/tracks/python/exercises/linked-list/example.py +47 -0
- data/tracks/python/exercises/linked-list/linked_list.py +13 -0
- data/tracks/python/exercises/linked-list/linked_list_test.py +49 -0
- data/tracks/python/exercises/list-ops/example.py +55 -0
- data/tracks/python/exercises/list-ops/list_ops.py +38 -0
- data/tracks/python/exercises/list-ops/list_ops_test.py +136 -0
- data/tracks/ruby/bin/generate +22 -2
- data/tracks/ruby/config.json +12 -83
- data/tracks/ruby/exercises/allergies/allergies_test.rb +0 -1
- data/tracks/ruby/exercises/atbash-cipher/atbash_cipher_test.rb +0 -1
- data/tracks/ruby/exercises/beer-song/beer_song_test.rb +1 -2
- data/tracks/ruby/exercises/binary/example.rb +0 -1
- data/tracks/ruby/exercises/binary-search-tree/binary_search_tree_test.rb +1 -1
- data/tracks/ruby/exercises/bowling/.version +1 -0
- data/tracks/ruby/exercises/bowling/bowling_test.rb +109 -133
- data/tracks/ruby/exercises/bowling/example.rb +7 -7
- data/tracks/ruby/exercises/bowling/example.tt +27 -0
- data/tracks/ruby/exercises/circular-buffer/circular_buffer_test.rb +0 -2
- data/tracks/ruby/exercises/clock/example.rb +0 -2
- data/tracks/ruby/exercises/connect/connect_test.rb +0 -1
- data/tracks/ruby/exercises/custom-set/custom_set_test.rb +0 -1
- data/tracks/ruby/exercises/diamond/diamond_test.rb +0 -1
- data/tracks/ruby/exercises/etl/etl_test.rb +1 -1
- data/tracks/ruby/exercises/house/house_test.rb +0 -1
- data/tracks/ruby/exercises/isogram/isogram_test.rb +2 -2
- data/tracks/ruby/exercises/largest-series-product/example.tt +0 -3
- data/tracks/ruby/exercises/largest-series-product/largest_series_product_test.rb +0 -4
- data/tracks/ruby/exercises/linked-list/linked_list_test.rb +1 -1
- data/tracks/ruby/exercises/meetup/meetup_test.rb +0 -1
- data/tracks/ruby/exercises/nth-prime/example.tt +0 -2
- data/tracks/ruby/exercises/nth-prime/nth_prime_test.rb +0 -2
- data/tracks/ruby/exercises/ocr-numbers/ocr_numbers_test.rb +1 -2
- data/tracks/ruby/exercises/protein-translation/protein_translation_test.rb +0 -1
- data/tracks/ruby/exercises/proverb/proverb_test.rb +1 -3
- data/tracks/ruby/exercises/queen-attack/example.rb +3 -1
- data/tracks/ruby/exercises/queen-attack/queen_attack_test.rb +34 -8
- data/tracks/ruby/exercises/robot-simulator/robot_simulator_test.rb +1 -1
- data/tracks/ruby/exercises/strain/strain_test.rb +2 -2
- data/tracks/ruby/exercises/tournament/.version +1 -0
- data/tracks/ruby/exercises/tournament/example.rb +54 -0
- data/tracks/ruby/exercises/tournament/example.tt +23 -0
- data/tracks/ruby/exercises/tournament/tournament_test.rb +92 -0
- data/tracks/ruby/exercises/transpose/.version +1 -0
- data/tracks/ruby/exercises/transpose/example.rb +14 -0
- data/tracks/ruby/exercises/transpose/example.tt +22 -0
- data/tracks/ruby/exercises/transpose/transpose_test.rb +303 -0
- data/tracks/ruby/lib/bowling_cases.rb +46 -0
- data/tracks/ruby/lib/isogram_cases.rb +1 -1
- data/tracks/ruby/lib/tournament_cases.rb +45 -0
- data/tracks/ruby/lib/transpose_cases.rb +45 -0
- data/tracks/rust/config.json +2 -0
- data/tracks/rust/exercises/bowling/.gitignore +7 -0
- data/tracks/rust/exercises/bowling/Cargo.toml +3 -0
- data/tracks/rust/exercises/bowling/example.rs +134 -0
- data/tracks/rust/exercises/bowling/tests/bowling.rs +373 -0
- data/tracks/rust/exercises/grains/.gitignore +7 -0
- data/tracks/rust/exercises/grains/Cargo.toml +3 -0
- data/tracks/rust/exercises/grains/example.rs +11 -0
- data/tracks/rust/exercises/grains/src/lib.rs +7 -0
- data/tracks/rust/exercises/grains/tests/grains.rs +63 -0
- data/tracks/rust/problems.md +2 -0
- data/tracks/scala/README.md +38 -0
- data/tracks/scala/config.json +20 -74
- data/tracks/scala/exercises/accumulate/src/test/scala/accumulate_test.scala +4 -0
- data/tracks/scala/exercises/allergies/src/test/scala/allergies_test.scala +11 -0
- data/tracks/scala/exercises/alphametics/build.sbt +6 -0
- data/tracks/scala/exercises/alphametics/example.scala +125 -0
- data/tracks/scala/exercises/alphametics/src/main/scala/.keep +0 -0
- data/tracks/scala/exercises/alphametics/src/test/scala/AlphameticsTest.scala +62 -0
- data/tracks/scala/exercises/atbash-cipher/src/test/scala/atbash_test.scala +8 -0
- data/tracks/scala/exercises/bank-account/src/test/scala/BankAccountTest.scala +4 -0
- data/tracks/scala/exercises/binary/src/test/scala/binary_test.scala +13 -0
- data/tracks/scala/exercises/binary-search-tree/src/test/scala/BstTest.scala +11 -0
- data/tracks/scala/exercises/bowling/Example.scala +116 -0
- data/tracks/scala/exercises/bowling/build.sbt +3 -0
- data/tracks/scala/exercises/bowling/src/main/scala/Bowling.scala +11 -0
- data/tracks/scala/exercises/bowling/src/test/scala/BowlingSuite.scala +237 -0
- data/tracks/scala/exercises/clock/src/test/scala/ClockTest.scala +50 -0
- data/tracks/scala/exercises/connect/README.md +17 -0
- data/tracks/scala/exercises/connect/src/test/scala/ConnectTest.scala +7 -0
- data/tracks/scala/exercises/crypto-square/src/test/scala/{CrytpoSquareTest.scala → CryptoSquareTest.scala} +9 -0
- data/tracks/scala/exercises/custom-set/src/test/scala/CustomSetTest.scala +36 -0
- data/tracks/scala/exercises/difference-of-squares/src/test/scala/squares_test.scala +8 -0
- data/tracks/scala/exercises/forth/src/test/scala/ForthTest.scala +22 -0
- data/tracks/scala/exercises/hexadecimal/src/test/scala/HexadecimalTest.scala +8 -0
- data/tracks/scala/exercises/kindergarten-garden/src/test/scala/GardenTest.scala +5 -0
- data/tracks/scala/exercises/largest-series-product/src/test/scala/SeriesTest.scala +2 -0
- data/tracks/scala/exercises/linked-list/src/test/scala/DequeTest.scala +4 -0
- data/tracks/scala/exercises/luhn/src/test/scala/LuhnTest.scala +4 -0
- data/tracks/scala/exercises/matrix/src/test/scala/MatrixTest.scala +2 -0
- data/tracks/scala/exercises/minesweeper/src/test/scala/MinesweeperTest.scala +6 -0
- data/tracks/scala/exercises/nth-prime/src/test/scala/PrimeTest.scala +5 -0
- data/tracks/scala/exercises/ocr-numbers/src/test/scala/OcrTest.scala +15 -0
- data/tracks/scala/exercises/octal/src/test/scala/OctalTest.scala +7 -0
- data/tracks/scala/exercises/parallel-letter-frequency/src/test/scala/FrequencyTest.scala +8 -0
- data/tracks/scala/exercises/pascals-triangle/src/test/scala/PascalsTriangleTest.scala +5 -0
- data/tracks/scala/exercises/pig-latin/src/test/scala/PigLatinTest.scala +4 -0
- data/tracks/scala/exercises/pythagorean-triplet/src/test/scala/PythagoreanTripletTest.scala +3 -0
- data/tracks/scala/exercises/queen-attack/src/test/scala/QueensTest.scala +5 -0
- data/tracks/scala/exercises/robot-simulator/src/test/scala/RobotTest.scala +16 -8
- data/tracks/scala/exercises/say/src/test/scala/SayTest.scala +34 -17
- data/tracks/scala/exercises/scrabble-score/src/test/scala/scrabble_score_test.scala +6 -0
- data/tracks/scala/exercises/secret-handshake/src/test/scala/SecretHandshakeTest.scala +18 -9
- data/tracks/scala/exercises/series/src/test/scala/SeriesTest.scala +4 -2
- data/tracks/scala/exercises/sieve/src/test/scala/SieveTest.scala +8 -4
- data/tracks/scala/exercises/simple-cipher/src/test/scala/CipherTest.scala +17 -9
- data/tracks/scala/exercises/sublist/src/test/scala/sublist_test.scala +17 -0
- data/tracks/scala/exercises/trinary/src/test/scala/TrinaryTest.scala +14 -7
- data/tracks/scala/exercises/wordy/src/test/scala/WordProblemTest.scala +28 -14
- data/tracks/scala/project/Build.scala +3 -3
- data/tracks/scala/testgen/src/main/scala/BowlingTestGenerator.scala +57 -0
- data/tracks/sml/config.json +41 -6
- data/tracks/sml/exercises/flatten-array/example.sml +6 -0
- data/tracks/sml/exercises/flatten-array/test_flatten_array.sml +10 -0
- data/tracks/sml/exercises/nth-prime/example.sml +46 -0
- data/tracks/sml/exercises/nth-prime/test_nth_prime.sml +14 -0
- data/tracks/sml/exercises/raindrops/example.sml +9 -0
- data/tracks/sml/exercises/raindrops/raindrops.sml +2 -0
- data/tracks/sml/exercises/raindrops/test_raindrops.sml +95 -0
- data/tracks/swift/config.json +269 -328
- data/tracks/swift/exercises/pangram/PangramExample.swift +17 -0
- data/tracks/swift/exercises/pangram/PangramTest.swift +43 -0
- data/tracks/swift/xcodeProject/xSwift.xcodeproj/project.pbxproj +16 -0
- metadata +95 -3
|
@@ -5,12 +5,18 @@ import (
|
|
|
5
5
|
"strings"
|
|
6
6
|
)
|
|
7
7
|
|
|
8
|
+
const testVersion = 2
|
|
9
|
+
|
|
10
|
+
// Histogram is a mapping from nucleotide to its count in given DNA
|
|
8
11
|
type Histogram map[byte]int
|
|
9
12
|
|
|
13
|
+
// DNA is a list of nucleotides
|
|
10
14
|
type DNA string
|
|
11
15
|
|
|
16
|
+
const validNucleotides = "ACGT"
|
|
17
|
+
|
|
18
|
+
// Count counts number of occurrences of given nucleotide in given DNA
|
|
12
19
|
func (dna DNA) Count(nucleotide byte) (count int, err error) {
|
|
13
|
-
validNucleotides := "ACGT"
|
|
14
20
|
if !strings.Contains(validNucleotides, string(nucleotide)) {
|
|
15
21
|
return 0, errors.New("dna: invalid nucleotide " + string(nucleotide))
|
|
16
22
|
}
|
|
@@ -18,11 +24,18 @@ func (dna DNA) Count(nucleotide byte) (count int, err error) {
|
|
|
18
24
|
return strings.Count(string(dna), string(nucleotide)), nil
|
|
19
25
|
}
|
|
20
26
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
// Counts generates a histogram of valid nucleotides in given DNA.
|
|
28
|
+
// Returns error if DNA contains invalid nucleotide.
|
|
29
|
+
func (dna DNA) Counts() (Histogram, error) {
|
|
30
|
+
var total int
|
|
31
|
+
h := Histogram{}
|
|
32
|
+
for i := range validNucleotides {
|
|
33
|
+
nucleotide := validNucleotides[i]
|
|
34
|
+
h[nucleotide], _ = dna.Count(nucleotide)
|
|
35
|
+
total += h[nucleotide]
|
|
36
|
+
}
|
|
37
|
+
if total != len(dna) {
|
|
38
|
+
return nil, errors.New("dna: contains invalid nucleotide")
|
|
39
|
+
}
|
|
40
|
+
return h, nil
|
|
28
41
|
}
|
|
@@ -1,27 +1,12 @@
|
|
|
1
1
|
package dna
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
func (h Histogram) sameLength(o Histogram) bool {
|
|
10
|
-
return len(h) == len(o)
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
func (h Histogram) sameMappings(o Histogram) (res bool) {
|
|
14
|
-
res = true
|
|
15
|
-
for k := range h {
|
|
16
|
-
if h[k] != o[k] {
|
|
17
|
-
res = false
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
return
|
|
21
|
-
}
|
|
3
|
+
import (
|
|
4
|
+
"reflect"
|
|
5
|
+
"testing"
|
|
6
|
+
)
|
|
22
7
|
|
|
23
8
|
var tallyTests = []struct {
|
|
24
|
-
strand
|
|
9
|
+
strand DNA
|
|
25
10
|
nucleotide byte
|
|
26
11
|
expected int
|
|
27
12
|
}{
|
|
@@ -33,9 +18,9 @@ var tallyTests = []struct {
|
|
|
33
18
|
|
|
34
19
|
func TestNucleotideCounts(t *testing.T) {
|
|
35
20
|
for _, tt := range tallyTests {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if count != tt.expected {
|
|
21
|
+
if count, err := tt.strand.Count(tt.nucleotide); err != nil {
|
|
22
|
+
t.Fatal(err)
|
|
23
|
+
} else if count != tt.expected {
|
|
39
24
|
t.Fatalf("Got \"%v\", expected \"%v\"", count, tt.expected)
|
|
40
25
|
}
|
|
41
26
|
}
|
|
@@ -43,11 +28,7 @@ func TestNucleotideCounts(t *testing.T) {
|
|
|
43
28
|
|
|
44
29
|
func TestHasErrorForInvalidNucleotides(t *testing.T) {
|
|
45
30
|
dna := DNA("GATTACA")
|
|
46
|
-
|
|
47
|
-
if count != 0 {
|
|
48
|
-
t.Fatalf("Got \"%v\", expected \"%v\"", count, 0)
|
|
49
|
-
}
|
|
50
|
-
if err == nil {
|
|
31
|
+
if _, err := dna.Count('X'); err == nil {
|
|
51
32
|
t.Fatalf("X is an invalid nucleotide, but no error was raised")
|
|
52
33
|
}
|
|
53
34
|
}
|
|
@@ -58,37 +39,57 @@ func TestHasErrorForInvalidNucleotides(t *testing.T) {
|
|
|
58
39
|
func TestCountingDoesntChangeCount(t *testing.T) {
|
|
59
40
|
dna := DNA("CGATTGGG")
|
|
60
41
|
dna.Count('T')
|
|
61
|
-
|
|
62
|
-
if
|
|
63
|
-
t.
|
|
42
|
+
count1, err := dna.Count('T')
|
|
43
|
+
if err != nil {
|
|
44
|
+
t.Fatal(err)
|
|
45
|
+
}
|
|
46
|
+
count2, err := dna.Count('T')
|
|
47
|
+
if err != nil {
|
|
48
|
+
t.Fatal(err)
|
|
49
|
+
}
|
|
50
|
+
if count1 != count2 || count2 != 2 {
|
|
51
|
+
t.Fatalf("Got %v, expected %v", []int{count1, count2}, []int{2, 2})
|
|
64
52
|
}
|
|
65
53
|
}
|
|
66
54
|
|
|
67
55
|
type histogramTest struct {
|
|
68
|
-
strand
|
|
56
|
+
strand DNA
|
|
69
57
|
expected Histogram
|
|
58
|
+
err bool
|
|
70
59
|
}
|
|
71
60
|
|
|
72
61
|
var histogramTests = []histogramTest{
|
|
73
62
|
{
|
|
74
63
|
"",
|
|
75
64
|
Histogram{'A': 0, 'C': 0, 'T': 0, 'G': 0},
|
|
65
|
+
false,
|
|
76
66
|
},
|
|
77
67
|
{
|
|
78
68
|
"GGGGGGGG",
|
|
79
69
|
Histogram{'A': 0, 'C': 0, 'T': 0, 'G': 8},
|
|
70
|
+
false,
|
|
80
71
|
},
|
|
81
72
|
{
|
|
82
73
|
"AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC",
|
|
83
74
|
Histogram{'A': 20, 'C': 12, 'T': 21, 'G': 17},
|
|
75
|
+
false,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"GGXXX",
|
|
79
|
+
nil,
|
|
80
|
+
true,
|
|
84
81
|
},
|
|
85
82
|
}
|
|
86
83
|
|
|
87
84
|
func TestSequenceHistograms(t *testing.T) {
|
|
88
85
|
for _, tt := range histogramTests {
|
|
89
|
-
|
|
90
|
-
if
|
|
91
|
-
t.Fatalf("DNA{
|
|
86
|
+
counts, err := tt.strand.Counts()
|
|
87
|
+
if tt.err && err == nil {
|
|
88
|
+
t.Fatalf("DNA{ %q }: expected error but didn't get one.", tt.strand)
|
|
89
|
+
} else if !tt.err && err != nil {
|
|
90
|
+
t.Fatalf("DNA{ %q }: expected no error but got error %s", tt.strand, err.Error())
|
|
91
|
+
} else if !tt.err && !reflect.DeepEqual(counts, tt.expected) {
|
|
92
|
+
t.Fatalf("DNA{ %q }: Got %v, expected %v", tt.strand, counts, tt.expected)
|
|
92
93
|
}
|
|
93
94
|
}
|
|
94
95
|
}
|
|
@@ -97,12 +98,19 @@ func BenchmarkSequenceHistograms(b *testing.B) {
|
|
|
97
98
|
b.StopTimer()
|
|
98
99
|
for _, tt := range histogramTests {
|
|
99
100
|
for i := 0; i < b.N; i++ {
|
|
100
|
-
dna := DNA(tt.strand)
|
|
101
101
|
b.StartTimer()
|
|
102
102
|
|
|
103
|
-
|
|
103
|
+
tt.strand.Counts()
|
|
104
104
|
|
|
105
105
|
b.StopTimer()
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
|
+
|
|
110
|
+
const targetTestVersion = 2
|
|
111
|
+
|
|
112
|
+
func TestTestVersion(t *testing.T) {
|
|
113
|
+
if testVersion != targetTestVersion {
|
|
114
|
+
t.Errorf("Found testVersion = %v, want %v.", testVersion, targetTestVersion)
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -24,7 +24,7 @@ specs = describe "anagram" $
|
|
|
24
24
|
. map fromList
|
|
25
25
|
$ candidates
|
|
26
26
|
|
|
27
|
-
-- Test cases adapted from `exercism/x-common
|
|
27
|
+
-- Test cases adapted from `exercism/x-common` on 2016-10-26.
|
|
28
28
|
|
|
29
29
|
data Case = Case { description :: String
|
|
30
30
|
, subject :: String
|
|
@@ -108,16 +108,6 @@ cases = [ Case { description = "no matches"
|
|
|
108
108
|
, candidates = ["patter"]
|
|
109
109
|
, expected = []
|
|
110
110
|
}
|
|
111
|
-
, Case { description = "detects unicode anagrams"
|
|
112
|
-
, subject = "ΑΒΓ"
|
|
113
|
-
, candidates = ["ΒΓΑ", "ΒΓΔ", "γβα"]
|
|
114
|
-
, expected = ["ΒΓΑ", "γβα"]
|
|
115
|
-
}
|
|
116
|
-
, Case { description = "eliminates misleading unicode anagrams"
|
|
117
|
-
, subject = "ΑΒΓ"
|
|
118
|
-
, candidates = ["ABΓ"]
|
|
119
|
-
, expected = []
|
|
120
|
-
}
|
|
121
111
|
, Case { description = "capital word is not own anagram"
|
|
122
112
|
, subject = "BANANA"
|
|
123
113
|
, candidates = ["Banana"]
|
|
@@ -1,79 +1,67 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
SCRIPTPATH=$( pushd `dirname $0` > /dev/null && pwd && popd > /dev/null )
|
|
3
|
-
EXECPATH=$PWD
|
|
4
|
-
XAPI_PID=""
|
|
5
|
-
|
|
6
|
-
# Makes CI output easier to read
|
|
7
|
-
TERM=dumb
|
|
1
|
+
#!/usr/bin/env bash
|
|
8
2
|
|
|
9
|
-
|
|
3
|
+
on_exit() {
|
|
10
4
|
echo ">>> on_exit()"
|
|
11
|
-
if [ "$
|
|
12
|
-
kill $
|
|
13
|
-
echo "
|
|
5
|
+
if [[ "$xapi_pid" != "" ]] ; then
|
|
6
|
+
kill $xapi_pid
|
|
7
|
+
echo "stopped x-api (pid=${xapi_pid})"
|
|
14
8
|
fi
|
|
15
9
|
cd $EXECPATH
|
|
16
10
|
echo "<<< on_exit()"
|
|
17
11
|
}
|
|
18
12
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
if [ $? != 0 ]; then
|
|
23
|
-
echo "Gradle not found. This the Java build tool and is required."
|
|
24
|
-
echo -e "Have you completed the setup instructions at https://github.com/exercism/xjava ?\n"
|
|
25
|
-
echo "PATH=${PATH}"
|
|
26
|
-
echo "aborting."
|
|
27
|
-
exit 1
|
|
28
|
-
fi
|
|
29
|
-
echo "<<< assert_gradle_installed()"
|
|
30
|
-
}
|
|
13
|
+
assert_installed() {
|
|
14
|
+
local binary=$1
|
|
15
|
+
echo ">>> assert_installed(binary=\"${binary}\")"
|
|
31
16
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
which jq >/dev/null
|
|
35
|
-
if [ $? != 0 ]; then
|
|
36
|
-
echo "jq not found. This utility is used to parse the config.json file and is required."
|
|
17
|
+
if [[ "`which $binary`" == "" ]]; then
|
|
18
|
+
echo "${binary} not found; it is required to perform this test."
|
|
37
19
|
echo -e "Have you completed the setup instructions at https://github.com/exercism/xjava ?\n"
|
|
38
20
|
echo "PATH=${PATH}"
|
|
39
21
|
echo "aborting."
|
|
40
22
|
exit 1
|
|
41
23
|
fi
|
|
42
|
-
echo "<<<
|
|
24
|
+
echo "<<< assert_installed()"
|
|
43
25
|
}
|
|
44
26
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
27
|
+
assert_ruby_installed() {
|
|
28
|
+
local ruby_app_home="$1"
|
|
29
|
+
echo ">>> assert_ruby_installed(ruby_app_home=\"${ruby_app_home}\")"
|
|
48
30
|
|
|
49
|
-
pushd "${
|
|
50
|
-
local
|
|
51
|
-
local
|
|
52
|
-
popd
|
|
53
|
-
if [ "$
|
|
54
|
-
echo "${
|
|
31
|
+
pushd "${ruby_app_home}"
|
|
32
|
+
local current_ruby_ver=`ruby --version | egrep --only-matching "[0-9]+\.[0-9]+\.[0-9]+"`
|
|
33
|
+
local expected_ruby_ver=`cat Gemfile | awk -F\' '/ruby /{print $2}'`
|
|
34
|
+
popd
|
|
35
|
+
if [[ "${expected_ruby_ver}" != "" && "${current_ruby_ver}" != "${expected_ruby_ver}" ]]; then
|
|
36
|
+
echo "${ruby_app_home} requires Ruby ${expected_ruby_ver}; current Ruby version is ${current_ruby_ver}."
|
|
55
37
|
echo -e "Ruby used: `which ruby`.\n"
|
|
56
38
|
echo -e "Have you completed the setup instructions at https://github.com/exercism/xjava ?\n"
|
|
57
39
|
echo "PATH=${PATH}"
|
|
58
40
|
echo "aborting."
|
|
59
41
|
exit 1
|
|
60
42
|
fi
|
|
61
|
-
echo "<<<
|
|
43
|
+
echo "<<< assert_ruby_installed()"
|
|
62
44
|
}
|
|
63
45
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
local BUILD_DIR="$2"
|
|
46
|
+
clean() {
|
|
47
|
+
local build_dir="$1"
|
|
48
|
+
echo ">>> clean(build_dir=\"${build_dir}\")"
|
|
68
49
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
50
|
+
# empty, absolute path, or parent reference are considered dangerous to rm -rf against.
|
|
51
|
+
if [[ "${build_dir}" == "" || ${build_dir} =~ ^/ || ${build_dir} =~ \.\. ]] ; then
|
|
52
|
+
echo "Value for build_dir looks dangerous. Aborting."
|
|
53
|
+
exit 1
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
local build_path=$( pwd )/${build_dir}
|
|
57
|
+
if [[ -d "${build_path}" ]] ; then
|
|
58
|
+
echo "Cleaning journey script build output directory (${build_path})."
|
|
59
|
+
rm -rf "${build_path}"
|
|
72
60
|
fi
|
|
73
|
-
|
|
61
|
+
cd exercises
|
|
74
62
|
gradle clean
|
|
75
|
-
|
|
76
|
-
echo "<<<
|
|
63
|
+
cd ..
|
|
64
|
+
echo "<<< clean()"
|
|
77
65
|
}
|
|
78
66
|
|
|
79
67
|
get_operating_system() {
|
|
@@ -102,131 +90,180 @@ get_cpu_architecture() {
|
|
|
102
90
|
esac
|
|
103
91
|
}
|
|
104
92
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
local
|
|
108
|
-
local
|
|
109
|
-
|
|
93
|
+
download_exercism_cli() {
|
|
94
|
+
local os="$1"
|
|
95
|
+
local arch="$2"
|
|
96
|
+
local exercism_home="$3"
|
|
97
|
+
echo ">>> download_exercism_cli(os=\"${os}\", arch=\"${arch}\", exercism_home=\"${exercism_home}\")"
|
|
98
|
+
|
|
99
|
+
local CLI_RELEASES=https://github.com/exercism/cli/releases
|
|
110
100
|
|
|
111
|
-
local
|
|
101
|
+
local latest=${CLI_RELEASES}/latest
|
|
112
102
|
# "curl..." :: HTTP 302 headers, including "Location" -- URL to redirect to.
|
|
113
103
|
# "awk..." :: pluck last path segment from "Location" (i.e. the version number)
|
|
114
|
-
local
|
|
115
|
-
local
|
|
104
|
+
local version="$(curl --head --silent ${latest} | awk -v FS=/ '/Location:/{print $NF}' | tr -d '\r')"
|
|
105
|
+
local download_url=${CLI_RELEASES}/download/${version}/exercism-${os}-${arch}.tgz
|
|
106
|
+
|
|
107
|
+
mkdir -p ${exercism_home}
|
|
108
|
+
curl -s --location ${download_url} | tar xz -C ${exercism_home}
|
|
109
|
+
echo "<<< download_exercism_cli()"
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
git_clone() {
|
|
113
|
+
local repo_name="$1"
|
|
114
|
+
local dest_path="$2"
|
|
115
|
+
echo ">>> git_clone(repo_name=\"${repo_name}\", dest_path=\"${dest_path}\")"
|
|
116
|
+
|
|
117
|
+
git clone https://github.com/exercism/${repo_name} ${dest_path}
|
|
116
118
|
|
|
117
|
-
|
|
118
|
-
curl -s --location ${CLI_URL} | tar xz -C ${EXERCISM_HOME}
|
|
119
|
-
echo "<<< fetch_exercism_cli()"
|
|
119
|
+
echo "<<< git_clone()"
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
122
|
+
make_local_trackler() {
|
|
123
|
+
local trackler="$1"
|
|
124
|
+
echo ">>> make_local_trackler(trackler=\"${trackler}\")"
|
|
125
125
|
|
|
126
|
-
|
|
127
|
-
pushd ${
|
|
128
|
-
git submodule init --
|
|
126
|
+
local xjava=$( pwd )
|
|
127
|
+
pushd ${trackler}
|
|
128
|
+
git submodule init -- common
|
|
129
129
|
git submodule update
|
|
130
|
+
|
|
131
|
+
# Bake in local copy of xjava; this is what we are testing.
|
|
130
132
|
rmdir tracks/java
|
|
131
|
-
|
|
133
|
+
mkdir -p tracks/java/exercises
|
|
134
|
+
cp ${xjava}/config.json tracks/java
|
|
135
|
+
cp -r ${xjava}/exercises tracks/java
|
|
136
|
+
|
|
137
|
+
gem install bundler
|
|
138
|
+
bundle install
|
|
139
|
+
gem build trackler.gemspec
|
|
140
|
+
|
|
141
|
+
# Make *this* the gem that x-api uses when we build x-api.
|
|
142
|
+
gem install --local trackler-*.gem
|
|
143
|
+
|
|
132
144
|
popd > /dev/null
|
|
133
|
-
echo "<<<
|
|
145
|
+
echo "<<< make_local_trackler()"
|
|
134
146
|
}
|
|
135
147
|
|
|
136
148
|
start_x_api() {
|
|
137
|
-
|
|
138
|
-
|
|
149
|
+
local xapi_home="$1"
|
|
150
|
+
echo ">>> start_x_api(xapi_home=\"${xapi_home}\")"
|
|
139
151
|
|
|
140
|
-
pushd $
|
|
152
|
+
pushd $xapi_home
|
|
141
153
|
|
|
142
|
-
SET_RUBY_VER_CMD="rbenv local 2.2.1"
|
|
143
154
|
gem install bundler
|
|
144
155
|
bundle install
|
|
145
|
-
|
|
146
156
|
RACK_ENV=development rackup &
|
|
147
|
-
|
|
157
|
+
xapi_pid=$!
|
|
148
158
|
sleep 5
|
|
149
159
|
|
|
150
|
-
echo "
|
|
160
|
+
echo "x-api is running (pid=${xapi_pid})."
|
|
151
161
|
|
|
152
162
|
popd > /dev/null
|
|
153
163
|
echo "<<< start_x_api()"
|
|
154
164
|
}
|
|
155
165
|
|
|
156
166
|
configure_exercism_cli() {
|
|
157
|
-
|
|
158
|
-
local
|
|
159
|
-
local
|
|
160
|
-
|
|
161
|
-
local
|
|
162
|
-
|
|
163
|
-
mkdir -p "${
|
|
164
|
-
pushd "${
|
|
165
|
-
$
|
|
166
|
-
$
|
|
167
|
-
$
|
|
168
|
-
popd
|
|
167
|
+
local exercism_home="$1"
|
|
168
|
+
local exercism_configfile="$2"
|
|
169
|
+
local xapi_port=$3
|
|
170
|
+
echo ">>> configure_exercism_cli(exercism_home=\"${exercism_home}\", exercism_configfile=\"${exercism_configfile}\", xapi_port=${xapi_port})"
|
|
171
|
+
local exercism="./exercism --config ${exercism_configfile}"
|
|
172
|
+
|
|
173
|
+
mkdir -p "${exercism_home}"
|
|
174
|
+
pushd "${exercism_home}"
|
|
175
|
+
$exercism configure --dir="${exercism_home}"
|
|
176
|
+
$exercism configure --api http://localhost:${xapi_port}
|
|
177
|
+
$exercism debug
|
|
178
|
+
popd
|
|
169
179
|
|
|
170
180
|
echo "<<< configure_exercism_cli()"
|
|
171
181
|
}
|
|
172
182
|
|
|
173
183
|
solve_all_exercises() {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
local
|
|
180
|
-
local
|
|
181
|
-
local
|
|
182
|
-
local
|
|
183
|
-
local
|
|
184
|
-
|
|
185
|
-
pushd ${
|
|
186
|
-
for
|
|
187
|
-
echo
|
|
188
|
-
echo
|
|
189
|
-
echo
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
184
|
+
local exercism_exercises_dir="$1"
|
|
185
|
+
local exercism_configfile="$2"
|
|
186
|
+
echo ">>> solve_all_exercises(exercism_exercises_dir=\"${exercism_exercises_dir}\", exercism_configfile=\"${exercism_configfile}\")"
|
|
187
|
+
|
|
188
|
+
local xjava=$( pwd )
|
|
189
|
+
local exercism_cli="./exercism --config ${exercism_configfile}"
|
|
190
|
+
local exercises=`cat config.json | jq '.problems []' --raw-output`
|
|
191
|
+
local total_exercises=`cat config.json | jq '.problems | length'`
|
|
192
|
+
local current_exercise_number=1
|
|
193
|
+
local tempfile="${TMPDIR:-/tmp}/journey-test.sh-unignore_all_tests.txt"
|
|
194
|
+
|
|
195
|
+
pushd ${exercism_exercises_dir}
|
|
196
|
+
for exercise in $exercises; do
|
|
197
|
+
echo -e "\n\n"
|
|
198
|
+
echo "=================================================="
|
|
199
|
+
echo "${current_exercise_number} of ${total_exercises} -- ${exercise}"
|
|
200
|
+
echo "=================================================="
|
|
201
|
+
|
|
202
|
+
${exercism_cli} fetch java $exercise
|
|
203
|
+
cp -R -H ${xjava}/exercises/${exercise}/src/example/java/* ${exercism_exercises_dir}/java/${exercise}/src/main/java/
|
|
204
|
+
|
|
205
|
+
pushd ${exercism_exercises_dir}/java/${exercise}
|
|
206
|
+
# Ensure we run all the tests (as delivered, all but the first is @Ignore'd)
|
|
207
|
+
for testfile in `find . -name "*Test.java"`; do
|
|
208
|
+
sed 's/@Ignore//' ${testfile} > "${tempfile}" && mv "${tempfile}" "${testfile}"
|
|
195
209
|
done
|
|
196
210
|
gradle test
|
|
197
|
-
popd
|
|
211
|
+
popd
|
|
198
212
|
|
|
199
|
-
|
|
213
|
+
current_exercise_number=$((current_exercise_number + 1))
|
|
200
214
|
done
|
|
201
|
-
popd
|
|
215
|
+
popd
|
|
202
216
|
}
|
|
203
217
|
|
|
204
218
|
main() {
|
|
205
|
-
#
|
|
219
|
+
# all functions assume current working directory is repository root.
|
|
206
220
|
cd "${SCRIPTPATH}/.."
|
|
207
221
|
|
|
208
|
-
local
|
|
209
|
-
local
|
|
210
|
-
local
|
|
211
|
-
|
|
212
|
-
local
|
|
213
|
-
local
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
222
|
+
local xjava=$( pwd )
|
|
223
|
+
local build_dir="build"
|
|
224
|
+
local build_path="${xjava}/${build_dir}"
|
|
225
|
+
|
|
226
|
+
local xapi_home="${build_path}/x-api"
|
|
227
|
+
local trackler_home="${build_path}/trackler"
|
|
228
|
+
local exercism_home="${build_path}/exercism"
|
|
229
|
+
|
|
230
|
+
local exercism_configfile=".journey-test.exercism.json"
|
|
231
|
+
local xapi_port=9292
|
|
232
|
+
|
|
233
|
+
# fail fast if required binaries are not installed.
|
|
234
|
+
assert_installed "gradle"
|
|
235
|
+
assert_installed "jq"
|
|
236
|
+
|
|
237
|
+
clean "${build_dir}"
|
|
238
|
+
|
|
239
|
+
# Make a version of trackler that includes the source from this repo.
|
|
240
|
+
git_clone "trackler" "${trackler_home}"
|
|
241
|
+
assert_ruby_installed "${trackler_home}"
|
|
242
|
+
make_local_trackler "${trackler_home}"
|
|
243
|
+
|
|
244
|
+
# Stand-up a local instance of x-api so we can fetch the exercises through it.
|
|
245
|
+
git_clone "x-api" "${xapi_home}"
|
|
246
|
+
assert_ruby_installed "${xapi_home}"
|
|
247
|
+
start_x_api "${xapi_home}"
|
|
248
|
+
|
|
249
|
+
# Create a CLI install and config just for this build; this script does not use your CLI install.
|
|
250
|
+
download_exercism_cli $(get_operating_system) $(get_cpu_architecture) "${exercism_home}"
|
|
251
|
+
configure_exercism_cli "${exercism_home}" "${exercism_configfile}" "${xapi_port}"
|
|
252
|
+
|
|
253
|
+
solve_all_exercises "${exercism_home}" "${exercism_configfile}"
|
|
224
254
|
}
|
|
225
255
|
|
|
226
256
|
##########################################################################
|
|
227
257
|
# Execution begins here...
|
|
228
258
|
|
|
259
|
+
# If any command fails, fail the script.
|
|
229
260
|
set -e
|
|
261
|
+
SCRIPTPATH=$( pushd `dirname $0` > /dev/null && pwd && popd > /dev/null )
|
|
262
|
+
EXECPATH=$( pwd )
|
|
263
|
+
# Make output easier to read in CI
|
|
264
|
+
TERM=dumb
|
|
265
|
+
|
|
266
|
+
xapi_pid=""
|
|
230
267
|
trap on_exit EXIT
|
|
231
268
|
main
|
|
232
269
|
|
data/tracks/java/docs/ABOUT.md
CHANGED
|
@@ -18,15 +18,12 @@ The language derives much of its syntax from C and C++, but it has fewer low-lev
|
|
|
18
18
|
|
|
19
19
|
## Why Learn JAVA?
|
|
20
20
|
|
|
21
|
-
- JAVA IS EVERYWHERE. It is one of the most sought after programming languages
|
|
22
|
-
|
|
23
|
-
- [Write once, run anywhere](https://en.wikipedia.org/wiki/Write_once,_run_anywhere) policy : Programs written in Java, are compiled into machine-independent bytecodes, so it can run on any Java platform.Basically, Java is [Platform Independent](https://en.wikipedia.org/wiki/Cross-platform#Platform-independent_software)
|
|
24
|
-
|
|
25
|
-
- Java has a Rich API:
|
|
26
|
-
Java provides [API](https://en.wikipedia.org/wiki/Application_programming_interface)'s(Application Programming Interface) for I/O, networking, utilities, XML parsing, database connections, and many other functions. Standard libraries can be supplemented by open source libraries like Apache Commons, Google Guava and others.
|
|
21
|
+
- JAVA IS EVERYWHERE. It is one of the most sought after programming languages. It is a standard for enterprise software, web-based content, games and mobile apps, as well as the [Android operating system](https://developer.android.com/index.html).
|
|
27
22
|
|
|
23
|
+
- [Write once, run anywhere](https://en.wikipedia.org/wiki/Write_once,_run_anywhere) policy: Programs written in Java are compiled into machine-independent bytecodes, so it can run on any Java platform. Basically, Java is [Platform Independent](https://en.wikipedia.org/wiki/Cross-platform#Platform-independent_software)
|
|
28
24
|
|
|
25
|
+
- Java has rich APIs:
|
|
26
|
+
Java has built-in [application programming interfaces](https://en.wikipedia.org/wiki/Application_programming_interface) (APIs) for I/O, networking, data structures, concurrency, and many other functions. Standard libraries can be supplemented by open source libraries like Apache Commons, Google Guava, Netty and others.
|
|
29
27
|
|
|
30
28
|
- Standardization:
|
|
31
|
-
If you need to write a web/enterprise app, or you need data persistence or you need to do cryptography, no problem! Java is all you require.There are
|
|
32
|
-
|
|
29
|
+
If you need to write a web/enterprise app, or you need data persistence or you need to do cryptography, no problem! Java is all you require. There are many standard tools/practices that extend the Java ecosystem, thanks to the [Java Community Process](https://www.jcp.org/en/introduction/overview) (JCP)!
|