Help with code?

Array.reverse() просто “обръща” масива. Тоест ако имаш [1, 2, 3] ще ги направи [3, 2, 1], но ако имаш [1, 3, 2] ще си стане просто [2, 3, 1] което разбира се не е сортиран масив.
Колкото до arrow функцията и аз мисля, че на този етап е добре да не я ползваш, но алтернативата е нещо от тоя род.

let bool = true;
let change = 0;

while (bool) {    
    for (let i = 0; i < numbersArray.length; i++)
    if (numbersArray[i] < numbersArray[i+1]) {
        change = numbersArray[i];
        numbersArray[i] = numbersArray[i+1];
        numbersArray[i+1] = change;
        bool = true;        
        break;        
    } else {
        bool = false;
    }
}

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

1 Like

Благодаря. В кода ти има нещо, което не бях срещал преди. Значи ти създаваш цикъл for без да му създаваш блок с код за изпълнение и само използваш стойността на променливата i в conditional statements-ите.

Да, както често сигурно ще го чуваш “Това е JavaScript” :slight_smile:
Но те съветвам да не го правиш никога, аз съм го написал така от разсеяност, иначе по принцип никога не ползвам този синтаксис, защото повече може да те обърка, както вероятно е и станало.

2 Likes

Има го в повечето езици. Можеш да пропуснеш скобите ако има само един statement след това, само едно нещо правиш.

var value;
for (let i = 0; i < arr.length; i++)
    value = arr[i];

// ... Още код извън for-a вече

В случея на @Flanker if и else се приемат за едно твърдение.
Но не те съветвам да го правиш защото докато нямаш опит само ще те бърка.
Слагай скоби винаги.

Ако нямаш скоби, първият срещнат ред се приема за тяло на for-a

var value;
for (let i = 0; i < arr.length; i++)
value = arr[i]; // Тяло на for-a
value = arr[i]; // извън for-a
value = arr[i]; // извън for-a

И понеже if else вървят заедно се приемат за един ред все едно

var value;
for (let i = 0; i < arr.length; i++)
   if () {       
          // ...
       } else {
          // ...
       }

Но отново: Не го прави, че само ще те бърка сега.

2 Likes

Ок, това го разбрах. :slightly_smiling_face:

Може ли разяснение на кода, за подреждането на числата, линия по линия, защото не мога да разбера логиката?

https://jsfiddle.net/8k40hzmn/1/ Този код на задача https://learn.telerikacademy.com/mod/page/view.php?id=5310&forceview=1 не работи. Може да е заради този допълнителен ред, който създадох: let gets1 = this.gets1 || ((arr, index) => () => arr[index++])(nput, 0); .

Този код сработи https://jsfiddle.net/th3cjr5e/ :ok_hand:.

Като цяло ми се струва, че теб те обърква вземането на входни данни. Затова може би трябва да обърнеш внимание на това.
Иначе решението е доста просто ако вече си разбрал как работи цикълът.
Ще опитам да напиша някакво обяснение, дано ти е от полза, защото определено не ме бива особено да обеснявам.

const input = ['2,3,1', '5,2,3'];
const print = this.print || console.log;
const gets = this.gets || ((arr, index) => () => arr[index++])(input, 0);

// gets = '2,3,1' -> обърни го в масив като ползваш за
// разделител , /запетайката/ -> резултатът е [ '2', '3', '1' ]
const arrayOne = gets().split(',');
// gets = '5,2,3' -> обърни го в масив като ползваш за
// разделител , /запетайката/ -> резултатът е [ '5', '2', '3' ] 
const arrayTwo = gets().split(',');

// Сега имаме два масива с еднаква дължина - тоест с по 3 елемента

// Създаваме един нов празен масив който ще напълним с 'миксираните' елементи
let arrayFinal = [];

// Създаваме цикъл който ще 'върти' толкова пъти колкото са елементите на масива
for (let i = 0; i < arrayOne.length; i++) {
    // Добавяме в празния масив елемента на arrayOne който се намира на индекс i
    arrayFinal.push(arrayOne[i]);

    // Добавяме в празния масив елемента на arrayTwo който се намира на индекс i
    arrayFinal.push(arrayTwo[i]);
    
    // тоест след първия 'кръг' на цикъла когато i = 0 масивът
    // arrayFinal ще е със стойности ['2', '5']
    
    // след втория ще е със стойности ['2', '5', '3', '2']
    // накрая ще стане [ '2', '5', '3', '2', '1', '3' ]
}

