题目描述
Write Up
使用moss解码工具对字符串进行解码即可
参考文档
总结
本题属于解码中最为简单的一种,但是它代表了一种题目类型,MOSS密码,在难度稍高的题目中,或许不会给出直接的摩斯密码串,而是会通过文本,字符串等形式对点,横线,分隔符进行替换,我们需要找到上述三种类型的串,然后复原原有的字符,下面为一个简单的脚本,可以此类题目字符串转换成可以编码的类型,仅作参考:
# 莫斯密码解密脚本(修正版)
def morse_decoder(ciphertext, dot='.', dash='-', sep=' '):
# 标准莫斯密码映射表(可扩展)
morse_dict = {
'.-': 'A', '-...': 'B', '-.-.': 'C', '-..': 'D', '.': 'E',
'..-.': 'F', '--.': 'G', '....': 'H', '..': 'I', '.---': 'J',
'-.-': 'K', '.-..': 'L', '--': 'M', '-.': 'N', '---': 'O',
'.--.': 'P', '--.-': 'Q', '.-.': 'R', '...': 'S', '-': 'T',
'..-': 'U', '...-': 'V', '.--': 'W', '-..-': 'X', '-.--': 'Y',
'--..': 'Z', '.----': '1', '..---': '2', '...--': '3',
'....-': '4', '.....': '5', '-....': '6', '--...': '7',
'---..': '8', '----.': '9', '-----': '0',
'/': ' ', '': '' # 空格和空字符处理
}
# 分割字母序列
letters = ciphertext.split(sep)
decoded = []
for letter in letters:
if not letter: # 空分隔符跳过
continue
# 解析符号序列
symbols = []
i = 0
while i < len(letter):
# 优先尝试匹配较长的符号(横线)
if letter.startswith(dash, i):
symbols.append('-')
i += len(dash)
# 尝试匹配点
elif letter.startswith(dot, i):
symbols.append('.')
i += len(dot)
else:
# 无法识别的符号
raise ValueError(f"未知符号在位置 {i}: '{letter[i:i+10]}...'")
morse_code = ''.join(symbols)
# 查找莫斯码对应字符
decoded.append(morse_dict.get(morse_code, f'?{morse_code}?'))
return ''.join(decoded)
# ===== 使用示例 =====
if __name__ == "__main__":
# 示例1:标准莫斯密码
cipher1 = "..-./.-../.-/--./----.--/-../...--/..-./-.-./-.../..-./.----/--.../..-./----./...--/----./----./...../-----/....-/-----.-"
print("示例1 解密:", morse_decoder(cipher1, sep='/'))
# 示例2:中文符号(修正为PYTHON)
cipher2 = "短长长短-长短短长-长-短短短短-长长长-长短"
print("示例2 解密:", morse_decoder(
cipher2,
dot='短',
dash='长',
sep='-'
)) # 输出: PYTHON
# 示例3:多字符符号(修正为JAVA)
cipher3 = "dotdashdashdash dotdash dotdotdotdash dotdash"
print("示例3 解密:", morse_decoder(
cipher3,
dot='dot',
dash='dash',
sep=' '
)) # 输出: JAVA