trackler 2.0.5.15 → 2.0.5.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/tracks/crystal/config.json +10 -0
- data/tracks/crystal/exercises/binary-search-tree/spec/binary_search_tree_spec.cr +190 -0
- data/tracks/crystal/exercises/binary-search-tree/src/binary_search_tree.cr +1 -0
- data/tracks/crystal/exercises/binary-search-tree/src/example.cr +119 -0
- data/tracks/pascal/.gitignore +0 -1
- data/tracks/pascal/exercises/allergies/AllergyTests.dpr +60 -0
- data/tracks/pascal/exercises/bank-account/BankAccountTests.dpr +60 -0
- data/tracks/pascal/exercises/beer-song/BeerSongTests.dpr +60 -0
- data/tracks/pascal/exercises/binary-search/BinarySearchTest.dpr +60 -0
- data/tracks/pascal/exercises/bob/BobTests.dpr +60 -0
- data/tracks/pascal/exercises/book-store/BookStoreTests.dpr +60 -0
- data/tracks/pascal/exercises/bowling/BowlingTests.dpr +60 -0
- data/tracks/pascal/exercises/circular-buffer/CircularBufferTests.dpr +60 -0
- data/tracks/pascal/exercises/clock/ClockTest.dpr +60 -0
- data/tracks/pascal/exercises/etl/ETLtests.dpr +60 -0
- data/tracks/pascal/exercises/hamming/Hamming.dpr +60 -0
- data/tracks/pascal/exercises/hello-world/TestHelloWorld.dpr +60 -0
- data/tracks/pascal/exercises/leap/LeapTest.dpr +60 -0
- data/tracks/pascal/exercises/nucleotide-count/NucleotideCountTest.dpr +60 -0
- data/tracks/pascal/exercises/perfect-numbers/PerfectNumbersTest.dpr +60 -0
- data/tracks/pascal/exercises/phone-number/PhoneNumberTests.dpr +60 -0
- data/tracks/ruby/.travis.yml +1 -0
- data/tracks/ruby/test/test_helper.rb +9 -6
- metadata +21 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 63066d33f5a8f92d2b464cba3061bf2a864e930d
|
4
|
+
data.tar.gz: c3f03af9d510ba4462373030ae433921b9dd6d9c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aeb55869b9e9f36c52e0b67517d3e4d589e73eff04e645323097d60c5b7653421fdb97b75725a6e5f3e1578f51eb3224c224f17e983f269d4346997f9b4f3e96
|
7
|
+
data.tar.gz: 6503831fa54c448af36785693cc9722fc461b33857dc35148d58dbdff24420b7e47ea33617e81293e268cfaa9922a1cc3d6f5dea193297a22ac9acdcf4964091
|
data/lib/trackler/version.rb
CHANGED
data/tracks/crystal/config.json
CHANGED
@@ -113,6 +113,16 @@
|
|
113
113
|
"topics": [
|
114
114
|
]
|
115
115
|
},
|
116
|
+
{
|
117
|
+
"slug": "binary-search-tree",
|
118
|
+
"difficulty": 1,
|
119
|
+
"topics": [
|
120
|
+
"data structures",
|
121
|
+
"algorithms",
|
122
|
+
"trees",
|
123
|
+
"recursion"
|
124
|
+
]
|
125
|
+
},
|
116
126
|
{
|
117
127
|
"slug": "run-length-encoding",
|
118
128
|
"difficulty": 1,
|
@@ -0,0 +1,190 @@
|
|
1
|
+
require "spec"
|
2
|
+
require "../src/*"
|
3
|
+
|
4
|
+
describe "BinarySearchTree" do
|
5
|
+
it "sets the root node" do
|
6
|
+
root = Node.new(1)
|
7
|
+
root.value.should eq(1)
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "#insert" do
|
11
|
+
pending "inserts smaller values to the left" do
|
12
|
+
tree = Node.new(4)
|
13
|
+
tree.insert(2)
|
14
|
+
|
15
|
+
left = tree.left.not_nil!
|
16
|
+
left.value.should eq(2)
|
17
|
+
|
18
|
+
tree.right.should be_nil
|
19
|
+
end
|
20
|
+
|
21
|
+
pending "inserts equal values to the left" do
|
22
|
+
tree = Node.new(4)
|
23
|
+
tree.insert(4)
|
24
|
+
|
25
|
+
left_node = tree.left.not_nil!
|
26
|
+
left_node.value.should eq(4)
|
27
|
+
|
28
|
+
tree.right.should be_nil
|
29
|
+
end
|
30
|
+
|
31
|
+
pending "inserts greater values to the right" do
|
32
|
+
tree = Node.new(4)
|
33
|
+
tree.insert(5)
|
34
|
+
|
35
|
+
right_node = tree.right.not_nil!
|
36
|
+
right_node.value.should eq(5)
|
37
|
+
|
38
|
+
tree.left.should be_nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#search" do
|
43
|
+
pending "will return a node if a search if successful" do
|
44
|
+
tree = Node.new(5)
|
45
|
+
tree.insert(1)
|
46
|
+
node = tree.search(1).not_nil!
|
47
|
+
node.value.should eq(1)
|
48
|
+
end
|
49
|
+
|
50
|
+
pending "will return nil if a searched value is not found" do
|
51
|
+
tree = Node.new(5)
|
52
|
+
tree.search(4).should be_nil
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#each" do
|
57
|
+
pending "traverses the tree in order" do
|
58
|
+
tree = Node.new(5)
|
59
|
+
tree.insert(1)
|
60
|
+
tree.insert(6)
|
61
|
+
tree.insert(7)
|
62
|
+
tree.insert(3)
|
63
|
+
test_array = [1, 3, 5, 6, 7]
|
64
|
+
|
65
|
+
tree.each do |value|
|
66
|
+
value.should eq(test_array.shift)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Deletion from a binary search tree https://en.wikipedia.org/wiki/Binary_search_tree#Deletion
|
72
|
+
# There are three possible cases to consider:
|
73
|
+
# 1. Deleting a node with no children
|
74
|
+
# 2. Deleting a node with one child
|
75
|
+
# 3. Deleting a node with two children
|
76
|
+
describe "#delete" do
|
77
|
+
pending "can remove the root node" do
|
78
|
+
tree = Node.new(5)
|
79
|
+
tree.insert(2)
|
80
|
+
tree.delete(5)
|
81
|
+
tree.value.should eq(2)
|
82
|
+
end
|
83
|
+
|
84
|
+
pending "removes a node with no children" do
|
85
|
+
tree = Node.new(5)
|
86
|
+
tree.insert(2)
|
87
|
+
tree.delete(2)
|
88
|
+
tree.left.should be_nil
|
89
|
+
end
|
90
|
+
|
91
|
+
pending "removes a node with one child" do
|
92
|
+
tree = Node.new(5)
|
93
|
+
tree.insert(3)
|
94
|
+
tree.insert(2)
|
95
|
+
tree.delete(3)
|
96
|
+
|
97
|
+
new_values = [2, 5]
|
98
|
+
tree.each do |value|
|
99
|
+
value.should eq(new_values.shift)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
pending "removes a node with two children" do
|
104
|
+
tree = Node.new(5)
|
105
|
+
tree.insert(3)
|
106
|
+
tree.insert(2)
|
107
|
+
tree.insert(4)
|
108
|
+
tree.delete(3)
|
109
|
+
|
110
|
+
new_values = [2, 4, 5]
|
111
|
+
tree.each do |value|
|
112
|
+
value.should eq(new_values.shift)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
pending "removes a left node with two child (complex)" do
|
117
|
+
tree = Node.new(10)
|
118
|
+
tree.insert(5)
|
119
|
+
tree.insert(2)
|
120
|
+
tree.insert(4)
|
121
|
+
tree.insert(8)
|
122
|
+
tree.insert(9)
|
123
|
+
tree.insert(7)
|
124
|
+
tree.delete(5)
|
125
|
+
|
126
|
+
new_values = [2, 4, 7, 8, 9, 10]
|
127
|
+
tree.each do |value|
|
128
|
+
value.should eq(new_values.shift)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
pending "removes a right node with two children (complex)" do
|
133
|
+
tree = Node.new(1)
|
134
|
+
tree.insert(5)
|
135
|
+
tree.insert(2)
|
136
|
+
tree.insert(4)
|
137
|
+
tree.insert(8)
|
138
|
+
tree.insert(9)
|
139
|
+
tree.insert(7)
|
140
|
+
tree.delete(5)
|
141
|
+
|
142
|
+
new_values = [1, 2, 4, 7, 8, 9]
|
143
|
+
tree.each do |value|
|
144
|
+
value.should eq(new_values.shift)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
# The following tests check for additional features to the Binary Search Tree
|
150
|
+
# They are not required to implement a complete BST
|
151
|
+
# Instead they should be used to dive a little deeper into the Crystal language
|
152
|
+
describe "crystal-lang specific" do
|
153
|
+
# Make the Binary Search Tree Enumerable
|
154
|
+
# See https://crystal-lang.org/api/0.20.3/Enumerable.html
|
155
|
+
pending "is an Enumerable" do
|
156
|
+
tree = Node.new(1)
|
157
|
+
tree.insert(5)
|
158
|
+
tree.insert(2)
|
159
|
+
tree.should be_a(Enumerable(Int32))
|
160
|
+
mapped_values = tree.map { |value| value * 10 }
|
161
|
+
mapped_values.should eq([10, 20, 50])
|
162
|
+
end
|
163
|
+
|
164
|
+
# If no block is provided to the each method return an Iterator
|
165
|
+
# See https://crystal-lang.org/api/0.20.3/Iterator.html
|
166
|
+
pending "will return an iterator if no block is provided" do
|
167
|
+
tree = Node.new(1)
|
168
|
+
tree.insert(5)
|
169
|
+
tree.insert(2)
|
170
|
+
iter = tree.each
|
171
|
+
iter.next.should eq 1
|
172
|
+
iter.next.should eq 2
|
173
|
+
iter.next.should eq 5
|
174
|
+
end
|
175
|
+
|
176
|
+
# Make the Binary Search Tree Iterable
|
177
|
+
# See https://crystal-lang.org/api/0.20.3/Iterable.html
|
178
|
+
pending "is Iterable" do
|
179
|
+
tree = Node.new(100)
|
180
|
+
tree.insert(50)
|
181
|
+
tree.insert(20)
|
182
|
+
tree.insert(30)
|
183
|
+
tree.should be_a(Iterable(Int32))
|
184
|
+
iter = tree.each_cons(2)
|
185
|
+
iter.next.should eq([20, 30])
|
186
|
+
iter.next.should eq([30, 50])
|
187
|
+
iter.next.should eq([50, 100])
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
# Please implement your solution to binary-search-tree in this file
|
@@ -0,0 +1,119 @@
|
|
1
|
+
class Node(T)
|
2
|
+
include Enumerable(T)
|
3
|
+
include Iterable(T)
|
4
|
+
|
5
|
+
property value : T
|
6
|
+
property left : Node(T)?
|
7
|
+
property right : Node(T)?
|
8
|
+
|
9
|
+
def initialize(@value : T)
|
10
|
+
end
|
11
|
+
|
12
|
+
def insert(new_value)
|
13
|
+
if new_value <= value
|
14
|
+
if (node = left)
|
15
|
+
node.insert(new_value)
|
16
|
+
else
|
17
|
+
@left = Node(T).new(new_value)
|
18
|
+
end
|
19
|
+
else
|
20
|
+
if (node = right)
|
21
|
+
node.insert(new_value)
|
22
|
+
else
|
23
|
+
@right = Node(T).new(new_value)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def search(search_value)
|
29
|
+
return self if search_value == value
|
30
|
+
if search_value < value
|
31
|
+
if (node = left)
|
32
|
+
node.search(search_value)
|
33
|
+
end
|
34
|
+
else
|
35
|
+
if (node = right)
|
36
|
+
node.search(search_value)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def delete(delete_value)
|
42
|
+
return delete_node if delete_value == value
|
43
|
+
|
44
|
+
if delete_value < value
|
45
|
+
if (node = left)
|
46
|
+
@left = node.delete(delete_value)
|
47
|
+
end
|
48
|
+
else
|
49
|
+
if (node = right)
|
50
|
+
@right = node.delete(delete_value)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
self
|
55
|
+
end
|
56
|
+
|
57
|
+
def each
|
58
|
+
TreeIterator.new(self).each do |v|
|
59
|
+
yield v
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def each
|
64
|
+
TreeIterator.new(self)
|
65
|
+
end
|
66
|
+
|
67
|
+
private def delete_node
|
68
|
+
if one_child?
|
69
|
+
if left
|
70
|
+
@value = left.not_nil!.value
|
71
|
+
@left = nil
|
72
|
+
else
|
73
|
+
@value = right.not_nil!.value
|
74
|
+
@right = nil
|
75
|
+
end
|
76
|
+
self
|
77
|
+
elsif two_children?
|
78
|
+
node = right.not_nil!
|
79
|
+
@value = node.each.first
|
80
|
+
@right = node.delete(value)
|
81
|
+
self
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
private def one_child?
|
86
|
+
(left && !right) || (right && !left)
|
87
|
+
end
|
88
|
+
|
89
|
+
private def two_children?
|
90
|
+
left && right
|
91
|
+
end
|
92
|
+
|
93
|
+
private class TreeIterator(T)
|
94
|
+
include Iterator(T)
|
95
|
+
|
96
|
+
def initialize(node : Node(T))
|
97
|
+
@stack = Array(Node(T)).new
|
98
|
+
process_left(node)
|
99
|
+
end
|
100
|
+
|
101
|
+
def next
|
102
|
+
return stop if @stack.empty?
|
103
|
+
|
104
|
+
node = @stack.pop
|
105
|
+
right = node.right
|
106
|
+
if right
|
107
|
+
process_left(right)
|
108
|
+
end
|
109
|
+
node.value
|
110
|
+
end
|
111
|
+
|
112
|
+
private def process_left(node)
|
113
|
+
while node
|
114
|
+
@stack.push(node)
|
115
|
+
node = node.left
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
data/tracks/pascal/.gitignore
CHANGED
@@ -0,0 +1,60 @@
|
|
1
|
+
program AllergyTests;
|
2
|
+
|
3
|
+
{$IFNDEF TESTINSIGHT}
|
4
|
+
{$APPTYPE CONSOLE}
|
5
|
+
{$ENDIF}{$STRONGLINKTYPES ON}
|
6
|
+
uses
|
7
|
+
System.SysUtils,
|
8
|
+
{$IFDEF TESTINSIGHT}
|
9
|
+
TestInsight.DUnitX,
|
10
|
+
{$ENDIF }
|
11
|
+
DUnitX.Loggers.Console,
|
12
|
+
DUnitX.Loggers.Xml.NUnit,
|
13
|
+
DUnitX.TestFramework,
|
14
|
+
uAllergyTests in 'uAllergyTests.pas',
|
15
|
+
uAllergies in 'uAllergies.pas';
|
16
|
+
|
17
|
+
var
|
18
|
+
runner : ITestRunner;
|
19
|
+
results : IRunResults;
|
20
|
+
logger : ITestLogger;
|
21
|
+
nunitLogger : ITestLogger;
|
22
|
+
begin
|
23
|
+
{$IFDEF TESTINSIGHT}
|
24
|
+
TestInsight.DUnitX.RunRegisteredTests;
|
25
|
+
exit;
|
26
|
+
{$ENDIF}
|
27
|
+
try
|
28
|
+
//Check command line options, will exit if invalid
|
29
|
+
TDUnitX.CheckCommandLine;
|
30
|
+
//Create the test runner
|
31
|
+
runner := TDUnitX.CreateRunner;
|
32
|
+
//Tell the runner to use RTTI to find Fixtures
|
33
|
+
runner.UseRTTI := True;
|
34
|
+
//tell the runner how we will log things
|
35
|
+
//Log to the console window
|
36
|
+
logger := TDUnitXConsoleLogger.Create(true);
|
37
|
+
runner.AddLogger(logger);
|
38
|
+
//Generate an NUnit compatible XML File
|
39
|
+
nunitLogger := TDUnitXXMLNUnitFileLogger.Create(TDUnitX.Options.XMLOutputFile);
|
40
|
+
runner.AddLogger(nunitLogger);
|
41
|
+
runner.FailsOnNoAsserts := False; //When true, Assertions must be made during tests;
|
42
|
+
|
43
|
+
//Run tests
|
44
|
+
results := runner.Execute;
|
45
|
+
if not results.AllPassed then
|
46
|
+
System.ExitCode := EXIT_ERRORS;
|
47
|
+
|
48
|
+
{$IFNDEF CI}
|
49
|
+
//We don't want this happening when running under CI.
|
50
|
+
if TDUnitX.Options.ExitBehavior = TDUnitXExitBehavior.Pause then
|
51
|
+
begin
|
52
|
+
System.Write('Done.. press <Enter> key to quit.');
|
53
|
+
System.Readln;
|
54
|
+
end;
|
55
|
+
{$ENDIF}
|
56
|
+
except
|
57
|
+
on E: Exception do
|
58
|
+
System.Writeln(E.ClassName, ': ', E.Message);
|
59
|
+
end;
|
60
|
+
end.
|
@@ -0,0 +1,60 @@
|
|
1
|
+
program BankAccountTests;
|
2
|
+
|
3
|
+
{$IFNDEF TESTINSIGHT}
|
4
|
+
{$APPTYPE CONSOLE}
|
5
|
+
{$ENDIF}{$STRONGLINKTYPES ON}
|
6
|
+
uses
|
7
|
+
System.SysUtils,
|
8
|
+
{$IFDEF TESTINSIGHT}
|
9
|
+
TestInsight.DUnitX,
|
10
|
+
{$ENDIF }
|
11
|
+
DUnitX.Loggers.Console,
|
12
|
+
DUnitX.Loggers.Xml.NUnit,
|
13
|
+
DUnitX.TestFramework,
|
14
|
+
uBankAccountTests in 'uBankAccountTests.pas',
|
15
|
+
uBankAccount in 'uBankAccount.pas';
|
16
|
+
|
17
|
+
var
|
18
|
+
runner : ITestRunner;
|
19
|
+
results : IRunResults;
|
20
|
+
logger : ITestLogger;
|
21
|
+
nunitLogger : ITestLogger;
|
22
|
+
begin
|
23
|
+
{$IFDEF TESTINSIGHT}
|
24
|
+
TestInsight.DUnitX.RunRegisteredTests;
|
25
|
+
exit;
|
26
|
+
{$ENDIF}
|
27
|
+
try
|
28
|
+
//Check command line options, will exit if invalid
|
29
|
+
TDUnitX.CheckCommandLine;
|
30
|
+
//Create the test runner
|
31
|
+
runner := TDUnitX.CreateRunner;
|
32
|
+
//Tell the runner to use RTTI to find Fixtures
|
33
|
+
runner.UseRTTI := True;
|
34
|
+
//tell the runner how we will log things
|
35
|
+
//Log to the console window
|
36
|
+
logger := TDUnitXConsoleLogger.Create(true);
|
37
|
+
runner.AddLogger(logger);
|
38
|
+
//Generate an NUnit compatible XML File
|
39
|
+
nunitLogger := TDUnitXXMLNUnitFileLogger.Create(TDUnitX.Options.XMLOutputFile);
|
40
|
+
runner.AddLogger(nunitLogger);
|
41
|
+
runner.FailsOnNoAsserts := False; //When true, Assertions must be made during tests;
|
42
|
+
|
43
|
+
//Run tests
|
44
|
+
results := runner.Execute;
|
45
|
+
if not results.AllPassed then
|
46
|
+
System.ExitCode := EXIT_ERRORS;
|
47
|
+
|
48
|
+
{$IFNDEF CI}
|
49
|
+
//We don't want this happening when running under CI.
|
50
|
+
if TDUnitX.Options.ExitBehavior = TDUnitXExitBehavior.Pause then
|
51
|
+
begin
|
52
|
+
System.Write('Done.. press <Enter> key to quit.');
|
53
|
+
System.Readln;
|
54
|
+
end;
|
55
|
+
{$ENDIF}
|
56
|
+
except
|
57
|
+
on E: Exception do
|
58
|
+
System.Writeln(E.ClassName, ': ', E.Message);
|
59
|
+
end;
|
60
|
+
end.
|