From b55cb5f00d751e1b57a8a9d8fbdb541dec3020be Mon Sep 17 00:00:00 2001 From: "Marvin M. Michum" Date: Fri, 1 Nov 2019 22:36:05 -0400 Subject: [PATCH 1/6] directory_writer --- .github/workflows/directory_writer.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/directory_writer.yml diff --git a/.github/workflows/directory_writer.yml b/.github/workflows/directory_writer.yml new file mode 100644 index 000000000000..dcbb9c304e15 --- /dev/null +++ b/.github/workflows/directory_writer.yml @@ -0,0 +1,25 @@ +# The objective of this GitHub Action is to add a new DIRECTORY.md file to a pull request if needed. +name: directory_writer +on: [pull_request] +jobs: + build: + runs-on: ubuntu-latest + strategy: + max-parallel: 1 + matrix: + python-version: [3.7] + steps: + + - uses: actions/checkout@v1 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + - name: Update DIRECTORY.md + run: | + scripts/build_directory_md.py 2>&1 | tee DIRECTORY.md + git config --global user.name 'directory_writer' + git config --global user.email 'mrvnmchm@users.noreply.github.com' + git remote set-url origin https://x-access-token:${{ secrets.gh_token }}@github.com/$GITHUB_REPOSITORY + git checkout $GITHUB_HEAD_REF + if git diff-files --quiet; then echo 0; else git commit -am "fixup: DIRECTORY.md" && git push; fi From 5de2ec0c59a774cd041e5e89fa4f09321e9ff41c Mon Sep 17 00:00:00 2001 From: "Marvin M. Michum" Date: Sat, 2 Nov 2019 00:45:50 -0400 Subject: [PATCH 2/6] add porta cipher for #1492 --- ciphers/porta_cipher.py | 113 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 ciphers/porta_cipher.py diff --git a/ciphers/porta_cipher.py b/ciphers/porta_cipher.py new file mode 100644 index 000000000000..86dc1e147980 --- /dev/null +++ b/ciphers/porta_cipher.py @@ -0,0 +1,113 @@ +alphabet = { + "A": [["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"]], "B": [["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"]], + "C": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], + ["Z", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y"]], "D": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["Z", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y"]], + "E": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], + ["Y", "Z", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X"]], "F": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["Y", "Z", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X"]], + "G": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], + ["X", "Y", "Z", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W"]], "H": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["X", "Y", "Z", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W"]], + "I": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], + ["W", "X", "Y", "Z", "N", "O", "P", "Q", "R", "S", "T", "U", "V"]], "J": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["W", "X", "Y", "Z", "N", "O", "P", "Q", "R", "S", "T", "U", "V"]], + "K": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], + ["V", "W", "X", "Y", "Z", "N", "O", "P", "Q", "R", "S", "T", "U"]], "L": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["V", "W", "X", "Y", "Z", "N", "O", "P", "Q", "R", "S", "T", "U"]], + "M": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], + ["U", "V", "W", "X", "Y", "Z", "N", "O", "P", "Q", "R", "S", "T"]], "N": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["U", "V", "W", "X", "Y", "Z", "N", "O", "P", "Q", "R", "S", "T"]], + "O": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], + ["T", "U", "V", "W", "X", "Y", "Z", "N", "O", "P", "Q", "R", "S"]], "P": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["T", "U", "V", "W", "X", "Y", "Z", "N", "O", "P", "Q", "R", "S"]], + "Q": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], + ["S", "T", "U", "V", "W", "X", "Y", "Z", "N", "O", "P", "Q", "R"]], "R": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["S", "T", "U", "V", "W", "X", "Y", "Z", "N", "O", "P", "Q", "R"]], + "S": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], + ["R", "S", "T", "U", "V", "W", "X", "Y", "Z", "N", "O", "P", "Q"]], "T": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["R", "S", "T", "U", "V", "W", "X", "Y", "Z", "N", "O", "P", "Q"]], + "U": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], + ["Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "N", "O", "P"]], "V": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "N", "O", "P"]], + "W": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], + ["P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "N", "O"]], "X": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "N", "O"]], + "Y": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], + ["O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "N"]], "Z": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "N"]]} + + +def generateTable(key): + """ + >>> generateTable('marvin') + [[['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R', 'S', 'T']], [['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']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R', 'S', 'T']]] + """ + table = [] + for char in key.upper(): + table.append(alphabet[char]) + return table + + +def encrypt(key, words): + """ + >>> encrypt('marvin', 'jessica') + 'QRACRWU' + """ + cipher = "" + count = 0 + table = generateTable(key) + for char in words.upper(): + cipher += getOpponent(table[count], char) + count = (count + 1) % len(table) + return cipher + + +def decrypt(key, words): + """ + >>> decrypt('marvin', 'QRACRWU') + 'JESSICA' + """ + return encrypt(key, words) + + +def getPosition(table, char): + """ + >>> table = [[['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R', 'S', 'T']], [['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']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R', 'S', 'T']]] + >>> getPosition(table, 'A') + (None, None) + """ + row = -1 + + if char in table[0]: + row = 0 + elif char in table[1]: + row = 1 + + if row != -1: + return (row, table[row].index(char)) + else: + return (None, None) + + +def getOpponent(table, char): + """ + >>> table = [[['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R', 'S', 'T']], [['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']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R', 'S', 'T']]] + >>> getOpponent(table, 'A') + 'A' + """ + row, col = getPosition(table, char.upper()) + + if row == 1: + return table[0][col] + elif row == 0: + return table[1][col] + else: + return char + + +if __name__ == "__main__": + """ + ENTER KEY: marvin + ENTER TEXT TO ENCRYPT: jessica + ENCRYPTED: QRACRWU + DECRYPTED WITH KEY: JESSICA + """ + key = input("ENTER KEY: ") + text = input("ENTER TEXT TO ENCRYPT: ") + cipher_text = encrypt(key, text) + + print("ENCRYPTED: " + cipher_text) + print("DECRYPTED WITH KEY: " + decrypt(key, cipher_text)) + + import doctest + doctest.testmod() From fec29401b842ade1548533081a707ae4a788163a Mon Sep 17 00:00:00 2001 From: "Marvin M. Michum" Date: Sun, 3 Nov 2019 23:01:14 -0500 Subject: [PATCH 3/6] formatting and one line comprehensions --- ciphers/porta_cipher.py | 128 +++++++++++++++++++--------------------- 1 file changed, 61 insertions(+), 67 deletions(-) diff --git a/ciphers/porta_cipher.py b/ciphers/porta_cipher.py index 86dc1e147980..ec4c9b912486 100644 --- a/ciphers/porta_cipher.py +++ b/ciphers/porta_cipher.py @@ -1,71 +1,69 @@ alphabet = { - "A": [["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"]], "B": [["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"]], - "C": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], - ["Z", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y"]], "D": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["Z", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y"]], - "E": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], - ["Y", "Z", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X"]], "F": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["Y", "Z", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X"]], - "G": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], - ["X", "Y", "Z", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W"]], "H": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["X", "Y", "Z", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W"]], - "I": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], - ["W", "X", "Y", "Z", "N", "O", "P", "Q", "R", "S", "T", "U", "V"]], "J": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["W", "X", "Y", "Z", "N", "O", "P", "Q", "R", "S", "T", "U", "V"]], - "K": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], - ["V", "W", "X", "Y", "Z", "N", "O", "P", "Q", "R", "S", "T", "U"]], "L": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["V", "W", "X", "Y", "Z", "N", "O", "P", "Q", "R", "S", "T", "U"]], - "M": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], - ["U", "V", "W", "X", "Y", "Z", "N", "O", "P", "Q", "R", "S", "T"]], "N": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["U", "V", "W", "X", "Y", "Z", "N", "O", "P", "Q", "R", "S", "T"]], - "O": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], - ["T", "U", "V", "W", "X", "Y", "Z", "N", "O", "P", "Q", "R", "S"]], "P": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["T", "U", "V", "W", "X", "Y", "Z", "N", "O", "P", "Q", "R", "S"]], - "Q": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], - ["S", "T", "U", "V", "W", "X", "Y", "Z", "N", "O", "P", "Q", "R"]], "R": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["S", "T", "U", "V", "W", "X", "Y", "Z", "N", "O", "P", "Q", "R"]], - "S": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], - ["R", "S", "T", "U", "V", "W", "X", "Y", "Z", "N", "O", "P", "Q"]], "T": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["R", "S", "T", "U", "V", "W", "X", "Y", "Z", "N", "O", "P", "Q"]], - "U": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], - ["Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "N", "O", "P"]], "V": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "N", "O", "P"]], - "W": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], - ["P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "N", "O"]], "X": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "N", "O"]], - "Y": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], - ["O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "N"]], "Z": [["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"], ["O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "N"]]} - - -def generateTable(key): + "A": ("ABCDEFGHIJKLM", "NOPQRSTUVWXYZ"), + "B": ("ABCDEFGHIJKLM", "NOPQRSTUVWXYZ"), + "C": ("ABCDEFGHIJKLM", "ZNOPQRSTUVWXY"), + "D": ("ABCDEFGHIJKLM", "ZNOPQRSTUVWXY"), + "E": ("ABCDEFGHIJKLM", "YZNOPQRSTUVWX"), + "F": ("ABCDEFGHIJKLM", "YZNOPQRSTUVWX"), + "G": ("ABCDEFGHIJKLM", "XYZNOPQRSTUVW"), + "H": ("ABCDEFGHIJKLM", "XYZNOPQRSTUVW"), + "I": ("ABCDEFGHIJKLM", "WXYZNOPQRSTUV"), + "J": ("ABCDEFGHIJKLM", "WXYZNOPQRSTUV"), + "K": ("ABCDEFGHIJKLM", "VWXYZNOPQRSTU"), + "L": ("ABCDEFGHIJKLM", "VWXYZNOPQRSTU"), + "M": ("ABCDEFGHIJKLM", "UVWXYZNOPQRST"), + "N": ("ABCDEFGHIJKLM", "UVWXYZNOPQRST"), + "O": ("ABCDEFGHIJKLM", "TUVWXYZNOPQRS"), + "P": ("ABCDEFGHIJKLM", "TUVWXYZNOPQRS"), + "Q": ("ABCDEFGHIJKLM", "STUVWXYZNOPQR"), + "R": ("ABCDEFGHIJKLM", "STUVWXYZNOPQR"), + "S": ("ABCDEFGHIJKLM", "RSTUVWXYZNOPQ"), + "T": ("ABCDEFGHIJKLM", "RSTUVWXYZNOPQ"), + "U": ("ABCDEFGHIJKLM", "QRSTUVWXYZNOP"), + "V": ("ABCDEFGHIJKLM", "QRSTUVWXYZNOP"), + "W": ("ABCDEFGHIJKLM", "PQRSTUVWXYZNO"), + "X": ("ABCDEFGHIJKLM", "PQRSTUVWXYZNO"), + "Y": ("ABCDEFGHIJKLM", "OPQRSTUVWXYZN"), + "Z": ("ABCDEFGHIJKLM", "OPQRSTUVWXYZN"), +} + + +def generate_table(key): """ - >>> generateTable('marvin') - [[['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R', 'S', 'T']], [['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']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R', 'S', 'T']]] - """ - table = [] - for char in key.upper(): - table.append(alphabet[char]) - return table + >>> generate_table('marvin') + [('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'), ('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'), ('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')] + """ + return [alphabet[char] for char in key.upper()] def encrypt(key, words): """ - >>> encrypt('marvin', 'jessica') - 'QRACRWU' - """ + >>> encrypt('marvin', 'jessica') + 'QRACRWU' + """ cipher = "" count = 0 - table = generateTable(key) + table = generate_table(key) for char in words.upper(): - cipher += getOpponent(table[count], char) + cipher += get_opponent(table[count], char) count = (count + 1) % len(table) return cipher def decrypt(key, words): """ - >>> decrypt('marvin', 'QRACRWU') - 'JESSICA' - """ + >>> decrypt('marvin', 'QRACRWU') + 'JESSICA' + """ return encrypt(key, words) -def getPosition(table, char): - """ - >>> table = [[['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R', 'S', 'T']], [['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']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R', 'S', 'T']]] - >>> getPosition(table, 'A') - (None, None) +def get_position(table, char): """ + >>> table = [('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'), ('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'), ('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')] + >>> get_position(table, 'A') + (None, None) + """ row = -1 if char in table[0]: @@ -73,35 +71,30 @@ def getPosition(table, char): elif char in table[1]: row = 1 - if row != -1: - return (row, table[row].index(char)) - else: - return (None, None) + return (None, None) if row == -1 else (row, table[row].index(char)) -def getOpponent(table, char): - """ - >>> table = [[['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R', 'S', 'T']], [['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']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V']], [['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'], ['U', 'V', 'W', 'X', 'Y', 'Z', 'N', 'O', 'P', 'Q', 'R', 'S', 'T']]] - >>> getOpponent(table, 'A') - 'A' +def get_opponent(table, char): """ - row, col = getPosition(table, char.upper()) + >>> table = [('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'), ('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'), ('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')] + >>> get_opponent(table, 'A') + 'A' + """ + row, col = get_position(table, char.upper()) if row == 1: return table[0][col] - elif row == 0: - return table[1][col] else: - return char + return table[1][col] if row == 0 else char if __name__ == "__main__": """ - ENTER KEY: marvin - ENTER TEXT TO ENCRYPT: jessica - ENCRYPTED: QRACRWU - DECRYPTED WITH KEY: JESSICA - """ + ENTER KEY: marvin + ENTER TEXT TO ENCRYPT: jessica + ENCRYPTED: QRACRWU + DECRYPTED WITH KEY: JESSICA + """ key = input("ENTER KEY: ") text = input("ENTER TEXT TO ENCRYPT: ") cipher_text = encrypt(key, text) @@ -110,4 +103,5 @@ def getOpponent(table, char): print("DECRYPTED WITH KEY: " + decrypt(key, cipher_text)) import doctest + doctest.testmod() From e5e5fbabb4ddbfa4f8fe48aedcddbc3f45a0b9a4 Mon Sep 17 00:00:00 2001 From: "Marvin M. Michum" Date: Sun, 3 Nov 2019 23:03:23 -0500 Subject: [PATCH 4/6] remove directory_writer --- .github/workflows/directory_writer.yml | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 .github/workflows/directory_writer.yml diff --git a/.github/workflows/directory_writer.yml b/.github/workflows/directory_writer.yml deleted file mode 100644 index dcbb9c304e15..000000000000 --- a/.github/workflows/directory_writer.yml +++ /dev/null @@ -1,25 +0,0 @@ -# The objective of this GitHub Action is to add a new DIRECTORY.md file to a pull request if needed. -name: directory_writer -on: [pull_request] -jobs: - build: - runs-on: ubuntu-latest - strategy: - max-parallel: 1 - matrix: - python-version: [3.7] - steps: - - - uses: actions/checkout@v1 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python-version }} - - name: Update DIRECTORY.md - run: | - scripts/build_directory_md.py 2>&1 | tee DIRECTORY.md - git config --global user.name 'directory_writer' - git config --global user.email 'mrvnmchm@users.noreply.github.com' - git remote set-url origin https://x-access-token:${{ secrets.gh_token }}@github.com/$GITHUB_REPOSITORY - git checkout $GITHUB_HEAD_REF - if git diff-files --quiet; then echo 0; else git commit -am "fixup: DIRECTORY.md" && git push; fi From 9ff2f60568e6b66a662c563b4f9800122c22456f Mon Sep 17 00:00:00 2001 From: "Marvin M. Michum" Date: Sun, 3 Nov 2019 23:53:33 -0500 Subject: [PATCH 5/6] indentions --- ciphers/porta_cipher.py | 44 ++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/ciphers/porta_cipher.py b/ciphers/porta_cipher.py index ec4c9b912486..121b973cd051 100644 --- a/ciphers/porta_cipher.py +++ b/ciphers/porta_cipher.py @@ -30,17 +30,17 @@ def generate_table(key): """ - >>> generate_table('marvin') - [('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'), ('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'), ('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')] - """ + >>> generate_table('marvin') + [('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'), ('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'), ('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')] + """ return [alphabet[char] for char in key.upper()] def encrypt(key, words): """ - >>> encrypt('marvin', 'jessica') - 'QRACRWU' - """ + >>> encrypt('marvin', 'jessica') + 'QRACRWU' + """ cipher = "" count = 0 table = generate_table(key) @@ -52,18 +52,18 @@ def encrypt(key, words): def decrypt(key, words): """ - >>> decrypt('marvin', 'QRACRWU') - 'JESSICA' - """ + >>> decrypt('marvin', 'QRACRWU') + 'JESSICA' + """ return encrypt(key, words) def get_position(table, char): """ - >>> table = [('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'), ('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'), ('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')] - >>> get_position(table, 'A') - (None, None) - """ + >>> table = [('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'), ('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'), ('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')] + >>> get_position(table, 'A') + (None, None) + """ row = -1 if char in table[0]: @@ -76,10 +76,10 @@ def get_position(table, char): def get_opponent(table, char): """ - >>> table = [('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'), ('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'), ('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')] - >>> get_opponent(table, 'A') - 'A' - """ + >>> table = [('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'), ('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'), ('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')] + >>> get_opponent(table, 'A') + 'A' + """ row, col = get_position(table, char.upper()) if row == 1: @@ -90,11 +90,11 @@ def get_opponent(table, char): if __name__ == "__main__": """ - ENTER KEY: marvin - ENTER TEXT TO ENCRYPT: jessica - ENCRYPTED: QRACRWU - DECRYPTED WITH KEY: JESSICA - """ + ENTER KEY: marvin + ENTER TEXT TO ENCRYPT: jessica + ENCRYPTED: QRACRWU + DECRYPTED WITH KEY: JESSICA + """ key = input("ENTER KEY: ") text = input("ENTER TEXT TO ENCRYPT: ") cipher_text = encrypt(key, text) From 691b7e0f6847694b9faaa0f0c922242b28d3d2b9 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Mon, 4 Nov 2019 08:45:14 +0100 Subject: [PATCH 6/6] Wrap long lines --- ciphers/porta_cipher.py | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/ciphers/porta_cipher.py b/ciphers/porta_cipher.py index 121b973cd051..a8e79415958d 100644 --- a/ciphers/porta_cipher.py +++ b/ciphers/porta_cipher.py @@ -30,8 +30,10 @@ def generate_table(key): """ - >>> generate_table('marvin') - [('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'), ('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'), ('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')] + >>> generate_table('marvin') # doctest: +NORMALIZE_WHITESPACE + [('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'), + ('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'), + ('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')] """ return [alphabet[char] for char in key.upper()] @@ -52,7 +54,7 @@ def encrypt(key, words): def decrypt(key, words): """ - >>> decrypt('marvin', 'QRACRWU') + >>> decrypt('marvin', 'QRACRWU') 'JESSICA' """ return encrypt(key, words) @@ -60,28 +62,30 @@ def decrypt(key, words): def get_position(table, char): """ - >>> table = [('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'), ('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'), ('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')] + >>> table = [ + ... ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'), + ... ('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'), + ... ('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')] >>> get_position(table, 'A') (None, None) """ - row = -1 - if char in table[0]: row = 0 - elif char in table[1]: - row = 1 - + else: + row = 1 if char in table[1] else -1 return (None, None) if row == -1 else (row, table[row].index(char)) def get_opponent(table, char): """ - >>> table = [('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'), ('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'), ('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')] + >>> table = [ + ... ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST'), ('ABCDEFGHIJKLM', 'NOPQRSTUVWXYZ'), + ... ('ABCDEFGHIJKLM', 'STUVWXYZNOPQR'), ('ABCDEFGHIJKLM', 'QRSTUVWXYZNOP'), + ... ('ABCDEFGHIJKLM', 'WXYZNOPQRSTUV'), ('ABCDEFGHIJKLM', 'UVWXYZNOPQRST')] >>> get_opponent(table, 'A') 'A' """ row, col = get_position(table, char.upper()) - if row == 1: return table[0][col] else: @@ -89,19 +93,18 @@ def get_opponent(table, char): if __name__ == "__main__": + import doctest + + doctest.testmod() # Fist ensure that all our tests are passing... """ ENTER KEY: marvin ENTER TEXT TO ENCRYPT: jessica ENCRYPTED: QRACRWU DECRYPTED WITH KEY: JESSICA """ - key = input("ENTER KEY: ") - text = input("ENTER TEXT TO ENCRYPT: ") + key = input("ENTER KEY: ").strip() + text = input("ENTER TEXT TO ENCRYPT: ").strip() cipher_text = encrypt(key, text) - print("ENCRYPTED: " + cipher_text) - print("DECRYPTED WITH KEY: " + decrypt(key, cipher_text)) - - import doctest - - doctest.testmod() + print(f"ENCRYPTED: {cipher_text}") + print(f"DECRYPTED WITH KEY: {decrypt(key, cipher_text)}")