CTF 题目:easysum

你拿到了一个`15*15`的数表,请你求得数表中在一条线上(行、列、两个对角线)连续5个数的乘积的最大值,并将这5个数的10个数字按数字从小到大从左到右排列形成密码串,并分别提交。

 exp python 脚本

from PIL import Image, ImageEnhance  # pip install Pillow
import pytesseract  # pip install pytesseract
import re


# 定义函数,识别数表图片为二维数组列表
def image_to_matrix(image_path):
    # 打开并增强图像
    image = Image.open(image_path)
    image = ImageEnhance.Contrast(image).enhance(1.5).resize((1024, 768))

    # 使用 pytesseract 提取文本
    custom_config = r"--oem 3 --psm 6"
    text = pytesseract.image_to_string(image, config=custom_config)

    # 过滤不需要的字符
    filter_text = re.sub(r"[^\d\s]", "", text)

    # 将文本转换为矩阵
    matrix = [list(map(int, line.split())) for line in filter_text.strip().split("\n")]
    return matrix


# 定义函数找到序列的最大乘积
def find_max_prod(matrix, n):
    row_len, col_len = len(matrix), len(matrix[0])
    max_product = 0
    max_sequence = []

    for row in range(row_len):
        for col in range(col_len):
            # 检查所有四个可能的方向
            directions = [
                (0, 1),  # 水平
                (1, 0),  # 垂直
                (1, 1),  # 对角
                (1, -1),  # 反对角
            ]
            for dr, dc in directions:
                if (
                    0 <= col + dc * (n - 1) < col_len
                    and 0 <= row + dr * (n - 1) < row_len
                ):
                    product = 1
                    sequence = [matrix[row + i * dr][col + i * dc] for i in range(n)]
                    for num in sequence:
                        product *= num
                    if product > max_product:
                        max_product = product
                        max_sequence = sequence

    return max_sequence, max_product


# 数表图片转二维数组列表
matrix = image_to_matrix("file.jpg")

# 获取一条线上5个数的最大乘积和序列
max_sequence, max_product = find_max_prod(matrix, 5)

# 打印结果
print("最大乘积:", max_product)
print("具有最大乘积的序列:", max_sequence)
print("序列按照数字升序:", "".join(sorted("".join(map(str, max_sequence)))))

扩展

生成数表图片

import numpy as np
import matplotlib.pyplot as plt


def generate_list_array(n, lower=10, upper=99):
    # 使用 NumPy 生成随机矩阵
    np_array = np.random.randint(lower, upper + 1, size=(n, n))
    py_list = np_array.tolist()

    # 创建图像并设置背景为白色
    fig, ax = plt.subplots()
    ax.set_facecolor("white")  # 设置背景颜色为白色

    # 在图中为每个单元格添加黑色的数值标签
    for (i, j), val in np.ndenumerate(np_array):
        ax.text(j, i, str(val), ha="center", va="center", color="black")

    # 隐藏所有轴的边框线
    for spine in ax.spines.values():
        spine.set_visible(False)

    # 设置轴的外观
    ax.set_xticks(np.arange(n) - 0.5, minor=True)  # 设置网格线位置
    ax.set_yticks(np.arange(n) - 0.5, minor=True)
    # ax.grid(which="minor", color="gray", linestyle="-", linewidth=2)  # 显示网格线
    ax.tick_params(which="both", size=0)  # 隐藏主刻度
    ax.set_xticks([])
    ax.set_yticks([])  # 隐藏所有刻度标签

    # 设置轴的范围,使其围绕数值正好显示
    ax.set_xlim(-0.5, n - 0.5)
    ax.set_ylim(n - 0.5, -0.5)

    # plt.title("Matrix Visualization")

    # 保存图像到当前目录
    plt.savefig("matrix_visualization.png", format="png")
    # plt.show()

    # 格式化 NumPy 数组输出为字符串列表
    np_array = ["[" + " ".join(map(str, row)) + "]" for row in np_array]

    return py_list, np_array


py_list, np_array = generate_list_array(20)

print("标准的 Python 列表格式:")
for row in py_list:
    print(row)
print("\nNumPy 数组格式:")
for row in np_array:
    print(row)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值