五组数字,对方心里想一个数,依次询问是否在组中,之后即可知道对方所想数字
// 比如说30以内数字:
// 第1组: 5 27 3 21 11 9 25 29 15 1 7 19 13 17 23
// 第2组: 6 19 30 7 3 26 23 14 10 11 27 2 22 15 18
// 第3组: 29 12 20 23 13 5 30 7 4 22 6 28 15 21 14
// 第4组: 8 29 11 9 10 25 28 26 30 15 12 27 13 14 24
// 第5组: 25 19 18 22 30 27 21 20 17 16 28 23 26 24 29
下面附代码,仅供参考!
// 二进制十进制转换
/**
* 10进制转2进制
* @param target
* @returns {string}
*/
function ten2two(target) {
let 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 = origin + item * Math.pow(2, index);
return origin;
}, 0);
}
/**
* 根据指定长度生成对应的数据
* @param count 指定长度
* @returns {Array} 分配好的数据数组
*/
function factory(count) {
// 生成二进制数组
const results = [...new Array(count)].map((item, index) => Number(ten2two(index + 1)));
// 获取二进制最大长度
const maxLength = String(Math.max(...results)).length;
// 生成对应长度的空数组
const dataObj = [...new Array(maxLength)].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));
}
// 比如说30以内的数据
const data = factory(30);
data.forEach((item, index) => console.log(`第${index + 1}组:`, ...item));
原理很简单,就是利用2进制,第一组代表1(2的零次方),后面依次2、4、8、16,把存在的对应组的数字相加即是答案,试试看!
网友评论