algorithmix 0.0.0.3 → 0.0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1fa9af42a9283735ddfb27fd46138b88433af8c2
4
- data.tar.gz: ed9cafc8c1adbb181e9344f21d8ed61dc2e20e74
3
+ metadata.gz: ac9e4d6a402a8e5a2114525fc9309e68f64e44b2
4
+ data.tar.gz: 3f04fc2ca5c59e1b3287372e629bda85319cbf1f
5
5
  SHA512:
6
- metadata.gz: ba4aa0ee6ed557ee62842f17ecf1c78ed4d5b4fa0a1b4fe9191325a100774abdfedc1c30d3272714729c8b475a135867c06e6c09bee4513c2a863e5031984795
7
- data.tar.gz: f34df850923955a0d0d88d542c8e27cc54417dc24f997bd4b4a7ba33b921ed348170503c338520d75e79c1de76ec663678edf6ae736bf8f6f7fe5086fcb14f61
6
+ metadata.gz: 4b6271b398a3905cbcf52dc50800d3098362de2fd28b3ffffd882576487549d38efb7be18b85d56335567597aa89e5250937c4d063bcc5297246739586cfa30c
7
+ data.tar.gz: 28d57ee9d13a571051cc00e0858c7d97dee1a3f307f03d541d88c507973f966495611449986a35aee4d593a0da92d30cdb5f4e1293e8cb8615dfa6134ffa5d05
data/README.md CHANGED
@@ -9,6 +9,10 @@ The gem contains various implementations of known and unknown data structures an
9
9
  :construction: Because the gem is still not ready, with each new implementation of a data structure or an algorithm, a new
10
10
  minor version will be released.
11
11
 
