Равенство анаграмм
Мы скажем что в десятичной системе две числа a, b являются анаграммами друг для друга, если в двоичной системе их цифры в позиции i те же самые. Например в случае если a = 8, b = 4 в двоичной системе получим a = 1000, b = 100, мы видим что в обоих случаях применялись те же самые цифры. И следовательно a, b являются анаграммами друг для друга. А в случае a = 45, b = 10 получим a = 101101, b = 1010, которые не являются анаграммами друг для друга.
Нужно написать функцию которая получает массив [a, b] и возвращает true если a, b являются анаграммами друг для друга и false в обратном случае.
function areAnagramm(x) {
let a = x[0];
let b = x[1];
let i = 0;
let binary_a = [];
let j = 0;
let binary_b = [];
while (a > 0) {
binary_a[i] = a % 2;
a /= 2;
i++;
}
while (b > 0) {
binary_b[j] = b % 2;
b /= 2;
j++;
}
binary_a.sort((a, b) => b - a);
binary_b.sort((a, b) => b - a);
for (let i = 0; i < 8; i++) {
if (binary_a[i] != binary_b[i]) {
return false;
}
}
return true;
}
console.log(areAnagramm([8, 4])); // true
console.log(areAnagramm([45, 10])); // false
Поможете написать более оптимальный вариант?
Ответы (1 шт):
Формулировка задача ужасная. Это что, автоматический перевод?
Вам не нужны никакие массивы, a тем более - их сортировка и поэлементное сравнение. Просто посчитайте количество единиц.
function areAnagramm(x) {
let i = countOnes(x[0]);
let j = countOnes(x[1]);
return i == j;
function countOnes(a) {
let i = 0;
while (a > 0) {
if (a % 2)
i++;
a /= 2;
}
return i;
}
}
console.log(areAnagramm([8, 4])); // true
console.log(areAnagramm([45, 10])); // false
