mirror of
https://github.com/InternLM/InternBootcamp.git
synced 2026-04-22 16:49:04 +00:00
init-commit
This commit is contained in:
commit
18a552597a
3461 changed files with 1150579 additions and 0 deletions
148
internbootcamp/libs/cipher/KorPathCipherEnvironment.py
Executable file
148
internbootcamp/libs/cipher/KorPathCipherEnvironment.py
Executable file
|
|
@ -0,0 +1,148 @@
|
|||
from .BaseCipherEnvironment import BaseCipherEnvironment
|
||||
|
||||
class KorPathCipherEnvironment(BaseCipherEnvironment):
|
||||
def __init__(self, *args, **kwargs):
|
||||
problem_description = ''
|
||||
super().__init__(problem_description, *args, **kwargs)
|
||||
|
||||
@property
|
||||
def cipher_name(self) -> str:
|
||||
return 'Kor_rule17_PathCipher'
|
||||
|
||||
def encode(self, text, **kwargs):
|
||||
# 将输入转换为大写字母并去除非字母字符
|
||||
text = ''.join([char.upper() for char in text if char.isalpha()])
|
||||
print(f"1. 输入文本转换为大写并去除非字母字符: {text}")
|
||||
|
||||
# 计算行数和列数
|
||||
cols = 5
|
||||
text_length = len(text)
|
||||
rows = (text_length + cols - 1) // cols
|
||||
print(f"2. 确定网格大小: {rows}行 x {cols}列")
|
||||
|
||||
# 创建空网格
|
||||
grid = [[' ' for _ in range(cols)] for _ in range(rows)]
|
||||
|
||||
# 按照特殊方式填充网格
|
||||
index = 0
|
||||
print("3. 开始填充网格:")
|
||||
for i in range(rows):
|
||||
if i % 2 == 0:
|
||||
print(f" 第{i+1}行从左到右填充:", end=" ")
|
||||
for j in range(cols):
|
||||
if index < len(text):
|
||||
grid[i][j] = text[index]
|
||||
print(text[index], end=" ")
|
||||
index += 1
|
||||
print()
|
||||
else:
|
||||
print(f" 第{i+1}行从右到左填充:", end=" ")
|
||||
for j in range(cols - 1, -1, -1):
|
||||
if index < len(text):
|
||||
grid[i][j] = text[index]
|
||||
print(text[index], end=" ")
|
||||
index += 1
|
||||
print()
|
||||
|
||||
# 按列读取并添加#号
|
||||
cipher_text = []
|
||||
print("4. 按列读取并添加#号:")
|
||||
for j in range(cols):
|
||||
print(f" 第{j+1}列:", end=" ")
|
||||
for i in range(rows):
|
||||
char = grid[i][j]
|
||||
if (i == rows - 1) and char != ' ':
|
||||
cipher_text.append(char)
|
||||
cipher_text.append("#")
|
||||
print(char, end="")
|
||||
break
|
||||
elif char == ' ':
|
||||
cipher_text.append("#")
|
||||
print("#", end="")
|
||||
break
|
||||
else:
|
||||
cipher_text.append(char)
|
||||
print(char, end="")
|
||||
print("#")
|
||||
|
||||
result = ''.join(cipher_text)
|
||||
print(f"5. 最终密文: {result}")
|
||||
return result
|
||||
|
||||
def decode(self, text, **kwargs):
|
||||
print(f"1. 收到密文: {text}")
|
||||
|
||||
# 分割密文
|
||||
cols = 5
|
||||
parts = text.split('#')
|
||||
parts = parts[:-1] # 移除最后一个空元素
|
||||
rows = max(len(part) for part in parts)
|
||||
print(f"2. 将密文分割成{cols}列: {parts}")
|
||||
|
||||
# 创建网格并填充
|
||||
grid = [[' ' for _ in range(cols)] for _ in range(rows)]
|
||||
print("3. 按列填充网格:")
|
||||
for j in range(cols):
|
||||
print(f" 第{j+1}列:", end=" ")
|
||||
for i in range(len(parts[j])):
|
||||
grid[i][j] = parts[j][i]
|
||||
print(parts[j][i], end=" ")
|
||||
print()
|
||||
|
||||
# 按特定顺序读取
|
||||
plain_text = []
|
||||
print("4. 按特定顺序读取:")
|
||||
for i in range(rows):
|
||||
if i % 2 == 0:
|
||||
print(f" 第{i+1}行从左到右读取:", end=" ")
|
||||
for j in range(cols):
|
||||
if grid[i][j] != ' ':
|
||||
plain_text.append(grid[i][j])
|
||||
print(grid[i][j], end=" ")
|
||||
print()
|
||||
else:
|
||||
print(f" 第{i+1}行从右到左读取:", end=" ")
|
||||
for j in range(cols - 1, -1, -1):
|
||||
if grid[i][j] != ' ':
|
||||
plain_text.append(grid[i][j])
|
||||
print(grid[i][j], end=" ")
|
||||
print()
|
||||
|
||||
result = ''.join(plain_text)
|
||||
print(f"5. 最终明文: {result}")
|
||||
return result
|
||||
|
||||
def get_encode_rule(self,):
|
||||
return """加密规则:
|
||||
- 输入:
|
||||
- 明文: 大写字母字符串,不含标点和空格
|
||||
- 输出:
|
||||
- 密文: 不含标点和空格的字符串
|
||||
- 准备:
|
||||
- 每行最大字符数: 5
|
||||
- 加密步骤:
|
||||
- 行数从1开始计数
|
||||
- 明文按特殊方式排列:奇数行从左到右写,偶数行从右到左写,每行最多五个字母
|
||||
- 例如,对于明文"LIDAHELLOWORLD",先从左到右写第一行为LIDAH,然后从右到左写第二行为WOLLE,然后从左到右写第三行为ORLD,写完的全部内容表示如下
|
||||
LIDAH
|
||||
WOLLE
|
||||
ORLD
|
||||
- 然后按列读取,每列从上到下读取,每读完一列加一个"#",读出的内容即为最终密文
|
||||
- 例如,上述写好的内容按列读取为LWO#IOR#DLL#ALD#HE#"""
|
||||
|
||||
def get_decode_rule(self,):
|
||||
return """解密规则:
|
||||
- 输入:
|
||||
- 密文: 不含标点和空格的字符串
|
||||
- 输出:
|
||||
- 明文: 大写字母字符串,不含标点和空格
|
||||
- 准备:
|
||||
- 行数: 5
|
||||
- 解密步骤(与加密步骤完全相反):
|
||||
- 对密文中的每个字符,从上到下写入;如果遇到#,则切换到下一列继续写入,直到整个密文写完
|
||||
- 例如,对于密文LWO#IOR#DLL#ALD#HE#,写出如下
|
||||
LIDAH
|
||||
WOLLE
|
||||
ORLD
|
||||
- 然后按照奇数行从左到右读,偶数行从右到左读的顺序依次读取,最终结果即为解密后的明文
|
||||
- 例如,对于上述写好的内容,第一行从左到右读为LIDAH,第二行从右到左读为ELLOW,第三行从左到右读为ORLD,最终全部内容连接起来,解密明文为LIDAHELLOWORLD"""
|
||||
Loading…
Add table
Add a link
Reference in a new issue