[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-вите тестове и въпреки това ми каза, че имам грешка в изчисленията и понеже когато го каза, аз наистина реших че е така, изгубих общо час в лутане, къде не смятам правилно.
Разбира се, не искам да обиждам никого, пиша това само с цел да бъда полезен на някой друг в същата ситуация, както и разбирам че няма как системата да е безгрешна. Просто се подразних, защото бях с по-големи очаквания за резултата си а се провалих един вид (въпреки, че имам достатъчно точки) заради нещо такова.
Хубав ден от мен и упсех на останалите :)
Както казах кода е "псевдо" и го написах на фантазия, просто за да се ориентирате къде е проблема, ако се налага ще постна моя след като минат и другите групи от изпита, но въпреки това, в посочения от вас пример, не виждам 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']);
По никакъв начин не можеш да извикаш "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']);
Много те моля, веднага след като завърши последния изпит да дадеш решението си на задачата, за да тествам най-коректно нещата. :)
Поздрави! :)
Здравей, колега! :) Изпитите по JavaScript Basics свършиха и вече можеш свободно да споделиш кода си. Моля те да пуснеш решението, което мислиш, че е проблемно, за да тествам най-адекватно. :) Благодаря ти предварително! :)
Привет и от мен,
Колкото и да ми е неприятно, при всички случаи проблема наистина е в липсата на String.prototype преди името на функията, тъй като вчера когато си разглеждах събмишъните липсваше.
В момента немога да си видя кода, който качвах на изпита, но тъй като запазих своя и сега го преработих така,че да ползва функцията както първоначално исках - поствам него. Пробвах го и нямаше проблем.
Кодът ми е за втора задача "Reveal Triangles":
function solve(input) {
var charR = "*";
var result = JSON.parse(JSON.stringify(input));
String.prototype.replaceAt = function(index) {
return this.substr(0, index) + charR + this.substr(index + charR.length);
}
for (var i = 1; i < input.length; i++) {
for (var ii = 0; ii < input[i].length; ii++) {
if (ii + 1 < input[i - 1].length && ii + 2 < input[i].length) {
if ((input[i][ii] == input[i][ii + 1] &&
input[i][ii + 1] == input[i][ii + 2] &&
input[i][ii + 2] == input[i - 1][ii + 1])) {
result[i] = result[i].replaceAt(ii);
result[i] = result[i].replaceAt(ii + 1);
result[i] = result[i].replaceAt(ii + 2);
result[i - 1] = result[i - 1].replaceAt(ii + 1);
}
}
}
}
var returnRes = "";
for (var i = 0; i < result.length; i++) {
returnRes += result[i] + "\n";
}
console.log(returnRes);
}
По интересното обаче е, че аз наистина използвах String.prototype . Функцията взех директно от ЛИНК и преди да пиша този отговор, пробах първо да го компилирам при мен без описването в прототипа, за да съм сигурен че не съм пропуснал при копирането и евентуално да се е изпълнявало при мен и от там да греша, но уви не стана. Не съм сигурен как съм успял да го омеся така, но тъй като не ми направи впечатление до сега, реших че е просто някаква лимитация, за което се извинявам.
Въпреки това интересно ми е дали има някаква промяна в системата свързана с този проблем от неделя до сега, защото това не ме оставя на мира :) .
Поздрави и благодаря за отделеното време, наистина го оценям
Уверявам те, че няма никакви промени по JavaScript executor-a още от началото на judge.softuni.bg ;) Наистина проблемът ти е, че не декларираш по правилен начин функцията, така че да можеш да я използваш над стрингове. :)
Намерих ти submission-a, за който говориш:
function solve(input) {
var charR = "*";
var result = JSON.parse(JSON.stringify(input));
function replaceAt(index) {
return this.substr(0, index) + charR + this.substr(index + charR.length);
}
for (var i = 1; i < input.length; i++) {
for (var ii = 0; ii < input[i].length; ii++) {
if (ii + 1 < input[i - 1].length && ii + 2 < input[i].length) {
if ((input[i][ii] == input[i][ii + 1] &&
input[i][ii + 1] == input[i][ii + 2] &&
input[i][ii + 2] == input[i - 1][ii + 1])) {
result[i] = result[i].replaceAt(ii);
result[i] = result[i].replaceAt(ii + 1);
result[i] = result[i].replaceAt(ii + 2);
result[i - 1] = result[i - 1].replaceAt(ii + 1);
}
}
}
}
console.log(result);
}
Мисля, че сам виждаш къде ти е грешката :)