python - Python 中的 Kattis 波兰表示法挑战
问题描述
我正在尝试在 kattis.com 上进行波兰符号挑战。问题是,我觉得我已经完成了他们要求的一切,并且我已经尝试修复了我能想到的一切。我什至查找了其他一些解决方案,虽然他们的解决方案更干净,但我想在学习时继续我的解决方案。
为什么例如这个人的代码有效但我的无效?
这是我当前的代码:
import sys
case = 1
valid_ints = set([str(i) for i in range(-10,11)])
def simplify(index, myLine, processed):
while index+1 > 0:
if (myLine[index] == "+" or myLine[index] == "-" or myLine[index] == "*") and index < len(myLine)-2:
if myLine[index+1] in valid_ints and myLine[index+2] in valid_ints:
try:
processed = myLine[index+3:] + processed
a = str(myLine[index+1] + myLine[index] + myLine[index+2])
processed.insert(0, str(eval(a)))
del myLine[index:]
except:
processed = [myLine[index], myLine[index+1], myLine[index+2]] + processed
del myLine[index:]
elif len(myLine) < 3:
processed = myLine + processed
del myLine[index]
index -= 1
processed = myLine + processed
return processed
for line in sys.stdin:
myLine = line.split()
processed = []
index = len(myLine)-1
savedprocessed = []
processed = simplify(index, myLine, processed)
while True:
if savedprocessed == processed:
break
else:
savedprocessed = []
savedprocessed += processed
processed = simplify(len(processed)-1, processed, [])
result = " ".join(savedprocessed)
print("Case " + str(case) + ": " + result)
case += 1
if case > 5:
break
解决方案
你为 Python 带来了一些其他的语言风格,这是不必要的,因为 Python 更灵活。
我在这里尽可能地简化了。
在空格上拆分输入字符串并遍历标记。
对于表达式中的每个运算符,将 a 压入list
堆栈并将运算符及其操作数附加到list
.
list
现在从堆栈中弹出每个并处理list
def simplify(exp):
stack1 = []
ops = set('+*-')
for token in exp.split():
if token in ops:
stack1.append([])
stack1[-1].append(token)
stack2 = []
while stack1:
top = stack1.pop()
while len(top) < 3 and stack2:
top.append(stack2.pop())
if any(x.isalpha() for x in top):
simplified = ' '.join(top)
else:
top[0], top[1] = top[1], top[0]
simplified = str(eval(''.join(top)))
stack2.append(simplified)
return simplified
exp = '* - 6 + x -6 - - 9 6 * 0 c'
print(exp)
simplify(exp)
输出;
* - 6 + x -6 - - 9 6 * 0 c
* - 6 + x -6 - - 3 * 0 c
推荐阅读
- java - 如何将学生的分数存储在二维锯齿状数组中,并在 java 中使用循环外的输入?
- mysql - 在查询序列中禁用缓存
- python - 使用 scikit-image 在反向时钟方向上对图像执行极坐标变换
- r - 使用 RSelenium 从 HTML 页面的正文中提取文本
- laravel - 在 laravel 中借助 vue js 更新列值
- c# - 获取 NullReferenceException:升级到统一 2021.1.26f1 后未将对象引用设置为对象错误的实例
- android - 房间数据库:Livedata 观察者超过实际行大小
- php - imagecopyresampled 后,Alpha 通道覆盖底层非透明部分
- reactjs - 在 react-query 的查询函数中修改状态
- java - 为什么不使用 HashMap 来获取确切的枚举而不是一一比较呢?