class Pitchcar::Pitchcar
Public Class Methods
find_all_tracks(straight, left_right)
click to toggle source
# File lib/pitchcar.rb, line 16 def find_all_tracks(straight, left_right) tracks = find_tracks(straight, left_right, '', []) tracks.map(&:with_wall_combinations).flatten end
random_valid_track(straight, left_right, size_restrictions = {})
click to toggle source
# File lib/pitchcar.rb, line 21 def random_valid_track(straight, left_right, size_restrictions = {}) found_track = nil semaphore = Mutex.new ENV.fetch('MAX_THREADS', 10).to_i.times do Thread.new do track = nil while track.nil? || !track.valid? Thread.stop unless found_track.nil? track = random_track(straight, left_right, size_restrictions) end semaphore.synchronize { found_track = track if found_track.nil? } end end sleep(0.01) while found_track.nil? found_track.with_wall_combinations.sample end
random_valid_tracks(straight, left_right, count = 2, size_restrictions = {})
click to toggle source
# File lib/pitchcar.rb, line 40 def random_valid_tracks(straight, left_right, count = 2, size_restrictions = {}) tracks = [] count.times { tracks << random_valid_track(straight, left_right, size_restrictions) } tracks end
Private Class Methods
find_tracks(straight, left_right, track_pieces, tracks)
click to toggle source
# File lib/pitchcar.rb, line 48 def find_tracks(straight, left_right, track_pieces, tracks) print "Found #{tracks.size} tracks\r" unless track_pieces.empty? track = Track.build_from(track_pieces) return false if track.overlaps? return tracks << track if straight == 0 && left_right == 0 && track.valid?(tracks) end [track_pieces].product((['S'] * straight + ['L'] * left_right + ['R'] * left_right).uniq).each do |result| if result[1] == 'S' find_tracks(straight - 1, left_right, result.join, tracks) else find_tracks(straight, left_right - 1, result.join, tracks) end end tracks end
random_track(straight, left_right, size_restrictions = {})
click to toggle source
# File lib/pitchcar.rb, line 66 def random_track(straight, left_right, size_restrictions = {}) left = Random.rand(1..left_right) right = left_right - left Track.build_from("#{'S' * straight}#{'L' * left}#{'R' * right}".split('').shuffle.join, size_restrictions) end