// сега имаме масива arrayFinal който ще е
// със съдържание [ '2', '5', '3', '2', '1', '3' ]


// тъй като обаче трябва да го представим като STRING го обръщаме на такъв
// с метода toString(), като може да напишем и arrayFinal.join(',')
print(arrayFinal.toString()); 

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

Този, който ми описа аз го разбрах и сам, даже споделих вярното решение.

Прав си че имам проблем с input-а на данните.

let bool = true;
let change = 0;

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

// Тоест ако имаш [2, 3, 6] - ще попаднеш първо на 2 < 3 и това което правиш
// е да им смениш местата - [3, 2, 6].

// После имаш 3 > 2, значи прескачаш и стигаш до 2 < 6 и пак им сменяш местата
// и масивът вече е [3, 6, 2]. 

// Накрая имаш 3 < 6 и отново им сменяш местата - масивът става [6, 3, 2]
// Вече нямаш нито един случай на число което да е по-малко от следващото, не
// влизаш никога е IF блока, отиваш в ELSE блока и там "спираш" WHILE цикъла.

while (bool) {    
    for (let i = 0; i < numbersArray.length; i++)
// Ако настоящия елемент е по-малък от следващия
    if (numbersArray[i] < numbersArray[i+1]) {
// присвояваме го на друга променлива за да не го загубим като стойност
        change = numbersArray[i];
// заменяме настоящия елемент със следващия
        numbersArray[i] = numbersArray[i+1];
// а следващия заменяме със първоначалната стойност на настоящия
        numbersArray[i+1] = change;
// продължаваме ли да въртим WHILE цикъла? - да, защото не сме сигурни,
// дали не се налага да правим още размествания 
        bool = true;
// прекъсни текущия FOR цикъл        
        break;        
    } else {
// Ако никъде не сме имали случай следващото число да по-малко
// прекъсваме WHILE цикъла, значи масивът е подреден в низходящ ред.
        bool = false;
    }
}
1 Like

Благодаря.

https://jsfiddle.net/b1h6oed9/ До тук стигнах с тази задача и след това не мога да се оправя https://learn.telerikacademy.com/mod/page/view.php?id=5310&forceview=1.

Ако може помощ?

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

print(isSorted); трябва да го изнесеш и да се принтира само накрая на първия for, а не на всяка итерация на вътрешния for.

for(let i = 0; i < inputOne; i++){

   let some = gets().split(',').map(Number);
   let isSorted = true;
 
   for(let j = 0; j < some.length; j++) {
       if(some[j] > some[j+1]) {
           isSorted = false;
           break;
       } 
   }
   print(isSorted);
}

Това ти е решението, което е същото като твоето, просто print функцията е изнесена извън вътрешния for. Прегледай го и помисли защо трябва да е извън, защо не ти работеше така решението.

Не ми работеше така, защото brake; след isSorted = false; казва на програмата да излезне от внедрения цикъл и така никога не достига до print(isSorted);. А то дори и да нямаше brake; пак щеше да е погрешно, защото щеше да принтира и false и true всеки път, когато е в този цикъл.

Когато break-ваш, то излиза от втория да
прекратяваш го и се връщаш на първия, където имаш print функция след като вътрешния ти for е приключил.

Намерих една картинка която илюстрира break и continue, която е на python но принципите са същите

1 Like

Благодаря :ok_hand: .

Може ли да ми кажете тук let some = gets().split(’,’).map(Number); как програмата знае, че трябва да взима стринговете след първия, който е ‘3’ в моя случай?

Как това gets() взима стойностите след първата? Дали защото тук let inputOne = +gets(); вече съм взел първата стойност?

Правилно си разбрал - в случая, първата стойност вече е взета с първия gets. Всеки следващ gets взима стойността на следващия елемент от входа.

1 Like

Тук https://jsfiddle.net/pg0kh6u8/ защо ми дава само 80 т. ?

Не виждам от къде идва проблема?

Привет, може ли да дадеш условието?

Здравей, ето https://learn.telerikacademy.com/mod/page/view.php?id=5310.