本文最后更新于 252 天前,其中的信息可能已经有所发展或是发生改变。
其实这道题被要求用 C 语言 + 栈和队列解决,C 语言的作业写完之后我在想 Python 能写多长,于是随手搓给舍友看一下没有栈和队列,只用列表的解决思路。
问题描述
嘟嘟大魔王总是使用自己的一种非常精练而抽象的语言讲话,很少有人能听得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
| 嘟嘟大魔王语 | 人类语代码 | 备注 |
|---|---|---|
| A | abc…xyz | 一个嘟嘟大魔王语的大写字母,翻译成一串指定的嘟嘟大魔王语和人类语代码 |
| (θ b1 b2 b3 b4 … bn) | θ bn θ b(n-1) … θ b3 θ b2 θ b1 θ | 带括号的嘟嘟大魔王语翻转后,每个间隔添加出现的第一个字符 |
大写字母表示嘟嘟大魔王语,小写字母表示人类语代码。翻译过程中,嘟嘟大魔王语经过数次翻译后可能还混有嘟嘟大魔王语和人类语代码,需要完全处理到没有出现任何嘟嘟大魔王语。
指定数据
丽莎阿姨手上有一个词典:
| 嘟嘟大魔王语 | 人类语代码 |
|---|---|
| B | tAdA |
| A | sae |
| t | d | s | a | e | z | g | x | n | h |
| 天 | 地 | 上 | 一只 | 鹅 | 追 | 赶 | 下 | 蛋 | 恨 |
嘟嘟大魔王语为 B(ehnxgz)B,则翻译成人类语代码应该是:
tsaedsaeezegexenehetsaedsae
进一步翻译为人类语就是:
天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅
——嘟嘟大魔王
一种 Python 处理思路(仅限指定数据)
def translateB(kleelang: str) -> str:
"""
B方法括号翻转式翻译嘟嘟大魔王语到人类语代号
"""
pre = kleelang[0]
base = kleelang[1:]
baseR = reversed(base)
lang = [pre + i for i in baseR]
lang.append(pre)
return ''.join(lang)
def translateA(kleelang: str) -> str:
"""
A方法单字母递归翻译嘟嘟大魔王语到人类语代号
"""
if kleelang == 'A':
return "sae"
elif kleelang == 'B':
return "t" + translateA('A') + "d" + translateA('A')
def translate(kleelang: str) -> str:
"""
让程序选择AB方法翻译整串嘟嘟大魔王语到人类语代号
"""
act = ""
i = 0
while i != len(kleelang):
if kleelang[i] >= 'A' and kleelang[i] <= 'Z':
act += translateA(kleelang[i])
elif kleelang[i] == "(":
cur = i
while kleelang[cur] != ")":
cur += 1
act += translateB(kleelang[i+1:cur])
i = cur
else:
act += kleelang[i]
i += 1
return act
def toHuman(kleelang: str) -> str:
"""
人类语代号翻译为人类语
"""
human = ""
for i in kleelang:
if i == 't':
human += "天"
elif i == 'd':
human += "地"
elif i == 's':
human += "上"
elif i == 'a':
human += "一只"
elif i == 'e':
human += "鹅"
elif i == 'z':
human += "追"
elif i == 'g':
human += "赶"
elif i == 'x':
human += "下"
elif i == 'n':
human += "蛋"
elif i == 'h':
human += "恨"
return human
if __name__ == "__main__":
klee = input("请输入嘟嘟大魔王语:")
klee1 = translate(klee)
human = toHuman(klee1)
print(f"魔王中间语言:{klee1}")
print(f"人类语言:{human}")




