# your code goes here$a=0
$a=1
class Node
attr_accessor :rank
attr_accessor :children
attr_accessor :parent
def initialize
@parent=nil
@children=[]
end
def dup()
result=Node.new
result.rank=@rank
@children.each{|c|
x=c.dup()
x.parent=result
result.children<<x
}
return result
end
def leaf()
return self if(children.length==0)
return @children.last.leaf
end
def succ()
# $a+=1
l=leaf()
p=l.parent
return false if(p==nil)
p.children.pop
pp=p.parent
if(pp!=nil)
then
$a.times{
n=p.dup
n.parent=pp
pp.children<<n
}
else
pp=p
end
if(l.rank>0)
then
n=generate($a,l.rank-1)
n.parent=pp
pp.children<<n
end
return true
end
def dump()
lp_list=["(","[","<","{"]
rp_list=[")","]",">","}"]
if @rank>3
lp="{"
rp="}"
else
lp=lp_list[@rank]
rp=rp_list[@rank]
end
return lp+children.collect{|c| c.dump()}.join()+rp
end
end
def generate(i,rank)
n=Node.new
n.rank=rank
return n if(i==0)
c=generate(i-1,rank)
c.parent=n
n.children<<c
return n
end
x=generate(1,3)
i=0
print x.dump,"\n"
while(x.succ)
print x.dump,"\n"
i+=1
break if(i>100)
end
IyB5b3VyIGNvZGUgZ29lcyBoZXJlJGE9MAokYT0xCmNsYXNzIE5vZGUKCWF0dHJfYWNjZXNzb3IgOnJhbmsKCWF0dHJfYWNjZXNzb3IgOmNoaWxkcmVuCglhdHRyX2FjY2Vzc29yIDpwYXJlbnQKCQoJZGVmIGluaXRpYWxpemUKCQlAcGFyZW50PW5pbAoJCUBjaGlsZHJlbj1bXQoJZW5kCgkKCWRlZiBkdXAoKQoJCXJlc3VsdD1Ob2RlLm5ldwoJCXJlc3VsdC5yYW5rPUByYW5rCgkJQGNoaWxkcmVuLmVhY2h7fGN8CgkJCXg9Yy5kdXAoKQoJCQl4LnBhcmVudD1yZXN1bHQKCQkJcmVzdWx0LmNoaWxkcmVuPDx4CgkJfQoJCXJldHVybiByZXN1bHQKCWVuZAoJCglkZWYgbGVhZigpCgkJcmV0dXJuIHNlbGYgaWYoY2hpbGRyZW4ubGVuZ3RoPT0wKQoJCXJldHVybiBAY2hpbGRyZW4ubGFzdC5sZWFmCgllbmQKCQoJZGVmIHN1Y2MoKQojCQkkYSs9MQoJCWw9bGVhZigpCgkJcD1sLnBhcmVudAoJCXJldHVybiBmYWxzZSBpZihwPT1uaWwpCgkJcC5jaGlsZHJlbi5wb3AKCQlwcD1wLnBhcmVudAoJCWlmKHBwIT1uaWwpCgkJdGhlbgoJCQkkYS50aW1lc3sKCQkJCW49cC5kdXAKCQkJCW4ucGFyZW50PXBwCgkJCQlwcC5jaGlsZHJlbjw8bgoJCQl9CgkJZWxzZQoJCQlwcD1wCgkJZW5kCgkJCgkJaWYobC5yYW5rPjApCgkJdGhlbgoJCQluPWdlbmVyYXRlKCRhLGwucmFuay0xKQoJCQluLnBhcmVudD1wcAoJCQlwcC5jaGlsZHJlbjw8bgoJCWVuZAoJCXJldHVybiB0cnVlCgllbmQKCglkZWYgZHVtcCgpCgkJbHBfbGlzdD1bIigiLCJbIiwiPCIsInsiXQoJCXJwX2xpc3Q9WyIpIiwiXSIsIj4iLCJ9Il0KCQlpZiBAcmFuaz4zCgkJCWxwPSJ7IgoJCQlycD0ifSIKCQllbHNlCgkJCWxwPWxwX2xpc3RbQHJhbmtdCgkJCXJwPXJwX2xpc3RbQHJhbmtdCgkJZW5kCgkJcmV0dXJuIGxwK2NoaWxkcmVuLmNvbGxlY3R7fGN8IGMuZHVtcCgpfS5qb2luKCkrcnAKCWVuZAplbmQKCmRlZiBnZW5lcmF0ZShpLHJhbmspCgluPU5vZGUubmV3CgluLnJhbms9cmFuawoJcmV0dXJuIG4gaWYoaT09MCkKCWM9Z2VuZXJhdGUoaS0xLHJhbmspCgljLnBhcmVudD1uCgluLmNoaWxkcmVuPDxjCglyZXR1cm4gbgplbmQKCng9Z2VuZXJhdGUoMSwzKQppPTAKcHJpbnQgeC5kdW1wLCJcbiIKd2hpbGUoeC5zdWNjKQoJcHJpbnQgeC5kdW1wLCJcbiIKCWkrPTEKCWJyZWFrIGlmKGk+MTAwKQplbmQ=