trackler 2.2.1.157 → 2.2.1.158
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/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
|