Проблема с шифрованием

92
25 сентября 2021, 18:20

Не получается выполнить задание, условие которого следующее: ТРАНСПОЗИЦИЯ С ФИКСИРОВАННЫМ ПЕРИОДОМ: В этом случае сообщение делится на группы символов длины d и к каждой группе применяется одна и та же перестановка. Эта перестановка является ключом; она может быть задана некоторой перестановкой первых d целых чисел. Таким образом, для d=5 в качестве перестановки можно взять: 23154. Это будет означать, что:m1 m2 m3 m4 m5 m6 m7 m8 m9 m10...переходит в:m2 m3 m1 m5 m4 m7 m8 m6 m10 m9

Попробую объяснить более подробно (моё понимание данной задачи): Вводится ключ, например 54231, элемент 5 становится на место 1, элемент 4 на место второго, элемент 2 на место третьего, элемент 3 на место четвёртого, элемент 1 на место пятого. То есть в данном случае строка шифруется по 5 символов (если бы ключ был, к примеру 4231, она бы шифровалась по 4 символа), когда программа доходит до 6 символа в строке, начинается следующая пятёрка, соответственно уже десятый элемент должен становится на место шестого, девятый на место седьмого, седьмой на место восьмого и так далее. У меня получилось выполнить перестановку первой пятёрки, после чего возникла ошибка, что не так, я понять не смог

Подскажите, пожалуйста, что мне нужно сделать, чтобы программа заработала.

public class Class2 {
    public static void main(String[] args) {
        String d= "I want to walk my cat";
        Class2 class2 = new Class2();
        int p = 45321; // ключ для замены элементов местами
        String sy = p+"";
        int [] mass = new int[sy.length()];
        for (int i=mass.length-1;i>=0;i--){
            mass[i]=p%10;
            p=p/10;
        }
        class2.transposal(d,mass);
    }
    private String transposal(String s,int [] key){
        char ch [] = s.toCharArray();
        String res="res";
        int st = ch.length;
        int k=0;
        int p=key.length;
        char [] mass = new char[ch.length];
        for (int i=0;i<mass.length;i++){
            mass[i]=ch[key[i]-1];
            System.out.println(mass[i]);
            k++;
            if (k>=key.length){ //возможно >=
                p+=key.length;
                if (p>=mass.length){
                    break;
                }
                for (int j=0;j<key.length;j++){
                    key[j]+=key.length;
                }
                k=0;
            }
        }
        return res;
    }
}

Программа должна шифровать целиком всю строку, а не отдельные её слова

Answer 1

Попробуйте таким способом... Обратите внимание на строку final Character charByPosition = getCharByPosition(charArray, pos-1); Дело в том, что в вашем ключе 45321 нет цифры 0, соответственно, я полагаю, что позиции в ключе нумеруются с 1, а не с 0, в то время как в массиве и коллекциях нумерация с ноля. Поэтому переменная уменьшается на 1 : pos-1. Если все таки нумерация в ключе с ноля, то стоит вместо pos-1 записать pos Удачи

public class Class2 {
    public static void main(String[] args) {        
        final String phrase = "I want to walk my cat";        
        int key = 45321; // ключ для замены элементов местами
        final String result = getCharByPosition(phrase.toCharArray(), getArrayFromInt(key));
        System.out.println(result);
    }
    private static List<Integer> getArrayFromInt(int key){
        final List<Integer> keyArray = new ArrayList();
        while (key>0){
            keyArray.add(key%10);
            key=key/10;
        }
        Collections.reverse(keyArray);
        return keyArray;
    }
    private static String getCharByPosition(char[] charArray, List<Integer> position) {
        final StringBuilder sb = new StringBuilder();
        int counter = 0;
        while (counter < charArray.length) {
            for (int pos : position) {
                final Character charByPosition = getCharByPosition(charArray, counter+pos-1);
                if (charByPosition != null) sb.append(charByPosition);
            }
            counter = counter + position.size();
        }
        return sb.toString();
    }
    private static Character getCharByPosition(char[] charArray, int position){        
        return charArray.length<=position ? null : charArray[position];
    }
}
READ ALSO
Использование нескольких баз БД в Spring Boot

Использование нескольких баз БД в Spring Boot

Вопрос такой: Как подключить несколько БД к Spring Boot?

128
LocalDate или Date

LocalDate или Date

Сколько бы примеров и полей с датами на Java я не видел, всегда (или почти всегда) используют класс DateПри этом, я думаю, всем известно, что класс...

91
WebView как браузер по умолчанию или как открывать ссылки в своём браузере

WebView как браузер по умолчанию или как открывать ссылки в своём браузере

У меня есть простой браузерМне надо чтобы в нём открывались ссылки, как например в Google Chrome

343