🟡 Կեսարի գաղտնագրում

Uijt ufyu jt fodszqufe cz dbftbs djqifs. Uif lfz jt 1!
Վերևում գրված անգլերեն տեքստը չի պարունակում ոչ մի իմաստային բառ։ Բայց ոչ, սա սխալմունք չէ, իրականում այս տեքստը գաղտնագրված է 👽 !!։ Որպեսզի կարողանաք վերականգնել օրիգինալ տեքստը, հարկավոր է իմանալ, թե ի՞նչ եղանակով է տեղի ունեցել գաղտնագրումը։ Կարող ե՞ք ինքնուրույն գուշակել գաղտնագրման եղանակը, ապակոդավորել տողը և վերականգնել օրիգինալ տեքստը 🤖։
Եթե ընդհանրապես ծանոթ չեք գաղտնագրման մեթոդներին, գուցե ձեզ դժվար լինի միանգամից ապակոդավորել տողը։ Այս հուշումները կօգնեն ձեզ։

Հուշում 1

Գաղտնագրման ժամանակ այբուբենի ամեն տառը փոխարինվել է մեկ այլ տառով։ Օրինակ այս տեքստում բոլոր a տառերը փոխարինվել են b տառով։ Իսկ t տառերը փոխարինվել է u տառով։ Եվս մեկ անգամ նայե՛ք անգլերեն այբուբենի տառերին, և օգտագործելով այս ինֆորմացիան փորձեք գտնել տառերի փոխարինման օրինաչափություն։

Հուշում 2

Փոխարինումը պատահական չէ։ Իրականում ամեն մի տառը տեղաշարժվել է նույն, ֆիքսած թվով։ Եթե a-ն փոխարինվել է b-ով, t-ն փոխարինվել է u-ով, կարող ենք ենթադրել, որ գաղտնագրման ժամանակ այբուբենի ամեն տառը տեղաշարժվել է 1-ով։
Գաղտնագրման ժամանակ այբուբենի ամեն տառը տեղաշարժվել է 1-ով։
Գաղտնագրման ժամանակ այբուբենի ամեն տառը տեղաշարժվել է 1-ով։
 
Դե ինչ, հուսով եմ հուշումները օգնեցին ձեզ ապակոդավորել տողը։ Եթե ոչ, եկեք միասին փորձենք ապակոդավորել այն։ Գաղտնագրման ժամանակ այբուբենի ամեն տառը տեղաշարժվել է դեպի աջ 1 դիրքով։ Սա նշանակում է, որ տողում բոլոր a (A) տառերը փոխարինվել են b (B) -ով, բոլոր b (B) տառերը փոխարինվել են c (C) -ով, d տառերը e -ով և այդպես շարունակ։
Սկզբնական տեքստը վերականգնելու համար մեզ մնում է միայն տեքստի տառերը 1 դիրքով տեղաշարժել հակառակ ուղղությամբ։ Բացենք անգլերեն այբուբենը և գաղտնագրված տողում տառերը հերթով փոխարինենք իրենցից մեկ դիրքով ձախ գտնվող տառերով՝ U → T, i → h, j → i, t → s և այսպես շարունակ։
 
notion image
Բոլոր տառերը փոխարինելուց հետո կստանանք ապակոդավորված տողը 🦾։
Uijt ufyu jt fodszqufe cz dbftbs djqifs. Uif lfz jt 1!
This text is encrypted by caesar cipher. The key is 1!
Գաղտնագրման այս եղանակը հայտնի է Կեսարի գաղտնագրում անունով, քանի որ այն լայնորեն կիրառել է Հուլիոս Կեսարի կողմից գաղտնի նամակները ծածկագրելու համար։ Ի տարբերություն այս օրինակի, Կեսարը հիմնականում օգտագործում էր տեղաշարժ 3-ով։ Սա նշանակում է, որ A տառը փոխարինվում է D-ով, B տառը փոխարինվում է E-ով, C տառը F-ով և այդպես շարունակ։ Այս սկզբունքով HELLO բառը գաղտնագրելուց հետո կստանանք KHOOR տողը։
Նամակի հասցեատերը ծածկագրած նամակի հետ միասին ստանում էր նաև օգտագործած տեղաշարժի թիվը (այսուհետ այդ թիվը կանվանենք բանալի)։ Նամակը վերականգնելու համար հարկավոր է ուղղակի տեղաշարժել տառերը նույն քանակով, բայց հակառակ ուղղությամբ։ Իհարկե, ժամանակակից աշխարհում այսպիսի գաղտնագրումը այդքան էլ ապահով չէ։ Բայց մ.թ.ա 100 թվականին այս գաղտնագրումը, երևի թե համարվում էր չափազանց ապահով։

