Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вот такое задание, но я только в начале пути вэб разработки, подскажите как? (https://javascript.ru/forum/misc/75499-vot-takoe-zadanie-no-ya-tolko-v-nachale-puti-vehb-razrabotki-podskazhite-kak.html)

Dixlofos 15.10.2018 12:40

Вот такое задание, но я только в начале пути вэб разработки, подскажите как?
 
в textarea можно ввести сколько угодно строк текста, отдельно в коде задан массив символов, каждый знак в массиве должен быть уникальным, и каждому знаку соответствует - число, порядковый номер этого символа в массиве. требуется для каждой строки найти сумму всех известных символов и отсортировать строки сначала по кол-ву неизвестных символов (чем меньше неизвестных символов - тем выше строка), а затем все строки с одинаковым кол-вом неизвестных символов отсортировать по сумме известных символов строки (чем больше код - тем выше строка)

рони 15.10.2018 12:57

Dixlofos,
сделать html
найти темы разбить тест на строки
получить массив строк.
читать учебник по функциям массива https://learn.javascript.ru/
sort indexOf

j0hnik 15.10.2018 13:05

Dixlofos,
Написать решение? или сами пробовать будите?

Dixlofos 15.10.2018 13:14

хотелось бы мне, конечно самому разобраться в этом вопросе, но я не откажусь от подсказки. в каком направлении думать (хотя бы примерный алгоритм)

Dixlofos 15.10.2018 13:17

Цитата:

Сообщение от j0hnik (Сообщение 496363)
Dixlofos,
Написать решение? или сами пробовать будите?

хотелось бы мне, конечно самому разобраться в этом вопросе, но я не откажусь от подсказки. в каком направлении думать (хотя бы примерный алгоритм)

Alexandroppolus 15.10.2018 13:18

Цитата:

Сообщение от рони
indexOf

это здесь точно не понадобится ) первым делом из массива надо сотворить карту символ-номер, чтобы не искать каждый раз.

сортировка должна быть только одна, функция сравнения сначала сравнивает количество неизвестных, потом сумму известных

j0hnik 15.10.2018 13:50

1) создаем элемент textarea и получаем его например при помощи
https://developer.mozilla.org/ru/doc.../querySelector
2) добавляем какую нибудь кнопочку по нажатию на которую будет происходить все действия.
3) по событию клик на кнопочку добавляем обработчик который будет
получать value нашего textarea и делать из него массив при помощи .split(/\n/)
4) при помощи методов sort и reduce будет сортировать сразу по двум критериям (самое сложное но в гугле есть примеры)
https://developer.mozilla.org/ru/doc...cts/Array/sort
https://developer.mozilla.org/ru/doc...s/Array/Reduce
5) склеиваем массив в строку arr.join('\n') и вставляем обратно в textarea

j0hnik 15.10.2018 13:52

делайте все что сможете с самой сортировкой поможем

Dixlofos 15.10.2018 14:05

Цитата:

Сообщение от j0hnik (Сообщение 496372)
делайте все что сможете с самой сортировкой поможем

Спасибо большое. буду пытаться сделать

Dixlofos 15.10.2018 15:46

Цитата:

Сообщение от j0hnik (Сообщение 496372)
делайте все что сможете с самой сортировкой поможем

все-таки отдельной просьбой... решение, если можно)))))

j0hnik 15.10.2018 23:07

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>

<textarea id="area"></textarea><br>
<button id="btn">сортировать</button>
	<script>
	var dic = ['a','b','c','d','e','f','g','h','i','j','k','l'];
	var ots = (s, el)=> !dic.includes(el) ? ++s : s;
	var sum = (s, el)=>{
	 	var ind = dic.indexOf(el);
	 	return ind != -1 ? s + ind : s;
	 };
btn.onclick = e => {
	var arr = area.value
	.split(/\n/)
	.sort((a,b)=>(a.split('').reduce(ots,0) - b.split('').reduce(ots,0) ) || (b.split('').reduce(sum,0) - a.split('').reduce(sum,0)));
	area.value = arr.join('\n');
};

	</script>
</body>
</html>


над производительностью не заморачивался.

рони 16.10.2018 00:09

сортировка строк
 
j0hnik,
Alexandroppolus,
:thanks:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

<textarea id="area" rows="20">b
a
1111b
1111a</textarea><br>
<button id="btn">сортировать</button>
    <script>
    var dic = ['a','b','c','d','e','f','g','h','i','j','k','l'].reduce((obj, char, i) => (obj[char] = i, obj), {});
