Guess the (prime) number, digit by digit
This commit is contained in:
73
guess-the-prime-number-digit-by-digit/index.js
Normal file
73
guess-the-prime-number-digit-by-digit/index.js
Normal file
@@ -0,0 +1,73 @@
|
||||
|
||||
// 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));
|
||||
Reference in New Issue
Block a user