Programozó versenyek

DEIK Regionális Programozó Csapatverseny, középiskolai kategória, 2024. december 1.

2024. december 1. 10:00 – 2024. december 1. 15:00

Titkosítás

Amint az ajtó kitárult, kommandós osztagként hatoltatok be a terroristák titkos főhadiszállására. Ám ott megdöbbenve vettétek észre, hogy néhány pizzás dobozon és üres üdítőitalos flakonon (hey...legalább 50 forint, szóval már megérte!) kívül semmi nincs ott. A terroristák valószínűleg már napokkal korábban elhagyták a helyszínt és igyekeztek minden nyomot eltűntetni maguk után ami az esetleges új rejtekhelyükre utalna. Azonban az egyik pizzás doboz alján észrevettetek valamilyen furcsa titkosírást, mely talán segíthet a nyomozásban. A ti feladatotok lesz feltörni azt!

Input

A bemenet két, sor vége karakterrel lezárt sorból áll:

  • Az első sor egy tetszőlegesen hosszú string, mely a titkosított szöveget tartalmazza. A string az angol ABC kis- és nagybetűiből, illetve a szóköz karakterből áll (összesen 53 lehetséges karakter).
  • A második sor a már említett 53 karakterből tartalmaz 4-et, szóközzel elválasztva.

Output

A kimenet egyetlen sor, mely a titkosítatlan szöveget adja meg.

Szabályok

A titkosított (input) szöveg elkészítése az alábbiak szerint zajlott:

  • Az 53 lehetséges karaktert az a=0,b=1,...,z=25,A=26,B=27,...,Z=51," "=52 módon számozzuk.
  • Az inputként megadott titkosított szöveg minden karaktere úgy készült, hogy az ismeretlen üzenet minden karakterét (számként) megszoroztuk ugyanazzal a K számmal, majd hozzáadtuk ugyanazt az L számot. Ezt követően az így kapott n számot modulo 53 redukáltuk (programozásban: n%53)
Példa: ha K=3 és L=4, úgy az x=23 számból 3*23 + 4 = 73%53 = 20 = "u" lesz.
Az input első sorában lévő titkosított szövegből visszakapni az eredeti szöveget (ami a szükséges output) az alábbiak szerint tudjuk:
  • A titkosított (input) szöveg minden karakteréből (számként) levonjuk L értékét.
  • Az így kapott számot "osztjuk" K-val. Azonban mivel minden művelet egész számokkal zajlik 0-tól 52-ig, így az osztás nem a hagyományos osztás. A "moduláris osztás" úgy zajlik, hogy megkeressük azt a K' számot, melyre teljesül az, hogy (K*K')%53 = 1. Ezt követően a K-val való osztás ekvivalens az ezzel a K' számmal való szorzással, redukálva modulo 53 (programozásban %53).
Példa: a fenti példa esetén "u=20"-ból úgy kapjuk vissza a kiindulási "x"-et, hogy:
  • "u" - L = 20-L = 16
  • K' = 18, mert (K*K')%53 = (3*18)%53 = 54%53 = 1
  • Így ((20-L)*18)%53 = (16*18)%53 = 288%53 = 23 = "x"
A probléma a fenti algoritmussal, hogy K és L értéke nem ismert a feladat során. Ellenben az input második sora segítségével kiszámolható!
  • Az input második sora négy karaktert tartalmaz, melyek megadnak 2 titkosítatlan-titkosított betűpárt.
  • Így például a "h n A z" sor azt jelenti, hogy a titkosítatlan "h" karakter párja a titkosított "n" karakter és a titkosítatlan "A" karakter párja a titkosított "z" karakter.
  • Ezen információ segítségével "egyenletrendszerként" kiszámolható a K és L értéke, hisz a titkosítás lényegében K*x + L = y elven történik ahol x és y a titkosítatlan-titkosított betűpár és K és L az ismeretlenek. Mivel a feladatban két titkosítatlan-titkosított betűpárt kapunk és pont két ismeretlenünk van, így az egyenletrendszer megoldható. Az egyetlen nehézséget az okozza, hogy most minden számolás modulo 53 történik, de az osztás kivételével (ld. fent) minden művelet ugyanúgy zajlik, mint a hagyományos egészek körében. Egyszerűen a végeredményt kell %53-al reduálni.

Példa

Input:
  1. xYMxJjoFhCJlxFx j
  2. a x l Y
letöltés szöveges állományként Output:
  1. alma korte barack
letöltés szöveges állományként
Debreceni Egyetem, Informatikai Kar, v. 2024.09.30.