Как я могу перейти от приема ввода к проверке ввода из списка?

#python

#python

Вопрос:

Это мой список ввода.

 class TestCase:
  def __init__(self,input,output):
    self.input = input
    self.output = output
    
testCases = []
t1 = TestCase((1,[''],['6 6'],['0 8 9 2 7 5'],['5 4'],['5 3'],['1 5'],['0 1'],['0 2'],['2 1']), 
                 'Case 1: 29 4')
testCases.append(t1)
 

И это мой код.

 num = int(input())

for i in range(num):
  input()

  v, e = list(map(int, input().split()))
  values = list(map(int, input().split()))
  edges = [[] for i in range(v)]
  for j in range(e):
    f, t = list(map(int, input().split()))
    edges[f].append(t)
  
  root = 0
  total = 0
  while len(edges[root]) > 0:
    t = [(x, values[x]) for x in edges[root]]
    dst = max(t, key=lambda x:x[1])
    total  = dst[1]
    root = dst[0]
  
  print("Case {}: {} {}".format(i 1, total, root))
 

Результат выглядит примерно так

 1

6 6
0 8 9 2 7 5
5 4
5 3
1 5
0 1
0 2
2 1
Case 1: 29 4
 

Мой вопрос в том, как я могу изменить свой код с приема ввода от пользователя на просто чтение или проверку его из списка (t1). Пожалуйста, помогите. Спасибо

У меня есть еще одна вещь. Как я могу запустить и проверить результат здесь? Я пробовал много раз, и в строке 6 возникла проблема, в которой говорится, что объект ‘tuple’ не вызывается. Что мне делать со всем этим?

 # Test script

for i in range(len(testCases)):
  print(testCases[i].input)
  print("*** Testing program with test case no.", i)
  %timeit global output; output=solve(testCases[i].input)

  if output==testCases[i].output:
    print("Okay")
  else:
    print("Incorrect!nExpected output:", testCases[i].output)
    print("Actual output:", output)
 

Вот ссылка на проблему
https://onlinejudge.org/index.php?option=com_onlinejudgeamp;Itemid=8amp;category=666amp;page=show_problemamp;problem=3798

Комментарии:

1. Почему ты хочешь это сделать? Это просто звучит как плохая идея. И дайте ссылку на проблему, пожалуйста.

2. Ваш код используется input() повсеместно, поэтому он ожидает, что его данные будут поступать из стандартного ввода. Вместо этого просто напишите его как функцию, которая ожидает список в качестве параметра, и используйте этот параметр в функции?

3. onlinejudge.org /… Это проблемная ссылка.

Ответ №1:

Вы можете переопределить определение input() функции, чтобы возвращать значения из вашего класса TestCase.

Кажется, я понимаю, в чем суть вашей структуры ввода. 1 В начале определяется, сколько наборов данных содержится в тестовом примере, а остальные значения представляют собой списки, содержащие такое количество элементов. Поскольку первое значение равно 1 , у вас есть только одно значение в каждом дополнительном списке. Это первое значение из каждого списка, которое вы хотите возвращать для каждого вызова input после первого.

Я предполагаю, что «Вывод», который вы показываете, на самом деле является пользовательским вводом, за исключением последней строки. Таким образом, при чтении из вашего набора данных вместо ввода пользователем, печать каждого значения, возвращаемого вашей input() функцией, проверит, что происходит, и даст вам вывод, который вы показываете.

Вот расширенная версия вашего кода, которая, я думаю, делает то, что вы хотите. Я добавил метод в ваш TestCase класс, чтобы возвращать входные данные для этого тестового примера по одному значению за раз. Я помещаю основную часть вашего кода в main() функцию, которая принимает TestCase объект. В main() я перегружаю input() , чтобы указать на этот новый метод внутри TestCase , чтобы возвращать ввод из тестового примера вместо получения его от пользователя. Мне вообще не нужно было менять основную часть вашего кода. Вот что я сделал:

 # Run the main code via the supplied "input" function.  This function's name
# shadows the global function with the same name on purpose, as the code in
# this function was originally written to only accept input from the user, and
# we're demonstrating how to allow input to come from elsewhere without changing
# the original code

