HELP for (07. Easter Gifts) from Lists Basics - Exercise
Здравейте, може ли някой да помогне?
Тази задача я мъчва цял ден по различни начини. Въпреки, че нулевите тестове излизат, повече от 40/100 не успях да постигнa в Judge.
Благодаря предварително!
gift_names = input()
gift_names_list = gift_names.split()
length = len(gift_names_list)
gift = ''
is_no_money = False
command = input()
command_list = command.split()
while not is_no_money:
if command_list[0] == 'OutOfStock' and command_list[1] in gift_names_list:
gift = command_list[1]
index = gift_names_list.index(gift)
gift_names_list[index] = 'None'
if command_list[1] in gift_names_list:
continue
if command_list[0] == 'Required' and int(command_list[2]) <= length - 1:
gift = command_list[1]
gift_names_list[2] = gift
if command_list[0] == 'JustInCase':
gift = command_list[1]
gift_names_list[-1] = gift
command = input()
command_list = command.split()
if command == 'No Money':
is_no_money = True
for items in gift_names_list:
if items == 'None':
gift_names_list.remove('None')
break
print(' '.join(gift_names_list))
Здравейте,
Аз също доста се чудих със задачата, тъй като, въпреки че задачата си работи според условието, в judge получавах само 70%. Колега Мартин, благодаря за вашето решение, помогна ми да намеря къде е проблема.
Ще използвам за пример вашето последно решение. На ред 16 виждаме:
if 0 < index < len(gifts): ...
Така и не успях да намеря в условието, защо е необходимо да добавим "... 0 <...", но по някаква причина с това условие се появяват и останалите 30% в judge.
Тогава възниква следният въпрос: а ако искаме с команда Required да заменим първия предмет? Тогава индексът 0 няма да премине if-a и решението ще е грешно, но въпреки това judge го приема. Също така никъде в условието не пише, че индексът на Required не може да сочи на последния подарък чрез -1 или на предпоследния чрез -2 и т.н.
Може аз нещо да пропускам? Ако е така, ще съм благодарен някой да обясни.
Благодаря!
моето решение:
@miroslav.kostov.89
Коментарът Ви относно индекса е коректен.
Проверка трябва да е:
0 <= index < len(gifts)
или
-1 < index < len(gifts)
за да приема и индекс 0 като валиден.
Явно в Judge липсва тест с "Required" за индекс 0, иначе предложеното от мен решение по-горе нямаше да мине.
Отрицателните индекси, както и тези, по-големи от броя елементи, са невалидни за задачата.
Благодаря!
Здравей, MartinBG!
Благодаря за решението.
Аз също се тормозих със задачата, тъй като не ми даваше 100%. Най-накрая просто минах по Вашия код и пренаписвах части, докато видя от къде идва проблема. Е, оказа се, че е последната част, в която трябва да принтираме без "None". Аз използвах remove и ми даваше 70 от 100. В момента, в който написах по Вашия начин проверката и принтирането, ми изкара 100 :)
Би ли помогнал защо така се получава, тъй като явно някъде нещо ми убягва?
Пускам моя първоначален код и благодаря предварително!
gifts = input()
command = input()
gifts_list = gifts.split()
while command != "No Money":
command_list = command.split()
if command_list[0] == "OutOfStock":
for gift in gifts_list:
if gift == command_list[1]:
index = gifts_list.index(gift)
gifts_list[index] = "None"
elif command_list[0] == "Required":
index = int(command_list[2])
if 0 <= index < len(gifts_list):
gifts_list[index] = command_list[1]
elif command_list[0] == "JustInCase":
index = len(gifts_list) - 1
gifts_list[index] = command_list[1]
command = input()
for elements in gifts_list:
if elements == "None":
gifts_list.remove(elements)
print(" ".join(gifts_list))
@NikoletaKarachomakova
Проблемът е, че модифицирате колекцията (триете елементи), докато итерирате през нея, в резултат на което някои елементи ще бъдат пропуснати.
Нека разгледаме следния пример:
Резултата ще е 'b c a'
Най-добре ще разберем защо се случва това, ако дебъгнем кода с breakpoint на реда с for, като следим стойността на item в началото и на items в края на всяка итерация:
Това разминаване се случва, защото for цикъла вътрешно адресира елементите по индекс, започвайки от 0, 1, 2 .... и триейки елемента, към който сочи индекса, води до пропускане на следващия елемент в листа (в примера на стъпка 2 пропускаме 'b', защото индекса вече е 1, а 'b' се е преместил на индекс 0 след като сме изтрили първото 'а')
@MartinBG
Много благодаря за съдействието и префектното обяснение!
Изясних си пропуска.
Поздрави и успешен ден!