Hi Hackers, hier ist meine Lösung für Caesar und Vigenere, powered by Groovy :-)
Code:
// ***** Caesar *****
String encodeCaesar(String text)
{
return caesar(text, "A", "Z", { it.next() })
}
String decodeCaesar(String text)
{
return caesar(text, "Z", "A", { it.previous() })
}
String caesar(String text, String START, String END, Closure move)
{
return text.replaceAll("[A-Z]") { c ->
3.times {
c = (c != END) ? move(c) : START
}
return c
}
}
println encodeCaesar("ABCZ") // "DEFC"
println decodeCaesar("DEFC") // "ABCZ"
// ***** Vigenere *****
charRange = "A".."Z"
String encodeVigenere(String text, String key)
{
return vigenere(text, key, "A", "Z", { it.next() })
}
String decodeVigenere(String text, String key)
{
return vigenere(text, key, "Z", "A", { it.previous() })
}
String vigenere(String text, String key, String START, String END, Closure move)
{
char[] result = new char[text.size()]
keySize = key.size()
text.eachWithIndex { c, i ->
keyChar = key[i % keySize]
shift = charRange.indexOf(keyChar)
shift.times {
c = (c != END) ? move(c) : START
}
result[i] = c
}
return new String(result)
}
println encodeVigenere("GEHEIMNIS", "AKEY") // "GOLCIWRGS"
println decodeVigenere("GOLCIWRGS", "AKEY") // "GEHEIMNIS"