Важни подготвителни неща за изпита


31

Здравейте колеги, 

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

1. Да си направя три .js файла със следните templates:

function solve(input) {

    var len = input.length;

}

var test1 = [];

var test2 = [];

console.log(solve(test1));

console.log('-------------------------') // за да са ми отделени решенията на два теста 

console.log(solve(test2));

2. При задачите със стрингове е хубаво да се прави trim() колкото е възможно по-често или още в началото един цял replace на всички multiwhite-spaces с един:

string = string.replace(/  +/g, ' ');

3. Превръщане на стрингово число в number число: '21' * 1 = 21;

4. Да се внимава, ако в задачата има няколко for цикъла, да се използва i, j , k, m... да не се използва повторно i примерно, че може да стане мазало от горния for цикъл :)

5. Да се внимава и със търсенето на мин и макс. На първоначалните стойности да се присвояват +Infinity и -Infinity, че MIN_VALUE и MAX_VALUE не са типичните мин и макс валюта :) (виж. лекциите).

6. При обхождане на матрица, и ако се опитаме да вземем matrix[i+1][j+1], ако i+1 не съществъва (i + 1 === undefined), то ще гръмне, и аз лично съм се чудил 5 часа защо гърми :) изводът е първо да се провери дали i+1 съществува :)

7. Да се избягват Math... blah blah blah.. че са много бавни и може bgcoder да гръмне за време. Има си алтернативи. Math.floor == 22.3 | 1 (22). Math.pow == един for цикъл.

8. При стринговите задачи да се ползва автомат (символ по символ да се гледа и да се правят 15 хиляди if). (Задачите със стрингове могат и да се решават с парсване, но може да стане голямо мазало там) (Надявам се трейнърите да се смилят и да дадат малко по-не толкова завъртяни задачи, и да могат да се решават на части, примерно).

9. И може би най-важното за мен: да се проверява почти всеки ред дали ти изкарва това, което ти искаш, чрез проверяване с различни примери. Step by step :)

10. <good></luck>

п.п. ако някой иска и се сети нещо друго да сподели :)




Отговори



3
Браво, доста полезно. Само една малка забележка: |1 работи адекватно само за нечетни числа (завършващи на 1 в двоична бр. система), иначе дава следващото число: 22.3|1 = 23, 20|1 = 21, 21.3|1 = 21. Вземането на цялата част на дробно число става с |0: 22.3|0 = 22.

от topalkata (6442 точки)


5
 А parseInt() работи най-адекватно и се разбира лесно от колегите, които четат :)

от ivan.mihov1 (4988 точки)

3
Отучете ги тия неща докато е време, че ще ви бият някъде ...  ( 4 | 1 === 5 )

от westi3m (5621 точки)



11

 Да добавя нещо с което може да се поблъскате много - array.sort() не сортира числа като числа, а като стрингове.

За това :

  array.sort(function(a, b) {return a - b});


от ivan.mihov1 (4988 точки)


0
Да, бях го забравил. В проверката на домашните супер много го срещах :)

от g.yonchev (2087 точки)

0
 Аз едва ли ще го забравя след като 3 часа ругах на една задача заради това :)

от ivan.mihov1 (4988 точки)


14

Ще добавя и следните:

- да си направим една функция за проверка на числа : 

function isNumber(n) {
    return !isNaN(parseFloat(n)) && isFinite(n);
}

- пълнене на двумерен масив(матрица) :

var matrix = [], rows = 5, cols = 5 ,row , col , count = 0 ;

for(row = 0; row < rows; row += 1) {

     matrix.push( [] );

      for ( col = 0; col < cols; col += 1){

           matrix[row][col] = count;

           count += 1;

     }

}

- ако искаме да копираме масив и новия да не е с референция към стария ,а да е изцяло нов:

var numbers = [5, 6, 7, 8, 9];

var copy = numbers.slice();

numbers[1] = 100;

console.log(numbers); // [5,100,7,8,9];

console.log(copy); // [5,6,7,8,9];


от IvayloAndonov (1994 точки)


1

Здравей, функцията ти за проверка на числа не е правилна в този си вид.

Трябва да е:

function isNumber(n) {
    return !isNaN(parseFloat(n)) && Number.isFinite(n);
}

Source.

При пълненето на матрицата, трябва да инициализираш count = 0, иначе гърми.

Поздрави.


от wooden_jesus (2128 точки)


5
Ето и моите заготовки,които до момента съм си подготвил.Общо взето от домашното съм копирал функций да ги използвам на готово на изпита.Ето ги:  функций . Може някой да си хареса нещо.

от Pavel.Aslanov (428 точки)


1

  Още две, които много ми помогнаха:

- JS Еквивалента на string.IsNurrOrEmpty():

  function isEmpty(string) {
        return (string.length === 0 || !string.trim());
    };

