Професионална програма
Loading...
niyazihasan avatar niyazihasan 81 Точки

Todo List 80/100

Здравейте, колеги

Някой може ли да помогне, защо не ми минава единия тест в Judge?

Това е условието на задачата:

You will receive a todo-notes until you get the command "End". The notes will be in the format: "{importance}-
{value}". Return the list of todo-notes sorted by importance. The maximum importance will be 10.

Input

Output

2-Walk the dog

1-Drink coffee

6-Dinner

5-Work

End

['Drink coffee', 'Walk the dog', 'Work', 'Dinner']

 Ето и кода:

command = input()
notes = [0] * 10

while command != "End":
    tokens = command.split("-")
    index = int(tokens[0])
    element = tokens[1]
    notes.insert(index, element)
    command = input()
result = []
for note in notes:
    if note != 0:
        result.append(note)
print(result)
Тагове:
0
Fundamentals Module
MartinBG avatar MartinBG 3828 Точки
Best Answer

На пръв поглед се забеляза, че не използвате правилно индексиране - индексите са от 0 до 9, докато приоритетите идват с номера от 1 до 10:

index = int(tokens[0]) - 1

Това не беше достатъчно за Judge, затова промених малко и структурата на notes:

command = input()
notes = [[] * 0 for i in range(10)]
while command != "End":
    tokens = command.split("-")
    index = int(tokens[0]) - 1
    element = tokens[1]
    notes[index].append(element)
    command = input()
result = []
for note in notes:
    if len(note) > 0:
        for n in note:
            result.append(n)
print(result)

 

Може би някой, който е по-навътре в Python ще може да даде по-смислено обяснение.

 

Aз лично, бих използвал dictionary за тази задача:

notes = {}

command = input()
while command != "End":
    tokens = command.split("-")
    importance = int(tokens[0])
    value = tokens[1]
    notes[importance] = value
    command = input()

result = []

for task in sorted(notes.items()):
    result.append(task[1])

print(result)

 

1
niyazihasan avatar niyazihasan 81 Точки

Благодаря

1
Dimitar_Damianov avatar Dimitar_Damianov 1 Точки

Причината, поради която е нужен вложен лист, е че вероятно при един от тестовете на Judge има повече от един task-a с еднакъв приоритет. По начина с един лист и функция insert() веднага щом получим втори task, с приоритет, който вече сме получавали, губим първия.

Пример:

3 - Walk the dog
3 - Feed the cat
End

Разглеждаме следното парче код:

tokens = command.split('-')
priority = int(tokens[0])
note = tokens[1]
notes.insert(priority - 1, note)

Лесно виждаме, че след първото изпълнение елементът с индекс 2 ще бъде променен на 'Walk the dog'. След второто изпълнение елементът с индекс 2 ще бъде променен на 'Feed the cat', като така губим предишния таск. Затова това решение получава 80/100.

1
Nikolay.Ishev avatar Nikolay.Ishev 1 Точки

Проблемът идва точно при повече от един task с еднакъв приоритет.

По време на while цикъла Insert не замества, а поставя всеки следващ елемент с еднакъв индекс пред предходния. Judge явно ги очаква в реда, в който са подадени в конзолата. Тоест ако имаме: 

2-Walk
2-Run
3-Dinner
End

с горния код ще получим резултат  ['Run', 'Walk', 'Dinner'], а judge очаква ['Walk', 'Run', 'Dinner']

1
19/12/2020 19:48:57