1

我在codechef上做这个练习题。我已经在 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()
4

3 回答 3

1

改变这一行:

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

对此:

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

文档

作为使用预读缓冲区的结果,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
于 2013-06-23T08:53:38.673 回答
1

不要混合使用文件对象作为迭代器,并调用.readline()对象。

通过使用islice()onsys.stdin您将对象视为迭代器,file.next()在后台调用。从.next()文档中:

为了使 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)))]
于 2013-06-23T10:07:27.440 回答
0

请查看 Codechef 常见问题解答:

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

于 2013-06-23T09:30:52.083 回答