# 栅格密码 #密码破解
密码格栅是一个 4×4 见方的纸,上面有四个窗口。 将格栅放在相同尺寸的纸上,编码器写下密码的前四个符号 窗户内(见下图)。 之后,编码器将格栅顺时针旋转 90 度。 之前写的符号隐藏在格栅下,干净的纸张出现在窗户内。 然后,编码器在窗户上写下密码的下一个四个符号,并将格栅旋转 90 度 再。 然后,他们写下以下四个符号并再次转动格栅。 最后,他们写下密码的最后四个符号。 如果没有相同的密码格栅,则很难从由 16 个组成的正方形中辨别密码 符号。
编写一个模块,使机器人在回家时能够通过代码轻松调用密码。
密码格栅和密码表示为字符串数组(元组)。
输入:密码格栅和密码作为字符串元组。
输出:字符串形式的密码。
例:
recall_password(['X...', '..X.', 'X..X', '....'],
['itdf', 'gdce', 'aton', 'QRdi']) == 'ICANTforgetIDDQD'
recall_password(['....', 'X..X', '.X..'、'......X'],
['xhwc', 'rsqx', 'xqzz', 'fyzr']) == 'rxqrwsfzxqxzhczy'
def generate_4x4_grid(grid_str_list):
"""
根据提供的grid字符串列表生成一个4x4的二维列表。
grid_str_list: 一个包含四个字符串的列表,每个字符串代表格栅的一行。
返回: 一个4x4的二维列表,其中'X'表示窗口位置,'.'表示空白位置。
"""
# 初始化一个4x4的二维列表,全部填充为'.'
grid = [['.' for _ in range(4)] for _ in range(4)]
# 遍历grid_str_list中的每个字符串和对应的索引
for i, row_str in enumerate(grid_str_list):
# 遍历row_str中的每个字符和对应的索引
for j, char in enumerate(row_str):
# 如果字符是'X',则在grid的对应位置放置'X'
if char == 'X':
grid[i][j] = 'X'
return grid
def get_x_positions(grid):
"""
获取二维列表中所有'X'字符的坐标。
grid: 一个二维列表。
返回: 一个包含所有'X'字符坐标的元组列表,每个元组代表一个(行索引, 列索引)。
"""
x_positions = [(i, j) for i, row in enumerate(grid)
for j, char in enumerate(row) if char == 'X']
return x_positions
def create_4x4_letter_grid(symbols):
"""
根据提供的符号列表创建一个4x4的字母表。
symbols: 一个包含四个字符串的列表,每个字符串有四个字符。
返回: 一个4x4的二维列表,包含所有字符。
"""
return [list(symbol) for symbol in symbols]
def extract_x_positions(grid, x_positions):
"""
根据提供的二维字符数组和'X'位置列表提取对应的字符。
grid: 一个4x4的二维字符数组。
x_positions: 一个包含'X'在grid中位置的二维坐标列表,如[(0, 0), (1, 2), ...]。
返回: 一个字符串,包含从'X'位置提取的字符。
"""
extracted_chars = []
for x, y in x_positions:
extracted_chars.append(grid[x][y])
return ''.join(extracted_chars)
def rotate_grid_clockwise(grid):
"""
将4x4的二维列表顺时针旋转90度。
grid: 一个4x4的二维列表。
返回: 顺时针旋转90度后的4x4二维列表。
"""
# 使用zip(*grid)进行转置,得到逆时针旋转90度的结果
# 然后反转每一行,从而得到顺时针旋转90度的结果
rotated_grid = [row[::-1] for row in zip(*grid)]
return rotated_grid
def recall_password(grid_str_list, symbols):
sentence = ""
grid = generate_4x4_grid(grid_str_list)
symbols = create_4x4_letter_grid(symbols)
for count in range(4):
grid = rotate_grid_clockwise(grid) if count >= 1 else grid
x_pos = get_x_positions(grid)
extracted_chars = extract_x_positions(symbols, x_pos)
sentence += extracted_chars
print(grid)
print(symbols)
print(extracted_chars)
print(sentence)
return sentence
recall_password(['X...', '..X.', 'X..X', '....'],
['itdf', 'gdce', 'aton', 'qrdi'])