export function formatModal(index: number, options: { id: string; value: string }[]) {
const summary = formatSummary(index, options);
const interval = formatInterval(index, options);
return { interval };
}
export function formatSummary(index: number, options: { id: string; value: string }[]) {
const current = options[index].value.split(' ');
const result0: { [key: string]: number } = {};
const result1: { [key: string]: number } = {};
const result2: { [key: string]: number } = {};
for (let i = index + 1; i < index + 101; i++) {
const cur = options[i].value.split(' ');
if (result0[cur[0]]) {
result0[cur[0]] += 1;
} else {
result0[cur[0]] = 1;
}
if (result1[cur[1]]) {
result1[cur[1]] += 1;
} else {
result1[cur[1]] = 1;
}
if (result2[cur[2]]) {
result2[cur[2]] += 1;
} else {
result2[cur[2]] = 1;
}
}
const result = [
Object.entries(result0).sort((a, b) => b[1] - a[1]),
Object.entries(result1).sort((a, b) => b[1] - a[1]),
Object.entries(result2).sort((a, b) => b[1] - a[1]),
];
let summary = '';
let idx = 0;
for (const item of result) {
const before = item.slice(0, 5);
if (before.map((x) => x[0]).includes(current[idx])) {
summary += '0';
} else {
summary += '1';
}
idx++;
}
return summary;
}
export function formatInterval(index: number, options: { id: string; value: string }[]): string {
const current = options[index]?.value.split(' ');
if (!current || current.length !== 3) {
throw new Error('Invalid current');
}
// 初始化:记录每个位置上 0-9 首次出现的距离(-1 表示未出现)
const result0: Record<string, number> = {};
const result1: Record<string, number> = {};
const result2: Record<string, number> = {};
for (let i = 0; i < 10; i++) {
const digit = i.toString();
result0[digit] = -1;
result1[digit] = -1;
result2[digit] = -1;
}
// 遍历接下来的最多 100 项
const end = Math.min(index + 101, options.length);
for (let i = index + 1; i < end; i++) {
const [d0, d1, d2] = options[i].value.split(' ');
// 只记录首次出现
if (d0 !== undefined && result0[d0] === -1) result0[d0] = i - index;
if (d1 !== undefined && result1[d1] === -1) result1[d1] = i - index;
if (d2 !== undefined && result2[d2] === -1) result2[d2] = i - index;
}
// 辅助函数:获取最近出现的前5个数字(排除未出现的)
const getTop5 = (record: Record<string, number>): string[] => {
return Object.entries(record)
.filter(([, dist]) => dist !== -1) // 只保留出现过的
.sort((a, b) => a[1] - b[1]) // 升序:距离小的在前(最近)
.slice(0, 5) // 取前5
.map(([digit]) => digit); // 只要数字
};
const top0 = getTop5(result0);
const top1 = getTop5(result1);
const top2 = getTop5(result2);
let summary = '';
summary += top0.includes(current[0]) ? '0' : '1';
summary += top1.includes(current[1]) ? '0' : '1';
summary += top2.includes(current[2]) ? '0' : '1';
return summary;
}