// Package atbash implements Atbash cipher.
package atbash
import (
"strings"
"unicode"
)
var mp = map[rune]rune{
'a': 'z', 'b': 'y', 'c': 'x', 'd': 'w', 'e': 'v', 'f': 'u', 'g': 't', 'h': 's', 'i': 'r', 'j': 'q', 'k': 'p', 'l': 'o', 'm': 'n', 'n': 'm', 'o': 'l', 'p': 'k', 'q': 'j', 'r': 'i', 's': 'h', 't': 'g', 'u': 'f', 'v': 'e', 'w': 'd', 'x': 'c', 'y': 'b', 'z': 'a',
}
// Atbash encodes input with Atbash cipher.
func Atbash(input string) string {
input = strings.ToLower(input)
input = strings.Map(func(r rune) rune {
if unicode.IsSpace(r) || unicode.IsPunct(r) {
return -1
}
return r
}, input)
out := strings.Builder{}
for i, ch := range input {
if i != 0 && i%5 == 0 {
out.WriteRune(' ')
}
if unicode.IsDigit(ch) {
out.WriteRune(ch)
continue
}
out.WriteRune(mp[ch])
}
return out.String()
}