diff --git a/Tasks.md b/Tasks.md index af34fd8..e484fce 100644 --- a/Tasks.md +++ b/Tasks.md @@ -282,12 +282,53 @@ Use [regex101.com](https://regex101.com) if you are not already a REGEX expert. There should be $374$ matches. -A regex that fullfills the requirements is `\b[a-z][AEIOUaeiou]([a-w]|[A-W])`. +A regex that matches the requirements is `\b[a-z][AEIOUaeiou]([a-w]|[A-W])`. [Code Example](src/tasks/regex.py) +## Ancient Cryptography + +Difficulty: 2/5 + +
+Text + +```text +Neovim is a refactor, and sometimes redactor, in the tradition of Vim (which itself derives from +Stevie). It is not a rewrite but a continuation and extension of Vim. Many clones and derivatives +exist, some very clever—but none are Vim. Neovim is built for users who want the good parts of +Vim, and more. +```` + +
+ +1. The text above has been cyphered with the Caesar cipher, a timeless classic + algorithm to abstract the meaning away from a text and arguably an early + form of encryption. Your task is to decipher it back into readable text. + +### The Caesar cipher + +For the Caesar cipher, all letters are shifted by the value of the key. + +**Examples** + +`foo Bar` becomes `gpp Cbs` when shifted by $1$. + + + +
+Hints + +
+
+Solution + +[Code Example](src/caesar.py) + +
+ ## Making a Hexeditor In this section, we're building a little hexeditor. You will be able to install @@ -316,7 +357,7 @@ Difficulty: 2/5 1. Dump the data of [data/metasyntactic.md](./data/metasyntactic.md) -- In - Hexadecumal. + Hexadecimal. 2. Make the dumped Bytes look pretty, something like the example below:
@@ -347,18 +388,4 @@ Line Data 0000110 ┃ 6d20 7465 7361 6e79 6174 7463 6369 7620 ... ``` - -
-Hints - -TODO: add hints - -
-
-Solution - -TODO: formulate solution text - -[Code Example](src/tasks/hexdumper-a.py) -
diff --git a/src/caesar.py b/src/caesar.py new file mode 100644 index 0000000..59c6895 --- /dev/null +++ b/src/caesar.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +import sys + +def internal(text: str, key: int) -> str: + cyphertext: str = "" + for c in text: + if ord(c) >= 65 and ord(c) <= 90: # uppercase letters + ci = ord(c) - ord('A') + add = ord('A') + #print(f"{c} is uppercase") + elif ord(c) >= 97 and ord(c) <= 122: # uppercase letters + ci = ord(c) - ord('a') + add = ord('a') + #print(f"{c} is lowercase") + else: + #print(f"not a letter: {c} ({ord(c)})") + # character is not a letter, just skip it + cyphertext += c + continue + ci += key + ci %= 26 # only 23 letters in the alphabet + #print(f"ci for {c}: {ci}") + cyphertext += chr(ci + add) + + return cyphertext + + +if len(sys.argv) <= 2 or len(sys.argv) >= 5: + print("Takes two arguments: [-e]") + exit(1) + +source: str = sys.argv[1] +target: str = "" +key = int(sys.argv[2]) + +if len(sys.argv) >= 4 and sys.argv[3] == "-e": + print("encrypting...") + target = internal(source, -key) + + +else: + print("decrypting...") + target = internal(source, key) + +print("=" * 80) +print("%s" % target)