我在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()
答案 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常见问题解答: