1

私はPythonが初めてで、これを実現するのにかなり苦労しています。これは私の仕事です:

6 文字暗号は、置換と転置の両方を含む秘密のメッセージをエンコードする方法です。暗号化は、A から Z までのアルファベット文字と 0 から 9 までの数字 (合計 36 記号) で 6 × 6 グリッドをランダムに埋めることから始まります。このグリッドは、メッセージの送信者と受信者の両方に知られている必要があります。グリッドの行と列には、A、B、C、D、E、F の文字が付けられています。

6 文字暗号方式を実装する Python プログラムを作成します。1. 最初の段落で説明したように、6x6 のグリッドを作成し、文字と数字をランダムに入力してから、ユーザーに秘密のメッセージを入力するように求めます。2. ユーザーが秘密のメッセージを入力した後、6x6 グリッドと生成された暗号文を表示します。3. ユーザーに暗号文を入力して元のメッセージを表示するように求めます。ユーザーに、暗号文の 2 文字ごとにスペースまたはコンマで区切るように依頼しても問題ありません。

私が苦労しているのは、ネストされたリストを検索して、入力されたランダムに配置された文字を検索し、座標を与える方法です。また、座標は、A、B などの文字ではなく、0、1 などの数字で指定されません。このネストされたリストの使用方法のアイデアがあれば、エンコードとデコードを管理できると思います。

これまでの私のコードは次のとおりです。

grid = [["Z","9","G","Q","T","3"],
    ["Y","8","F","P","S","2"],
    ["X","7","E","O","R","1"],
    ["W","6","D","N","M","0"],
    ["V","5","C","L","K","U"],
    ["J","4","B","I","H","A"]]

def main():
    print("Welcome to the sixth cipher")
    print("Would you like to (E)Encode or (D)Decode a message?")
    operation = input()

    if(operation == "E"):
        encodecipher()
    elif(operation == "D"):
        decodecipher()
    else:
        print("Sorry, input not recognised")

def encodecipher():
    print("Please enter a message to encode:")
    messagetoencode = input()



def decodecipher():
    print("Decode Test")
    rowcolumn()


def rowcolumn():
    pass

main()
4

3 に答える 3

4

学習/宿題の目的でこれを行っていることは理解していますが、後で心に留めておくためにこれを指摘します. 持っているものを 36 個のアイテム (たまたま 6x6 として表現可能) のようなものと考える方が簡単です。より明確に言えば、キャラクター -> 座標があり、adictはこれを行うのに非常に便利で、それを逆にします。 ...

from string import ascii_uppercase, digits
from random import shuffle
from itertools import product

# build 36 items list and randomise it
chars = list(ascii_uppercase + digits)
shuffle(chars)

# alternatively, use your existing grid:
from itertools import chain
chars = list(chain.from_iterable(grid))
# ...


# Create char -> (coords)
lookup = dict(zip(chars, product('ABCDEF', repeat=2)))
# Swap over so (coords) -> char
rev_lookup = {v: k for k,v in lookup.iteritems()}
于 2013-01-05T14:04:45.367 に答える
2

Python の enumerate を使用して、値を反復処理し、各値のインデックス位置を提供できます。

grid = [["Z","9","G","Q","T","3"],
    ["Y","8","F","P","S","2"],
    ["X","7","E","O","R","1"],
    ["W","6","D","N","M","0"],
    ["V","5","C","L","K","U"],
    ["J","4","B","I","H","A"]]

search = 'D'

for rownum, row in enumerate(grid):
    for colnum, value in enumerate(row):
       if value == search:
           print "Found value at (%d,%d)" % (rownum, colnum)

これを、次のように、選択した関数構造に適合させることができます (グリッド内の値が一意の場合)。

def findvalue(grid, value):
    for rownum, row in enumerate(grid):
        for colnum, itemvalue in enumerate(row):
            if itemvalue == value:
                return (rownum, colnum)
    raise ValueError("Value not found in grid")

ValueError値が見つからない場合はa が発生するため、呼び出し元のコードでこれを処理する必要があります。

次に、0 から始まる行番号と列番号を A...F の文字にマッピングする必要がある場合は、次のようにします。

def numbertoletter(number):
    if number >= 0 and number <= 26:
        return chr(65 + number)
    else:
        raise ValueError('Number out of range')

これにより、次のことが得られます。

>>> numbertoletter(0)
'A'
>>> numbertoletter(1)
'B'

すべてをまとめると、次のようになります。

value = 'B'
row, col = map(numbertoletter, findvalue(grid, value))
print "Value '%s' found at location (%s, %s)" % (value, row, col)
于 2013-01-05T13:38:59.760 に答える
1

これは、グリッド内の文字の座標を取得する簡単な方法です:

def find_pos(s):
    for i, j in enumerate(grid):
        try:
            return i, j.index(s)
        except ValueError:
            continue
    raise ValueError("The value {0!r} was not found.".format(s))


>>> find_pos("O")
(2, 3)
于 2013-01-05T13:39:36.717 に答える