Skip to content

Instantly share code, notes, and snippets.

@bokuo-okubo
Created December 10, 2015 10:20
Show Gist options
  • Save bokuo-okubo/491f71c9b5eb2056b1c8 to your computer and use it in GitHub Desktop.
Save bokuo-okubo/491f71c9b5eb2056b1c8 to your computer and use it in GitHub Desktop.
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