add caesar script

tasks update
This commit is contained in:
Christoph J. Scherr 2023-09-07 23:40:02 +02:00
commit 883e9c94ec
2 changed files with 89 additions and 16 deletions

View File

@ -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)
</details>
## Ancient Cryptography
Difficulty: 2/5
<details>
<summary>Text</summary>
```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.
````
</details>
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$.
<details>
<summary>Hints</summary>
</details>
<details>
<summary>Solution</summary>
[Code Example](src/caesar.py)
</details>
## 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:
<details>
@ -347,18 +388,4 @@ Line Data
0000110 ┃ 6d20 7465 7361 6e79 6174 7463 6369 7620
...
```
<details>
<summary>Hints</summary>
TODO: add hints
</details>
<details>
<summary>Solution</summary>
TODO: formulate solution text
[Code Example](src/tasks/hexdumper-a.py)
</details>

46
src/caesar.py Normal file
View File

@ -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: <SOURCE> <KEY> [-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)