Help with code?

Това https://jsfiddle.net/krLmhbju/ ми дава само 80 т. .

https://learn.telerikacademy.com/mod/page/view.php?id=5309

Здравей,
проблема тук е във for цикъла. В програмирането индексите започват от 0 не от 1. От коя стойност да започне цикъла решаваш ти, зависи от задачата (алгоритъм за намиране на prime числа, примерно, започва от 2 защото първото prime число е 2, освен ако няма други указания). В този случай, ако началната стойност на i е 1, добявяш едно число по-малко и за това гърми кода. Останалите кейсове минават, понеже най-голямото число на входа не е на последната позиция.

1 Like

Зададох 1, защото исках да прескоча първият инпут, който е броя на реалните инпути.

Промених го на 0 и сега ми даде 100 т. . Интересното е, че във Visual Studio оутпута ми е NaN(когато е 0, когато е 1 ми дава най-голямото от останалите инпути).

Не се опитвай да разбереш сега как работи този ред:

let gets = this.gets || ((arr, index) => () => arr[index++])(input, 0);

Просто го приеми така, че +gets() не просто взема, а изкарва първият елемент от масива.

Ако имаш масив [1, 2, 3, 4, 5], операцията +gets() ще вземе първият елемент и в масива ще останат [2, 3, 4, 5].
Затова и няма смисъл да вземаш числата и да ги записваш в нов масив. Това ти е супер излишна операция. numbersArray.push(+gets());
Можеш директно да вземеш първото число с +gets() и след това във for цикъл да вземаш всяко следващо отново с +gets().

Нещо такова:

 let n = +gets();
 
 for (let i = 0; i < n; i++) {
       var currentArrayElement = +gets();
       // Обработваш го 
 }
1 Like

Добре, а как да взимам дължината на масив? С input.length?

Да, с input.length вземаш всички елементи от масива. Когато имаш задача в която първият елемент е броя на следващите елементи

let input = [
  '3',
  '10',
  '20',
  '30',
];

С input.length ще ти върне 4. Общо колко елемента има в масива.
с +gets() вземаш първият, най-горният, който ти е броя на следващите редове и в масива ти остава:

let n = +gets(); // Тук вземаш 3
let input = [
  '10', 
  '20',  // Оставащи елементи
  '30', 
];

Следващият път когато имаш +gets() отново ще вземе най-горният, първият елемент

let next_n = +gets(); // 10
let input = [
  '20',  // Оставащи елементи
  '30', 
];

Това +gets() работи на база индекс, но просто за сега го приеми, че взема и ти връща най-горният елемент.

input.length винаги ще ти връща 4, тоест броя елементи(всички).
Тоест:
Дори няколко пъти да извикаш +gets() и да вземаш елементи, input.length винаги ще показва колко са всички елементи от масива.
Това е защото +gets() не трие, а премества индекс, но да не задълбаваме.
Просто го запомни така към момента:

let length = input.length; // 4
let next_next_n = +gets(); // 20 и не измислих по-адекватно име за променливата
let input = [
  '30'  // Оставащи елементи
];

Дано съм ти бил полезен, ако нещо друго не ти е ясно, драскай смело.

1 Like

Даже много си ми полезен :slightly_smiling_face:. Аз знам за индексите в масив - [ 0, 1, 2, 3, 4, …]. Gets взима първия индекс(0). Как gets премества индекса?

Днес пробвах тази задача Find Largest Three Values и направих това https://jsfiddle.net/mo2atkue/1/?fbclid=IwAR21QeUN_SDBh4Se2Wc-JHQi1apF0oKw9Y71bmTd93iWrkq-WrL5JCjLx60. Не можах да измисля нищо по начина, по който ти ми каза.

Този код не работи така или иначе.

Като цяло срещам големи трудности на циклите, за разлика от предишните раздели и ще продължа да ви досаждам :slightly_smiling_face:.

Хммм, за тази задача е малко по… tricky.
Можеш да я решиш по няколко начина.
Първи вариант:
Вкарай въображение. Вместо да търсиш кои са най-големите 3 числа, можеш просто да сортираш масива и да вземеш последните 3 които не се повтарят. Още по-елегантен подход ще е да изкараш само различните числа, сортирани в нов масив. От него без проверки само си вземаш последните 3 числа.

let n = +gets();
let arr = [];

for (let i = 0; i < n; i++) {
    let element = +gets();
    arr.push(element);
}
let sortedArray = arr.sort((a, b) => a - b);

let first = sortedArray[arr.length - 1];
let second = sortedArray[arr.length - 2];
let third = sortedArray[arr.length - 3];

print(first + `, ` + second + ` and ` + third);

Друг вариант за решение е:

Правиш си 3 променливи като им задаваш най-ниска възможна стойност:

let first = Number.MIN_SAFE_INTEGER;
let second = Number.MIN_SAFE_INTEGER;
let third = Number.MIN_SAFE_INTEGER;

Пускаш for цикъл през масива и за всяко число проверяваш дали е по малко от first, second, third.

