Ошибки в коде. Что нужно исправить, чтобы заработало?

fun main(args: Array<String>) {
    val t: String = readLine()!!.toString();
    var r = arrayOf<String>(t[0]);
    var c: Int = 1;

    for(i in t[t.last - 1]){
        if(i != r[-1]){
            r.add([c, i]);
            c = 1;
        } else{
            c += 1;
        }
    r.add(c);
    }
}
print(r);

Код выводит массив, который если сложить все буквы в нём получится сокращённая строка. После каждой буквы стоит цифра, которая указывает сколько раз оно повторялось.

..\Playground\:16:1: error: expecting a top level declaration
print(r);
^
..\Playground\:16:6: error: expecting a top level declaration
print(r);
     ^
..\Playground\:16:7: error: expecting a top level declaration
print(r);
      ^
..\Playground\:16:8: error: expecting a top level declaration
print(r);
       ^
..\Playground\:3:29: error: type mismatch: inferred type is Char but String was expected
    var r = arrayOf<String>(t[0]);
                            ^
..\Playground\:6:14: error: for-loop range must have an 'iterator()' method
    for(i in t[t.last - 1]){
             ^
..\Playground\:6:16: error: type mismatch: inferred type is Char but Int was expected
    for(i in t[t.last - 1]){
               ^
..\Playground\:6:18: error: function invocation 'last()' expected
    for(i in t[t.last - 1]){
                 ^
..\Playground\:8:15: error: unresolved reference: add
            r.add([c, i]);
              ^
..\Playground\:8:19: error: unsupported [Collection literals outside of annotations]
            r.add([c, i]);
                  ^
..\Playground\:13:7: error: unresolved reference: add
    r.add(c);
      ^

Ответы (1 шт):

Автор решения: Alex_Skvortsov

Вам нужен код такого формата:

data class LetterWithNumber(
    val letter: Char,
    var number: Int = 1
){
    override fun toString(): String = "$letter$number"
}

fun main(args: Array<String>) {
    val input: String = readLine() ?: return
    val list = mutableListOf<LetterWithNumber>()
    input.forEach {
        if (list.lastOrNull()?.letter == it)
            list.last().number++
        else list.add(LetterWithNumber(it))
    }
    var result = ""
    list.forEach { result += "$it" }
    println(result)

}

Избегайте использования индексов там, где это возможно, Kotlin почти всегда позволяет обойтись без них.

Вывод немного не в том формате, что у Вас, но это легко исправить. Например, так:

var result = "["
list.forEach { result += "${it.letter}, ${it.number}, " }
if (result != "]")
    result = result.removeSuffix(", ")
result += "]"
println(result)
→ Ссылка