Run-length encoding: Difference between revisions
Content added Content deleted
(Added Elixir) |
No edit summary |
||
Line 3,712: | Line 3,712: | ||
- decode [(#"a",5),(#"h",6),(#"m",7),(#"u",1),(#"i",7),(#"a",6)]; |
- decode [(#"a",5),(#"h",6),(#"m",7),(#"u",1),(#"i",7),(#"a",6)]; |
||
val it = "aaaaahhhhhhmmmmmmmuiiiiiiiaaaaaa" : string |
val it = "aaaaahhhhhhmmmmmmmuiiiiiiiaaaaaa" : string |
||
</pre> |
|||
=={{header|Swift}}== |
|||
Using array as internal representation of encoded input: |
|||
<lang swift>import Foundation |
|||
// "WWWBWW" -> [(3, W), (1, B), (2, W)] |
|||
func encode(input: String) -> [(Int, Character)] { |
|||
return input.characters.reduce([(Int, Character)]()) { |
|||
if $0.last?.1 == $1 { var r = $0; r[r.count - 1].0++; return r } |
|||
return $0 + [(1, $1)] |
|||
} |
|||
} |
|||
// [(3, W), (1, B), (2, W)] -> "WWWBWW" |
|||
func decode(encoded: [(Int, Character)]) -> String { |
|||
return encoded.reduce("") { $0 + String(count: $1.0, repeatedValue: $1.1) } |
|||
} |
|||
</lang> |
|||
'''Usage:''' |
|||
<lang swift> |
|||
let input = "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW" |
|||
let output = decode(encode(input)) |
|||
print(output == input) |
|||
</lang> |
|||
{{Out}} |
|||
<pre>true</pre> |
|||
Converting encoded array into the string and then decoding it using NSScanner: |
|||
<lang swift>// "3W1B2W" -> "WWWBWW" |
|||
func decode(encoded: String) -> String { |
|||
let scanner = NSScanner(string: encoded) |
|||
var char: NSString? = nil |
|||
var count: Int = 0 |
|||
var out = "" |
|||
while scanner.scanInteger(&count) { |
|||
while scanner.scanCharactersFromSet(NSCharacterSet.letterCharacterSet(), intoString: &char) { |
|||
out += String(count: count, repeatedValue: Character(char as! String)) |
|||
} |
|||
} |
|||
return out |
|||
} |
|||
</lang> |
|||
<lang swift>let encodedString = encode(input).reduce("") { $0 + "\($1.0)\($1.1)" } |
|||
print(encodedString) |
|||
let outputString = decode(encodedString) |
|||
print(outputString == input) |
|||
</lang> |
|||
{{Out}} |
|||
<pre> |
|||
12W1B12W3B24W1B14W |
|||
true |
|||
</pre> |
</pre> |
||