我让Trae替我手撕代码,在崩溃和惊艳间替我徘徊...

91 阅读3分钟

截屏2025-03-04 17.16.47.png 当你觉得已经出来答案时,那并不是答案。。。

image.png

/**
 * 判断标题是否可以通过替换模板中的通配符生成
 * @param template 含有通配符的创意模板
 * @param titles 需要判断的标题数组
 * @returns 判断结果数组,每个元素为"True"或"False"
 */
const checkTitlesFromTemplate = (template: string, titles: string[]): string[] => {
  // 将模板转换为正则表达式
  const parts = template.split(/\{[^}]*\}/);
  const regexStr = parts.map(part => escapeRegExp(part)).join('(.*)');
  const regex = new RegExp(`^${regexStr}$`);
  
  // 判断每个标题是否匹配
  return titles.map(title => {
    return regex.test(title) ? "True" : "False";
  }).join(',');
};

/**
 * 转义正则表达式中的特殊字符
 */
const escapeRegExp = (string: string): string => {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
};

image.png

/**
 * 判断标题是否可以通过替换模板中的通配符生成
 * @param template 含有通配符的创意模板
 * @param titles 需要判断的标题数组
 * @returns 判断结果数组,每个元素为"True"或"False"
 */
const checkTitlesFromTemplate = (template: string, titles: string[]): string => {
  // 解析模板,提取固定部分和通配符位置
  const templateParts: string[] = [];
  let currentPos = 0;
  let inWildcard = false;
  
  for (let i = 0; i < template.length; i++) {
    if (template[i] === '{') {
      if (!inWildcard) {
        templateParts.push(template.substring(currentPos, i));
        currentPos = i + 1;
        inWildcard = true;
      }
    } else if (template[i] === '}') {
      if (inWildcard) {
        currentPos = i + 1;
        inWildcard = false;
      }
    }
  }
  
  // 添加最后一部分
  if (currentPos < template.length) {
    templateParts.push(template.substring(currentPos));
  }
  
  // 过滤掉空字符串
  const fixedParts = templateParts.filter(part => part !== '');
  
  // 检查每个标题
  return titles.map(title => {
    return isMatchTemplate(title, fixedParts) ? "True" : "False";
  }).join(',');
};

/**
 * 检查标题是否匹配模板的固定部分
 */
const isMatchTemplate = (title: string, fixedParts: string[]): boolean => {
  if (fixedParts.length === 0) {
    return true; // 如果模板只有通配符,任何标题都匹配
  }
  
  let currentPos = 0;
  
  for (let i = 0; i < fixedParts.length; i++) {
    const part = fixedParts[i];
    const pos = title.indexOf(part, currentPos);
    
    if (pos === -1) {
      return false; // 找不到固定部分
    }
    
    // 特殊处理第一个和最后一个固定部分
    if (i === 0 && pos !== 0 && !title.startsWith(part)) {
      // 如果模板不是以通配符开头,标题必须以第一个固定部分开头
      if (!template.startsWith('{')) {
        return false;
      }
    }
    
    if (i === fixedParts.length - 1 && !title.endsWith(part)) {
      // 如果模板不是以通配符结尾,标题必须以最后一个固定部分结尾
      if (!template.endsWith('}')) {
        return false;
      }
    }
    
    currentPos = pos + part.length;
  }
  
  return true;
};

export {
  // ... 其他导出
  checkTitlesFromTemplate,
};

image.png

/**
 * 判断标题是否可以通过替换模板中的通配符生成
 * @param template 含有通配符的创意模板
 * @param titles 需要判断的标题数组
 * @returns 判断结果数组,每个元素为"True"或"False"
 */
const checkTitlesFromTemplate = (template: string, titles: string[]): string => {
  // 解析模板,提取固定部分和通配符位置
  const parts: {text: string, isWildcard: boolean}[] = [];
  let currentText = '';
  let inWildcard = false;
  
  for (let i = 0; i < template.length; i++) {
    if (template[i] === '{') {
      if (!inWildcard) {
        if (currentText) {
          parts.push({text: currentText, isWildcard: false});
          currentText = '';
        }
        inWildcard = true;
      } else {
        currentText += template[i];
      }
    } else if (template[i] === '}') {
      if (inWildcard) {
        parts.push({text: currentText, isWildcard: true});
        currentText = '';
        inWildcard = false;
      } else {
        currentText += template[i];
      }
    } else {
      currentText += template[i];
    }
  }
  
  // 添加最后一部分
  if (currentText) {
    parts.push({text: currentText, isWildcard: false});
  }
  
  // 检查每个标题
  return titles.map(title => {
    return isMatchTemplate(title, parts) ? "True" : "False";
  }).join(',');
};

/**
 * 检查标题是否匹配模板
 */
const isMatchTemplate = (title: string, parts: {text: string, isWildcard: boolean}[]): boolean => {
  // 使用动态规划检查是否匹配
  return matchWithDP(title, parts, 0, 0);
};

/**
 * 使用动态规划检查标题是否匹配模板
 */
const matchWithDP = (
  title: string, 
  parts: {text: string, isWildcard: boolean}[], 
  titleIndex: number, 
  partIndex: number
): boolean => {
  // 如果已经处理完所有部分和标题,则匹配成功
  if (partIndex === parts.length) {
    return titleIndex === title.length;
  }
  
  const currentPart = parts[partIndex];
  
  // 如果是通配符,可以匹配任意字符串
  if (currentPart.isWildcard) {
    // 尝试匹配下一个非通配符部分
    if (partIndex + 1 < parts.length && !parts[partIndex + 1].isWildcard) {
      const nextPart = parts[partIndex + 1].text;
      // 尝试不同的通配符长度
      for (let i = titleIndex; i <= title.length; i++) {
        const nextPos = title.indexOf(nextPart, i);
        if (nextPos !== -1) {
          if (matchWithDP(title, parts, nextPos + nextPart.length, partIndex + 2)) {
            return true;
          }
        } else {
          break;
        }
      }
      return false;
    } else {
      // 如果是最后一个部分或者下一个也是通配符,可以匹配剩余所有字符
      return matchWithDP(title, parts, title.length, partIndex + 1);
    }
  } else {
    // 非通配符必须精确匹配
    if (titleIndex + currentPart.text.length > title.length) {
      return false;
    }
    
    if (title.substring(titleIndex, titleIndex + currentPart.text.length) !== currentPart.text) {
      return false;
    }
    
    return matchWithDP(title, parts, titleIndex + currentPart.text.length, partIndex + 1);
  }
};

image.png

/**
 * 判断标题是否可以通过替换模板中的通配符生成
 * @param template 含有通配符的创意模板
 * @param titles 需要判断的标题数组
 * @returns 判断结果数组,每个元素为"True"或"False"
 */
const checkTitlesFromTemplate = (template: string, titles: string[]): string => {
  // 将模板分割成固定部分和通配符部分
  const parts: string[] = [];
  let isWildcard: boolean[] = [];
  let currentText = '';
  let inWildcard = false;
  
  for (let i = 0; i < template.length; i++) {
    if (template[i] === '{') {
      if (!inWildcard) {
        if (currentText) {
          parts.push(currentText);
          isWildcard.push(false);
          currentText = '';
        }
        inWildcard = true;
      } else {
        currentText += template[i];
      }
    } else if (template[i] === '}') {
      if (inWildcard) {
        parts.push(currentText);
        isWildcard.push(true);
        currentText = '';
        inWildcard = false;
      } else {
        currentText += template[i];
      }
    } else {
      currentText += template[i];
    }
  }
  
  if (currentText) {
    parts.push(currentText);
    isWildcard.push(false);
  }
  
  // 检查每个标题
  const results: string[] = [];
  
  for (const title of titles) {
    let canMatch = true;
    let titlePos = 0;
    
    // 特殊处理:如果模板不是以通配符开头,标题必须以第一个固定部分开头
    if (!isWildcard[0] && !title.startsWith(parts[0])) {
      results.push("False");
      continue;
    }
    
    // 特殊处理:如果模板不是以通配符结尾,标题必须以最后一个固定部分结尾
    if (!isWildcard[isWildcard.length - 1] && !title.endsWith(parts[parts.length - 1])) {
      results.push("False");
      continue;
    }
    
    // 处理开头的非通配符部分
    if (!isWildcard[0]) {
      titlePos = parts[0].length;
    }
    
    // 处理中间部分
    for (let i = isWildcard[0] ? 0 : 1; i < parts.length - (isWildcard[isWildcard.length - 1] ? 0 : 1); i++) {
      if (!isWildcard[i]) {
        // 非通配符部分需要在标题中找到
        const pos = title.indexOf(parts[i], titlePos);
        if (pos === -1) {
          canMatch = false;
          break;
        }
        titlePos = pos + parts[i].length;
      }
    }
    
    // 处理结尾的非通配符部分
    if (canMatch && !isWildcard[isWildcard.length - 1]) {
      if (!title.endsWith(parts[parts.length - 1])) {
        canMatch = false;
      }
    }
    
    results.push(canMatch ? "True" : "False");
  }
  
  return results.join(',');
};

image.png

/**
 * 判断标题是否可以通过替换模板中的通配符生成
 * @param template 含有通配符的创意模板
 * @param titles 需要判断的标题数组
 * @returns 判断结果数组,每个元素为"True"或"False"
 */
const checkTitles

到这里,可能是因为生成篇幅过长了,导致这里戛然而止。 trae你是好样的,成功吊起来我的。。。

image.png

/**
 * 判断标题是否可以通过替换模板中的通配符生成
 * @param template 含有通配符的创意模板
 * @param titles 需要判断的标题数组
 * @returns 判断结果数组,每个元素为"True"或"False"
 */
const checkTitlesFromTemplate = (template: string, titles: string[]): string => {
  // 将模板转换为正则表达式
  const regexParts: string[] = [];
  let currentPos = 0;
  
  // 查找所有通配符位置
  const wildcardRegex = /\{[^}]*\}/g;
  let match;
  
  while ((match = wildcardRegex.exec(template)) !== null) {
    // 添加通配符前的固定文本
    if (match.index > currentPos) {
      regexParts.push(escapeRegExp(template.substring(currentPos, match.index)));
    }
    // 添加通配符对应的正则
    regexParts.push('(.*)');
    currentPos = match.index + match[0].length;
  }
  
  // 添加最后一部分固定文本
  if (currentPos < template.length) {
    regexParts.push(escapeRegExp(template.substring(currentPos)));
  }
  
  // 构建完整的正则表达式
  const regex = new RegExp('^' + regexParts.join('') + '$');
  
  // 检查每个标题
  return titles.map(title => regex.test(title) ? "True" : "False").join(',');
};

/**
 * 转义正则表达式中的特殊字符
 */
const escapeRegExp = (string: string): string => {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
};

image.png

image.png

image.png

看到这里,你觉得trae的思路和你的思路有啥区别?评论区告诉我。