Loading...
RoYaL avatar RoYaL Trainer 6849 Точки

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 Trainer 6849 Точки

Това не го знаех. Признавам си не бях отварял документацията за "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 Trainer 6849 Точки

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

0
Filkolev avatar Filkolev 4482 Точки

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

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.