Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Математическая задачка на JS (часть кода внутри) (https://javascript.ru/forum/dom-window/84148-matematicheskaya-zadachka-na-js-chast-koda-vnutri.html)

Volonter 15.06.2022 19:48

Математическая задачка на JS (часть кода внутри)
 
Привет всем, есть простая математическая задачка, пытаюсь ее написать на javascript. Суть задачи - получить 10-значное число, в котором
первая цифра соответствует количеству единиц в числе;
вторая цифра - количеству двоек;
третья цифра - количеству троек;
...
десятая цифра - количеству нулей.
получается вот такое число 2 1 0 0 0 1 0 0 0 6
как кодом его его получить?
Кроме как написать каркас с рекурсией дальше у меня не идет, нужна помощь гуру))
let a = [];
let b = [];


function number(left, pos) {
    if (pos == 10) {
        if (left == 0) {
            b.splice(0, a.length)
            for (i = 0; i < 10; i++) {
                ++b[a[i]];
            }
            // наверное дальше надо как то сравнить оба массива??
        }
    } else {
        for (i = 0; i <= left; i++) {
            a[pos] = i;
            number(left - i, pos + 1);
        }
    }
}

number(10, 0);

Заранее спасибо!

рони 15.06.2022 20:02

Цитата:

Сообщение от Volonter
получить 10-значное число

??? условие многовариантное, может не получить, а проверить?

Volonter 15.06.2022 20:07

рони,
именно получить, сгенерировать как бы. Задача вообще для 5-го класса, число получается вот такое 2 1 0 0 0 1 0 0 0 6
как мне казалось, надо как сдвигать нули в массиве, начиная с 10, записывая кол-во нулей в конец массива, но все пошло не так и уперся))

Vlasenko Fedor 15.06.2022 22:12

https://otvet.mail.ru/question/16330299
Здесь можно глянуть описание логики решения

Volonter 15.06.2022 22:36

Цитата:

Сообщение от Vlasenko Fedor (Сообщение 546191)
https://otvet.mail.ru/question/16330299
Здесь можно глянуть описание логики решения

Спасибо, так даже интереснее будет подумать)) но код от гуру увидеть всегда полезно))

Volonter 16.06.2022 12:09

Vlasenko Fedor,
вот есть вопрос, челове пишет что "очевидно, что сумма цифр в числе равна 10", а откуда он это взял? если не знать ответа, разве как то можно это определить? На мой взгляд, из условия задачи мы понимаем только то, что 1) последняя цифра точно не ноль, так как он есть, 2) первая тоже не ноль, так как число с нуля не начинается. А от суммы 10 строится вся логика проверок.

Alexandroppolus 16.06.2022 13:49

Цитата:

Сообщение от Volonter
челове пишет что "очевидно, что сумма цифр в числе равна 10", а откуда он это взял?

потому что каждая цифра обозначает некоторое количество цифр. А их всего 10.

Alexandroppolus 16.06.2022 13:52

решал эту задачу давно, на бумаге.

стартовал от "первого приближения" 0000000009, потом за несколько итераций "улучшал" результат, исправляя косяки - 0000000108, 1000000108, 2100000108, ..., и быстро дошел до итогового. Но вот как это формализовать для программы, чтобы не зациклилось, сходу не очень понятно...

voraa 16.06.2022 17:16

Методом проб, ошибок и тыка
(но никак не научных размышлений)
Составил такой алгоритм, который очень быстро получает это число
let res = [0,0,0,0,0,0,0,0,0,0];
const count = (dig) => res.filter(v => v === dig).length;

const test = () => {
	for (let i = 0; i<10; i++) {
		const dig = i < 9? i+1 : 0;
		if (count (dig) != res[i]) return false;
	}
	return true;
}

const change = () => {
	const newa = [];
	for (let i = 0; i<10; i++) {
		const dig = i < 9? i+1 : 0;
		const nd = count (dig)
		if (nd != res[i]) {
			res[i] = nd;
		}
	}
}

let n = 0; 
while (!test()) {
	change ();
	n++;
	console.log(n, [...res]);
}

console.log ('FINISH : ', n, res)


Ничуть не претендую на красоту алгоритма и кода
Но находит результат с любого начального значения (res)

Volonter 16.06.2022 18:31

voraa,
Маэстро, снимаю шляпу! Спасибо!


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