for (i = 1; i <= n; i++) {

	let currentValue = +gets();

	if (currentValue >= first) {
		third = second;
		second = first;
		first = currentValue;
	} else if (currentValue >= second) {
		third = second;
		second = currentValue;
	} else if (currentValue >= third) {
		third = currentValue;
	}

Дебъгни кода за да ти стане по-ясно какво се случва.
Ако currentValue е по-голямо число от first, значи то е новото най-голямо и first става равно на currentValue. Но преди това трябва да пренаредиш другите стойности.
Новото трето число е старото второ, новото второ е старото първо, новото първо е currentValue.
Същото се повтаря и за другите.

Съвет!!! Не прави copy, paste. Давам ти така решения за да ги разгледаш и дебъгнеш.
По-важно е да разбереш логиката на нещата, а не 100-те точки, затова отдели време да дебъгнеш двете решения и да схванеш защо и как работи.

2 Likes

Благодаря, разбира се, че не правя copy, paste. Гледам да разбера принципите и после сам да напиша програмата.

Тук for (i = 1; i <= n; i++) имаш грешка. Трябва да е for (i = 0; i <= n; i++).

Аз вчера бях направил това https://jsfiddle.net/mo2atkue/1/?fbclid=IwAR21QeUN_SDBh4Se2Wc-JHQi1apF0oKw9Y71bmTd93iWrkq-WrL5JCjLx60. Но не работи.

Само тази функция тук не можах да разбера. Ако може да обясниш?

Разбира се.

Прочети това: https://www.javascripttutorial.net/javascript-array-sort/

В общи линии: Когато дадеш .sort() на някой масив, той се сортира по default-ни правила.

Тоест:
Имаме масив

let input = [
  '2',
  '4',
  '3',
  '5',
  '1',
];

Пускаш един for цикъл който да мине през всички числа и да ги изпринтира на конзола:

let input = [
  '2',
  '4',
  '3',
  '5',
  '1',
];

for (let i = 0; i < input.length; i++) {
  console.log(input[i]);
}

Сега output на конзолата ще ти е 2 4 3 5 1
Очаквано.

Но ако добавиш input.sort(); ще сортира масива по предварително дефиниран начин. От най-малко към по-голямо.

let input = [
  '2',
  '4',
  '3',
  '5',
  '1',
];

input.sort();

for (let i = 0; i < input.length; i++) {
  console.log(input[i]);
}
// Output: 1 2 3 4 5

Но какво правиш ако искаш да сортираш масива във низходящ ред, тоест от най-голямото число към по-малко.
Тогава можеш във функцията .sort() да кажеш начина по който да се сортира.
.sort((a, b) => b - а) буквално се чете: Вземи две числа от масива (a, b) и ги пресметни b - a и ако след операцията b - a резултатът е по-голям от 0 значи ‘b’ е по-голямо, изкарай на предна позиция b.

(a, b) подаваш две числа на функцията и от изчислението което правиш, къде поставяш лявото и дясното число, казваш дали във възходяш или низходящ ред да ги сортира.
(a, b) => а - b) - Второто число трябва да е по-малко
(a, b) => b - а) - Второто число трябва да е по-голямо

let input = [
  '2',
  '4',
  '3',
  '5',
  '1',
];

input.sort();

for (let i = 0; i < input.length; i++) {
  console.log(input[i]);
}
// Output: 1 2 3 4 5

input.sort((a, b) => a - b); // a - b стандартно поведение

for (let i = 0; i < input.length; i++) {
  console.log(input[i]);
}
// Output: 1 2 3 4 5

input.sort((a, b) => b - a); // Второ число минус първото. От по-глямо към по-малко 

for (let i = 0; i < input.length; i++) {
  console.log(input[i]);
}
// Output: 5 4 3 2 1

И прочети това: https://www.javascripttutorial.net/javascript-array-sort/

1 Like

Страхотно обяснение. :ok_hand:

Как да превърна масив в редица от номера https://jsfiddle.net/dwoxbuj7/1/?
https://learn.telerikacademy.com/mod/page/view.php?id=5310&forceview=1

Изхода ми е масив от номера.

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

let input = ['3', '43', '55', '12', '2'];

input = input.map(Number); // [ 3, 43, 55, 12, 2 ]
1 Like

Изхода ми трябва да е това Output: 6, 5, 3, 2, 1.
На мен и без map масива ми е съставен от номера.

Въпроса ми беше как да имам такъв изход като във условието.

И това не работи https://jsfiddle.net/bu84L59g/1/. Защото изхода е string.

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

2 Likes

Здравей,
забележи, че входа ти е даден като един цял стринг, в който числата са разделени от запетая и интервал (, ). Стринговете имат метод split (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split), който превръща стинга на субстрингове и ги връща в масив. Както Симо каза по-горе, следващата стъпка е да превърнеш стринговете в числа, за да можеш да ги сортираш. Програмата би сработила и без превръщането, но аз бих се подсигурил. Накрая използваш метод join на масиви, като разделяш по запетая.

2 Likes

Не можах да се справя. Може ли да ми пратите решение?

https://pastebin.com/0bVwhQzC това е едно примерно решение. Опитай се да разбереш как става взимането на входните данни когато имаш като вход един стринг от символи, разделени по някакъв начин.

1 Like

Числата могат да се представят по същия начин и с numbersArray.reverse(); .

Защо винаги използвате arrow функцията?