Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172

Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172
nsi:langages:rust:solutions:chiffre_vigenere [GoupillWiki]

Outils pour utilisateurs

Outils du site


nsi:langages:rust:solutions:chiffre_vigenere

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Solution chiffre de Vigenère en Rust

Solution à ce problème.

// src/lib.rs
fn shift_letter(letter:char, s:u8) -> char {
    if  !is_maj(letter) {
        return letter;
    }
    let c = letter as u8;
    let a = 65u8; // ASCII de A
    (a + (c - a + s) % 26) as char
}

fn is_maj(letter:char) -> bool {
    letter >= 'A' && letter <= 'Z'
}

fn str_to_vec(text:&str) -> Vec<u8> {
    let mut v:Vec<u8> = Vec::new();
    for c in text.chars() {
        if is_maj(c) {
            v.push((c as u8) - 65);
        }
    }
    v
}

pub fn cypher(message:&str, key:&str) -> String {
    let k = str_to_vec(key);
    let n = k.len();
    if n == 0 {
        return String::from(message);
    }
    let mut s = String::new();
    let mut i = 0;
    for c in message.chars() {
        if !is_maj(c) {
            s.push(c);
            continue;
        }
        s.push(shift_letter(c, k[i]));
        i = (i + 1)%n;
    }
    s
}

pub fn decypher(message:&str, key:&str) -> String {
    let k = str_to_vec(key);
    let n = k.len();
    if n == 0 {
        return String::from(message);
    }
    let mut s = String::new();
    let mut i = 0;
    for c in message.chars() {
        if !is_maj(c) {
            s.push(c);
            continue;
        }
        s.push(shift_letter(c, 26 - k[i]));
        i = (i + 1)%n;
    }
    s
}


#[cfg(test)]
mod tests {
    #[test]
    fn shift_test() {
        assert_eq!(crate::shift_letter('A', 2), 'C');
        assert_eq!(crate::shift_letter('Z', 5), 'E');
        assert_eq!(crate::shift_letter('i', 5), 'i');
        assert_eq!(crate::shift_letter(' ', 15), ' ');
    }

    #[test]
    fn is_maj_test() {
        assert_eq!(crate::is_maj('A'), true);
        assert_eq!(crate::is_maj('e'), false);
        assert_eq!(crate::is_maj(' '), false);
    }

    #[test]
    fn vec_test() {
        assert_eq!(crate::str_to_vec("AB C"), [0u8, 1u8, 2u8]);
    }

    #[test]
    fn cypher_test() {
        assert_eq!(crate::cypher("BONJOUR AMI", "AB C"), String::from("BPPJPWR BOI"));
    }

    #[test]
    fn decypher_test() {
        assert_eq!(crate::decypher("BPPJPWR BOI", "AB C"), String::from("BONJOUR AMI"));
    }
}
// src/main.rs

use std::env;
use std::fs; // file system
use vigenere::{cypher, decypher};


fn main() {
    let args: Vec<String> = env::args().collect();
    if args.len() < 3 {
        panic!("Usage : {} source key [-cypher ou -decypher] [cible]", args[0]);
    }
    let filename = &args[1];
    let message = fs::read_to_string(filename)
        .expect("Impossible d'ouvrir le fichier.");
    let key = &args[2];
    let sens = if args.len() >= 4 { &args[3] } else { "-cypher" };

    let s = if sens == "-cypher" {
        cypher(&message, &key)
    } else {
        decypher(&message, &key)
    };
    if args.len() >= 5 {
        let cible = &args[4];
        fs::write(cible, s).expect("Impossible d'écrire le fichier.");
    } else {
        print!("{}", s);
    }
}
nsi/langages/rust/solutions/chiffre_vigenere.txt · Dernière modification : de goupillwiki