- Проверка дали даден стринг е число:

function isNumeric(obj) {
        return obj - parseFloat(obj) >= 0;
}

 Тази вторара ми е малко хикс, но след много тестване не даде никакъв бъг. Във всички функции, които участва isNaN имаше проблем с даден тип числа, но в момента не се сещам точно какъв.


от ivan.mihov1 (4988 точки)


3

Аз имам едно скромно предложение за колегите, които дебъгват с firefox.

Когато си тествате втората задача,не пускайте while (true) {},защото ако ви е грешна задачата ,ще даде безкраен цикъл и ще забие браузъра. После като го пуснете, вероятно пак ще забие, дори и да сте променили скрипт-а.

Аз си пускам var i =0 while (i<10){i+=1} , дебъгвам си го да видя дали работи и после тествам с while (true).


от vvn050 (593 точки)


1
това важи и за Chrome

от achoraev (467 точки)

0

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

Ех, надявах се до изпита да мога да казвам "на око" за един цикъл ще спре ли или не (и да е наистина така, де), ама ... засега не би ...


от bnesheva (330 точки)


0
Някой сеща ли се за един хак ,който Дончо показа ,когато искаме да зачистим празните стрингове в масив? (не е trim)

от IvayloAndonov (1994 точки)


2

array = array.filter(function(item){

   return !!item;

})


от topalkata (6442 точки)

1

Може и без !!item:

arr = arr.filter(function (item) { return item; });


от lnikod4s (6538 точки)



1

Console.BufferHeight = 400;
            Console.WindowHeight = 44;
            var input = new List<string>();
            string line = Console.ReadLine();

            while (true)
            {
                if (line == "end")
                    break;
                input.Add(line);

                line = Console.ReadLine();
            }



            for (int i = 0; i < input.Count; i++)
            {
                input[i] = string.Format("\"{0}\"", input[i].Replace("\"", "\\\"").Replace("\\", "\\\\"));
            }


            Console.WriteLine("var test = [\n" + string.Join(",\n", input) + "\n];");

Ето един код, който наплясках набързо, за да си форматирам input за стрингове - paste-ва се input-а в конзолата, пише се end на следващия ред, и изплюва готов масив от стрингове на js.

                            

от kon.simeonov (5238 точки)


2

Здравейте!

Ето някои разширяващи методи, които съм използвал и които могат да бъдат полезни на изпита:

''.trimStart() String.prototype.trimStart= function() { return this.replace(/^\s+/,""); } ''.trimEnd() String.prototype.trimEnd= function() { return this.replace(/\s+$/,""); } [].remove(arg, all) // Removes the first element found from left to right in the array // Second argument should be truthy to remove all elements Array.prototype.remove = function(arg, all){ for(var i = 0; i < this.length; i++){ if(this[i] === arg){ this.splice(i,1); if(!all) break; else i--; } } }; [].removeAt(pos) // Removes the element at the position Array.prototype.removeAt = function(position){ this.splice(position,1); }; [].clear() // Removes all elements of the array Array.prototype.clear = function(){ this.length = 0; }; [].insertAt(arg, pos) // Inserts an element at a given position Array.prototype.insertAt = function(arg, position){ this.splice(position, 0, arg); }; [].contains(arg) // Checks if the array contains the given element Array.prototype.contains = function(arg){ for(var i = 0; i < this.length; i++) if(this[i] === arg) return true; return false; }; [].occurs(arg) // Counts the occurrences of a given element in array Array.prototype.occurs = function(arg){ var counter = 0; for(var i = 0; i< this.length; i++){ if(this[i] === arg) counter++; } return counter; };


Успех на всички!


от lnikod4s (6538 точки)


0
Доста полезно, благодаря!

Иначе си има и .trimLeft(), .trimRight, но поне при мен интелисенса не го показва и го налучках по интуиция :)
Имат, до колкото виждам, абсолютно същата функция :) 


0

Внимавайте с някои методи в JS като си тествате решенията в браузърите, защото може да работят, но в nodejs -> не. Причината е във версията на JavaScript-а. Така, в ES6 може да използваме направо функциите contains, startsWith и endsWith, но е по-сигурно да си ги добавим и в кода: gist


от heruelda (894 точки)


0
Абе гледам видеата за подготовка и не разбирам сега последно като стринг или като number си парсва bgcoder условието. Качих ги тия първите задачи директно с number-и - работи. Май вече числата са си числа, а?

от bnesheva (330 точки)


0
Аргументите ,които приемаш като тестове в функцията ти Solve са ви винаги масив от стрингове.Вече от самата задача зависи дали да си ги парсваш като нещо друго в решението или не.

от IvayloAndonov (1994 точки)