trackler 2.2.1.157 → 2.2.1.158
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/reasonml/.gitignore +1 -0
- data/tracks/ruby/config.json +21 -2
- data/tracks/ruby/config/maintainers.json +32 -31
- data/tracks/ruby/exercises/zipper/.meta/.version +1 -0
- data/tracks/ruby/exercises/zipper/.meta/generator/zipper_case.rb +107 -0
- data/tracks/ruby/exercises/zipper/.meta/solutions/zipper.rb +82 -0
- data/tracks/ruby/exercises/zipper/README.md +54 -0
- data/tracks/ruby/exercises/zipper/zipper_test.rb +358 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b019b44614dd8458a6088690169a84299df130ff
|
4
|
+
data.tar.gz: 0a622165cb86a6b6c703b5e662e73c3e8ab31599
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7196c114c4b5606872ce6da898d557622c437b433fc2b503c84c9b647d93e62baa44357e6251493cf779e3b595ce38179f23e54c487731ad1cce056199ec11f4
|
7
|
+
data.tar.gz: 729f6daa031098a10aed27b29fab879165e2550b2b7b3330b6ced4fa481ca77959b9da6f8c3d6d16318eb99c11c34405601bb930292effd6d08b36efd1013219
|
data/lib/trackler/version.rb
CHANGED
data/tracks/reasonml/.gitignore
CHANGED
data/tracks/ruby/config.json
CHANGED
@@ -4,7 +4,6 @@
|
|
4
4
|
"blurb": "Ruby is a dynamic, open source programming language with a focus on simplicity and productivity. It has an elegant syntax that is natural to read and easy to write.",
|
5
5
|
"gitter": "ruby",
|
6
6
|
"solution_pattern": "[Ee]xample|\\.meta/solutions/[^/]*\\.rb",
|
7
|
-
"foregone": [],
|
8
7
|
"exercises": [
|
9
8
|
{
|
10
9
|
"slug": "hello-world",
|
@@ -733,16 +732,26 @@
|
|
733
732
|
{
|
734
733
|
"slug": "octal",
|
735
734
|
"uuid": "cae4e000-3aac-41f7-b727-f9cce12d058d",
|
735
|
+
"core": false,
|
736
|
+
"unlocked_by": null,
|
737
|
+
"difficulty": 0,
|
738
|
+
"topics": null,
|
736
739
|
"deprecated": true
|
737
740
|
},
|
738
741
|
{
|
739
742
|
"slug": "point-mutations",
|
740
743
|
"uuid": "89bd3d71-000f-4cd9-9a84-ad1b22ddbd33",
|
744
|
+
"core": false,
|
745
|
+
"unlocked_by": null,
|
746
|
+
"difficulty": 0,
|
747
|
+
"topics": null,
|
741
748
|
"deprecated": true
|
742
749
|
},
|
743
750
|
{
|
744
751
|
"slug": "complex-numbers",
|
745
752
|
"uuid": "d75bd7c0-52c5-44f2-a046-f63cb332425f",
|
753
|
+
"core": false,
|
754
|
+
"unlocked_by": null,
|
746
755
|
"difficulty": 3,
|
747
756
|
"topics": [
|
748
757
|
"mathematics"
|
@@ -770,6 +779,16 @@
|
|
770
779
|
"logic",
|
771
780
|
"loops"
|
772
781
|
]
|
782
|
+
},
|
783
|
+
{
|
784
|
+
"uuid": "239b8e79-2983-4ce0-9dda-9bb999e79d11",
|
785
|
+
"slug": "zipper",
|
786
|
+
"core": false,
|
787
|
+
"unlocked_by": null,
|
788
|
+
"difficulty": 7,
|
789
|
+
"topics": [
|
790
|
+
"Data Structures"
|
791
|
+
]
|
773
792
|
}
|
774
793
|
]
|
775
|
-
}
|
794
|
+
}
|
@@ -1,64 +1,65 @@
|
|
1
1
|
{
|
2
|
+
"docs_url": "",
|
2
3
|
"maintainers": [
|
3
4
|
{
|
4
|
-
"alumnus": false,
|
5
|
-
"avatar_url": null,
|
6
|
-
"bio": null,
|
7
5
|
"github_username": "kotp",
|
6
|
+
"alumnus": false,
|
7
|
+
"show_on_website": false,
|
8
|
+
"name": null,
|
8
9
|
"link_text": null,
|
9
10
|
"link_url": null,
|
10
|
-
"
|
11
|
-
"
|
11
|
+
"avatar_url": null,
|
12
|
+
"bio": null
|
12
13
|
},
|
13
14
|
{
|
14
|
-
"alumnus": false,
|
15
|
-
"avatar_url": null,
|
16
|
-
"bio": null,
|
17
15
|
"github_username": "bernardoamc",
|
16
|
+
"alumnus": false,
|
17
|
+
"show_on_website": false,
|
18
|
+
"name": null,
|
18
19
|
"link_text": null,
|
19
20
|
"link_url": null,
|
20
|
-
"
|
21
|
-
"
|
21
|
+
"avatar_url": null,
|
22
|
+
"bio": null
|
22
23
|
},
|
23
24
|
{
|
24
|
-
"alumnus": false,
|
25
|
-
"avatar_url": null,
|
26
|
-
"bio": null,
|
27
25
|
"github_username": "tommyschaefer",
|
26
|
+
"alumnus": false,
|
27
|
+
"show_on_website": false,
|
28
|
+
"name": null,
|
28
29
|
"link_text": null,
|
29
30
|
"link_url": null,
|
30
|
-
"
|
31
|
-
"
|
31
|
+
"avatar_url": null,
|
32
|
+
"bio": null
|
32
33
|
},
|
33
34
|
{
|
34
|
-
"alumnus": false,
|
35
|
-
"avatar_url": null,
|
36
|
-
"bio": null,
|
37
35
|
"github_username": "hilary",
|
36
|
+
"alumnus": false,
|
37
|
+
"show_on_website": false,
|
38
|
+
"name": null,
|
38
39
|
"link_text": null,
|
39
40
|
"link_url": null,
|
40
|
-
"
|
41
|
-
"
|
41
|
+
"avatar_url": null,
|
42
|
+
"bio": null
|
42
43
|
},
|
43
44
|
{
|
44
|
-
"alumnus": false,
|
45
|
-
"avatar_url": null,
|
46
|
-
"bio": null,
|
47
45
|
"github_username": "bmulvihill",
|
46
|
+
"alumnus": false,
|
47
|
+
"show_on_website": false,
|
48
|
+
"name": null,
|
48
49
|
"link_text": null,
|
49
50
|
"link_url": null,
|
50
|
-
"
|
51
|
-
"
|
51
|
+
"avatar_url": null,
|
52
|
+
"bio": null
|
52
53
|
},
|
53
54
|
{
|
54
|
-
"alumnus": false,
|
55
|
-
"avatar_url": null,
|
56
|
-
"bio": null,
|
57
55
|
"github_username": "Insti",
|
56
|
+
"alumnus": false,
|
57
|
+
"show_on_website": false,
|
58
|
+
"name": null,
|
58
59
|
"link_text": null,
|
59
60
|
"link_url": null,
|
60
|
-
"
|
61
|
-
"
|
61
|
+
"avatar_url": null,
|
62
|
+
"bio": null
|
62
63
|
}
|
63
64
|
]
|
64
|
-
}
|
65
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
71
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'generator/exercise_case'
|
2
|
+
|
3
|
+
class ZipperCase < Generator::ExerciseCase
|
4
|
+
def workload
|
5
|
+
body = [
|
6
|
+
"#{initial_tree}\n",
|
7
|
+
"zipper = Zipper.from_tree(tree)\n",
|
8
|
+
"value = #{operations(input)}\n",
|
9
|
+
"#{expected_by_type}\n",
|
10
|
+
assertion
|
11
|
+
]
|
12
|
+
indent(body, 4)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def initial_tree
|
18
|
+
indent([
|
19
|
+
"tree =\n",
|
20
|
+
build_tree(input['initialTree'])
|
21
|
+
], 6)
|
22
|
+
end
|
23
|
+
|
24
|
+
def operations(input, zipper_name='zipper')
|
25
|
+
operation_chain = input['operations'].map do |op|
|
26
|
+
operation = op['operation']
|
27
|
+
item = op['item']
|
28
|
+
|
29
|
+
set_tree = lambda do
|
30
|
+
if item.nil?
|
31
|
+
"#{operation}(nil)"
|
32
|
+
else
|
33
|
+
depth = ' ' * 6
|
34
|
+
left = nil_if build_tree(item['left'], 5)
|
35
|
+
right = nil_if build_tree(item['right'], 5)
|
36
|
+
# I know. This line is crazy.
|
37
|
+
"#{operation}(\n#{depth}Node.new(#{item['value']},\n #{depth}#{left},\n #{depth}#{right}))"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
case operation
|
42
|
+
when 'set_value'
|
43
|
+
"#{operation}(#{op['item']})"
|
44
|
+
when 'set_left'
|
45
|
+
set_tree.call
|
46
|
+
when 'set_right'
|
47
|
+
set_tree.call
|
48
|
+
else
|
49
|
+
operation
|
50
|
+
end
|
51
|
+
end.join('.')
|
52
|
+
"#{zipper_name}.%s" % operation_chain
|
53
|
+
end
|
54
|
+
|
55
|
+
def assertion
|
56
|
+
if expected['value'].nil? && expected['initialTree'].nil?
|
57
|
+
'assert_nil value'
|
58
|
+
else
|
59
|
+
'assert_equal expected, value'
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def expected_by_type
|
64
|
+
case expected['type']
|
65
|
+
when 'tree'
|
66
|
+
indent([
|
67
|
+
"expected = \n",
|
68
|
+
build_tree(expected['value'])
|
69
|
+
], 6)
|
70
|
+
when 'int'
|
71
|
+
"expected = #{expected['value']}"
|
72
|
+
when 'zipper'
|
73
|
+
if expected['initialTree']
|
74
|
+
indent([
|
75
|
+
"expected_tree =\n ",
|
76
|
+
"#{build_tree(expected['initialTree'])}\n",
|
77
|
+
"expected_zipper = Zipper.from_tree(expected_tree)\n",
|
78
|
+
"expected = #{operations(expected, 'expected_zipper')}"
|
79
|
+
], 4)
|
80
|
+
elsif expected['value'].nil?
|
81
|
+
"expected = nil"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def build_tree(input, depth=4)
|
87
|
+
return 'nil' if input.nil?
|
88
|
+
next_depth = depth + 1
|
89
|
+
tree =
|
90
|
+
"Node.new(#{input['value']},\n",
|
91
|
+
"#{build_tree(input['left'], next_depth)},\n",
|
92
|
+
"#{build_tree(input['right'], next_depth)})"
|
93
|
+
indent(tree, depth * 2)
|
94
|
+
end
|
95
|
+
|
96
|
+
def indent(lines, spaces)
|
97
|
+
lines.join(' ' * spaces)
|
98
|
+
end
|
99
|
+
|
100
|
+
def nil_if(value)
|
101
|
+
if value.nil?
|
102
|
+
'nil'
|
103
|
+
else
|
104
|
+
value
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module BookKeeping
|
2
|
+
VERSION = 71
|
3
|
+
end
|
4
|
+
|
5
|
+
Node = Struct.new(:value, :left, :right)
|
6
|
+
|
7
|
+
Crumb = Struct.new(:direction, :value, :tree)
|
8
|
+
|
9
|
+
class Zipper
|
10
|
+
attr_reader :value
|
11
|
+
|
12
|
+
def initialize(value, left, right, crumbs=[])
|
13
|
+
@value = value
|
14
|
+
@left = left
|
15
|
+
@right = right
|
16
|
+
@crumbs = crumbs
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.from_tree(tree)
|
20
|
+
Zipper.new(tree.value, tree.left, tree.right)
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_tree
|
24
|
+
tree = Node.new(value, @left, @right)
|
25
|
+
for crumb in @crumbs
|
26
|
+
case crumb.direction
|
27
|
+
when :left
|
28
|
+
tree = Node.new(crumb.value, tree.dup, crumb.tree)
|
29
|
+
when :right
|
30
|
+
tree = Node.new(crumb.value, crumb.tree, tree.dup)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
tree
|
34
|
+
end
|
35
|
+
|
36
|
+
def left
|
37
|
+
return nil if @left.nil?
|
38
|
+
crumbs = [Crumb.new(:left, value, @right)] + @crumbs
|
39
|
+
Zipper.new(@left.value, @left.left, @left.right, crumbs)
|
40
|
+
end
|
41
|
+
|
42
|
+
def right
|
43
|
+
return nil if @right.nil?
|
44
|
+
crumbs = [Crumb.new(:right, value, @left)] + @crumbs
|
45
|
+
Zipper.new(@right.value, @right.left, @right.right, crumbs)
|
46
|
+
end
|
47
|
+
|
48
|
+
def up
|
49
|
+
crumb = @crumbs.first
|
50
|
+
return nil if crumb.nil?
|
51
|
+
remaining_crumbs = @crumbs.drop(1)
|
52
|
+
case crumb.direction
|
53
|
+
when :left
|
54
|
+
Zipper.new(crumb.value,
|
55
|
+
Node.new(value, @left, @right),
|
56
|
+
crumb.tree,
|
57
|
+
remaining_crumbs)
|
58
|
+
when :right
|
59
|
+
Zipper.new(crumb.value,
|
60
|
+
crumb.tree,
|
61
|
+
Node.new(value, @left, @right),
|
62
|
+
remaining_crumbs)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def set_value(new_value)
|
67
|
+
Zipper.new(new_value, @left, @right, @crumbs)
|
68
|
+
end
|
69
|
+
|
70
|
+
def set_left(node)
|
71
|
+
Zipper.new(value, node, @right, @crumbs)
|
72
|
+
end
|
73
|
+
|
74
|
+
def set_right(node)
|
75
|
+
Zipper.new(value, @left, node, @crumbs)
|
76
|
+
end
|
77
|
+
|
78
|
+
def ==(other_zipper)
|
79
|
+
return false unless other_zipper.is_a? Zipper
|
80
|
+
to_tree == other_zipper.to_tree
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# Zipper
|
2
|
+
|
3
|
+
Creating a zipper for a binary tree.
|
4
|
+
|
5
|
+
[Zippers](https://en.wikipedia.org/wiki/Zipper_%28data_structure%29) are
|
6
|
+
a purely functional way of navigating within a data structure and
|
7
|
+
manipulating it. They essentially contain a data structure and a
|
8
|
+
pointer into that data structure (called the focus).
|
9
|
+
|
10
|
+
For example given a rose tree (where each node contains a value and a
|
11
|
+
list of child nodes) a zipper might support these operations:
|
12
|
+
|
13
|
+
- `from_tree` (get a zipper out of a rose tree, the focus is on the root node)
|
14
|
+
- `to_tree` (get the rose tree out of the zipper)
|
15
|
+
- `value` (get the value of the focus node)
|
16
|
+
- `prev` (move the focus to the previous child of the same parent,
|
17
|
+
returns a new zipper)
|
18
|
+
- `next` (move the focus to the next child of the same parent, returns a
|
19
|
+
new zipper)
|
20
|
+
- `up` (move the focus to the parent, returns a new zipper)
|
21
|
+
- `set_value` (set the value of the focus node, returns a new zipper)
|
22
|
+
- `insert_before` (insert a new subtree before the focus node, it
|
23
|
+
becomes the `prev` of the focus node, returns a new zipper)
|
24
|
+
- `insert_after` (insert a new subtree after the focus node, it becomes
|
25
|
+
the `next` of the focus node, returns a new zipper)
|
26
|
+
- `delete` (removes the focus node and all subtrees, focus moves to the
|
27
|
+
`next` node if possible otherwise to the `prev` node if possible,
|
28
|
+
otherwise to the parent node, returns a new zipper)
|
29
|
+
|
30
|
+
* * * *
|
31
|
+
|
32
|
+
For installation and learning resources, refer to the
|
33
|
+
[exercism help page](http://exercism.io/languages/ruby).
|
34
|
+
|
35
|
+
For running the tests provided, you will need the Minitest gem. Open a
|
36
|
+
terminal window and run the following command to install minitest:
|
37
|
+
|
38
|
+
gem install minitest
|
39
|
+
|
40
|
+
If you would like color output, you can `require 'minitest/pride'` in
|
41
|
+
the test file, or note the alternative instruction, below, for running
|
42
|
+
the test file.
|
43
|
+
|
44
|
+
Run the tests from the exercise directory using the following command:
|
45
|
+
|
46
|
+
ruby zipper_test.rb
|
47
|
+
|
48
|
+
To include color from the command line:
|
49
|
+
|
50
|
+
ruby -r minitest/pride zipper_test.rb
|
51
|
+
|
52
|
+
|
53
|
+
## Submitting Incomplete Solutions
|
54
|
+
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
@@ -0,0 +1,358 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require_relative 'zipper'
|
3
|
+
|
4
|
+
# Common test data version: 1.1.0 6fb5601
|
5
|
+
class ZipperTest < Minitest::Test
|
6
|
+
def test_data_is_retained
|
7
|
+
# skip
|
8
|
+
tree =
|
9
|
+
Node.new(1,
|
10
|
+
Node.new(2,
|
11
|
+
nil,
|
12
|
+
Node.new(3,
|
13
|
+
nil,
|
14
|
+
nil)),
|
15
|
+
Node.new(4,
|
16
|
+
nil,
|
17
|
+
nil))
|
18
|
+
zipper = Zipper.from_tree(tree)
|
19
|
+
value = zipper.to_tree
|
20
|
+
expected =
|
21
|
+
Node.new(1,
|
22
|
+
Node.new(2,
|
23
|
+
nil,
|
24
|
+
Node.new(3,
|
25
|
+
nil,
|
26
|
+
nil)),
|
27
|
+
Node.new(4,
|
28
|
+
nil,
|
29
|
+
nil))
|
30
|
+
assert_equal expected, value
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_left_right_and_value
|
34
|
+
skip
|
35
|
+
tree =
|
36
|
+
Node.new(1,
|
37
|
+
Node.new(2,
|
38
|
+
nil,
|
39
|
+
Node.new(3,
|
40
|
+
nil,
|
41
|
+
nil)),
|
42
|
+
Node.new(4,
|
43
|
+
nil,
|
44
|
+
nil))
|
45
|
+
zipper = Zipper.from_tree(tree)
|
46
|
+
value = zipper.left.right.value
|
47
|
+
expected = 3
|
48
|
+
assert_equal expected, value
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_dead_end
|
52
|
+
skip
|
53
|
+
tree =
|
54
|
+
Node.new(1,
|
55
|
+
Node.new(2,
|
56
|
+
nil,
|
57
|
+
Node.new(3,
|
58
|
+
nil,
|
59
|
+
nil)),
|
60
|
+
Node.new(4,
|
61
|
+
nil,
|
62
|
+
nil))
|
63
|
+
zipper = Zipper.from_tree(tree)
|
64
|
+
value = zipper.left.left
|
65
|
+
expected = nil
|
66
|
+
assert_nil value
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_tree_from_deep_focus
|
70
|
+
skip
|
71
|
+
tree =
|
72
|
+
Node.new(1,
|
73
|
+
Node.new(2,
|
74
|
+
nil,
|
75
|
+
Node.new(3,
|
76
|
+
nil,
|
77
|
+
nil)),
|
78
|
+
Node.new(4,
|
79
|
+
nil,
|
80
|
+
nil))
|
81
|
+
zipper = Zipper.from_tree(tree)
|
82
|
+
value = zipper.left.right.to_tree
|
83
|
+
expected =
|
84
|
+
Node.new(1,
|
85
|
+
Node.new(2,
|
86
|
+
nil,
|
87
|
+
Node.new(3,
|
88
|
+
nil,
|
89
|
+
nil)),
|
90
|
+
Node.new(4,
|
91
|
+
nil,
|
92
|
+
nil))
|
93
|
+
assert_equal expected, value
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_traversing_up_from_top
|
97
|
+
skip
|
98
|
+
tree =
|
99
|
+
Node.new(1,
|
100
|
+
Node.new(2,
|
101
|
+
nil,
|
102
|
+
Node.new(3,
|
103
|
+
nil,
|
104
|
+
nil)),
|
105
|
+
Node.new(4,
|
106
|
+
nil,
|
107
|
+
nil))
|
108
|
+
zipper = Zipper.from_tree(tree)
|
109
|
+
value = zipper.up
|
110
|
+
expected = nil
|
111
|
+
assert_nil value
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_left_right_and_up
|
115
|
+
skip
|
116
|
+
tree =
|
117
|
+
Node.new(1,
|
118
|
+
Node.new(2,
|
119
|
+
nil,
|
120
|
+
Node.new(3,
|
121
|
+
nil,
|
122
|
+
nil)),
|
123
|
+
Node.new(4,
|
124
|
+
nil,
|
125
|
+
nil))
|
126
|
+
zipper = Zipper.from_tree(tree)
|
127
|
+
value = zipper.left.up.right.up.left.right.value
|
128
|
+
expected = 3
|
129
|
+
assert_equal expected, value
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_set_value
|
133
|
+
skip
|
134
|
+
tree =
|
135
|
+
Node.new(1,
|
136
|
+
Node.new(2,
|
137
|
+
nil,
|
138
|
+
Node.new(3,
|
139
|
+
nil,
|
140
|
+
nil)),
|
141
|
+
Node.new(4,
|
142
|
+
nil,
|
143
|
+
nil))
|
144
|
+
zipper = Zipper.from_tree(tree)
|
145
|
+
value = zipper.left.set_value(5).to_tree
|
146
|
+
expected =
|
147
|
+
Node.new(1,
|
148
|
+
Node.new(5,
|
149
|
+
nil,
|
150
|
+
Node.new(3,
|
151
|
+
nil,
|
152
|
+
nil)),
|
153
|
+
Node.new(4,
|
154
|
+
nil,
|
155
|
+
nil))
|
156
|
+
assert_equal expected, value
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_set_value_after_traversing_up
|
160
|
+
skip
|
161
|
+
tree =
|
162
|
+
Node.new(1,
|
163
|
+
Node.new(2,
|
164
|
+
nil,
|
165
|
+
Node.new(3,
|
166
|
+
nil,
|
167
|
+
nil)),
|
168
|
+
Node.new(4,
|
169
|
+
nil,
|
170
|
+
nil))
|
171
|
+
zipper = Zipper.from_tree(tree)
|
172
|
+
value = zipper.left.right.up.set_value(5).to_tree
|
173
|
+
expected =
|
174
|
+
Node.new(1,
|
175
|
+
Node.new(5,
|
176
|
+
nil,
|
177
|
+
Node.new(3,
|
178
|
+
nil,
|
179
|
+
nil)),
|
180
|
+
Node.new(4,
|
181
|
+
nil,
|
182
|
+
nil))
|
183
|
+
assert_equal expected, value
|
184
|
+
end
|
185
|
+
|
186
|
+
def test_set_left_with_leaf
|
187
|
+
skip
|
188
|
+
tree =
|
189
|
+
Node.new(1,
|
190
|
+
Node.new(2,
|
191
|
+
nil,
|
192
|
+
Node.new(3,
|
193
|
+
nil,
|
194
|
+
nil)),
|
195
|
+
Node.new(4,
|
196
|
+
nil,
|
197
|
+
nil))
|
198
|
+
zipper = Zipper.from_tree(tree)
|
199
|
+
value = zipper.left.set_left(
|
200
|
+
Node.new(5,
|
201
|
+
nil,
|
202
|
+
nil)).to_tree
|
203
|
+
expected =
|
204
|
+
Node.new(1,
|
205
|
+
Node.new(2,
|
206
|
+
Node.new(5,
|
207
|
+
nil,
|
208
|
+
nil),
|
209
|
+
Node.new(3,
|
210
|
+
nil,
|
211
|
+
nil)),
|
212
|
+
Node.new(4,
|
213
|
+
nil,
|
214
|
+
nil))
|
215
|
+
assert_equal expected, value
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_set_right_with_null
|
219
|
+
skip
|
220
|
+
tree =
|
221
|
+
Node.new(1,
|
222
|
+
Node.new(2,
|
223
|
+
nil,
|
224
|
+
Node.new(3,
|
225
|
+
nil,
|
226
|
+
nil)),
|
227
|
+
Node.new(4,
|
228
|
+
nil,
|
229
|
+
nil))
|
230
|
+
zipper = Zipper.from_tree(tree)
|
231
|
+
value = zipper.left.set_right(nil).to_tree
|
232
|
+
expected =
|
233
|
+
Node.new(1,
|
234
|
+
Node.new(2,
|
235
|
+
nil,
|
236
|
+
nil),
|
237
|
+
Node.new(4,
|
238
|
+
nil,
|
239
|
+
nil))
|
240
|
+
assert_equal expected, value
|
241
|
+
end
|
242
|
+
|
243
|
+
def test_set_right_with_subtree
|
244
|
+
skip
|
245
|
+
tree =
|
246
|
+
Node.new(1,
|
247
|
+
Node.new(2,
|
248
|
+
nil,
|
249
|
+
Node.new(3,
|
250
|
+
nil,
|
251
|
+
nil)),
|
252
|
+
Node.new(4,
|
253
|
+
nil,
|
254
|
+
nil))
|
255
|
+
zipper = Zipper.from_tree(tree)
|
256
|
+
value = zipper.set_right(
|
257
|
+
Node.new(6,
|
258
|
+
Node.new(7,
|
259
|
+
nil,
|
260
|
+
nil),
|
261
|
+
Node.new(8,
|
262
|
+
nil,
|
263
|
+
nil))).to_tree
|
264
|
+
expected =
|
265
|
+
Node.new(1,
|
266
|
+
Node.new(2,
|
267
|
+
nil,
|
268
|
+
Node.new(3,
|
269
|
+
nil,
|
270
|
+
nil)),
|
271
|
+
Node.new(6,
|
272
|
+
Node.new(7,
|
273
|
+
nil,
|
274
|
+
nil),
|
275
|
+
Node.new(8,
|
276
|
+
nil,
|
277
|
+
nil)))
|
278
|
+
assert_equal expected, value
|
279
|
+
end
|
280
|
+
|
281
|
+
def test_set_value_on_deep_focus
|
282
|
+
skip
|
283
|
+
tree =
|
284
|
+
Node.new(1,
|
285
|
+
Node.new(2,
|
286
|
+
nil,
|
287
|
+
Node.new(3,
|
288
|
+
nil,
|
289
|
+
nil)),
|
290
|
+
Node.new(4,
|
291
|
+
nil,
|
292
|
+
nil))
|
293
|
+
zipper = Zipper.from_tree(tree)
|
294
|
+
value = zipper.left.right.set_value(5).to_tree
|
295
|
+
expected =
|
296
|
+
Node.new(1,
|
297
|
+
Node.new(2,
|
298
|
+
nil,
|
299
|
+
Node.new(5,
|
300
|
+
nil,
|
301
|
+
nil)),
|
302
|
+
Node.new(4,
|
303
|
+
nil,
|
304
|
+
nil))
|
305
|
+
assert_equal expected, value
|
306
|
+
end
|
307
|
+
|
308
|
+
def test_different_paths_to_same_zipper
|
309
|
+
skip
|
310
|
+
tree =
|
311
|
+
Node.new(1,
|
312
|
+
Node.new(2,
|
313
|
+
nil,
|
314
|
+
Node.new(3,
|
315
|
+
nil,
|
316
|
+
nil)),
|
317
|
+
Node.new(4,
|
318
|
+
nil,
|
319
|
+
nil))
|
320
|
+
zipper = Zipper.from_tree(tree)
|
321
|
+
value = zipper.left.up.right
|
322
|
+
expected_tree =
|
323
|
+
Node.new(1,
|
324
|
+
Node.new(2,
|
325
|
+
nil,
|
326
|
+
Node.new(3,
|
327
|
+
nil,
|
328
|
+
nil)),
|
329
|
+
Node.new(4,
|
330
|
+
nil,
|
331
|
+
nil))
|
332
|
+
expected_zipper = Zipper.from_tree(expected_tree)
|
333
|
+
expected = expected_zipper.right
|
334
|
+
assert_equal expected, value
|
335
|
+
end
|
336
|
+
|
337
|
+
# Problems in exercism evolve over time, as we find better ways to ask
|
338
|
+
# questions.
|
339
|
+
# The version number refers to the version of the problem you solved,
|
340
|
+
# not your solution.
|
341
|
+
#
|
342
|
+
# Define a constant named VERSION inside of the top level BookKeeping
|
343
|
+
# module, which may be placed near the end of your file.
|
344
|
+
#
|
345
|
+
# In your file, it will look like this:
|
346
|
+
#
|
347
|
+
# module BookKeeping
|
348
|
+
# VERSION = 1 # Where the version number matches the one in the test.
|
349
|
+
# end
|
350
|
+
#
|
351
|
+
# If you are curious, read more about constants on RubyDoc:
|
352
|
+
# http://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/constants.html
|
353
|
+
|
354
|
+
def test_bookkeeping
|
355
|
+
skip
|
356
|
+
assert_equal 71, BookKeeping::VERSION
|
357
|
+
end
|
358
|
+
end
|
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.2.1.
|
4
|
+
version: 2.2.1.158
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Katrina Owen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -12932,6 +12932,11 @@ files:
|
|
12932
12932
|
- tracks/ruby/exercises/wordy/.meta/solutions/wordy.rb
|
12933
12933
|
- tracks/ruby/exercises/wordy/README.md
|
12934
12934
|
- tracks/ruby/exercises/wordy/wordy_test.rb
|
12935
|
+
- tracks/ruby/exercises/zipper/.meta/.version
|
12936
|
+
- tracks/ruby/exercises/zipper/.meta/generator/zipper_case.rb
|
12937
|
+
- tracks/ruby/exercises/zipper/.meta/solutions/zipper.rb
|
12938
|
+
- tracks/ruby/exercises/zipper/README.md
|
12939
|
+
- tracks/ruby/exercises/zipper/zipper_test.rb
|
12935
12940
|
- tracks/ruby/img/icon.png
|
12936
12941
|
- tracks/ruby/lib/bookkeeping.md
|
12937
12942
|
- tracks/ruby/lib/disable_skip.rb
|