gets.scan(/(\d)(.)(.)|./){f=->a{$&>?-?a:a.transpose};$*<<f[$1?[[$3]*$1.hex]*$2.hex: (l,r=$*.pop(2).map &f;c=l+r).map{|x|x+[?.]*(c.map(&:size).max-x.size)}]} puts$*[0].map &:join
Note that non-ascii characters in the above source code will be escaped (such as \x9f).