是什么原因导致三角形解决方案中的Sums中的NZEC(非零退出代码)错误?

时间:2013-06-23 08:19:43

标签: python python-2.7

我在codechef上做this practice problem。我已经solved this in C并试图在Python 2.7中做同样的事情。我在codechef判断中得到NZEC错误,这是“非零退出代码”。我不明白为什么会发生这种情况。该程序在我的计算机上运行正常。什么样的角落案例可以解决这个问题?

import sys
from itertools import islice

def p(): 
    cases = int(sys.stdin.readline())
    for case in xrange(cases):
        height = int(sys.stdin.readline())
        triangle = [map(int, i.split()) for i in islice(sys.stdin,height)]

        prev_row = triangle[0]
        for i in xrange(1, height):
            cur_row = triangle[i]

            cur_row[0] += prev_row[0]
            cur_row[len(cur_row) - 1] += prev_row[len(prev_row) - 1]

            for j in xrange(1, len(cur_row) - 1):
                if(prev_row[j - 1] > prev_row[j]):
                    cur_row[j] += prev_row[j - 1]
                else:
                    cur_row[j] += prev_row[j]

            prev_row = cur_row

        print max(prev_row)

p()

3 个答案:

答案 0 :(得分:1)

更改此行:

triangle = [map(int, i.split()) for i in islice(sys.stdin,height)]

到此:

triangle = [map(int, sys.stdin.readline().split()) for _ in xrange(height)]

来自docs

  

使用预读缓冲区后,合并next()   使用其他文件方法(如readline())无效。

#so.py
import sys
from itertools import islice
print list(islice(sys.stdin,3))
print sys.stdin.readline()

演示:

$ python so.py <abc
['2\n', '3\n', '1\n']
Traceback (most recent call last):
  File "so.py", line 4, in <module>
    print sys.stdin.readline()
ValueError: Mixing iteration and read methods would lose data

答案 1 :(得分:1)

不要将文件对象混合为迭代器,并在对象上调用.readline()

islice()上使用sys.stdin,您将对象视为迭代器,在引擎盖下调用file.next()。来自.next() documentation

  

为了使for循环成为循环文件行的最有效方式(一种非常常见的操作),next()方法使用隐藏的预读缓冲区。使用预读缓冲区的结果是,将next()与其他文件方法(如readline())组合起来并不正常。

解决方案是不使用.readline() 不使用文件对象作为迭代器。在这种情况下,使用next(sys.stdin)而不是sys.stdin.readline()来始终将对象用作迭代器。这比在任何情况下使用.readline()更有效:

def p(): 
    cases = int(next(sys.stdin))
    for case in xrange(cases):
        height = int(next(sys.stdin))
        triangle = [map(int, i.split()) for i in islice(sys.stdin, height)]

甚至:

def p(): 
    for case in xrange(int(next(sys.stdin))):
        triangle = [map(int, i.split()) for i in islice(sys.stdin, int(next(sys.stdin)))]

答案 2 :(得分:0)

请查看Codechef常见问题解答:

http://www.codechef.com/wiki/faq#Why_do_I_get_an_NZEC