Софтуерно Инженерство
Loading...
RoYaL avatar RoYaL SoftUni Team Trainer 6883 Точки

JS Basics подготовка за изпит 01.04.2015 - Задача 4

Днес присъствах на подготовката за изпит, която се проведе, и ми направи впечатление обсъждането около 4-та задача.

Задачата беше All that luggage от https://judge.softuni.bg/Contests/56/JavaScript-Basics-9-January-2015

Направи ми впечатление, че се кара малко на output driven development. Като ще трябва да изкараме един тип обект и директно се почва да се пълни такъв обект, пък после че трябва да се сортира - голяма работа :)

Накрая увиснахме с обект, който няма консистентни пропъртита. Единият има пропърти clothes, другият -  banana... :) Ходи ги сортирай.

Някой колега даде идея да се вкарат тези "багажи" в масив, а после да се изтрие квадратната скоба. Това би проработило, пак с известни хакове ще се сортират ключовете, но поне сортирането по килограми ще е по-лесно. За щастие нищо във входа не съдържа квадратни скоби и един стринг риплейс ще свърши работа. Аз не го намирам за много правилен вариант.

Това, което предлагам аз е да се пълни колекцията с туристи и багажи в удобен за програмиста начин, а не в удобен за изхода начин.

Една колекция, която съдържа обекти от следния тип

   ИмеНаТуриста: ...

   Багажи: {{нова колекция}}

         ИмеНаБагажа: ...

         Тегло: ...

         Чупливо: ...

         Тип: ...

         НачинНаТранспорт: ...

 

Това какво предимство ни дава? Можем да сортираме масив от обекти, по common property. Т.е. по ключ, който съществува във всеки един обект. А ако имаме ИмеНаБагажа и Тегло във всеки обект в колекцията с багажи, много лесно можем да сортираме тази колекция/масив.

И когато стане време да аутпутнем, просто ще превърнем нашия масив, в такъв обект какъвто го искат за изхода и ще го принтираме.

Прилагам едно решение, което скалъпих преди малко, може би не е най-оптиизираното, но имплементира тази идея. Със сигурност някои if-ове и цикли имат и по-хитър начин да се направят. Решението без коментарите е около 80 реда. Авторското е 50 реда, така че не казвам, че е по-кратко, но е reusable.

Използвам и един трик - нашия масив от багажи си има ключове "ИмеНаБагажа" и "Тегло", точно един от двата ключа, може да бъде критерий за сортиране. Така че директно взет от user input-а този критерий се слага във функцията за сортиране и се сортират. Няма нужда от switch/case. Има само един IF който проверява ако е "strict" да не прави нищо.

Позволих си да напиша целия този пост с идеята да дам хинт да се работи не по подхода - какъвто ще е изхода да тръгнем от него, а така да си нагласим нещата, че да са ни удобни за работа. Особено когато трябва да приложим сет от операции върху нещо голямо. Изходът винаги е трудната част в judge-а, но не трябва работата ни да се върти около него. Той се наглася все някак накрая :)

Ето го решението с коментари: http://pastebin.com/URpMje26

Успех на изпита.

12
JavaScript Fundamentals 02/04/2015 03:01:23
vesheff avatar vesheff 13 Точки

Здравей.
Погледнах кода и наистина е доста по-лесно да сортираш обектите по common property. Обаче забелязах една малка неточност.

/**
* Determine if a tourist already has a luggage with that name
*/
if (collection[k]["possessions"][p]["name"] == posessionName) {
delete collection[k]["possessions"][p]
break;
}

Това име на пропърти е грешно. Не се влиза в този цикъл въобще. Трябва да е luggagename.
Аз не виждам смисъл от тази проверка при положение, че няма случай да се повтаря багажа. Дори да има случай на повтаряемост, ти просто записваш нов обект и триеш стария. Не се добавят нито килограми, нито нищо.

P.S. Имам и един въпрос :)


Като се промени на luggagename и се сложат два еднакви багажа на един човек.
-------------------------------------------------------------------------------------------------
Пример:

'Kiko......*...sticks..*false.....*false......*...false..*..1.6..*.ATV',
'Kiko......*...sticks..*false.....*false......*...false..*..1.8..*.ATV',
--------------------------------------------------------------------------

Тогава се затрива стария обект със 1.6кг и се слага нов 1.8кг. Обаче се получава ето това.
Може би аз не знам нещо, ама що се получава тая гадост :)
http://imgur.com/WiarPp3

 

0
02/04/2015 22:26:55
RoYaL avatar RoYaL SoftUni Team Trainer 6883 Точки

Това не го знаех. Признавам си не бях отварял документацията за "delete". Сега я отворих, документирано е:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete

"When you delete an array element, the array length is not affected. This holds even if you delete the last element of the array."

Май в такива случая трябва да му намериш индекса и splice(index, 1);

 

0
vesheff avatar vesheff 13 Точки

Дамммм красота. Квото и да кажа ще е малко :D Моя любима JS 

0
RoYaL avatar RoYaL SoftUni Team Trainer 6883 Точки

https://pbs.twimg.com/media/CBHjP0bUQAE1zo0.jpg:large

0
Filkolev avatar Filkolev 4428 Точки

delete работи за триене на ключове от обекти, един вид просто прави стойността undefined. За масиви - да, splice е правилният начин.

0