Run-length encoding: Difference between revisions
Content added Content deleted
(→Linq: Updated short linq solution to match) |
(→Linq: Added StringBuilder version) |
||
Line 764: | Line 764: | ||
Encode(raw) = encoded = [12,W],[1,B],[12,W],[3,B],[24,W],[1,B],[14,W] |
Encode(raw) = encoded = [12,W],[1,B],[12,W],[3,B],[24,W],[1,B],[14,W] |
||
Decode(encoded) = WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW |
Decode(encoded) = WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW |
||
Decode(Encode(raw)) = True |
|||
</pre> |
|||
Stringbuilder version. Might be more performant but mixes output formatting with encoding/decoding logic. |
|||
<!--Martin Freedman 22/02/2018--> |
|||
<lang csharp>using System.Collections.Generic; |
|||
using System.Linq; |
|||
using static System.Console; |
|||
using static System.Linq.Enumerable; |
|||
namespace RunLengthEncoding |
|||
{ |
|||
static class Program |
|||
{ |
|||
public static string Encode(string input) => input.Length == 0 ? "" : input.Skip(1) |
|||
.Aggregate((len: 1, chr: input[0], sb: new StringBuilder()), |
|||
(a, c) => a.chr == c ? (a.len + 1, a.chr, a.sb) |
|||
: (1, c, a.sb.Append($"{a.len}{a.chr}")), |
|||
a => a.sb.Append($"{a.len}{a.chr}")) |
|||
.ToString(); |
|||
public static string Decode(string input) => input |
|||
.Aggregate((t: "", sb: new StringBuilder()), |
|||
(a, c) => !char.IsDigit(c) ? ("", a.sb.Append(new string(c, int.Parse(a.t)))) |
|||
: (a.t + c, a.sb)) |
|||
.sb.ToString(); |
|||
public static void Main(string[] args) |
|||
{ |
|||
const string raw = "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW"; |
|||
const string encoded = "12W1B12W3B24W1B14W"; |
|||
WriteLine($"raw = {raw}"); |
|||
WriteLine($"encoded = {encoded}"); |
|||
WriteLine($"Encode(raw) = encoded = {Encode(raw)}"); |
|||
WriteLine($"Decode(encode) = {Decode(encoded)}"); |
|||
WriteLine($"Decode(Encode(raw)) = {Decode(Encode(raw)) == raw}"); |
|||
ReadLine(); |
|||
} |
|||
} |
|||
}</lang> |
|||
Output: |
|||
<pre>raw = WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW |
|||
encoded = 12W1B12W3B24W1B14W |
|||
Encode(raw) = encoded = 12W1B12W3B24W1B14W |
|||
Decode(encode) = WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW |
|||
Decode(Encode(raw)) = True |
Decode(Encode(raw)) = True |
||
</pre> |
</pre> |