From e71642c590107fa3d167281d2371ee12530ed51b Mon Sep 17 00:00:00 2001 From: Mark Old Date: Wed, 25 Apr 2012 00:38:13 -0700 Subject: [PATCH] Add checks for repeating strings of characters --- bin/shamazing | 25 ++++++++++++++++++------- lib/shamazing.rb | 29 +++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/bin/shamazing b/bin/shamazing index c82f4df..13ab479 100755 --- a/bin/shamazing +++ b/bin/shamazing @@ -25,9 +25,10 @@ require 'shamazing' require 'rugged' options = { - :string => false, - :integer => false, - :full => false + :string => false, + :integer => false, + :repeating => false, + :full => false } parser = OptionParser.new do |opts| @@ -47,6 +48,10 @@ parser = OptionParser.new do |opts| options[:integer] = true end + opts.on("-r", "--repeating", "The longest repeating string of characters in this SHA") do + options[:repeating] = true + end + opts.on("-f", "--full", "Display full SHAs instead of snippets") do options[:full] = true end @@ -64,23 +69,29 @@ if ARGV.empty? repo = Rugged::Repository.new('.') shas = repo.walk(repo.head.target).map(&:oid) - if options[:string] && !options[:integer] + if options[:string] && !options[:integer] && !options[:repeating] puts Shamazing.string_from_array(shas,options[:full]) - elsif options[:integer] + elsif options[:integer] && !options[:repeating] puts Shamazing.integer_from_array(shas,options[:full]) + elsif options[:repeating] + puts Shamazing.repeating_from_array(shas,options[:full]) else puts "Longest string: #{Shamazing.string_from_array(shas,options[:full])}" puts "Longest integer: #{Shamazing.integer_from_array(shas,options[:full])}" + puts "Longest repeating: #{Shamazing.repeating_from_array(shas,options[:full])}" end else sha = ARGV.first - if options[:string] && !options[:integer] + if options[:string] && !options[:integer] && !options[:repeating] puts Shamazing.string(sha) - elsif options[:integer] + elsif options[:integer] && !options[:repeating] puts Shamazing.integer(sha) + elsif options[:repeating] + puts Shamazing.repeating(sha) else puts "Longest string: #{Shamazing.string(sha)}" puts "Longest integer: #{Shamazing.integer(sha)}" + puts "Longest repeating: #{Shamazing.repeating(sha)}" end end diff --git a/lib/shamazing.rb b/lib/shamazing.rb index 04f91d6..02cb617 100644 --- a/lib/shamazing.rb +++ b/lib/shamazing.rb @@ -53,4 +53,33 @@ def self.integer_from_array(shas,full=false) first.to_i full ? shas.find{|sha| sha.match(/#{longest}/)} : longest end + + # Finds the longest repeating string of characters in a SHA. + # + # sha - The String SHA to analyze. + # + # Returns a String. + def self.repeating(sha) + sha. + downcase. + scan(/(\w)(\1+)/). + collect{|a| a.join}. + sort{|a,b| b.length <=> a.length}. + first + end + + # Finds the longest repeating string of characters in an Array of SHAs. + # + # sha - The String SHA to analyze. + # full - A Boolean: should we return the full SHA instead of the snippet? + # + # Returns the longest String. + def self.repeating_from_array(shas,full=false) + longest = shas. + collect{|sha| repeating(sha)}. + delete_if{|sha| sha.nil?}. + sort{|a,b| b.length <=> a.length}. + first + full ? shas.find{|sha| sha.match(/#{longest}/)} : longest + end end \ No newline at end of file