【问题标题】:Kattis Polish Notation challenge in PythonPython 中的 Kattis 波兰表示法挑战
【发布时间】:2020-09-01 16:00:26
【问题描述】:

我正在尝试执行polish notation challenge on kattis.com。问题是,我觉得我已经完成了他们要求的一切,并且我已经尝试修复我能想到的一切。我什至查找了其他一些解决方案,虽然他们的解决方案更干净,但我想在学习的过程中继续我的解决方案。

为什么例如 this person's code 有效但我的无效?

这是我当前的代码:

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 polish-notation


    【解决方案1】:

    你为 Python 带来了一些其他的语言风格,这是不必要的,因为 Python 更灵活。

    我已经尽可能地简化了。

    在空格上分割输入字符串并遍历标记。

    对于表达式中的每个运算符,将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
    

    【讨论】:

    • 感谢四位您的出色回答,并为我的超慢回复感到抱歉!你的方法似乎以一种更简单的方式来解决问题,我印象深刻!但是我还是不明白为什么 Kattis 不接受我的解决方案?据我所知,我的代码(虽然不是最有效的)完成了挑战描述中要求的所有内容,但它无法通过测试用例 3。我知道以类似于你的,但我想了解为什么我的解决方案低于标准,除了它比它需要的更长而且可能更复杂。
    • 我觉得这是我必须错过的非常基本的东西,因为它是 47 个测试用例中的第 3 个,这可能意味着它只是测试一些非常简单的东西。但它没有给我任何关于它是什么的反馈。
    • + - 2 3 * 8 2 在您的代码中是 Case 1: + -1 16
    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多