В чём различие двух решений? 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) и здесь ущерб уменьшается - на восстановление тоже нужны средства

Необходимо анализировать приведенные в условии примеры

Мои вопросы:

  1. Отличается ли моё решение кардинально от необходимого? Если да, то как.

  2. Корректно ли то, что в условиях не указанно, необходимо додумать самому?

  3. Корректно ли отвечает учитель?


Ответы (0 шт):