지금 파이썬으로 프로그래밍하는 법을 배우고 있는데 한 가지 문제를 해결할 수 없습니다. 주요 작업은 시간이 많이 걸리고 교육 과정에서 일종의 마감일에 가까워졌습니다. 제발 도와주세요!
문제의 조건 : N을 기준으로 소스 텍스트가 압축 될 행렬의 크기가 계산됩니다. 제곱근은 N에서 추출되고 하한은 행렬의 행 수로 취해집니다. 상한은 열 수로 간주됩니다. 제품이 N보다 작 으면 줄 수를 늘립니다.
예를 들어 "hello boy abstract pizza"라는 텍스트 줄이 있습니다.
이 문자열의 길이는 21이고 제곱근은 4.58입니다. 21 개의 요소는 4x5 행렬로 압축되지 않으므로 5x5 행렬을 사용합니다.
[
['h', 'e', 'l', 'l', 'o'],
['b', 'o', 'y', 'a', 'b'],
['s', 't', 'r', 'a', 'c'],
['t', 'p', 'i', 'z', 'z'],
['a']
]
마지막으로, 우리는 위에서 아래로 그리고 왼쪽에서 오른쪽으로 열에 문자를 표시하고 공백으로 열을 구분하여 암호화 된 결과를 생성합니다.
hbsta eotp lyri laaz obcz
텍스트 메시지를 암호화하는 코드와 디코딩을위한 디코더를 작성합니다.
이 함수는 원래 문자열 "s"를 가져와이를 암호화 (encode = true)하거나 해독 (encode = false)하지만 물론 원래 공백은 없습니다.
내가 이미 한 것은 "암호화"부분 (아래 코드)입니다. 하지만 "복호화"하는 방법을 알아낼 수 없습니다.
def TheRabbitFoot(s, encode):
if encode:
s = s.replace(' ', '')
s_length = len(s)
s_sqrt = round((s_length ** 0.5), 2)
matrix_rows = int(s_sqrt // 1)
matrix_cols = int(str(s_sqrt)[2:3])
while matrix_rows * matrix_cols < s_length:
matrix_rows += 1
encrypt = []
while len(s) > matrix_cols:
encrypt.append(list(s[:matrix_cols]))
s = s[matrix_cols:]
else:
encrypt.append(list(s))
result = []
for i in range(matrix_cols):
for j in range(matrix_rows):
if i < len(encrypt[j]):
result.append(encrypt[j][i])
result.append(' ')
result = ''.join(result).strip()
print(result)
else:
??????????
답변 해 주셔서 감사합니다! 다음은 설명입니다.
동일한 기능으로 암호화 된 문자열을 해독 할 수 있도록 함수의 "해독"부분을 코딩해야합니다. 위의 예에서는 암호화 된 문자열을 얻습니다.
hbsta eotp lyri laaz obcz
공백없이 다시 암호를 해독해야하므로 다음과 같은 문자열을 반환해야합니다.
helloboyabstractpizza
해당 문자열에서 2D 목록을 만들고 열을 반복하려고합니다.
else:
decrypt = s.split()
result = []
for i in range(len(decrypt)):
string = decrypt[i]
string = list(string)
decrypt[i] = string
for i in range(len(decrypt[0]) - 1):
for j in range(len(decrypt[i])):
result.append(decrypt[j][i])
print(''.join(result))
하지만 색인을 엉망으로 만들면 다음과 같이 표시됩니다.
helloboyastratpiz
그래서! 예외없이이 문제를 해결하는 방법을 알아 냈습니다! 다음은 전체 코드입니다.
def TheRabbitFoot(s, encode):
def encrypt(string_to_encrypt):
string_to_encrypt = string_to_encrypt.replace(' ', '')
s_length = len(string_to_encrypt)
s_sqrt = round((s_length ** 0.5), 2)
matrix_rows = int(s_sqrt // 1)
matrix_cols = int(str(s_sqrt)[2:3])
while matrix_rows * matrix_cols < s_length:
matrix_rows += 1
encrypt_list = []
while len(string_to_encrypt) > matrix_cols:
encrypt_list.append(list(string_to_encrypt[:matrix_cols]))
string_to_encrypt = string_to_encrypt[matrix_cols:]
else:
encrypt_list.append(list(string_to_encrypt))
result_list = []
for i in range(matrix_cols):
for j in range(matrix_rows):
if i < len(encrypt_list[j]):
result_list.append(encrypt_list[j][i])
result_list.append(' ')
result_list = ''.join(result_list).strip()
return result_list
def decrypt(encoded_string):
encoded_string = encoded_string.split()
result = []
max_row_len = len(max(encoded_string, key=len))
index = 0
while index < max_row_len:
for j in range(len(encoded_string)):
if len(encoded_string[j]) - 1 < index:
break
else:
result.append(encoded_string[j][index])
index += 1
result = ''.join(result)
print(result)
return result
if encode:
encrypt(s)
else:
decrypt(s)
def decode(encoded_string):
# Split the characters at whitespace.
columns = encoded_string.split()
characters = []
index = 0
# Loop over the columns consuming the characters until
# we have no more and an IndexError occurs.
while True:
for column in columns:
try:
character = column[index]
except IndexError:
return ''.join(characters)
characters.append(character)
index += 1
예 :
decode('hbsta eotp lyri laaz obcz')
>>> 'helloboyabstractpizza'
설명
columns
. 예제의 경우 다음과 같은 목록입니다.['hbsta', 'eotp', 'lyri', 'laaz', 'obcz']
characters
디코딩 된 순서로 문자를 보관할 목록 을 정의합니다 .index
현재보고있는 문자 오프셋을 보유 하는 변수를 정의합니다 .index
에있는 각 문자열 의 위치에 있는 문자를 가져 와서 columns
목록에 추가 하는 루프를 시작 characters
합니다. 따라서 각 문자열에서 0 번째 위치에있는 문자를 가져온 다음 인덱스를 늘리고 각 문자열의 첫 번째 위치에서 문자를 가져옵니다.index
주어진 column
문자열에 존재하지 않는 문자를 가리 킵니다 .이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다