45 lines
1.1 KiB
Plaintext
45 lines
1.1 KiB
Plaintext
import "./pattern" for Pattern
|
|
|
|
var p = Pattern.new("/u") // match any upper case letter
|
|
|
|
var encode = Fn.new { |s|
|
|
if (s == "") return s
|
|
var e = ""
|
|
var curr = s[0]
|
|
var count = 1
|
|
var i = 1
|
|
while (i < s.count) {
|
|
if (s[i] == curr) {
|
|
count = count + 1
|
|
} else {
|
|
e = e + count.toString + curr
|
|
curr = s[i]
|
|
count = 1
|
|
}
|
|
i = i + 1
|
|
}
|
|
return e + count.toString + curr
|
|
}
|
|
|
|
var decode = Fn.new { |e|
|
|
if (e == "") return e
|
|
var letters = Pattern.matchesText(p.findAll(e))
|
|
var numbers = p.splitAll(e)[0..-2].map { |s| Num.fromString(s) }.toList
|
|
return (0...letters.count).reduce("") { |acc, i| acc + letters[i]*numbers[i] }.join()
|
|
}
|
|
|
|
var strings = [
|
|
"AA",
|
|
"RROSETTAA",
|
|
"WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW"
|
|
]
|
|
|
|
for (s in strings) {
|
|
System.print("Original text : %(s)")
|
|
var e = encode.call(s)
|
|
System.print("Encoded text : %(e)")
|
|
var d = decode.call(e)
|
|
System.print("Decoded text : %(d)")
|
|
System.print("Original = decoded : %(s == d)\n")
|
|
}
|