trackler 2.0.5.0 → 2.0.5.1
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/lib/trackler/version.rb +1 -1
- data/tracks/crystal/exercises/largest-series-product/spec/largest_series_product_spec.cr +32 -16
- data/tracks/fsharp/exercises/grep/GrepTest.fs +2 -1
- data/tracks/fsharp/exercises/linked-list/Example.fs +24 -17
- data/tracks/fsharp/exercises/linked-list/HINTS.md +14 -0
- data/tracks/fsharp/exercises/linked-list/LinkedListTest.fs +73 -80
- data/tracks/lua/config.json +8 -0
- data/tracks/lua/exercises/meetup/example.lua +61 -0
- data/tracks/lua/exercises/meetup/meetup_spec.lua +858 -0
- data/tracks/purescript/.travis.yml +4 -0
- data/tracks/purescript/config.json +7 -0
- data/tracks/purescript/exercises/bob/bower.json +17 -0
- data/tracks/purescript/exercises/bob/examples/src/Bob.purs +49 -0
- data/tracks/purescript/exercises/bob/src/Bob.purs +3 -0
- data/tracks/purescript/exercises/bob/test/Main.purs +82 -0
- data/tracks/ruby/.gitignore +1 -0
- data/tracks/ruby/Gemfile +2 -0
- data/tracks/ruby/Rakefile +6 -0
- data/tracks/ruby/bin/executable-tests-check +1 -1
- data/tracks/ruby/config.json +2 -1
- data/tracks/ruby/lib/generator.rb +8 -3
- data/tracks/ruby/test/generator_test.rb +21 -0
- data/tracks/ruby/test/test_helper.rb +16 -0
- data/tracks/scala/config.json +17 -0
- data/tracks/scala/exercises/allergies/example.scala +1 -5
- data/tracks/scala/exercises/allergies/src/main/scala/Allergies.scala +11 -0
- data/tracks/scala/exercises/allergies/src/test/scala/AllergiesTest.scala +14 -14
- data/tracks/scala/exercises/atbash-cipher/example.scala +4 -4
- data/tracks/scala/exercises/atbash-cipher/src/main/scala/Atbash.scala +3 -0
- data/tracks/scala/exercises/atbash-cipher/src/test/scala/atbash_test.scala +9 -9
- data/tracks/scala/exercises/crypto-square/example.scala +1 -1
- data/tracks/scala/exercises/crypto-square/src/main/scala/CryptoSquare.scala +11 -0
- data/tracks/scala/exercises/crypto-square/src/test/scala/CryptoSquareTest.scala +17 -17
- data/tracks/scala/exercises/queen-attack/example.scala +2 -1
- data/tracks/scala/exercises/queen-attack/src/main/scala/Queens.scala +8 -0
- data/tracks/scala/exercises/queen-attack/src/test/scala/QueensTest.scala +9 -9
- data/tracks/scala/exercises/raindrops/example.scala +1 -5
- data/tracks/scala/exercises/raindrops/src/main/scala/Raindrops.scala +4 -0
- data/tracks/scala/exercises/raindrops/src/test/scala/RaindropsTest.scala +16 -16
- data/tracks/swift/README.md +16 -16
- metadata +16 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d08f22cd9cd8ad91c9bd2789324bc7e368e547c8
|
4
|
+
data.tar.gz: 1f551cc425ba3ee5e263c1f6dcdd3a8716627764
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0b19b0c48ffe4addf76f7208a016a38f465ba69ce4e49d592399ee0162943b8c016e7eaccc87e9f1af631fa495a2a7b5852c5977033db463f77ac59775dae49f
|
7
|
+
data.tar.gz: 725afee0fbc6423574cc17e67ff2992ca01464d2a441612be381161ae78f6f5e5a2b4dc5abafa95c9563c0886051e148eb3c3920b0c9c2512170d2ad1af0506b
|
data/lib/trackler/version.rb
CHANGED
@@ -6,52 +6,68 @@ describe "Series" do
|
|
6
6
|
it "can find the largest product of 2 with numbers in order" do
|
7
7
|
Series.new("0123456789").largest_product(2).should eq 72
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
|
+
pending "can find the largest product of 2" do
|
10
11
|
Series.new("576802143").largest_product(2).should eq 48
|
11
12
|
end
|
12
|
-
|
13
|
+
|
14
|
+
pending "finds the largest product if span equals length" do
|
13
15
|
Series.new("29").largest_product(2).should eq 18
|
14
16
|
end
|
15
|
-
|
17
|
+
|
18
|
+
pending "can find the largest product of 3 with numbers in order" do
|
16
19
|
Series.new("0123456789").largest_product(3).should eq 504
|
17
20
|
end
|
18
|
-
|
21
|
+
|
22
|
+
pending "can find the largest product of 3" do
|
19
23
|
Series.new("1027839564").largest_product(3).should eq 270
|
20
24
|
end
|
21
|
-
|
25
|
+
|
26
|
+
pending "can find the largest product of 5 with numbers in order" do
|
22
27
|
Series.new("0123456789").largest_product(5).should eq 15120
|
23
28
|
end
|
24
|
-
|
29
|
+
|
30
|
+
pending "can get the largest product of a big number" do
|
25
31
|
Series.new("73167176531330624919225119674426574742355349194934").largest_product(6).should eq 23520
|
26
32
|
end
|
27
|
-
|
33
|
+
|
34
|
+
pending "can get the largest product of a big number II" do
|
28
35
|
Series.new("52677741234314237566414902593461595376319419139427").largest_product(6).should eq 28350
|
29
36
|
end
|
30
|
-
|
37
|
+
|
38
|
+
pending "can get the largest product of a big number (Project Euler)" do
|
31
39
|
Series.new("7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450").largest_product(13).should eq 23514624000
|
32
40
|
end
|
33
|
-
|
41
|
+
|
42
|
+
pending "reports zero if the only digits are zero" do
|
34
43
|
Series.new("0000").largest_product(2).should eq 0
|
35
44
|
end
|
36
|
-
|
45
|
+
|
46
|
+
pending "reports zero if all spans include zero" do
|
37
47
|
Series.new("99099").largest_product(3).should eq 0
|
38
48
|
end
|
39
|
-
|
49
|
+
|
50
|
+
pending "rejects span longer than string length" do
|
40
51
|
expect_raises(ArgumentError) { Series.new("123").largest_product(4) }
|
41
52
|
end
|
42
|
-
|
53
|
+
|
54
|
+
pending "reports 1 for empty string and empty product (0 span)" do
|
43
55
|
Series.new("").largest_product(0).should eq 1
|
44
56
|
end
|
45
|
-
|
57
|
+
|
58
|
+
pending "reports 1 for nonempty string and empty product (0 span)" do
|
46
59
|
Series.new("123").largest_product(0).should eq 1
|
47
60
|
end
|
48
|
-
|
61
|
+
|
62
|
+
pending "rejects empty string and nonzero span" do
|
49
63
|
expect_raises(ArgumentError) { Series.new("").largest_product(1) }
|
50
64
|
end
|
51
|
-
|
65
|
+
|
66
|
+
pending "rejects invalid character in digits" do
|
52
67
|
expect_raises(ArgumentError) { Series.new("1234a5").largest_product(2).should eq -1 }
|
53
68
|
end
|
54
|
-
|
69
|
+
|
70
|
+
pending "rejects negative span" do
|
55
71
|
expect_raises(ArgumentError) { Series.new("12345").largest_product(-1) }
|
56
72
|
end
|
57
73
|
end
|
@@ -44,6 +44,7 @@ That Shepherd, who first taught the chosen Seed
|
|
44
44
|
|
45
45
|
[<OneTimeSetUp>]
|
46
46
|
let setUp () =
|
47
|
+
Directory.SetCurrentDirectory(Path.GetTempPath());
|
47
48
|
File.WriteAllText(iliadFileName, iliadContents)
|
48
49
|
File.WriteAllText(midsummerNightFileName, midsummerNightContents)
|
49
50
|
File.WriteAllText(paradiseLostFileName, paradiseLostContents)
|
@@ -329,4 +330,4 @@ let ``Multiple files, no matches, various flags`` (flags) =
|
|
329
330
|
|
330
331
|
let expected = ""
|
331
332
|
|
332
|
-
Assert.That(grep pattern flags files, Is.EqualTo(expected))
|
333
|
+
Assert.That(grep pattern flags files, Is.EqualTo(expected))
|
@@ -1,36 +1,43 @@
|
|
1
1
|
module LinkedList
|
2
2
|
|
3
3
|
type Element<'a> = { value: 'a; mutable prev: Element<'a> option; mutable next: Element<'a> option }
|
4
|
-
type LinkedList<'a> = { first: Element<'a> option; last: Element<'a> option }
|
4
|
+
type LinkedList<'a> = { mutable first: Element<'a> option; mutable last: Element<'a> option }
|
5
5
|
|
6
|
-
let mkLinkedList = { first = None; last = None }
|
6
|
+
let mkLinkedList () = { first = None; last = None }
|
7
7
|
|
8
|
-
let addToEmpty newValue linkedList =
|
8
|
+
let addToEmpty newValue linkedList =
|
9
9
|
let newElement = { value = newValue; prev = None; next = None }
|
10
|
-
|
10
|
+
linkedList.first <- Some newElement
|
11
|
+
linkedList.last <- Some newElement
|
11
12
|
|
12
13
|
let pop linkedList =
|
13
14
|
match linkedList.last with
|
14
15
|
| None -> failwith "Cannot pop from empty list"
|
15
|
-
| Some
|
16
|
+
| Some oldLast ->
|
17
|
+
linkedList.last <- oldLast.prev
|
18
|
+
linkedList.last |> Option.iter (fun el -> el.next <- None)
|
19
|
+
oldLast.value
|
16
20
|
|
17
21
|
let shift linkedList =
|
18
22
|
match linkedList.first with
|
19
23
|
| None -> failwith "Cannot shift from empty list"
|
20
|
-
| Some
|
21
|
-
|
22
|
-
|
24
|
+
| Some oldFirst ->
|
25
|
+
linkedList.first <- oldFirst.next
|
26
|
+
linkedList.first |> Option.iter (fun el -> el.prev <- None)
|
27
|
+
oldFirst.value
|
28
|
+
|
29
|
+
let push newValue linkedList =
|
23
30
|
match linkedList.last with
|
24
31
|
| None -> addToEmpty newValue linkedList
|
25
|
-
| Some
|
26
|
-
let
|
27
|
-
|
28
|
-
|
32
|
+
| Some oldLast ->
|
33
|
+
let newLast = Some { value = newValue; prev = linkedList.last; next = None }
|
34
|
+
oldLast.next <- newLast
|
35
|
+
linkedList.last <- newLast
|
29
36
|
|
30
|
-
let unshift newValue linkedList =
|
37
|
+
let unshift newValue linkedList =
|
31
38
|
match linkedList.first with
|
32
39
|
| None -> addToEmpty newValue linkedList
|
33
|
-
| Some
|
34
|
-
let
|
35
|
-
|
36
|
-
|
40
|
+
| Some oldFirst ->
|
41
|
+
let newFirst = Some { value = newValue; prev = None; next = linkedList.first }
|
42
|
+
oldFirst.prev <- newFirst
|
43
|
+
linkedList.first <- newFirst
|
@@ -0,0 +1,14 @@
|
|
1
|
+
## Hints
|
2
|
+
|
3
|
+
A [doubly linked list](https://en.wikipedia.org/wiki/Doubly_linked_list) is a mutable data structure. As F# is a functional-first language, immutability is generally preferred, but there are language features that allow the use of mutation where it is required.
|
4
|
+
|
5
|
+
* The `mutable` keyword can be placed before `let` bindings and [record](https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/records) fields, allowing you to assign new values to them.
|
6
|
+
|
7
|
+
* [Class](https://fsharpforfunandprofit.com/posts/classes) properties can be made mutable by specifying a property setter with the `set` keyword.
|
8
|
+
|
9
|
+
Mutable bindings must be re-assigned with `<-`
|
10
|
+
|
11
|
+
```fsharp
|
12
|
+
let mutable x = "initial value"
|
13
|
+
x <- "new value"
|
14
|
+
```
|
@@ -5,117 +5,110 @@ open LinkedList
|
|
5
5
|
|
6
6
|
[<Test>]
|
7
7
|
let ``Push and pop are first in last out order`` () =
|
8
|
-
let linkedList =
|
9
|
-
|
10
|
-
|
11
|
-
|> push 20
|
8
|
+
let linkedList = mkLinkedList ()
|
9
|
+
linkedList |> push 10
|
10
|
+
linkedList |> push 20
|
12
11
|
|
13
|
-
let
|
14
|
-
let
|
12
|
+
let val1 = pop linkedList
|
13
|
+
let val2 = pop linkedList
|
15
14
|
|
16
|
-
Assert.That(
|
17
|
-
Assert.That(
|
15
|
+
Assert.That(val1, Is.EqualTo(20))
|
16
|
+
Assert.That(val2, Is.EqualTo(10))
|
18
17
|
|
19
|
-
[<Test>]
|
20
|
-
[<Ignore("Remove to run test")>]
|
18
|
+
[<Test>]
|
19
|
+
[<Ignore("Remove to run test")>]
|
21
20
|
let ``Push and shift are first in first out order`` () =
|
22
|
-
let linkedList =
|
23
|
-
|
24
|
-
|
25
|
-
|> push 20
|
21
|
+
let linkedList = mkLinkedList ()
|
22
|
+
linkedList |> push 10
|
23
|
+
linkedList |> push 20
|
26
24
|
|
27
|
-
let
|
28
|
-
let
|
25
|
+
let val1 = shift linkedList
|
26
|
+
let val2 = shift linkedList
|
29
27
|
|
30
|
-
Assert.That(
|
31
|
-
Assert.That(
|
28
|
+
Assert.That(val1, Is.EqualTo(10))
|
29
|
+
Assert.That(val2, Is.EqualTo(20))
|
32
30
|
|
33
|
-
[<Test>]
|
34
|
-
[<Ignore("Remove to run test")>]
|
31
|
+
[<Test>]
|
32
|
+
[<Ignore("Remove to run test")>]
|
35
33
|
let ``Unshift and shift are last in first out order`` () =
|
36
|
-
let linkedList =
|
37
|
-
|
38
|
-
|
39
|
-
|> unshift 20
|
34
|
+
let linkedList = mkLinkedList ()
|
35
|
+
linkedList |> unshift 10
|
36
|
+
linkedList |> unshift 20
|
40
37
|
|
41
|
-
let
|
42
|
-
let
|
38
|
+
let val1 = shift linkedList
|
39
|
+
let val2 = shift linkedList
|
43
40
|
|
44
|
-
Assert.That(
|
45
|
-
Assert.That(
|
41
|
+
Assert.That(val1, Is.EqualTo(20))
|
42
|
+
Assert.That(val2, Is.EqualTo(10))
|
46
43
|
|
47
|
-
[<Test>]
|
44
|
+
[<Test>]
|
48
45
|
[<Ignore("Remove to run test")>]
|
49
46
|
let ``Unshift and pop are last in last out order`` () =
|
50
|
-
let linkedList =
|
51
|
-
|
52
|
-
|
53
|
-
|> unshift 20
|
47
|
+
let linkedList = mkLinkedList ()
|
48
|
+
linkedList |> unshift 10
|
49
|
+
linkedList |> unshift 20
|
54
50
|
|
55
|
-
let
|
56
|
-
let
|
51
|
+
let val1 = pop linkedList
|
52
|
+
let val2 = pop linkedList
|
57
53
|
|
58
|
-
Assert.That(
|
59
|
-
Assert.That(
|
54
|
+
Assert.That(val1, Is.EqualTo(10))
|
55
|
+
Assert.That(val2, Is.EqualTo(20))
|
60
56
|
|
61
|
-
[<Test>]
|
57
|
+
[<Test>]
|
62
58
|
[<Ignore("Remove to run test")>]
|
63
59
|
let ``Push and pop can handle multiple values`` () =
|
64
|
-
let linkedList =
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|> push 30
|
60
|
+
let linkedList = mkLinkedList ()
|
61
|
+
linkedList |> push 10
|
62
|
+
linkedList |> push 20
|
63
|
+
linkedList |> push 30
|
69
64
|
|
70
|
-
let
|
71
|
-
let
|
72
|
-
let
|
65
|
+
let val1 = pop linkedList
|
66
|
+
let val2 = pop linkedList
|
67
|
+
let val3 = pop linkedList
|
73
68
|
|
74
|
-
Assert.That(
|
75
|
-
Assert.That(
|
76
|
-
Assert.That(
|
69
|
+
Assert.That(val1, Is.EqualTo(30))
|
70
|
+
Assert.That(val2, Is.EqualTo(20))
|
71
|
+
Assert.That(val3, Is.EqualTo(10))
|
77
72
|
|
78
|
-
[<Test>]
|
73
|
+
[<Test>]
|
79
74
|
[<Ignore("Remove to run test")>]
|
80
75
|
let ``Unshift and shift can handle multiple values`` () =
|
81
|
-
let linkedList =
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|> unshift 30
|
76
|
+
let linkedList = mkLinkedList ()
|
77
|
+
linkedList |> unshift 10
|
78
|
+
linkedList |> unshift 20
|
79
|
+
linkedList |> unshift 30
|
86
80
|
|
87
|
-
let
|
88
|
-
let
|
89
|
-
let
|
81
|
+
let val1 = shift linkedList
|
82
|
+
let val2 = shift linkedList
|
83
|
+
let val3 = shift linkedList
|
90
84
|
|
91
|
-
Assert.That(
|
92
|
-
Assert.That(
|
93
|
-
Assert.That(
|
85
|
+
Assert.That(val1, Is.EqualTo(30))
|
86
|
+
Assert.That(val2, Is.EqualTo(20))
|
87
|
+
Assert.That(val3, Is.EqualTo(10))
|
94
88
|
|
95
|
-
[<Test>]
|
89
|
+
[<Test>]
|
96
90
|
[<Ignore("Remove to run test")>]
|
97
91
|
let ``All methods of manipulating the linkedList can be used together`` () =
|
98
|
-
let linkedList =
|
99
|
-
|
100
|
-
|
101
|
-
|
92
|
+
let linkedList = mkLinkedList ()
|
93
|
+
linkedList |> push 10
|
94
|
+
linkedList |> push 20
|
95
|
+
|
96
|
+
let val1 = pop linkedList
|
102
97
|
|
103
|
-
|
98
|
+
Assert.That(val1, Is.EqualTo(20))
|
104
99
|
|
105
|
-
|
100
|
+
linkedList |> push 30
|
101
|
+
let val2 = shift linkedList
|
106
102
|
|
107
|
-
|
108
|
-
let (val''', linkedList''') = shift linkedList''
|
103
|
+
Assert.That(val2, Is.EqualTo(10))
|
109
104
|
|
110
|
-
|
105
|
+
linkedList |> unshift 40
|
106
|
+
linkedList |> push 50
|
111
107
|
|
112
|
-
let
|
113
|
-
let
|
108
|
+
let val3 = shift linkedList
|
109
|
+
let val4 = pop linkedList
|
110
|
+
let val5 = shift linkedList
|
114
111
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
Assert.That(val'''''', Is.EqualTo(40))
|
120
|
-
Assert.That(val''''''', Is.EqualTo(50))
|
121
|
-
Assert.That(val'''''''', Is.EqualTo(30))
|
112
|
+
Assert.That(val3, Is.EqualTo(40))
|
113
|
+
Assert.That(val4, Is.EqualTo(50))
|
114
|
+
Assert.That(val5, Is.EqualTo(30))
|
data/tracks/lua/config.json
CHANGED
@@ -433,6 +433,14 @@
|
|
433
433
|
"filtering",
|
434
434
|
"control-flow (loops)"
|
435
435
|
]
|
436
|
+
}, {
|
437
|
+
"slug": "meetup",
|
438
|
+
"difficulty": 6,
|
439
|
+
"topics": [
|
440
|
+
"time",
|
441
|
+
"control-flow (if-statements)",
|
442
|
+
"control-flow (loops)"
|
443
|
+
]
|
436
444
|
}, {
|
437
445
|
"slug": "atbash-cipher",
|
438
446
|
"difficulty": 3,
|
@@ -0,0 +1,61 @@
|
|
1
|
+
local day_name_to_number = {
|
2
|
+
Sunday = 1,
|
3
|
+
Monday = 2,
|
4
|
+
Tuesday = 3,
|
5
|
+
Wednesday = 4,
|
6
|
+
Thursday = 5,
|
7
|
+
Friday = 6,
|
8
|
+
Saturday = 7
|
9
|
+
}
|
10
|
+
|
11
|
+
local function matching_days(config)
|
12
|
+
local meetup_day = day_name_to_number[config.day]
|
13
|
+
local days = {}
|
14
|
+
|
15
|
+
for day = 1, math.huge do
|
16
|
+
local date = os.date('*t', os.time({
|
17
|
+
year = config.year,
|
18
|
+
month = config.month,
|
19
|
+
day = day
|
20
|
+
}))
|
21
|
+
|
22
|
+
if date.month ~= config.month then break end
|
23
|
+
|
24
|
+
if date.wday == meetup_day then
|
25
|
+
table.insert(days, day)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
return days
|
30
|
+
end
|
31
|
+
|
32
|
+
local function first_teenth(t)
|
33
|
+
for _, v in ipairs(t) do
|
34
|
+
if v > 12 then return v end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
local function last(t)
|
39
|
+
return t[#t]
|
40
|
+
end
|
41
|
+
|
42
|
+
local function ordinal(t, which)
|
43
|
+
return t[({
|
44
|
+
first = 1,
|
45
|
+
second = 2,
|
46
|
+
third = 3,
|
47
|
+
fourth = 4
|
48
|
+
})[which]]
|
49
|
+
end
|
50
|
+
|
51
|
+
return function(config)
|
52
|
+
local days = matching_days(config)
|
53
|
+
|
54
|
+
if config.week == 'teenth' then
|
55
|
+
return first_teenth(days)
|
56
|
+
elseif config.week == 'last' then
|
57
|
+
return last(days)
|
58
|
+
else
|
59
|
+
return ordinal(days, config.week)
|
60
|
+
end
|
61
|
+
end
|