CTF 数表 乘积

截屏2024-04-27 00.54.26.png

截屏2024-04-27 00.54.46.png

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

file.jpg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
python复制代码import pytesseract
from PIL import Image, ImageEnhance

# 打开图像文件
img = Image.open("file.jpg")

# 增强图像对比度,使文本更清晰
enhancer = ImageEnhance.Contrast(img)
img_enhanced = enhancer.enhance(1.5) # 调整对比度的级别

# 调整图像大小并应用阈值过滤器进行二值化处理
img_resized = img_enhanced.resize((1024, 768))
img_binarized = img_resized.convert("L").point(lambda x: 0 if x < 128 else 255, "1")

# 配置 Tesseract 以将图像视为单一块文本
custom_config = r"--oem 3 --psm 6"
text = pytesseract.image_to_string(img_binarized, config=custom_config)

# 替换识别结果中的度数符号为一个空格
text = text.replace("°", " ")
# print(text)


# 处理识别的文本,将其转换为二维数组
def convert_text_to_matrix(text):
# 根据换行符分割文本为多行
lines = text.strip().split("\n")

# 初始化二维数组
matrix = []
for line in lines:
# 过滤掉非数字字符,并以空格分割每一行中的数字
numbers = line.strip().split()
# 将字符串中的数字转换为整数列表
number_list = [int(num) for num in numbers if num.isdigit()]
# 如果列表非空,则添加到二维数组中
if number_list:
matrix.append(number_list)

return matrix


# 调用函数,将文本转换为二维数组
matrix = convert_text_to_matrix(text)

# 打印转换后的二维数组
print("矩阵:")
for row in matrix:
print(row)


# 辅助函数:计算列表中连续五个元素的乘积
def product_of_five(numbers):
from functools import reduce
from operator import mul

return reduce(mul, numbers)


# 定义函数计算最大乘积
def max_product(matrix):
n = len(matrix)
max_prod = 0 # 初始化最大乘积为 0
max_numbers = [] # 初始化最大乘积对应的数字序列

# 遍历矩阵的行和列
for i in range(n):
for j in range(n - 4):
# 计算每行的连续五个数字的乘积
row_prod = product_of_five(matrix[i][j : j + 5])
# 更新最大乘积和数字序列
if row_prod > max_prod:
max_prod = row_prod
max_numbers = matrix[i][j : j + 5]

# 计算每列的连续五个数字的乘积
col_prod = product_of_five([matrix[j + k][i] for k in range(5)])
if col_prod > max_prod:
max_prod = col_prod
max_numbers = [matrix[j + k][i] for k in range(5)]

# 遍历矩阵的对角线
for i in range(n - 4):
for j in range(n - 4):
# 计算主对角线上连续五个数字的乘积
diag1_prod = product_of_five([matrix[i + k][j + k] for k in range(5)])
if diag1_prod > max_prod:
max_prod = diag1_prod
max_numbers = [matrix[i + k][j + k] for k in range(5)]

# 计算副对角线上连续五个数字的乘积
diag2_prod = product_of_five([matrix[i + k][j + 4 - k] for k in range(5)])
if diag2_prod > max_prod:
max_prod = diag2_prod
max_numbers = [matrix[i + k][j + 4 - k] for k in range(5)]

# 对最大乘积对应的数字序列中的每一位数字进行排序
password = "".join(sorted("".join(map(str, max_numbers))))
return max_prod, password # 返回最大乘积和排序后的密码字符串


# 调用函数计算最大乘积和密码串
max_prod, password = max_product(matrix)
print("MAX SUM:", max_prod) # 打印最大乘积
print("PassWord:", password) # 打印排序后的密码串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
csharp复制代码矩阵:
[71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33]
[60, 99, 13, 45, 22, 44, 75, 33, 53, 78, 36, 84, 20, 35, 17]
[28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38]
[68, 32, 62, 12, 20, 95, 63, 94, 39, 63, 68, 40, 91, 66, 49]
[25, 66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89]
[89, 75, 10, 76, 44, 20, 45, 35, 14, 30, 61, 33, 97, 34, 31]
[28, 22, 75, 31, 67, 15, 94, 63, 80, 44, 62, 16, 14, 79, 53]
[42, 96, 35, 31, 47, 55, 58, 88, 24, 70, 17, 54, 24, 36, 29]
[48, 35, 71, 89, 67, 95, 54, 61, 37, 44, 60, 21, 58, 51, 54]
[68, 15, 64, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77, 34, 89]
[83, 90, 35, 90, 16, 87, 97, 57, 32, 16, 26, 26, 79, 33, 27]
[87, 57, 62, 20, 72, 23, 46, 33, 67, 46, 55, 12, 32, 63, 93]
[73, 38, 25, 39, 11, 24, 94, 72, 18, 58, 46, 29, 32, 40, 62]
[41, 72, 30, 23, 88, 34, 62, 92, 69, 82, 67, 59, 85, 74, 84]
[29, 78, 31, 90, 31, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57]
MAX SUM: 2171903490
PassWord: 1455677899

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%