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}"
|