adt_utilit 0.0.0 → 0.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b6af6922d287bcf52954bdaf9ba808109883652e
4
- data.tar.gz: 3ced982a4a11dc086b532390cb855dd32abde1d6
3
+ metadata.gz: 5e8ee1f39f314d0f7ca04f595bd4b474d361aa2f
4
+ data.tar.gz: 9e26d7ba45ad54ddb0bff7b5f4860e146957a415
5
5
  SHA512:
6
- metadata.gz: 4c8380a9e31dbf75bdf91f8444e36c650bcfa9fd1f55c7a17047ed9d0197d986399b2174140462341a05cfe3a99da5fd92c8477d5f3ede8845910b622173d70a
7
- data.tar.gz: 36d70d84e451c2e4f022523d1c6371f92a3b6cbb08289ef56ee3f625c77b2790acf1ffc9d9fafe46b6b054f6edca87a9fcf5a0889f786d1b6e92cbbd786f8f46
6
+ metadata.gz: e13664fee3e3cfcf5b2587d966accf1f2c7ab520d921109a161fae1f57098a2c57b1389c6a35994866713f10955890497afab20353b547f15030dcadc7a47a3f
7
+ data.tar.gz: cf2dfcd78512d7de2110ab393c3acb621a5d97b97deb12baa38d27c57af897c8e26bf3da5e9a8ad1f8290369855ef25ca8e86ea635e9641784ef74d39f798880
@@ -1,14 +1,13 @@
1
1
  require_relative 'linked_list_node.rb'
2
- require "byebug"
3
2
  class LinkedList
4
3
  include Enumerable
5
4
  attr_reader :length, :head, :tail
6
5
 
7
- def initialize(value)
8
- if value.is_a?(Array)
6
+ def initialize(value = nil)
7
+ if value.nil?
8
+ nodes = []
9
+ elsif value.is_a?(Array)
9
10
  nodes = initialize_with_array(value)
10
- elsif value.is_a?(Hash)
11
- nodes = initialize_with_hash(value)
12
11
  else
13
12
  nodes = [LinkedListNode.new(value)]
14
13
  end
@@ -52,8 +51,14 @@ class LinkedList
52
51
  else
53
52
  node = LinkedListNode.new(value)
54
53
  end
55
- @tail.connect(node)
56
- @tail = node
54
+
55
+ if @length == 0
56
+ @head = @tail = node
57
+ else
58
+ @tail.connect(node)
59
+ @tail = node
60
+ end
61
+
57
62
  @length +=1
58
63
  self
59
64
  end
@@ -64,8 +69,14 @@ class LinkedList
64
69
  else
65
70
  node = LinkedListNode.new(value)
66
71
  end
67
- node.connect(@head)
68
- @head = node
72
+
73
+ if @length == 0
74
+ @head = @tail = node
75
+ else
76
+ node.connect(@head)
77
+ @head = node
78
+ end
79
+
69
80
  @length +=1
70
81
  self
71
82
  end
@@ -84,7 +95,7 @@ class LinkedList
84
95
  shifted_node
85
96
  end
86
97
 
87
- def find(value)
98
+ def find_node(value)
88
99
  self.each do |node|
89
100
  return node if node.value == value
90
101
  end
@@ -148,14 +159,4 @@ class LinkedList
148
159
  nodes
149
160
  end
150
161
 
151
- def initialize_with_hash(hash)
152
- nodes = []
153
- hash.map do |key, value|
154
- node = LinkedListNode.new({key => value})
155
- nodes[-1].connect(node) unless nodes[-1].nil?
156
- nodes << node
157
- end
158
- nodes
159
- end
160
-
161
162
  end
