jg_toy_robot 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 +7 -0
- data/lib/toy_robot/orientation.rb +77 -0
- data/lib/toy_robot.rb +13 -0
- metadata +45 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1c7167a1fac92ac29bb48c7367ebce28e40ce034
|
4
|
+
data.tar.gz: bf45a10103625bc963d48ad4f36c62bdb5b5cd94
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c894feca2cefe54e17f300cc38d752bdd08a3f9f6f6ef3d9f2319893426c7fd2c7c78d1d299743f169c177afc9cb041866061c3a87590485bf7a9b6b99aacdcb
|
7
|
+
data.tar.gz: 9005d48b19e4e192b055009f2bccfd9fed614411d710067a9c01affae3cd70805d2d23b13917d2964a0e63d032edd18ea44417449b688c2d5be1c272fb6fba95
|
@@ -0,0 +1,77 @@
|
|
1
|
+
class ToyRobot
|
2
|
+
# A class to represent the orientation of a toy robot
|
3
|
+
class Orientation
|
4
|
+
|
5
|
+
# change in x value following a move in this orientation
|
6
|
+
attr_reader :dx
|
7
|
+
|
8
|
+
# change in y value following a move in this orientation
|
9
|
+
attr_reader :dy
|
10
|
+
|
11
|
+
VECTORS = {
|
12
|
+
NORTH: [0,1],
|
13
|
+
SOUTH: [0,-1],
|
14
|
+
EAST: [1,0],
|
15
|
+
WEST: [-1,0]
|
16
|
+
}
|
17
|
+
|
18
|
+
# Create a new Orientation. Must supply the name of the orientation (NORTH, SOUTH, EAST, or WEST) or a 2 element array
|
19
|
+
# containing dx and dy values, that can be 1, 0 or -1.
|
20
|
+
def initialize(key)
|
21
|
+
if key.is_a? String
|
22
|
+
vector = VECTORS[key.upcase.strip.to_sym]
|
23
|
+
raise ArgumentError, "supplied argument of #{key} is not a valid Orientation name - valid Orientation names are #{VECTORS.keys.join(', ')}" unless vector
|
24
|
+
@dx, @dy = vector
|
25
|
+
elsif key.is_a? Array
|
26
|
+
raise ArgumentError, "supplied orientation array has length of #{key.length} - an orientation array must have a length of two" unless key.size == 2
|
27
|
+
raise ArgumentError, "supplied orientation array has a dx value of #{key[0]} - valid values are 1, 0 or -1" unless [1,0,-1].include?(key[0])
|
28
|
+
raise ArgumentError, "supplied orientation array has a dy value of #{key[1]} - valid values are 1, 0 or -1" unless [1,0,-1].include?(key[1])
|
29
|
+
raise ArgumentError, "supplied orientation array has both dx and dy values of 0 - one of the values must be non-zero" if key[0] == 0 && key[1] == 0
|
30
|
+
raise ArgumentError, "supplied orientation array has both dx and dy values as non-zero - one of the values must be zero" if key[0] != 0 && key[1] != 0
|
31
|
+
@dx, @dy = key
|
32
|
+
else
|
33
|
+
raise ArgumentError, "supplied argument is of type #{key.class.name}. An orientation name or array is required"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
# return a new Orientation that is 90 degrees to the left of self
|
39
|
+
def left
|
40
|
+
turn(-1)
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
# return a new Orientation that is 90 degrees to the right of self
|
45
|
+
def right
|
46
|
+
turn(1)
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
# return the name of the Orientation (NORTH, SOUTH, EAST, or WEST)
|
51
|
+
def to_s
|
52
|
+
inverted[ [@dx, @dy] ].to_s
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
# unified turn function, because maths
|
59
|
+
def turn(direction)
|
60
|
+
dx = @dx == 0 ? direction * @dy : 0
|
61
|
+
dy = @dy == 0 ? direction * -1 * @dx : 0
|
62
|
+
ToyRobot::Orientation.new( [ dx, dy] )
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
# caching method to return a vector that allows lookup of an Orientation name from it's dx and dy values
|
67
|
+
def inverted
|
68
|
+
@inverted ||= VECTORS.invert
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
end # class Orientation
|
75
|
+
end # class ToyRobot
|
76
|
+
|
77
|
+
curl -u jg_syd https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials
|
data/lib/toy_robot.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
dir = File.dirname(__FILE__)
|
2
|
+
puts "dir is #{dir}"
|
3
|
+
$LOAD_PATH.unshift dir unless $LOAD_PATH.include?(dir)
|
4
|
+
|
5
|
+
require 'toy_robot/orientation'
|
6
|
+
|
7
|
+
|
8
|
+
# Class that simulates a Toy Robot
|
9
|
+
# Also functions as a module and namespace for related classes
|
10
|
+
class ToyRobot
|
11
|
+
|
12
|
+
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jg_toy_robot
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- John Gray
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-03-08 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: A simple toy robot simulator gem
|
14
|
+
email: foo@bar.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/toy_robot.rb
|
20
|
+
- lib/toy_robot/orientation.rb
|
21
|
+
homepage: http://rubygems.org/gems/jg_toy_robot
|
22
|
+
licenses:
|
23
|
+
- GPL-3.0
|
24
|
+
metadata: {}
|
25
|
+
post_install_message:
|
26
|
+
rdoc_options: []
|
27
|
+
require_paths:
|
28
|
+
- lib
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
requirements: []
|
40
|
+
rubyforge_project:
|
41
|
+
rubygems_version: 2.5.1
|
42
|
+
signing_key:
|
43
|
+
specification_version: 4
|
44
|
+
summary: A toy robot
|
45
|
+
test_files: []
|