В чём различие двух решений? Python
Изучаю Python, в ходе самостоятельной работы на время, была дана задача, ниже её условия. Я считаю, что полностью выполнил условия, хочу спросить мнение профессионалов.
Задача "Разгром"
Ограничение времени 1 секунда Ограничение памяти 64Mb Ввод стандартный ввод Вывод damage.csv
Я понял, что времени терять нельзя. Проскользнув под грота-гиком, загородившим палубу, я по трапу сбежал в каюту. Трудно себе представить, какой там был разгром. Замки у всех ящиков были сломаны. Разбойники, вероятно, искали карту. Пол был покрыт слоем грязи, которую разбойники нанесли на подошвах из того болотистого места, где они остановились. На перегородках, выкрашенных белой краской и украшенных золотым багетом, остались следы грязных пальцев. Одна из медицинских книг доктора лежала раскрытая на столе. В ней не хватало доброй половины листов; вероятно, они были вырваны для раскуривания трубок. Посреди всего этого безобразия по-прежнему чадила тусклая лампа. Напишите программу, которая составит реестр разрушений. Вашему решению будет доступен файл с базой данных из трех таблиц такой структуры: Sides id, title, number_of_rooms, conveniences Rooms id, owner, side_id, size Protocol id, room_id, broken_thing, damage, can_be_repaired PIC Связи между таблицами: PIC В одной каюте может быть несколько сломанных вещей.
Формат ввода Вводится имя файла с БД, затем по какому борту находятся каюты и ущерб, начиная с которого рассматривать. Формат вывода В файл damage.csv записать в порядке уменьшения ущерба (damage) все вещи из этих кают, ущерб по которым не менее введенного (строку заголовков в файл писать не нужно). broken_thing;damage;can_be_repaired;owner;size
Код моего решения:
import sqlite3
import csv
con = sqlite3.connect(input())
cur = con.cursor()
conditions = input().split(' ')
result = cur.execute(f"""SELECT * FROM Protocol
WHERE room_id in (SELECT id FROM Rooms WHERE side_id in
(SELECT id FROM Sides WHERE title = '{conditions[0]}'))
and damage >= {conditions[1]}""").fetchall()
results = list()
for e in result:
result2 = cur.execute(f"""SELECT owner, size FROM Rooms
WHERE id = {e[1]}""").fetchall()
results.append([e[2], e[3], e[4], result2[0][0], result2[0][1]])
results = sorted(results, key=lambda item: item[1])[::-1]
with open('damage.csv', 'w') as csvfile:
fieldnames = ['broken_thing', 'damage', 'can_be_repaired', 'owner', 'size']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames, delimiter=';')
for elem in results:
writer.writerow({'broken_thing': elem[0], 'damage': elem[1],
'can_be_repaired': elem[2], 'owner': elem[3],
'size': elem[4]})
con.close()
При вводе данных из второго примера в csv файл записалось следующее:
partition;50;1;Hawkins;8
cabinet;40;1;Hawkins;8
lock;25;0;Hawkins;8
table;24;1;Silver;5
window;15;0;Hawkins;8
drawer;15;1;Hawkins;8
Проверяющая система не зачла мне ни одного балла за данную задачу, хотя, по моему мнению, решение удовлетворяет все условия.
Ниже приведу код, который я написал чуть позже, отличающийся на одну строчку:
import sqlite3
import csv
con = sqlite3.connect(input())
cur = con.cursor()
conditions = input().split(' ')
result = cur.execute(f"""SELECT * FROM Protocol
WHERE room_id in (SELECT id FROM Rooms WHERE side_id in
(SELECT id FROM Sides WHERE title = '{conditions[0]}'))
and damage >= {conditions[1]}""").fetchall()
results = list()
for e in result:
result2 = cur.execute(f"""SELECT owner, size FROM Rooms
WHERE id = {e[1]}""").fetchall()
results.append([e[2], e[3], e[4], result2[0][0], result2[0][1]])
results = sorted(results, key=lambda item: item[1], reverse=True)
with open('damage.csv', 'w') as csvfile:
fieldnames = ['broken_thing', 'damage', 'can_be_repaired', 'owner', 'size']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames, delimiter=';')
for elem in results:
writer.writerow({'broken_thing': elem[0], 'damage': elem[1],
'can_be_repaired': elem[2], 'owner': elem[3],
'size': elem[4]})
con.close()
Результат второго решения:
partition;50;1;Hawkins;8
cabinet;40;1;Hawkins;8
lock;25;0;Hawkins;8
table;24;1;Silver;5
drawer;15;1;Hawkins;8
window;15;0;Hawkins;8
Второе решение совпадает с ответом в системе, но, в условии не было указано, что необходимо как-либо сортировать результат, если несколько вещей с одинаковым уроном.
Вот комментарии учителя по поводу данной задачи:
В условии сказано - в порядке уменьшения ущерба, признак can_be_repaired имеет значение, поскольку вещь можно восстановить и будет меньший ущерб
В условии есть - В одной каюте может быть несколько сломанных вещей. При одинаковом ущербе (15) восстанавливать надо (1) и (0) и здесь ущерб уменьшается - на восстановление тоже нужны средства
Необходимо анализировать приведенные в условии примеры
Мои вопросы:
Отличается ли моё решение кардинально от необходимого? Если да, то как.
Корректно ли то, что в условиях не указанно, необходимо додумать самому?
Корректно ли отвечает учитель?