letterkey <- function(plain="", cipher="", keyletter="A") { # encode or decode a Caesar cipher if(missing(plain) && missing(cipher)) { stop("Must include one of plaintext or ciphertext!") } if(!missing(plain) && !missing(cipher)) { stop("Included both plaintext and ciphertext!") } if(missing(cipher)) { # encode plaintext plain <- toupper(plain) keyletter <- toupper(keyletter) textlen <- nchar(plain) alphanum <- 1:26 keyletter <- alphanum[!is.na(match(LETTERS, keyletter))] - 1 cipher <- " " for(i in 2:textlen) { cipher <- paste(cipher, " ", sep="") } for(i in 1:textlen) { currletter <- substring(plain, i, i) if(currletter != " ") { currletter <- alphanum[!is.na(match(LETTERS, currletter))] currletter <- currletter + keyletter if(currletter > 26) { currletter <- currletter - 26 } currletter <- LETTERS[currletter] substring(cipher, i, i) <- currletter } } } if(missing(plain)) { # decode ciphertext cipher <- toupper(cipher) keyletter <- toupper(keyletter) textlen <- nchar(cipher) alphanum <- 1:26 plain <- " " for(i in 2:textlen) { plain <- paste(plain, " ", sep="") } for(i in 1:textlen) { currletter <- substring(cipher, i, i) if(currletter != " ") { currletter <- alphanum[!is.na(match(LETTERS, currletter))] currletter <- currletter - keyletter if(currletter < 1) { currletter <- currletter + 26 } currletter <- LETTERS[currletter] substring(plain, i, i) <- currletter } } } list(plain=plain, cipher=cipher, keyletter=keyletter) }