def solve(input):

    num = int(input())

    for i in range(num):
        input()

        v, e = list(map(int, input().split()))
        values = list(map(int, input().split()))
        edges = [[] for i in range(v)]
        for j in range(e):
            f, t = list(map(int, input().split()))
            edges[f].append(t)

        root = 0
        total = 0
        while len(edges[root]) > 0:
            t = [(x, values[x]) for x in edges[root]]
            dst = max(t, key=lambda x: x[1])
            total  = dst[1]
            root = dst[0]

        result = "Case {}: {} {}".format(i   1, total, root)
        print(result)
        return result

class TestCase:
    def __init__(self, input, output):
        self.input = input
        self.output = output

        # Additional instance variable to track what test data value to return next
        self.input_ptr = 0

    # Additional method that returns the next test data value from the test case input
    def next_input(self):
        v = t1.input[self.input_ptr]
        r = str(v) if self.input_ptr == 0 else v[0]
        self.input_ptr  = 1
        print(r)
        return r

testCases = []
t1 = TestCase((1,[''],['6 6'],['0 8 9 2 7 5'],['5 4'],['5 3'],['1 5'],['0 1'],['0 2'],['2 1']),
                 'Case 1: 29 4')
testCases.append(t1)

# NOTE: The original behavior of the main code can still be obtained by passing the standard "input"
# function to it, like this:
#
# solve(input)

# Test script
for i in range(len(testCases)):
    print(testCases[i].input)
    print("*** Testing program with test case no.", i)
    output = solve(testCases[i].next_input)
    if output == testCases[i].output:
        print("Okay")
    else:
        print("Incorrect!nExpected output:", testCases[i].output)
        print("Actual output:", output)
 

Результат:

 1

6 6
0 8 9 2 7 5
5 4
5 3
1 5
0 1
0 2
2 1
Case 1: 29 4
Okay
 

Комментарии:

1. Большое вам спасибо, сэр! У меня есть еще одна вещь. Как я могу запустить и проверить результат здесь? Я пробовал много раз, и в строке 6 возникла проблема, в которой говорится, что объект ‘tuple’ не вызывается. Что мне делать со всем этим? # Тестовый сценарий для i в диапазоне (len(testCases)): print(testCases[i].ввод) print(«*** Тестовая программа с номером тестового примера», i) % времени глобального вывода; вывод = решение (testCases [i].ввод) если вывод ==Тестовые наборы [i]. вывод: print(«Okay») else: print(«Неверно! nExpected output:», testCases[i].output) печать («Фактический вывод:», вывод)

2. Вы просто хотите output = solve(testCases[i].next_input) вместо output = solve(testCases[i].input) этого . Чтобы не менять логику вашего существующего кода, вам нужна функция для вызова, которая действует как input() функция, но возвращает ваши тестовые данные. Эта функция — это метод, который я добавил в ваш класс TestCase. Вам нужно передать этот метод в основную solve() функцию, чтобы он вызывался вместо стандартной input() функции. Я обновил свой ответ, включив ваш новый код после внесения этого небольшого изменения.

3. OMG Большое вам спасибо! Ты — бог для меня. Наконец-то я могу спать спокойно. Я надеюсь, что у вас будут самые лучшие рождественские и новогодние каникулы в вашей жизни. Еще раз спасибо. Ты легенда!

4. Надеюсь, вы не возражаете, что я спрашиваю еще раз, сэр. Я пытаюсь добавить больше тестовых наборов, таких как t1, t2, t3, …., t10. Как я должен отредактировать его в next_input.

5. Я бы посоветовал вам не добавлять больше данных в ваш первый тестовый пример. Вместо этого просто создайте больше экземпляров TestCase … t2, t3, t4 и т.д. Это ведь очень просто, правда? Ваш код уже настроен для итерации по testCases списку. Просто добавьте к этому больше экземпляров объекта TestCase. Если вы хотите, чтобы в одном объекте TestCase содержалось несколько наборов данных, это будет немного сложнее. Попробуйте разобраться с этим самостоятельно. Держу пари, ты сможешь это сделать.