Loading...
hedwin avatar hedwin 8 Точки

[Judge] JavaScript - Проблем с Judge на изпита по JavaScript

Привет когели,

Пиша тази тема, защото вчера на изпита имаше грешка с компилатора, която ми коства много голяма част от оценката, тъй като в последсвие не ми стигна времето.

 

Пробелмът е следния: Ако използвате функция която в себе си използва референция на обекта от контекста,  не успява да се компилира. Псевдо пример:

function solve(input) {

    pubiesToBeard = function (num) {

        return new Array( num + 1 ).join( this );

    }

    var pubies = "Brada";

    console.log(pubies.pubiesToBeard(10));

}

 

Съответно подобно нещо ми гърмеше на 100% вярна задача, която се изпълняваше безпроблемно, на "компилатора", който сам си написах докъто пътувах, но не и в Judge. Може и да е станало ясно някога, някъде, но аз незнаех и за това пускам и темата.

 

Решението е нещо от типа на:

function solve(input) {

    pubiesToBeard = function (num, pubies) {

        return new Array(num + 1).join(pubies);

    }

    var pubies = "Brada";

    console.log(pubiesToBeard(10, pubies));

}

 

Също така, ще използвам и случая да споделя, че когато говорих с един от асистентите, всъщност ми се стори, че "обрах" резултата от въпроси "ма що не ми бачка програмата?!?", като това беше единствения път когато ми се е налагало да ползвам чужда "помощ". Не се оправдавам, но факт е, че програмата ми излизаше с правилни отговори при тестовете, а системата хвърляше грешка при компилация още на 0-вите тестове и въпреки това ми каза, че имам грешка в изчисленията и понеже когато го каза, аз наистина реших че е така,  изгубих общо час в лутане, къде не смятам правилно.

 

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

 

Хубав ден от мен и упсех на останалите :)

Тагове:
1
JavaScript Fundamentals
vladislav.karamfilov avatar vladislav.karamfilov 1123 Точки
Best Answer

Разбира се, че this работи. В твоя случай не си използвал правилно дефинираната функция "pubiesToBeard". Работата с this в JavaScript e по-специфична в сравнение с другите езици и трябва много да се внимава.

Твоят код използван правилно:

function solve(input) {

pubiesToBeard = function (num) {

return new Array( num + 1 ).join( this );

}

console.log(pubiesToBeard(10));

}

solve(['pesho'])

Всичко си работи коректно! :)

 

 

3
hedwin avatar hedwin 8 Точки

Както казах кода е "псевдо" и го написах на фантазия, просто за да се ориентирате къде е проблема, ако се налага ще постна моя след като минат и другите групи от изпита, но въпреки това, в посочения от вас пример, не виждам kak typeof this != "undefined" в случая, освен когато се позлва в друг контекст, като дори тогава вероятно взима основния обект - примерно window ако е в DOM или този, който вика solve() първоначално, но не и да бъде равна на променлива, което бях направил аз. Колкото за правилното изпозлване на this и вниманието, както казах работеше коректно при тестовете и това го заявявам напълно отговорно, поради факта, че е синтакс, който използвам с години и според мен, този вид употреба е валидна не само с javascript... За да се получи същия проблем с вашия код, вероятно трябва да се ползва по следния начин:

function solve(input) {

            pubiesToBeard = function (num) {

                return new Array(num + 1).join(this);

            }

           console.log(input[0].pubiesToBeard(10));

        }

        solve(['pesho'])

Това което се опитах най-просто е result = variable.customfunction(return modified this); да причини result = modified variable;

Бас държа, че проблема е в по-специфичното деклариране на функцията при изпълнение в Judge и вероятно иска 

String.prototype или нещо което просто няма как да знам, вероятно е моя грешка, просто не се сетих да пробвам с него, защото много бързах и когато видях че е в това проблема, просто промених повикванията и продължих.

 

Не ми е приятно да го кажа, но Вие сам казахте, че кода е валиден когато Ви го показах, както и се опитах да ви покажа резултата от него.

Въпреки това, не съм сигурен все още, че правилно го обяснявам, но ако приемем, че следният код е валиден при теста му в браузър, то мисля че няма да го компилира в Judge с хипотетична грешка при изпълнението на input[i].getChar(0); .

 

function solve(input) {

            String.prototype.getChar = function (index) {

                return this[index];

            }

            var result = "";

            for (var i = 0; i < input.length; i++) {

                result += input[i].getChar(0);

            }

            console.log(result);

        }

        solve(['pesho', 'pesho', 'pesho']);

 

 

0
vladislav.karamfilov avatar vladislav.karamfilov 1123 Точки

По никакъв начин не можеш да извикаш "input[0].pubiesToBeard(10)", защото не си закачил функцията към прототипа на String... Това, което си написал не работи и НЕ трябва да работи, просто защото не така работи езикът... Може би е най-добре да видя реалния пример, за да преценя дали това е грешка в Judge-a или не е, но от примерите, които даваш в момента проблемът мога да гарантирам, че не е в Judge. :)

Правилната употреба на това, което ти си написал е:

function solve(input) {

      String.prototype.pubiesToBeard = function (num) {

              return new Array(num + 1).join(this);

      };

      console.log(input[0].pubiesToBeard(10));
}

solve(['pesho']);

Много те моля, веднага след като завърши последния изпит да дадеш решението си на задачата, за да тествам най-коректно нещата. :)

Поздрави! :)

0
vladislav.karamfilov avatar vladislav.karamfilov 1123 Точки

Здравей, колега! :) Изпитите по JavaScript Basics свършиха и вече можеш свободно да споделиш кода си. Моля те да пуснеш решението, което мислиш, че е проблемно, за да тествам най-адекватно. :) Благодаря ти предварително! :)

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