51 lines
1.2 KiB
Ruby
51 lines
1.2 KiB
Ruby
def decompress(string)
|
|
decompressed = ""
|
|
compressed = string.clone
|
|
|
|
until compressed.empty? do
|
|
if compressed[0] == "("
|
|
end_index = compressed =~ /\)/
|
|
marker = compressed[1..(end_index - 1)]
|
|
|
|
num_chars, repeat = marker.split("x").map(&:to_i)
|
|
compressed = compressed[(end_index + 1)..]
|
|
chars = compressed[...num_chars]
|
|
repeat.times { decompressed << chars }
|
|
compressed = compressed[num_chars..]
|
|
else
|
|
decompressed << compressed[0]
|
|
compressed = compressed[1..]
|
|
end
|
|
end
|
|
|
|
decompressed
|
|
end
|
|
|
|
def decompressed_length(string)
|
|
decompressed = 0
|
|
compressed = string.clone
|
|
|
|
until compressed.empty? do
|
|
if compressed[0] == "("
|
|
end_index = compressed =~ /\)/
|
|
marker = compressed[1..(end_index - 1)]
|
|
|
|
num_chars, repeat = marker.split("x").map(&:to_i)
|
|
compressed = compressed[(end_index + 1)..]
|
|
chars = compressed[...num_chars]
|
|
repeat.times { decompressed << chars }
|
|
compressed = compressed[num_chars..]
|
|
else
|
|
decompressed << compressed[0]
|
|
compressed = compressed[1..]
|
|
end
|
|
end
|
|
|
|
decompressed
|
|
end
|
|
|
|
input = STDIN.read.chomp
|
|
part_1 = decompress(input).length
|
|
|
|
puts "Part 1: #{part_1}"
|