74 lines
1.6 KiB
JavaScript
74 lines
1.6 KiB
JavaScript
|
|
// https://www.codewars.com/kata/6320b05f269dbb001fb409f1
|
|
|
|
const Sieve = (max = 1e5) => {
|
|
const maxi = Math.sqrt(max);
|
|
const notPrime = new Int8Array(max);
|
|
notPrime[0] = notPrime[1] = 1;
|
|
for (let i = 2; i < maxi; ++i) {
|
|
if (notPrime[i] === 0) {
|
|
for (let j = 2*i; j < max; j += i) {
|
|
notPrime[j] = 1;
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
isPrime: n => !notPrime[n],
|
|
getPrimes: n => {
|
|
const res = [];
|
|
let cnt = 0;
|
|
const limit = Math.min(max, n);
|
|
for (let i = 0; i < limit; ++i) {
|
|
if (!notPrime[i]) {
|
|
res[cnt++] = i;
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
};
|
|
};
|
|
|
|
const sieve = Sieve(1e5);
|
|
|
|
const getHelper = n => {
|
|
const target = n + '';
|
|
return m => {
|
|
const cmp = m + '';
|
|
return [...cmp].map((d, i) => {
|
|
if (+target[i] > +d) {
|
|
return '<';
|
|
} else if (+target[i] < +d) {
|
|
return '>';
|
|
}
|
|
return '=';
|
|
}).join('')
|
|
};
|
|
};
|
|
|
|
const findPrime = helper => {
|
|
let d5 = sieve.getPrimes(1e5).filter(n => n > 1e4);
|
|
let max = 10;
|
|
while (--max) {
|
|
const mid = d5.length >> 1;
|
|
let prime = d5[mid];
|
|
const hint = helper(prime);
|
|
d5 = d5.filter(n => {
|
|
const ps = prime + '';
|
|
const ns = n + '';
|
|
for (let i = 0; i < 5; ++i) {
|
|
if (hint[i] === '>') {
|
|
if (ps[i] < ns[i]) return false;
|
|
} else if (hint[i] === '<') {
|
|
if (ps[i] > ns[i]) return false;
|
|
} else {
|
|
if (ps[i] !== ns[i]) return false;
|
|
}
|
|
}
|
|
return true;
|
|
});
|
|
if (d5.length === 1) return d5[0];
|
|
}
|
|
};
|
|
|
|
findPrime(getHelper(21767));
|