Skip to content

Instantly share code, notes, and snippets.

@ivandenysov
Created January 25, 2021 21:55
Show Gist options
  • Save ivandenysov/33f7ea45f1237121ef349b275eaed81d to your computer and use it in GitHub Desktop.
Save ivandenysov/33f7ea45f1237121ef349b275eaed81d to your computer and use it in GitHub Desktop.
# @param {String} s
# @return {String}
def decode_string(s)
puts "decoding #{s.inspect}"
digits = ('0'..'9').to_set
result = ""
multiplier = ""
group = ""
inside_group = false
plain_text_group = true
group_bracket_level = 0
s.each_char do |char|
if digits.include?(char)
if inside_group
group << char
else
result << group
group = ""
multiplier << char
end
elsif char == '['
if inside_group
group_bracket_level += 1
plain_text_group = false
group << char
else
inside_group = true
end
elsif char == ']'
if group_bracket_level == 0
integer_multiplier = multiplier == "" ? 1 : multiplier.to_i
addition = if plain_text_group
group * integer_multiplier
else
decode_string(group) * integer_multiplier
end
result << addition
inside_group = false
plain_text_group = true
multiplier = ""
group = ""
else
group_bracket_level -= 1
group << char
end
else
group << char
end
end
integer_multiplier = multiplier == "" ? 1 : multiplier.to_i
addition = if plain_text_group
group * integer_multiplier
else
decode_string(group) * integer_multiplier
end
result << addition
result
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment