algo

11 阅读1分钟

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;

}