Golang : Rot13 and Rot5 algorithms example
Continuing from our previous ROT47 tutorial, we will now learn how to implement the ROT13 + ROT5 algorithms. ROT13 basically rotates a character by 13 places, ‘A’ to ‘N’, ‘B’ to ‘M’ and so on. The ROT5, rotates the digits: ‘0’ to ‘5’, ‘1’ to ‘6’ and so on.
ROT13 is often combined with ROT5, which is used to encode and decode digits i.e. 0-9 and sometimes is also known as ROT18. The following is an implementation done in Golang.
Here you go!
package main
import (
"fmt"
"unicode"
)
// rot13(alphabets) + rot5(numeric)
func rot13rot5(input string) string {
var result []rune
rot5map := map[rune]rune{'0': '5', '1': '6', '2': '7', '3': '8', '4': '9', '5': '0', '6': '1', '7': '2', '8': '3', '9': '4'}
for _, i := range input {
switch {
case !unicode.IsLetter(i) && !unicode.IsNumber(i):
result = append(result, i)
case i >= 'A' && i <= 'Z':
result = append(result, 'A'+(i-'A'+13)%26)
case i >= 'a' && i <= 'z':
result = append(result, 'a'+(i-'a'+13)%26)
case i >= '0' && i <= '9':
result = append(result, rot5map[i])
case unicode.IsSpace(i):
result = append(result, ' ')
}
}
return fmt.Sprintf(string(result[:]))
}
func main() {
text := "ROT18 = ROT13+ROT5. The ROT13 (Caesar cipher by 13 chars) is often combined with ROT5. ROT13 to handle alphabets and ROT5 to handle digits."
fmt.Println(text)
fmt.Println(rot13rot5(text))
fmt.Println("Invertible test:")
fmt.Println(rot13rot5(rot13rot5(text)))
}
Output:
ROT18 = ROT13+ROT5. The ROT13 (Caesar cipher by 13 chars) is often combined with ROT5. ROT13 to handle alphabets and ROT5 to handle digits.
EBG63 = EBG68+EBG0. Gur EBG68 (Pnrfne pvcure ol 68 punef) vf bsgra pbzovarq jvgu EBG0. EBG68 gb unaqyr nycunorgf naq EBG0 gb unaqyr qvtvgf.
Invertible test:
ROT18 = ROT13+ROT5. The ROT13 (Caesar cipher by 13 chars) is often combined with ROT5. ROT13 to handle alphabets and ROT5 to handle digits.
Happy coding!
See also : Golang : ROT47 (Caesar cipher by 47 characters) example
By Adam Ng
IF you gain some knowledge or the information here solved your programming problem. Please consider donating to the less fortunate or some charities that you like. Apart from donation, planting trees, volunteering or reducing your carbon footprint will be great too.
Advertisement
Tutorials
+25k Golang : Get current file path of a file or executable
+9.1k Golang : How to get ECDSA curve and parameters data?
+26.4k Golang : How to check if a connection to database is still alive ?
+23.9k Golang : How to validate URL the right way
+9.5k Golang : List available AWS regions
+6.3k Golang : Combine slices of complex numbers and operation example
+8.9k Golang : How to find out similarity between two strings with Jaro-Winkler Distance?
+7.4k Gogland : Where to put source code files in package directory for rookie
+14.9k Golang : How to add color to string?
+7.3k Golang : Set horizontal, vertical scroll bars policies and disable interaction on Qt image
+26.5k Golang : Find files by extension
+34.2k Golang : Smarter Error Handling with strings.Contains()