Due Thu, 03 Sep
| Review: | Newish: |
|---|---|
- podman |
- curl |
- vim |
- stdio |
- gcc |
- ciphers |
- git |
#!/usr/bin/env python3
# constants # constant
rs = [ # rotors
"BDFHJLCPRTXVZNYEIWGAKMUSQO", # fast
"AJDKSIRUXBLHWTMCQGZNPYFVOE", # medium
"EKMFLGDQVZNTOWYHXUSPAIBRCJ", # slow
"IXUHFEZDAOMTKQJWNSRLCYPBVG" # reflect
]
A = ord('A') # value of 'A'
NC = len(rs[0]) # number of characters
# apply a cipher/rotor `r` to a letter `c`
rapply = lambda c, r : r[ord(c) - A]
# invert a cipher/rotor `r`
# create a list of letters with their index
# [(r[i],i) for i in range(NC)]
# sort the list
# for p in sorted
# convert indexes to back to letters in the alphabet
# chr(p[1]+A)
invert = lambda r : [chr(p[1]+A) for p in sorted([(r[i],i) for i in range(NC)])]
# extend the rotor set to include inverted ciphers
# In reversed order, as well
# fas med slo ref slo med fas
rs += [invert(r) for r in rs[2::-1]]
# encrypt letter `c` with rotors in default* positions
rotors = lambda c : [c := rapply(c,r) for r in rs][-1]
# default position a,b,c -> r,f,o, respectively
assert([
rotors('A'),
rotors('B'),
rotors('C')
] == ['R','F','O'])
# shift letter `c` forward `n` letters in alphabet
nshift = lambda c, n : chr((ord(c) - A + n) % NC + A)
# allow rotor rotations
# fast spins every letter
# medi spins every time fast loops back NC->0
# slow "" medi ""
shifts = lambda l, n : [
l % NC, l // NC % NC, l // (NC*NC) % NC,
0,
l // (NC*NC) % NC, l // NC % NC, l % NC
][n]
# combine shift apply? don't know what to call
shiply = lambda c, n, r : nshift(rapply(nshift(c,n),r),-n)
# or if you prefer
shiply = lambda c, n, r : chr((ord(r[(ord(c)-A+n)%NC])-A-n)%NC+A)
# single letter enigma, with number of previous letters `l`
letter = lambda c, l : [c := shiply(c,shifts(l,i),rs[i]) for i in range(len(rs))][-1]
# phrase
# enigma starts with an single rotation before first encryption.
enigma = lambda s : "".join([letter(s[i],i+1) for i in range(len(s))])
# test
assert([
enigma("AAA"),
enigma("ABC"),
enigma("ZLC")
] == ["ZLC","ZRA","AAA"])
if __name__ == "__main__":
import sys
print(enigma(sys.argv[1])) E
_____|______________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ BDFHJLCPRTXVZNYEIWGAKMUSQO ] # cipher
‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
J ____________________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ BDFHJLCPRTXVZNYEIWGAKMUSQO ] # cipher[0]
‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
J>>>>J
__________|_________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ AJDKSIRUXBLHWTMCQGZNPYFVOE ] # cipher[1]
‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
B E
_____|______________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ BDFHJLCPRTXVZNYEIWGAKMUSQO ] # fast
‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
J>>>>J
__________|_________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ AJDKSIRUXBLHWTMCQGZNPYFVOE ] # medium
‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
B<<<<<<<B
__|_________________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ EKMFLGDQVZNTOWYHXUSPAIBRCJ ] # slow
‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
K>>>>>>>>K
___________|________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ IXUHFEZDAOMTKQJWNSRLCYPBVG ] # reflect
‾‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
M K
___________|________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ IXUHFEZDAOMTKQJWNSRLCYPBVG ] # reflect
‾‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
M<<<<<<<M
___|________________________
[ EKMFLGDQVZNTOWYHXUSPAIBRCJ ] # slow
[ | ]
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
C M
___|________________________
[ EKMFLGDQVZNTOWYHXUSPAIBRCJ ] # slow
[ | ]
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
C>>>>>>>>>>>>C
________________|____________
[ AJDKSIRUXBLHWTMCQGZNPYFVOE ] # medium
[ | ]
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾
P M
_____________|______________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ UWYGADFPVZBECKMTHXSLRINQOJ ] # slow^-1
‾‾‾‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾
C<<<<<<<<<C
___|________________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ AJPCZWRLFBDKOTYUQGENHXMIVS ] # medium^-1
‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
P E
_____|______________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ BDFHJLCPRTXVZNYEIWGAKMUSQO ] # fast
‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
J>>>>J
__________|_________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ AJDKSIRUXBLHWTMCQGZNPYFVOE ] # medium
‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
B<<<<<<<B
__|_________________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ EKMFLGDQVZNTOWYHXUSPAIBRCJ ] # slow
‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
K>>>>>>>>K
___________|________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ IXUHFEZDAOMTKQJWNSRLCYPBVG ] # reflect
‾‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
M<<<<<<<M
___|________________________
[ EKMFLGDQVZNTOWYHXUSPAIBRCJ ] # slow
[ | ]
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
C>>>>>>>>>>>>C
________________|____________
[ AJDKSIRUXBLHWTMCQGZNPYFVOE ] # medium
[ | ]
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾
P<<<<<<<P
________|___________________
[ BDFHJLCPRTXVZNYEIWGAKMUSQO ] # fast
[ | ]
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
H E
_____|______________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ BDFHJLCPRTXVZNYEIWGAKMUSQO ] # fast
‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
J>>>>J
__________|_________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ AJDKSIRUXBLHWTMCQGZNPYFVOE ] # medium
‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
B<<<<<<<B
__|_________________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ EKMFLGDQVZNTOWYHXUSPAIBRCJ ] # slow
‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
K>>>>>>>>K
___________|________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ IXUHFEZDAOMTKQJWNSRLCYPBVG ] # reflect
‾‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
M>M
_____________|______________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ UWYGADFPVZBECKMTHXSLRINQOJ ] # slow^-1
‾‾‾‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾
C<<<<<<<<<C
___|________________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ AJPCZWRLFBDKOTYUQGENHXMIVS ] # medium^-1
‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
P>>>>>>>>>>>>P
________________|___________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ TAGBPCSDQEUFVNZHYIXJWLRKOM ] # fast^-1
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾
HFor the remainder of the write-up, I will assume without loss of generality the usage of inverted ciphers.
E
_____|______________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ BDFHJLCPRTXVZNYEIWGAKMUSQO ] # cipher
‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
J E
|>>>
EFGH
>>>|
________|___________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ BDFHJLCPRTXVZNYEIWGAKMUSQO ] # cipher
‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
P
<<<|
MNOP
|<<<
M E
_____|______________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ DEFGHIJKLMNOPQRSTUVWXYZABC ] # forward(3)
‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
H>>H
________|___________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ BDFHJLCPRTXVZNYEIWGAKMUSQO ] # cipher
‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
P>>>>>>>P
________________|___________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ]
[ XYZABCDEFGHIJKLMNOPQRSTUVW ] # forward(-3)
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾
MFor the remainder of the write-up, I will assume without loss of generality that rotations can be understood without considering them to be ciphers.
X
|
=====|===========================================
= X =
= |>>>> =
= XYZAB # rotate =
= >>>>| =
= B =
= __|_________________________ =
= [ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet =
= [ | ] = # fast
= [ BDFHJLCPRTXVZNYEIWGAKMUSQO ] # fast =
= ‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ =
= D =
= <<<<| =
= ZABCD # rotate =
= |<<<< =
= Z =
=====|===========================================
|
Z>Z # adjust
|
=======|=========================================
= Z =
= |> =
= ZA # rotate =
= >| =
= A =
= _|__________________________ =
= [ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet =
= [ | ] = # medium
= [ AJDKSIRUXBLHWTMCQGZNPYFVOE ] # medium =
= ‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ =
= A =
= <| =
= ZA # rotate =
= |< =
= Z =
=======|=========================================
|
Z>>>>>>>>>>>>>>>>>>>>>>>>>Z # adjust
|
=================================|===============
= Z =
= | =
= Z # rotate =
= | =
= Z =
= __________________________|_ =
= [ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet =
= [ | ] = # slow
= [ EKMFLGDQVZNTOWYHXUSPAIBRCJ ] # slow =
= ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾|‾ =
= J =
= | =
= J # rotate =
= | =
= J =
=================================|===============
|
J<<<<<<<<<<<<<<<J # adjust
__________|_________________
[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet
[ | ] # reflect
[ IXUHFEZDAOMTKQJWNSRLCYPBVG ] # reflect
‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
O>>>>O # adjust
|
======================|==========================
= O =
= | =
= O # rotate =
= | =
= O =
= _______________|____________ =
= [ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet =
= [ | ] = # slow
= [ UWYGADFPVZBECKMTHXSLRINQOJ ] # slow^-1 =
= ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾ =
= M =
= | =
= M # rotate =
= | =
= M =
======================|==========================
|
M<M # adjust
|
====================|=============================
= M =
= |> =
= MN # rotate =
= >| =
= N =
= ______________|_____________ =
= [ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet =
= [ | | ] = # medium
= [ AJPCZWRLFBDKOTYUQGENHXMIVS ] # medium^-1=
= ‾‾‾‾‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾‾‾ =
= T =
= <| =
= ST # rotate =
= |< =
= S =
====================|============================
|
S>>>>>S # adjust
|
==========================|======================
= | =
= S =
= |>>>> # rotate =
= STUVW =
= >>>>| =
= _______________________|____ =
= [ ABCDEFGHIJKLMNOPQRSTUVWXYZ ] # alphabet =
= [ | ] = # fast
= [ TAGBPCSDQEUFVNZHYIXJWLRKOM ] # fast^-1 =
= ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾|‾‾‾‾ =
= R =
= <<<<| =
= NOPQR # rotate =
= |<<<< =
= N =
==========================|======================
|
Nchar *defchar *
print appends a newline and C printf does not.
enigma.c
#define “pre-processor directive” is used to create constants.
#define is like #include which is somewhat like import#define for strings, such as the rotor strings.
ROTORSenigma.c
ROTORS constant was computed in Python.vim I used the “yank” and “paste” features to move it to the top of “enigma.c”.i++, a special shorthand for incrementation.
i += 1.char *str = "hello world";
int i = 0;
for ( ; ; i++) {
if (str[i] == ' ') {
printf("%d\n", i);
return 0;
}
}'\0'
i is increased the same time the terminator is checked.i for both.C lacks any collection type (list, set, tuple, string)
* notation is used instead
* denotes the location of a some value[] notation may also be used
We don’t worry about any of that for now.
You will likely want to use a collection on Enigma:
C array notation is very similar to Python set notation, but maintains order
char carray[5] = {'a', 'e', 'i', 'o', 'u'};
int iarray[5] = {2, 4, 8, 16, 32};
int i;
for (i = 0; i < 5; i++) {
printf("%c %d\n", carray[i], iarray[i]);
}char carray[5] = {'a', 'e', 'i', 'o', 'u'};
char string[5] = "abcde";
int i;
for (i = 0; i < 5; i++) {
printf("%c %c\n", carray[i], string[i]);
}-5 % 3 -> 1
-4 % 3 -> 2
-3 % 3 -> 0
-2 % 3 -> 1
-1 % 3 -> 2
0 % 3 -> 0
1 % 3 -> 1
2 % 3 -> 2
3 % 3 -> 0
4 % 3 -> 1remainder.c
-5 % 3 -> -2
-4 % 3 -> -1
-3 % 3 -> 0
-2 % 3 -> -2
-1 % 3 -> -1
0 % 3 -> 0
1 % 3 -> 1
2 % 3 -> 2
3 % 3 -> 0
4 % 3 -> 1sys module contains many features present by default in a systems programming language.argv, a vector (in the mathematical sense) of arguments.
argc, an integer count of arguments.
Containerfile
vim and also test your code in the same container.
podman documentation - many ways to do this.vim built-in :term command, which splits the screen into a vim editor and a vim terminal.podman run will create a new container each time, which is not what you probably want.