slice_pizzabot 0.0.5

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a188055999f65c12b262e415015da56fdd5c9f5fbd3947cbe003b01ae592b556
4
+ data.tar.gz: fbe17fe148140f90b361d4e39cc6b40249385a98bc9837dfa2fc0c56df4ef1c3
5
+ SHA512:
6
+ metadata.gz: e287fbb3b62cb685b6f101e43ae2cad750a15f9be8a17313f4667ccdb590a95d62e27be4de225c83bac820ccea70d46b3d7c1f89192cd15a32d17f565d2ad542
7
+ data.tar.gz: ad95f20df27ef743836e7317532a14cac3171aa8f8ff9bb327dbf7e3556aa508bb0fdd7e6f066bb0588d99955dd193bf7ce551f06eacfd61254f60b4809cb160
@@ -0,0 +1,3 @@
1
+ require 'pizzabot'
2
+
3
+ Pizzabot.new(ARGV[0]).deliver
@@ -0,0 +1,69 @@
1
+ require_relative 'pizzabot/route_service.rb'
2
+
3
+ class Pizzabot
4
+
5
+ NO_ARGUMENT_MESSAGE = 'You should provide delivery string to pizzabot, example: "pizzabot 2x2 (0,1) (0,2)"'
6
+
7
+ attr_reader :route
8
+ attr_accessor :current_position, :delivery_process
9
+
10
+ def initialize(delivery_string)
11
+ raise ArgumentError, NO_ARGUMENT_MESSAGE unless delivery_string
12
+ @current_position = [0, 0]
13
+ @delivery_process = ''
14
+ @route = RouteService.new(delivery_string).prepare_route
15
+ end
16
+
17
+ def deliver
18
+ route.each do |address|
19
+ move_to(address)
20
+ drop_pizza
21
+ end
22
+
23
+ puts delivery_process
24
+ delivery_process
25
+ end
26
+
27
+ private
28
+
29
+ def move_to(address)
30
+ until current_position[0] == address[0] do
31
+ if current_position[0] < address[0]
32
+ move_east
33
+ else
34
+ move_west
35
+ end
36
+ end
37
+ until current_position[1] == address[1] do
38
+ if current_position[1] < address[1]
39
+ move_north
40
+ else
41
+ move_south
42
+ end
43
+ end
44
+ end
45
+
46
+ def drop_pizza
47
+ delivery_process << "D"
48
+ end
49
+
50
+ def move_north
51
+ current_position[1] += 1
52
+ delivery_process << "N"
53
+ end
54
+
55
+ def move_south
56
+ current_position[1] -= 1
57
+ delivery_process << "S"
58
+ end
59
+
60
+ def move_west
61
+ current_position[0] -= 1
62
+ delivery_process << "W"
63
+ end
64
+
65
+ def move_east
66
+ current_position[0] += 1
67
+ delivery_process << "E"
68
+ end
69
+ end
@@ -0,0 +1,5 @@
1
+ class AddressError < StandardError
2
+ def initialize(msg)
3
+ super
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class GridError < StandardError
2
+ def initialize(msg='Grid in wrong format')
3
+ super
4
+ end
5
+ end
@@ -0,0 +1,41 @@
1
+ require_relative 'grid_error.rb'
2
+ require_relative 'address_error.rb'
3
+
4
+ class RouteService
5
+
6
+ GRID_REGEX = /^\d+x\d+/
7
+ ADDRESSES_REGEX = /\((.*?)\)/
8
+ DIGITS_EXTRACT_REGEX = /\d+/
9
+
10
+ attr_reader :grid
11
+ attr_accessor :addresses
12
+
13
+ def initialize(delivery_string)
14
+ @grid = delivery_string[GRID_REGEX]
15
+ @addresses = delivery_string.scan(ADDRESSES_REGEX).flatten
16
+ end
17
+
18
+ def prepare_route
19
+ validate_route
20
+ calculate_route
21
+ end
22
+
23
+ private
24
+
25
+ def validate_route
26
+ raise GridError unless grid
27
+ grid_values = grid.split('x').map(&:to_i)
28
+
29
+ addresses.map! do |address|
30
+ extracted_array = address.scan(DIGITS_EXTRACT_REGEX).map(&:to_i)
31
+ raise AddressError.new("Address in wrong format: #{address}") unless extracted_array.length == 2
32
+ raise AddressError.new("Address is not in delivery range") if extracted_array[0] > grid_values[0] ||
33
+ extracted_array[1] > grid_values[1]
34
+ extracted_array
35
+ end
36
+ end
37
+
38
+ def calculate_route
39
+ addresses.sort.uniq
40
+ end
41
+ end
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: slice_pizzabot
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.5
5
+ platform: ruby
6
+ authors:
7
+ - Aliaksei Khalupau
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-01-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: Bot for pizza delivery
28
+ email: alexey.kholupov@gmail.com
29
+ executables:
30
+ - pizzabot
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - bin/pizzabot
35
+ - lib/pizzabot.rb
36
+ - lib/pizzabot/address_error.rb
37
+ - lib/pizzabot/grid_error.rb
38
+ - lib/pizzabot/route_service.rb
39
+ homepage: https://rubygems.org/gems/slice_pizzabot
40
+ licenses:
41
+ - MIT
42
+ metadata: {}
43
+ post_install_message:
44
+ rdoc_options: []
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ requirements: []
58
+ rubygems_version: 3.1.2
59
+ signing_key:
60
+ specification_version: 4
61
+ summary: Pizza Delivery Bot
62
+ test_files: []