Затрудняюсь решить вопрос из задачника js [как проводить математические операции над цифрами числа?]

Счастливое число-это то число, в результате последовательного сложения квадратов цифр которой, при какой-то итерации получается 1.

На пример число 23 счастливое число, потому-что:

Screenshot_3

Таким образом, в результате трех шагов мы получили 1, что подтверждает, что 23 это счастливое число. Необходимо разработать функцию, которая получает число и возвращает true, если данное число счастливая и false в противном случае.

Заметим, что для определения счастливых чисел на каждом шагу получается какое-то Screenshot_4 число (в нашем примере 13,10,1). если число не счастливая, то в Screenshot_4 числах встречаются повторяющиеся цифры.

задачу нужно решить под 4 варианта:

  1. на входе:23 на выходе: true
  2. на входе:44 на выходе: true
  3. на входе:10 на выходе: true
  4. на входе:28 на выходе: true

ещё есть подсказка:

при поиске счастливых чисел на каждом шагу получается определенное ‘y’ число, цифры которой нужно попытаться сложить. Если число не счастливая, то число ‘y’ может повториться в каком-то i шаге. Следовательно, если число ‘y’ встречается более одного раза внутри цикла, необходимо вернуть false
вот моя попытка реализовать код

function solution(x) {
	let s = 0
	for (let i = 0; i < x.length; i++) {
		x = x.split('').map(a => a * a)
		s += x[i] + x[i + 1]
		return s //результатом получается 13 после чего хочу сделать 1*1+3*3, но тщетно
	}
}

На вход solution(x) подается x строка или число?

x скорее всего строка, тогда x[i] тоже строка. Да, x[i] содержит численный символ, но он все все равно считается строкой. С точки зрения типов тут x[i] + x[i+1] происходит конкатенация строк. Поэтому получается 13.

Тебе нужно привести строковые значения к числовым чтобы получить результат сложения чисел. Например так:

s += Number(x[i]) + Number(x[i + 1])

На вход solution(x) подается x число

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

после этого я попробовал опять разделить с помощью split(’’),чтобы сделать следующее: 1 * 1 + 3 * 3 и у меня выдало ошибку

В результате split получается массив строк. Операция умножения работатет только с числами. Тебе снова нужно преобразовать строки в числа перед тем как их умножать.

всё понял)) спасибо

function solution(x) {
  let foo = '';
  while (x > 9) {
    let arr = []
    arr = x.toString().split('');
    let result = 0;
    for (let i = 0; i < arr.length; i++) {
      result += Number(arr[i]) * Number(arr[i]);
    }
    if (foo.length > 0) {
      let duck = [];
      duck = foo.split('');
      for (let i = 0; i < duck.lenght; i++) {
        if (result == Number(duck[i])) {
          return false;
        }
      }
    }
    foo += result;
    x = result;
    return x == 1;
  }
}
console.log(solution(44))

и так тоже пытался: x.toString().split('').map(a=>a * a).reduce((a,b)=>a+b)

всё же не получилось решить задачку, можешь помочь?

Программирование во многом - разбивание задачи на части и потом сочетание этих частей вместе. Части должны быть желательно незавимимыми.

В этой задаче есть явно выделяемая часть - поиск суммы квадратов цифр. Напиши отдельную функцию, которая получает на вход число, и возвращает сумму квадратов цифр.

function getNumSquaresSum(num) {

}

Допустим она есть, тогда алгоритм выглядит так:

function isLucky(num) {
	let occuredNumbers = {} // тут будем запоминать повторяющиеся суммы квадратов цифр
	while (true) { // Бесконечный цикл. Условие выхода из цикла прописаны в теле самого цикла как return
		let sum = getNumSquaresSum(num)
		if (sum === 1) {
			return true
		} else {
			// на какой-то итерации в occuredNumbers[sum] уже было записано значение суммы
			// квадратов цифр, значит число - "несчастливое"
			if (occuredNumbers[sum]) {
				return false
			}
			occuredNumbers[sum] = true
			num = sum
		}
	}
}

Я отформатировал твой пост и комментарий на который отвечаю. Посмотри на будущее во что оборачивать код чтобы он красиво подсвечивался на страницах (как блочный так и инлайновый) Как формулировать вопрос, подсвечивать код, благодарить