Как читать несколько строк ввода в Python - PullRequest
3 голосов
/ 20 марта 2012

Я новичок в Python и пытался решить проблему интервью с Kingdom Connectivity.Хотя мне удалось решить проблему, у меня возникли проблемы с вводом заданного формата, я попробовал свое решение в своей системе, и вывод правильный, но как только я скомпилирую, вывода нет.

Ввод имеет вид:

5 5
1 2
2 3
3 4
1 3
4 5

Пожалуйста, помогите мне разобраться, как решить эту проблему.

В настоящее время я принимаю данные от raw_input() вцикл и разбиение с использованием a.split(' ').

Вот часть вопроса:

**Input Description:**

First line contains two integers N and M.

Then follow M lines ,each having two integers say x and y, 1<=x,y<=N , indicating there is a road from city x to city y.

**Output Description:**

Print the number of different paths from city 1 to city N modulo 1,000,000,000(10^9).If there are infinitely many different paths print "INFINITE PATHS"(quotes are for clarity).

**Sample Input:**

5 5
1 2
2 4
2 3
3 4
4 5

**Sample Output:**

2

**Sample Input:**

5 5
1 2
4 2
2 3
3 4
4 5

**Sample Output:**

INFINITE PATHS

Вот мое решение

import sys
import numpy as np
c=0
x=raw_input()
y=x.split(' ')
l=(int(y[0]),int(y[1]))
e=[raw_input() for i in range(l[1])]
f=[e[i].split(' ') for i in range(l[1])]
a=[map(int,i) for i in f]
b=[[0 for i in a] for j in range(l[0])]
for i in range(l[0]+1):
    for j in range(l[0]+1):
        if [i,j] in a:
            b[i-1][j-1]=1
        elif a[i-1][0]>=a[i-1][1]:
            print "INFINITE PATHS"
            sys.exit(0)
for i in range(0,l[1]): 
    d=np.linalg.matrix_power(b,i+1)
    c+=d[0][l[1]-1]   
print c

Вот скриншот enter image description here

Ответы [ 3 ]

3 голосов
/ 20 марта 2012

Мне было трудно понять вашу программу.Итак, я переписал его, и я думаю, что мою версию немного легче понять.

import sys
import numpy as np


line = raw_input()
max_val, num_paths = (int(n) for n in line.split())


# a will be a list of tuples of int, taken from the input.
#
# Each tuple represents a path, so this is effectively a sparse representation
# of a square matrix of possible paths.
#
# Input city numbers are 1-based, but we will treat them as 0-based, so
# subtract 1 from each value before appending to array a.

a = []
for _ in xrange(num_paths):
    line = raw_input()

    # TRICKY: subtract 1 to convert from 1-based to 0-based city numbers
    tup = tuple(int(n)-1 for n in line.split())

    if len(tup) != 2:
        raise ValueError, "input should only have two values per line"
    for n in tup:
        if not 0 <= n < max_val:
            raise ValueError, "value must be in range [1, %d]" % max_val
        if tup[0] >= tup[1]:
            #raise ValueError, "INFINITE PATHS"
            print "INFINITE PATHS"
            sys.exit(0)
    a.append(tup)


# Expand the sparse matrix representation into an actual square matrix.
# It should have a 1 anywhere a path was indicated with a tuple in list a,
# and a 0 everywhere else.
b = [ [0 for _ in xrange(max_val)] for _ in xrange(max_val)]
for i, j in a:
    b[i][j] = 1


c = 0
for i in xrange(num_paths):
    d = np.linalg.matrix_power(b, i + 1)
    c += d[0][max_val - 1]
print c

Моя версия печатает 2, когда приводится пример ввода.

Вот некоторые вещиЯ понял, как я работал над этим:

Первая строка дает нам константы (N и M в документации, представляющие максимальное допустимое значение и количество путей соответственно).Вы должны сохранять эти значения в переменных с хорошими именами, а не помещать их в список и ссылаться на них по индексу списка.Я использовал имена max_val и num_paths.Вы сами допустили ошибку: вы должны найти пути из города 1 в город N, поэтому проверка в конце должна быть d[0][max_val - 1];Вы использовали l[1], который num_paths, а не l[0].

b должен быть квадратной матрицей.Ваш код устанавливал ширину на основе длины a, но max_val и num_paths не всегда могут быть равны, поэтому это опасный способ сделать это.

Странно зацикливатьсякаждую возможную точку в квадратной матрице и проверьте, должна ли она быть установлена ​​в 1 или нет.Это также очень неэффективно, особенно потому, что тест in равен O (n), где n - длина массива a.Вместо этого создайте пустую квадратную матрицу, а затем просто зациклите пути и установите значения 1 для пути.

Аналогично, странно проверять входные значения в цикле, который инициализирует квадратную матрицу;лучше проверять входные значения по мере их чтения в цикле ввода.И снова это опасно, потому что num_paths может быть не связано с max_val.Также это неэффективно, потому что вы проверяли a[i-1][0] против a[i-1][1] один раз для столбца в b;это сравнение не использует значение j вообще.Вы делали каждую проверку пять раз;достаточно сделать каждую проверку по одному разу.

Существует идиома Python, которую я использовал, где вы можете использовать _ (единственное подчеркивание) в качестве имени переменной, если вам не важно значениеэтой переменной.Когда мы просто делаем что-то определенное количество раз с циклом и не будем использовать значение счетчика цикла ни для чего, я использовал _ в качестве переменной счетчика цикла.Это, конечно, не обязательно.

Чтобы ответить на ваш актуальный вопрос: я не вижу возможности для вашей программы не производить вывод.Я подозреваю, что может быть проблема на сервере, на котором выполняется эта тестовая проблема.Ваша программа всегда должна печатать «БЕСКОНЕЧНЫЕ ПУТИ» или какое-то целочисленное значение.

PS На самом деле я не понимаю, как работает ваша программа;в описании проблемы сказано, что вы должны указать несколько путей по модулю 1e9, и я не вижу ничего, что могло бы обеспечить это.

1 голос
/ 20 марта 2012

Вы можете прочитать указанный ввод следующим образом:

line = raw_input()
n, m = map(int, line.split())

for _ in range(m):
  line = raw_input()
  x, y = map(int, line.split())
  print x, y
0 голосов
/ 20 марта 2012

если у вас есть вход в файл input.txt в той же папке, что и скрипт:

with open("input.txt") as f:
    l = [int(i) for i in f.readline().split(" ")]
    a = []
    for line in f.readlines():
        a.append([int(i) for i in line.strip().split(" ")])
print(l, a)

если входные данные передаются в качестве аргумента командной строки:

import sys
input_string = sys.argv[1]
print(input_string) # test if this prints the input
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...