Advertisement
Guest User

Untitled

a guest
Apr 4th, 2020
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 16.78 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. void przesun_wirnik_do_pozycji(int* array1, int* array2, int position, int array_size) {
  6.     int temp1 = 0;
  7.     int temp2 = 0;
  8.     for (int i = 0; i < position - 1; i++) {
  9.         temp1 = array1[0];
  10.         temp2 = array2[0];
  11.         for (int j = 0; j < array_size; j++) {
  12.             array1[j] = array1[j + 1];
  13.             array2[j] = array2[j + 1];
  14.         }
  15.         array1[array_size - 1] = temp1;
  16.         array2[array_size - 1] = temp2;
  17.     }
  18. }
  19.  
  20. int znajdz_index(int* array, int* index, int znajdz, int size) {
  21.     for (int i = 0; i < size; i++) {
  22.         if (array[i] == znajdz) {
  23.             *index = i;
  24.             break;
  25.         }
  26.     }
  27.     return *index;
  28. }
  29.  
  30. int main() {
  31.     //alfabet
  32.     int alfabet;
  33.     scanf("%d", &alfabet);
  34.     //tablica alfabetu
  35.     int* ile_alfabet = (int*)calloc(alfabet, sizeof(int));
  36.     int* ile_alfabet_dla_wirnika = (int*)calloc(alfabet, sizeof(int));
  37.     for (int i = 0; i < alfabet; i++) {
  38.         ile_alfabet[i] = i + 1;
  39.         ile_alfabet_dla_wirnika[i] = i + 1;
  40.     }
  41.     //wirniki_w_maszynie
  42.     int ile_wirnikow_w_maszynie;
  43.     scanf("%d", &ile_wirnikow_w_maszynie);
  44.    
  45.     //deklaracja tablicy na wirniki_w_maszynie
  46.     int** wirniki_w_maszynie = (int**)calloc(ile_wirnikow_w_maszynie, sizeof(*wirniki_w_maszynie));
  47.     for (int i = 0; i < ile_wirnikow_w_maszynie; i++) {
  48.         wirniki_w_maszynie[i] = (int*)calloc(alfabet, sizeof(wirniki_w_maszynie[0]));
  49.     }
  50.     //deklaracja tablicy na notche
  51.     int** wirniki_w_maszynie_notche = (int**)calloc(ile_wirnikow_w_maszynie,sizeof(*wirniki_w_maszynie_notche));
  52.     for (int i = 0; i < ile_wirnikow_w_maszynie; i++) {
  53.         wirniki_w_maszynie_notche[i] = (int*)calloc(alfabet,sizeof(wirniki_w_maszynie_notche[0]));
  54.     }
  55.    
  56.     //wczytywanie wirników
  57.     for (int i = 0; i < ile_wirnikow_w_maszynie; i++) {
  58.         //wirnik
  59.         for (int j = 0; j < alfabet; j++) {
  60.             scanf("%d", &wirniki_w_maszynie[i][j]);
  61.         }
  62.         //notche
  63.         int notche;
  64.         scanf("%d", &notche);
  65.         if (notche != 0) {
  66.             for (int j = 0; j < notche; j++) {
  67.                 int notch;
  68.                 scanf("%d", &notch);
  69.                 wirniki_w_maszynie_notche[i][notch - 1] = 1;
  70.             }
  71.         }
  72.     }
  73.    
  74.     //reflektory_w_maszynie
  75.     int ile_reflektorow;
  76.     scanf("%d", &ile_reflektorow);
  77.    
  78.     //deklaracja tablicy na wirniki_w_maszynie
  79.     int** reflektory_w_maszynie = (int**)calloc(ile_reflektorow, sizeof(*reflektory_w_maszynie));
  80.     for (int i = 0; i < ile_reflektorow; i++) {
  81.         reflektory_w_maszynie[i] = (int*)calloc(alfabet, sizeof(reflektory_w_maszynie[0]));
  82.     }
  83.     //wczytywanie wirników
  84.     for (int i = 0; i < ile_reflektorow; i++) {
  85.         for (int j = 0; j < alfabet; j++) {
  86.             scanf("%d", &reflektory_w_maszynie[i][j]);
  87.         }
  88.     }
  89.    
  90.     int zadania;
  91.     scanf("%d", &zadania);
  92.     for (int a = 0; a < zadania; a++) {
  93.         //trzeba zrobic tablice wirnikow dla zadania
  94.         int ile_wirnikow_koduje;
  95.         scanf("%d", &ile_wirnikow_koduje);
  96.         int* ustawienia_zadan = (int*)calloc((ile_wirnikow_koduje * 2) + 1, sizeof(int));
  97.         for (int i = 0; i < (ile_wirnikow_koduje * 2) + 1; i++) {
  98.             scanf("%d", &ustawienia_zadan[i]);
  99.         }
  100.         //i wybrac reflektor do zadania
  101.         int* wybrany_reflektor = (int*)calloc(alfabet, sizeof(int));
  102.         int ktory_reflektor = ustawienia_zadan[(ile_wirnikow_koduje * 2)];
  103.         for (int i = 0; i < alfabet; i++) {
  104.             wybrany_reflektor[i] = reflektory_w_maszynie[ktory_reflektor][i];
  105.         }
  106.        
  107.         switch (ile_wirnikow_koduje) {
  108.             case 1: {
  109.                 for (int i = 0; i < alfabet; i++) {
  110.                     ile_alfabet_dla_wirnika[i] = i + 1;
  111.                 }
  112.                 int* tablica_wirnikow = (int*)calloc(alfabet, sizeof(int));
  113.                 int ktory_wirnik = ustawienia_zadan[(ile_wirnikow_koduje - 1)];
  114.                 for (int i = 0; i < ile_wirnikow_koduje; i++) {
  115.                     for (int j = 0; j < alfabet; j++) {
  116.                         tablica_wirnikow[j] = wirniki_w_maszynie[ktory_wirnik][j];
  117.                     }
  118.                 }
  119.                 //odpowiednio je przesunac - zmiana
  120.                 if (ustawienia_zadan[1]%alfabet!=0) {
  121.                     przesun_wirnik_do_pozycji(tablica_wirnikow,ile_alfabet_dla_wirnika, ustawienia_zadan[1], alfabet);
  122.                     przesun_wirnik_do_pozycji(tablica_wirnikow, ile_alfabet_dla_wirnika, 2, alfabet);
  123.                 }
  124.                
  125.                
  126.                 //i potem kodowac po kolei litery
  127.                 int input;
  128.                 scanf("%d", &input);
  129.                 int index = 0;
  130.                 while (input != 0) {
  131.                     //szyfrowanie - kodowanie liter
  132.                     //1.wchodzi liczba - znajduje jej indeks w alfabecie
  133.                     input = tablica_wirnikow[input-1];
  134.                     //2.szukam indeksu w alfabecie wirnika z tą liczbą
  135.                     znajdz_index(ile_alfabet_dla_wirnika, &index, input, alfabet);
  136.                     input = wybrany_reflektor[index];
  137.                     //3.szukam w alfabecie index z tą wartością
  138.                     znajdz_index(ile_alfabet, &index, input, alfabet);
  139.                     input = ile_alfabet_dla_wirnika[index];
  140.                     //4.szukam indexu wirnika z ta wartoscią
  141.                     znajdz_index(tablica_wirnikow, &index, input, alfabet);
  142.                     input = ile_alfabet[index];
  143.                    
  144.                     printf("%d", input);
  145.                     printf(" ");
  146.                     przesun_wirnik_do_pozycji(tablica_wirnikow, ile_alfabet_dla_wirnika, 2, alfabet);
  147.                     scanf("%d", &input);
  148.                 }
  149.                 printf("\n");
  150.                 //in ilosc wirnikow
  151.                 //in numer wirnika i ustawienie parami tyle razy ile wirnikow
  152.                 //in numer reflektora
  153.                 //in literka
  154.                 //zwalnianie pamieci
  155.                 free(tablica_wirnikow);
  156.                 break;
  157.             }
  158.                
  159.             case 2: {
  160.                 int* tablica_wirnikow1 = (int*)calloc(alfabet, sizeof(int));
  161.                 int* tablica_wirnikow2 = (int*)calloc(alfabet, sizeof(int));
  162.                 int ktory_wirnik1 = ustawienia_zadan[0];
  163.                 int ktory_wirnik2 = ustawienia_zadan[2];
  164.                 for (int i = 0; i < alfabet; i++) {
  165.                     tablica_wirnikow1[i] = wirniki_w_maszynie[ktory_wirnik1][i];
  166.                     tablica_wirnikow2[i] = wirniki_w_maszynie[ktory_wirnik2][i];
  167.                 }
  168.                 int* ile_alfabet_dla_wirnika1 = (int*)calloc(alfabet, sizeof(int));
  169.                 for (int i = 0; i < alfabet; i++) {
  170.                     ile_alfabet_dla_wirnika[i] = i + 1;
  171.                     ile_alfabet_dla_wirnika1[i] = i + 1;
  172.                 }
  173.                 //odpowiednio je przesunac - zmiana
  174.                 przesun_wirnik_do_pozycji(tablica_wirnikow1, ile_alfabet_dla_wirnika, ustawienia_zadan[1], alfabet);
  175.                 przesun_wirnik_do_pozycji(tablica_wirnikow1, ile_alfabet_dla_wirnika, 2, alfabet);
  176.                 przesun_wirnik_do_pozycji(tablica_wirnikow2, ile_alfabet_dla_wirnika1, ustawienia_zadan[3], alfabet);
  177.                 int pozycja_wirnika = (ustawienia_zadan[1]) % alfabet;
  178.                
  179.                 //sprawdzam notche
  180.                 bool sa_notche = false;
  181.                 bool pozycja = false;
  182.                 for (int i = 0; i < alfabet; i++) {
  183.                     if (wirniki_w_maszynie_notche[ktory_wirnik1][i] != 0) {
  184.                         sa_notche = true;
  185.                         break;
  186.                     }
  187.                 }
  188.                
  189.                 //i potem kodowac po kolei litery
  190.                 int input;
  191.                 scanf("%d", &input);
  192.                 int index = 0;
  193.                 while (input != 0) {
  194.                     //szyfrowanie - kodowanie liter
  195.                     //1.wchodzi liczba - znajduje jej indeks w alfabecie
  196.                     input = tablica_wirnikow1[input-1];
  197.                     //2.szukam indeksu w alfabecie wirnika1 z tą liczbą
  198.                     znajdz_index(ile_alfabet_dla_wirnika, &index, input, alfabet);
  199.                     input = tablica_wirnikow2[index];
  200.                     //3.szukam indeksu w alfabecie wirnika2 z tą liczbą
  201.                     znajdz_index(ile_alfabet_dla_wirnika1, &index, input, alfabet);
  202.                     input = wybrany_reflektor[index];
  203.                     //4.szukam w alfabecie index z tą wartością
  204.                     znajdz_index(ile_alfabet, &index, input, alfabet);
  205.                     input = ile_alfabet_dla_wirnika1[index];
  206.                     //5.szukam indeksu wirnika2 z tą liczbą
  207.                     znajdz_index(tablica_wirnikow2, &index, input, alfabet);
  208.                     input = ile_alfabet_dla_wirnika[index];
  209.                     //6.szukam indexu wirnika1 z ta wartoscią
  210.                     znajdz_index(tablica_wirnikow1, &index, input, alfabet);
  211.                     input = ile_alfabet[index];
  212.                    
  213.                     printf("%d", input);
  214.                     printf(" ");
  215.                     przesun_wirnik_do_pozycji(tablica_wirnikow1, ile_alfabet_dla_wirnika, 2, alfabet);
  216.                     pozycja_wirnika = (pozycja_wirnika + 1) % alfabet;
  217.                     for(int i=0; i<alfabet; i++) {
  218.                         if(pozycja_wirnika == i && wirniki_w_maszynie_notche[ktory_wirnik1][i]!=0) {
  219.                             pozycja = true;
  220.                             break;
  221.                         }
  222.                     }
  223.                     if (sa_notche == true && pozycja == true) {
  224.                         przesun_wirnik_do_pozycji(tablica_wirnikow2, ile_alfabet_dla_wirnika1, 2, alfabet);
  225.                         pozycja = false;
  226.                     }
  227.                     scanf("%d", &input);
  228.                 }
  229.                 printf("\n");
  230.                 //in ilosc wirnikow
  231.                 //in numer wirnika i ustawienie parami tyle razy ile wirnikow
  232.                 //in numer reflektora
  233.                 //in literka
  234.                 //zwalnianie pamieci
  235.                 free(tablica_wirnikow1);
  236.                 free(tablica_wirnikow2);
  237.                 free(ile_alfabet_dla_wirnika1);
  238.                 break;
  239.             }
  240.                
  241.             default: {
  242.                 int** tablica_wirnikow = (int**)calloc(ile_wirnikow_koduje, sizeof(*tablica_wirnikow));
  243.                 int** alfabet_dla_wirnika = (int**)calloc(ile_wirnikow_koduje, sizeof(*alfabet_dla_wirnika));
  244.                 int* ktory_wirnik = (int*)calloc(ile_wirnikow_koduje, sizeof(int));
  245.                 for (int i = 0; i < ile_wirnikow_koduje; i++) {
  246.                     tablica_wirnikow[i] = (int*)calloc(alfabet, sizeof(tablica_wirnikow[0]));
  247.                     alfabet_dla_wirnika[i] = (int*)calloc(alfabet, sizeof(alfabet_dla_wirnika[0]));
  248.                     ktory_wirnik[i] = ustawienia_zadan[i * 2];
  249.                 }
  250.                 for (int i = 0; i < ile_wirnikow_koduje; i++) {
  251.                     for (int j = 0; j < alfabet; j++) {
  252.                         tablica_wirnikow[i][j] = wirniki_w_maszynie[ktory_wirnik[i]][j];
  253.                         alfabet_dla_wirnika[i][j] = j + 1;
  254.                     }
  255.                 }
  256.                 //odpowiednio je przesunac - zmiana
  257.                 for (int i = 0; i < ile_wirnikow_koduje; i++) {
  258.                     przesun_wirnik_do_pozycji(tablica_wirnikow[i], alfabet_dla_wirnika[i], ustawienia_zadan[2 * i + 1], alfabet);
  259.                 }
  260.                
  261.                
  262.                 int pozycja_wirnika = (ustawienia_zadan[1]) % alfabet;
  263.                 int pozycja_wirnika1 = (ustawienia_zadan[3] - 1) % alfabet;
  264.                
  265.                 //sprawdzam notche
  266.                 bool sa_notche = false;
  267.                 bool pozycja = false;
  268.                 for (int i = 0; i < alfabet; i++) {
  269.                     if (wirniki_w_maszynie_notche[ktory_wirnik[0]][i] != 0) {
  270.                         sa_notche = true;
  271.                         break;
  272.                     }
  273.                 }
  274.                 bool obrot = false;
  275.                 bool obrot0 = false;
  276.                 //sprawdzam nowe notche
  277.                 bool sa_notche1 = false;
  278.                 bool pozycja1 = false;
  279.                 for (int i = 0; i < alfabet; i++) {
  280.                     if (wirniki_w_maszynie_notche[ktory_wirnik[1]][i] != 0) {
  281.                         sa_notche1 = true;
  282.                         break;
  283.                     }
  284.                 }
  285.                 //i potem kodowac po kolei litery
  286.                 int input;
  287.                 scanf("%d", &input);
  288.                 int index = 0;
  289.                 while (input != 0) {
  290.                     for(int i=0; i<alfabet; i++) {
  291.                         if(pozycja_wirnika == i && wirniki_w_maszynie_notche[ktory_wirnik[0]][i]!=0) {
  292.                             pozycja = true;
  293.                             break;
  294.                         }
  295.                     }
  296.                     for(int i=0; i<alfabet; i++) {
  297.                         if(pozycja_wirnika1+1 == i && wirniki_w_maszynie_notche[ktory_wirnik[1]][i]!=0) {
  298.                             pozycja1 = true;
  299.                             break;
  300.                         }
  301.                     }
  302.                     if (sa_notche == true && sa_notche1 == true && pozycja1 == true && obrot == true) {
  303.                         przesun_wirnik_do_pozycji(tablica_wirnikow[2], alfabet_dla_wirnika[2], 2, alfabet);
  304.                         przesun_wirnik_do_pozycji(tablica_wirnikow[1], alfabet_dla_wirnika[1], 2, alfabet);
  305.                         przesun_wirnik_do_pozycji(tablica_wirnikow[0], alfabet_dla_wirnika[0], 2, alfabet);
  306.                         pozycja_wirnika = (pozycja_wirnika + 1) % alfabet;
  307.                         pozycja_wirnika1 = (pozycja_wirnika1 + 1) % alfabet;
  308.                         pozycja1 = false;
  309.                     } else if (sa_notche == true && pozycja == true && obrot0 == true) {
  310.                         przesun_wirnik_do_pozycji(tablica_wirnikow[1], alfabet_dla_wirnika[1], 2, alfabet);
  311.                         pozycja_wirnika1 = (pozycja_wirnika1 + 1) % alfabet;
  312.                         przesun_wirnik_do_pozycji(tablica_wirnikow[0], alfabet_dla_wirnika[0], 2, alfabet);
  313.                         pozycja_wirnika = (pozycja_wirnika + 1) % alfabet;
  314.                         obrot = true;
  315.                         pozycja = false;
  316.                     } else {
  317.                         przesun_wirnik_do_pozycji(tablica_wirnikow[0], alfabet_dla_wirnika[0], 2, alfabet);
  318.                         pozycja_wirnika = (pozycja_wirnika + 1) % alfabet;
  319.                         obrot0 = true;
  320.                     }
  321.                     pozycja = false;
  322.                     pozycja1 = false;
  323.                     //szyfrowanie - kodowanie liter
  324.                     //1.wchodzi liczba - znajduje jej indeks w alfabecie
  325.                     index=input-1;
  326.                     for (int i = 0; i < ile_wirnikow_koduje; i++) {
  327.                         input = tablica_wirnikow[i][index];
  328.                         //2.szukam indeksu w alfabecie wirnika[i] z tą liczbą
  329.                         znajdz_index(alfabet_dla_wirnika[i], &index, input, alfabet);
  330.                     }
  331.                     input = wybrany_reflektor[index];
  332.                     //5.szukam w alfabecie index z tą wartością
  333.                     znajdz_index(ile_alfabet, &index, input, alfabet);
  334.                     for (int i = ile_wirnikow_koduje - 1; i >= 0; i--) {
  335.                         input = alfabet_dla_wirnika[i][index];
  336.                         //2.szukam indeksu wirnika[i] z tą liczbą
  337.                         znajdz_index(tablica_wirnikow[i], &index, input, alfabet);
  338.                     }
  339.                     input = ile_alfabet[index];
  340.                    
  341.                     printf("%d", input);
  342.                     printf(" ");
  343.                    
  344.                     scanf("%d", &input);
  345.                 }
  346.                 printf("\n");
  347.                 //in ilosc wirnikow
  348.                 //in numer wirnika i ustawienie parami tyle razy ile wirnikow
  349.                 //in numer reflektora
  350.                 //in literka
  351.                 //zwalnianie pamieci
  352.                 free(ktory_wirnik);
  353.                 free(tablica_wirnikow);
  354.                 free(alfabet_dla_wirnika);
  355.                 break;
  356.             }
  357.         }
  358.         //zwalnianie pamieci
  359.         free(ustawienia_zadan);
  360.         free(wybrany_reflektor);
  361.     }
  362.    
  363.     //zwalnianie pamieci - free
  364.     free(ile_alfabet);
  365.     free(ile_alfabet_dla_wirnika);
  366.     free(wirniki_w_maszynie);
  367.     free(wirniki_w_maszynie_notche);
  368.     free(reflektory_w_maszynie);
  369.    
  370.     return 0;
  371. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement