diff options
| author | mokha <mokha@cisco.com> | 2018-07-20 16:41:41 -0600 |
|---|---|---|
| committer | mokha <mokha@cisco.com> | 2018-07-20 16:41:41 -0600 |
| commit | 6ed06cc28bada875c8e36bfff615018dd91384b8 (patch) | |
| tree | 814cb3602b5e7277f2cf0f6073c7d8b525524884 | |
| parent | a8bf1f1e2cdd9748f797ef59cfb9e97c0b69b910 (diff) | |
| -rw-r--r-- | spec/heaps_stacks_queues/decode_string_spec.rb | 127 |
1 files changed, 114 insertions, 13 deletions
diff --git a/spec/heaps_stacks_queues/decode_string_spec.rb b/spec/heaps_stacks_queues/decode_string_spec.rb index d06e464..c12f418 100644 --- a/spec/heaps_stacks_queues/decode_string_spec.rb +++ b/spec/heaps_stacks_queues/decode_string_spec.rb @@ -56,23 +56,124 @@ describe "#decode_string" do decode(x.to_i, y) end + def decode_string(message) + head = 0 + number = [] + collect = false + + until head == message.length + character = message[head] + if character.match?(/\d/) + number.push(character) + else + if collect + else + number = number.join.to_i + if character == '[' + collect = true + elsif character == ']' + collect = false + end + end + end + head += 1 + end + end + + def decode_string(message) + return message unless message.match?(/\[|\]/) + + full = message.split("[", 2) + left = full[0] + middle = full[1][0...-1] + right = full[1][-1] + + puts [left, middle, right].inspect + puts decode_string(middle) + + middle * left.to_i + end + + def decode_string(message) + n = 0 + string = "" + numbers = [] + strings = [] + message.chars.each do |char| + if char.match?(/\d/) + n = (n * 10) + char.to_i + elsif char == '[' + numbers.push(n) + n = 0 + strings.push(string) unless string == "" + string = "" + elsif char == ']' + x = string * numbers.pop + puts x + #strings[-1] = x + string = strings.pop + else + string += char + end + end + puts string + puts numbers.inspect + puts strings.inspect + nil + end + + def digit?(x) + x.match?(/\d/) + end + + def unwind(stack) + until stack.empty? + y = stack.pop + x = stack.pop + result = y * x rescue x + y + stack.push(result) + break if stack.size == 1 + end + stack[0] + end + + def decode_string(message) + s, c, n = [], "", 0 + message.chars.each do |x| + if digit?(x) + s.push(c) unless c == '' + c = "" + n = (n * 10) + x.to_i + elsif x == '[' + s.push(n) + n = 0 + elsif x == ']' + s.push(c) unless c == '' + c = "" + else + c += x + end + end + unwind(s) + end + [ { s: "4[ab]", x: "abababab" }, { s: "2[b3[a]]", x: "baaabaaa" }, { s: "z1[y]zzz2[abc]", x: "zyzzzabcabc" }, - { s: "3[a]2[bc]", x: "aaabcbc" }, - { s: "3[a2[c]]", x: "accaccacc" }, - { s: "2[abc]3[cd]ef", x: "abcabccdcdcdef" }, - { s: "", x: nil }, - { s: "codefights", x: "codefights" }, - { s: "2[codefights]", x: "codefightscodefights" }, - { s: "100[codefights]", x: "codefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefights" }, - { s: "sd2[f2[e]g]i", x: "sdfeegfeegi" }, - { s: "2[a]", x: "aa" }, - { s: "2[a]3[b]4[c]5[d]", x: "aabbbccccddddd" }, - { s: "2[2[b]]", x: "bbbb" }, - { s: "2[2[2[b]]]", x: "bbbbbbbb" }, - { s: "2[2[2[2[b]]]]", x: "bbbbbbbbbbbbbbbb" }, + #{ s: "3[a]2[bc]", x: "aaabcbc" }, + #{ s: "3[a2[c]]", x: "accaccacc" }, + #{ s: "2[abc]3[cd]ef", x: "abcabccdcdcdef" }, + #{ s: "", x: nil }, + #{ s: "codefights", x: "codefights" }, + #{ s: "2[codefights]", x: "codefightscodefights" }, + #{ s: "100[codefights]", x: "codefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefightscodefights" }, + #{ s: "sd2[f2[e]g]i", x: "sdfeegfeegi" }, + #{ s: "2[a]", x: "aa" }, + #{ s: "2[a]3[b]4[c]5[d]", x: "aabbbccccddddd" }, + #{ s: "2[2[b]]", x: "bbbb" }, + #{ s: "2[2[2[b]]]", x: "bbbbbbbb" }, + #{ s: "2[2[2[2[b]]]]", x: "bbbbbbbbbbbbbbbb" }, ].each do |x| it do expect(decode_string(x[:s])).to eql(x[:x]) |
