Désolé pour mon anglais, j'ai fait de mon mieux.

J'ai ce code clé: "M O N C L E T A B D F G H I J K P Q R S U V W X Y Z"

Et ce message: "Les poissons sont des oiseaux sans ailes et les oiseaux sont des poissons sans nageoires"

Globalement mon programme code le message à regrouper par paires de deux et le nouveau message est "FISHXAREXBIRDSXWITHOUTXWINGSXANDXBIRDSXAREXFISHXWITHOUTXFINS"

Donc fondamentalement, chaque deux lettres sont un tableau, comme "FI" est le message [0]; etc...

Les espaces sont remplacés par "X"

Le problème au niveau de mon code est que j'essaie de comprendre l'index de chaque lettre par paire de deux dans le message, puis à partir de là, le deuxième caractère de chaque paire de deux est toujours décalé vers le bon compagnon et le premier caractère est toujours décalé vers le compagnon de gauche

Donc si j'ai FI, je devrais être traduit vers le compagnon droit de celui-ci ("I" dans le keyCode) et F devrait être traduit vers le compagnon gauche de celui-ci ("F" dans le keyCode) "

Dans l'ensemble, je devrais finir de "FI" à "JD" et ainsi de suite pour le reste du message encodé

C'est aussi la partie la plus délicate de celui-ci, Z a également la contrainte droite qui est "M et" M a une gauche faite de "Z"

Edit: si cela n'a pas de sens, tout ce que je veux, c'est déplacer les caractères du message vers la droite ou la gauche en fonction de la règle keyCode.

Edit2: a publié mon code actuel.

    import java.util.Scanner;
class pairwiseCipher
{
  public static void main(String[] args){

    System.out.println("");
    char[] keyCode;              
    keyCode = key();



    System.out.println("");


    String[] message;
    message = message();
    System.out.println(message);








    String encodedMessage;
    encodedMessage = encodedMessage(message,keyCode);
  }


  public static char[] key(){
    Scanner sc = new Scanner(System.in);

    System.out.println("Please enter a key in order to perform the opertation.");
    char[] key = sc.nextLine().toUpperCase().toCharArray();
    System.out.print("Keycode with alphabet: ");
    for (int i = 0; i < key.length ; i++){
      System.out.printf("%2c",key[i]);
    }

    char[] alphabet ="ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();

    for (int i = 0; i<alphabet.length ; i++){

      System.out.printf("%2s",alphabet[i]);
    }
    System.out.println("");



    char[] keyTotalLength = new char[key.length + alphabet.length];
    int index = 0;
    // Add all unique chars from firstString
    for (char c : key) {
      if (! contains(keyTotalLength, index, c)) {
        keyTotalLength[index++] = c;
      }
    }
    // Add all unique chars from secondString
    for (char c : alphabet) {
      if (! contains(keyTotalLength, index, c)) {
        keyTotalLength[index++] = c;
      }
    }

    char[] finalCode = new char[index];
    for (int i = 0; i < index; i++) {
      finalCode[i] = keyTotalLength[i];
    }

    System.out.println("");
    System.out.print("Scrambled Keycode: ");
    System.out.println(finalCode);
    return finalCode; //This is the Scrambled keycode
  }
  public static boolean contains(char[] in, int index, char t) {
    for (int i = 0; i < index; i++) {
      if (in[i] == t) return true;
    }
    return false;
  }










  public static String[] message(){
    Scanner sc = new Scanner(System.in);
    System.out.println("Please enter a message in order to perform the opertation.");
    String message = sc.nextLine().toUpperCase();
    message = message.replaceAll("X","ks");
    message = message.replaceAll(" ","X");
    String[] fixedMessage = message.split("(?<=\\G.{2})");
    System.out.print("The encoded Message:");
    for (int i = 0 ; i < fixedMessage.length ; i++){

      System.out.print(fixedMessage[i]);
      System.out.print(" ");



    }
    System.out.println("------------");
    System.out.println(fixedMessage[0]);
    System.out.println(fixedMessage[0].charAt(1));
    return fixedMessage;

  }



