Ето я и трета задача. Срокът ви е до 18.04 17:00.
Примерния тест можете да намерите в GitHub хранилището.
Преди всичко се запознайте с това как (не) се предават задачи.
Ето я и трета задача. Срокът ви е до 18.04 17:00.
Примерния тест можете да намерите в GitHub хранилището.
Преди всичко се запознайте с това как (не) се предават задачи.
uuid4 и uuid какво са?
При достигане на лимита публикации коя се маха? Най-старата по час на създаване, или най-старата по ред на добавяне? Edit: всъщност е един и същ реда, игнорирайте въпроса.
followers и following set ли връщат, или каквото и да е итеруемо? Какво представлява нивото от приятели? Ако някой е приятел на подадения потребител, то той ще е на първо ниво, защото по дефиниция подадения го следва. Ако някой не бива следван от подадения, то той ще е някъде по-надолу в дървото(ако въобще е в него) и няма как да му бъде приятел по дефиниция. Следователно има приятели само на първо ниво и няма никъде другаде.
followers и following set ли връщат, или каквото и да е итеруемо?
Каквото и да е итеруемо. Аз все пак бих използвал set
при положение, че си говорим за множества.
Какво представлява нивото от приятели? Ако някой е приятел на подадения потребител, то той ще е на първо ниво, защото по дефиниция подадения го следва. Ако някой не бива следван от подадения, то той ще е някъде по-надолу в дървото(ако въобще е в него) и няма как да му бъде приятел по дефиниция. Следователно има приятели само на първо ниво и няма никъде другаде.
Така е. Този метод има смисъл само, ако всички потребители се следват взаимно.
Нека го променим до:
Връща всички потребители следени от потребителя с подаденото user_uuid
на
разстояние n
.
Пример:
>>> graph.follow(maria.uuid, ivan.uuid)
>>> graph.follow(ivan.uuid, pesho.uuid)
>>> list(graph.nth_layer_followings(maria.uuid, 2))
<<< [pesho.uuid]
Обновено е и условието на задачата с тази промяна.
А какво правим ако един потребител се намира на повече от 1 ниво? Примерно ако имаме следните отношения:
graph.follow(maria.uuid, ivan.uuid)
graph.follow(maria.uuid, pesho.uuid)
graph.follow(ivan.uuid, pesho.uuid)
list(graph.nth_layer_followings(maria.uuid, 2))
Трябва ли изходът тук да е [pesho.uuid]? Тъй като pesho е и 1-во и 2-ро ниво на следене от maria.
[pesho.uuid]
Няма значение дали го има на по-горни нива, важен е само зададения слой.
Това значи, че ако имаме:
graph.follow(maria.uuid, ivan.uuid)
graph.follow(ivan.uuid, maria.uuid)
list(graph.nth_layer_followings(maria.uuid, 10))
Ще трябва да върне [maria.uuid], което май няма много смисъл...
От условието: Публикация Съобщението е инстанция на типа Post с атрибути:
-> Публикация, Съобщение и Post са едно и също нещо?
@Николай От гледна точка на Мария няма 10-о ниво, така че би трябвало да е празен контейнер. Отново множество, нали?
@Десислава Едно и също са.
Т.е. не ни интересува дали потребител е достигнат вече от по-долно ниво, а си гледаме само зададеното?
@Тодор, благодаря за отговора, но ми се ще някой от екипа да каже, за да няма двусмислици и предположения. Авторът на задачата си знае най-добре. :)
Тестове (допълнение към тези на Кирил)
max_distance - Намира разстоянието до най-отдалечения потребител от потребителя с user_uuid в неговата свързана компонента.
това са всички потребители и във following, и във followers, нали? А ако потребителят не следи и не е следен, 0 ли да върнем?
nth_layer_followings(self, user_uuid, n)
Връща всички потребители следени от потребителя с подаденото user_uuid на разстояние n.
ще имаме да търсим във following на всички, които има потребителя за following и тн. по веригата?
Т.е. не ни интересува дали потребител е достигнат вече от по-долно ниво, а си гледаме само зададеното?
Да.
max_distance - Намира разстоянието до най-отдалечения потребител от потребителя с user_uuid в неговата свързана компонента. това са всички потребители и във following, и във followers, нали?
Не. Все пак си говорим за ориентиран граф. Ако има Иванчо следва Марийка то разстоянието от Иванчо до Марийка е 1. Път от Марийка до Иванчо няма.
А ако потребителят не следи и не е следен, 0 ли да върнем?
Ами технически погледнато, в такъв случай разстоянието е безкрайност. В Python това ще рече math.inf
.
За max_distance, както Десислава пита, ако подаденият не следва никого, math.inf ли да връщаме, или 0(по-логично ми се струва), или някакво друго изключение?
Отново за nth_layer_followings:
Възможно ли е потребител да следва себе си на разстояние >= 2? Т.е. , ако имаме цикъл трябва ли да изключваме началния потребител от резултата?
Здравейте, искам да попитам за max distance.Ако някой потребител се намира например на разстояние 2 и на разстояние 10 от user_uuid разстоянието 10 взима ли се под внимание и ако да, при наличието на цикъл максималното разстояние не е ли безкрайност?
@Александрина за max_distance потребителите се проверяват само по веднъж при най-близкото си срещане, което като бонус ще елиминира възможността за цикли, а за nth_layer_followings е важно дали го има на конкретния, независимо от присъствието му по-нагоре.
За max_distance, както Десислава пита, ако подаденият не следва никого, math.inf ли да връщаме, или 0(по-логично ми се струва), или някакво друго
Връщайте math.inf
.
Възможно ли е потребител да следва себе си на разстояние >= 2? Т.е. , ако имаме цикъл трябва ли да изключваме началния потребител от резултата?
Не. Потребител не следва себе си. Всъщност е добра идея да се хвърля изключение, ако бъде направен опит от типа graph.follow(foo.uuid, foo.uuid)
. Оставям на вас да изберете най-подходящото такова.
edit: С цел да избегна объркване и да оставим впечатление за неотговорени въпроси напомням:
Ако видите отговор със жълт фон на зададен въпрос от ваш колега (или от вас самите), това ще рече, че някой от екипа е прегледал този отговор и е потвърдил неговата коректност. С други думи, разглеждайте тези отговори като отговори дадени от нас (екипа зад курса).
Въпрос извън темата: Кога ще се обявят изискванията/насоките за проектите?
Потребител не може да следва себе си, но ако имаме A -> B -> A, не се ли следва на второ ниво? Т.е. да го махнем от резултата? + тук няма как да има изключение :d
ПП. Ники, ето за проектите от миналата година какво е имало: http://2015.fmi.py-bg.net/tasks/4
На руби курса предния семестър също ни бяха дали разни съвети, не знам до колко е релевантно, но: https://github.com/fmi/ruby-course-guides/blob/master/course_projects.md
Още веднъж за слоевете (дано да е по-ясно и вярно): ако имаме входен потребител А и цикъл A -> B -> A спираме при първото срещане на А извън началното "състояние" и отговора зависи от това къде сме спрели, ако е на желания слой - връщаме контейнер от потребителите на него, но ако сме спрели по-рано контейнерът ще е празен. Ако, обаче, цикълът не включва А: А -> В -> С -> В, то тогава оставаме в него до достигане на слоя и тогава се връща контейнера.
Тези случаи, обаче, са прости. Може ли някой от екипа да разясни какво ще случи тук:
При търсене на ниво по-дълбоко от 3 какво ще стане? Търсенето по клона, който се връща към А се прекратява, а останалите продължават? Тогава резултатите ще бъдат 1: [B, E]; 2: [C, F]; 3: [D, E]; останалите четни нива: [F]; останалите нечетни нива: [E]. А ако се подаде ниво 0 какво се очаква, както и при несъществуващо ниво?
Какво се случва, ако на min_distance подадем едно и също uuid?
Не трябва ли nth_layer_followings на n-ти слой да връща потребители, които са на растояние n от подадения? Например в примера на Тодор: 1: {B, E} 2: {C, F} 3: {D} >=4: {}. Също така какво трябва да стане ако на nth_layer_followings подадем 0?
Ако подадем едно и също uuid на min_distance
, връщаме 0
Ако подадем 0 на nth_layer_followinds, то ще очакваме да върнете празна колекция
Николай е прав за примера нарисуван от Тодор, когато стигнем до вече посетен връх спираме обхождането
Последно при nth_layer_followings(self, user_uuid, n)
, ако няма такъв слой празна колекция ли да върнем или най-крайния слой?
Ако няма такъв слой, връщате празна колекция.
Последно, ако има път от А до Б и В, както и от Б до В, трябва ли В да влиза във втория слой на А, въпреки че го има и на първия (както пише в един от жълтите постове) или връх Х е в слой n на У само ако минималното разстояние от Х до У е n?
@Теодор Трябва да го има! (В трябва да е на първи и втори слой). Тук нямаме цикъл, така че няма нужда да прекратяваш обхождането.
Тук за max_distance от 0 трябва ли да върне 6 (0->1->2->3->4->6->7), нали?
Не мисля, че трябва да върне 6. Идеята е да намериш най-отдалечения потребител от дадения, минавайки по най краткия път. В случая 7 е на разстояние 3 от 0 (0-4-6-7). Все едно правиш обхождане в ширина.
Трябва да сте влезли в системата, за да може да отговаряте на теми.