五组数字,对方心里想一个数,依次询问是否在组中,之后即可知道对方所想数字
// 比如说30以内数字:
// 第1组: 7 1 17 19 13 3 31 27 25 9 11 29 21 15 5 23
// 第2组: 10 30 2 3 11 18 23 7 14 19 31 26 6 27 15 22
// 第3组: 7 14 15 31 12 22 29 20 30 13 6 5 21 4 23 28
// 第4组: 12 8 31 11 24 25 14 30 9 15 29 26 10 28 13 27
// 第5组: 23 19 27 25 20 16 18 30 17 22 31 24 21 29 26 28
下面附代码,仅供参考!
// 二进制十进制转换
/**
* 10进制转2进制
* @param target
* @returns {string}
*/
function ten2two(target) {
const yu_arr = [target % 2];
let val = Math.floor(target / 2);
while (val > 1) {
yu_arr.push(val % 2);
val = Math.floor(val / 2);
}
if (val === 1) {
yu_arr.push(val);
}
return yu_arr.reverse().join('');
}
/**
* 2进制转10进制
* @param target
* @returns {*}
*/
function two2ten(target) {
return [...`${target}`].reverse().reduce((origin, item, index) => {
origin += item * Math.pow(2, index);
return origin;
}, 0);
}
/**
* 根据指定长度生成对应的数据
* @param count 指定长度
* @returns {Array} 分配好的数据数组
*/
function factory(count) {
// 生成二进制数组
const results = Array(count)
.fill(null)
.map((item, index) => Number(ten2two(index + 1)));
// 获取二进制最大长度
const maxLength = String(Math.max(...results)).length;
// 生成对应长度的空数组
const dataObj = Array(maxLength)
.fill(null)
.reduce((origin, item, index) => {
origin[index + 1] = [];
return origin;
}, {});
// 将2进制数据对应位等于1的10进制数字放到同一个数组中
results.forEach(result => {
for (let i = 0; i < maxLength; i++) {
const num = Math.floor(result / Math.pow(10, i) % 10);
if (num === 1) {
dataObj[i + 1].push(two2ten(result));
}
}
});
return Object.keys(dataObj).map(key => dataObj[key].sort(() => Math.random() - 0.5));
}
// 比如说31以内的数据
const data2 = factory(31);
data2.forEach((item, index) => console.log(`// 第${index + 1}组:`, ...item));
原理很简单,就是利用2进制,第一组代表1(2的零次方),后面依次2、4、8、16,把存在的对应组的数字相加即是答案,试试看!