  // This method encodes the given text string using a Caesar
// cipher, shifting each letter by the rule "M O N C L E T A B D F G H I J K P Q R S U V WX Y Z"
public static void encode(String[] text, char[] shift) {
    System.out.print("The encoded message: ");
    for (int i = 0; i < text.length; i++) {
        char letter = text.charAt(i);

        // shift only letters (leave other characters alone)
        if (letter >= 'a' && letter <= 'z') {
            letter = (char) (letter + shift);

            // may need to wrap around
            if (letter > 'z') {
                letter = (char) (letter - 26);
            } else if (letter < 'a') {
                letter = (char) (letter + 26);
            }
        }
        System.out.print(letter);
    }
    System.out.println();
}





















}
0
David mark 20 avril 2017 à 17:57

3 réponses

Meilleure réponse

C'est ce que vous essayez probablement de faire !!

import java.util.ArrayList;
import java.util.List;
class pairwiseCipher{
  public static void main(String[] args){

      char[] key= {'M', 'O', 'N', 'C', 'L', 'E', 'T', 'A', 'B', 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'P', 'Q', 'R', 'S', 'U','V', 'W','X','Y','Z'};
      char[] old = null;
      char[][] neww = null;
      char[][] ans = null;
      String msg= "Fish are birds without wings and birds are fish without fins";
      msg = msg.toUpperCase();

      msg = msg.replace(' ', 'X');
      System.out.println(msg);
      old = msg.toCharArray();
      neww = new char[msg.length()/2][2];
      ans = new char[msg.length()/2][2];
      for(int i=0,j=0; i<msg.length() ; i=i+2,j+=1){
          neww [j][0] = old[i];
          neww [j][1] = old[i+1];
      }

      //this is just to display characters in pairs
      for(int j=0; j<neww.length; j++){
          System.out.print(neww[j][0]+""+neww[j][1] + " ");
      }

      System.out.println();
      List<Character> cList = new ArrayList<Character>();
      for(char c : key) {
          cList.add(c);
      }

      for(int j=0; j<neww.length; j++){

          int x = (cList.indexOf(neww[j][1]) + 1 ) == 26 ? 0 : (cList.indexOf(neww[j][1]) + 1 );
          int y = (cList.indexOf(neww[j][0]) - 1 ) == -1 ? 25 : (cList.indexOf(neww[j][0]) - 1 );

         ans[j][0] = cList.get(x);
         ans[j][1] = cList.get(y);
      }

      for(int j=0; j<ans.length; j++){
          System.out.print(ans[j][0]+""+ans[j][1] + " ");
      }
      //System.out.println(cList.get(0));

  }
}
0
Rajan Jhaveri 21 avril 2017 à 15:42

Vous pouvez créer une carte de gauche et une carte de droite en utilisant java.util.HashMap. Ensuite, pour chaque paire de caractères, vous pouvez simplement afficher rightMap.get (char2) + leftMap.get (char1).

0
phatfingers 20 avril 2017 à 16:00

Essayez le code ci-dessous pour commencer ... !!

public class Encrypter {

    public static void main(String[] args) {
        //you can take key as a space separaed string and split it into array of chars 
        char[] key= {'M', 'O', 'N', 'C', 'L', 'E', 'T', 'A', 'B', 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'P', 'Q', 'R', 'S', 'U','V', 'W','X','Y','Z'};
        char[] old = null;
        char[][] neww = null;
        String msg= "Fish are birds without wings and birds are fish without fins";

        msg = msg.replace(' ', 'X');
        System.out.println(msg);
        old = msg.toCharArray();
        neww = new char[msg.length()/2][2];
        for(int i=0; i<msg.length()/2 ; i=i+2){
            {
                neww [i][0] = old[i];
                neww [i][1] = old[i+1];
            }
        }
        //this is just to display characters in pairs
        for(int j=0; j<neww.length; j++){
            for(int k=0; k<2; k++){
                System.out.print(neww[j][k]+" ");
            }   
        }

        //Now you can write the code that replaces proper character in the message from key 
        //....
        //....
    }
}
0
R Dhaval 20 avril 2017 à 15:41