btn.onclick = e => {
    var arr = area.value
    .split(/\n/)
    .map(el => el.split("").reduce((obj,char) => (char in dic ? obj.sum += dic[char] : obj.len++, obj), {str : el, len : 0, sum : 0}))
    .sort((a,b)=>(a.len - b.len || b.sum - a.sum));
    area.value = arr.map(Object.values).join('\n'); //строка, кол-во неизвестных, сумма известных
};

    </script>
</body>
</html>

Задорожный Виталий 18.10.2018 19:24

Здравствуйте уважаемые форумчане. Я нахожусь в начале пути. Помогите с задачей. Голову сломал и тупик.

Напишите программу которая в последовательности натуральных чисел определяет сумму чисел, кратных 6. Программа получает на вход количество чисел в последовательности, а затем сами числа. В последовательности всегда имеется число кратное 6. Кол-во чисел не превышает 100. Введённые числа не превышают 300. Программа должна ввести одно число - сумму чисел кратных 6.
Вот что навоял, вариантов была масса - это последний.
var summ = 0;
for (var i = Number(prompt("число",0)); i<=100; i+=6){
if (i>100){
alert ("Ошибка");
}
else (summ +=i);
}
document.write(summ +"<br/>");
Понимаю что все не правильно, но знаю как отсеять методом деления (if i%6) continue. а как отсеянное вывести на экран? И alert не работает. Большое спасибо!

Задорожный Виталий 19.10.2018 12:10

или не туда или не то написал.:blink:

j0hnik 19.10.2018 15:47

Цитата:

Сообщение от Задорожный Виталий
Программа получает на вход количество чисел в последовательности, а затем сами числа.

не совсем понятно

рони 19.10.2018 16:22

j0hnik,
:-? получить длину массива от 1 до 100, затем элементы массива от 1 до 300, затем суммирование чисел кратных 6 из этого массива.

Задорожный Виталий 19.10.2018 17:08

я и сам плохо понимаю, но репетитор дал задачу и в интернете она тоже есть. только нет решения. количество чисел не превышает сто, а введенные числа не превышают 300. я подумал сначала что сделаю хоть как нибудь. сейчас надеюсь на Вас.

Задорожный Виталий 19.10.2018 17:20

Так откуда возьмутся 300 если ввели 100, а нужно только каждое 6 число. Если интересно, то их две однотипные задачи. Могу и её выложить, но если смогу эту то и ту тоже.

Nexus 19.10.2018 17:20

Можно оптимизировать.
const arrayLength=prompt('Кол-во элементов массива',3)||3;
const result=(prompt('Элементы массива через запятую','3,6,12')||'').split(',').slice(0,arrayLength).map(i=>+i.trim()).filter(i=>i%6===0).reduce((r,i)=>r+i,0);

alert(result);

рони 19.10.2018 17:40

Цитата:

Сообщение от Задорожный Виталий
Так откуда возьмутся 300 если ввели 100, а нужно только каждое 6 число.

это ваши фантазии, условия задачи совсем другие
Цитата:

Сообщение от Задорожный Виталий
Напишите программу которая в последовательности натуральных чисел определяет сумму чисел, кратных 6. Программа получает на вход количество чисел в последовательности, а затем сами числа. В последовательности всегда имеется число кратное 6. Кол-во чисел не превышает 100. Введённые числа не превышают 300. Программа должна ввести одно число - сумму чисел кратных 6.


Задорожный Виталий 19.10.2018 18:45

Да наверно мне еще рано такие задачи. Ничего я так и не понял. В моем понимании последовательность натуральных чисел это 0,1,2,3,4,5,6,7,8...
т.е. вводим количество 100, раскладываем в последовательность из них находим кратные 6 и их сумму. Причем здесь 300?
Или вводим 300 и так далее. Что такое введенные? Как связать количество элементов массива с элементами массива. в готовом скрипте? Пока писал начинаю вроде понимать. Элементы массива в сумме не должны превышать 300? Тогда все сходиться, а количество чисел и введенные мы вводим произвольно и непосредственно в программу. Так?

Задорожный Виталий 19.10.2018 18:54

Введенные числа в сумме не превышают 300? Тогда все сходится. В задаче не хватает слова в сумме!!! И я подумал что последовательность натуральных чисел это 1,2,3,4,5,6,7...... , а их можно произвольно. Так?

Nexus 20.10.2018 09:40

Задорожный Виталий, как я понял из условия задачи: 100 - максимальный размер массива, а 300 - максимальное значение элемента массива.

Задорожный Виталий 20.10.2018 17:14

