1

我正在尝试解决这个问题http://www.spoj.pl/problems/PEBBMOV/。我认为我有正确的算法,这不是这个问题的重点。这个问题有一个奇怪的输入文件。一个测试用例的输入应该是 n a1 a2 a3 ...an 的形式。(所有整数)

这里的问题是,在 a[i] 之间有杂散的换行符等。我需要能够跳过这样的换行符并在一个地方收集属于一个测试用例的所有 a[i]。我怎么知道这一切?好吧,一串 WA 和运行时错误,加上论坛上的一些研究。我有以下 python 代码来尝试执行此操作,但我似乎在关键地方步履蹒跚,只是无法完成。我希望在输入读取结束时的列表行[]中有适当的输入行。

有人可以在这里告诉我我的错误吗?还是建议更好的方法?提前致谢..

import sys
#data = sys.stdin.readlines()
#lines = inp.split('\n')
data = sys.stdin.read()
pos = 0
lno = 0

lines = []
while pos<len(data):
    while not data[pos].isdigit():
                   pos = pos + 1
num =data[pos]
print num
cur = pos + 1
numbers_collected = 0

x = [] # temp list
y = []
while numbers_collected < num:

    if cur<len(data) and data[cur].isdigit():
        y.append(data[cur])
        cur = cur + 1
        numbers_collected += 1
    else:
        if cur<len(data)and numbers_collected < num:
            cur = cur + 1
        else:
            break
print x
pos = cur
x.extend(y)
lines.extend(x)



for line in lines:
    print line
4

3 回答 3

2

这能帮助你回答你的问题吗?

In [1]: s1 = "1\n2\n\n3\n\n\n4\n\n\n\n5\n\n\n\n\n6"

In [2]: s1
Out[2]: '1\n2\n\n3\n\n\n4\n\n\n\n5\n\n\n\n\n6'

In [3]: s1.splitlines()
Out[3]: ['1', '2', '', '3', '', '', '4', '', '', '', '5', '', '', '', '', '6']

In [4]: [elem for elem in s1.splitlines() if elem]
Out[4]: ['1', '2', '3', '4', '5', '6']

如果没有看到示例输入,就很难回答这个问题。但是,SPOJ 问题页面不提供示例输入,因此 OP 无法提供不可用的内容。

于 2012-06-17T16:09:14.433 回答
0

这样的事情可以提供帮助:

numbers = map(int, sys.stdin.read().split())
#numbers = [1,2,3,4,5]

这是一个快速而肮脏的解决方案,因为它将所有空格都视为分隔符。

于 2012-06-17T16:14:47.750 回答
0

spoj 问题表明每个游戏只有一个输入行:

for line in sys.stdin:
    n, *piles = map(int, line.split())
    assert len(piles) == n

让我们假设在同一游戏中的数字之间可能有换行符:

numbers = (int(s) for line in sys.stdin for s in line.split() if line.strip())
for n in numbers:
    piles = list(itertools.islice(numbers, n))
    assert len(piles) == n
于 2012-06-17T16:18:02.753 回答