Դե ինչ, եկե՛ք նախագծենք և իրականացնենք ծրագիր, որը օգտագործողից պահանջում է մուտքագրել տող և գաղտնագրման բանալի և էկրանին տպում է գաղտնագրված տողը։

Եկե՛ք մի քիչ ավելի մանրամասն ուսումնասիրենք ալգորիթմը։
  1. Եթե որպես բանալի ընտրել ենք 3 թիվը, ապա A(a) տառը կփոխարինվի D(d) տառով։ Իսկ ի՞նչ տառով կփոխարինվեն այբուբենի վերջին 3՝ X, Y, Z տառերը։ X տառը կփոխարինվի A-ով, YB-տառով, Z տառը C-ով։ Այսինքն այբուբենի վերջին տառերը փոխարինվում են առաջին տառերով և այսպես շարունակ։
notion image
  1. Որպես բանալի կարող ենք ընտրել կամայական թիվ։ Անգլերեն այբուբենը ունի 26 տառ։ Եթե որպես բանալի ընտրենք 25 թիվը, ապա գաղտնագրումից հետո a տառին կհամապատասխանի z տառը։ Եթե ընտրենք 26 թիվը, a -ին նորից կհամապատասխանի a տառը։ Եթե ընտրենք 27 թիվը, a տառին կհամապատասխանի b-ն և այսպես շարունակ։
  1. Ալգորիթմը մեծատառ տառերը փոխարինում է համապատասխան մեծատառով, փոքրատառերը՝ փոքրատառերով (HELLOKHOOR, hellokhoor
  1. Թվերը և հատուկ սիմվոլները չեն գաղտնագրվում (HE LLO!KH OOR!
  1. Պարզության համար ընդունենք, որ մուտքագրված բանալին պետք է լինի ոչ բացասական թիվ։
  1. Ծրագրի օգտագործումը պարզ դարձնելու համար, մուտքագրված տեքստը և բանալին անհրաժեշտ է տպել էկրանին հետևյալ ֆորմատով՝
    1. “plaintext: ”։ այնուհետև օգտագործողի մուտքագրած տողը։
    2. “key: ” այնուհետև մուտքագրած բանալու արժեքը։
  1. Գաղտնագրված տողը պետք է տպել էկրանին հետևյալ ֆորմատով՝
    1. “ciphertext: ” այնուհետև գաղտնագրված տողը։ 
 

Հուշում 1

Վերհիշեք բառախաղ խնդրի լուծումը։

Հուշում 2

Փորձեք համարակալել այբուբենի տառերը 0-ից 25.
notion image
Եթե օրինակ, բանալին հավար է 2, Z տառը կոդվելու համար պետք է օգտագործել այս բանաձևը՝ (25+2)%26 == 1 (B)։ Այս բանաձևը ճիշտ է բոլոր տառերի և բանալու արժեքների համար։ Օրինակ, եթե բանալին հավասար է 30, A տառը կկոդավորվի (0+30)%26 == 4 → E- տառով։

Հուշում 3

Ինչպես և Բառախաղ խնդրի դեպքում, այստեղ ևս փորձեք «արտապատկերել» ASCII աղյուսակը վերևում պատկերված աղյուսակին (65→0, 66→1, 67→3 և այլն)։
notion image
 

Ծրագրավորման ոճ

Խնդիրը գրելուց առաջ, ևս մեկ անգամ կարդացեք “Ծրագրավորման ոճ” դասը։ Մի՛ գրեք ամբողջ ծրագիրը մեկ main ֆունկցիայի մեջ։ Մտածեք, թե ի՞նչ տրամաբանական հատվածների (ֆունկցիաների) է կարելի բաժանել ծրագիրը, որպեսզի կոդը լինի հնարավորինս ընթեռնելի։ Ֆունկցիաներ գրելիս, փորձեք պահպանել «եզակի պատասխանատվության» (single responsobility) սկզբունքը։ Օգտագործե’ք մտածված և իմաստային անուններ և՛ փոփխականների և՛ ֆունկցիաների համար։

Constraints

Time limit: 0.2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue