gobgems 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/extensions/array.rb +5 -0
- data/lib/gobgems/board.rb +105 -0
- data/lib/gobgems/color.rb +25 -0
- data/lib/gobgems/direction.rb +25 -0
- data/lib/gobgems/execution_context.rb +11 -0
- data/lib/gobgems/gbb_parser.rb +52 -0
- data/lib/gobgems/program.rb +32 -0
- data/lib/gobgems/version.rb +3 -0
- data/lib/gobgems.rb +10 -0
- metadata +111 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: bb29086c782595aa8c66939dfcbfdc7f80bb2402
|
4
|
+
data.tar.gz: 18f24cb731be7c545d68176fbcc6a7aae99d47b7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1625669f34c466ae8c9cd721c3327f3da77d3a0e99537a2ff371ef1e5437dab1b02c8b59ea46dc1fe2d485eac27ac7cf442f9d414135bb90662355470b9af59a
|
7
|
+
data.tar.gz: 1d51527eca9d0819f69c7a8597d881eacb6b3291c0b29e2d60cd7f77388346aafe2dcf398891edc0052c5b368bdcc1fb41090534af76a06b1e7afe9cd7627be7
|
@@ -0,0 +1,105 @@
|
|
1
|
+
module Gobgems
|
2
|
+
class OutOfBoardError < RuntimeError
|
3
|
+
end
|
4
|
+
|
5
|
+
module WithMovementOps
|
6
|
+
def can_move?(direction)
|
7
|
+
within_bounds? next_position(direction)
|
8
|
+
end
|
9
|
+
|
10
|
+
def move(direction)
|
11
|
+
__move_to__ next_position(direction)
|
12
|
+
end
|
13
|
+
|
14
|
+
def __move_to__(position)
|
15
|
+
raise OutOfBoardError unless within_bounds? position
|
16
|
+
@head_position = position
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def next_position(direction)
|
22
|
+
direction.call(*@head_position)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
module WithColorOps
|
28
|
+
def push(color, amount=1)
|
29
|
+
head_cell[color] += amount
|
30
|
+
end
|
31
|
+
|
32
|
+
def pop(color)
|
33
|
+
raise "#{color} Underflow" if head_cell[color] == 0
|
34
|
+
head_cell[color] -= 1
|
35
|
+
end
|
36
|
+
|
37
|
+
def count(color)
|
38
|
+
head_cell[color]
|
39
|
+
end
|
40
|
+
|
41
|
+
def exist?(color)
|
42
|
+
count(color) > 0
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class Board
|
47
|
+
include WithMovementOps
|
48
|
+
include WithColorOps
|
49
|
+
|
50
|
+
attr_reader :cells, :head_position
|
51
|
+
|
52
|
+
def initialize(cells, position)
|
53
|
+
@cells = cells
|
54
|
+
@head_position = position
|
55
|
+
end
|
56
|
+
|
57
|
+
def size
|
58
|
+
[cells.size, cells[0].size]
|
59
|
+
end
|
60
|
+
|
61
|
+
def ==(other)
|
62
|
+
self.class == other.class &&
|
63
|
+
self.cells == other.cells &&
|
64
|
+
self.head_position == other.head_position
|
65
|
+
end
|
66
|
+
|
67
|
+
def hash
|
68
|
+
self.cells.hash ^ self.head_position.hash
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.empty(x, y, position=[0, 0])
|
72
|
+
self.new((1..x).map { (1..y).map { empty_cell } }, position)
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.from(cells, position=[0, 0])
|
76
|
+
self.new(cells.map { |row| row.map { |cell| empty_cell.merge(cell) } }, position)
|
77
|
+
end
|
78
|
+
|
79
|
+
def __set_cell__(position, cell)
|
80
|
+
__cell_at__(position).merge! cell
|
81
|
+
end
|
82
|
+
|
83
|
+
def __cell_at__(position)
|
84
|
+
raise OutOfBoardError unless within_bounds? position
|
85
|
+
cells[position[0]][position[1]]
|
86
|
+
end
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
def within_bounds?(position)
|
91
|
+
(x, y) = size
|
92
|
+
position[0] >= 0 && position[1] >= 0 &&
|
93
|
+
position[0] <= x && position[1] <= y
|
94
|
+
end
|
95
|
+
|
96
|
+
def head_cell
|
97
|
+
__cell_at__(head_position)
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.empty_cell
|
101
|
+
{red: 0, black: 0, green: 0, blue: 0}
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Gobgems
|
2
|
+
module Color
|
3
|
+
def red
|
4
|
+
:red
|
5
|
+
end
|
6
|
+
|
7
|
+
def blue
|
8
|
+
:blue
|
9
|
+
end
|
10
|
+
|
11
|
+
def green
|
12
|
+
:green
|
13
|
+
end
|
14
|
+
|
15
|
+
def black
|
16
|
+
:black
|
17
|
+
end
|
18
|
+
|
19
|
+
def all
|
20
|
+
[red, green, black, blue]
|
21
|
+
end
|
22
|
+
|
23
|
+
module_function :red, :blue, :green, :black, :all
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Gobgems
|
2
|
+
module Direction
|
3
|
+
def east
|
4
|
+
@east ||= -> (x, y) { [x, y+1] }
|
5
|
+
end
|
6
|
+
|
7
|
+
def west
|
8
|
+
@west ||= -> (x, y) { [x, y-1] }
|
9
|
+
end
|
10
|
+
|
11
|
+
def north
|
12
|
+
@north ||= -> (x, y) { [x-1, y] }
|
13
|
+
end
|
14
|
+
|
15
|
+
def south
|
16
|
+
@south ||= -> (x, y) { [x+1, y] }
|
17
|
+
end
|
18
|
+
|
19
|
+
def all
|
20
|
+
[east, west, south, north]
|
21
|
+
end
|
22
|
+
|
23
|
+
module_function :north, :south, :east, :west, :all
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require_relative '../extensions/array.rb'
|
2
|
+
|
3
|
+
|
4
|
+
class MatchData
|
5
|
+
def to_position
|
6
|
+
[self[1].to_i, self[2].to_i]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module Gobgems
|
11
|
+
class GbbParser
|
12
|
+
COLORS = {'Azul' => :blue, 'Negro' => :black, 'Rojo' => :red, 'Verde' => :green}
|
13
|
+
|
14
|
+
def from_string(gbb_string)
|
15
|
+
board = nil
|
16
|
+
|
17
|
+
lines = gbb_string.lines.reject { |it| it.start_with? 'GBB', '%%' }
|
18
|
+
|
19
|
+
/size (\d+) (\d+)/.match(lines[0]) { |match| board = Board.empty(match[1].to_i, match[2].to_i) }
|
20
|
+
/head (\d+) (\d+)/.match(lines.last) { |match| board.__move_to__ match.to_position }
|
21
|
+
|
22
|
+
lines.drop(1).init.each do |cell_line|
|
23
|
+
position = get_position_from cell_line
|
24
|
+
cell = create_cell_from cell_line
|
25
|
+
|
26
|
+
board.__set_cell__ position, cell
|
27
|
+
end
|
28
|
+
|
29
|
+
board
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def get_position_from(cell_line)
|
35
|
+
/cell (\d+) (\d+)/.match(cell_line).to_position
|
36
|
+
end
|
37
|
+
|
38
|
+
def create_cell_from(cell_line)
|
39
|
+
cell = {}
|
40
|
+
|
41
|
+
cell_line.scan(/(Azul|Negro|Rojo|Verde) (\d+)/) do |match|
|
42
|
+
cell[to_color(match[0])] = match[1].to_i
|
43
|
+
end
|
44
|
+
|
45
|
+
cell
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_color(gbb_color_string)
|
49
|
+
COLORS[gbb_color_string]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Gobgems
|
2
|
+
module Program
|
3
|
+
attr_accessor :board
|
4
|
+
|
5
|
+
include Gobgems::Color
|
6
|
+
include Gobgems::Direction
|
7
|
+
|
8
|
+
def move(direction)
|
9
|
+
board.move(direction)
|
10
|
+
end
|
11
|
+
|
12
|
+
def push(color)
|
13
|
+
board.push(color)
|
14
|
+
end
|
15
|
+
|
16
|
+
def pop(color)
|
17
|
+
board.pop(color)
|
18
|
+
end
|
19
|
+
|
20
|
+
def exist?(color)
|
21
|
+
board.exists?(color)
|
22
|
+
end
|
23
|
+
|
24
|
+
def can_move?(direction)
|
25
|
+
board.can_move?(direction)
|
26
|
+
end
|
27
|
+
|
28
|
+
def count(color)
|
29
|
+
board.count(color)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/gobgems.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
module Gobgems
|
2
|
+
end
|
3
|
+
|
4
|
+
require_relative 'gobgems/direction'
|
5
|
+
require_relative 'gobgems/color'
|
6
|
+
require_relative 'gobgems/board'
|
7
|
+
require_relative 'gobgems/execution_context'
|
8
|
+
require_relative 'gobgems/program'
|
9
|
+
require_relative 'gobgems/gbb_parser'
|
10
|
+
require_relative 'gobgems/version'
|
metadata
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gobgems
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Federico Aloi
|
8
|
+
- Franco Bulgarelli
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2015-05-27 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '1.7'
|
21
|
+
type: :development
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '1.7'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: rake
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '10.0'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '10.0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: rspec
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - "~>"
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '2'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '2'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: codeclimate-test-reporter
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
description: Write Gobstones program within Ruby
|
71
|
+
email:
|
72
|
+
- federico.aloi@gmail.com
|
73
|
+
- flbulgarelli@yahoo.com.ar
|
74
|
+
executables: []
|
75
|
+
extensions: []
|
76
|
+
extra_rdoc_files: []
|
77
|
+
files:
|
78
|
+
- lib/extensions/array.rb
|
79
|
+
- lib/gobgems.rb
|
80
|
+
- lib/gobgems/board.rb
|
81
|
+
- lib/gobgems/color.rb
|
82
|
+
- lib/gobgems/direction.rb
|
83
|
+
- lib/gobgems/execution_context.rb
|
84
|
+
- lib/gobgems/gbb_parser.rb
|
85
|
+
- lib/gobgems/program.rb
|
86
|
+
- lib/gobgems/version.rb
|
87
|
+
homepage: https://github.com/flbulgarelli/gobgems
|
88
|
+
licenses:
|
89
|
+
- MIT
|
90
|
+
metadata: {}
|
91
|
+
post_install_message:
|
92
|
+
rdoc_options: []
|
93
|
+
require_paths:
|
94
|
+
- lib
|
95
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
requirements: []
|
106
|
+
rubyforge_project:
|
107
|
+
rubygems_version: 2.2.0
|
108
|
+
signing_key:
|
109
|
+
specification_version: 4
|
110
|
+
summary: Pure ruby library that implements a Gobstones-like board and dsl
|
111
|
+
test_files: []
|