Advertisement
MaksNew

Untitled

Feb 20th, 2022
719
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.60 KB | None | 0 0
  1. package com.company;
  2.  
  3. import java.util.Locale;
  4. import java.util.Scanner;
  5.  
  6. public class RotatingLattice {
  7.  
  8.     private static char [][] charMatrix;
  9.  
  10.     public static void rotatingLatticeChiper(String text){
  11.         System.out.println("\n\tМетод поворачивающейся решетки\nВведите размер решетки (четное число): ");
  12.         Scanner scanner = new Scanner(System.in);
  13.         int n;
  14.         boolean flag = true;
  15.         while (flag)
  16.         {
  17.             n = scanner.nextInt();
  18.             if (n % 2 != 0 || n*n < text.length())
  19.             {
  20.                 System.out.println("Данные введены неверно!\nПовторите попытку: ");
  21.             }
  22.             else
  23.             {
  24.                 flag = false;
  25.                 String upperText = text.toUpperCase(Locale.ROOT);
  26.                 upperText = upperText.replace(" ", "");
  27.                 int[][] lattice = latticeInput(n);
  28.  
  29.                 String encryption = rotatingLatticeEncrypt(upperText, n, lattice);
  30.                 System.out.println("Шифрование: " + encryption);
  31.                 System.out.println("Дешифрование: " + rotatingLatticeDecrypt(encryption, n, lattice));
  32.             }
  33.         }
  34.     }
  35.  
  36.     private static int[][] rotateMatrix (int[][] matrix) {
  37.         int SIDE = matrix.length;
  38.         int[][] resMatrix = new int[SIDE][SIDE];
  39.  
  40.         for (int i = 0; i < SIDE; i++) {
  41.             for (int j = 0; j < SIDE; j++) {
  42.                 resMatrix[i][j] = matrix[SIDE - j - 1][i];
  43.             }
  44.         }
  45.         return resMatrix;
  46.     }
  47.  
  48.     private static char[][] rotateMatrix (char[][] matrix) {
  49.         int SIDE = matrix.length;
  50.         char[][] resMatrix = new char[SIDE][SIDE];
  51.  
  52.         for (int i = 0; i < SIDE; i++) {
  53.             for (int j = 0; j < SIDE; j++) {
  54.                 resMatrix[i][j] = matrix[SIDE - j - 1][i];
  55.             }
  56.         }
  57.         return resMatrix;
  58.     }
  59.  
  60.     private static int[][] latticeInput(int n) {
  61.         int boolLattice[][] = new int[n][n];
  62.         int numbLattice[][] = new int[n][n];
  63.         Scanner scanner = new Scanner(System.in);
  64.  
  65.         for (int i = 0; i < n; i++)                 //Инициализация матриц
  66.             for (int j = 0; j < n; j++)
  67.             {
  68.                 boolLattice[i][j] = 0 ;
  69.                 numbLattice[i][j] = 0 ;
  70.             }
  71.  
  72.         for (int turnCount = 0; turnCount < 4 ; turnCount++) {    //Заполнение матрицы цифрами
  73.             int number = 1 ;
  74.             for (int i = 0; i < n / 2; i++)
  75.                 for (int j = 0; j < n / 2; j++) {
  76.                     numbLattice[i][j] = number;
  77.                     number++ ;
  78.                 }
  79.             numbLattice = rotateMatrix(numbLattice);
  80.         }
  81.  
  82.         for (int i = 0; i < n; i++) {                           //Вывод цифровой матрицы
  83.             for (int j = 0; j < n; j++) {
  84.                 System.out.print(numbLattice[i][j] + " ");
  85.             }
  86.             System.out.println();
  87.         }
  88.  
  89.         for (int i = 0; i < (n/2)*(n/2); i++) {                 //"Вырезание отверстий" в логической матрице
  90.             boolean flag = true;
  91.             while (flag)
  92.             {
  93.                 System.out.println("Введите координаты отверстия для " + (i+1) + " (0-3):");
  94.                 System.out.print("x: ");
  95.                 int x = scanner.nextInt();
  96.                 System.out.print("y: ");
  97.                 int y = scanner.nextInt() ;
  98.                 if (numbLattice[x][y] == (i + 1))
  99.                 {
  100.                     boolLattice[x][y] = 1;
  101.                     flag = false;
  102.                 }
  103.                 else {
  104.                     System.out.println("Данные введены неверно!");
  105.                 }
  106.             }
  107.         }
  108.         return boolLattice;
  109.     }
  110.  
  111.     private static String rotatingLatticeEncrypt(String text, int n, int[][] lattice){
  112.  
  113.         charMatrix = new char[n][n];
  114.  
  115.         for (int i = 0; i < n ; i++)                            //Заполнение матрицы рандомными символами
  116.             for(int j = 0 ; j < n ; j++)
  117.                 charMatrix[i][j] = (char) ((int)(Math.random() * 26) + 'A') ;
  118.  
  119.         int index = 0;
  120.  
  121.         for (int turnCount = 0; turnCount < 4; turnCount++){        //Заполнение матрицы символами исходной строки
  122.             if (index <= text.length())
  123.             {
  124.                 for (int i = 0; i < n; i++)
  125.                     for (int j = 0; j < n; j++)
  126.                     {
  127.                         if (lattice[i][j] == 1)
  128.                         {
  129.                             if (index < text.length()) {
  130.                                 charMatrix[i][j] = text.charAt(index);
  131.                             }
  132.                             if (index == text.length()) {
  133.                                 charMatrix[i][j] = '0';
  134.                             }
  135.                             index++ ;
  136.                         }
  137.                     }
  138.             }
  139.             lattice = rotateMatrix(lattice);                //Вращение решетки
  140.         }
  141.  
  142.         String resultText = "";                             //Чтение матрицы по строкам
  143.         for (int i = 0 ; i < n; i++)
  144.             for (int j = 0 ; j < n; j++)
  145.                 resultText = resultText + charMatrix[i][j];
  146.  
  147.         return resultText;
  148.     }
  149.  
  150.  
  151.     private static String rotatingLatticeDecrypt(String text, int n, int[][] lattice){
  152.  
  153.         charMatrix = new char[n][n];
  154.  
  155.         int index = 0;
  156.         for (int i = 0; i < n; i++)                         //Заполнение матрицы по строкам
  157.             for (int j = 0; j < n; j++)
  158.             {
  159.                 charMatrix[i][j] = text.charAt(index);
  160.                 index++;
  161.             }
  162.  
  163.         String resultText = "";
  164.  
  165.         for (int turnCount = 0; turnCount < 4; turnCount++)     //Чтение исходной строки с помощью решетки
  166.         {
  167.             for (int i = 0; i < n; i++)
  168.                 for (int j = 0; j < n; j++)
  169.                 {
  170.                     if (lattice[i][j] == 1)
  171.                     {
  172.                         resultText = resultText + charMatrix[i][j];
  173.                     }
  174.                 }
  175.             lattice = rotateMatrix(lattice);                //Вращение решетки
  176.         }
  177.  
  178.         return resultText.substring(0,resultText.indexOf('0'));
  179.     }
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement