Checkio Cipher Map(栅格密码——转置密码)

# 栅格密码 #密码破解

密码格栅是一个 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'])

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值