@@ -0,0 +1,37 @@
1
+ class Queue
2
+ include Enumerable
3
+ def initialize(value = nil)
4
+ if value.nil?
5
+ @queue = []
6
+ elsif value.is_a?(Array)
7
+ @queue = value
8
+ else
9
+ @queue = [value]
10
+ end
11
+ end
12
+
13
+ def each(&prc)
14
+ @queue.each(&prc)
15
+ end
16
+
17
+ def length
18
+ @queue.length
19
+ end
20
+
21
+ def enqueue(value)
22
+ @queue.push(value)
23
+ end
24
+
25
+ def dequeue
26
+ @queue.shift
27
+ end
28
+
29
+ def peek
30
+ @queue.first
31
+ end
32
+
33
+ def last
34
+ @queue.last
35
+ end
36
+
37
+ end
@@ -0,0 +1,105 @@
1
+ class Stack
2
+ include Enumerable
3
+ def initialize(value = nil)
4
+ @stack = []
5
+ if value.nil?
6
+ return
7
+ elsif value.is_a?(Array)
8
+ value.each do |el|
9
+ push(el)
10
+ end
11
+ else
12
+ push(value)
13
+ end
14
+ end
15
+
16
+ def self.new_with_metadata(metadata_name, &prc)
17
+ stack = self.new
18
+ stack.instance_variable_set(:@metadata, {max: "#{metadata_name}_max", min: "#{metadata_name}_min", proc: prc})
19
+
20
+ define_method("#{metadata_name}_max"){
21
+ raise "such metadata has not been set for this instance" if @metadata.nil?
22
+ return nil if @stack.empty?
23
+ @stack.last[@metadata[:max]]
24
+ }
25
+ define_method("#{metadata_name}_min"){
26
+ raise "such metadata has not been set for this instance" if @metadata.nil?
27
+ return nil if @stack.empty?
28
+ @stack.last[@metadata[:min]]
29
+ }
30
+ stack
31
+ end
32
+
33
+ def peek
34
+ return nil if @stack.empty?
35
+ @stack.last[:value]
36
+ end
37
+
38
+ def min
39
+ return nil if @stack.empty?
40
+ @stack.last[:min]
41
+ end
42
+
43
+ def max
44
+ return nil if @stack.empty?
45
+ @stack.last[:max]
46
+ end
47
+
48
+ def length
49
+ @stack.length
50
+ end
51
+
52
+ def empty?
53
+ @stack.length == 0
54
+ end
55
+
56
+ def push(value)
57
+ stack_el = {value: value}
58
+ if @stack.empty?
59
+ stack_el[:max] = stack_el[:min] = stack_el[:value]
60
+ unless @metadata.nil?
61
+ stack_el[@metadata[:max]] = stack_el[@metadata[:min]] = stack_el[:value]
62
+ end
63
+ else
64
+ stack_el[:max] = stack_el[:value] >= max ? stack_el[:value] : max
65
+ stack_el[:min] = stack_el[:value] <= min ? stack_el[:value] : min
66
+ if @metadata
67
+ proc = @metadata[:proc]
68
+
69
+ if proc.call(stack_el[:value]) >= proc.call(self.send("#{@metadata[:max]}"))
70
+ stack_el[@metadata[:max]] = stack_el[:value]
71
+ else
72
+ stack_el[@metadata[:max]] = self.send("#{@metadata[:max]}")
73
+ end
74
+
75
+ if proc.call(stack_el[:value]) <= proc.call(self.send("#{@metadata[:min]}"))
76
+ stack_el[@metadata[:min]] = stack_el[:value]
77
+ else
78
+ stack_el[@metadata[:min]] = self.send("#{@metadata[:min]}")
79
+ end
80
+ end
81
+ end
82
+ @stack << stack_el
83
+ self
84
+ end
85
+
86
+ def pop
87
+ return nil if @stack.empty?
88
+ top_el = @stack.pop
89
+ top_el[:value]
90
+ end
91
+
92
+ def each(&prc)
93
+ @stack.each do |el|
94
+ prc.call(el[:value])
95
+ end
96
+ end
97
+
98
+ def each_from_top(&prc)
99
+ (@stack.length - 1).downto(0) do |i|
100
+ prc.call(@stack[i][:value])
101
+ end
102
+ self
103
+ end
104
+
105
+ end
@@ -0,0 +1,121 @@
1
+ require_relative "queue"
2
+ require_relative "stack"
3
+ class StackQueue
4
+ include Enumerable
5
+ def initialize(value = nil)
6
+ @stack_a = Stack.new
7
+ @stack_b = Stack.new
8
+ if !value.nil?
9
+ if value.is_a?(Array)
10
+ value.each { |el| @stack_a.push(el) }
11
+ else
12
+ @stack_a.push(value)
13
+ end
14
+ end
15
+ end
16
+
17
+ def peek
18
+ slinky if @stack_b.empty?
19
+ @stack_b.peek
20
+ end
21
+
22
+ def last
23
+ if @stack_a.empty?
24
+ @stack_b_bottom
25
+ else
26
+ @stack_a.peek
27
+ end
28
+ end
29
+
30
+ def enqueue(value)
31
+ @stack_a.push(value)
32
+ end
33
+
34
+ def dequeue
35
+ return nil if self.empty?
36
+ slinky if @stack_b.empty?
37
+ @stack_b.pop
38
+ end
39
+
40
+ def min
41
+ return nil if self.empty?
42
+ return @stack_a.min if @stack_b.min.nil?
43
+ return @stack_b.min if @stack_a.min.nil?
44
+ [@stack_a.min, @stack_b.min].min
45
+ end
46
+
47
+ def max
48
+ return nil if self.empty?
49
+ return @stack_a.max if @stack_b.max.nil?
50
+ return @stack_b.max if @stack_a.max.nil?
51
+ [@stack_a.max, @stack_b.max].max
52
+ end
53
+
54
+ def length
55
+ @stack_a.length + @stack_b.length
56
+ end
57
+
58
+ def empty?
59
+ @stack_a.empty? && @stack_b.empty?
60
+ end
61
+
62
+ def self.new_with_metadata(metadata_name, &prc)
63
+ stack_queue = self.new
64
+ stack_queue.instance_variable_set(:@metadata, {
65
+ max: "#{metadata_name}_max",
66
+ min: "#{metadata_name}_min",
67
+ proc: prc
68
+ })
69
+ stack_queue.instance_variable_set(:@stack_a, Stack.new_with_metadata(metadata_name, &prc))
70
+ stack_queue.instance_variable_set(:@stack_b, Stack.new_with_metadata(metadata_name, &prc))
71
+
72
+ define_method("#{metadata_name}_max") {
73
+ raise "such metadata has not been set for this instance" if @metadata.nil?
74
+ return nil if self.empty?
75
+ prc = @metadata[:proc]
76
+ stack_a_max = @stack_a.send(@metadata[:max])
77
+ stack_b_max = @stack_b.send(@metadata[:max])
78
+
79
+ return stack_b_max if stack_a_max.nil?
80
+ return stack_a_max if stack_b_max.nil?
81
+ if prc.call(stack_a_max) < prc.call(stack_b_max)
82
+ return stack_b_max
83
+ else
84
+ return stack_a_max
85
+ end
86
+ }
87
+
88
+ define_method("#{metadata_name}_min"){
89
+ raise "such metadata has not been set for this instance" if @metadata.nil?
90
+ return nil if self.empty?
91
+ prc = @metadata[:proc]
92
+ stack_a_min = @stack_a.send(@metadata[:min])
93
+ stack_b_min = @stack_b.send(@metadata[:min])
94
+
95
+ return stack_b_min if stack_a_min.nil?
96
+ return stack_a_min if stack_b_min.nil?
97
+ if prc.call(stack_a_min) < prc.call(stack_b_min)
98
+ return stack_b_min
99
+ else
100
+ return stack_a_min
101
+ end
102
+ }
103
+
104
+ return stack_queue
105
+ end
106
+
107
+ def each(&prc)
108
+ @stack_b.each_from_top(&prc)
109
+ @stack_a.each(&prc)
110
+ self
111
+ end
112
+
113
+ private
114
+ def slinky
115
+ if @stack_b.empty?
116
+ @stack_b_bottom = @stack_a.peek
117
+ @stack_b.push(@stack_a.pop) until @stack_a.empty?
118
+ end
119
+ end
120
+
121
+ end
data/lib/adt_utilit.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'adt_utilit/linked_list'
2
+ require 'adt_utilit/stack_queue'
2
3
 
3
4
  class AdtUtilit
4
5
 
metadata CHANGED
@@ -1,16 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adt_utilit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hirosvk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-19 00:00:00.000000000 Z
11
+ date: 2016-07-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: still in development
13
+ description: "<in development> AdtUtilit is a Ruby gem that provides a set of useful
14
+ data type classes such as Linked List, Queue, Stack, StackQueue, and Polytree. Many
15
+ intuitive methods are available for each class. See documentations for the details."
14
16
  email: kajino.hiroyuki@gmail.com
15
17
  executables: []
16
18
  extensions: []
@@ -19,6 +21,9 @@ files:
19
21
  - lib/adt_utilit.rb
20
22
  - lib/adt_utilit/linked_list.rb
21
23
  - lib/adt_utilit/linked_list_node.rb
24
+ - lib/adt_utilit/queue.rb
25
+ - lib/adt_utilit/stack.rb
26
+ - lib/adt_utilit/stack_queue.rb
22
27
  homepage: http://rubygems.org/gems/adt_utilit
23
28
  licenses:
24
29
  - MIT