Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.Scanner;
- import java.util.List;
- import java.util.ArrayList;
- /**
- * Objectif
- * Pendant la Seconde Guerre mondiale, les Allemands utilisaient un code de cryptage appelé Enigma,
- * qui était essentiellement une machine de cryptage qui chiffrait les messages pour leur transmission.
- * Le code Enigma est resté inviolé pendant de nombreuses années. Voici comment fonctionnait la machine de base :
- *
- * Tout d'abord, une substitution de César est appliquée à l'aide d'un nombre croissant :
- * Si la chaîne est AAA et que le nombre de départ est 4, alors la sortie sera EFG.
- * A + 4 = E
- * A + 4 + 1 = F
- * A + 4 + 1 + 1 = G
- *
- * Ensuite, on mappe EFG sur le premier ROTOR, par exemple :
- * ABCDEFGHIJKLMNOPQRSTUVWXYZ
- * BDFHJLCPRTXVZNYEIWGAKMUSQO
- * Ainsi, EFG devient JLC. Ensuite, elle passe par 2 ROTORS supplémentaires pour obtenir la valeur finale.
- *
- * Si le deuxième ROTOR est AJDKSIRUXBLHWTMCQGZNPYFVOE, on applique à nouveau l'étape de substitution :
- * ABCDEFGHIJKLMNOPQRSTUVWXYZ
- * AJDKSIRUXBLHWTMCQGZNPYFVOE
- * Donc, JLC devient BHD.
- *
- * Si le troisième ROTOR est EKMFLGDQVZNTOWYHXUSPAIBRCJ, alors la substitution finale est :
- * ABCDEFGHIJKLMNOPQRSTUVWXYZ
- * EKMFLGDQVZNTOWYHXUSPAIBRCJ
- * Donc, BHD devient KQF.
- *
- * La sortie finale est envoyée via un émetteur radio.
- *
- * Entrée
- * Ligne 1 : ENCODE ou DECODE
- * Ligne 2 : Nombre de décalage initial N
- * Lignes 3-5 : Les trois ROTORS
- * Ligne 6 : Message à coder ou décoder
- *
- * Sortie
- * Chaîne encodée ou décodée
- *
- * Contraintes
- * 0 ≤ N < 26
- * Le message est composé uniquement de lettres majuscules (A-Z)
- * 1 ≤ Longueur du message < 50
- *
- * Exemple
- * Entrée
- * ENCODE
- * 4
- * BDFHJLCPRTXVZNYEIWGAKMUSQO
- * AJDKSIRUXBLHWTMCQGZNPYFVOE
- * EKMFLGDQVZNTOWYHXUSPAIBRCJ
- * AAA
- * Sortie
- * KQF
- *
- * Exemple
- * DECODE
- * 9
- * BDFHJLCPRTXVZNYEIWGAKMUSQO
- * AJDKSIRUXBLHWTMCQGZNPYFVOE
- * EKMFLGDQVZNTOWYHXUSPAIBRCJ
- * PQSACVVTOISXFXCIAMQEM
- * EVERYONEISWELCOMEHERE
- */
- class Solution {
- public static void main(String args[]) {
- Scanner in = new Scanner(System.in);
- String operation = in.nextLine();
- int pseudoRandomNumber = in.nextInt();
- List<String> rotors = new ArrayList<String>();
- if (in.hasNextLine()) {
- in.nextLine();
- }
- for (int i = 0; i < 3; i++) {
- String rotor = in.nextLine();
- rotors.add(rotor);
- }
- String message = in.nextLine();
- StringBuilder sbResult = new StringBuilder();
- if (operation.equals("ENCODE")) {
- sbResult.append(encode(message, pseudoRandomNumber, rotors));
- } else if (operation.equals("DECODE")) {
- sbResult.append(decode(message, pseudoRandomNumber, rotors));
- }
- System.out.println(sbResult.toString());
- }
- private static String encode(String message, int pseudoRandomNumber, List<String> rotors) {
- StringBuilder result = new StringBuilder();
- for (int i = 0; i < message.length(); i++) {
- result.append(Character.toString((((message.charAt(i) - 'A') + pseudoRandomNumber + i) % (('Z'-'A') + 1)) + 'A'));
- }
- for (int i = 0; i < rotors.size(); i++) {
- String rotor = rotors.get(i);
- for (int j = 0; j < result.length(); j++) {
- Integer pos = result.charAt(j) - 'A';
- result = result.replace(j, j+1, Character.toString(rotor.charAt(pos)));
- }
- }
- return result.toString();
- }
- private static String decode(String message, int pseudoRandomNumber, List<String> rotors) {
- StringBuilder result = new StringBuilder();
- result.append(message);
- for (int i = rotors.size()-1; i >= 0; i--) {
- String rotor = rotors.get(i);
- for (int j = 0; j < result.length(); j++) {
- Integer pos = rotor.indexOf(result.charAt(j));
- Character c = (char) ('A' + pos);
- result = result.replace(j, j+1, Character.toString(c));
- }
- }
- for (int i = 0; i < result.length(); i++) {
- Character c = (char) ((((result.charAt(i) - 'A') - pseudoRandomNumber - i) % (('Z'-'A') + 1)) + 'A');
- int x = (((result.charAt(i) - 'A') - pseudoRandomNumber - i) % (('Z'-'A') + 1));
- if (x < 0) {
- x = 'Z' + x+1;
- } else {
- x += 'A';
- }
- result = result.replace(i, i+1, Character.toString((char) x));
- }
- return result.toString();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement