10秒解决USACO Training新域名解析问题:Competitive Companion适配指南

🔥 10秒解决USACO Training新域名解析问题:Competitive Companion适配指南

【免费下载链接】competitive-companion Browser extension which parses competitive programming problems 【免费下载链接】competitive-companion 项目地址: https://gitcode.com/gh_mirrors/co/competitive-companion

你是否遇到这些痛点?

  • 升级USACO Training新域名后插件突然失效
  • 无法自动抓取usaco.training域名下的题目数据
  • 手动复制样例输入输出浪费宝贵训练时间

本文将详解如何通过Competitive Companion最新特性解决这些问题,5分钟配置完成后即可无缝解析USACO所有训练题目

问题根源:域名变更与解析逻辑

USACO(USA Computing Olympiad,美国信息学奥林匹克竞赛)在2023年完成了训练平台重构,将原域名train.usaco.org迁移至usaco.training,导致大量工具出现解析异常。

Competitive Companion通过两类解析器支持USACO平台:

// 两类解析器的职责划分
import { USACOProblemParser } from './USACOProblemParser';      // 主站赛事解析
import { USACOTrainingProblemParser } from './USACOTrainingProblemParser'; // 训练平台解析

新域名解析失败的核心原因是域名匹配规则未及时更新。我们通过源码分析发现关键匹配模式:

// USACOTrainingProblemParser.ts 中的匹配规则
public getMatchPatterns(): string[] {
  return ['https://usaco.training/usacoprob2*']; // 仅支持新域名特定路径
}

技术解析:新域名适配实现方案

解析流程时序图

mermaid

核心解析代码详解

USACOTrainingProblemParser的工作原理可分为三个阶段:

  1. URL匹配阶段
// 精准匹配新域名的题目路径格式
public getMatchPatterns(): string[] {
  return ['https://usaco.training/usacoprob2*'];
}
  1. DOM解析阶段
// 从HTML中提取关键信息
const elem = htmlToElement(html);
const task = new TaskBuilder('USACO').setUrl(url);

// 智能选择标题元素(兼容不同页面布局)
const nameSelectors = ['center > h1', 'center > b > font'];
const names = nameSelectors
  .map(sel => elem.querySelector(sel))
  .filter(el => el !== null)
  .map(el => el.textContent.trim());
  1. 任务构建阶段
// 设置题目ID(用于生成输入输出文件名)
const taskId = [...elem.querySelectorAll('h3')]
  .find(el => el.textContent.includes('PROGRAM NAME'))
  .textContent.substr(14);

// 配置IO参数(符合USACO竞赛规范)
task.setInput({
  fileName: taskId + '.in',
  type: 'file',
});

task.setOutput({
  fileName: taskId + '.out',
  type: 'file',
});

配置指南:3步完成环境搭建

1. 确认插件版本

确保Competitive Companion版本≥2.4.0,可通过以下方式验证:

  • Chrome/Edge: chrome://extensions/ → 查看版本号
  • Firefox: about:addons → 查看扩展详情

2. 验证解析器注册状态

解析器需在parsers.ts中正确注册才能生效:

// parsers.ts 中的注册代码
export const parsers = [
  // ...其他解析器
  new USACOProblemParser(),           // 主站赛事解析器
  new USACOTrainingProblemParser(),   // 训练平台解析器
  // ...其他解析器
];

3. 测试解析功能

访问测试题目验证解析效果:

  • 测试URL: https://usaco.training/usacoprob2?a=exampleProblem
  • 预期结果:插件图标变为彩色,点击后显示题目信息卡片

常见问题解决方案

问题1:解析器不触发

可能原因解决方案验证方法
域名匹配错误检查URL是否符合usaco.training/usacoprob2*格式对比浏览器地址栏与匹配规则
页面加载延迟等待页面完全加载(≥3秒)再点击插件观察Network面板确认资源加载完成
扩展权限不足在扩展管理页面启用"访问所有网站"权限检查chrome://extensions/权限设置

问题2:题目信息不完整

若出现缺少样例输入/输出的情况,可尝试:

// 备选样例提取方案(当主方案失败时)
const sampleSections = elem.querySelectorAll('.sample');
if (sampleSections.length >= 2) {
  task.addTest(
    sampleSections[0].textContent.trim(),
    sampleSections[1].textContent.trim()
  );
}

开发指南:贡献新域名适配

如果你发现未支持的USACO子域名,可以通过以下步骤贡献代码:

  1. 创建解析器
// 新建解析器文件 USACONewDomainParser.ts
export class USACONewDomainParser extends Parser {
  public getMatchPatterns(): string[] {
    return ['https://new.usaco.training/*']; // 新域名匹配规则
  }
  
  public async parse(url: string, html: string): Promise<Sendable> {
    // 实现自定义解析逻辑
  }
}
  1. 注册解析器
// 在parsers.ts中添加
import { USACONewDomainParser } from './problem/USACONewDomainParser';

export const parsers = [
  // ...现有解析器
  new USACONewDomainParser(),
];
  1. 编写测试用例
// tests/data/usaco/new-domain/problem/normal.json
{
  "url": "https://new.usaco.training/example",
  "expected": {
    "name": "Example Problem",
    "timeLimit": 1000,
    "memoryLimit": 16
  }
}

总结与展望

Competitive Companion对USACO Training新域名的支持,体现了插件模块化解析器架构的优势。通过独立的USACOTrainingProblemParser类,实现了:

  1. 关注点分离:训练平台与主站赛事解析逻辑分离
  2. 可扩展性:新增域名支持无需修改核心代码
  3. 容错性:单一解析器故障不影响其他平台功能

未来版本计划增强以下特性:

  • 支持USACO竞赛日历自动同步
  • 实现训练进度与题目难度分析
  • 添加多语言代码模板自动生成

通过本文介绍的技术方案,你现在已经掌握了Competitive Companion解析USACO新域名的核心原理和配置方法。立即更新插件,体验无缝的USACO训练题目解析功能吧!

提示:定期关注项目更新,获取更多竞赛平台的解析支持。遇到解析问题时,可以通过GitHub Issues提交反馈,帮助我们持续改进解析器。

【免费下载链接】competitive-companion Browser extension which parses competitive programming problems 【免费下载链接】competitive-companion 项目地址: https://gitcode.com/gh_mirrors/co/competitive-companion

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值