Доброго времени суток еще раз. В итоге трех дней головоломок, с Вашей помощью решил вот так:
var summ = 0;
var arr = new Array ();
for ( var i=1; i<101; i++){
    arr[i] = i*3; 
if (arr[i] % 6) continue; 
    summ += arr[i];
    }
    document.write (summ + "</br>");

Пишу на чистом js тк библиотек пока не знаю. Может что то не так проверите пож-та.
Программа получает числа до 100 в цикле, мы можем изменять количество чисел. Введенные числа ограничиваем до 300 умножением на 3 и так получаем кратные 6. Дальше суммируем получившийся массив. Как Вам?

MC-XOBAHCK 20.10.2018 22:22

Цитата:

Сообщение от Nexus
как я понял из условия задачи: 100 - максимальный размер массива, а 300 - максимальное значение элемента массива.

я понял только то, что условие задачи не корректно. Тот кто её задал - идиЁт.
Главная задача в этой задаче понять чего имел в виду тот идиёт когда фразировал свой тренинг.

Задорожный Виталий 20.10.2018 23:18

Понял спасибо. Пойду как есть. Через неделю выложу его решение. Всем большое спасибо.

рони 20.10.2018 23:27

Цитата:

Сообщение от MC-XOBAHCK
условие задачи не корректно

почему?

MC-XOBAHCK 21.10.2018 02:02

Цитата:

Сообщение от рони
почему?

Нужно обучать код писать, а не фразеологические ребусы разгадывать.

Вот решение:
function summa6(n, arr) {
    if (arr.length <= 100) {
        let arr6 = arr.filter(item => !(item % 6) && item <= 300);
        arr6.length = n;
    
        return arr6.reduce((sum, item) => sum + item);
    }
}
console.log(summa6(10, [1, 2, 3, 4, 5, 6, 7, 12, 24, 54, 300, 350, 1014]));


Интересно, прокатит или по условию нужно ещё проверять массив на кратность?
Я понимаю так, что у того лектора в массиве уже имеется число кратное 6.
Цитата:

В последовательности всегда имеется число кратное 6.
Или всё таки не имеется, а должно быть кратное 6?
Если не имеется, то разбить ему лицо и в код добавить проверку чтоб в массиве было кратное 6.

Задорожный Виталий 21.10.2018 07:42

Интересный код. Я его понял так - Объявляем функцию и глобальные переменные(включая массив), в функции длина массива меньше либо равно 100. Далее внутри условия локальная переменная сортирует числа кратные 6 и меньше либо равно 300. Присваиваем локальную переменную к глобальной. Завершаем функцию и суммируем перебор. За функцией выводим результат. ГЕНИАЛЬНО!!! Много нового узнал! Один вопрос по последней строчке кода. Откуда цифра 10. В квадратных понятно - это массив и я так понял произвольно набранный.
Огромное спасибо!

Nexus 21.10.2018 10:50

Цитата:

Сообщение от Задорожный Виталий
Один вопрос по последней строчке кода. Откуда цифра 10.

Это нужная длинна массива.

MC-XOBAHCK 21.10.2018 13:36

Цитата:

Сообщение от Задорожный Виталий
Интересный код.

В условии не сказано что вы уже изучили. Задачки ведь решают для закрепления пройденного материала.
Скорей всего вам такое решение нужно:
function summa_6(n, arr) {

    if (arr.length <= 100) {
        let arr_6 = [];
        
        for (let i = 0; i < arr.length; i++) {
            if (!(arr[i] % 6) && arr[i] <= 300) {
                arr_6.push(arr[i]);
            }
        }

        //console.log(arr_6);

        let sum = 0;

        for (let i = 0; i < arr_6.length && i < n; i++) {
            sum += arr_6[i];
        }
        
        //console.log(sum);

        return sum;
    }
}

// Пример вызова:
summa_6(5, [1, 2, 3, 4, 5, 6, 7, 8, 12, 24, 300, 350, 450, 1250, 18, 36]);

логи можете удалить или раскомментировать чтоб посмотреть массив кратный 6 и результат.

Malleys 22.10.2018 01:48

Существует множество натуральных чисел N, из которых можно составить, например, такие последовательности
⟨0, 1, 2, 3, ...⟩ возрастающая последовательность элементов множества натуральных чисел.
⟨1, 10, 100, 1000, ...⟩ последовательность степеней десяти
⟨2, 3, 5, 7, ...⟩ последовательность простых чисел
⟨0, 1, 0, 1, ...⟩ чередующаяся последовательность 0 и 1

