namespace Jetstream_Code_Test
public class StringCompressor
public static string? Compress(string? input)
if (string.IsNullOrEmpty(input))
var compressed = new StringBuilder();
var currentChar = input[0];
var currentCharCount = 1;
for (var i = 1; i < input.Length; i++)
if (input[i] == currentChar)
AppendCompressedSequenceToResult(compressed, currentChar, currentCharCount);
AppendCompressedSequenceToResult(compressed, currentChar, currentCharCount);
return compressed.ToString();
private static void AppendCompressedSequenceToResult(StringBuilder compressed, char currentChar, int currentCharCount)
compressed.Append(currentChar);
if (currentCharCount > 1)
compressed.Append(currentCharCount);
namespace Jetstream_Code_Test
public class StringCompressorTests
public void Compress_Null_ReturnsNull()
var result = StringCompressor.Compress(null);
[InlineData("aaabccccdd", "a3bc4d2")]
[InlineData("yyyyyzzzzzzzzzz", "y5z10")]
[InlineData("abcd", "abcd")]
[InlineData("hhhccchhhccc", "h3c3h3c3")]
[InlineData("aaAAbbBB__A1", "a2A2b2B2_2A1")]
[InlineData("a3bc4d2", "a3bc4d2")]
[InlineData(" aaa", " 2a3")]
[InlineData(" aaa ", " 2a3 2")]
[InlineData("112223333", "122334")]
public void Compress_GivenString_ReturnsExpectedResult(string? input, string expected)
var result = StringCompressor.Compress(input);
Assert.Equal(expected, result);