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.
- checksums.yaml +7 -0
- data/bin/pizzabot +3 -0
- data/lib/pizzabot.rb +69 -0
- data/lib/pizzabot/address_error.rb +5 -0
- data/lib/pizzabot/grid_error.rb +5 -0
- data/lib/pizzabot/route_service.rb +41 -0
- metadata +62 -0
checksums.yaml
ADDED
@@ -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
|
data/bin/pizzabot
ADDED
data/lib/pizzabot.rb
ADDED
@@ -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,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: []
|