Created
December 10, 2015 10:20
-
-
Save bokuo-okubo/491f71c9b5eb2056b1c8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Checker | |
attr_accessor :reguler_array | |
def initialize | |
string = gets.chomp | |
ary = string.split("") | |
@reguler_array = make_good_ary(ary) | |
end | |
def make_good_ary(array) | |
_ary = array | |
rtnAry =[] | |
stack = "" | |
_ary.each do |chr| | |
if /\d/ =~ chr | |
stack = stack + chr | |
else | |
unless stack == "" | |
rtnAry << stack.to_i | |
stack = "" | |
end | |
rtnAry << chr | |
end | |
end | |
return rtnAry | |
end | |
end | |
############################## | |
class Printer | |
def self.printing(register) | |
alphabets = [*"a".."z"] | |
counts = Array.new(26,0) | |
ary = [alphabets,counts].transpose | |
hash = Hash[*ary.flatten] | |
hash.merge!(register) | |
hash.each do |key,val| | |
print "#{key}\s#{val}\n" | |
end | |
end | |
end | |
############################## | |
class Parser | |
attr_accessor :master_register | |
def initialize | |
@master_register={} | |
@register_stack =[] | |
@number_stack=[] ## [number,flag] | |
end | |
def parse(chr) | |
if chr.kind_of?(Fixnum) ##数字の場合 | |
@number_stack << [chr,false] | |
else | |
if /\w/ =~ chr ## 文字の場合 | |
char_patern(chr) | |
elsif "\(" == chr ##"("の場合 | |
@number_stack.last[1] = true | |
@register_stack << {} | |
elsif "\)" == chr ##")"の場合 | |
pair = @number_stack.pop | |
back_parenthesis_petern(pair) | |
end | |
end | |
clear_register | |
end | |
def clear_register | |
if @number_stack.length == 0 | |
_register = @register_stack[0] | |
@master_register.merge!(_register) do |chr,regi_val,mas_val| | |
regi_val + mas_val | |
end | |
@register_stack.clear | |
end | |
end | |
def char_patern(chr) | |
_var = set_var | |
@register_stack << {} unless @register_stack.last | |
_register = @register_stack.last | |
if _register.has_key?(chr) | |
_register[chr] += _var | |
else | |
_register.store(chr,_var) | |
end | |
end | |
def set_var | |
_var = 1 | |
if @number_stack.length != 0 | |
pair = @number_stack.pop | |
if pair[1] | |
@number_stack << pair | |
else | |
_var = pair[0] | |
end | |
end | |
return _var | |
end | |
def back_parenthesis_petern(pair) | |
multi = pair[0] | |
_register = @register_stack.last | |
_register.each{|chr,cnt| _register[chr] = multi * cnt } | |
marge_to_parent | |
end | |
def marge_to_parent | |
if @register_stack.length > 1 | |
child = @register_stack.pop | |
parent = @register_stack.last #こっちは参照 | |
parent.merge!(child) do |chr,child_val,parent_val| | |
child_val + parent_val | |
end | |
end | |
end | |
end | |
##--------main--------------- | |
def main | |
parser = Parser.new | |
checker = Checker.new | |
ary = checker.reguler_array | |
ary.each do |chr| | |
parser.parse(chr) | |
end | |
Printer.printing(parser.master_register) | |
end | |
main |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment