String Compression – HackerRank Solution

In this post, we will solve String Compression HackerRank Solution. This problem (String Compression) is a part of HackerRank Functional Programming series.

Task

Joseph and Jane are making a contest for apes. During the process, they have to communicate frequently with each other. Since they are not completely human, they cannot speak properly. They have to transfer messages using postcards of small sizes.
To save space on the small postcards, they devise a string compression algorithm:

  • If a character, ch, occurs n(> 1) times in a row, then it will be represented by {ch}{n}, where {x} is the value of x. For example, if the substring is a sequence of  4a‘ (“aaaa“), it will be represented as “a4“.
  • If a character, ch, occurs exactly one time in a row, then it will be simply represented as {ch}. For example, if the substring is “a”, then it will be represented as “a”.

Help Joseph to compress a message, msg.

Input

The only line of input contains a string, msg.

Output

Print the string msg as a compressed message.

Constraints

  • 1 <= length(msg) <= 105
  • msg consists of lowercase English characters (az) only.

Sample Input #00

abcaaabbb

Sample Output #00

abca3b3

Sample Input #01

abcd

Sample Output #01

abcd

Sample Input #02

aaabaaaaccaaaaba

Sample Output #02

a3ba4c2a4ba

Explanation

Sample Case #00: msg = “abcaaabbb”. Here, the first 3 characters occur exactly once, and the rest of them occur  times in a sequence.

Sample Case #01: msg = “abcd“. As there is no multiple consecutive occurrence of any character, the compressed message will be same as original one.

Sample Case #02: msg = “aaabaaaaccaaaaba“. In the first 3 occurrences, ‘a‘ is repeated 4 times, while in the last occurrence, there is only one ‘a‘. Also,’c‘ occurs two times, and ‘b‘ occurs one time in both occurrences.

Solution – String Compression – HackerRank Solution

Scala

import scala.io.StdIn

object Solution {
  def main(args: Array[String]): Unit = {
    case class Item(c: Char, count: Int)

    println(StdIn.readLine
      .foldLeft(List[Item]()) {
        case (Item(c, count) :: cs, next) if c == next => Item(c, count + 1) :: cs
        case (list, next) => Item(next, 1) :: list
      }
      .map {
        case Item(c, 1) => c.toString
        case Item(c, n) => c.toString + n
      }
      .reduce((a, b) => b + a))
  }
}

Note: This problem (String Compression) is generated by HackerRank but the solution is provided by CodingBroz. This tutorial is only for Educational and Learning purpose.

Leave a Comment

Your email address will not be published. Required fields are marked *