Все эти последовательности являются последовательностями натуральных чисел, поскольку элементы этих последовательностей принадлежат множеству натуральных чисел. Троеточие в записи последовательности указывает на бесконечность последовательности, т. е. вы можете всегда получить следующее число последовательности независимо от того, сколько чисел вы уже получили.

Последовательность ⟨5, 4, 10, 8⟩ составлена из конечного числа элементов множества натуральных чисел. Количество чисел в этой последовательности – 4.

Я могу попросить вас составить для меня последовательность, состоящую из i чисел. Вы составляете ⟨n₁, n₂, n₃, ..., nᵢ⟩, где n₁, n₂, n₃, ..., nᵢ принадлежат множеству натуральных чисел. Вы их выбираете в любом порядке. (вариантов – бесконечное число) И это тоже последовательность натуральных чисел.

Цитата:

Сообщение от Задорожный Виталий
Напишите программу которая в последовательности натуральных чисел определяет сумму чисел, кратных 6. Программа получает на вход количество чисел в последовательности, а затем сами числа. В последовательности всегда имеется число кратное 6. Кол-во чисел не превышает 100. Введённые числа не превышают 300. Программа должна вывести одно число - сумму чисел кратных 6.

В задаче вас просят найти в введённой пользователём последовательности натуральных чисел сумму чисел, кратных 6. Понятно, что вы можете представить последовательность в виде массива соответствующей длины. Ну а дальше алгоритм, описывающий сложение только кратных 6.

Код:

Алгоритм: суммирование чисел, кратных 6
 Параметры: массив чисел seq

        1. Пусть s равно 0
        2. Для каждого числа v из массива seq повторять:
                а. Если v mod 6 = 0, то s := s + v
        3. Вернуть s

function summation(seq) {
	return seq.reduce((sum, v) => v % 6 === 0 ? sum + v : sum, 0);
}
Вот суть решения. Но, почему это так сложно и вызывает затруднения?

Цитата:

Сообщение от Задорожный Виталий
вариантов была масса

В первом представленном варианте вообще не учитывался ввод пользователя! Однако даже если и учитывается, то даже если вариантов ввода пользователя много, то вариант решения только один. Делимость числа определяется однозначно, ввод пользователя – тоже однозначен – это последовательность чисел типа Array<Number> (даже если вариантов ввода пользователя много). И ответ типа Number зависит от ввода. Здесь не может быть масса ответов! При вводе одинаковых исходных данных вы всегда будете получать один и тот же ответ. И алгоритм, описывающий сложение только кратных 6 однозначно это определяет. Вы конечно можете по разному записать алгоритм на языке программирования, но алгоритм для решения задачи один.

Согласно алгоритму, ответ вычисляется за один проход по массиву. Однако почему-то в теме считается, что что-то там можно неожиданно для всех оптимизировать до двух или даже трёх!!! проходов по массиву.

Цитата:

Сообщение от MC-XOBAHCK
я понял только то, что условие задачи не корректно

В условии описывается, что должна делать программа с входными данными. Приводятся факты о входных данных. Указано, что ожидается на выходе. Приведите вашу цепочку логических рассуждении, приведших вас к такому заключению – «условие задачи не корректно».

Ещё мне интересно, почему утверждение «Кол-во чисел не превышает 100» вы переделываете в «Кол-во чисел не может быть больше 100»?

Если последовательность составлена из чисел множества натуральных чисел N без нуля, то из
утверждения «В последовательности всегда имеется число кратное 6» можно вывести утверждение «Сумма чисел кратных 6 не равна 0». Вы же почему-то сомневаетесь, что это так, и предполагаете, что «В последовательности всегда должно быть число кратное 6».


Факты о входных данных дают вам гарантии. Пользователь может ввести последовательность натуральных чисел ⟨300, 300, 300, ..., 300⟩ состоящую из 100 элементов. Все числа кратны 6 и сумма равна 30000. Это гарантирует вам, как программисту на JavaScript, что результат вычислен верно, поскольку результат не больше наибольшего безопасного целого числа Number.MAX_SAFE_INTEGER. В типизированных языках это помогло бы выбрать необходимый числовой тип.

Вот моё решение...
(function main() {
	alert(
		"Программа, которая в последовательности натуральных " +
		"чисел определяет сумму всех чисел, кратных 6"
	);
	var sum = 0;
	var n = +prompt("Введите количество чисел в последовательности");
	var v;

	for(var i = 1; i <= n; i++) {
		v = +prompt("Введите число (" + i + " из " + n + ")");

		if(v % 6 === 0)
			sum += v;
	}

	alert("Сумма чисел, кратных 6 – " + sum);
})();


Часовой пояс GMT +3, время: 09:57.