2017-09-15 2 views
0

J'ai écrit un script pour crypter et décrypter des chaînes dans R, la première partie du code définit un vecteur contenant un ensemble de caractères. Ensuite, je crée un dictionnaire de chiffrement en mélangeant le vecteur et en attribuant des noms à chacun d'entre eux. Cette partie est temporaire, éventuellement j'aurai un vecteur de cryptage fixe. Là où j'ai des problèmes, c'est en écrivant mes fonctions de cryptage et de décryptage efficacement. J'obtiens la sortie désirée, mais je pense qu'il y a une façon plus élégante d'y arriver - celle qui nécessite moins de calcul. Les idées qui viennent à l'esprit remplacent les boucles for par lapply (ou vapply), trouvant une alternative pour ne pas avoir à convertir la chaîne en vecteur, en utilisant des expressions régulières, et ainsi de suite. Cependant, je suis nouveau à R et n'ai pas été capable de maîtriser son pouvoir. Voici mon code:R - cryptage efficace d'une chaîne dans R

# Script to encode and decode strings. 
# Useful for passwords, email messages 
# that do not contain images, and other 
# text applications. 


# Steps to create a vector containing all characters 

## Numeric characters 
nums <- c("1","2","3", "4", "5", "6", "7", 
     "8", "9", "0") 
## Symbols 
sym <- c("!", "@", "#", "$", "%", "^", 
     "&", "*", "(", ")", "-", "_", 
     "=", "+", "[", "{", "]", "}", 
     "|", "\\", ":", "/", "?", ".", 
     ">", "<", ",", "`", "~", ";", 
     "'", " ") 

## Vector with numeric, symbols, and letters 
chars <- c(LETTERS, letters, sym, nums) 

# Create a code vector 

## Randomly sorted 'chars' vector 
code <- sample(chars) 

## Assing names to facilitate coding and decoding 
names(code) <- chars 


# Define a string to code and decode 
text <- "Hello World!" 


# Function to code string 
coder <- function(text, code){ 

    # Make string into a vector to facilitate iteration 
    # over items 
    t <- unlist(strsplit(as.character(text), split='')) 

    # Initiate a vector to store coded vector 
    new <- c() 

    # For loop to code each element in the vector 
    for(i in 1:length(t)){ 
    new <- c(new, names(code)[which(code == t[i])]) 
    } 

    # Collape vector into string 
    paste(new, collapse = '') 
} 

# Function call to verify output 
encoded_str <- coder(text, code) 
print(encoded_str) 

decoder <- function(text, code){ 

    # Make string into a vector to facilitate iteration 
    # over items 
    t <- unlist(strsplit(as.character(text), split='')) 

    # Initiate a vector to store decoded vector 
    new <- c() 

    # For loop to decode each element in the vector 
    for(i in 1:length(t)){ 
    new <- c(new, code[[t[i]]]) 
    } 

    # Collape vector into string 
    paste(new, collapse = '') 
} 

# Function call to verify output 
decoded_str <- decoder(encoded_str, code) 
print(decoded_str) 
+0

Est-ce juste pour des fins éducatives ou de production? – zaph

+0

Usage personnel et (auto) éducatif – Agarp

Répondre

1

Ma tentative de solution avec simplement des éléments de correspondance entre les vecteurs et les réorganisant:

coder2 <- function(text, code){ 
    textSplit <- unlist(strsplit(text, "")) 
    codeAsText <- code[code %in% textSplit] 
    paste(names(codeAsText[match(textSplit, codeAsText)]), collapse = "") 
} 
decoder2 <- function(text, code) { 
    textSplit <- unlist(strsplit(text, "")) 
    textAsCode <- code[names(code) %in% textSplit] 
    paste(textAsCode[match(textSplit, names(textAsCode))], collapse = "") 
} 

enter image description here

PS .: Ne pas utiliser t comme nom t est base fonction pour la transposition.

+0

@AlejandroGarciadeParedes Ce n'est pas une solution ordonnée, mais probablement la plus rapide car aucune boucle n'est utilisée – PoGibas

+0

Pas de boucles vu, les boucles sont là à un niveau inférieur. – zaph