trackler 2.0.5.7 → 2.0.5.8
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/common/exercises/book-store/canonical-data.json +106 -0
- data/common/exercises/phone-number/canonical-data.json +57 -0
- data/lib/trackler/version.rb +1 -1
- data/tracks/elm/exercises/accumulate/package.json +1 -1
- data/tracks/elm/exercises/allergies/package.json +1 -1
- data/tracks/elm/exercises/anagram/package.json +1 -1
- data/tracks/elm/exercises/atbash-cipher/package.json +1 -1
- data/tracks/elm/exercises/bob/package.json +1 -1
- data/tracks/elm/exercises/difference-of-squares/package.json +1 -1
- data/tracks/elm/exercises/gigasecond/package.json +1 -1
- data/tracks/elm/exercises/grade-school/package.json +1 -1
- data/tracks/elm/exercises/hamming/package.json +1 -1
- data/tracks/elm/exercises/hello-world/package.json +1 -1
- data/tracks/elm/exercises/largest-series-product/package.json +1 -1
- data/tracks/elm/exercises/leap/package.json +1 -1
- data/tracks/elm/exercises/list-ops/package.json +1 -1
- data/tracks/elm/exercises/nucleotide-count/package.json +1 -1
- data/tracks/elm/exercises/pangram/package.json +1 -1
- data/tracks/elm/exercises/phone-number/package.json +1 -1
- data/tracks/elm/exercises/raindrops/package.json +1 -1
- data/tracks/elm/exercises/rna-transcription/package.json +1 -1
- data/tracks/elm/exercises/robot-simulator/package.json +1 -1
- data/tracks/elm/exercises/roman-numerals/package.json +1 -1
- data/tracks/elm/exercises/run-length-encoding/package.json +1 -1
- data/tracks/elm/exercises/say/package.json +1 -1
- data/tracks/elm/exercises/scrabble-score/package.json +1 -1
- data/tracks/elm/exercises/series/package.json +1 -1
- data/tracks/elm/exercises/space-age/package.json +1 -1
- data/tracks/elm/exercises/strain/package.json +1 -1
- data/tracks/elm/exercises/sublist/package.json +1 -1
- data/tracks/elm/exercises/sum-of-multiples/package.json +1 -1
- data/tracks/elm/exercises/triangle/package.json +1 -1
- data/tracks/elm/exercises/word-count/package.json +1 -1
- data/tracks/go/exercises/house/example.go +58 -28
- data/tracks/go/exercises/house/house_test.go +27 -36
- data/tracks/go/exercises/sum-of-multiples/example.go +9 -10
- data/tracks/go/exercises/sum-of-multiples/sum_of_multiples_test.go +9 -44
- data/tracks/pascal/README.md +9 -5
- data/tracks/pascal/config.json +123 -8
- data/tracks/pascal/docs/ABOUT.md +10 -0
- data/tracks/pascal/docs/INSTALLATION.md +18 -0
- data/tracks/pascal/docs/LEARNING.md +5 -0
- data/tracks/scala/exercises/bowling/build.sbt +2 -2
- data/tracks/scala/exercises/bowling/src/test/scala/BowlingSuite.scala +26 -104
- data/tracks/scala/exercises/forth/build.sbt +2 -2
- data/tracks/scala/exercises/forth/src/main/scala/Forth.scala +6 -0
- data/tracks/scala/exercises/nucleotide-count/HINTS.md +12 -12
- data/tracks/scala/exercises/nucleotide-count/build.sbt +2 -2
- data/tracks/scala/exercises/nucleotide-count/example.scala +4 -4
- data/tracks/scala/exercises/nucleotide-count/src/main/scala/DNA.scala +6 -0
- metadata +6 -3
- data/tracks/scala/exercises/nucleotide-count/src/main/scala/.keep +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5a0e02be1736f9ad6f815b3593e22e0338b90bb5
|
4
|
+
data.tar.gz: f6a8a9b2ee6b9afaa21cee8f4fdce3b2962b6db4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cab4b14cee19781307d566eed637b27a43e1dd980f9227881a1b9c066bee293ebabd741850259e437d3c42248bbc758ef97daadb4275cfe7e105c4e751a1b609
|
7
|
+
data.tar.gz: 9ccafd1cfc519b3903983fa6e291ca8f0f77afbc2be851144e8edc12416f3280b74e983e501d5beb93d7b63d5d84fafe70480f91a44031e9783c04df26e92762
|
@@ -0,0 +1,106 @@
|
|
1
|
+
{
|
2
|
+
"book-store": {
|
3
|
+
"description": [
|
4
|
+
"Calculate lowest price for shopping basket only ",
|
5
|
+
"containing books from a single series. There is no ",
|
6
|
+
"discount advantage for having more than one copy of ",
|
7
|
+
"any single book in a grouping."
|
8
|
+
],
|
9
|
+
"cases": [
|
10
|
+
{
|
11
|
+
"description": "A basket containing only a single book.",
|
12
|
+
"basket": [1],
|
13
|
+
"targetgrouping": [[1]],
|
14
|
+
"expected": 8.0
|
15
|
+
},
|
16
|
+
{
|
17
|
+
"description": "A basket containing only two of the same book.",
|
18
|
+
"basket": [2, 2],
|
19
|
+
"targetgrouping": [[2], [2]],
|
20
|
+
"expected": 16.0
|
21
|
+
},
|
22
|
+
{
|
23
|
+
"description": "No charge to carry around an empty basket.",
|
24
|
+
"basket": [],
|
25
|
+
"targetgrouping": [],
|
26
|
+
"expected": 0.0
|
27
|
+
},
|
28
|
+
{
|
29
|
+
"description": "A basket containing only two different books.",
|
30
|
+
"basket": [1, 2],
|
31
|
+
"targetgrouping": [[1, 2]],
|
32
|
+
"expected": 15.2
|
33
|
+
},
|
34
|
+
{
|
35
|
+
"description": "A basket of three different books.",
|
36
|
+
"basket": [1, 2, 3],
|
37
|
+
"targetgrouping": [[1, 2, 3]],
|
38
|
+
"expected": 21.60
|
39
|
+
},
|
40
|
+
{
|
41
|
+
"description": "A basket of four different books.",
|
42
|
+
"basket": [1, 2, 3, 4],
|
43
|
+
"targetgrouping": [[1, 2, 3, 4]],
|
44
|
+
"expected": 25.60
|
45
|
+
},
|
46
|
+
{
|
47
|
+
"description": "A basket of five different books.",
|
48
|
+
"basket": [1, 2, 3, 4, 5],
|
49
|
+
"targetgrouping": [[1, 2, 3, 4, 5]],
|
50
|
+
"expected": 30.00
|
51
|
+
},
|
52
|
+
{
|
53
|
+
"description": [
|
54
|
+
"A basket containing eight books consisting of a ",
|
55
|
+
"pair each of the first three books plus one copy ",
|
56
|
+
"each of the last two books. Please pay careful ",
|
57
|
+
"attention to this particular target grouping, it ",
|
58
|
+
"is not intuitive, but does grant the largest ",
|
59
|
+
"discount."
|
60
|
+
],
|
61
|
+
"basket": [1, 1, 2, 2, 3, 3, 4, 5],
|
62
|
+
"targetgrouping": [[1, 2, 3, 4], [1, 2, 3, 5]],
|
63
|
+
"expected": 51.20
|
64
|
+
},
|
65
|
+
{
|
66
|
+
"description": [
|
67
|
+
"A basket containing nine books consisting of a ",
|
68
|
+
"pair each of the first four books plus one of ",
|
69
|
+
"the last book."
|
70
|
+
],
|
71
|
+
"basket": [1, 1, 2, 2, 3, 3, 4, 4, 5],
|
72
|
+
"targetgrouping": [[1, 2, 3, 4, 5], [1, 2, 3, 4]],
|
73
|
+
"expected": 55.60
|
74
|
+
},
|
75
|
+
{
|
76
|
+
"description": [
|
77
|
+
"A basket containing ten books consisting of two ",
|
78
|
+
"copies of each book in the series."
|
79
|
+
],
|
80
|
+
"basket": [1, 1, 2, 2, 3, 3, 4, 4, 5, 5],
|
81
|
+
"targetgrouping": [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5]],
|
82
|
+
"expected": 60.00
|
83
|
+
},
|
84
|
+
{
|
85
|
+
"description": [
|
86
|
+
"A basket containing eleven books consisting ",
|
87
|
+
"of three copies of the first book plus two each ",
|
88
|
+
"of the remaining four books in the series."
|
89
|
+
],
|
90
|
+
"basket": [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1],
|
91
|
+
"targetgrouping": [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1]],
|
92
|
+
"expected": 68.00
|
93
|
+
},
|
94
|
+
{
|
95
|
+
"description": [
|
96
|
+
"A basket containing twelve books consisting of ",
|
97
|
+
"three copies of the first two books, plus two ",
|
98
|
+
"each of the remaining three books in the series."
|
99
|
+
],
|
100
|
+
"basket": [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1, 2],
|
101
|
+
"targetgrouping": [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2]],
|
102
|
+
"expected": 75.20
|
103
|
+
}
|
104
|
+
]
|
105
|
+
}
|
106
|
+
}
|
@@ -0,0 +1,57 @@
|
|
1
|
+
{
|
2
|
+
"number": {
|
3
|
+
"description": "Cleanup user-entered phone numbers",
|
4
|
+
"cases": [
|
5
|
+
{
|
6
|
+
"description": "cleans the number",
|
7
|
+
"phrase": "(123) 456-7890",
|
8
|
+
"expected": "1234567890"
|
9
|
+
},
|
10
|
+
{
|
11
|
+
"description": "cleans numbers with dots",
|
12
|
+
"phrase": "123.456.7890",
|
13
|
+
"expected": "1234567890"
|
14
|
+
},
|
15
|
+
{
|
16
|
+
"description": "cleans numbers with multiple spaces",
|
17
|
+
"phrase": "123 456 7890 ",
|
18
|
+
"expected": "1234567890"
|
19
|
+
},
|
20
|
+
{
|
21
|
+
"description": "invalid when 9 digits",
|
22
|
+
"phrase": "123456789",
|
23
|
+
"expected": null
|
24
|
+
},
|
25
|
+
{
|
26
|
+
"description": "invalid when 11 digits",
|
27
|
+
"phrase": "21234567890",
|
28
|
+
"expected": null
|
29
|
+
},
|
30
|
+
{
|
31
|
+
"description": "valid when 11 digits and starting with 1",
|
32
|
+
"phrase": "11234567890",
|
33
|
+
"expected": "1234567890"
|
34
|
+
},
|
35
|
+
{
|
36
|
+
"description": "invalid when 12 digits",
|
37
|
+
"phrase": "321234567890",
|
38
|
+
"expected": null
|
39
|
+
},
|
40
|
+
{
|
41
|
+
"description": "invalid with letters",
|
42
|
+
"phrase": "123-abc-7890",
|
43
|
+
"expected": null
|
44
|
+
},
|
45
|
+
{
|
46
|
+
"description": "invalid with punctuations",
|
47
|
+
"phrase": "123-@:!-7890",
|
48
|
+
"expected": null
|
49
|
+
},
|
50
|
+
{
|
51
|
+
"description": "invalid with right number of digits but letters mixed in",
|
52
|
+
"phrase": "1a2b3c4d5e6f7g8h9i0j",
|
53
|
+
"expected": null
|
54
|
+
}
|
55
|
+
]
|
56
|
+
}
|
57
|
+
}
|
data/lib/trackler/version.rb
CHANGED
@@ -1,39 +1,69 @@
|
|
1
1
|
package house
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
const testVersion = 1
|
4
|
+
|
5
|
+
var songLines = []string{
|
6
|
+
"the horse and the hound and the horn\nthat belonged to",
|
7
|
+
"the farmer sowing his corn\nthat kept",
|
8
|
+
"the rooster that crowed in the morn\nthat woke",
|
9
|
+
"the priest all shaven and shorn\nthat married",
|
10
|
+
"the man all tattered and torn\nthat kissed",
|
11
|
+
"the maiden all forlorn\nthat milked",
|
12
|
+
"the cow with the crumpled horn\nthat tossed",
|
13
|
+
"the dog\nthat worried",
|
14
|
+
"the cat\nthat killed",
|
15
|
+
"the rat\nthat ate",
|
16
|
+
"the malt\nthat lay in",
|
5
17
|
}
|
6
18
|
|
7
|
-
|
8
|
-
|
19
|
+
// Recursive Solution
|
20
|
+
|
21
|
+
func Verse(v int) (verse string) {
|
22
|
+
v--
|
23
|
+
i := len(songLines) - v
|
24
|
+
verse += buildVerse(songLines[i:], "This is ")
|
25
|
+
verse += "the house that Jack built."
|
26
|
+
return
|
9
27
|
}
|
10
28
|
|
11
|
-
func
|
12
|
-
if len(
|
13
|
-
return
|
29
|
+
func buildVerse(songLines []string, cur string) string {
|
30
|
+
if len(songLines) == 0 {
|
31
|
+
return cur
|
14
32
|
}
|
15
|
-
|
33
|
+
cur += songLines[0]
|
34
|
+
cur += " "
|
35
|
+
return buildVerse(songLines[1:], cur)
|
16
36
|
}
|
17
37
|
|
18
|
-
func Song() string {
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
"the man all tattered and torn\nthat kissed",
|
25
|
-
"the maiden all forlorn\nthat milked",
|
26
|
-
"the cow with the crumpled horn\nthat tossed",
|
27
|
-
"the dog\nthat worried",
|
28
|
-
"the cat\nthat killed",
|
29
|
-
"the rat\nthat ate",
|
30
|
-
"the malt\nthat lay in",
|
31
|
-
}
|
32
|
-
subject := "This is"
|
33
|
-
nounPhrase := "the house that Jack built."
|
34
|
-
s := subject + " " + nounPhrase
|
35
|
-
for c := len(relPhrases) - 1; c >= 0; c-- {
|
36
|
-
s += "\n\n" + Verse(subject, relPhrases[c:], nounPhrase)
|
38
|
+
func Song() (song string) {
|
39
|
+
for i := 0; i <= len(songLines); i++ {
|
40
|
+
song += Verse(i + 1)
|
41
|
+
if i < len(songLines) {
|
42
|
+
song += "\n\n"
|
43
|
+
}
|
37
44
|
}
|
38
|
-
return
|
45
|
+
return
|
39
46
|
}
|
47
|
+
|
48
|
+
// Iterative Solution
|
49
|
+
|
50
|
+
// func Verse(v int) (verse string) {
|
51
|
+
// v--
|
52
|
+
// verse += "This is "
|
53
|
+
// verse += strings.Join(songLines[len(songLines)-v:], " ")
|
54
|
+
// if v > 0 {
|
55
|
+
// verse += " "
|
56
|
+
// }
|
57
|
+
// verse += "the house that Jack built."
|
58
|
+
// return
|
59
|
+
// }
|
60
|
+
//
|
61
|
+
// func Song() (song string) {
|
62
|
+
// for i := 0; i <= len(songLines); i++ {
|
63
|
+
// song += Verse(i + 1)
|
64
|
+
// if i < len(songLines) {
|
65
|
+
// song += "\n\n"
|
66
|
+
// }
|
67
|
+
// }
|
68
|
+
// return
|
69
|
+
// }
|
@@ -1,19 +1,12 @@
|
|
1
|
-
//
|
2
|
-
//
|
3
|
-
//
|
4
|
-
|
5
|
-
// Verse generates a verse with relative phrases that have a recursive structure.
|
6
|
-
//
|
7
|
-
// func Verse(prefixPhrase string, relPhrases []string, suffixPhrase string) string
|
8
|
-
|
9
|
-
// As ever, there are different ways to do this. Try using Embed as a
|
10
|
-
// subroutine of Verse, and using programmatic recursion to generate the return
|
11
|
-
// value, reflecting the grammatical recursion of the song.
|
1
|
+
// As ever, there are different ways to complete this exercise.
|
2
|
+
// Try using using programmatic recursion to generate the verses of the song,
|
3
|
+
// thus reflecting the song's grammatical recursion.
|
12
4
|
|
13
|
-
//
|
14
|
-
//
|
5
|
+
// While recursion isn't always the simplest or most efficient solution to a problem,
|
6
|
+
// it's a powerful programming technique nonetheless.
|
15
7
|
//
|
16
|
-
//
|
8
|
+
// New to recursion? Here's a quick introduction:
|
9
|
+
// https://www.golang-book.com/books/intro/7#section5
|
17
10
|
|
18
11
|
package house
|
19
12
|
|
@@ -22,15 +15,10 @@ import (
|
|
22
15
|
"testing"
|
23
16
|
)
|
24
17
|
|
18
|
+
const targetTestVersion = 1
|
19
|
+
|
25
20
|
var (
|
26
|
-
|
27
|
-
r = []string{
|
28
|
-
"the cat that broke",
|
29
|
-
"the vase that was on",
|
30
|
-
}
|
31
|
-
p = "the shelf."
|
32
|
-
last = len(r) - 1
|
33
|
-
// song copied from readme
|
21
|
+
// song copied from README
|
34
22
|
song = `This is the house that Jack built.
|
35
23
|
|
36
24
|
This is the malt
|
@@ -120,22 +108,14 @@ that worried the cat
|
|
120
108
|
that killed the rat
|
121
109
|
that ate the malt
|
122
110
|
that lay in the house that Jack built.`
|
123
|
-
)
|
124
111
|
|
125
|
-
|
126
|
-
|
127
|
-
want := l + " " + p
|
128
|
-
if e := Embed(l, p); e != want {
|
129
|
-
t.Fatalf("Embed(%q, %q) = %q, want %q.", l, p, e, want)
|
130
|
-
}
|
131
|
-
}
|
112
|
+
verses = strings.Split(song, "\n\n")
|
113
|
+
)
|
132
114
|
|
133
115
|
func TestVerse(t *testing.T) {
|
134
|
-
for
|
135
|
-
|
136
|
-
|
137
|
-
if v := Verse(s, ri, p); v != want {
|
138
|
-
t.Fatalf("Verse(%q, %q, %q) = %q, want %q.", s, ri, p, v, want)
|
116
|
+
for v := 0; v < len(verses); v++ {
|
117
|
+
if ret := Verse(v + 1); ret != verses[v] {
|
118
|
+
t.Fatalf("Verse(%d) =\n%q\n want:\n%q", v+1, ret, verses[v])
|
139
119
|
}
|
140
120
|
}
|
141
121
|
}
|
@@ -146,6 +126,11 @@ func TestSong(t *testing.T) {
|
|
146
126
|
return
|
147
127
|
}
|
148
128
|
// a little help in locating an error
|
129
|
+
gotStanzas := len(strings.Split(s, "\n\n"))
|
130
|
+
wantStanzas := len(verses)
|
131
|
+
if wantStanzas != gotStanzas {
|
132
|
+
t.Fatalf("Song() has %d verse(s), want %d verses", gotStanzas, wantStanzas)
|
133
|
+
}
|
149
134
|
got := strings.Split(s, "\n")
|
150
135
|
want := strings.Split(song, "\n")
|
151
136
|
var g, w string
|
@@ -159,5 +144,11 @@ func TestSong(t *testing.T) {
|
|
159
144
|
break
|
160
145
|
}
|
161
146
|
}
|
162
|
-
t.Fatalf("Song() line %d
|
147
|
+
t.Fatalf("Song() line %d =\n%q\n want \n%q", i+1, g, w)
|
148
|
+
}
|
149
|
+
|
150
|
+
func TestTestVersion(t *testing.T) {
|
151
|
+
if testVersion != targetTestVersion {
|
152
|
+
t.Errorf("Found testVersion = %v, want %v", testVersion, targetTestVersion)
|
153
|
+
}
|
163
154
|
}
|