Предельно простая задача с циклом while + рекурсия.
скобки образуют вызов рекурсивной функции.
Котлин не знаю.
Примерно так:
function task(str) result string {
i, j integer = 0;
max integer = str.length;
ch char = #0;
while (i < max) {
ch = str[i];
if ch in [0..9] {
//делаем рекурсию столько раз сколько предписано
//начало строки которую надо обработать, не включая тек. символ и символ начала рекурсии (
substrStart Integer = i + 2;
//конец строки которую надо обработать, ссылается на закрывающую рекурсию скобку )
substrEnd Integer = str.pos(")", substrStart );
//цикл повторов выражения в скобках
for j = 1; j < ch; j++:
//копируем из строки 2(3(c)d) значение 3(с)d не включая скобки и текущий символ указывающий кол-во повторов
result = result + task(str.substring(substrStart, substrEnd -1));
end for;
//Прыгаем за закрываюющую скобку т.к. этот участок обработан рекурсивно, и нужно обработать хвост если он есть, например: aaa2(3(c)dd)QQ
//в первой итерации task("aaa2(3(c)dd)QQ")
//тут будет переход на позици подстроки "QQ"
i = substrEnd + 1;
} else {
result = result + ch;
i = i + 1;
}
}
}
}