Algoritmer og datastrukturer
|
| Input: | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
| Output: | n | o | p | q | r | s | t | u | v | w | x | y | z | a | b | c | d | e | f | g | h | i | j | k | l | m |
Her er et eksempel der ROT13 brukes til å kryptere svaret på en "gåte":
Why did the chicken cross the road?
Gb trg gb gur bgure fvqr!
Hvis vi transformerer begge disse linjene med ROT13, ser vi svaret:
Jul qvq gur puvpxra pebff gur ebnq?
To get to the other side!
Merk at ROT13 blir symmetrisk fordi 2·13=26. Vi trenger derfor ikke en egen dekrypteringsalgoritme, to påfølgende ROT13-transformasjoner vil først kryptere og deretter dekryptere teksten.
Nedenfor gis det en beskrivelse av en krypteringsalgoritme som først bruker ROT13 og deretter bytter om på rekkefølgen av tegnene.
Vi skal se på en enkel (og sikkerhetsmessig helt ubrukelig) metode for å kryptere tekststrenger, som bruker både en stack og en kø. Algoritmen for å kryptere en streng S med n tegn kan beskrives slik:
Kjør algoritmen ROT13 på (bare de engelske bokstavene) i strengen S.
Legg deretter de n/2 første tegnene i S i en kø (enqueue), i samme rekkefølge som de forekommer i strengen.
Legg så de resterende tegnene i S på en stack (push), i samme rekkefølge som de forekommer i strengen.
Start med en tom streng T og lag den nye krypterte strengen slik:
Ta ut ett tegn av stacken (pop) og legg dette inn som første tegn i T.
Ta ut ett tegn fra køen (dequeue) og legg dette inn som andre tegn i T.
Fortsett på samme måte, med å ta ut ett tegn fra stacken og ett tegn fra køen og legge dem til på slutten T, inntil både stacken og køen er tom.
Her er et eksempel på hvordan denne algoritmen virker for tekststrengen S="Karmann-Ghia" som har n=12 tegn:
ROT13("Karmann-Ghia") = "Xneznaa-Tuvn"
Kø:
| X | n | e | z | n | a |
Stack (fra toppen):
| n | v | u | T | - | a |
T = "nXvnueTz-naa"
Vi ser av eksempelet ovenfor at den krypterte strengen lages ved å hente annethvert tegn fra henholdsvis stacken (røde tegn) og køen (grønne tegn). Etter at alle stegene i algoritmen er ferdig, ser vi at den krypterte utgaven av strengen "Karmann-Ghia" er lik "nXvnueTz-naa".
Du skal programmere denne metoden i oppgaven nedenfor, og også lage en metode som dekrypterer strengene tilbake til originalteksten.
Lag en Java-metode:
public static String krypter(String S);
Metoden krypter() skal implementere krypteringsmetoden beskrevet ovenfor, og returnere den krypterte versjonen av strengen S.
Lag en Java-metode:
public static String dekrypter(String S);
S er her er en streng som er kryptert med metoden krypter() i oppgave a ovenfor. Metoden dekrypter() skal reversere krypteringen og returnere den ukrypterte versjonen av strengen S.
Lag et lite testprogram som kan brukes for å sjekke at løsningen din fungerer som den skal. Programmet skal lese en streng fra bruker og kryptere/dekryptere strengen.
Begge metodene skal bruke Javas innebygde stack (java.util.Stack) og kø (Java.util.Queue). Du skal også bruke metoden nedenfor, som gjør "engelsk" ROT13 på en tekststreng:
public static String ROT13(String S)
{
char[] C = S.toCharArray();
for (int i = 0; i < S.length(); i++)
{
char c = C[i];
if (c >= 'a' && c <= 'm') c += 13;
else if (c >= 'A' && c <= 'M') c += 13;
else if (c >= 'n' && c <= 'z') c -= 13;
else if (c >= 'N' && c <= 'Z') c -= 13;
C[i] = c;
}
return String.valueOf(C);
}
Løsningen din legges på en fil med navn Oblig_01.java. Den skal være kompilerbar og fungere korrekt. Java-filen postes her i Canvas som svar på oppgaven.
Jan Høiberg