# Compress String by Character Count

{% tabs %}
{% tab title="Scala" %}

```scala
import scala.annotation.tailrec

// compress to list of tuples
def compress(str: String):List[(Char, Int)] = str match {
  case "" => Nil
  case _ => {
    val (x,xs) = str span (c => c == str.head)
    (str.head, x.length) :: compress(xs)
  }
}

// compress to string
def compressString(str: String):String = {
  val sb = new StringBuilder
  @tailrec def compress(s: String):Unit = {
    if (!s.isEmpty) {
      val (x,xs) = s span (c => c == s.head)
      sb.append(s.head)
      sb.append(x.length.toString)
      compress(xs)
    }
  }
  compress(str)
  sb.toString
}

// compress in-place using char array
def compressInPlace(ch: Array[Char]):Unit = {
  var prev = ch.head
  var count = 1
  var write = 0
  for (c <- ch.tail) {
    c match {
      case c if c == prev => count += 1
      case _ => {
        ch(write) = prev
        if (count > 1) {
          for (j <- count.toString) {
            ch(write+1) = j
            write += 1
          }
        }
        write += 1
        count = 1
        prev = c
      }
    }
  }
  ch(write) = prev
  if (count > 1) ch(write+1) = count.toChar
  ch(write+1) = '\0'
}


// initialize string
val s = "aabccccccccccccccccccccccccccccccccccccccccccaaad"

compress(s)

compressString(s)

val ch = Array.fill(50){' '}
for (i <- 0 until s.length) {
  ch(i) = s(i)
}
compressInPlace(ch)
ch.mkString("").substring(0,ch.indexOf('\0'))
```

{% endtab %}

{% tab title="Second Tab" %}

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://blog.bernardw.com/problems/compress-string-by-character-count.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
