Skip to content

Instantly share code, notes, and snippets.

@corporateanon
Created July 11, 2018 10:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save corporateanon/6135e8d656329a391a366ab9074c38d2 to your computer and use it in GitHub Desktop.
Save corporateanon/6135e8d656329a391a366ab9074c38d2 to your computer and use it in GitHub Desktop.
/**
* Возвращает TRUE для чисел вида 122, 202, 221, то есть для таких, у которых есть неуникальные цифры.
* @param a
*/
function hasDoubleElement(a) {
const aStr = a.toString(10);
//число уникальных символов меньше длины строки
return Array.from(new Set(aStr.split(''))).length < aStr.length;
}
/**
* Проверяет, являются ли числа `a` и `b` валидной парой.
* Возвращает FALSE, если числа имеют две и более общих цифр.
* Возвращает TRUE, в противном случае.
*
* @param a
* @param b
*/
function isValidPair(a, b) {
const aStr = a.toString(10);
const bStr = b.toString(10);
let sameCount = 0;
for (let i = 0; i < aStr.length; i++) {
for (let j = 0; j < aStr.length; j++) {
if (aStr[i] === bStr[j]) {
sameCount++;
if (sameCount >= 2) {
return false;
}
}
}
}
return true;
}
/**
* Проверяет, можно ли число `a` добавить к списку `list`
*
* @param list
* @param a
*/
function isValidListMember(list, a) {
return list.every(function(b) {
return isValidPair(a, b);
});
}
/**
* Получить заданную последовательность чисел
*
* @param seed число которое должно присутствовать в списке
* @param start число, с которого следует начать перебор
* @param end число, которым следует закончить перебор
*/
function getMagicNumbers(seed, start, end) {
const numbers = [seed];
for (let i = start; i <= end; i++) {
if (!hasDoubleElement(i) && isValidListMember(numbers, i)) {
numbers.push(i);
}
}
return numbers;
}
console.log(getMagicNumbers(100, 100, 999));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment