class Elrio::PatternDetector
Public Instance Methods
detect_pattern(array)
click to toggle source
# File lib/elrio/pattern_detector.rb, line 3 def detect_pattern(array) max_n = array.size / 2 longest_run = (0..0) longest_run_n = 1 (1..max_n).each do |n| max_offset = [n-1, array.size - 2*n].min (0..max_offset).each do |offset| generator = NGramGenerator.new(array, n, offset) run = find_longest_run(generator) if run.size > [n, longest_run.size].max longest_run = run longest_run_n = n end end end if longest_run.size == 1 start_cap = array.size end_cap = 0 else start_cap = longest_run.first end_cap = array.count - longest_run.last - 1 end Pattern.new(start_cap, end_cap, longest_run_n) end
Private Instance Methods
find_longest_run(generator)
click to toggle source
# File lib/elrio/pattern_detector.rb, line 35 def find_longest_run(generator) prev = nil runs = [] generator.each do |ngram| if ngram == prev runs[-1] += ngram.size else runs << ngram.size end prev = ngram end longest_run_length = runs.max longest_run_index = runs.index(longest_run_length) if longest_run_index > 0 run_start = runs[0, longest_run_index].reduce(:+) else run_start = 0 end run_end = run_start + longest_run_length - 1 (run_start..run_end) end