12
+ ![Gem](https://img.shields.io/badge/min-0.0.0.4-green.svg) [**BinaryHeap**](https://github.com/monzita/algorithmix/wiki/BinaryHeap)
13
+
14
+ ![Gem](https://img.shields.io/badge/min-0.0.0.3-green.svg) [**Deque**](https://github.com/monzita/algorithmix/wiki/Deque)
15
+
12
16
  ![Gem](https://img.shields.io/badge/min-0.0.0.2-green.svg) [**Queue**](https://github.com/monzita/algorithmix/wiki/Queue) implementation & option for duplication of elements in [**Stack**](https://github.com/monzita/algorithmix/wiki/Stack)
13
17
 
14
18
  ![Gem](https://img.shields.io/badge/min-0.0.0.1-green.svg) [**Stack**](https://github.com/monzita/algorithmix/wiki/Stack) implementation is released.
@@ -8,11 +8,15 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Algorithmix::VERSION
9
9
  spec.authors = ["Monika Ilieva"]
10
10
  spec.email = ["*@*.*"]
11
+ spec.summary = %q{The gem contains various implementations of known and uknown data structures and algorithms}
12
+ spec.description = <<-DOC
13
+ Currently the gem contains:
14
+ 1. Stack
15
+ 2. Queue
16
+ 3. Deque
17
+ 4. Binary heap
11
18
 
12
- spec.summary = %q{The gem contains various implementations of known and uknown data structure and algorithms}
13
- spec.description = %q{The gem contains various implementations of known and uknown data structure and algorithms, which will be useful for developers.\n
14
- Currently the gem contains:\n
15
- 1. Stack\n2. Queue\n3. Deque\n Check the documentation for more information.}
19
+ DOC
16
20
  spec.homepage = "https://github.com/monzita/algorithmix/wiki"
17
21
  spec.license = "MIT"
18
22
 
@@ -0,0 +1,394 @@
1
+ # Documentation: https://github.com/monzita/algorithmix/wiki/Deque
2
+
3
+ module Algorithmix
4
+ module DataStructure
5
+ module Generic
6
+
7
+ class Deque
8
+
9
+ # Creates a new deque.
10
+ #
11
+ # @param obj [#to_a]
12
+ # @kwarg copy [true, false]
13
+ # @return newly created deque
14
+ # @raise ArgumentError, if given obj doesn't respond to #to_a method
15
+ def initialize(obj = nil, copy: false)
16
+ @container = []
17
+ obj.nil? ? nil : from_obj(obj, copy)
18
+ end
19
+
20
+ # Assigns content of an obj, to content of the deque.
21
+ #
22
+ # @param obj [#to_a]
23
+ # @kwarg copy [true, false] by default is set to false, which means that no copy of the object will be made
24
+ # @raise ArgumentError, if given object doesn't respond to #to_a method
25
+ # @return self object
26
+ def assign(obj, copy: false)
27
+ from_obj(obj, copy)
28
+ end
29
+
30
+ # Inserts a new element at the beginning of the deque.
31
+ #
32
+ # @param value
33
+ # @return self object
34
+ def push_front(value)
35
+ @container.unshift(value)
36
+ self
37
+ end
38
+
39
+ # (see #push_front)
40
+ def >>(value)
41
+ push_front(value)
42
+ end
43
+
44
+ # Inserts a new element at the end of the deque.
45
+ #
46
+ # @param value
47
+ # @return self object
48
+ def push_back(value)
49
+ @container << value
50
+ self
51
+ end
52
+
53
+ # (see #push_back)
54
+ def <<(value)
55
+ push_back(value)
56
+ end
57
+
58
+ # Removes first element of the deque.
59
+ #
60
+ # @raise Algorithmix::EmptyContainerError, if the deque is empty.
61
+ # @return first element of the deque
62
+ def pop_front
63
+ raise EmptyContainerError, "The deque is empty." if @container.empty?
64
+ @container.shift
65
+ end
66
+
67
+ # Removes last element of the deque.
68
+ #
69
+ # @raise Algorithmix::EmptyContainerError, if the deque is empty.
70
+ # @return last element of the deque
71
+ def pop_back
72
+ raise EmptyContainerError, "The deque is empty." if @container.empty?
73
+ @container.pop
74
+ end
75
+
76
+ # Returns first element of the deque.
77
+ def front
78
+ @container.first
79
+ end
80
+
81
+ # Returns last element of the deque.
82
+ def back
83
+ @container.last
84
+ end
85
+
86
+ # Checks if the deque is empty.
87
+ def empty?
88
+ @container.empty?
89
+ end
90
+
91
+ # Returns size of the deque.
92
+ def size
93
+ @container.size
94
+ end
95
+
96
+ # Returns the element at given index.
97
+ #
98
+ # @param idx
99
+ # @return element at given position, or nil if there is no element at that index.
100
+ def [](idx)
101
+ @container[idx]
102
+ end
103
+
104
+ # (see #[])
105
+ def at(idx)
106
+ @container[idx]
107
+ end
108
+
109
+ # Compares contents of the deque and a deque given as argument.
110
+ #
111
+ # @param deque [Deque]
112
+ # @return [true, false]
113
+ # @raise ArgumentError, if given object is not a deque
114
+ def ==(deque)
115
+ raise ArgumentError, "Undefined method Deque#== for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
116
+ @container == deque.to_a
117
+ end
118
+
119
+ # (see #==)
120
+ def eql?(deque)
121
+ raise ArgumentError, "Undefined method Deque#eql? for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
122
+ self == deque
123
+ end
124
+
125
+ # Compares contents of the deque and a deque given as argument.
126
+ #
127
+ # @param deque [Deque]
128
+ # @return [true, false]
129
+ # @raise ArgumentError, if given object is not a deque
130
+ def !=(deque)
131
+ raise ArgumentError, "Undefined method Deque#!= for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
132
+ @container != deque.to_a
133
+ end
134
+
135
+ # (see #!=)
136
+ def diff?(deque)
137
+ raise ArgumentError, "Undefined method Deque#diff? for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
138
+ self != deque
139
+ end
140
+
141
+ # Compares contents of the deque and a deque given as argument.
142
+ #
143
+ # @param deque [Deque]
144
+ # @return 1, if content of the deque is greater than content of the given deque,
145
+ # 0, if contents are equal
146
+ # -1, if content of the second deque is greater than content of self object
147
+ # @raise ArgumentError, if given object is not a deque
148
+ def <=>(deque)
149
+ raise ArgumentError, "Undefined method Deque#<=> for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
150
+ @container <=> deque.to_a
151
+ end
152
+
153
+ # Concatenates contents of the deque and a deque given as argument.
154
+ #
155
+ # @param deque [Deque]
156
+ # @return [Deque] a new deque
157
+ # @raise ArgumentError, if given object is not a deque
158
+ def +(deque)
159
+ raise ArgumentError, "Undefined method Deque#+ for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
160
+ Deque.new(@container + deque.to_a)
161
+ end
162
+
163
+ # (see #+)
164
+ def concat(deque)
165
+ raise ArgumentError, "Undefined method Deque#concat for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
166
+ self + deque
167
+ end
168
+
169
+ # (see #+)
170
+ def merge(deque)
171
+ raise ArgumentError, "Undefined method Deque#merge for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
172
+ self + deque
173
+ end
174
+
175
+ # Concatenates contents of the deque and a deque given as argument.
176
+ #
177
+ # @param deque [Deque]
178
+ # @return [Deque] self object
179
+ # @raise ArgumentError, if given object is not a deque
180
+ def concat!(deque)
181
+ raise ArgumentError, "Undefined method Deque#concat! for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
182
+ @container += deque.to_a
183
+ self
184
+ end
185
+
186
+ # Concatenates contents of the deque and a deque given as argument.
187
+ #
188
+ # @param deque [Deque]
189
+ # @return [Deque] self object
190
+ # @raise ArgumentError, if given object is not a deque
191
+ def merge!(deque)
192
+ raise ArgumentError, "Undefined method Deque#merge! for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
193
+ @container += deque.to_a
194
+ self
195
+ end
196
+
197
+ # Unites contents of the deque and a deque given as argument.
198
+ #
199
+ # @param deque [Deque]
200
+ # @return [Deque] a new deque
201
+ # @raise ArgumentError, if given object is not a deque
202
+ def |(deque)
203
+ raise ArgumentError, "Undefined method Deque#| for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
204
+ Deque.new(@container | deque.to_a)
205
+ end
206
+
207
+ # (see #|)
208
+ def union(deque)
209
+ raise ArgumentError, "Undefined method Deque#union for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
210
+ self | deque
211
+ end
212
+
213
+ # Unites contents of the deque and a deque given as argument.
214
+ #
215
+ # @param deque [Deque]
216
+ # @return [Deque] self object
217
+ # @raise ArgumentError, if given object is not a deque
218
+ def union!(deque)
219
+ raise ArgumentError, "Undefined method Deque#union! for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
220
+ @container |= deque.to_a
221
+ self
222
+ end
223
+
224
+ # Finds intersection of contents of the deque and a deque given as argument.
225
+ #
226
+ # @param deque [Deque]
227
+ # @return [Deque] a new deque
228
+ # @raise ArgumentError, if given object is not a deque
229
+ def &(deque)
230
+ raise ArgumentError, "Undefined method Deque#& for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
231
+ Deque.new(@container & deque.to_a)
232
+ end
233
+
234
+ # (see #&)
235
+ def intersect(deque)
236
+ raise ArgumentError, "Undefined method Deque#intersect for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
237
+ self & deque
238
+ end
239
+
240
+ # Finds intersection of contents of the deque and a deque given as argument.
241
+ #
242
+ # @param deque [Deque]
243
+ # @return [Deque] self object
244
+ # @raise ArgumentError, if given object is not a deque
245
+ def intersect!(deque)
246
+ raise ArgumentError, "Undefined method Deque#intersect! for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
247
+ @container &= deque.to_a
248
+ self
249
+ end
250
+
251
+ # Finds difference of contents of the deque and a deque given as argument.
252
+ #
253
+ # @param deque [Deque]
254
+ # @return [Deque] a new deque
255
+ # @raise ArgumentError, if given object is not a deque
256
+ def -(deque)
257
+ raise ArgumentError, "Undefined method Deque#- for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
258
+ Deque.new(@container - deque.to_a)
259
+ end
260
+
261
+ # (see #-)
262
+ def difference(deque)
263
+ raise ArgumentError, "Undefined method Deque#difference for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
264
+ self - deque
265
+ end
266
+
267
+ # Finds difference of contents of the deque and a deque given as argument.
268
+ #
269
+ # @param deque [Deque]
270
+ # @return [Deque] a new deque
271
+ # @raise ArgumentError, if given object is not a deque
272
+ def difference!(deque)
273
+ raise ArgumentError, "Undefined method Deque#difference! for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
274
+ @container -= deque.to_a
275
+ self
276
+ end
277
+
278
+ # Finds symmetric difference of contents of the deque and a deque given as argument.
279
+ #
280
+ # @param deque [Deque]
281
+ # @return [Deque] a new deque
282
+ # @raise ArgumentError, if given object is not a deque
283
+ def ^(deque)
284
+ raise ArgumentError, "Undefined method Deque#^ for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
285
+ Deque.new((@container | deque.to_a) - (@container & deque.to_a))
286
+ end
287
+
288
+ # (see #symmetric_difference)
289
+ def symmetric_difference(deque)
290
+ raise ArgumentError, "Undefined method Deque#symmetric_difference for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
291
+ self ^ deque
292
+ end
293
+
294
+ # Finds symmetric difference of contents of the deque and a deque given as argument.
295
+ #
296
+ # @param deque [Deque]
297
+ # @return [Deque] self object
298
+ # @raise ArgumentError, if given object is not a deque
299
+ def symmetric_difference!(deque)
300
+ raise ArgumentError, "Undefined method Deque#symmetric_difference! for #{deque}:#{deque.class}" unless deque.is_a?(Deque)
301
+ @container = (@container | deque.to_a) - (@container & deque.to_a)
302
+ self
303
+ end
304
+
305
+ # Converts content of the deque to an array witl elements.
306
+ def to_a
307
+ @container
308
+ end
309
+
310
+ # Clears content of the deque.
311
+ #
312
+ # @return self object
313
+ def clear
314
+ @container = []
315
+ self
316
+ end
317
+
318
+ # Filters elements of the deque by given condition.
319
+ #
320
+ # @param &block
321
+ # @return [Deque] a new deque
322
+ def select(&block)
323
+ Deque.new( @container.select { |e| block.call(e)})
324
+ end
325
+
326
+ # Filters elements of the deque by given condition.
327
+ #
328
+ # @param &block
329
+ # @return [Deque] self object
330
+ def select!(&block)
331
+ @container.select! { |e| block.call(e)}
332
+ self
333
+ end
334
+
335
+ # (see #select)
336
+ def filter(&block)
337
+ select(&block)
338
+ end
339
+
340
+ # (see #select!)
341
+ def filter!(&block)
342
+ select!(&block)
343
+ end
344
+
345
+ # (see #select)
346
+ def find_all(&block)
347
+ select(&block)
348
+ end
349
+
350
+ # (see #select!)
351
+ def find_all!(&block)
352
+ select!(&block)
353
+ end
354
+
355
+ # Applies a function to each element of the deque.
356
+ #
357
+ # @param &block
358
+ # @return [Deque] a new deque
359
+ def map(&block)
360
+ Deque.new(@container.map { |e| block.call(e)})
361
+ end
362
+
363
+ # Applies a function to each element of the deque.
364
+ #
365
+ # @param &block
366
+ # @return [Deque] self object
367
+ def map!(&block)
368
+ @container.map! { |e| block.call(e)}
369
+ self
370
+ end
371
+
372
+ # (see #map)
373
+ def apply(&block)
374
+ map(&block)
375
+ end
376
+
377
+ # (see #map!)
378
+ def apply!(&block)
379
+ map!(&block)
380
+ end
381
+
382
+ private
383
+
384
+ def from_obj(obj, copy)
385
+ raise ArgumentError, "Object doesn't respond to #to_a method" unless obj.respond_to?(:to_a)
386
+
387
+ @container = copy ? obj.send(:to_a).dup : obj.send(:to_a)
388
+ self
389
+ end
390
+
391
+ end
392
+ end
393
+ end
394
+ end
@@ -1,3 +1,3 @@
1
1
  module Algorithmix
2
- VERSION = "0.0.0.3"
2
+ VERSION = "0.0.0.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: algorithmix
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0.3
4
+ version: 0.0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Monika Ilieva
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-10-12 00:00:00.000000000 Z
11
+ date: 2018-10-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,10 +66,13 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: 2.0.0
69
- description: |-
70
- The gem contains various implementations of known and uknown data structure and algorithms, which will be useful for developers.\n
71
- Currently the gem contains:\n
72
- 1. Stack\n2. Queue\n3. Deque\n Check the documentation for more information.
69
+ description: |2+
70
+ Currently the gem contains:
71
+ 1. Stack
72
+ 2. Queue
73
+ 3. Deque
74
+ 4. Binary heap
75
+
73
76
  email:
74
77
  - "*@*.*"
75
78
  executables: []
@@ -88,6 +91,7 @@ files:
88
91
  - bin/console
89
92
  - bin/setup
90
93
  - lib/algorithmix.rb
94
+ - lib/algorithmix/data_structure/generic/deque.rb
91
95
  - lib/algorithmix/data_structure/generic/queue.rb
92
96
  - lib/algorithmix/data_structure/generic/stack.rb
93
97
  - lib/algorithmix/error.rb
@@ -116,6 +120,6 @@ rubyforge_project:
116
120
  rubygems_version: 2.6.14.1
117
121
  signing_key:
118
122
  specification_version: 4
119
- summary: The gem contains various implementations of known and uknown data structure
123
+ summary: The gem contains various implementations of known and uknown data structures
120
124
  and algorithms
121
125
  test_files: []