pitchcar 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (9) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.md +22 -0
  3. data/Readme.md +42 -0
  4. data/boyermoore.rb +117 -0
  5. data/finder.rb +50 -0
  6. data/piece.rb +66 -0
  7. data/pitchcar_tracks +20160 -0
  8. data/track.rb +99 -0
  9. metadata +50 -0
data/track.rb ADDED
@@ -0,0 +1,99 @@
1
+ require 'csv'
2
+ require_relative 'piece'
3
+ require_relative 'boyermoore'
4
+
5
+ module Pitchcar
6
+ class Track
7
+ attr_accessor :pieces
8
+
9
+ def initialize(pieces)
10
+ self.pieces = pieces
11
+ end
12
+
13
+ def self.build_from(track_pieces)
14
+ pieces = PieceList.new([Piece.starting_piece])
15
+
16
+ track_pieces[1..-1].chars.each do |piece_str|
17
+ piece = Piece.new
18
+ piece.x = pieces.last.x
19
+ piece.y = pieces.last.y
20
+ piece.type = Piece.type_from_string(piece_str)
21
+
22
+ case pieces.last.direction
23
+ when Piece::DIRECTIONS[:NORTH]
24
+ piece.y = pieces.last.y + 1
25
+ when Piece::DIRECTIONS[:EAST]
26
+ piece.x = pieces.last.x + 1
27
+ when Piece::DIRECTIONS[:WEST]
28
+ piece.x = pieces.last.x - 1
29
+ when Piece::DIRECTIONS[:SOUTH]
30
+ piece.y = pieces.last.y - 1
31
+ end
32
+ piece.direction = piece.next_direction(pieces.last.direction)
33
+
34
+ pieces << piece
35
+ end
36
+
37
+ Track.new(pieces)
38
+ end
39
+
40
+ def valid?(tracks=[])
41
+ ends_correctly? && !overlaps? && !rotation_exists?(tracks)
42
+ end
43
+
44
+ def to_s
45
+ pieces[0].type = Piece::TYPES[:STRAIGHT_RIGHT_WALL]
46
+ pieces.map(&:to_s).join(' ')
47
+ end
48
+
49
+ def to_json
50
+ pieces.map(&:to_h).to_json
51
+ end
52
+
53
+ def overlaps?
54
+ @overlaps ||= pieces.group_by { |piece| [piece.x, piece.y] }.values.any? { |set| set.size > 1 }
55
+ end
56
+
57
+ def with_wall_combinations(pieces = PieceList.new(self.pieces)[1..-1], combinations = [])
58
+ straight_index = pieces.find_index { |piece| piece.type == Piece::TYPES[:STRAIGHT] }
59
+ if straight_index
60
+ combos = []
61
+ [Piece::TYPES[:STRAIGHT_LEFT_WALL], Piece::TYPES[:STRAIGHT_RIGHT_WALL]].each do |piece_type|
62
+ pieces_copy = PieceList.new(pieces)
63
+ pieces_copy[straight_index].type = piece_type
64
+ combos = with_wall_combinations(pieces_copy, combinations)
65
+ end
66
+ combos
67
+ else
68
+ combinations << Track.new([self.pieces.first] + pieces)
69
+ end
70
+ end
71
+
72
+ private
73
+
74
+ def rotation_exists?(tracks)
75
+ tracks.each do |other_track|
76
+ other_track = other_track.to_s.gsub(' ', '') * 2
77
+ return true unless BoyerMoore.search(other_track, to_s.gsub(' ', '')).nil?
78
+ end
79
+ false
80
+ end
81
+
82
+ def ends_correctly?
83
+ pieces.last.x == pieces.first.x && pieces.last.y == pieces.first.y + 1 && pieces.last.direction == Piece::DIRECTIONS[:SOUTH]
84
+ end
85
+ end
86
+
87
+ class PieceList < Array
88
+ def initialize(pieces)
89
+ pieces.each do |piece|
90
+ new_piece = Piece.new
91
+ new_piece.x = piece.x
92
+ new_piece.y = piece.y
93
+ new_piece.type = piece.type
94
+ new_piece.direction = piece.direction
95
+ self.<< new_piece
96
+ end
97
+ end
98
+ end
99
+ end
metadata ADDED
@@ -0,0 +1,50 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pitchcar
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jonah Hirsch
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-02-23 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Generates tracks for pitchcar
14
+ email: jhirsch@rmn.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - LICENSE.md
20
+ - Readme.md
21
+ - boyermoore.rb
22
+ - finder.rb
23
+ - piece.rb
24
+ - pitchcar_tracks
25
+ - track.rb
26
+ homepage: https://github.com/jonahwh/pitchcar_track_generator
27
+ licenses:
28
+ - MIT
29
+ metadata: {}
30
+ post_install_message:
31
+ rdoc_options: []
32
+ require_paths:
33
+ - lib
34
+ required_ruby_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ required_rubygems_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ requirements: []
45
+ rubyforge_project:
46
+ rubygems_version: 2.6.3
47
+ signing_key:
48
+ specification_version: 4
49
+ summary: Pitchcar Track Generator
50
+ test_files: []