From dfd6df8cd91089440ae7462c3ab4703cea0d4f4e Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 17 May 2026 08:49:35 +0000 Subject: [PATCH 01/23] feat(tasks): split AOJ client by source and add task import UI - Split AojApiClient into AojCoursesApiClient and AojChallengesApiClient - Reorganize AOJ fixtures into source-specific directories (courses/challenges) - Add ContestTaskFetcher to unify per-source fetch logic - Replace TaskListForEdit with TaskSearchBox and TaskTableForImport components - Update task import page to support source selection and pagination Co-Authored-By: Claude Sonnet 4.6 --- .../task-import-by-source/plan-2nd.md | 95 + .../2026-05-17/task-import-by-source/plan.md | 421 ++ docs/ui-mock/2026-05-16/index.html | 1166 +++ .../clients/aizu_online_judge/clients.test.ts | 272 +- src/lib/clients/aizu_online_judge/clients.ts | 324 +- src/lib/clients/contest_task_fetcher.ts | 60 + .../challenges/jag_prelim/contests.json | 3179 +++++++++ .../challenges/jag_regional/contests.json | 3211 +++++++++ .../challenges/pck_final/contests.json | 6226 +++++++++++++++++ .../challenges/pck_prelim/contests.json | 4999 +++++++++++++ .../fixtures/aizu_online_judge/contests.json | 352 - .../aizu_online_judge/courses/contests.json | 131 + .../aizu_online_judge/courses/tasks.json | 1802 +++++ .../fixtures/aizu_online_judge/tasks.json | 702 -- .../fixtures/atcoder_problems/contests.json | 894 +-- .../fixtures/atcoder_problems/tasks.json | 968 +-- src/lib/clients/fixtures/record_requests.ts | 172 +- src/lib/clients/index.ts | 222 +- src/lib/components/TaskForm.svelte | 2 +- src/lib/components/TaskListForEdit.svelte | 74 - src/routes/(admin)/tasks/+page.server.ts | 225 +- src/routes/(admin)/tasks/+page.svelte | 89 +- .../(admin)/tasks/[task_id]/+page.server.ts | 34 +- .../tasks/_components/TaskSearchBox.svelte | 16 + .../_components/TaskTableForImport.svelte | 67 + 25 files changed, 22949 insertions(+), 2754 deletions(-) create mode 100644 docs/dev-notes/2026-05-17/task-import-by-source/plan-2nd.md create mode 100644 docs/dev-notes/2026-05-17/task-import-by-source/plan.md create mode 100644 docs/ui-mock/2026-05-16/index.html create mode 100644 src/lib/clients/contest_task_fetcher.ts create mode 100644 src/lib/clients/fixtures/aizu_online_judge/challenges/jag_prelim/contests.json create mode 100644 src/lib/clients/fixtures/aizu_online_judge/challenges/jag_regional/contests.json create mode 100644 src/lib/clients/fixtures/aizu_online_judge/challenges/pck_final/contests.json create mode 100644 src/lib/clients/fixtures/aizu_online_judge/challenges/pck_prelim/contests.json delete mode 100644 src/lib/clients/fixtures/aizu_online_judge/contests.json create mode 100644 src/lib/clients/fixtures/aizu_online_judge/courses/contests.json create mode 100644 src/lib/clients/fixtures/aizu_online_judge/courses/tasks.json delete mode 100644 src/lib/clients/fixtures/aizu_online_judge/tasks.json delete mode 100644 src/lib/components/TaskListForEdit.svelte create mode 100644 src/routes/(admin)/tasks/_components/TaskSearchBox.svelte create mode 100644 src/routes/(admin)/tasks/_components/TaskTableForImport.svelte diff --git a/docs/dev-notes/2026-05-17/task-import-by-source/plan-2nd.md b/docs/dev-notes/2026-05-17/task-import-by-source/plan-2nd.md new file mode 100644 index 000000000..a685e910b --- /dev/null +++ b/docs/dev-notes/2026-05-17/task-import-by-source/plan-2nd.md @@ -0,0 +1,95 @@ +# AOJ fixture を raw API 形式に修正 + +## 概要 + +`record_requests.ts` が変換済みデータ(`ContestsForImport`)を fixture に保存していたため、 +nock で raw API 形式を期待する `clients.test.ts` が 11/15 失敗している。 +`record_requests.ts` を raw API レスポンスを直接保存する形に書き換え、 +nock → client 変換 → アサート の流れを正しく成立させる。 + +## Task 1: `record_requests.ts` を rewrite + +**ファイル**: `src/lib/clients/fixtures/record_requests.ts` + +### 削除 + +- `clients` 配列(`TasksApiClient` ベースの設計) +- `saveContests`, `saveTasks`, `validateContestSiteApi`, `bindChallenge` +- `startRecordRequests`, `stopRecordRequests`(nock recorder 不要) + +### 変更後の保存ロジック + +`HttpRequestClient.fetchApiWithConfig()` で raw API を直接取得して保存する。 + +``` +AOJ courses: + GET /courses → AOJCourseAPI (そのまま) → aizu_online_judge/courses/contests.json + GET /problems?size=10000 → AOJTaskAPIs (100 件サンプル) → aizu_online_judge/courses/tasks.json + +AOJ challenges (4 種): + GET /challenges/cl/PCK/PRELIM → AOJChallengeContestAPI → challenges/pck_prelim/contests.json + GET /challenges/cl/PCK/FINAL → AOJChallengeContestAPI → challenges/pck_final/contests.json + GET /challenges/cl/JAG/PRELIM → AOJChallengeContestAPI → challenges/jag_prelim/contests.json + GET /challenges/cl/JAG/REGIONAL → AOJChallengeContestAPI → challenges/jag_regional/contests.json + ※ tasks.json は生成しない(tasks は contests レスポンスに埋め込み済み) + ※ contests 配列を 100 件サンプル、largeCl ラッパーは保持: + { ...raw, contests: getRandomElementsFromArray(raw.contests, 100) } +``` + +AtCoder は `AtCoderProblemsApiClient` をそのまま使用 +(raw API = `ContestsForImport` 形式であり変換なし)。 + +`getRandomElementsFromArray`, `toJson`, `ensureDirectoryExists` は残す。 + +### 追加インポート + +```typescript +import type { + AOJCourseAPI, + AOJTaskAPIs, + AOJChallengeContestAPI, +} from '$lib/clients/aizu_online_judge/types'; +``` + +## Task 2: `AojChallengesApiClient` にコメントを追加 + +**ファイル**: `src/lib/clients/aizu_online_judge/clients.ts` + +challenges が1エンドポイントで contests と tasks 両方を返す(`days[].problems` 埋め込み)ことは +非自明なので、クラス定義の直前にコメントを追加する。→ **実装済み** + +## Task 3: `clients.test.ts` の未使用パスを削除 + +**ファイル**: `src/lib/clients/aizu_online_judge/clients.test.ts` + +`FIXTURE_PATHS` の challenge 各エントリから未参照の `tasks` キーを削除する。 + +```typescript +// 変更前 +pckPrelim: { contests: '...', tasks: '...' } + +// 変更後 +pckPrelim: { contests: '...' } +``` + +対象: `pckPrelim`, `pckFinal`, `jagPrelim`, `jagRegional` + +## Task 3: fixture 再生成 + +```bash +pnpm dlx vite-node ./src/lib/clients/fixtures/record_requests.ts +``` + +生成される raw fixture: + +- `courses/contests.json` → `{ filter: string, courses: Course[] }` +- `courses/tasks.json` → `AOJTaskAPI[]` +- `challenges/*/contests.json` → `{ largeCl, contests: ChallengeContest[] }` + +## Task 4: テスト検証 + +```bash +pnpm test:unit +``` + +全テストがグリーンになることを確認。 diff --git a/docs/dev-notes/2026-05-17/task-import-by-source/plan.md b/docs/dev-notes/2026-05-17/task-import-by-source/plan.md new file mode 100644 index 000000000..fa7e82133 --- /dev/null +++ b/docs/dev-notes/2026-05-17/task-import-by-source/plan.md @@ -0,0 +1,421 @@ +# タスクインポートページ: ソース別取得リファクタリング + +## 背景・課題・目的 + +### 課題 + +1. **拡張困難**: 対応コンテストサイト・種別の追加に複数クラスの変更が必要。 +2. **API アクセス過多**: `/tasks` ページ初期ロード時に AtCoder + AOJ 全種別(5種類)を並列取得。管理者が特定ソースしか必要としない場合も全ソースの API を叩く。 +3. **AojApiClient の god class**: `this.apiClients` がコンストラクタ内にハードコーディングされており、新しい AOJ コンテスト種別の追加が `AojApiClient` 内部変更を伴う。 +4. **継承が深い**: `AojTasksApiClientBase` → `AojCoursesApiClient` / `AojChallengesApiClient` の継承構造が shared logic の追跡を難しくしている。 + +### 目的 + +- **アクセス削減**: ボタン押下時に選択されたソースのみ取得する +- **拡張容易化**: 新ソースを `ContestTaskImportSource` 型と `importSources` に 1 エントリ追加するだけで対応できる構造へ +- **設計改善**: 継承廃止・関数ベースへの整理(AOJ 特有の部分と汎用部分の分離) +- 関連 PR: #3524(事前に関連ファイルを機能単位で集約)の続き。次 PR: AOJ ICPC 系統の追加 + +--- + +## 設計決定と根拠 + +### 1. データ取得トリガー: form action (`?/fetch`) + `use:enhance` + +`load()` はページ初期表示時に API を叩かない(`{ importContests: null }` を返す)。 +ユーザーがソースを選択して「データ取得」ボタンを押すと `?/fetch` action に POST され、選択されたソースのみ API を叩く。 + +- URL が変わらない → ブックマーク・ブラウザバックが不要な管理者画面に適切 +- 既存の `?/create` / `?/update` と同じ SvelteKit form action パターンで一貫性を保つ +- `use:enhance` でページ全体リロードなし(問題表示部分のみ更新) + +### 2. clients/index.ts: dispatcher パターン + +`ContestTaskImportSource` を flat な string union type として定義し、`importSources` オブジェクトに `label` / `contests` / `tasks` の3属性を集約する。`fetchContests` / `fetchTasks` / `getImportSourceLabel` / `importSourceEntries` を export する。 + +```typescript +export type ContestTaskImportSource = + | 'atcoder' + | 'aoj_courses' + | 'aoj_pck_prelim' + | 'aoj_pck_final' + | 'aoj_jag_prelim' + | 'aoj_jag_regional'; +``` + +**個別関数案との比較:** + +- 個別関数(`fetchAojPckPrelimContests()` 等)は理解しやすいが、`+page.server.ts` 側に source-specific な if/switch が生まれる +- Dispatcher は呼び出し側がシンプルになり、新ソース追加は `importSources` への1エントリ追加だけで完結する +- `ContestTaskImportSource` が flat string union のため、フォームデータのシリアライズ・バリデーションが容易(`isContestTaskImportSource()` 型ガードで境界検証) +- 対応ソースが増えるほど dispatcher の優位性が増す(次 PR: ICPC 追加が予定されている) + +### 3. AojApiClient の廃止・god class 解体 + +旧 `AojApiClient`(`this.apiClients` ハードコーディング)は削除。`clients/index.ts` の dispatcher が同等の責務を担う。`AojTasksApiClientBase` も削除し、shared logic は standalone 関数として `aizu_online_judge/contest_task_fetcher.ts` に切り出す。 + +- **継承廃止の理由**: `getCachedOrFetchContests` / `getCachedOrFetchTasks` は `httpClient` と `cache` を引数に受け取れば独立して動作する。継承より合成(composition)のほうが依存関係が明示的。 +- `AojCoursesApiClient` / `AojChallengesApiClient` は `(httpClient, cache)` を constructor で受け取るスタンドアロンクラスとして存続。 + +### 4. 検索・ページネーション: 分離コンポーネント + 親での状態管理 + +**ラッパー案(却下):** +ラッパーコンポーネントは `Contests` 型を知る必要があり汎用性が低い。TaskImportTable を包む専用ラッパーは indirection を増やすだけで再利用性を生まない。 + +**TaskImportTable 直接実装案(却下):** +TaskImportTable が状態を持つと、将来他ページに描画ロジックを切り出す際に状態管理の責務が混在する。 + +**採用: コンポーネント分離 + 親管理** + +- `TaskSearchBox.svelte` — 検索入力(`bind:value` で `searchQuery` を親と共有) +- Flowbite `Pagination` — ページネーション(`+page.svelte` で直接使用) +- `TaskImportTable` — 描画専念。フィルタ済み・ページ済み `Contests` を props で受け取るだけ +- `+page.svelte` — `$state` で `searchQuery` / `currentPage` を持ち、`$derived` でフィルタ・スライスを計算 + +この構造により TaskImportTable は純粋な描画コンポーネントとして保たれ、`TaskSearchBox` は将来の再利用の余地を持つ。 + +--- + +## ファイル変更一覧 + +``` +src/lib/clients/ +├── index.ts # 変更: ContestTaskImportSource + dispatcher 関数 +├── contest_task_fetcher.ts # 新規: getCachedOrFetchContests/Tasks standalone 関数(汎用) +├── aizu_online_judge/ +│ ├── clients.ts # 変更: 継承廃止・god class 削除 +│ ├── clients.test.ts # 変更: 新クラス構造に合わせて更新 +│ ├── types.ts # 変更なし +│ └── utils.ts # 変更なし +└── fixtures/ + └── aizu_online_judge/ + ├── courses/ # 新規(既存の混在データから分割) + │ ├── contests.json + │ └── tasks.json + └── challenges/ # 新規 + ├── pck_prelim/ + │ ├── contests.json + │ └── tasks.json + ├── pck_final/ + │ ├── contests.json + │ └── tasks.json + ├── jag_prelim/ + │ ├── contests.json + │ └── tasks.json + └── jag_regional/ + ├── contests.json + └── tasks.json + +src/routes/(admin)/tasks/ +├── +page.server.ts # 変更: load 空返却・fetch action 追加・create/update 修正 +├── +page.svelte # 変更: Source 選択 UI・状態管理追加 +└── _components/ + ├── TaskImportTable.svelte # 移動 + 変更: lib/components/ から移動・リネーム・source prop 追加 + └── TaskSearchBox.svelte # 新規: 検索入力コンポーネント + +src/lib/components/ +└── TaskListForEdit.svelte # 削除(_components/ へ移動) +``` + +--- + +## 実装フェーズ + +### Phase 1: フィクスチャ整理とテスト先行(TDD: Red) + +**狙い:** 新クラス構造に対するテストを先に書く。この時点では実装が変わっていないので一部テストは失敗する(Red)。Phase 2 の実装でパスさせる。 + +**タスク:** + +1. 既存 `fixtures/aizu_online_judge/contests.json` / `tasks.json` を分析し、種別ごとに振り分け + - courses: `shortName` 形式のコンテスト ID(ITP1, ALDS1 等) + - pck_prelim / pck_final / jag_prelim / jag_regional: challenge 系 + +2. 各種別のディレクトリと JSON ファイルを作成(最低 2〜3 件のサンプルデータ) + +3. `AojCoursesApiClient` のテストを `courses/` フィクスチャで新規作成 + - Nock で `/courses` エンドポイントをモック + - `getContests()` / `getTasks()` の構造検証 + - 備考: 現テストは `client.getContests = async () => mock` でメソッドを差し替えており、`getCachedOrFetchContests` / `getCachedOrFetchTasks` はゼロカバレッジ。Nock ベースに変えることで HTTP fetch → transformer → キャッシュのパスが初めてカバーされる。専用単体テストは不要(`getContests()` 経由で間接カバー十分) + +4. `AojChallengesApiClient` のテストを各種別フィクスチャで新規作成(PCK PRELIM / PCK FINAL / JAG PRELIM / JAG REGIONAL 各1テスト) + +5. 既存の `fixtures/aizu_online_judge/contests.json` / `tasks.json`(混在ファイル)と旧テストを削除 + +**検証:** 新テストが Red(失敗)であることを確認。既存テストは削除済みのため競合なし。 + +--- + +### Phase 2: AOJ クライアントリファクタリング(TDD: Green) + +**狙い:** Phase 1 で書いたテストをパスさせる形で継承廃止・god class 削除を実装する。 + +**タスク:** + +1. `src/lib/clients/contest_task_fetcher.ts` を新規作成(`aizu_online_judge/` 外に配置) + - `getCachedOrFetchContests(httpClient, cache, config)` standalone 関数 + - `getCachedOrFetchTasks(httpClient, cache, config)` standalone 関数 + - シグネチャに AOJ 固有の型なし(`HttpRequestClient` / `ContestTaskCache` / `ContestsForImport` / `TasksForImport` はすべて `clients/` レベルの汎用型) + - ログラベルの "AOJ" 固定文字列を削除し `label` パラメータに統合(例: `label: 'AOJ course'`) + - 将来 AtCoder クライアントがキャッシュを導入する際にも再利用可能 + +2. `AojCoursesApiClient` を `AojTasksApiClientBase` から切り離す + - `constructor(private httpClient, private cache)` に変更 + - `getCachedOrFetch*` を standalone 関数呼び出しに変更 + - 継承: なし + +3. `AojChallengesApiClient` も同様に切り離す + +4. `AojTasksApiClientBase` クラスを削除 + +5. `AojApiClient` (god class) を削除 + +**検証:** `pnpm test:unit` で Phase 1 のテストがすべてパス(Green) + +--- + +### Phase 3: clients/index.ts の再設計 + +**狙い:** Dispatcher 関数の提供。`+page.server.ts` 側がルーティングロジックを持たない構造へ。 + +**タスク:** + +1. `ContestTaskImportSource` 型を定義・export + +2. `isContestTaskImportSource(value: unknown): value is ImportSource` 型ガードを実装 + - 境界検証(フォームデータの `source` フィールド検証に使用) + +3. `importSources` オブジェクトを定義し `fetchContests` / `fetchTasks` / `getImportSourceLabel` を実装 + + ```typescript + type ContestTaskImportSourceConfig = { + label: string; + contests: () => Promise; + tasks: () => Promise; + }; + + // AOJ Challenges の contests/tasks で params が重複しないようにヘルパーを用意 + function buildAojChallengeConfig( + params: ChallengeParams, + label: string, + ): ContestTaskImportSourceConfig { + return { + label, + contests: () => aojChallengesClient.getContests(params), + tasks: () => aojChallengesClient.getTasks(params), + }; + } + + const importSources: Record = { + atcoder: { + label: 'AtCoder', + contests: () => atCoderClient.getContests(), + tasks: () => atCoderClient.getTasks(), + }, + aoj_courses: { + label: 'AOJ - コース', + contests: () => aojCoursesClient.getContests(), + tasks: () => aojCoursesClient.getTasks(), + }, + aoj_pck_prelim: buildAojChallengeConfig( + { contestType: 'PCK', round: 'PRELIM' }, + 'AOJ - パソコン甲子園 予選', + ), + aoj_pck_final: buildAojChallengeConfig( + { contestType: 'PCK', round: 'FINAL' }, + 'AOJ - パソコン甲子園 本選', + ), + aoj_jag_prelim: buildAojChallengeConfig( + { contestType: 'JAG', round: 'PRELIM' }, + 'AOJ - JAG 模擬国内', + ), + aoj_jag_regional: buildAojChallengeConfig( + { contestType: 'JAG', round: 'REGIONAL' }, + 'AOJ - JAG 模擬地区', + ), + }; + + export const fetchContests = (source: ContestTaskImportSource) => + importSources[source].contests(); + export const fetchTasks = (source: ContestTaskImportSource) => importSources[source].tasks(); + export const getImportSourceLabel = (source: ContestTaskImportSource) => + importSources[source].label; + export const importSourceEntries = Object.entries(importSources) as [ + ContestTaskImportSource, + ContestTaskImportSourceConfig, + ][]; + ``` + + - `label` / `contestType` / `round` の3属性が `importSources` の1箇所に集約。UI ラベルテーブルは不要になる + - `Record` により新ソース追加時のキー漏れをコンパイルエラーで検出 + - `importSourceEntries` を ` + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/clients/aizu_online_judge/clients.test.ts b/src/lib/clients/aizu_online_judge/clients.test.ts index eefab6bca..da6df09d1 100644 --- a/src/lib/clients/aizu_online_judge/clients.test.ts +++ b/src/lib/clients/aizu_online_judge/clients.test.ts @@ -1,83 +1,123 @@ -import { describe, test, expect, beforeAll } from 'vitest'; +import { describe, test, expect, beforeEach, afterEach, vi } from 'vitest'; +import nock from 'nock'; + +vi.mock('$lib/utils/time', () => ({ + delay: vi.fn().mockResolvedValue(undefined), +})); + +import { HttpRequestClient } from '$lib/clients/http_client'; +import { ContestTaskCache } from '$lib/clients/cache_strategy'; +import { Cache } from '$lib/clients/cache'; + +import { AojCoursesApiClient, AojChallengesApiClient } from './clients'; -import type { TasksApiClient } from '$lib/clients/http_client'; import type { ContestsForImport } from '$lib/types/contest'; import type { TasksForImport } from '$lib/types/task'; - -import { AojApiClient } from '$lib/clients/aizu_online_judge/clients'; +import type { AOJCourseAPI, AOJChallengeContestAPI, AOJTaskAPIs } from './types'; import { loadMockData } from '../fixtures/helpers'; -describe('AIZU ONLINE JUDGE API client', () => { - let client: TasksApiClient; - let contestsMock: ContestsForImport; - let tasksMock: TasksForImport; - - beforeAll(() => { - client = new AojApiClient(); - - const MOCK_DATA_PATHS = { - contests: './src/lib/clients/fixtures/aizu_online_judge/contests.json', - tasks: './src/lib/clients/fixtures/aizu_online_judge/tasks.json', - }; - - try { - contestsMock = loadMockData(MOCK_DATA_PATHS.contests); - tasksMock = loadMockData(MOCK_DATA_PATHS.tasks); - } catch (error) { - throw new Error( - `Failed to load mock data: ${error}\nFile: ${ - error instanceof Error && 'fileName' in error ? error.fileName : 'unknown' - }`, - ); - } +const AOJ_API_BASE = 'https://judgeapi.u-aizu.ac.jp'; + +function buildCache(): ContestTaskCache { + return new ContestTaskCache(new Cache(), new Cache()); +} + +function buildCoursesClient(): AojCoursesApiClient { + const httpClient = new HttpRequestClient(`${AOJ_API_BASE}/`); + return new AojCoursesApiClient(httpClient, buildCache()); +} + +function buildChallengesClient(): AojChallengesApiClient { + const httpClient = new HttpRequestClient(`${AOJ_API_BASE}/`); + return new AojChallengesApiClient(httpClient, buildCache()); +} + +const FIXTURE_PATHS = { + courses: { + contests: './src/lib/clients/fixtures/aizu_online_judge/courses/contests.json', + tasks: './src/lib/clients/fixtures/aizu_online_judge/courses/tasks.json', + }, + // challenges: the AOJChallengeContestAPI response is a single endpoint that embeds tasks + // (days[].problems) inside the contest structure. The essential data is the problem list; + // contests and tasks both derive from this one fixture. + pckPrelim: { + contests: './src/lib/clients/fixtures/aizu_online_judge/challenges/pck_prelim/contests.json', + }, + pckFinal: { + contests: './src/lib/clients/fixtures/aizu_online_judge/challenges/pck_final/contests.json', + }, + jagPrelim: { + contests: './src/lib/clients/fixtures/aizu_online_judge/challenges/jag_prelim/contests.json', + }, + jagRegional: { + contests: './src/lib/clients/fixtures/aizu_online_judge/challenges/jag_regional/contests.json', + }, +}; + +describe('AojCoursesApiClient', () => { + const courseContestsMock = loadMockData(FIXTURE_PATHS.courses.contests); + const courseTasksMock = loadMockData(FIXTURE_PATHS.courses.tasks); + + beforeEach(() => { + nock.cleanAll(); + }); + + afterEach(() => { + nock.cleanAll(); }); describe('getContests', () => { - test('expects to fetch contests', async () => { - // Use mock data instead of making a request. - client.getContests = async () => contestsMock; + test('fetches and transforms course contests', async () => { + nock(AOJ_API_BASE).get('/courses').reply(200, courseContestsMock); + const client = buildCoursesClient(); const contests = await client.getContests(); - expect(contests.length).toEqual(contestsMock.length); + expect(contests.length).toBe(courseContestsMock.courses.length); }); - // See: - // https://vitest.dev/api/expect.html#tobedefined - test('each contest expects to have id and title', async () => { - contestsMock.forEach((contest) => { + test('each contest has id and title', async () => { + nock(AOJ_API_BASE).get('/courses').reply(200, courseContestsMock); + const client = buildCoursesClient(); + const contests = await client.getContests(); + + contests.forEach((contest) => { expect(contest.id).toBeDefined(); expect(contest.title).toBeDefined(); }); }); - test('handles empty contests list', async () => { - client.getContests = async () => []; + test('contest id matches course shortName', async () => { + nock(AOJ_API_BASE).get('/courses').reply(200, courseContestsMock); + const client = buildCoursesClient(); const contests = await client.getContests(); - expect(contests).toHaveLength(0); - }); - test('validates contest properties format', async () => { - contestsMock.forEach((contest) => { - expect(typeof contest.id).toBe('string'); - expect(contest.id).toMatch(/^[a-zA-Z0-9_-]+$/); - expect(typeof contest.title).toBe('string'); - expect(contest.title.length).toBeGreaterThan(0); + const shortNames = courseContestsMock.courses.map((contest) => contest.shortName); + contests.forEach((contest) => { + expect(shortNames).toContain(contest.id); }); }); }); describe('getTasks', () => { - test('expects to fetch tasks', async () => { - // Use mock data instead of making a request. - client.getTasks = async () => tasksMock; + test('fetches and transforms course tasks (only course-format ids)', async () => { + nock(AOJ_API_BASE).get('/problems').query({ size: '10000' }).reply(200, courseTasksMock); + const client = buildCoursesClient(); const tasks = await client.getTasks(); - expect(tasks.length).toEqual(tasksMock.length); + // Only tasks whose id matches courseName_taskId_index format are returned + const expectedCount = courseTasksMock.filter( + (task) => task.id.split('_').length === 3, + ).length; + expect(tasks.length).toBe(expectedCount); }); - test('each task expects to have id, contest_id, problem_index and title', async () => { - tasksMock.forEach((task) => { + test('each task has id, contest_id, problem_index, and title', async () => { + nock(AOJ_API_BASE).get('/problems').query({ size: '10000' }).reply(200, courseTasksMock); + const client = buildCoursesClient(); + const tasks = await client.getTasks(); + + tasks.forEach((task) => { expect(task.id).toBeDefined(); expect(task.contest_id).toBeDefined(); expect(task.problem_index).toBeDefined(); @@ -85,20 +125,130 @@ describe('AIZU ONLINE JUDGE API client', () => { }); }); - test('handles empty tasks list', async () => { - client.getTasks = async () => []; + test('task contest_id is derived from task id prefix', async () => { + nock(AOJ_API_BASE).get('/problems').query({ size: '10000' }).reply(200, courseTasksMock); + const client = buildCoursesClient(); const tasks = await client.getTasks(); - expect(tasks).toHaveLength(0); + + tasks.forEach((task) => { + const expectedContestId = task.id.split('_')[0]; + expect(task.contest_id).toBe(expectedContestId); + }); }); + }); +}); + +describe('AojChallengesApiClient', () => { + beforeEach(() => { + nock.cleanAll(); + }); - test('validates task properties format', async () => { - tasksMock.forEach((task) => { - expect(typeof task.id).toBe('string'); - expect(typeof task.contest_id).toBe('string'); - expect(typeof task.problem_index).toBe('string'); - expect(typeof task.title).toBe('string'); - expect(task.title.length).toBeGreaterThan(0); + afterEach(() => { + nock.cleanAll(); + }); + + describe('PCK PRELIM', () => { + const contestsMock = loadMockData(FIXTURE_PATHS.pckPrelim.contests); + let client: AojChallengesApiClient; + + beforeEach(() => { + nock(AOJ_API_BASE).get('/challenges/cl/PCK/PRELIM').reply(200, contestsMock); + client = buildChallengesClient(); + }); + + test('fetches and transforms PCK PRELIM contests', async () => { + const contests = await client.getContests({ contestType: 'PCK', round: 'PRELIM' }); + const expectedCount = contestsMock.contests.flatMap((contest) => contest.days).length; + expect(contests.length).toBe(expectedCount); + }); + + test('fetches and transforms PCK PRELIM tasks', async () => { + const tasks = await client.getTasks({ contestType: 'PCK', round: 'PRELIM' }); + const expectedCount = contestsMock.contests + .flatMap((contest) => contest.days) + .flatMap((day) => day.problems).length; + expect(tasks.length).toBe(expectedCount); + }); + + test('each PCK PRELIM task has required fields', async () => { + const tasks = await client.getTasks({ contestType: 'PCK', round: 'PRELIM' }); + tasks.forEach((task) => { + expect(task.id).toBeDefined(); + expect(task.contest_id).toBeDefined(); + expect(task.title).toBeDefined(); }); }); }); + + describe('PCK FINAL', () => { + const contestsMock = loadMockData(FIXTURE_PATHS.pckFinal.contests); + let client: AojChallengesApiClient; + + beforeEach(() => { + nock(AOJ_API_BASE).get('/challenges/cl/PCK/FINAL').reply(200, contestsMock); + client = buildChallengesClient(); + }); + + test('fetches and transforms PCK FINAL contests', async () => { + const contests = await client.getContests({ contestType: 'PCK', round: 'FINAL' }); + const expectedCount = contestsMock.contests.flatMap((contest) => contest.days).length; + expect(contests.length).toBe(expectedCount); + }); + + test('fetches and transforms PCK FINAL tasks', async () => { + const tasks = await client.getTasks({ contestType: 'PCK', round: 'FINAL' }); + const expectedCount = contestsMock.contests + .flatMap((contest) => contest.days) + .flatMap((day) => day.problems).length; + expect(tasks.length).toBe(expectedCount); + }); + }); + + describe('JAG PRELIM', () => { + const contestsMock = loadMockData(FIXTURE_PATHS.jagPrelim.contests); + let client: AojChallengesApiClient; + + beforeEach(() => { + nock(AOJ_API_BASE).get('/challenges/cl/JAG/PRELIM').reply(200, contestsMock); + client = buildChallengesClient(); + }); + + test('fetches and transforms JAG PRELIM contests', async () => { + const contests = await client.getContests({ contestType: 'JAG', round: 'PRELIM' }); + const expectedCount = contestsMock.contests.flatMap((contest) => contest.days).length; + expect(contests.length).toBe(expectedCount); + }); + + test('fetches and transforms JAG PRELIM tasks', async () => { + const tasks = await client.getTasks({ contestType: 'JAG', round: 'PRELIM' }); + const expectedCount = contestsMock.contests + .flatMap((contest) => contest.days) + .flatMap((day) => day.problems).length; + expect(tasks.length).toBe(expectedCount); + }); + }); + + describe('JAG REGIONAL', () => { + const contestsMock = loadMockData(FIXTURE_PATHS.jagRegional.contests); + let client: AojChallengesApiClient; + + beforeEach(() => { + nock(AOJ_API_BASE).get('/challenges/cl/JAG/REGIONAL').reply(200, contestsMock); + client = buildChallengesClient(); + }); + + test('fetches and transforms JAG REGIONAL contests', async () => { + const contests = await client.getContests({ contestType: 'JAG', round: 'REGIONAL' }); + const expectedCount = contestsMock.contests.flatMap((contest) => contest.days).length; + expect(contests.length).toBe(expectedCount); + }); + + test('fetches and transforms JAG REGIONAL tasks', async () => { + const tasks = await client.getTasks({ contestType: 'JAG', round: 'REGIONAL' }); + const expectedCount = contestsMock.contests + .flatMap((contest) => contest.days) + .flatMap((day) => day.problems).length; + expect(tasks.length).toBe(expectedCount); + }); + }); }); diff --git a/src/lib/clients/aizu_online_judge/clients.ts b/src/lib/clients/aizu_online_judge/clients.ts index e4c952b85..2c1bbea45 100644 --- a/src/lib/clients/aizu_online_judge/clients.ts +++ b/src/lib/clients/aizu_online_judge/clients.ts @@ -1,12 +1,10 @@ -import { type TasksApiClient, HttpRequestClient } from '$lib/clients/http_client'; +import { HttpRequestClient } from '$lib/clients/http_client'; import { ContestTaskCache } from '$lib/clients/cache_strategy'; -import { Cache, type ApiClientConfig } from '$lib/clients/cache'; +import { getCachedOrFetchContests, getCachedOrFetchTasks } from '$lib/clients/contest_task_fetcher'; import type { ContestsForImport } from '$lib/types/contest'; import type { TasksForImport } from '$lib/types/task'; -import { AOJ_API_BASE_URL } from '$lib/constants/urls'; - import type { AOJCourseAPI, Course, @@ -20,288 +18,86 @@ import type { } from './types'; import { buildEndpoint, mapToContest, mapToTask, getCourseName } from './utils'; -/** - * AojApiClient is a client for interacting with the Aizu Online Judge (AOJ) API. - * It implements TasksApiClient and provides methods to fetch contests and tasks - * from the AOJ platform. - * - * @class AojApiClient - * @implements {TasksApiClient} - */ -export class AojApiClient implements TasksApiClient { - private readonly coursesApiClient: AojCoursesApiClient; - private readonly challengesApiClient: AojChallengesApiClient; - - /** - * Array of API clients configured for Aizu Online Judge. - * - * @private - * @readonly - */ - private readonly apiClients: { - label: string; - client: TasksApiClient; - params?: ChallengeParams; - }[]; - - /** - * Constructs an instance of the Aizu Online Judge client. - * - * @param {ApiClientConfig} [config] - Optional configuration object for the API client. - */ - constructor(config?: ApiClientConfig) { - const contestCache = new Cache( - config?.contestCache?.timeToLive, - config?.contestCache?.maxSize, - ); - const taskCache = new Cache( - config?.taskCache?.timeToLive, - config?.taskCache?.maxSize, - ); - - const caches = new ContestTaskCache(contestCache, taskCache); - const httpClient = new HttpRequestClient(AOJ_API_BASE_URL); - - this.coursesApiClient = new AojCoursesApiClient(httpClient, caches); - this.challengesApiClient = new AojChallengesApiClient(httpClient, caches); - - this.apiClients = [ - { - label: 'course', - client: this.coursesApiClient, - }, - { - label: 'pck-prelim', - client: this.challengesApiClient, - params: { contestType: 'PCK', round: 'PRELIM' }, - }, - { - label: 'pck-final', - client: this.challengesApiClient, - params: { contestType: 'PCK', round: 'FINAL' }, - }, - { - label: 'jag-prelim', - client: this.challengesApiClient, - params: { contestType: 'JAG', round: 'PRELIM' }, - }, - { - label: 'jag-regional', - client: this.challengesApiClient, - params: { contestType: 'JAG', round: 'REGIONAL' }, - }, - ]; - } - - /** - * Fetches and combines contests from different sources. - * - * @returns {Promise} A promise that resolves to an array of contests. - */ - async getContests(): Promise { - return (await this.fetchAllData('getContests')).flat(); - } - - /** - * Fetches tasks from various sources and combines them into a single list. - * - * @returns {Promise} A promise that resolves to an array of tasks. - */ - async getTasks(): Promise { - return (await this.fetchAllData('getTasks')).flat(); - } - - private async fetchAllData(methodName: 'getContests' | 'getTasks'): Promise { - try { - const requests = this.apiClients.map((apiClient) => - apiClient.client[methodName](apiClient.params), - ); - - const responses = await Promise.allSettled(requests); - let results: T[] = []; - - results = responses.map((result, index) => { - if (result.status === 'fulfilled') { - return result.value; - } else { - console.error(`Failed to fetch from ${this.apiClients[index].label}:`, result.reason); - return []; - } - }) as T[]; - - return results; - } catch (error) { - console.error(`Failed to fetch data from AOJ API:`, error); - return []; - } - } -} - -/** - * Abstract base class for Aizu Online Judge (AOJ) API clients. - * - * @template TParams - The type of parameters accepted by the API methods. - */ -export abstract class AojTasksApiClientBase implements TasksApiClient { +export class AojCoursesApiClient { constructor( - protected readonly httpClient: HttpRequestClient, - protected readonly cache: ContestTaskCache, + private readonly httpClient: HttpRequestClient, + private readonly cache: ContestTaskCache, ) {} - abstract getContests(params?: TParams): Promise; - - abstract getTasks(params?: TParams): Promise; - - /** - * Retrieves contest data either from cache or from the Aizu Online Judge API. - * - * @protected - */ - protected async getCachedOrFetchContests({ - cacheKey, - endpoint, - errorMessage, - validateResponse, - transformer, - label, - }: { - cacheKey: string; - endpoint: string; - errorMessage: string; - validateResponse: (data: T) => boolean; - transformer: (data: T) => ContestsForImport; - label: string; - }): Promise { - return this.cache.getCachedOrFetchContests(cacheKey, async () => { - const apiResponse = await this.httpClient.fetchApiWithConfig({ - endpoint, - errorMessage, - validateResponse, - }); - - const transformedContests = transformer(apiResponse); - this.printLogForFetchedResults(label, transformedContests, 'contest'); - - return transformedContests; - }); - } - - /** - * Retrieves tasks from cache or fetches them from the API if not cached. - * - * @protected - */ - protected async getCachedOrFetchTasks({ - cacheKey, - endpoint, - errorMessage, - validateResponse, - transformer, - label, - }: { - cacheKey: string; - endpoint: string; - errorMessage: string; - validateResponse: (data: T) => boolean; - transformer: (data: T) => TasksForImport; - label: string; - }): Promise { - return this.cache.getCachedOrFetchTasks(cacheKey, async () => { - const apiResponse = await this.httpClient.fetchApiWithConfig({ - endpoint, - errorMessage, - validateResponse, - }); - - const transformedTasks = transformer(apiResponse); - this.printLogForFetchedResults(label, transformedTasks, 'task'); - - return transformedTasks; - }); - } - - private printLogForFetchedResults(label: string, data: R, dataType: 'task' | 'contest'): void { - const countText = Array.isArray(data) ? `${data.length} ${dataType}s` : typeof data; - - console.debug(`Found AOJ ${label}: ${countText}`); - } -} - -/** - * Client for interacting with the Aizu Online Judge (AOJ) Courses API. - * - * @extends AojTasksApiClientBase - */ -export class AojCoursesApiClient extends AojTasksApiClientBase { async getContests(): Promise { - return this.getCachedOrFetchContests({ + return getCachedOrFetchContests(this.httpClient, this.cache, { cacheKey: 'aoj_courses', endpoint: 'courses', errorMessage: 'Failed to fetch course contests from AOJ API', validateResponse: (data) => 'courses' in data && Array.isArray(data.courses) && data.courses.length > 0, - transformer: (data) => this.transformCourseContests(data), - label: 'course', + transformer: (data) => + data.courses.map((course: Course) => mapToContest(course.shortName, course.name)), + label: 'AOJ course', }); } async getTasks(): Promise { const size = 10 ** 4; - return this.getCachedOrFetchTasks({ + return getCachedOrFetchTasks(this.httpClient, this.cache, { cacheKey: 'aoj_courses', endpoint: `problems?size=${size}`, errorMessage: 'Failed to fetch course tasks from AOJ API', validateResponse: (data) => Array.isArray(data) && data.length > 0, - transformer: (data) => this.transformCourseTasks(data), - label: 'course', + transformer: (data) => + data + .filter((task: AOJTaskAPI) => getCourseName(task.id) !== '') + .map((task: AOJTaskAPI) => mapToTask(task, getCourseName(task.id))), + label: 'AOJ course', }); } - - private transformCourseContests(data: AOJCourseAPI): ContestsForImport { - return data.courses.map((course: Course) => { - return mapToContest(course.shortName, course.name); - }); - } - - private transformCourseTasks(data: AOJTaskAPIs): TasksForImport { - return data - .filter((task: AOJTaskAPI) => getCourseName(task.id) !== '') - .map((task: AOJTaskAPI) => { - return mapToTask(task, getCourseName(task.id)); - }); - } } -/** - * Client for interfacing with the Aizu Online Judge (AOJ) API to fetch challenge contests and tasks. - * - * @extends AojTasksApiClientBase - */ -export class AojChallengesApiClient extends AojTasksApiClientBase { +// AOJ challenges API returns contests and their tasks in a single endpoint +// (days[].problems). getContests() and getTasks() both call the same URL; +// there is no separate tasks endpoint unlike AojCoursesApiClient. +export class AojChallengesApiClient { + constructor( + private readonly httpClient: HttpRequestClient, + private readonly cache: ContestTaskCache, + ) {} + async getContests(params: ChallengeParams): Promise { const { contestType, round } = params; - return this.getCachedOrFetchContests({ + return getCachedOrFetchContests(this.httpClient, this.cache, { cacheKey: this.getCacheKey(contestType, round), endpoint: buildEndpoint(['challenges', 'cl', contestType, round]), - errorMessage: `Failed to fetch ${this.getContestTypeLabel(contestType)} ${round} contests from AOJ API`, - validateResponse: (data) => this.validateApiResponse(data), - transformer: (data) => this.transformToContests(data), - label: `${this.getContestTypeLabel(contestType)} ${round}`, + errorMessage: `Failed to fetch ${contestType} ${round} contests from AOJ API`, + validateResponse: (data) => + 'contests' in data && Array.isArray(data.contests) && data.contests.length > 0, + transformer: (data) => + data.contests.flatMap((contest: ChallengeContest) => + contest.days + .map((day) => day.title) + .map((title: string) => mapToContest(contest.abbr, title)), + ), + label: `AOJ ${contestType} ${round}`, }); } async getTasks(params: ChallengeParams): Promise { const { contestType, round } = params; - return this.getCachedOrFetchTasks({ + return getCachedOrFetchTasks(this.httpClient, this.cache, { cacheKey: this.getCacheKey(contestType, round), endpoint: buildEndpoint(['challenges', 'cl', contestType, round]), - errorMessage: `Failed to fetch ${this.getContestTypeLabel(contestType)} ${round} tasks from AOJ API`, - validateResponse: (data) => this.validateApiResponse(data), - transformer: (data) => this.transformToTasks(data), - label: `${this.getContestTypeLabel(contestType)} ${round}`, + errorMessage: `Failed to fetch ${contestType} ${round} tasks from AOJ API`, + validateResponse: (data) => + 'contests' in data && Array.isArray(data.contests) && data.contests.length > 0, + transformer: (data) => + data.contests.flatMap((contest: ChallengeContest) => + contest.days.flatMap((day) => + day.problems.map((problem) => mapToTask(problem, contest.abbr)), + ), + ), + label: `AOJ ${contestType} ${round}`, }); } @@ -311,32 +107,4 @@ export class AojChallengesApiClient extends AojTasksApiClientBase 0; - } - - private transformToContests(data: AOJChallengeContestAPI): ContestsForImport { - return data.contests.flatMap((contest: ChallengeContest) => - contest.days - .map((day) => day.title) - .map((title: string) => { - return mapToContest(contest.abbr, title); - }), - ); - } - - private transformToTasks(data: AOJChallengeContestAPI): TasksForImport { - return data.contests.flatMap((contest: ChallengeContest) => - contest.days.flatMap((day) => - day.problems.map((problem) => { - return mapToTask(problem, contest.abbr); - }), - ), - ); - } - - private getContestTypeLabel(contestType: ChallengeContestType): string { - return contestType.toUpperCase(); - } } diff --git a/src/lib/clients/contest_task_fetcher.ts b/src/lib/clients/contest_task_fetcher.ts new file mode 100644 index 000000000..4fd25fbef --- /dev/null +++ b/src/lib/clients/contest_task_fetcher.ts @@ -0,0 +1,60 @@ +import type { HttpRequestClient } from '$lib/clients/http_client'; +import type { ContestTaskCache } from '$lib/clients/cache_strategy'; +import type { ContestsForImport } from '$lib/types/contest'; +import type { TasksForImport } from '$lib/types/task'; + +type FetchContestsConfig = { + cacheKey: string; + endpoint: string; + errorMessage: string; + validateResponse: (data: T) => boolean; + transformer: (data: T) => ContestsForImport; + label: string; +}; + +type FetchTasksConfig = { + cacheKey: string; + endpoint: string; + errorMessage: string; + validateResponse: (data: T) => boolean; + transformer: (data: T) => TasksForImport; + label: string; +}; + +export async function getCachedOrFetchContests( + httpClient: HttpRequestClient, + cache: ContestTaskCache, + config: FetchContestsConfig, +): Promise { + return cache.getCachedOrFetchContests(config.cacheKey, async () => { + const apiResponse = await httpClient.fetchApiWithConfig({ + endpoint: config.endpoint, + errorMessage: config.errorMessage, + validateResponse: config.validateResponse, + }); + + const contests = config.transformer(apiResponse); + console.debug(`Found ${config.label}: ${contests.length} contests`); + + return contests; + }); +} + +export async function getCachedOrFetchTasks( + httpClient: HttpRequestClient, + cache: ContestTaskCache, + config: FetchTasksConfig, +): Promise { + return cache.getCachedOrFetchTasks(config.cacheKey, async () => { + const apiResponse = await httpClient.fetchApiWithConfig({ + endpoint: config.endpoint, + errorMessage: config.errorMessage, + validateResponse: config.validateResponse, + }); + + const tasks = config.transformer(apiResponse); + console.debug(`Found ${config.label}: ${tasks.length} tasks`); + + return tasks; + }); +} diff --git a/src/lib/clients/fixtures/aizu_online_judge/challenges/jag_prelim/contests.json b/src/lib/clients/fixtures/aizu_online_judge/challenges/jag_prelim/contests.json new file mode 100644 index 000000000..0671e6437 --- /dev/null +++ b/src/lib/clients/fixtures/aizu_online_judge/challenges/jag_prelim/contests.json @@ -0,0 +1,3179 @@ +{ + "largeCl": { + "id": "JAG", + "title": "ICPC Japan Alumni Group Contest", + "filter": [ + { + "label": "Prelim", + "value": "prelim" + }, + { + "label": "Regional", + "value": "regional" + }, + { + "label": "Summer", + "value": "summer" + }, + { + "label": "Winter", + "value": "winter" + }, + { + "label": "Spring", + "value": "spring" + } + ], + "middleCls": null + }, + "contests": [ + { + "abbr": "JAGPrelim2007", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2007, + "progress": 0, + "numberOfProblems": 6, + "numberOfSolved": 0, + "days": [ + { + "id": 64, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Japan Domestic 2007", + "progress": 0, + "numberOfProblems": 6, + "numberOfSolved": 0, + "problems": [ + { + "id": "2012", + "available": 1, + "doctype": 1, + "name": "Space Coconut Grab", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1612, + "submissions": 5344, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 42.17814371257485, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2013", + "available": 1, + "doctype": 1, + "name": "Osaki", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1919, + "submissions": 4257, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 54.94479680526192, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2014", + "available": 1, + "doctype": 1, + "name": "Surrounding Area", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 869, + "submissions": 1472, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 69.22554347826087, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2015", + "available": 1, + "doctype": 1, + "name": "Square Route", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1316, + "submissions": 4170, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 42.51798561151079, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2016", + "available": 2, + "doctype": 1, + "name": "Lifeguard in the Pool", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 40, + "submissions": 203, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.01970443349754, + "score": 3.2, + "userScore": 0 + }, + { + "id": "2017", + "available": 1, + "doctype": 1, + "name": "Karakuri Doll", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 97, + "submissions": 306, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 48.36601307189542, + "score": 1.3195876288659794, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGPrelim2010", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2010, + "progress": 0, + "numberOfProblems": 7, + "numberOfSolved": 0, + "days": [ + { + "id": 88, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Japan Domestic 2010", + "progress": 0, + "numberOfProblems": 7, + "numberOfSolved": 0, + "problems": [ + { + "id": "2197", + "available": 1, + "doctype": 1, + "name": "Sum of Consecutive Integers", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1653, + "submissions": 3446, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 61.89785258270459, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2198", + "available": 1, + "doctype": 1, + "name": "Moonlight Farm", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 849, + "submissions": 1884, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.47770700636943, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2199", + "available": 1, + "doctype": 1, + "name": "Differential Pulse Code Modulation", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1540, + "submissions": 4409, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 46.33703787706963, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2200", + "available": 1, + "doctype": 1, + "name": "Mr. Rito Post Office", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 635, + "submissions": 3358, + "recommendations": 8, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 34.455032757593806, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2201", + "available": 1, + "doctype": 1, + "name": "Immortal Jewels", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 255, + "submissions": 680, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 54.11764705882353, + "score": 0.5019607843137255, + "userScore": 0 + }, + { + "id": "2202", + "available": 2, + "doctype": 1, + "name": "Canal: Water Going Up and Down", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 47, + "submissions": 125, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 45.6, + "score": 2.723404255319149, + "userScore": 0 + }, + { + "id": "2203", + "available": 2, + "doctype": 1, + "name": "Magical Island 2", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 19, + "submissions": 322, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 27.018633540372672, + "score": 6.7368421052631575, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGPrelim2022", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2022, + "progress": 0, + "numberOfProblems": 8, + "numberOfSolved": 0, + "days": [ + { + "id": 291, + "day": 1, + "title": "ICPC Japan Alumni Group Practice Contest for Japan Domestic", + "progress": 0, + "numberOfProblems": 8, + "numberOfSolved": 0, + "problems": [ + { + "id": "3292", + "available": 1, + "doctype": 1, + "name": "Serial Number", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 190, + "submissions": 337, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 62.017804154302674, + "score": 0.6736842105263158, + "userScore": 0 + }, + { + "id": "3293", + "available": 1, + "doctype": 1, + "name": "Maximizing Pocket Money", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 104, + "submissions": 209, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 58.85167464114833, + "score": 1.2307692307692308, + "userScore": 0 + }, + { + "id": "3294", + "available": 1, + "doctype": 1, + "name": "i18n", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 80, + "submissions": 171, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.87719298245614, + "score": 1.6, + "userScore": 0 + }, + { + "id": "3295", + "available": 2, + "doctype": 1, + "name": "Moving Point P and Funny Friends Q, R", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 43, + "submissions": 166, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 31.927710843373493, + "score": 2.9767441860465116, + "userScore": 0 + }, + { + "id": "3296", + "available": 1, + "doctype": 1, + "name": "Greatest Common Divisor", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 45, + "submissions": 136, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 41.911764705882355, + "score": 2.8444444444444446, + "userScore": 0 + }, + { + "id": "3297", + "available": 1, + "doctype": 1, + "name": "Nth Floor Dungeon and K Brave Men", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 10, + "submissions": 57, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 19.29824561403509, + "score": 12.8, + "userScore": 0 + }, + { + "id": "3298", + "available": 3, + "doctype": 1, + "name": "Traveling Brave Problem", + "problemTimeLimit": 8, + "problemMemoryLimit": 1048576, + "maxScore": 0, + "solvedUser": 27, + "submissions": 188, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 17.5531914893617, + "score": 4.7407407407407405, + "userScore": 0 + }, + { + "id": "3299", + "available": 3, + "doctype": 1, + "name": "Parade ", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 8, + "submissions": 14, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 64.28571428571429, + "score": 16, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGPrelim2017", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2017, + "progress": 0, + "numberOfProblems": 8, + "numberOfSolved": 0, + "days": [ + { + "id": 199, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Japan Domestic 2017", + "progress": 0, + "numberOfProblems": 8, + "numberOfSolved": 0, + "problems": [ + { + "id": "2823", + "available": 1, + "doctype": 1, + "name": "JAG Practice Contest", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 536, + "submissions": 687, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 85.00727802037845, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2824", + "available": 1, + "doctype": 1, + "name": "Coastline", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 478, + "submissions": 702, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 75.4985754985755, + "score": 0.26778242677824265, + "userScore": 0 + }, + { + "id": "2825", + "available": 1, + "doctype": 1, + "name": "Quiz", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 402, + "submissions": 654, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 73.24159021406727, + "score": 0.31840796019900497, + "userScore": 0 + }, + { + "id": "2826", + "available": 1, + "doctype": 1, + "name": "Game Balance", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 208, + "submissions": 1021, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 26.542605288932418, + "score": 0.6153846153846154, + "userScore": 0 + }, + { + "id": "2827", + "available": 1, + "doctype": 1, + "name": "Industrial Convex Pillar City", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 111, + "submissions": 334, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 42.51497005988024, + "score": 1.1531531531531531, + "userScore": 0 + }, + { + "id": "2828", + "available": 1, + "doctype": 1, + "name": "Matryoshka Doll", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 161, + "submissions": 270, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 70, + "score": 0.7950310559006211, + "userScore": 0 + }, + { + "id": "2829", + "available": 1, + "doctype": 1, + "name": "Room Assignment", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 46, + "submissions": 108, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 53.7037037037037, + "score": 2.782608695652174, + "userScore": 0 + }, + { + "id": "2830", + "available": 1, + "doctype": 1, + "name": "Big Maze", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 22, + "submissions": 106, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25.471698113207548, + "score": 5.818181818181818, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGPrelim2006", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2006, + "progress": 0, + "numberOfProblems": 6, + "numberOfSolved": 0, + "days": [ + { + "id": 62, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Japan Domestic 2006", + "progress": 0, + "numberOfProblems": 6, + "numberOfSolved": 0, + "problems": [ + { + "id": "2000", + "available": 1, + "doctype": 1, + "name": "Misterious Gems", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1810, + "submissions": 4909, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.20452230596863, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2001", + "available": 1, + "doctype": 1, + "name": "Amida, the City of Miracle", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1309, + "submissions": 3375, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 45.39259259259259, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2002", + "available": 1, + "doctype": 1, + "name": "X-Ray Screening System", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 588, + "submissions": 1389, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.47588192944564, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2003", + "available": 1, + "doctype": 1, + "name": "Railroad Conflict", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 391, + "submissions": 1103, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.42701722574796, + "score": 0.3273657289002558, + "userScore": 0 + }, + { + "id": "2004", + "available": 2, + "doctype": 1, + "name": "Data Center on Fire", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 18, + "submissions": 126, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 19.047619047619047, + "score": 7.111111111111111, + "userScore": 0 + }, + { + "id": "2005", + "available": 1, + "doctype": 1, + "name": "Water Pipe Construction", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 607, + "submissions": 1926, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 39.927310488058154, + "score": 0.25, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGPrelim2011", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2011, + "progress": 0, + "numberOfProblems": 7, + "numberOfSolved": 0, + "days": [ + { + "id": 94, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Japan Domestic 2011", + "progress": 0, + "numberOfProblems": 7, + "numberOfSolved": 0, + "problems": [ + { + "id": "2252", + "available": 1, + "doctype": 1, + "name": "koukyoukoukokukikou", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1349, + "submissions": 1697, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 88.92162639952858, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2253", + "available": 1, + "doctype": 1, + "name": "Brave Force Story", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 780, + "submissions": 2780, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 34.460431654676256, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2254", + "available": 1, + "doctype": 1, + "name": "Fastest Route", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 801, + "submissions": 1636, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 62.163814180929094, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2255", + "available": 1, + "doctype": 1, + "name": "6/2(1+2)", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 322, + "submissions": 854, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 45.78454332552693, + "score": 0.39751552795031053, + "userScore": 0 + }, + { + "id": "2256", + "available": 2, + "doctype": 1, + "name": "Divide the Cake", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 119, + "submissions": 534, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.089887640449437, + "score": 1.0756302521008403, + "userScore": 0 + }, + { + "id": "2257", + "available": 1, + "doctype": 1, + "name": "Sakura Poetry", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 91, + "submissions": 512, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 26.5625, + "score": 1.4065934065934067, + "userScore": 0 + }, + { + "id": "2258", + "available": 2, + "doctype": 1, + "name": "Intelligent Circular Perfect Cleaner", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 17, + "submissions": 88, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.5, + "score": 7.529411764705882, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGPrelim2009", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2009, + "progress": 0, + "numberOfProblems": 6, + "numberOfSolved": 0, + "days": [ + { + "id": 83, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Japan Domestic 2009", + "progress": 0, + "numberOfProblems": 6, + "numberOfSolved": 0, + "problems": [ + { + "id": "2149", + "available": 1, + "doctype": 1, + "name": "Luck Manipulator", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1213, + "submissions": 2200, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 63.54545454545455, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2150", + "available": 1, + "doctype": 1, + "name": "Matsuzaki Number", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 932, + "submissions": 1922, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 62.174817898022894, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2151", + "available": 1, + "doctype": 1, + "name": "Brave Princess Revisited", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 526, + "submissions": 1203, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 55.86034912718205, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2152", + "available": 1, + "doctype": 1, + "name": "Restrictive Filesystem", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 376, + "submissions": 1295, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.2972972972973, + "score": 0.3404255319148936, + "userScore": 0 + }, + { + "id": "2153", + "available": 1, + "doctype": 1, + "name": "Mirror Cave", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 513, + "submissions": 2238, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.03753351206434, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2154", + "available": 2, + "doctype": 1, + "name": "Shore Erosion", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 26, + "submissions": 229, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 19.213973799126638, + "score": 4.923076923076923, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGPrelim2013", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2013, + "progress": 0, + "numberOfProblems": 7, + "numberOfSolved": 0, + "days": [ + { + "id": 138, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Japan Domestic 2013", + "progress": 0, + "numberOfProblems": 7, + "numberOfSolved": 0, + "problems": [ + { + "id": "2508", + "available": 1, + "doctype": 1, + "name": "King's Inspection", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 894, + "submissions": 1589, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 61.925739458779105, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2509", + "available": 2, + "doctype": 1, + "name": "Sim Forest 2013", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 102, + "submissions": 704, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 29.545454545454547, + "score": 1.2549019607843137, + "userScore": 0 + }, + { + "id": "2510", + "available": 1, + "doctype": 1, + "name": "Twin book report", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 337, + "submissions": 657, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 68.94977168949772, + "score": 0.3798219584569733, + "userScore": 0 + }, + { + "id": "2511", + "available": 1, + "doctype": 1, + "name": "Sinking islands", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 303, + "submissions": 632, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 55.221518987341774, + "score": 0.42244224422442245, + "userScore": 0 + }, + { + "id": "2512", + "available": 1, + "doctype": 1, + "name": "Ononokomachi's Edit War", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 63, + "submissions": 261, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.735632183908045, + "score": 2.0317460317460316, + "userScore": 0 + }, + { + "id": "2513", + "available": 1, + "doctype": 1, + "name": "Princess Tetra's Puzzle", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 20, + "submissions": 140, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 20, + "score": 6.4, + "userScore": 0 + }, + { + "id": "2514", + "available": 2, + "doctype": 1, + "name": "MirrorLabyrinth", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 36, + "submissions": 123, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 45.52845528455285, + "score": 3.5555555555555554, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGPrelim2019", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2019, + "progress": 0, + "numberOfProblems": 8, + "numberOfSolved": 0, + "days": [ + { + "id": 236, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Japan Domestic", + "progress": 0, + "numberOfProblems": 8, + "numberOfSolved": 0, + "problems": [ + { + "id": "2944", + "available": 1, + "doctype": 1, + "name": "Equal Split", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 387, + "submissions": 545, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 77.06422018348624, + "score": 0.330749354005168, + "userScore": 0 + }, + { + "id": "2945", + "available": 1, + "doctype": 1, + "name": "Poison Swamp", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 205, + "submissions": 322, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 70.4968944099379, + "score": 0.624390243902439, + "userScore": 0 + }, + { + "id": "2946", + "available": 1, + "doctype": 1, + "name": "You Should Avoid", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 147, + "submissions": 466, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.98283261802575, + "score": 0.8707482993197279, + "userScore": 0 + }, + { + "id": "2947", + "available": 1, + "doctype": 1, + "name": "String Magic", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 118, + "submissions": 354, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 35.87570621468927, + "score": 1.0847457627118644, + "userScore": 0 + }, + { + "id": "2948", + "available": 1, + "doctype": 1, + "name": "Great Strategy for Bring Up Grade", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 80, + "submissions": 191, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 53.92670157068063, + "score": 1.6, + "userScore": 0 + }, + { + "id": "2949", + "available": 1, + "doctype": 1, + "name": "The Genome Database of All Space Life Returns", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 35, + "submissions": 110, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.27272727272727, + "score": 3.657142857142857, + "userScore": 0 + }, + { + "id": "2950", + "available": 2, + "doctype": 1, + "name": "K is Key of Takakkey", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 26, + "submissions": 37, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 75.67567567567568, + "score": 4.923076923076923, + "userScore": 0 + }, + { + "id": "2951", + "available": 1, + "doctype": 1, + "name": "Misterious Buttons", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 18, + "submissions": 93, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 27.956989247311828, + "score": 7.111111111111111, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGPrelim2012", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2012, + "progress": 0, + "numberOfProblems": 7, + "numberOfSolved": 0, + "days": [ + { + "id": 116, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Japan Domestic 2012", + "progress": 0, + "numberOfProblems": 7, + "numberOfSolved": 0, + "problems": [ + { + "id": "2399", + "available": 1, + "doctype": 1, + "name": "Save Your Privacy!", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 984, + "submissions": 1582, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 71.80783817951959, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2400", + "available": 1, + "doctype": 1, + "name": "You Are the Judge", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 892, + "submissions": 1562, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 66.32522407170295, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2401", + "available": 1, + "doctype": 1, + "name": "Equation", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 437, + "submissions": 1292, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.154798761609904, + "score": 0.2929061784897025, + "userScore": 0 + }, + { + "id": "2402", + "available": 2, + "doctype": 1, + "name": "Milky Way", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 360, + "submissions": 1093, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 48.21591948764868, + "score": 0.35555555555555557, + "userScore": 0 + }, + { + "id": "2403", + "available": 1, + "doctype": 1, + "name": "The Enemy of My Enemy is My Friend", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 241, + "submissions": 1384, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.395953757225435, + "score": 0.5311203319502075, + "userScore": 0 + }, + { + "id": "2404", + "available": 2, + "doctype": 1, + "name": "Dog Food", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 36, + "submissions": 109, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 42.20183486238532, + "score": 3.5555555555555554, + "userScore": 0 + }, + { + "id": "2405", + "available": 1, + "doctype": 1, + "name": "Sister Ports", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 64, + "submissions": 451, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 24.16851441241685, + "score": 2, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGPrelim2015", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2015, + "progress": 0, + "numberOfProblems": 7, + "numberOfSolved": 0, + "days": [ + { + "id": 174, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Japan Domestic 2015", + "progress": 0, + "numberOfProblems": 7, + "numberOfSolved": 0, + "problems": [ + { + "id": "2699", + "available": 2, + "doctype": 1, + "name": "Koto Municipal Subway", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 819, + "submissions": 1240, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 80.64516129032258, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2700", + "available": 1, + "doctype": 1, + "name": "Airport Codes", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 635, + "submissions": 1225, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 57.795918367346935, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2701", + "available": 1, + "doctype": 1, + "name": "Falling Block Puzzle", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 148, + "submissions": 323, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 52.63157894736842, + "score": 0.8648648648648649, + "userScore": 0 + }, + { + "id": "2702", + "available": 1, + "doctype": 1, + "name": "Alternate Escape", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 119, + "submissions": 403, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 34.24317617866005, + "score": 1.0756302521008403, + "userScore": 0 + }, + { + "id": "2703", + "available": 1, + "doctype": 1, + "name": "Dice Stamp", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 116, + "submissions": 283, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 49.11660777385159, + "score": 1.103448275862069, + "userScore": 0 + }, + { + "id": "2704", + "available": 1, + "doctype": 1, + "name": "Stamp Rally", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 54, + "submissions": 123, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 54.47154471544715, + "score": 2.3703703703703702, + "userScore": 0 + }, + { + "id": "2705", + "available": 2, + "doctype": 1, + "name": "Kuru Kuru Door", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 14, + "submissions": 43, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 60.46511627906977, + "score": 9.142857142857142, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGPrelim2020", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2020, + "progress": 0, + "numberOfProblems": 8, + "numberOfSolved": 0, + "days": [ + { + "id": 260, + "day": 1, + "title": "ICPC Japan Alumni Group Practice Contest for Japan Domestic", + "progress": 0, + "numberOfProblems": 8, + "numberOfSolved": 0, + "problems": [ + { + "id": "3201", + "available": 1, + "doctype": 1, + "name": "nm Calculations", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 273, + "submissions": 412, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 72.57281553398059, + "score": 0.46886446886446886, + "userScore": 0 + }, + { + "id": "3202", + "available": 1, + "doctype": 1, + "name": "Chains of Explosions ", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 255, + "submissions": 331, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 86.10271903323263, + "score": 0.5019607843137255, + "userScore": 0 + }, + { + "id": "3203", + "available": 1, + "doctype": 1, + "name": "Sneaking", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 131, + "submissions": 343, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 45.481049562682216, + "score": 0.9770992366412213, + "userScore": 0 + }, + { + "id": "3204", + "available": 1, + "doctype": 1, + "name": "Almost Balanced Parentheses", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 93, + "submissions": 212, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 48.113207547169814, + "score": 1.3763440860215055, + "userScore": 0 + }, + { + "id": "3205", + "available": 1, + "doctype": 1, + "name": "Edamame Energy Engineering", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 63, + "submissions": 254, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 29.52755905511811, + "score": 2.0317460317460316, + "userScore": 0 + }, + { + "id": "3206", + "available": 1, + "doctype": 1, + "name": "Arrow Dice", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 37, + "submissions": 62, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 72.58064516129032, + "score": 3.4594594594594597, + "userScore": 0 + }, + { + "id": "3207", + "available": 2, + "doctype": 1, + "name": "Kyopro is Useful for Asteroid Exploration", + "problemTimeLimit": 15, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 3, + "submissions": 16, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25, + "score": 16, + "userScore": 0 + }, + { + "id": "3208", + "available": 2, + "doctype": 1, + "name": "Edge or Vertex", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 28, + "submissions": 69, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 56.52173913043478, + "score": 4.571428571428571, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGPrelim2024", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2024, + "progress": 0, + "numberOfProblems": 9, + "numberOfSolved": 0, + "days": [ + { + "id": 317, + "day": 1, + "title": "ICPC Japan Alumni Group Practice Contest for Japan Domestic", + "progress": 0, + "numberOfProblems": 9, + "numberOfSolved": 0, + "problems": [ + { + "id": "3386", + "available": 1, + "doctype": 1, + "name": "Transition of Club Members", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 80, + "submissions": 128, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 71.875, + "score": 1.6, + "userScore": 0 + }, + { + "id": "3387", + "available": 1, + "doctype": 1, + "name": "Simple Editor", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 55, + "submissions": 84, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 73.80952380952381, + "score": 2.327272727272727, + "userScore": 0 + }, + { + "id": "3388", + "available": 1, + "doctype": 1, + "name": "Advertisement in Star Cluster", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 32, + "submissions": 164, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.48780487804878, + "score": 4, + "userScore": 0 + }, + { + "id": "3389", + "available": 1, + "doctype": 1, + "name": "Sharing Past Problems", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 26, + "submissions": 50, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 74, + "score": 4.923076923076923, + "userScore": 0 + }, + { + "id": "3390", + "available": 1, + "doctype": 1, + "name": "Roller Coaster 2", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 17, + "submissions": 40, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50, + "score": 7.529411764705882, + "userScore": 0 + }, + { + "id": "3391", + "available": 1, + "doctype": 1, + "name": "Synthesis of Slimes", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 12, + "submissions": 41, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.58536585365854, + "score": 10.666666666666666, + "userScore": 0 + }, + { + "id": "3392", + "available": 1, + "doctype": 1, + "name": "Segmentation of a Sequence", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 7, + "submissions": 35, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 31.428571428571427, + "score": 16, + "userScore": 0 + }, + { + "id": "3393", + "available": 3, + "doctype": 1, + "name": "Physics Experiment", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 0, + "submissions": 7, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 0, + "score": 0, + "userScore": 0 + }, + { + "id": "3394", + "available": 3, + "doctype": 1, + "name": "Bridge Construction Plan 2", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 1, + "submissions": 6, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 66.66666666666667, + "score": 16, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGPrelim2018", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2018, + "progress": 0, + "numberOfProblems": 8, + "numberOfSolved": 0, + "days": [ + { + "id": 217, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Japan Domestic", + "progress": 0, + "numberOfProblems": 8, + "numberOfSolved": 0, + "problems": [ + { + "id": "2881", + "available": 1, + "doctype": 1, + "name": "Change of the Era Name", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 660, + "submissions": 1104, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 64.31159420289855, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2882", + "available": 1, + "doctype": 1, + "name": "Generalized Leap Years", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 487, + "submissions": 579, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 89.63730569948187, + "score": 0.26283367556468173, + "userScore": 0 + }, + { + "id": "2883", + "available": 1, + "doctype": 1, + "name": "Proof of Knowledge", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 376, + "submissions": 511, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 84.93150684931507, + "score": 0.3404255319148936, + "userScore": 0 + }, + { + "id": "2884", + "available": 1, + "doctype": 1, + "name": "Tanka Number", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 175, + "submissions": 268, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 71.64179104477611, + "score": 0.7314285714285714, + "userScore": 0 + }, + { + "id": "2885", + "available": 1, + "doctype": 1, + "name": "Divide and Conquer", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 283, + "submissions": 468, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 65.17094017094017, + "score": 0.45229681978798586, + "userScore": 0 + }, + { + "id": "2886", + "available": 1, + "doctype": 1, + "name": "Antiaircraft Shield", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 71, + "submissions": 132, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 68.93939393939394, + "score": 1.8028169014084507, + "userScore": 0 + }, + { + "id": "2887", + "available": 2, + "doctype": 1, + "name": "Casino", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 57, + "submissions": 223, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 31.838565022421523, + "score": 2.245614035087719, + "userScore": 0 + }, + { + "id": "2888", + "available": 1, + "doctype": 1, + "name": "NINJA GAME", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 3, + "submissions": 32, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.125, + "score": 16, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGPrelim20162", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2016, + "progress": 0, + "numberOfProblems": 14, + "numberOfSolved": 0, + "days": [ + { + "id": 181, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Japan Domestic 2016", + "progress": 0, + "numberOfProblems": 7, + "numberOfSolved": 0, + "problems": [ + { + "id": "2738", + "available": 1, + "doctype": 1, + "name": "A-un Breathing", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 892, + "submissions": 1993, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.680883090817865, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2739", + "available": 1, + "doctype": 1, + "name": "Delivery to a Luxurious House", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 612, + "submissions": 1030, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 66.79611650485437, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2740", + "available": 1, + "doctype": 1, + "name": "Rooted Tree for Misawa-san", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 360, + "submissions": 702, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 60.826210826210826, + "score": 0.35555555555555557, + "userScore": 0 + }, + { + "id": "2741", + "available": 1, + "doctype": 1, + "name": "Invisible", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 182, + "submissions": 575, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.391304347826086, + "score": 0.7032967032967034, + "userScore": 0 + }, + { + "id": "2742", + "available": 1, + "doctype": 1, + "name": "Campaign", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 90, + "submissions": 160, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 64.375, + "score": 1.4222222222222223, + "userScore": 0 + }, + { + "id": "2743", + "available": 1, + "doctype": 1, + "name": "Land Inheritance", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 72, + "submissions": 266, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.330827067669176, + "score": 1.7777777777777777, + "userScore": 0 + }, + { + "id": "2744", + "available": 1, + "doctype": 1, + "name": "Rings and Strings", + "problemTimeLimit": 8, + "problemMemoryLimit": 1048576, + "maxScore": 0, + "solvedUser": 15, + "submissions": 47, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.680851063829785, + "score": 8.533333333333333, + "userScore": 0 + } + ] + }, + { + "id": 182, + "day": 2, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Japan Domestic 2016", + "progress": 0, + "numberOfProblems": 7, + "numberOfSolved": 0, + "problems": [ + { + "id": "2745", + "available": 1, + "doctype": 1, + "name": "Curry Making", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 784, + "submissions": 1257, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 72.47414478918058, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2746", + "available": 1, + "doctype": 1, + "name": "jfen", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 459, + "submissions": 621, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 82.4476650563607, + "score": 0.2788671023965142, + "userScore": 0 + }, + { + "id": "2747", + "available": 1, + "doctype": 1, + "name": "Curtain", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 204, + "submissions": 424, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 56.60377358490566, + "score": 0.6274509803921569, + "userScore": 0 + }, + { + "id": "2748", + "available": 2, + "doctype": 1, + "name": "Early Morning Work at Summer Camp", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 255, + "submissions": 484, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 65.9090909090909, + "score": 0.5019607843137255, + "userScore": 0 + }, + { + "id": "2749", + "available": 1, + "doctype": 1, + "name": "The Most Powerful Bed", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 210, + "submissions": 409, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 66.50366748166259, + "score": 0.6095238095238096, + "userScore": 0 + }, + { + "id": "2750", + "available": 1, + "doctype": 1, + "name": "Hyakunin Isshu", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 4, + "submissions": 72, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 9.722222222222221, + "score": 16, + "userScore": 0 + }, + { + "id": "2751", + "available": 1, + "doctype": 1, + "name": "Baseball", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 100, + "submissions": 200, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 60.5, + "score": 1.28, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGPrelim2014", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2014, + "progress": 0, + "numberOfProblems": 7, + "numberOfSolved": 0, + "days": [ + { + "id": 152, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Japan Domestic 2014", + "progress": 0, + "numberOfProblems": 7, + "numberOfSolved": 0, + "problems": [ + { + "id": "2582", + "available": 1, + "doctype": 1, + "name": "Step Aerobics", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1145, + "submissions": 1752, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 74.08675799086758, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2583", + "available": 1, + "doctype": 1, + "name": "JAG-channel", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 523, + "submissions": 1514, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 39.49801849405548, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2584", + "available": 1, + "doctype": 1, + "name": "Broken Cipher Generator", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 469, + "submissions": 842, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 68.28978622327791, + "score": 0.27292110874200426, + "userScore": 0 + }, + { + "id": "2585", + "available": 1, + "doctype": 1, + "name": "1 Day Passport", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 257, + "submissions": 645, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.16279069767442, + "score": 0.4980544747081712, + "userScore": 0 + }, + { + "id": "2586", + "available": 2, + "doctype": 1, + "name": "Wish upon a shooting star", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 172, + "submissions": 569, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 40.246045694200355, + "score": 0.7441860465116279, + "userScore": 0 + }, + { + "id": "2587", + "available": 1, + "doctype": 1, + "name": "Elevator Hall Number", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 69, + "submissions": 203, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 40.39408866995074, + "score": 1.855072463768116, + "userScore": 0 + }, + { + "id": "2588", + "available": 1, + "doctype": 1, + "name": "Golf", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 6, + "submissions": 62, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 16.129032258064516, + "score": 16, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGPrelim2005", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2005, + "progress": 0, + "numberOfProblems": 6, + "numberOfSolved": 0, + "days": [ + { + "id": 63, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Japan Domestic 2005", + "progress": 0, + "numberOfProblems": 6, + "numberOfSolved": 0, + "problems": [ + { + "id": "2006", + "available": 1, + "doctype": 1, + "name": "Keitai Message", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1497, + "submissions": 3092, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 57.63260025873221, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2007", + "available": 1, + "doctype": 1, + "name": "Make Purse Light", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1039, + "submissions": 4395, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.37542662116041, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2008", + "available": 1, + "doctype": 1, + "name": "Dragon Fantasy", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 194, + "submissions": 1179, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 23.918575063613233, + "score": 0.6597938144329897, + "userScore": 0 + }, + { + "id": "2009", + "available": 1, + "doctype": 1, + "name": "Area Separation", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 337, + "submissions": 1336, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.00299401197605, + "score": 0.3798219584569733, + "userScore": 0 + }, + { + "id": "2010", + "available": 1, + "doctype": 1, + "name": "Poor Mail Forwarding", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 54, + "submissions": 284, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 23.591549295774648, + "score": 2.3703703703703702, + "userScore": 0 + }, + { + "id": "2011", + "available": 1, + "doctype": 1, + "name": "Gather the Maps!", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 709, + "submissions": 2830, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 33.46289752650177, + "score": 0.25, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGPrelim2021", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2021, + "progress": 0, + "numberOfProblems": 8, + "numberOfSolved": 0, + "days": [ + { + "id": 273, + "day": 1, + "title": "ICPC Japan Alumni Group Practice Contest for Japan Domestic", + "progress": 0, + "numberOfProblems": 8, + "numberOfSolved": 0, + "problems": [ + { + "id": "3246", + "available": 1, + "doctype": 1, + "name": "Tokyo2020", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 206, + "submissions": 278, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 82.01438848920863, + "score": 0.6213592233009708, + "userScore": 0 + }, + { + "id": "3247", + "available": 2, + "doctype": 1, + "name": "Food Delivery", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 166, + "submissions": 222, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 79.72972972972973, + "score": 0.7710843373493976, + "userScore": 0 + }, + { + "id": "3248", + "available": 1, + "doctype": 1, + "name": "Moving", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 110, + "submissions": 169, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 82.84023668639053, + "score": 1.1636363636363636, + "userScore": 0 + }, + { + "id": "3249", + "available": 1, + "doctype": 1, + "name": "Buri Shabu Shaburi Club", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 95, + "submissions": 206, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.970873786407765, + "score": 1.3473684210526315, + "userScore": 0 + }, + { + "id": "3250", + "available": 1, + "doctype": 1, + "name": "Rotation ", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 65, + "submissions": 158, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 41.139240506329116, + "score": 1.9692307692307693, + "userScore": 0 + }, + { + "id": "3251", + "available": 1, + "doctype": 1, + "name": "One is Zero, Zero is One", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 61, + "submissions": 129, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 55.81395348837209, + "score": 2.098360655737705, + "userScore": 0 + }, + { + "id": "3252", + "available": 1, + "doctype": 1, + "name": "Cookie Game", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 18, + "submissions": 160, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 13.75, + "score": 7.111111111111111, + "userScore": 0 + }, + { + "id": "3253", + "available": 1, + "doctype": 1, + "name": "Skewering", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 11, + "submissions": 69, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 23.18840579710145, + "score": 11.636363636363637, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGPrelim2023", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2023, + "progress": 0, + "numberOfProblems": 8, + "numberOfSolved": 0, + "days": [ + { + "id": 309, + "day": 1, + "title": "ICPC Japan Alumni Group Practice Contest for Japan Domestic", + "progress": 0, + "numberOfProblems": 8, + "numberOfSolved": 0, + "problems": [ + { + "id": "3358", + "available": 1, + "doctype": 1, + "name": "Sorting Crayons", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 201, + "submissions": 308, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 79.54545454545455, + "score": 0.6368159203980099, + "userScore": 0 + }, + { + "id": "3359", + "available": 1, + "doctype": 1, + "name": "Everyday is Holiday", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 125, + "submissions": 364, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.23076923076923, + "score": 1.024, + "userScore": 0 + }, + { + "id": "3360", + "available": 1, + "doctype": 1, + "name": "Game", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 85, + "submissions": 411, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 22.62773722627737, + "score": 1.5058823529411764, + "userScore": 0 + }, + { + "id": "3361", + "available": 1, + "doctype": 1, + "name": "IPvK", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 40, + "submissions": 125, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.2, + "score": 3.2, + "userScore": 0 + }, + { + "id": "3362", + "available": 1, + "doctype": 1, + "name": "Watch the Marathon", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 48, + "submissions": 90, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 62.22222222222222, + "score": 2.6666666666666665, + "userScore": 0 + }, + { + "id": "3363", + "available": 1, + "doctype": 1, + "name": "Frog in a Well", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 24, + "submissions": 96, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.125, + "score": 5.333333333333333, + "userScore": 0 + }, + { + "id": "3364", + "available": 1, + "doctype": 1, + "name": "Watch the Movie", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 4, + "submissions": 37, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 10.81081081081081, + "score": 16, + "userScore": 0 + }, + { + "id": "3365", + "available": 3, + "doctype": 1, + "name": "Orienteering", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 2, + "submissions": 5, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 60, + "score": 16, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGPrelim2008", + "largeCl": "JAG", + "middleCl": "Prelim", + "year": 2008, + "progress": 0, + "numberOfProblems": 6, + "numberOfSolved": 0, + "days": [ + { + "id": 65, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Japan Domestic 2008", + "progress": 0, + "numberOfProblems": 6, + "numberOfSolved": 0, + "problems": [ + { + "id": "2018", + "available": 1, + "doctype": 1, + "name": "Princess's Gamble", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1414, + "submissions": 3049, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 53.36175795342735, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2019", + "available": 1, + "doctype": 1, + "name": "Princess's Marriage", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1295, + "submissions": 3226, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 48.605083694978305, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2020", + "available": 1, + "doctype": 1, + "name": "Princess's Japanese", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 135, + "submissions": 438, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 33.56164383561644, + "score": 0.9481481481481482, + "userScore": 0 + }, + { + "id": "2021", + "available": 1, + "doctype": 1, + "name": "Princess in Danger", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 564, + "submissions": 1708, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 46.37002341920375, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2022", + "available": 1, + "doctype": 1, + "name": "Princess, a Cryptanalyst", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 216, + "submissions": 1245, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 24.497991967871485, + "score": 0.5925925925925926, + "userScore": 0 + }, + { + "id": "2023", + "available": 2, + "doctype": 1, + "name": "Princess, a Strategist", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 29, + "submissions": 145, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.275862068965516, + "score": 4.413793103448276, + "userScore": 0 + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/lib/clients/fixtures/aizu_online_judge/challenges/jag_regional/contests.json b/src/lib/clients/fixtures/aizu_online_judge/challenges/jag_regional/contests.json new file mode 100644 index 000000000..8b6bac375 --- /dev/null +++ b/src/lib/clients/fixtures/aizu_online_judge/challenges/jag_regional/contests.json @@ -0,0 +1,3211 @@ +{ + "largeCl": { + "id": "JAG", + "title": "ICPC Japan Alumni Group Contest", + "filter": [ + { + "label": "Prelim", + "value": "prelim" + }, + { + "label": "Regional", + "value": "regional" + }, + { + "label": "Summer", + "value": "summer" + }, + { + "label": "Winter", + "value": "winter" + }, + { + "label": "Spring", + "value": "spring" + } + ], + "middleCls": null + }, + "contests": [ + { + "abbr": "JAGRegional2021", + "largeCl": "JAG", + "middleCl": "Regional", + "year": 2021, + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "days": [ + { + "id": 292, + "day": 1, + "title": "ICPC Japan Alumni Group Practice Contest for Asia Regionals 2021", + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "problems": [ + { + "id": "3300", + "available": 1, + "doctype": 2, + "name": "Harvest", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 38, + "submissions": 66, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 59.09090909090909, + "score": 3.3684210526315788, + "userScore": 0 + }, + { + "id": "3301", + "available": 1, + "doctype": 2, + "name": "Parse the Syntax Tree", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 39, + "submissions": 54, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 79.62962962962963, + "score": 3.282051282051282, + "userScore": 0 + }, + { + "id": "3302", + "available": 1, + "doctype": 2, + "name": "Permutation Magic", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 19, + "submissions": 62, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.54838709677419, + "score": 6.7368421052631575, + "userScore": 0 + }, + { + "id": "3303", + "available": 1, + "doctype": 2, + "name": "MFP: Most Fluctuated Player", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 13, + "submissions": 22, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 72.72727272727273, + "score": 9.846153846153847, + "userScore": 0 + }, + { + "id": "3304", + "available": 3, + "doctype": 2, + "name": "Underground's SUNDAY", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 3, + "submissions": 11, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 27.272727272727273, + "score": 16, + "userScore": 0 + }, + { + "id": "3305", + "available": 1, + "doctype": 2, + "name": "qarentheziz zepuence", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 4, + "submissions": 38, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 23.68421052631579, + "score": 16, + "userScore": 0 + }, + { + "id": "3306", + "available": 1, + "doctype": 2, + "name": "Pizza delivery", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 28, + "submissions": 47, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 76.59574468085107, + "score": 4.571428571428571, + "userScore": 0 + }, + { + "id": "3307", + "available": 1, + "doctype": 2, + "name": "include", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 32, + "submissions": 62, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 54.83870967741935, + "score": 4, + "userScore": 0 + }, + { + "id": "3308", + "available": 1, + "doctype": 2, + "name": "(N+1)-legged race", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 28, + "submissions": 63, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 57.142857142857146, + "score": 4.571428571428571, + "userScore": 0 + }, + { + "id": "3309", + "available": 1, + "doctype": 2, + "name": "Isomorphic?", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 22, + "submissions": 112, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.142857142857146, + "score": 5.818181818181818, + "userScore": 0 + }, + { + "id": "3310", + "available": 3, + "doctype": 2, + "name": "Zombie Land 2", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 9, + "submissions": 11, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 90.9090909090909, + "score": 14.222222222222221, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGRegional2011", + "largeCl": "JAG", + "middleCl": "Regional", + "year": 2011, + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "days": [ + { + "id": 103, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Asia Regionals 2011", + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "problems": [ + { + "id": "2320", + "available": 1, + "doctype": 2, + "name": "Infinity Maze", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 273, + "submissions": 1112, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.42086330935252, + "score": 0.46886446886446886, + "userScore": 0 + }, + { + "id": "2321", + "available": 1, + "doctype": 2, + "name": "Butterfly", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 279, + "submissions": 741, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.233468286099864, + "score": 0.45878136200716846, + "userScore": 0 + }, + { + "id": "2322", + "available": 1, + "doctype": 2, + "name": "Chinese Classics", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 35, + "submissions": 134, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 34.32835820895522, + "score": 3.657142857142857, + "userScore": 0 + }, + { + "id": "2323", + "available": 1, + "doctype": 2, + "name": "Revenge of Champernowne Constant", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 47, + "submissions": 280, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 23.928571428571427, + "score": 2.723404255319149, + "userScore": 0 + }, + { + "id": "2324", + "available": 1, + "doctype": 2, + "name": "Full Text Search", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 18, + "submissions": 87, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.93103448275862, + "score": 7.111111111111111, + "userScore": 0 + }, + { + "id": "2325", + "available": 1, + "doctype": 2, + "name": "Mysterious Maze", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 104, + "submissions": 296, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 39.86486486486486, + "score": 1.2307692307692308, + "userScore": 0 + }, + { + "id": "2326", + "available": 1, + "doctype": 2, + "name": "Number Sorting", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 202, + "submissions": 357, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 71.70868347338936, + "score": 0.6336633663366337, + "userScore": 0 + }, + { + "id": "2327", + "available": 1, + "doctype": 2, + "name": "Sky Jump", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 46, + "submissions": 174, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.45977011494253, + "score": 2.782608695652174, + "userScore": 0 + }, + { + "id": "2328", + "available": 1, + "doctype": 2, + "name": "Mobile Network", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 75, + "submissions": 249, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.57831325301205, + "score": 1.7066666666666668, + "userScore": 0 + }, + { + "id": "2329", + "available": 2, + "doctype": 2, + "name": "Blue Forest", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 12, + "submissions": 30, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 60, + "score": 10.666666666666666, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGRegional2012", + "largeCl": "JAG", + "middleCl": "Regional", + "year": 2012, + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "days": [ + { + "id": 146, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Asia Regionals 2012", + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "problems": [ + { + "id": "2534", + "available": 1, + "doctype": 2, + "name": "Dictionary", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 219, + "submissions": 689, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 46.589259796806964, + "score": 0.5844748858447488, + "userScore": 0 + }, + { + "id": "2535", + "available": 2, + "doctype": 2, + "name": "Texas hold 'em", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 70, + "submissions": 213, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 52.582159624413144, + "score": 1.8285714285714285, + "userScore": 0 + }, + { + "id": "2536", + "available": 1, + "doctype": 2, + "name": "Median Tree", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 287, + "submissions": 540, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 71.85185185185185, + "score": 0.445993031358885, + "userScore": 0 + }, + { + "id": "2537", + "available": 1, + "doctype": 2, + "name": "Billiard", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 71, + "submissions": 401, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 23.19201995012469, + "score": 1.8028169014084507, + "userScore": 0 + }, + { + "id": "2538", + "available": 1, + "doctype": 2, + "name": "Stack Maze", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 126, + "submissions": 591, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 26.903553299492387, + "score": 1.0158730158730158, + "userScore": 0 + }, + { + "id": "2539", + "available": 1, + "doctype": 2, + "name": "Counting 1's", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 47, + "submissions": 155, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 39.354838709677416, + "score": 2.723404255319149, + "userScore": 0 + }, + { + "id": "2540", + "available": 1, + "doctype": 2, + "name": "Ancient Commemorative Monolith", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 16, + "submissions": 43, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 41.86046511627907, + "score": 8, + "userScore": 0 + }, + { + "id": "2541", + "available": 1, + "doctype": 2, + "name": "Magical Bridges", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 84, + "submissions": 454, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25.110132158590307, + "score": 1.5238095238095237, + "userScore": 0 + }, + { + "id": "2542", + "available": 1, + "doctype": 2, + "name": "Hashigo Sama", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 12, + "submissions": 53, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 26.41509433962264, + "score": 10.666666666666666, + "userScore": 0 + }, + { + "id": "2543", + "available": 1, + "doctype": 2, + "name": "Ancient Scrolls", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 41, + "submissions": 94, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 53.191489361702125, + "score": 3.1219512195121952, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGRegional2010", + "largeCl": "JAG", + "middleCl": "Regional", + "year": 2010, + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "days": [ + { + "id": 93, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Asia Regionals 2010", + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "problems": [ + { + "id": "2242", + "available": 1, + "doctype": 2, + "name": "Era Name", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 598, + "submissions": 1253, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 61.05347166799681, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2243", + "available": 1, + "doctype": 2, + "name": "Step Step Evolution", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 348, + "submissions": 773, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 61.707632600258734, + "score": 0.367816091954023, + "userScore": 0 + }, + { + "id": "2244", + "available": 1, + "doctype": 2, + "name": "Dungeon Quest II", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 139, + "submissions": 516, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 38.372093023255815, + "score": 0.920863309352518, + "userScore": 0 + }, + { + "id": "2245", + "available": 1, + "doctype": 2, + "name": "Dice Room", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 99, + "submissions": 373, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 41.01876675603217, + "score": 1.292929292929293, + "userScore": 0 + }, + { + "id": "2246", + "available": 2, + "doctype": 2, + "name": "Alice and Bomb", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 43, + "submissions": 190, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.31578947368421, + "score": 2.9767441860465116, + "userScore": 0 + }, + { + "id": "2247", + "available": 2, + "doctype": 2, + "name": "Two-Wheel Buggy", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 86, + "submissions": 312, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.26923076923077, + "score": 1.4883720930232558, + "userScore": 0 + }, + { + "id": "2248", + "available": 2, + "doctype": 2, + "name": "Camera Control", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 7, + "submissions": 84, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 16.666666666666668, + "score": 16, + "userScore": 0 + }, + { + "id": "2249", + "available": 1, + "doctype": 2, + "name": "Road Construction", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 559, + "submissions": 3334, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 49.19016196760648, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2250", + "available": 1, + "doctype": 2, + "name": "Operator", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 76, + "submissions": 439, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.34624145785877, + "score": 1.6842105263157894, + "userScore": 0 + }, + { + "id": "2251", + "available": 1, + "doctype": 2, + "name": "Merry Christmas", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 292, + "submissions": 1264, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 40.822784810126585, + "score": 0.4383561643835616, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGRegional2014", + "largeCl": "JAG", + "middleCl": "Regional", + "year": 2014, + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "days": [ + { + "id": 155, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Asia Regionals 2014", + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "problems": [ + { + "id": "2589", + "available": 1, + "doctype": 2, + "name": "North North West", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 406, + "submissions": 936, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.534188034188034, + "score": 0.31527093596059114, + "userScore": 0 + }, + { + "id": "2590", + "available": 1, + "doctype": 2, + "name": "Unknown Switches", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 263, + "submissions": 559, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 53.66726296958855, + "score": 0.4866920152091255, + "userScore": 0 + }, + { + "id": "2591", + "available": 3, + "doctype": 2, + "name": "Speedrun", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 36, + "submissions": 182, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.417582417582416, + "score": 3.5555555555555554, + "userScore": 0 + }, + { + "id": "2592", + "available": 3, + "doctype": 2, + "name": "Flowers", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 125, + "submissions": 892, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.98206278026906, + "score": 1.024, + "userScore": 0 + }, + { + "id": "2593", + "available": 3, + "doctype": 2, + "name": "Square in Circles", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 58, + "submissions": 245, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.6530612244898, + "score": 2.206896551724138, + "userScore": 0 + }, + { + "id": "2594", + "available": 1, + "doctype": 2, + "name": "Reverse a Road II", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 103, + "submissions": 281, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.1779359430605, + "score": 1.2427184466019416, + "userScore": 0 + }, + { + "id": "2595", + "available": 1, + "doctype": 2, + "name": "Cookie Counter", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 176, + "submissions": 591, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.16243654822335, + "score": 0.7272727272727273, + "userScore": 0 + }, + { + "id": "2596", + "available": 3, + "doctype": 2, + "name": "Points and Lines", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 106, + "submissions": 175, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 73.14285714285714, + "score": 1.2075471698113207, + "userScore": 0 + }, + { + "id": "2597", + "available": 1, + "doctype": 2, + "name": "Color the Map Extreme", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 23, + "submissions": 66, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50, + "score": 5.565217391304348, + "userScore": 0 + }, + { + "id": "2598", + "available": 1, + "doctype": 2, + "name": "Website Tour", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 55, + "submissions": 150, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 52.666666666666664, + "score": 2.327272727272727, + "userScore": 0 + }, + { + "id": "2599", + "available": 1, + "doctype": 2, + "name": "Idempotent Filter", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 108, + "submissions": 270, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 52.592592592592595, + "score": 1.1851851851851851, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGRegional2006", + "largeCl": "JAG", + "middleCl": "Regional", + "year": 2006, + "progress": 0, + "numberOfProblems": 9, + "numberOfSolved": 0, + "days": [ + { + "id": 67, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Asia Regionals 2006", + "progress": 0, + "numberOfProblems": 9, + "numberOfSolved": 0, + "problems": [ + { + "id": "2030", + "available": 1, + "doctype": 2, + "name": "Ruins", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 138, + "submissions": 259, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 62.16216216216216, + "score": 0.927536231884058, + "userScore": 0 + }, + { + "id": "2031", + "available": 1, + "doctype": 2, + "name": "Hyper Rock-Scissors-Paper", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 103, + "submissions": 256, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 52.734375, + "score": 1.2427184466019416, + "userScore": 0 + }, + { + "id": "2032", + "available": 1, + "doctype": 2, + "name": "Online Quiz System", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 18, + "submissions": 34, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 67.6470588235294, + "score": 7.111111111111111, + "userScore": 0 + }, + { + "id": "2033", + "available": 1, + "doctype": 2, + "name": "Rock Man", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 57, + "submissions": 112, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 57.142857142857146, + "score": 2.245614035087719, + "userScore": 0 + }, + { + "id": "2034", + "available": 2, + "doctype": 2, + "name": "Autocorrelation Function", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 30, + "submissions": 109, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 38.53211009174312, + "score": 4.266666666666667, + "userScore": 0 + }, + { + "id": "2035", + "available": 3, + "doctype": 2, + "name": "It Prefokery Pio", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 93, + "submissions": 327, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.308868501529055, + "score": 1.3763440860215055, + "userScore": 0 + }, + { + "id": "2036", + "available": 1, + "doctype": 2, + "name": "Traffic", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 12, + "submissions": 90, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 18.88888888888889, + "score": 10.666666666666666, + "userScore": 0 + }, + { + "id": "2037", + "available": 0, + "doctype": 2, + "name": "Restriction Enzyme", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 0, + "submissions": 4, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 0, + "score": 0, + "userScore": 0 + }, + { + "id": "2038", + "available": 2, + "doctype": 2, + "name": "The Extreme Slalom", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 10, + "submissions": 57, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 33.333333333333336, + "score": 12.8, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGRegional2008", + "largeCl": "JAG", + "middleCl": "Regional", + "year": 2008, + "progress": 0, + "numberOfProblems": 9, + "numberOfSolved": 0, + "days": [ + { + "id": 70, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Asia Regionals 2008", + "progress": 0, + "numberOfProblems": 9, + "numberOfSolved": 0, + "problems": [ + { + "id": "2048", + "available": 1, + "doctype": 2, + "name": "Everlasting...?", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 179, + "submissions": 438, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 48.63013698630137, + "score": 0.7150837988826816, + "userScore": 0 + }, + { + "id": "2049", + "available": 1, + "doctype": 2, + "name": "Headstrong Student", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 99, + "submissions": 295, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 38.644067796610166, + "score": 1.292929292929293, + "userScore": 0 + }, + { + "id": "2050", + "available": 2, + "doctype": 2, + "name": "Dig or Climb", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 40, + "submissions": 143, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.86713286713287, + "score": 3.2, + "userScore": 0 + }, + { + "id": "2051", + "available": 2, + "doctype": 2, + "name": "Rotation Estimation", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 33, + "submissions": 283, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 17.314487632508833, + "score": 3.878787878787879, + "userScore": 0 + }, + { + "id": "2052", + "available": 1, + "doctype": 2, + "name": "Optimal Rest", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 20, + "submissions": 141, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 29.78723404255319, + "score": 6.4, + "userScore": 0 + }, + { + "id": "2053", + "available": 1, + "doctype": 2, + "name": "Controlled Tournament", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 15, + "submissions": 80, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 21.25, + "score": 8.533333333333333, + "userScore": 0 + }, + { + "id": "2054", + "available": 1, + "doctype": 2, + "name": "Entangled Tree", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 11, + "submissions": 44, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 27.272727272727273, + "score": 11.636363636363637, + "userScore": 0 + }, + { + "id": "2055", + "available": 2, + "doctype": 2, + "name": "Ramen Shop", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 6, + "submissions": 87, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 9.195402298850574, + "score": 16, + "userScore": 0 + }, + { + "id": "2056", + "available": 1, + "doctype": 2, + "name": "Cousin's Aunt", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 7, + "submissions": 47, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 14.893617021276595, + "score": 16, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGRegional2022", + "largeCl": "JAG", + "middleCl": "Regional", + "year": 2022, + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "days": [ + { + "id": 308, + "day": 1, + "title": "ICPC Japan Alumni Group Practice Contest for Asia Regionals 2022", + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "problems": [ + { + "id": "3346", + "available": 1, + "doctype": 2, + "name": "Stop and Go", + "problemTimeLimit": 2, + "problemMemoryLimit": 2097152, + "maxScore": 0, + "solvedUser": 37, + "submissions": 62, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 69.35483870967742, + "score": 3.4594594594594597, + "userScore": 0 + }, + { + "id": "3347", + "available": 1, + "doctype": 2, + "name": "1-Player Concentration", + "problemTimeLimit": 2, + "problemMemoryLimit": 2097152, + "maxScore": 0, + "solvedUser": 35, + "submissions": 51, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 82.3529411764706, + "score": 3.657142857142857, + "userScore": 0 + }, + { + "id": "3348", + "available": 1, + "doctype": 2, + "name": "Track Train Trail", + "problemTimeLimit": 2, + "problemMemoryLimit": 2097152, + "maxScore": 0, + "solvedUser": 11, + "submissions": 55, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 21.818181818181817, + "score": 11.636363636363637, + "userScore": 0 + }, + { + "id": "3349", + "available": 1, + "doctype": 2, + "name": "2-LIS", + "problemTimeLimit": 2, + "problemMemoryLimit": 2097152, + "maxScore": 0, + "solvedUser": 28, + "submissions": 109, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.61467889908257, + "score": 4.571428571428571, + "userScore": 0 + }, + { + "id": "3350", + "available": 1, + "doctype": 2, + "name": "Sharp 2-SAT", + "problemTimeLimit": 8, + "problemMemoryLimit": 2097152, + "maxScore": 0, + "solvedUser": 4, + "submissions": 4, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 100, + "score": 16, + "userScore": 0 + }, + { + "id": "3351", + "available": 1, + "doctype": 2, + "name": "Seimei Handan 999.0", + "problemTimeLimit": 2, + "problemMemoryLimit": 2097152, + "maxScore": 0, + "solvedUser": 11, + "submissions": 31, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.61290322580645, + "score": 11.636363636363637, + "userScore": 0 + }, + { + "id": "3352", + "available": 2, + "doctype": 2, + "name": "Avoid bombings", + "problemTimeLimit": 2, + "problemMemoryLimit": 2097152, + "maxScore": 0, + "solvedUser": 1, + "submissions": 3, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 33.333333333333336, + "score": 16, + "userScore": 0 + }, + { + "id": "3353", + "available": 1, + "doctype": 2, + "name": "Sloppy city planning", + "problemTimeLimit": 2, + "problemMemoryLimit": 2097152, + "maxScore": 0, + "solvedUser": 18, + "submissions": 39, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 58.97435897435897, + "score": 7.111111111111111, + "userScore": 0 + }, + { + "id": "3354", + "available": 1, + "doctype": 2, + "name": "N-1 Truths and a Lie", + "problemTimeLimit": 2, + "problemMemoryLimit": 2097152, + "maxScore": 0, + "solvedUser": 14, + "submissions": 38, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.73684210526316, + "score": 9.142857142857142, + "userScore": 0 + }, + { + "id": "3355", + "available": 3, + "doctype": 2, + "name": "Most distant point from the stations\t", + "problemTimeLimit": 2, + "problemMemoryLimit": 2097152, + "maxScore": 0, + "solvedUser": 7, + "submissions": 11, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 63.63636363636363, + "score": 16, + "userScore": 0 + }, + { + "id": "3356", + "available": 1, + "doctype": 2, + "name": "Sort Compressed Strings", + "problemTimeLimit": 4, + "problemMemoryLimit": 2097152, + "maxScore": 0, + "solvedUser": 3, + "submissions": 20, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 40, + "score": 16, + "userScore": 0 + }, + { + "id": "3357", + "available": 1, + "doctype": 2, + "name": "Tree Automorphism", + "problemTimeLimit": 2, + "problemMemoryLimit": 2097152, + "maxScore": 0, + "solvedUser": 18, + "submissions": 41, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 46.34146341463415, + "score": 7.111111111111111, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGRegional2009", + "largeCl": "JAG", + "middleCl": "Regional", + "year": 2009, + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "days": [ + { + "id": 86, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Asia Regionals 2009", + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "problems": [ + { + "id": "2175", + "available": 1, + "doctype": 2, + "name": "Whist", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 278, + "submissions": 424, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 72.87735849056604, + "score": 0.460431654676259, + "userScore": 0 + }, + { + "id": "2176", + "available": 1, + "doctype": 2, + "name": "For the Peace", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 249, + "submissions": 611, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 49.754500818330605, + "score": 0.5140562248995983, + "userScore": 0 + }, + { + "id": "2177", + "available": 1, + "doctype": 2, + "name": "Champernowne Constant", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 200, + "submissions": 596, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 40.26845637583892, + "score": 0.64, + "userScore": 0 + }, + { + "id": "2178", + "available": 1, + "doctype": 2, + "name": "Futon", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 192, + "submissions": 468, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.22222222222222, + "score": 0.6666666666666666, + "userScore": 0 + }, + { + "id": "2179", + "available": 1, + "doctype": 2, + "name": "Safe Area", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 58, + "submissions": 181, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 35.35911602209945, + "score": 2.206896551724138, + "userScore": 0 + }, + { + "id": "2180", + "available": 2, + "doctype": 2, + "name": "Water Tank", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 143, + "submissions": 704, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.551136363636363, + "score": 0.8951048951048951, + "userScore": 0 + }, + { + "id": "2181", + "available": 1, + "doctype": 2, + "name": "Neko's Treasure", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 98, + "submissions": 322, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.577639751552795, + "score": 1.3061224489795917, + "userScore": 0 + }, + { + "id": "2182", + "available": 1, + "doctype": 2, + "name": "Eleven Lover", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 404, + "submissions": 789, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 66.53992395437263, + "score": 0.31683168316831684, + "userScore": 0 + }, + { + "id": "2183", + "available": 1, + "doctype": 2, + "name": "Crystal Jails", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 16, + "submissions": 227, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 11.013215859030836, + "score": 8, + "userScore": 0 + }, + { + "id": "2184", + "available": 2, + "doctype": 2, + "name": "Cave Explorer", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 13, + "submissions": 183, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25.136612021857925, + "score": 9.846153846153847, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGRegional2020", + "largeCl": "JAG", + "middleCl": "Regional", + "year": 2020, + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "days": [ + { + "id": 268, + "day": 1, + "title": "ICPC Japan Alumni Group Practice Contest for Asia Regionals 2020", + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "problems": [ + { + "id": "3218", + "available": 1, + "doctype": 2, + "name": "On-Call", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 43, + "submissions": 97, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 46.391752577319586, + "score": 2.9767441860465116, + "userScore": 0 + }, + { + "id": "3219", + "available": 1, + "doctype": 2, + "name": "Warp Points", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 30, + "submissions": 73, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 54.794520547945204, + "score": 4.266666666666667, + "userScore": 0 + }, + { + "id": "3220", + "available": 1, + "doctype": 2, + "name": "Rebound Sequences", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 12, + "submissions": 16, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 81.25, + "score": 10.666666666666666, + "userScore": 0 + }, + { + "id": "3221", + "available": 1, + "doctype": 2, + "name": "Surround the Castle", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 9, + "submissions": 39, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.76923076923077, + "score": 14.222222222222221, + "userScore": 0 + }, + { + "id": "3222", + "available": 3, + "doctype": 2, + "name": "Buttons", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 20, + "submissions": 64, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 42.1875, + "score": 6.4, + "userScore": 0 + }, + { + "id": "3223", + "available": 3, + "doctype": 2, + "name": "Mountain View", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 20, + "submissions": 128, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 18.75, + "score": 6.4, + "userScore": 0 + }, + { + "id": "3224", + "available": 1, + "doctype": 2, + "name": "Yet Another Expression Mining", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 17, + "submissions": 90, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25.555555555555557, + "score": 7.529411764705882, + "userScore": 0 + }, + { + "id": "3225", + "available": 1, + "doctype": 2, + "name": "Aggressive Traveller", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 5, + "submissions": 21, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 23.80952380952381, + "score": 16, + "userScore": 0 + }, + { + "id": "3226", + "available": 1, + "doctype": 2, + "name": "Irreversible Reactions", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 20, + "submissions": 31, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 64.51612903225806, + "score": 6.4, + "userScore": 0 + }, + { + "id": "3227", + "available": 3, + "doctype": 2, + "name": "X-percent Blooming", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 9, + "submissions": 24, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50, + "score": 14.222222222222221, + "userScore": 0 + }, + { + "id": "3228", + "available": 1, + "doctype": 2, + "name": "Feed candies", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 13, + "submissions": 36, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 41.666666666666664, + "score": 9.846153846153847, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGRegional2005", + "largeCl": "JAG", + "middleCl": "Regional", + "year": 2005, + "progress": 0, + "numberOfProblems": 6, + "numberOfSolved": 0, + "days": [ + { + "id": 66, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Asia Regionals 2005", + "progress": 0, + "numberOfProblems": 6, + "numberOfSolved": 0, + "problems": [ + { + "id": "2024", + "available": 1, + "doctype": 2, + "name": "Blackjack", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 118, + "submissions": 450, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.444444444444443, + "score": 1.0847457627118644, + "userScore": 0 + }, + { + "id": "2025", + "available": 1, + "doctype": 2, + "name": "Eight Princes", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 44, + "submissions": 99, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 52.525252525252526, + "score": 2.909090909090909, + "userScore": 0 + }, + { + "id": "2026", + "available": 3, + "doctype": 2, + "name": "Divisor is the Conqueror", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 87, + "submissions": 336, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 35.416666666666664, + "score": 1.471264367816092, + "userScore": 0 + }, + { + "id": "2027", + "available": 3, + "doctype": 2, + "name": "Reading a Chord", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 29, + "submissions": 53, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 71.69811320754717, + "score": 4.413793103448276, + "userScore": 0 + }, + { + "id": "2028", + "available": 1, + "doctype": 2, + "name": "Gather on the Clock", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 63, + "submissions": 162, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 48.76543209876543, + "score": 2.0317460317460316, + "userScore": 0 + }, + { + "id": "2029", + "available": 2, + "doctype": 2, + "name": "Light The Room", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 13, + "submissions": 93, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 19.35483870967742, + "score": 9.846153846153847, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGRegional2015", + "largeCl": "JAG", + "middleCl": "Regional", + "year": 2015, + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "days": [ + { + "id": 180, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Asia Regionals 2015", + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "problems": [ + { + "id": "2727", + "available": 1, + "doctype": 2, + "name": "M and A", + "problemTimeLimit": 5, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 207, + "submissions": 456, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.31578947368421, + "score": 0.6183574879227053, + "userScore": 0 + }, + { + "id": "2728", + "available": 1, + "doctype": 2, + "name": "Change a Password", + "problemTimeLimit": 5, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 164, + "submissions": 528, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 42.99242424242424, + "score": 0.7804878048780488, + "userScore": 0 + }, + { + "id": "2729", + "available": 1, + "doctype": 2, + "name": "Delete Files", + "problemTimeLimit": 5, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 80, + "submissions": 314, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 35.031847133757964, + "score": 1.6, + "userScore": 0 + }, + { + "id": "2730", + "available": 1, + "doctype": 2, + "name": "Line Gimmick", + "problemTimeLimit": 5, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 182, + "submissions": 419, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 55.8472553699284, + "score": 0.7032967032967034, + "userScore": 0 + }, + { + "id": "2731", + "available": 1, + "doctype": 2, + "name": "Shifting a Matrix", + "problemTimeLimit": 5, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 93, + "submissions": 207, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 56.03864734299517, + "score": 1.3763440860215055, + "userScore": 0 + }, + { + "id": "2732", + "available": 1, + "doctype": 2, + "name": "Modern Announce Network", + "problemTimeLimit": 5, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 69, + "submissions": 297, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 31.986531986531986, + "score": 1.855072463768116, + "userScore": 0 + }, + { + "id": "2733", + "available": 1, + "doctype": 2, + "name": "Cube Dividing", + "problemTimeLimit": 5, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 16, + "submissions": 81, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.098765432098766, + "score": 8, + "userScore": 0 + }, + { + "id": "2734", + "available": 1, + "doctype": 2, + "name": "Donut Decoration", + "problemTimeLimit": 5, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 84, + "submissions": 317, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.94952681388013, + "score": 1.5238095238095237, + "userScore": 0 + }, + { + "id": "2735", + "available": 3, + "doctype": 2, + "name": "Shortest Bridge", + "problemTimeLimit": 5, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 6, + "submissions": 30, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.333333333333336, + "score": 16, + "userScore": 0 + }, + { + "id": "2736", + "available": 3, + "doctype": 2, + "name": "Longest Shortest Path", + "problemTimeLimit": 10, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 28, + "submissions": 65, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 55.38461538461539, + "score": 4.571428571428571, + "userScore": 0 + }, + { + "id": "2737", + "available": 1, + "doctype": 2, + "name": "Optimal Tournament", + "problemTimeLimit": 5, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 22, + "submissions": 43, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 74.4186046511628, + "score": 5.818181818181818, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGRegional2007", + "largeCl": "JAG", + "middleCl": "Regional", + "year": 2007, + "progress": 0, + "numberOfProblems": 9, + "numberOfSolved": 0, + "days": [ + { + "id": 68, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Asia Regionals 2007", + "progress": 0, + "numberOfProblems": 9, + "numberOfSolved": 0, + "problems": [ + { + "id": "2039", + "available": 1, + "doctype": 2, + "name": "Space Coconut Crab II", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 116, + "submissions": 304, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 58.88157894736842, + "score": 1.103448275862069, + "userScore": 0 + }, + { + "id": "2040", + "available": 1, + "doctype": 2, + "name": "Sort the Panels", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 70, + "submissions": 255, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 39.6078431372549, + "score": 1.8285714285714285, + "userScore": 0 + }, + { + "id": "2041", + "available": 1, + "doctype": 2, + "name": "Disarmament of the Units", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 6, + "submissions": 69, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 27.536231884057973, + "score": 16, + "userScore": 0 + }, + { + "id": "2042", + "available": 1, + "doctype": 2, + "name": "So Sleepy", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 17, + "submissions": 77, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 33.76623376623377, + "score": 7.529411764705882, + "userScore": 0 + }, + { + "id": "2043", + "available": 0, + "doctype": 2, + "name": "Alice in Foxland", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 0, + "submissions": 17, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 0, + "score": 0, + "userScore": 0 + }, + { + "id": "2044", + "available": 1, + "doctype": 2, + "name": "Lying about Your Age", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 44, + "submissions": 111, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.351351351351354, + "score": 2.909090909090909, + "userScore": 0 + }, + { + "id": "2045", + "available": 2, + "doctype": 2, + "name": "Turn Polygons", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 31, + "submissions": 51, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 74.50980392156863, + "score": 4.129032258064516, + "userScore": 0 + }, + { + "id": "2046", + "available": 2, + "doctype": 2, + "name": "Robots' Crash", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 9, + "submissions": 108, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 21.296296296296298, + "score": 14.222222222222221, + "userScore": 0 + }, + { + "id": "2047", + "available": 1, + "doctype": 2, + "name": "Linear Ether Geometry", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 0, + "submissions": 3, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 0, + "score": 0, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGRegional2013", + "largeCl": "JAG", + "middleCl": "Regional", + "year": 2013, + "progress": 0, + "numberOfProblems": 7, + "numberOfSolved": 0, + "days": [ + { + "id": 149, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Asia Regionals 2013", + "progress": 0, + "numberOfProblems": 7, + "numberOfSolved": 0, + "problems": [ + { + "id": "2568", + "available": 1, + "doctype": 2, + "name": "Everlasting -One-", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 137, + "submissions": 300, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 57, + "score": 0.9343065693430657, + "userScore": 0 + }, + { + "id": "2569", + "available": 1, + "doctype": 2, + "name": "Putter", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 48, + "submissions": 204, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.88235294117647, + "score": 2.6666666666666665, + "userScore": 0 + }, + { + "id": "2570", + "available": 1, + "doctype": 2, + "name": "Shipura", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 161, + "submissions": 432, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 48.611111111111114, + "score": 0.7950310559006211, + "userScore": 0 + }, + { + "id": "2571", + "available": 1, + "doctype": 2, + "name": "Floating Islands", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 32, + "submissions": 144, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 33.333333333333336, + "score": 4, + "userScore": 0 + }, + { + "id": "2572", + "available": 3, + "doctype": 2, + "name": "Venn Diagram", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 67, + "submissions": 637, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 23.390894819466247, + "score": 1.9104477611940298, + "userScore": 0 + }, + { + "id": "2573", + "available": 3, + "doctype": 2, + "name": "Overwriting Game", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 29, + "submissions": 94, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 41.48936170212766, + "score": 4.413793103448276, + "userScore": 0 + }, + { + "id": "2574", + "available": 3, + "doctype": 2, + "name": "Magical Switches", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 21, + "submissions": 119, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.571428571428573, + "score": 6.095238095238095, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGRegional2017", + "largeCl": "JAG", + "middleCl": "Regional", + "year": 2017, + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "days": [ + { + "id": 209, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Asia Regionals 2017", + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "problems": [ + { + "id": "2856", + "available": 1, + "doctype": 2, + "name": "Window", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 227, + "submissions": 360, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 82.22222222222223, + "score": 0.5638766519823789, + "userScore": 0 + }, + { + "id": "2857", + "available": 1, + "doctype": 2, + "name": "Tournament Chart", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 121, + "submissions": 352, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50, + "score": 1.0578512396694215, + "userScore": 0 + }, + { + "id": "2858", + "available": 1, + "doctype": 2, + "name": "Prime-Factor Prime", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 165, + "submissions": 379, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 63.58839050131926, + "score": 0.7757575757575758, + "userScore": 0 + }, + { + "id": "2859", + "available": 1, + "doctype": 2, + "name": "Revenge of the Broken Door", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 14, + "submissions": 75, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 22.666666666666668, + "score": 9.142857142857142, + "userScore": 0 + }, + { + "id": "2860", + "available": 1, + "doctype": 2, + "name": "Tree Separator", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 50, + "submissions": 103, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 68.93203883495146, + "score": 2.56, + "userScore": 0 + }, + { + "id": "2861", + "available": 3, + "doctype": 2, + "name": "RPG Maker", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 65, + "submissions": 117, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 63.24786324786325, + "score": 1.9692307692307693, + "userScore": 0 + }, + { + "id": "2862", + "available": 1, + "doctype": 2, + "name": "Coin Slider", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 85, + "submissions": 162, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 58.641975308641975, + "score": 1.5058823529411764, + "userScore": 0 + }, + { + "id": "2863", + "available": 1, + "doctype": 2, + "name": "Separate String", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 117, + "submissions": 604, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 42.05298013245033, + "score": 1.0940170940170941, + "userScore": 0 + }, + { + "id": "2864", + "available": 1, + "doctype": 2, + "name": "Revenge of the Endless BFS", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 22, + "submissions": 56, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 60.714285714285715, + "score": 5.818181818181818, + "userScore": 0 + }, + { + "id": "2865", + "available": 1, + "doctype": 2, + "name": "Farm Village", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 17, + "submissions": 131, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25.19083969465649, + "score": 7.529411764705882, + "userScore": 0 + }, + { + "id": "2866", + "available": 1, + "doctype": 2, + "name": "Conveyor Belt", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 22, + "submissions": 57, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 75.43859649122807, + "score": 5.818181818181818, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "JAGRegional2016", + "largeCl": "JAG", + "middleCl": "Regional", + "year": 2016, + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "days": [ + { + "id": 186, + "day": 1, + "title": "ACM-ICPC Japan Alumni Group Practice Contest for Asia Regionals 2016", + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "problems": [ + { + "id": "2780", + "available": 1, + "doctype": 2, + "name": "Best Matched Pair", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 319, + "submissions": 915, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 69.8360655737705, + "score": 0.4012539184952978, + "userScore": 0 + }, + { + "id": "2781", + "available": 1, + "doctype": 2, + "name": "Help the Princess!", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 178, + "submissions": 900, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 49.111111111111114, + "score": 0.7191011235955056, + "userScore": 0 + }, + { + "id": "2782", + "available": 1, + "doctype": 2, + "name": "We don't wanna work!", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 55, + "submissions": 527, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 33.586337760910816, + "score": 2.327272727272727, + "userScore": 0 + }, + { + "id": "2783", + "available": 1, + "doctype": 2, + "name": "Parentheses", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 126, + "submissions": 794, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.13350125944584, + "score": 1.0158730158730158, + "userScore": 0 + }, + { + "id": "2784", + "available": 1, + "doctype": 2, + "name": "Similarity of Subtrees", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 130, + "submissions": 838, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 45.346062052505964, + "score": 0.9846153846153847, + "userScore": 0 + }, + { + "id": "2785", + "available": 1, + "doctype": 2, + "name": "Escape from the Hell", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 50, + "submissions": 720, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 23.61111111111111, + "score": 2.56, + "userScore": 0 + }, + { + "id": "2786", + "available": 1, + "doctype": 2, + "name": "Share the Ruins Preservation", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 46, + "submissions": 385, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.467532467532465, + "score": 2.782608695652174, + "userScore": 0 + }, + { + "id": "2787", + "available": 1, + "doctype": 2, + "name": "Pipe Fitter and the Fierce Dogs", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 49, + "submissions": 129, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 55.03875968992248, + "score": 2.6122448979591835, + "userScore": 0 + }, + { + "id": "2788", + "available": 2, + "doctype": 2, + "name": "Multisect", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 36, + "submissions": 99, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 63.63636363636363, + "score": 3.5555555555555554, + "userScore": 0 + }, + { + "id": "2789", + "available": 1, + "doctype": 2, + "name": "Compressed Formula", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 30, + "submissions": 106, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 40.56603773584906, + "score": 4.266666666666667, + "userScore": 0 + }, + { + "id": "2790", + "available": 1, + "doctype": 2, + "name": "Non-redundant Drive", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 23, + "submissions": 399, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 12.781954887218046, + "score": 5.565217391304348, + "userScore": 0 + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/lib/clients/fixtures/aizu_online_judge/challenges/pck_final/contests.json b/src/lib/clients/fixtures/aizu_online_judge/challenges/pck_final/contests.json new file mode 100644 index 000000000..166361953 --- /dev/null +++ b/src/lib/clients/fixtures/aizu_online_judge/challenges/pck_final/contests.json @@ -0,0 +1,6226 @@ +{ + "largeCl": { + "id": "PCK", + "title": "All-Japan High School Programming Contest", + "filter": [ + { + "label": "Prelim", + "value": "prelim" + }, + { + "label": "Final", + "value": "final" + } + ], + "middleCls": null + }, + "contests": [ + { + "abbr": "PCKFinal2009", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2009, + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "days": [ + { + "id": 13, + "day": 1, + "title": "7th PC Koshien, Final", + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "problems": [ + { + "id": "0205", + "available": 1, + "doctype": 1, + "name": "Rock, Paper, Scissors", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 876, + "submissions": 2069, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 53.06911551474142, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0206", + "available": 1, + "doctype": 1, + "name": "Next Trip", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1046, + "submissions": 2143, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 56.08959402706486, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0207", + "available": 1, + "doctype": 1, + "name": "Block", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 694, + "submissions": 3389, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 33.46119799350841, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0208", + "available": 1, + "doctype": 1, + "name": "Room Numbers of a Hospital", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 739, + "submissions": 1391, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 67.43350107836089, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0209", + "available": 1, + "doctype": 1, + "name": "Scene in a Picture", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 298, + "submissions": 1074, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.312849162011176, + "score": 0.42953020134228187, + "userScore": 0 + }, + { + "id": "0210", + "available": 1, + "doctype": 1, + "name": "The Squares", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 172, + "submissions": 826, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25.66585956416465, + "score": 0.7441860465116279, + "userScore": 0 + }, + { + "id": "0211", + "available": 1, + "doctype": 1, + "name": "Jogging", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 286, + "submissions": 774, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 45.21963824289406, + "score": 0.44755244755244755, + "userScore": 0 + }, + { + "id": "0212", + "available": 1, + "doctype": 1, + "name": "Highway Express Bus", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 520, + "submissions": 1651, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 42.33797698364628, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0213", + "available": 1, + "doctype": 1, + "name": "Subdivide The Land", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 140, + "submissions": 510, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 39.21568627450981, + "score": 0.9142857142857143, + "userScore": 0 + }, + { + "id": "0214", + "available": 1, + "doctype": 1, + "name": "Autumnal Illumination", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 118, + "submissions": 897, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 19.84392419175028, + "score": 1.0847457627118644, + "userScore": 0 + }, + { + "id": "0215", + "available": 1, + "doctype": 1, + "name": "Pachimon Creature", + "problemTimeLimit": 5, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 213, + "submissions": 2043, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 38.081253059226626, + "score": 0.6009389671361502, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2007", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2007, + "progress": 0, + "numberOfProblems": 15, + "numberOfSolved": 0, + "days": [ + { + "id": 9, + "day": 1, + "title": "5th PC Koshien, Final", + "progress": 0, + "numberOfProblems": 15, + "numberOfSolved": 0, + "problems": [ + { + "id": "0158", + "available": 1, + "doctype": 1, + "name": "Collatz's Problem", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 972, + "submissions": 1535, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 76.80781758957654, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0159", + "available": 1, + "doctype": 1, + "name": "The Best Body", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 579, + "submissions": 1119, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 57.73011617515639, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0160", + "available": 1, + "doctype": 1, + "name": "Delivery Fee", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 645, + "submissions": 1118, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 67.17352415026834, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0161", + "available": 1, + "doctype": 1, + "name": "Sport Meet", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 670, + "submissions": 1050, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 75.23809523809524, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0162", + "available": 1, + "doctype": 1, + "name": "Hamming Numbers", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 626, + "submissions": 1317, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 61.5793470007593, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0163", + "available": 1, + "doctype": 1, + "name": "Highway Toll", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 323, + "submissions": 841, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 45.77883472057075, + "score": 0.39628482972136225, + "userScore": 0 + }, + { + "id": "0164", + "available": 1, + "doctype": 1, + "name": "Ohajiki Game", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 531, + "submissions": 768, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 77.99479166666667, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0165", + "available": 1, + "doctype": 1, + "name": "Lottery", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 245, + "submissions": 794, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 40.55415617128463, + "score": 0.5224489795918368, + "userScore": 0 + }, + { + "id": "0166", + "available": 1, + "doctype": 1, + "name": "Area of Polygon", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 297, + "submissions": 993, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.66364551863041, + "score": 0.43097643097643096, + "userScore": 0 + }, + { + "id": "0167", + "available": 1, + "doctype": 1, + "name": "Bubble Sort", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 775, + "submissions": 1481, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 64.48345712356516, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0168", + "available": 1, + "doctype": 1, + "name": "Kannondou", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 2043, + "submissions": 4348, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 61.38454461821527, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0169", + "available": 1, + "doctype": 1, + "name": "Blackjack", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 442, + "submissions": 1043, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 55.033557046979865, + "score": 0.2895927601809955, + "userScore": 0 + }, + { + "id": "0170", + "available": 1, + "doctype": 1, + "name": "Lunch", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 294, + "submissions": 602, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 67.10963455149502, + "score": 0.43537414965986393, + "userScore": 0 + }, + { + "id": "0171", + "available": 1, + "doctype": 1, + "name": "Dice Puzzle", + "problemTimeLimit": 5, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 117, + "submissions": 416, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.71153846153846, + "score": 1.0940170940170941, + "userScore": 0 + }, + { + "id": "0172", + "available": 1, + "doctype": 1, + "name": "Doctor's Research Rooms", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 112, + "submissions": 727, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 22.558459422283356, + "score": 1.1428571428571428, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2020", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2020, + "progress": 0, + "numberOfProblems": 13, + "numberOfSolved": 0, + "days": [ + { + "id": 262, + "day": 1, + "title": "18th PC Koshien, Final", + "progress": 0, + "numberOfProblems": 13, + "numberOfSolved": 0, + "problems": [ + { + "id": "0440", + "available": 1, + "doctype": 4, + "name": "The Price of a Cake", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 220, + "submissions": 333, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 72.67267267267268, + "score": 0.5818181818181818, + "userScore": 0 + }, + { + "id": "0441", + "available": 1, + "doctype": 4, + "name": "Angle Conversion", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 409, + "submissions": 794, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 59.82367758186398, + "score": 0.31295843520782396, + "userScore": 0 + }, + { + "id": "0442", + "available": 1, + "doctype": 4, + "name": "Pancake", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 180, + "submissions": 506, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 41.10671936758893, + "score": 0.7111111111111111, + "userScore": 0 + }, + { + "id": "0443", + "available": 1, + "doctype": 4, + "name": "Minimum MAW", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 101, + "submissions": 305, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 38.68852459016394, + "score": 1.2673267326732673, + "userScore": 0 + }, + { + "id": "0444", + "available": 1, + "doctype": 4, + "name": "Slot Machine", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 92, + "submissions": 170, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 57.64705882352941, + "score": 1.391304347826087, + "userScore": 0 + }, + { + "id": "0445", + "available": 2, + "doctype": 4, + "name": "Hanbunko", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 50, + "submissions": 304, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 19.407894736842106, + "score": 2.56, + "userScore": 0 + }, + { + "id": "0446", + "available": 1, + "doctype": 4, + "name": "Room Number", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 63, + "submissions": 233, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 29.613733905579398, + "score": 2.0317460317460316, + "userScore": 0 + }, + { + "id": "0447", + "available": 1, + "doctype": 4, + "name": "Broken Exit", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 50, + "submissions": 104, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.92307692307692, + "score": 2.56, + "userScore": 0 + }, + { + "id": "0448", + "available": 1, + "doctype": 4, + "name": "Robot Arm", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 33, + "submissions": 156, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 24.358974358974358, + "score": 3.878787878787879, + "userScore": 0 + }, + { + "id": "0449", + "available": 2, + "doctype": 4, + "name": "Persimmon", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 17, + "submissions": 210, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 13.80952380952381, + "score": 7.529411764705882, + "userScore": 0 + }, + { + "id": "0450", + "available": 1, + "doctype": 4, + "name": "Reorganization of Highway Network", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 19, + "submissions": 94, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 23.404255319148938, + "score": 6.7368421052631575, + "userScore": 0 + }, + { + "id": "0451", + "available": 1, + "doctype": 4, + "name": "Swap and Inversion Number", + "problemTimeLimit": 3, + "problemMemoryLimit": 1048576, + "maxScore": 0, + "solvedUser": 14, + "submissions": 166, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 12.650602409638553, + "score": 9.142857142857142, + "userScore": 0 + }, + { + "id": "0452", + "available": 1, + "doctype": 4, + "name": "Stamp Rally", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 15, + "submissions": 42, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 40.476190476190474, + "score": 8.533333333333333, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2025", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2025, + "progress": 0, + "numberOfProblems": 13, + "numberOfSolved": 0, + "days": [ + { + "id": 337, + "day": 1, + "title": "23rd PC Koshien, Final", + "progress": 0, + "numberOfProblems": 13, + "numberOfSolved": 0, + "problems": [ + { + "id": "4071", + "available": 1, + "doctype": 1, + "name": "Integer Part", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 11, + "submissions": 15, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 93.33333333333333, + "score": 11.636363636363637, + "userScore": 0 + }, + { + "id": "4072", + "available": 1, + "doctype": 1, + "name": "The Mystery of the Three-Way Split", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 8, + "submissions": 9, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 100, + "score": 16, + "userScore": 0 + }, + { + "id": "4073", + "available": 1, + "doctype": 1, + "name": "Effect of the Medication", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 7, + "submissions": 15, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 60, + "score": 16, + "userScore": 0 + }, + { + "id": "4074", + "available": 1, + "doctype": 1, + "name": "Mean and K", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 7, + "submissions": 9, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 77.77777777777777, + "score": 16, + "userScore": 0 + }, + { + "id": "4075", + "available": 1, + "doctype": 1, + "name": "Two Islands in the Hibara Sea", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 5, + "submissions": 5, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 100, + "score": 16, + "userScore": 0 + }, + { + "id": "4076", + "available": 1, + "doctype": 1, + "name": "The Commitment of the Cookie Packer", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 5, + "submissions": 8, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 87.5, + "score": 16, + "userScore": 0 + }, + { + "id": "4077", + "available": 1, + "doctype": 1, + "name": "Hypercube Database System", + "problemTimeLimit": 4, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 1, + "submissions": 2, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50, + "score": 16, + "userScore": 0 + }, + { + "id": "4078", + "available": 1, + "doctype": 1, + "name": "The Sound of Bells Echoing Across Hibara Sea", + "problemTimeLimit": 4, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 2, + "submissions": 5, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 40, + "score": 16, + "userScore": 0 + }, + { + "id": "4079", + "available": 1, + "doctype": 1, + "name": "Spy", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 1, + "submissions": 4, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25, + "score": 16, + "userScore": 0 + }, + { + "id": "4080", + "available": 1, + "doctype": 1, + "name": "The Commitment of the Cookie Packer", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 1, + "submissions": 10, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 10, + "score": 16, + "userScore": 0 + }, + { + "id": "4081", + "available": 1, + "doctype": 1, + "name": "Strategies for Beko Beko", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 1, + "submissions": 2, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50, + "score": 16, + "userScore": 0 + }, + { + "id": "4082", + "available": 1, + "doctype": 1, + "name": "Baggage Management", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 0, + "submissions": 0, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 0, + "score": 0, + "userScore": 0 + }, + { + "id": "4083", + "available": 1, + "doctype": 1, + "name": "Access Conditions on School Routes", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 2, + "submissions": 3, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 66.66666666666667, + "score": 16, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2014", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2014, + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "days": [ + { + "id": 159, + "day": 1, + "title": "12th PC Koshien, Final", + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "problems": [ + { + "id": "0305", + "available": 1, + "doctype": 1, + "name": "Yuekis' Audio Room", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 373, + "submissions": 615, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 69.10569105691057, + "score": 0.34316353887399464, + "userScore": 0 + }, + { + "id": "0306", + "available": 1, + "doctype": 1, + "name": "Symmetric Ternary Number", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 219, + "submissions": 405, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 63.7037037037037, + "score": 0.5844748858447488, + "userScore": 0 + }, + { + "id": "0307", + "available": 1, + "doctype": 1, + "name": "Nisshinkan Marathon Club", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 212, + "submissions": 430, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 55.81395348837209, + "score": 0.6037735849056604, + "userScore": 0 + }, + { + "id": "0308", + "available": 1, + "doctype": 1, + "name": "Deadlock", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 103, + "submissions": 233, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 48.06866952789699, + "score": 1.2427184466019416, + "userScore": 0 + }, + { + "id": "0309", + "available": 1, + "doctype": 1, + "name": "New Drug Development", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 86, + "submissions": 204, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 57.35294117647059, + "score": 1.4883720930232558, + "userScore": 0 + }, + { + "id": "0310", + "available": 1, + "doctype": 1, + "name": "Frame", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 97, + "submissions": 456, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.289473684210527, + "score": 1.3195876288659794, + "userScore": 0 + }, + { + "id": "0311", + "available": 2, + "doctype": 1, + "name": "Kaguya", + "problemTimeLimit": 5, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 29, + "submissions": 68, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.05882352941177, + "score": 4.413793103448276, + "userScore": 0 + }, + { + "id": "0312", + "available": 1, + "doctype": 1, + "name": "Net Cafe", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 84, + "submissions": 256, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.140625, + "score": 1.5238095238095237, + "userScore": 0 + }, + { + "id": "0313", + "available": 3, + "doctype": 1, + "name": "Unknown Germ", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 29, + "submissions": 190, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 24.210526315789473, + "score": 4.413793103448276, + "userScore": 0 + }, + { + "id": "0314", + "available": 1, + "doctype": 1, + "name": "The Kingdom of Akabeko", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 22, + "submissions": 98, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 27.551020408163264, + "score": 5.818181818181818, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2024", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2024, + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "days": [ + { + "id": 320, + "day": 1, + "title": "22nd PC Koshien, Final", + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "problems": [ + { + "id": "4048", + "available": 1, + "doctype": 1, + "name": "Jewelry", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 75, + "submissions": 169, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 46.74556213017752, + "score": 1.7066666666666668, + "userScore": 0 + }, + { + "id": "4049", + "available": 1, + "doctype": 1, + "name": "Congruent Modulo 2024", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 58, + "submissions": 125, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 52, + "score": 2.206896551724138, + "userScore": 0 + }, + { + "id": "4050", + "available": 2, + "doctype": 1, + "name": "The Arrow Fired by a Master", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 44, + "submissions": 100, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 49, + "score": 2.909090909090909, + "userScore": 0 + }, + { + "id": "4051", + "available": 1, + "doctype": 1, + "name": "Handing Over 1", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 36, + "submissions": 69, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 53.6231884057971, + "score": 3.5555555555555554, + "userScore": 0 + }, + { + "id": "4052", + "available": 1, + "doctype": 1, + "name": "Reflection of Light", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 22, + "submissions": 39, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 66.66666666666667, + "score": 5.818181818181818, + "userScore": 0 + }, + { + "id": "4053", + "available": 1, + "doctype": 1, + "name": "Arrangement Patterns for Luggage", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 25, + "submissions": 103, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 29.12621359223301, + "score": 5.12, + "userScore": 0 + }, + { + "id": "4054", + "available": 1, + "doctype": 1, + "name": "Bonsai Game", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 17, + "submissions": 47, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 42.5531914893617, + "score": 7.529411764705882, + "userScore": 0 + }, + { + "id": "4055", + "available": 1, + "doctype": 1, + "name": "Overlapping Polygons", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 10, + "submissions": 22, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 59.09090909090909, + "score": 12.8, + "userScore": 0 + }, + { + "id": "4056", + "available": 1, + "doctype": 1, + "name": "Handing Over 2", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 3, + "submissions": 37, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 8.108108108108109, + "score": 16, + "userScore": 0 + }, + { + "id": "4057", + "available": 1, + "doctype": 1, + "name": "Analysis of the Training Data Set", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 6, + "submissions": 14, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50, + "score": 16, + "userScore": 0 + }, + { + "id": "4058", + "available": 1, + "doctype": 1, + "name": "Escape from Hexagon Pond", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 3, + "submissions": 11, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 27.272727272727273, + "score": 16, + "userScore": 0 + }, + { + "id": "4059", + "available": 1, + "doctype": 1, + "name": "Warehouse Management Robot", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 5, + "submissions": 13, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 53.84615384615385, + "score": 16, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2013", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2013, + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "days": [ + { + "id": 157, + "day": 1, + "title": "11th PC Koshien, Final", + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "problems": [ + { + "id": "0285", + "available": 1, + "doctype": 1, + "name": "Tennis", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 306, + "submissions": 605, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 58.18181818181818, + "score": 0.41830065359477125, + "userScore": 0 + }, + { + "id": "0286", + "available": 1, + "doctype": 1, + "name": "Computation of Salary", + "problemTimeLimit": 2, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 166, + "submissions": 373, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 55.49597855227882, + "score": 0.7710843373493976, + "userScore": 0 + }, + { + "id": "0287", + "available": 1, + "doctype": 1, + "name": "Jinkoki", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 201, + "submissions": 370, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 64.5945945945946, + "score": 0.6368159203980099, + "userScore": 0 + }, + { + "id": "0288", + "available": 1, + "doctype": 1, + "name": "Knocker of the Gigas Cedar", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 129, + "submissions": 527, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.550284629981025, + "score": 0.9922480620155039, + "userScore": 0 + }, + { + "id": "0289", + "available": 1, + "doctype": 1, + "name": "Infinite Express", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 169, + "submissions": 509, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.59724950884087, + "score": 0.757396449704142, + "userScore": 0 + }, + { + "id": "0290", + "available": 1, + "doctype": 1, + "name": "Microorganism Power Generation", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 108, + "submissions": 255, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 56.07843137254902, + "score": 1.1851851851851851, + "userScore": 0 + }, + { + "id": "0291", + "available": 1, + "doctype": 1, + "name": "Mystery of an Ancient Ruin", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 60, + "submissions": 215, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 31.627906976744185, + "score": 2.1333333333333333, + "userScore": 0 + }, + { + "id": "0292", + "available": 1, + "doctype": 1, + "name": "Wall", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 45, + "submissions": 319, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 18.808777429467085, + "score": 2.8444444444444446, + "userScore": 0 + }, + { + "id": "0293", + "available": 1, + "doctype": 1, + "name": "Algorithm Exam", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 31, + "submissions": 225, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 23.11111111111111, + "score": 4.129032258064516, + "userScore": 0 + }, + { + "id": "0294", + "available": 1, + "doctype": 1, + "name": "Catch a Thief", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 34, + "submissions": 183, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 35.51912568306011, + "score": 3.764705882352941, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2015", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2015, + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "days": [ + { + "id": 190, + "day": 1, + "title": "13th PC Koshien, Final", + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "problems": [ + { + "id": "0325", + "available": 1, + "doctype": 1, + "name": "Cuboid", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 187, + "submissions": 646, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 35.60371517027864, + "score": 0.6844919786096256, + "userScore": 0 + }, + { + "id": "0326", + "available": 1, + "doctype": 1, + "name": "Related Products", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 202, + "submissions": 313, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 70.28753993610223, + "score": 0.6336633663366337, + "userScore": 0 + }, + { + "id": "0327", + "available": 1, + "doctype": 1, + "name": "Alphametic", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 146, + "submissions": 192, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 88.02083333333333, + "score": 0.8767123287671232, + "userScore": 0 + }, + { + "id": "0328", + "available": 1, + "doctype": 1, + "name": "Metal Recycling", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 137, + "submissions": 270, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 60.370370370370374, + "score": 0.9343065693430657, + "userScore": 0 + }, + { + "id": "0329", + "available": 1, + "doctype": 1, + "name": "Bilateral Trade", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 123, + "submissions": 333, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 53.153153153153156, + "score": 1.0406504065040652, + "userScore": 0 + }, + { + "id": "0330", + "available": 1, + "doctype": 1, + "name": "Halting Problem", + "problemTimeLimit": 5, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 50, + "submissions": 242, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25.206611570247933, + "score": 2.56, + "userScore": 0 + }, + { + "id": "0331", + "available": 1, + "doctype": 1, + "name": "Scheduler", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 37, + "submissions": 93, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 49.46236559139785, + "score": 3.4594594594594597, + "userScore": 0 + }, + { + "id": "0332", + "available": 1, + "doctype": 1, + "name": "Disappearing Sequence", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 49, + "submissions": 215, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 27.906976744186046, + "score": 2.6122448979591835, + "userScore": 0 + }, + { + "id": "0333", + "available": 1, + "doctype": 1, + "name": "Line Segment Arrangement", + "problemTimeLimit": 4, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 19, + "submissions": 142, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 18.309859154929576, + "score": 6.7368421052631575, + "userScore": 0 + }, + { + "id": "0334", + "available": 1, + "doctype": 1, + "name": "Amidakuji", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 28, + "submissions": 182, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 22.52747252747253, + "score": 4.571428571428571, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2005", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2005, + "progress": 0, + "numberOfProblems": 27, + "numberOfSolved": 0, + "days": [ + { + "id": 5, + "day": 1, + "title": "3rd PC Koshien, Final", + "progress": 0, + "numberOfProblems": 27, + "numberOfSolved": 0, + "problems": [ + { + "id": "0093", + "available": 1, + "doctype": 1, + "name": "Leap Year", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1344, + "submissions": 5810, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.898450946643717, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0094", + "available": 2, + "doctype": 1, + "name": "Calculation of Area", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1428, + "submissions": 1979, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 79.73724103082365, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0095", + "available": 1, + "doctype": 1, + "name": "Surf Smelt Fishing Contest", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 783, + "submissions": 2321, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 38.60404997845756, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0099", + "available": 1, + "doctype": 1, + "name": "Surf Smelt Fishing Contest II", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 502, + "submissions": 3326, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 24.684305472038485, + "score": 0.2549800796812749, + "userScore": 0 + }, + { + "id": "0100", + "available": 1, + "doctype": 4, + "name": "Sale Result", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1494, + "submissions": 9432, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 20.197201017811704, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0101", + "available": 1, + "doctype": 4, + "name": "Aizu PR", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1642, + "submissions": 5487, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.59795881173683, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0102", + "available": 1, + "doctype": 4, + "name": "Matrix-like Computation", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1630, + "submissions": 3987, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.228492600953096, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0103", + "available": 1, + "doctype": 4, + "name": "Baseball Simulation", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1899, + "submissions": 4062, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 59.87198424421467, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0104", + "available": 1, + "doctype": 4, + "name": "Magical Tiles", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1335, + "submissions": 3283, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 49.436491014316175, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0105", + "available": 1, + "doctype": 4, + "name": "Book Index", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1192, + "submissions": 2652, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 56.03318250377074, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0106", + "available": 1, + "doctype": 4, + "name": "Discounts of Buckwheat ", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 781, + "submissions": 1843, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.98046663049376, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0107", + "available": 1, + "doctype": 4, + "name": "Carry a Cheese", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1094, + "submissions": 2356, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.188455008488965, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0108", + "available": 1, + "doctype": 1, + "name": "Operation of Frequency of Appearance", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 889, + "submissions": 1852, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 54.53563714902808, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0109", + "available": 1, + "doctype": 4, + "name": "Smart Calculator", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1262, + "submissions": 4767, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.40297881267044, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0110", + "available": 1, + "doctype": 1, + "name": "Alphametic", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 625, + "submissions": 4366, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 19.491525423728813, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0111", + "available": 1, + "doctype": 1, + "name": "Doctor's Memorable Codes", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 458, + "submissions": 1489, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.467427803895234, + "score": 0.2794759825327511, + "userScore": 0 + }, + { + "id": "0112", + "available": 1, + "doctype": 1, + "name": "A Milk Shop", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 849, + "submissions": 3196, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.66583229036296, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0113", + "available": 1, + "doctype": 1, + "name": "Period", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 456, + "submissions": 1211, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 42.93971924029727, + "score": 0.2807017543859649, + "userScore": 0 + }, + { + "id": "0114", + "available": 1, + "doctype": 1, + "name": "Electro-Fly", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 572, + "submissions": 1666, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.637454981992796, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0115", + "available": 1, + "doctype": 1, + "name": "Starship UAZ Advance", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 111, + "submissions": 946, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 21.45877378435518, + "score": 1.1531531531531531, + "userScore": 0 + }, + { + "id": "0116", + "available": 1, + "doctype": 1, + "name": "Rectangular Searching", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 403, + "submissions": 1144, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 45.80419580419581, + "score": 0.3176178660049628, + "userScore": 0 + }, + { + "id": "0117", + "available": 1, + "doctype": 1, + "name": "A reward for a Carpenter", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1138, + "submissions": 2454, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 62.71393643031785, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0118", + "available": 1, + "doctype": 1, + "name": "Property Distribution ", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1894, + "submissions": 11242, + "recommendations": 10, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 38.37395481231098, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0119", + "available": 3, + "doctype": 1, + "name": "Taro's Obsession", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 318, + "submissions": 707, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 52.192362093352195, + "score": 0.4025157232704403, + "userScore": 0 + }, + { + "id": "0120", + "available": 1, + "doctype": 1, + "name": "Patisserie", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 361, + "submissions": 1579, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.045598480050664, + "score": 0.3545706371191136, + "userScore": 0 + }, + { + "id": "0121", + "available": 1, + "doctype": 1, + "name": "Seven Puzzle", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1033, + "submissions": 6487, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.55202713118545, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0122", + "available": 1, + "doctype": 1, + "name": "Summer of Pyonkichi", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 448, + "submissions": 1218, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.53694581280788, + "score": 0.2857142857142857, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2021", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2021, + "progress": 0, + "numberOfProblems": 13, + "numberOfSolved": 0, + "days": [ + { + "id": 274, + "day": 1, + "title": "19th PC Koshien, Final", + "progress": 0, + "numberOfProblems": 13, + "numberOfSolved": 0, + "problems": [ + { + "id": "0466", + "available": 1, + "doctype": 4, + "name": "Rounding Division", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 225, + "submissions": 360, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 66.38888888888889, + "score": 0.5688888888888889, + "userScore": 0 + }, + { + "id": "0467", + "available": 1, + "doctype": 4, + "name": "Arithmetic and Geometric Germ", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 166, + "submissions": 367, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.22615803814714, + "score": 0.7710843373493976, + "userScore": 0 + }, + { + "id": "0468", + "available": 1, + "doctype": 4, + "name": "Sort Riddles", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 151, + "submissions": 225, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 70.66666666666667, + "score": 0.847682119205298, + "userScore": 0 + }, + { + "id": "0469", + "available": 1, + "doctype": 4, + "name": "Disaster Response Simulation", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 64, + "submissions": 387, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 18.34625322997416, + "score": 2, + "userScore": 0 + }, + { + "id": "0470", + "available": 1, + "doctype": 4, + "name": "Lottery", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 82, + "submissions": 213, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 40.84507042253521, + "score": 1.5609756097560976, + "userScore": 0 + }, + { + "id": "0471", + "available": 1, + "doctype": 4, + "name": "Whispering Game", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 39, + "submissions": 81, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.851851851851855, + "score": 3.282051282051282, + "userScore": 0 + }, + { + "id": "0472", + "available": 1, + "doctype": 4, + "name": "Placement Games", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 36, + "submissions": 111, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 35.13513513513514, + "score": 3.5555555555555554, + "userScore": 0 + }, + { + "id": "0473", + "available": 1, + "doctype": 4, + "name": "Star-shaped Pentagon", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 37, + "submissions": 111, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.03603603603604, + "score": 3.4594594594594597, + "userScore": 0 + }, + { + "id": "0474", + "available": 1, + "doctype": 4, + "name": "Moving Mass Game", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 14, + "submissions": 149, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 10.738255033557047, + "score": 9.142857142857142, + "userScore": 0 + }, + { + "id": "0475", + "available": 1, + "doctype": 4, + "name": "School Road", + "problemTimeLimit": 4, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 23, + "submissions": 146, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 23.28767123287671, + "score": 5.565217391304348, + "userScore": 0 + }, + { + "id": "0476", + "available": 1, + "doctype": 4, + "name": "Monster Koshien", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 21, + "submissions": 86, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 29.069767441860463, + "score": 6.095238095238095, + "userScore": 0 + }, + { + "id": "0477", + "available": 1, + "doctype": 4, + "name": "Square Factors", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 11, + "submissions": 127, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 8.661417322834646, + "score": 11.636363636363637, + "userScore": 0 + }, + { + "id": "0478", + "available": 1, + "doctype": 4, + "name": "Tree Keyboard", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 19, + "submissions": 147, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 21.768707482993197, + "score": 6.7368421052631575, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2017", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2017, + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "days": [ + { + "id": 211, + "day": 1, + "title": "15th PC Koshien, Final", + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "problems": [ + { + "id": "0368", + "available": 1, + "doctype": 4, + "name": "Flag", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 601, + "submissions": 1302, + "recommendations": 6, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 52.38095238095238, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0369", + "available": 2, + "doctype": 4, + "name": "Bange Hills Tower", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 255, + "submissions": 473, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 57.08245243128964, + "score": 0.5019607843137255, + "userScore": 0 + }, + { + "id": "0370", + "available": 1, + "doctype": 4, + "name": "Age Difference", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 278, + "submissions": 890, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 40.561797752808985, + "score": 0.460431654676259, + "userScore": 0 + }, + { + "id": "0371", + "available": 1, + "doctype": 4, + "name": "Electronic Metronome", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 204, + "submissions": 412, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 53.640776699029125, + "score": 0.6274509803921569, + "userScore": 0 + }, + { + "id": "0372", + "available": 1, + "doctype": 4, + "name": "Three Meals", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 107, + "submissions": 285, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 68.7719298245614, + "score": 1.1962616822429906, + "userScore": 0 + }, + { + "id": "0373", + "available": 1, + "doctype": 4, + "name": "Checkered Pattern", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 74, + "submissions": 209, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 41.6267942583732, + "score": 1.7297297297297298, + "userScore": 0 + }, + { + "id": "0374", + "available": 1, + "doctype": 4, + "name": "Paper Fortune", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 71, + "submissions": 247, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 40.08097165991903, + "score": 1.8028169014084507, + "userScore": 0 + }, + { + "id": "0375", + "available": 2, + "doctype": 4, + "name": "Lake Survey", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 37, + "submissions": 218, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 19.724770642201836, + "score": 3.4594594594594597, + "userScore": 0 + }, + { + "id": "0376", + "available": 1, + "doctype": 4, + "name": "Lottery Box", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 34, + "submissions": 184, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 21.73913043478261, + "score": 3.764705882352941, + "userScore": 0 + }, + { + "id": "0377", + "available": 1, + "doctype": 4, + "name": "Party", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 34, + "submissions": 225, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 17.333333333333332, + "score": 3.764705882352941, + "userScore": 0 + }, + { + "id": "0378", + "available": 1, + "doctype": 4, + "name": "Aerial Photo", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 18, + "submissions": 58, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.93103448275862, + "score": 7.111111111111111, + "userScore": 0 + }, + { + "id": "0379", + "available": 1, + "doctype": 4, + "name": "Iron Bars", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 10, + "submissions": 70, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 27.142857142857142, + "score": 12.8, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2011", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2011, + "progress": 0, + "numberOfProblems": 3, + "numberOfSolved": 0, + "days": [ + { + "id": 163, + "day": 1, + "title": "9th PC Koshien, Final", + "progress": 0, + "numberOfProblems": 3, + "numberOfSolved": 0, + "problems": [ + { + "id": "0251", + "available": 1, + "doctype": 1, + "name": "Magic Square", + "problemTimeLimit": 2, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 70, + "submissions": 224, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 40.625, + "score": 1.8285714285714285, + "userScore": 0 + }, + { + "id": "0253", + "available": 2, + "doctype": 1, + "name": "Ant Nest", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 48, + "submissions": 299, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 26.08695652173913, + "score": 2.6666666666666665, + "userScore": 0 + }, + { + "id": "0254", + "available": 1, + "doctype": 1, + "name": "Scone", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 65, + "submissions": 390, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 23.333333333333332, + "score": 1.9692307692307693, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2006", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2006, + "progress": 0, + "numberOfProblems": 15, + "numberOfSolved": 0, + "days": [ + { + "id": 7, + "day": 1, + "title": "4th PC Koshien, Final", + "progress": 0, + "numberOfProblems": 15, + "numberOfSolved": 0, + "problems": [ + { + "id": "0133", + "available": 1, + "doctype": 1, + "name": "Rotation of a Pattern", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 658, + "submissions": 1233, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 60.09732360097323, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0134", + "available": 1, + "doctype": 1, + "name": "Exit Survey", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 770, + "submissions": 1731, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.357596764875794, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0135", + "available": 1, + "doctype": 1, + "name": "Clock Short Hand and Long Hand", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 514, + "submissions": 1967, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.859176410777835, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0136", + "available": 1, + "doctype": 1, + "name": "Frequency Distribution of Height", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1064, + "submissions": 1520, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 79.01315789473684, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0137", + "available": 1, + "doctype": 1, + "name": "Middle-Square Method", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 715, + "submissions": 1041, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 75.21613832853026, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0138", + "available": 1, + "doctype": 1, + "name": "Track and Field Competition", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 752, + "submissions": 1277, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 70.32106499608457, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0139", + "available": 1, + "doctype": 1, + "name": "Snakes", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 598, + "submissions": 2081, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.00144161460836, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0140", + "available": 1, + "doctype": 1, + "name": "Bus Line", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 482, + "submissions": 1329, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 41.98645598194131, + "score": 0.26556016597510373, + "userScore": 0 + }, + { + "id": "0141", + "available": 1, + "doctype": 1, + "name": "Spiral Pattern", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 368, + "submissions": 1021, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 41.234084231145935, + "score": 0.34782608695652173, + "userScore": 0 + }, + { + "id": "0142", + "available": 1, + "doctype": 1, + "name": "Nature of Prime Numbers", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 312, + "submissions": 936, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 46.58119658119658, + "score": 0.41025641025641024, + "userScore": 0 + }, + { + "id": "0143", + "available": 1, + "doctype": 1, + "name": "Altair and Vega", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 344, + "submissions": 783, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 62.19667943805875, + "score": 0.37209302325581395, + "userScore": 0 + }, + { + "id": "0144", + "available": 1, + "doctype": 1, + "name": "Packet Transportation", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 470, + "submissions": 1476, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.173441734417345, + "score": 0.2723404255319149, + "userScore": 0 + }, + { + "id": "0145", + "available": 1, + "doctype": 1, + "name": "Cards", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 283, + "submissions": 690, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.2463768115942, + "score": 0.45229681978798586, + "userScore": 0 + }, + { + "id": "0146", + "available": 1, + "doctype": 1, + "name": "Lupin The 4th", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 264, + "submissions": 946, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.315010570824526, + "score": 0.48484848484848486, + "userScore": 0 + }, + { + "id": "0147", + "available": 1, + "doctype": 1, + "name": "Fukushimaken", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 258, + "submissions": 1084, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.35793357933579, + "score": 0.49612403100775193, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2010", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2010, + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "days": [ + { + "id": 15, + "day": 1, + "title": "8th PC Koshien, Final", + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "problems": [ + { + "id": "0226", + "available": 1, + "doctype": 1, + "name": "Hit and Blow", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 864, + "submissions": 1331, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 79.18858001502629, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0227", + "available": 1, + "doctype": 1, + "name": "Thanksgiving", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 734, + "submissions": 1576, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 63.19796954314721, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0228", + "available": 1, + "doctype": 1, + "name": "Seven Segments", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 607, + "submissions": 1076, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 67.00743494423791, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0229", + "available": 1, + "doctype": 1, + "name": "Big Hit !", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 521, + "submissions": 718, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 87.1866295264624, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0230", + "available": 1, + "doctype": 1, + "name": "Ninja Climbing", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 243, + "submissions": 1120, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.303571428571427, + "score": 0.5267489711934157, + "userScore": 0 + }, + { + "id": "0231", + "available": 1, + "doctype": 1, + "name": "Dangerous Bridge", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 407, + "submissions": 1383, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.44251626898048, + "score": 0.3144963144963145, + "userScore": 0 + }, + { + "id": "0232", + "available": 1, + "doctype": 1, + "name": "Life Game", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 244, + "submissions": 1448, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25.414364640883978, + "score": 0.5245901639344263, + "userScore": 0 + }, + { + "id": "0233", + "available": 1, + "doctype": 1, + "name": "Book Arrangement", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 240, + "submissions": 614, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.1628664495114, + "score": 0.5333333333333333, + "userScore": 0 + }, + { + "id": "0234", + "available": 1, + "doctype": 1, + "name": "Aizu Buried Treasure", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 133, + "submissions": 1304, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 20.39877300613497, + "score": 0.9624060150375939, + "userScore": 0 + }, + { + "id": "0235", + "available": 1, + "doctype": 1, + "name": "Sergeant Rian", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 226, + "submissions": 884, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 31.67420814479638, + "score": 0.5663716814159292, + "userScore": 0 + }, + { + "id": "0236", + "available": 1, + "doctype": 1, + "name": "Alien Messages", + "problemTimeLimit": 5, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 78, + "submissions": 1093, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 18.847209515096065, + "score": 1.641025641025641, + "userScore": 0 + }, + { + "id": "0237", + "available": 1, + "doctype": 1, + "name": "The Last Door", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 52, + "submissions": 608, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 13.980263157894736, + "score": 2.4615384615384617, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2004", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2004, + "progress": 0, + "numberOfProblems": 30, + "numberOfSolved": 0, + "days": [ + { + "id": 3, + "day": 1, + "title": "2nd PC Koshien, Final", + "progress": 0, + "numberOfProblems": 30, + "numberOfSolved": 0, + "problems": [ + { + "id": "0044", + "available": 1, + "doctype": 1, + "name": "Prime Number II", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1462, + "submissions": 3544, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.36681715575621, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0045", + "available": 1, + "doctype": 1, + "name": "Sum and Average", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1584, + "submissions": 3741, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.30740443731622, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0046", + "available": 2, + "doctype": 1, + "name": "Differential", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 2004, + "submissions": 3098, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 73.49903163331182, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0047", + "available": 1, + "doctype": 1, + "name": "Cup Game", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1649, + "submissions": 3160, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 59.74683544303797, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0048", + "available": 1, + "doctype": 1, + "name": "Class", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1653, + "submissions": 2902, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 67.7119228118539, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0049", + "available": 1, + "doctype": 1, + "name": "Blood Groups", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1613, + "submissions": 2758, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 68.20159535895577, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0050", + "available": 1, + "doctype": 1, + "name": "Apple and Peach", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1494, + "submissions": 4166, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.87902064330293, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0051", + "available": 1, + "doctype": 1, + "name": "Differential II", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1515, + "submissions": 2303, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 73.2957012592271, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0052", + "available": 1, + "doctype": 1, + "name": "Factorial II", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1565, + "submissions": 3305, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 64.81089258698941, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0053", + "available": 1, + "doctype": 1, + "name": "Sum of Prime Numbers", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1326, + "submissions": 3357, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 48.168007149240395, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0054", + "available": 1, + "doctype": 1, + "name": "Sum of Nth decimal places", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1035, + "submissions": 3489, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.11349957007739, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0055", + "available": 2, + "doctype": 1, + "name": "Sequence", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1370, + "submissions": 2553, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 64.66901684292989, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0056", + "available": 1, + "doctype": 1, + "name": "Goldbach's Conjecture", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1084, + "submissions": 5282, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.75274517228323, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0057", + "available": 1, + "doctype": 1, + "name": "The Number of Area", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1400, + "submissions": 2128, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 75.89285714285714, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0058", + "available": 1, + "doctype": 1, + "name": "Orthogonal", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 921, + "submissions": 3463, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.13976321108865, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0059", + "available": 1, + "doctype": 1, + "name": "Intersection of Rectangles", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 829, + "submissions": 2364, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 40.947546531302876, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0060", + "available": 1, + "doctype": 1, + "name": "Card Game", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1101, + "submissions": 2365, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 55.13742071881607, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0061", + "available": 1, + "doctype": 1, + "name": "Rank Checker", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 986, + "submissions": 1805, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 64.48753462603878, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0062", + "available": 1, + "doctype": 1, + "name": "What is the Bottommost?", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1270, + "submissions": 2075, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 70.4578313253012, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0063", + "available": 1, + "doctype": 1, + "name": "Palindrome", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1419, + "submissions": 2322, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 69.07838070628769, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0064", + "available": 1, + "doctype": 1, + "name": "Secret Number", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1102, + "submissions": 2775, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 46.5945945945946, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0065", + "available": 1, + "doctype": 1, + "name": "Trading", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 801, + "submissions": 1918, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 48.644421272158496, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0066", + "available": 1, + "doctype": 1, + "name": "Tic Tac Toe", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1016, + "submissions": 2432, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 48.23190789473684, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0067", + "available": 1, + "doctype": 1, + "name": "The Number of Island", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1227, + "submissions": 3250, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.323076923076925, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0068", + "available": 1, + "doctype": 1, + "name": "Enclose Pins with a Rubber Band", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 596, + "submissions": 1458, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 64.06035665294925, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0069", + "available": 1, + "doctype": 1, + "name": "Drawing Lots II", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 477, + "submissions": 1643, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 34.69263542300669, + "score": 0.26834381551362685, + "userScore": 0 + }, + { + "id": "0070", + "available": 1, + "doctype": 1, + "name": "Combination of Number Sequences", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 557, + "submissions": 4426, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 20.989606868504293, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0071", + "available": 1, + "doctype": 1, + "name": "Bombs Chain", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 962, + "submissions": 2044, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 59.73581213307241, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0072", + "available": 1, + "doctype": 1, + "name": "Carden Lantern", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 689, + "submissions": 2072, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 46.91119691119691, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0097", + "available": 1, + "doctype": 1, + "name": "Sum of Integers II", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 428, + "submissions": 1993, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 27.99799297541395, + "score": 0.29906542056074764, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2016", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2016, + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "days": [ + { + "id": 189, + "day": 1, + "title": "14th PC Koshien, Final", + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "problems": [ + { + "id": "0345", + "available": 1, + "doctype": 1, + "name": "Rectangle", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 834, + "submissions": 1455, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 65.15463917525773, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0346", + "available": 1, + "doctype": 1, + "name": "Cuboid Made with Bars", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 426, + "submissions": 831, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 59.80746089049338, + "score": 0.3004694835680751, + "userScore": 0 + }, + { + "id": "0347", + "available": 2, + "doctype": 1, + "name": "Maximization of Rational Expression", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 262, + "submissions": 619, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 48.46526655896607, + "score": 0.48854961832061067, + "userScore": 0 + }, + { + "id": "0348", + "available": 1, + "doctype": 1, + "name": "Sevens", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 157, + "submissions": 272, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 69.11764705882354, + "score": 0.8152866242038217, + "userScore": 0 + }, + { + "id": "0349", + "available": 1, + "doctype": 1, + "name": "Cyclic Sugoroku", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 127, + "submissions": 321, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 46.10591900311527, + "score": 1.0078740157480315, + "userScore": 0 + }, + { + "id": "0350", + "available": 1, + "doctype": 1, + "name": "Irreducible Fractionalization", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 147, + "submissions": 265, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 63.39622641509434, + "score": 0.8707482993197279, + "userScore": 0 + }, + { + "id": "0351", + "available": 1, + "doctype": 1, + "name": "Quiet Town", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 118, + "submissions": 426, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 41.07981220657277, + "score": 1.0847457627118644, + "userScore": 0 + }, + { + "id": "0352", + "available": 1, + "doctype": 1, + "name": "Forecast of Forces", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 95, + "submissions": 238, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.05882352941177, + "score": 1.3473684210526315, + "userScore": 0 + }, + { + "id": "0353", + "available": 1, + "doctype": 1, + "name": "Sort", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 47, + "submissions": 425, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 13.176470588235293, + "score": 2.723404255319149, + "userScore": 0 + }, + { + "id": "0354", + "available": 1, + "doctype": 1, + "name": "Ant", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 41, + "submissions": 121, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.36363636363637, + "score": 3.1219512195121952, + "userScore": 0 + }, + { + "id": "0355", + "available": 1, + "doctype": 1, + "name": "String Game", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 36, + "submissions": 155, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.322580645161292, + "score": 3.5555555555555554, + "userScore": 0 + }, + { + "id": "0356", + "available": 2, + "doctype": 1, + "name": "Evening", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 25, + "submissions": 151, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25.827814569536425, + "score": 5.12, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2019", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2019, + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "days": [ + { + "id": 247, + "day": 1, + "title": "17th PC Koshien, Final", + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "problems": [ + { + "id": "0416", + "available": 2, + "doctype": 4, + "name": "Stop Watch without Tick Mark", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 533, + "submissions": 1075, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 57.86046511627907, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0417", + "available": 1, + "doctype": 4, + "name": "Gas Station", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 330, + "submissions": 892, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 53.587443946188344, + "score": 0.3878787878787879, + "userScore": 0 + }, + { + "id": "0418", + "available": 1, + "doctype": 4, + "name": "Laver", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 253, + "submissions": 1082, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 35.67467652495379, + "score": 0.5059288537549407, + "userScore": 0 + }, + { + "id": "0419", + "available": 1, + "doctype": 4, + "name": "Molting ", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 227, + "submissions": 409, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 63.56968215158924, + "score": 0.5638766519823789, + "userScore": 0 + }, + { + "id": "0420", + "available": 1, + "doctype": 4, + "name": "Digits K", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 80, + "submissions": 303, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.382838283828384, + "score": 1.6, + "userScore": 0 + }, + { + "id": "0421", + "available": 1, + "doctype": 4, + "name": "Two Polygons", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 47, + "submissions": 112, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.75, + "score": 2.723404255319149, + "userScore": 0 + }, + { + "id": "0422", + "available": 1, + "doctype": 4, + "name": "Bug", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 36, + "submissions": 65, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 60, + "score": 3.5555555555555554, + "userScore": 0 + }, + { + "id": "0423", + "available": 1, + "doctype": 4, + "name": "Gym with Many Rules", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 48, + "submissions": 374, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 21.390374331550802, + "score": 2.6666666666666665, + "userScore": 0 + }, + { + "id": "0424", + "available": 1, + "doctype": 4, + "name": "Into the Wild", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 30, + "submissions": 71, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 46.478873239436616, + "score": 4.266666666666667, + "userScore": 0 + }, + { + "id": "0425", + "available": 1, + "doctype": 4, + "name": "Chemical Substance Alpha", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 37, + "submissions": 120, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.166666666666664, + "score": 3.4594594594594597, + "userScore": 0 + }, + { + "id": "0426", + "available": 1, + "doctype": 4, + "name": "Sum of the Number of Triangles", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 22, + "submissions": 113, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 23.893805309734514, + "score": 5.818181818181818, + "userScore": 0 + }, + { + "id": "0427", + "available": 1, + "doctype": 4, + "name": "Resource of the Planet Yanaizu", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 22, + "submissions": 70, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.142857142857146, + "score": 5.818181818181818, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2012", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2012, + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "days": [ + { + "id": 132, + "day": 1, + "title": "10th PC Koshien, Final", + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "problems": [ + { + "id": "0266", + "available": 1, + "doctype": 1, + "name": "Aka-beko and 40 Thieves", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 531, + "submissions": 891, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 70.14590347923681, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0267", + "available": 1, + "doctype": 1, + "name": "Triangle of Blocks", + "problemTimeLimit": 5, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 379, + "submissions": 834, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 58.752997601918466, + "score": 0.33773087071240104, + "userScore": 0 + }, + { + "id": "0268", + "available": 1, + "doctype": 1, + "name": "Kongo Type", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 215, + "submissions": 669, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 38.2660687593423, + "score": 0.5953488372093023, + "userScore": 0 + }, + { + "id": "0269", + "available": 1, + "doctype": 1, + "name": "East Wind", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 104, + "submissions": 380, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.05263157894737, + "score": 1.2307692307692308, + "userScore": 0 + }, + { + "id": "0270", + "available": 1, + "doctype": 1, + "name": "Modular Query", + "problemTimeLimit": 3, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 296, + "submissions": 1075, + "recommendations": 4, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 38.97674418604651, + "score": 0.43243243243243246, + "userScore": 0 + }, + { + "id": "0271", + "available": 1, + "doctype": 1, + "name": "Izua Dictionary", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 133, + "submissions": 855, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 35.67251461988304, + "score": 0.9624060150375939, + "userScore": 0 + }, + { + "id": "0272", + "available": 1, + "doctype": 1, + "name": "The Lonely Girl's Lie", + "problemTimeLimit": 2, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 129, + "submissions": 665, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25.86466165413534, + "score": 0.9922480620155039, + "userScore": 0 + }, + { + "id": "0273", + "available": 1, + "doctype": 1, + "name": "Cats Going Straight II", + "problemTimeLimit": 2, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 73, + "submissions": 357, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 35.57422969187675, + "score": 1.7534246575342465, + "userScore": 0 + }, + { + "id": "0274", + "available": 1, + "doctype": 1, + "name": "Arts and Crafts", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 37, + "submissions": 117, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.44444444444444, + "score": 3.4594594594594597, + "userScore": 0 + }, + { + "id": "0275", + "available": 1, + "doctype": 1, + "name": "Railroad", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 48, + "submissions": 359, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25.069637883008358, + "score": 2.6666666666666665, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2008", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2008, + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "days": [ + { + "id": 11, + "day": 1, + "title": "6th PC Koshien, Final", + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "problems": [ + { + "id": "0183", + "available": 1, + "doctype": 1, + "name": "Black-and-White", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 472, + "submissions": 1061, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.36663524976437, + "score": 0.2711864406779661, + "userScore": 0 + }, + { + "id": "0184", + "available": 1, + "doctype": 1, + "name": "Tsuruga Castle", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 771, + "submissions": 1420, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 70, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0185", + "available": 1, + "doctype": 1, + "name": "Goldbach's Conjecture II", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 534, + "submissions": 1052, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 62.547528517110266, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0186", + "available": 1, + "doctype": 1, + "name": "Aizu Chicken", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 355, + "submissions": 935, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 45.3475935828877, + "score": 0.36056338028169016, + "userScore": 0 + }, + { + "id": "0187", + "available": 1, + "doctype": 1, + "name": "Stoning Fortune", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 171, + "submissions": 787, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 29.479034307496825, + "score": 0.7485380116959064, + "userScore": 0 + }, + { + "id": "0188", + "available": 1, + "doctype": 1, + "name": "Search", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 525, + "submissions": 1818, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 34.81848184818482, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0189", + "available": 1, + "doctype": 1, + "name": "Convenient Location", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1120, + "submissions": 4434, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 52.72891294542174, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0190", + "available": 1, + "doctype": 1, + "name": "Eleven Puzzle", + "problemTimeLimit": 5, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 156, + "submissions": 983, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.8911495422177, + "score": 0.8205128205128205, + "userScore": 0 + }, + { + "id": "0191", + "available": 1, + "doctype": 1, + "name": "Baby Tree", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 351, + "submissions": 1631, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 39.30104230533415, + "score": 0.3646723646723647, + "userScore": 0 + }, + { + "id": "0192", + "available": 1, + "doctype": 1, + "name": "Multistory Parking Lot", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 102, + "submissions": 457, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.822757111597376, + "score": 1.2549019607843137, + "userScore": 0 + }, + { + "id": "0193", + "available": 1, + "doctype": 1, + "name": "Convenience Store", + "problemTimeLimit": 5, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 159, + "submissions": 692, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.369942196531795, + "score": 0.8050314465408805, + "userScore": 0 + }, + { + "id": "0194", + "available": 1, + "doctype": 1, + "name": "Delivery Company", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 79, + "submissions": 575, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 21.217391304347824, + "score": 1.620253164556962, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2023", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2023, + "progress": 0, + "numberOfProblems": 13, + "numberOfSolved": 0, + "days": [ + { + "id": 312, + "day": 1, + "title": "21st PC Koshien, Final", + "progress": 0, + "numberOfProblems": 13, + "numberOfSolved": 0, + "problems": [ + { + "id": "4023", + "available": 1, + "doctype": 1, + "name": "Waffle with Holes", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 121, + "submissions": 170, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 79.41176470588235, + "score": 1.0578512396694215, + "userScore": 0 + }, + { + "id": "4024", + "available": 1, + "doctype": 1, + "name": "Fudge My Age", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 84, + "submissions": 136, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 64.70588235294117, + "score": 1.5238095238095237, + "userScore": 0 + }, + { + "id": "4025", + "available": 1, + "doctype": 1, + "name": "Settle a Village", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 55, + "submissions": 105, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 60.95238095238095, + "score": 2.327272727272727, + "userScore": 0 + }, + { + "id": "4026", + "available": 1, + "doctype": 1, + "name": "Roll Cake", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 45, + "submissions": 122, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 39.34426229508197, + "score": 2.8444444444444446, + "userScore": 0 + }, + { + "id": "4027", + "available": 1, + "doctype": 1, + "name": "9 Numbers", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 40, + "submissions": 212, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 22.641509433962263, + "score": 3.2, + "userScore": 0 + }, + { + "id": "4028", + "available": 1, + "doctype": 1, + "name": "Secret Pleasure", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 29, + "submissions": 64, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 56.25, + "score": 4.413793103448276, + "userScore": 0 + }, + { + "id": "4029", + "available": 1, + "doctype": 1, + "name": "Predicting Rankings", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 11, + "submissions": 86, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 13.953488372093023, + "score": 11.636363636363637, + "userScore": 0 + }, + { + "id": "4030", + "available": 1, + "doctype": 1, + "name": "Jobo City", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 17, + "submissions": 334, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 5.688622754491018, + "score": 7.529411764705882, + "userScore": 0 + }, + { + "id": "4031", + "available": 2, + "doctype": 1, + "name": "Chain Maze", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 8, + "submissions": 81, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 12.345679012345679, + "score": 16, + "userScore": 0 + }, + { + "id": "4032", + "available": 1, + "doctype": 1, + "name": "A Casting Net", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 18, + "submissions": 42, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50, + "score": 7.111111111111111, + "userScore": 0 + }, + { + "id": "4033", + "available": 1, + "doctype": 1, + "name": "Skewered Dumplings", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 17, + "submissions": 109, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 18.34862385321101, + "score": 7.529411764705882, + "userScore": 0 + }, + { + "id": "4034", + "available": 1, + "doctype": 1, + "name": "Looking for Constellations", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 5, + "submissions": 52, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 23.076923076923077, + "score": 16, + "userScore": 0 + }, + { + "id": "4035", + "available": 1, + "doctype": 1, + "name": "Deleting Points", + "problemTimeLimit": 5, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 9, + "submissions": 87, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 24.137931034482758, + "score": 14.222222222222221, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2003", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2003, + "progress": 0, + "numberOfProblems": 29, + "numberOfSolved": 0, + "days": [ + { + "id": 1, + "day": 1, + "title": "1st PC Koshien, Final", + "progress": 0, + "numberOfProblems": 29, + "numberOfSolved": 0, + "problems": [ + { + "id": "0000", + "available": 1, + "doctype": 4, + "name": "QQ", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 15113, + "submissions": 41812, + "recommendations": 5, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 56.99799100736631, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0001", + "available": 1, + "doctype": 4, + "name": "List of Top 3 Hills", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 10928, + "submissions": 33200, + "recommendations": 8, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.3644578313253, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0002", + "available": 1, + "doctype": 4, + "name": "Digit Number", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 8629, + "submissions": 31844, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 39.80341665619897, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0003", + "available": 1, + "doctype": 4, + "name": "Is it a Right Triangle?", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 8359, + "submissions": 24771, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 48.33474627588713, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0004", + "available": 1, + "doctype": 4, + "name": "Simultaneous Equation", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 5367, + "submissions": 28919, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25.581797434212803, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0005", + "available": 1, + "doctype": 4, + "name": "GCD and LCM", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 6180, + "submissions": 22680, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 45.648148148148145, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0006", + "available": 1, + "doctype": 4, + "name": "Reverse Sequence", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 6420, + "submissions": 17053, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.114349381340524, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0007", + "available": 1, + "doctype": 4, + "name": "Debt Hell", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 5881, + "submissions": 14264, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.25238362310712, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0008", + "available": 1, + "doctype": 4, + "name": "Sum of 4 Integers", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 5416, + "submissions": 11952, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 59.38755020080321, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0009", + "available": 1, + "doctype": 4, + "name": "Prime Number", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 5031, + "submissions": 32923, + "recommendations": 9, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.912918020836496, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0010", + "available": 1, + "doctype": 4, + "name": "Circumscribed Circle of a Triangle", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 2210, + "submissions": 7859, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 35.818806463926705, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0011", + "available": 1, + "doctype": 4, + "name": "Drawing Lots", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 4684, + "submissions": 8521, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 66.64710714704847, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0012", + "available": 1, + "doctype": 4, + "name": "A Point in a Triangle", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 2230, + "submissions": 7002, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 41.830905455584116, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0013", + "available": 1, + "doctype": 4, + "name": "Switching Railroad Cars", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 3620, + "submissions": 8141, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 56.02505834664046, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0014", + "available": 1, + "doctype": 4, + "name": "Integral", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 3398, + "submissions": 5370, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 73.20297951582867, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0015", + "available": 1, + "doctype": 4, + "name": "National Budget", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 2299, + "submissions": 11505, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 26.814428509343763, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0016", + "available": 1, + "doctype": 4, + "name": "Treasure Hunt", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 2174, + "submissions": 4780, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 54.05857740585774, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0017", + "available": 1, + "doctype": 4, + "name": "Caesar Cipher", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 2052, + "submissions": 11443, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25.82364764484838, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0018", + "available": 1, + "doctype": 4, + "name": "Sorting Five Numbers", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 3204, + "submissions": 8851, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 45.04575754152073, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0019", + "available": 1, + "doctype": 4, + "name": "Factorial", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 3290, + "submissions": 11542, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 42.61826373245538, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0020", + "available": 1, + "doctype": 4, + "name": "Capitalize", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 3117, + "submissions": 6605, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 59.909159727479185, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0021", + "available": 1, + "doctype": 4, + "name": "Parallelism", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 2308, + "submissions": 15189, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 19.92889591151491, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0022", + "available": 1, + "doctype": 4, + "name": "Maximum Sum Sequence", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 2289, + "submissions": 10102, + "recommendations": 4, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.627598495347456, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0023", + "available": 1, + "doctype": 4, + "name": "Circles Intersection", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1708, + "submissions": 5947, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.11905162266689, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0024", + "available": 1, + "doctype": 4, + "name": "Physical Experiments", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 2111, + "submissions": 4530, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 55.71743929359823, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0025", + "available": 1, + "doctype": 4, + "name": "Hit and Blow", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 2688, + "submissions": 5851, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 55.46060502478209, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0026", + "available": 1, + "doctype": 4, + "name": "Dropping Ink", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1964, + "submissions": 5194, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.67038891028109, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0096", + "available": 1, + "doctype": 1, + "name": "Sum of 4 Integers II", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 589, + "submissions": 2280, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 35.921052631578945, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0098", + "available": 1, + "doctype": 1, + "name": "Maximum Sum Sequence II", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 434, + "submissions": 1259, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 41.62033359809372, + "score": 0.29493087557603687, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2018", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2018, + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "days": [ + { + "id": 228, + "day": 1, + "title": "16th PC Koshien, Final", + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "problems": [ + { + "id": "0392", + "available": 1, + "doctype": 4, + "name": "Party Dress", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 572, + "submissions": 1488, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 45.094086021505376, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0393", + "available": 1, + "doctype": 4, + "name": "Design of a Mansion", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 434, + "submissions": 616, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 77.1103896103896, + "score": 0.29493087557603687, + "userScore": 0 + }, + { + "id": "0394", + "available": 1, + "doctype": 4, + "name": "Pilling Blocks", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 221, + "submissions": 527, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 46.86907020872865, + "score": 0.579185520361991, + "userScore": 0 + }, + { + "id": "0395", + "available": 1, + "doctype": 4, + "name": "A Round Table for Sages", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 246, + "submissions": 386, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 74.35233160621762, + "score": 0.5203252032520326, + "userScore": 0 + }, + { + "id": "0396", + "available": 1, + "doctype": 4, + "name": "Treasure Map", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 151, + "submissions": 544, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.213235294117645, + "score": 0.847682119205298, + "userScore": 0 + }, + { + "id": "0397", + "available": 1, + "doctype": 4, + "name": "Common-Prime Sort", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 99, + "submissions": 248, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 45.16129032258065, + "score": 1.292929292929293, + "userScore": 0 + }, + { + "id": "0398", + "available": 1, + "doctype": 4, + "name": "Beautiful Sequence", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 88, + "submissions": 247, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 45.34412955465587, + "score": 1.4545454545454546, + "userScore": 0 + }, + { + "id": "0399", + "available": 1, + "doctype": 4, + "name": "Payroll", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 39, + "submissions": 154, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.571428571428573, + "score": 3.282051282051282, + "userScore": 0 + }, + { + "id": "0400", + "available": 1, + "doctype": 4, + "name": "Maze and Items", + "problemTimeLimit": 4, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 33, + "submissions": 189, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 34.92063492063492, + "score": 3.878787878787879, + "userScore": 0 + }, + { + "id": "0401", + "available": 1, + "doctype": 4, + "name": "Playing With Stones", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 192, + "submissions": 417, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 52.75779376498801, + "score": 0.6666666666666666, + "userScore": 0 + }, + { + "id": "0402", + "available": 1, + "doctype": 4, + "name": "Kth XOR", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 39, + "submissions": 120, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 39.166666666666664, + "score": 3.282051282051282, + "userScore": 0 + }, + { + "id": "0403", + "available": 1, + "doctype": 4, + "name": "Road Construction", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 29, + "submissions": 558, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 6.451612903225806, + "score": 4.413793103448276, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKFinal2022", + "largeCl": "PCK", + "middleCl": "Final", + "year": 2022, + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "days": [ + { + "id": 295, + "day": 1, + "title": "20th PC Koshien, Final", + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "problems": [ + { + "id": "4000", + "available": 1, + "doctype": 1, + "name": "Table Tennis", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 243, + "submissions": 351, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 74.64387464387464, + "score": 0.5267489711934157, + "userScore": 0 + }, + { + "id": "4001", + "available": 1, + "doctype": 1, + "name": "Beko Ranger Card", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 168, + "submissions": 483, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.68115942028985, + "score": 0.7619047619047619, + "userScore": 0 + }, + { + "id": "4002", + "available": 1, + "doctype": 1, + "name": "Cuboid Boat", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 127, + "submissions": 194, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 70.61855670103093, + "score": 1.0078740157480315, + "userScore": 0 + }, + { + "id": "4003", + "available": 1, + "doctype": 1, + "name": "Connection of Arithmetic Units", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 69, + "submissions": 360, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 21.38888888888889, + "score": 1.855072463768116, + "userScore": 0 + }, + { + "id": "4004", + "available": 1, + "doctype": 1, + "name": "Mud Dumpling", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 62, + "submissions": 111, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 66.66666666666667, + "score": 2.064516129032258, + "userScore": 0 + }, + { + "id": "4005", + "available": 1, + "doctype": 1, + "name": "One-Stroke Sketch", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 38, + "submissions": 72, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 62.5, + "score": 3.3684210526315788, + "userScore": 0 + }, + { + "id": "4006", + "available": 1, + "doctype": 1, + "name": "Sequence of Prime Number Days", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 13, + "submissions": 39, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.58974358974359, + "score": 9.846153846153847, + "userScore": 0 + }, + { + "id": "4007", + "available": 1, + "doctype": 1, + "name": "Game Book", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 30, + "submissions": 45, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 80, + "score": 4.266666666666667, + "userScore": 0 + }, + { + "id": "4008", + "available": 1, + "doctype": 1, + "name": "Size of Territory", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 20, + "submissions": 140, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 23.571428571428573, + "score": 6.4, + "userScore": 0 + }, + { + "id": "4009", + "available": 1, + "doctype": 1, + "name": "Restoring a Sequence", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 28, + "submissions": 211, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 14.218009478672986, + "score": 4.571428571428571, + "userScore": 0 + }, + { + "id": "4010", + "available": 1, + "doctype": 1, + "name": "N Sequences", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 13, + "submissions": 100, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 22, + "score": 9.846153846153847, + "userScore": 0 + }, + { + "id": "4011", + "available": 1, + "doctype": 1, + "name": "Triangle Puzzle", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 5, + "submissions": 29, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 31.03448275862069, + "score": 16, + "userScore": 0 + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/lib/clients/fixtures/aizu_online_judge/challenges/pck_prelim/contests.json b/src/lib/clients/fixtures/aizu_online_judge/challenges/pck_prelim/contests.json new file mode 100644 index 000000000..52a6eacfb --- /dev/null +++ b/src/lib/clients/fixtures/aizu_online_judge/challenges/pck_prelim/contests.json @@ -0,0 +1,4999 @@ +{ + "largeCl": { + "id": "PCK", + "title": "All-Japan High School Programming Contest", + "filter": [ + { + "label": "Prelim", + "value": "prelim" + }, + { + "label": "Final", + "value": "final" + } + ], + "middleCls": null + }, + "contests": [ + { + "abbr": "PCKPrelim2008", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2008, + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "days": [ + { + "id": 10, + "day": 1, + "title": "6th PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "problems": [ + { + "id": "0173", + "available": 1, + "doctype": 1, + "name": "Haunted House", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1089, + "submissions": 1637, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 74.70983506414173, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0174", + "available": 1, + "doctype": 1, + "name": "Badminton", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 774, + "submissions": 1282, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 70.4368174726989, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0175", + "available": 1, + "doctype": 1, + "name": "Quaternary Notation", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 731, + "submissions": 1224, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 69.36274509803921, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0176", + "available": 1, + "doctype": 1, + "name": "What Color?", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 518, + "submissions": 935, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 68.23529411764706, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0177", + "available": 1, + "doctype": 1, + "name": "Distance Between Two Cities", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 278, + "submissions": 500, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 66, + "score": 0.460431654676259, + "userScore": 0 + }, + { + "id": "0178", + "available": 1, + "doctype": 1, + "name": "TETORIS", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 230, + "submissions": 769, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 41.612483745123534, + "score": 0.5565217391304348, + "userScore": 0 + }, + { + "id": "0179", + "available": 1, + "doctype": 1, + "name": "Mysterious Worm", + "problemTimeLimit": 5, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 519, + "submissions": 1341, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 58.38926174496644, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0180", + "available": 1, + "doctype": 1, + "name": "Demolition of Bridges", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 584, + "submissions": 1100, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 68.54545454545455, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0181", + "available": 1, + "doctype": 1, + "name": "Bookshelf", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 443, + "submissions": 1115, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 52.01793721973094, + "score": 0.28893905191873587, + "userScore": 0 + }, + { + "id": "0182", + "available": 1, + "doctype": 1, + "name": "Beaker", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 63, + "submissions": 624, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 15.224358974358974, + "score": 2.0317460317460316, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2016", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2016, + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "days": [ + { + "id": 197, + "day": 1, + "title": "14th PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "problems": [ + { + "id": "0335", + "available": 1, + "doctype": 4, + "name": "Word", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 2385, + "submissions": 3765, + "recommendations": 11, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 75.45816733067728, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0336", + "available": 1, + "doctype": 4, + "name": "Sunrise and Sunset", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 969, + "submissions": 1944, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 56.79012345679013, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0337", + "available": 1, + "doctype": 4, + "name": "Japanese Calendar", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 699, + "submissions": 1398, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 55.07868383404864, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0338", + "available": 1, + "doctype": 4, + "name": "New Town", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 644, + "submissions": 1188, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 60.69023569023569, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0339", + "available": 1, + "doctype": 4, + "name": "Geometric Data", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 482, + "submissions": 1016, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 55.511811023622045, + "score": 0.26556016597510373, + "userScore": 0 + }, + { + "id": "0340", + "available": 1, + "doctype": 4, + "name": "Pancake", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 354, + "submissions": 1686, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 26.749703440094898, + "score": 0.3615819209039548, + "userScore": 0 + }, + { + "id": "0341", + "available": 1, + "doctype": 4, + "name": "Repeated Spell", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 257, + "submissions": 495, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 61.81818181818182, + "score": 0.4980544747081712, + "userScore": 0 + }, + { + "id": "0342", + "available": 2, + "doctype": 4, + "name": "Road Planning", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 111, + "submissions": 255, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 55.68627450980392, + "score": 1.1531531531531531, + "userScore": 0 + }, + { + "id": "0343", + "available": 1, + "doctype": 4, + "name": "Programming Contest II", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 99, + "submissions": 332, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.373493975903614, + "score": 1.292929292929293, + "userScore": 0 + }, + { + "id": "0344", + "available": 1, + "doctype": 4, + "name": "Game Strategy", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 48, + "submissions": 237, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25.738396624472575, + "score": 2.6666666666666665, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2011", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2011, + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "days": [ + { + "id": 117, + "day": 1, + "title": "9th PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "problems": [ + { + "id": "0238", + "available": 1, + "doctype": 1, + "name": "Time to Study", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1008, + "submissions": 1881, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 62.78575225943647, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0239", + "available": 1, + "doctype": 1, + "name": "Calorie Counting", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 614, + "submissions": 1540, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.467532467532465, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0240", + "available": 1, + "doctype": 1, + "name": "Interest Rates", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 600, + "submissions": 1200, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 56.666666666666664, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0241", + "available": 1, + "doctype": 1, + "name": "Quaternion Multiplication", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 477, + "submissions": 899, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 61.73526140155729, + "score": 0.26834381551362685, + "userScore": 0 + }, + { + "id": "0242", + "available": 1, + "doctype": 1, + "name": "Input Candidates", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 370, + "submissions": 1144, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 40.64685314685315, + "score": 0.34594594594594597, + "userScore": 0 + }, + { + "id": "0243", + "available": 1, + "doctype": 1, + "name": "Filling Game", + "problemTimeLimit": 3, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 159, + "submissions": 766, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 29.89556135770235, + "score": 0.8050314465408805, + "userScore": 0 + }, + { + "id": "0244", + "available": 1, + "doctype": 1, + "name": "Hot Spring Trip", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 247, + "submissions": 672, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.642857142857146, + "score": 0.5182186234817814, + "userScore": 0 + }, + { + "id": "0245", + "available": 1, + "doctype": 1, + "name": "Time Sale", + "problemTimeLimit": 5, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 98, + "submissions": 481, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 35.13513513513514, + "score": 1.3061224489795917, + "userScore": 0 + }, + { + "id": "0246", + "available": 1, + "doctype": 1, + "name": "Bara-Bara Manju", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 83, + "submissions": 765, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 22.875816993464053, + "score": 1.5421686746987953, + "userScore": 0 + }, + { + "id": "0247", + "available": 1, + "doctype": 1, + "name": "Ice Maze", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 85, + "submissions": 665, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 18.94736842105263, + "score": 1.5058823529411764, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2015", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2015, + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "days": [ + { + "id": 198, + "day": 1, + "title": "13th PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "problems": [ + { + "id": "0315", + "available": 1, + "doctype": 4, + "name": "The Number of Participants", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 1156, + "submissions": 1644, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 79.1970802919708, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0316", + "available": 1, + "doctype": 4, + "name": "Fishing Competition", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 805, + "submissions": 1868, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 48.7152034261242, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0317", + "available": 1, + "doctype": 4, + "name": "Frog Going Straight", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 1804, + "submissions": 3371, + "recommendations": 14, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 63.63097003856422, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0318", + "available": 1, + "doctype": 4, + "name": "Secret Investigation", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 605, + "submissions": 1313, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 56.28332063975628, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0319", + "available": 1, + "doctype": 4, + "name": "Programming Contest", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 530, + "submissions": 1095, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 56.073059360730596, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0320", + "available": 1, + "doctype": 4, + "name": "Quality Management", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 236, + "submissions": 754, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.47214854111406, + "score": 0.5423728813559322, + "userScore": 0 + }, + { + "id": "0321", + "available": 1, + "doctype": 4, + "name": "Investigation of Club Activities", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 205, + "submissions": 699, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.90987124463519, + "score": 0.624390243902439, + "userScore": 0 + }, + { + "id": "0322", + "available": 1, + "doctype": 4, + "name": "Slates", + "problemTimeLimit": 5, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 81, + "submissions": 549, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 18.0327868852459, + "score": 1.5802469135802468, + "userScore": 0 + }, + { + "id": "0323", + "available": 2, + "doctype": 4, + "name": "Ruins", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 97, + "submissions": 375, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 33.6, + "score": 1.3195876288659794, + "userScore": 0 + }, + { + "id": "0324", + "available": 1, + "doctype": 4, + "name": "Downhill Race", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 41, + "submissions": 115, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 46.08695652173913, + "score": 3.1219512195121952, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2005", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2005, + "progress": 0, + "numberOfProblems": 20, + "numberOfSolved": 0, + "days": [ + { + "id": 4, + "day": 1, + "title": "3rd PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 20, + "numberOfSolved": 0, + "problems": [ + { + "id": "0073", + "available": 2, + "doctype": 1, + "name": "Surface Area of Quadrangular Pyramid", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1383, + "submissions": 2098, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 73.92755004766444, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0074", + "available": 1, + "doctype": 1, + "name": "Videotape", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 985, + "submissions": 2347, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 49.25436727737537, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0075", + "available": 1, + "doctype": 1, + "name": "BMI", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1529, + "submissions": 2605, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 65.91170825335892, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0076", + "available": 2, + "doctype": 1, + "name": "Treasure Hunt II", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 714, + "submissions": 1173, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 74.2540494458653, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0077", + "available": 1, + "doctype": 1, + "name": "Run Length", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1343, + "submissions": 2233, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 68.3833407971339, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0078", + "available": 1, + "doctype": 1, + "name": "Magic Square", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 849, + "submissions": 1455, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 65.2233676975945, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0079", + "available": 2, + "doctype": 1, + "name": "Area of Polygon", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1220, + "submissions": 2740, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 55.62043795620438, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0080", + "available": 2, + "doctype": 1, + "name": "Third Root", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 915, + "submissions": 2543, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.0031458906803, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0081", + "available": 2, + "doctype": 1, + "name": "A Symmetric Point", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 672, + "submissions": 1467, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 58.00954328561691, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0082", + "available": 1, + "doctype": 1, + "name": "Flying Jenny", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 578, + "submissions": 1581, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.13725490196079, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0083", + "available": 1, + "doctype": 1, + "name": "Era Name Transformation", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 909, + "submissions": 1896, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 57.542194092827, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0084", + "available": 1, + "doctype": 1, + "name": "Search Engine", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 910, + "submissions": 2463, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.564758424685344, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0085", + "available": 1, + "doctype": 1, + "name": "Joseph's Potato", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 866, + "submissions": 1391, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 72.82530553558591, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0086", + "available": 1, + "doctype": 1, + "name": "Patrol", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 747, + "submissions": 2720, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 34.669117647058826, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0087", + "available": 1, + "doctype": 1, + "name": "Strange Mathematical Expression", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 789, + "submissions": 3690, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.238482384823847, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0088", + "available": 1, + "doctype": 1, + "name": "The Code A Doctor Loved", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 562, + "submissions": 2120, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 35.424528301886795, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0089", + "available": 1, + "doctype": 1, + "name": "The Shortest Path on A Rhombic Path", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 623, + "submissions": 1658, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 46.01930036188178, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0090", + "available": 1, + "doctype": 1, + "name": "Overlaps of Seals", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 387, + "submissions": 3104, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 18.78221649484536, + "score": 0.330749354005168, + "userScore": 0 + }, + { + "id": "0091", + "available": 3, + "doctype": 1, + "name": "Blur", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 219, + "submissions": 1783, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 20.022434099831745, + "score": 0.5844748858447488, + "userScore": 0 + }, + { + "id": "0092", + "available": 1, + "doctype": 1, + "name": "Square Searching", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 666, + "submissions": 2504, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 39.97603833865815, + "score": 0.25, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2007", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2007, + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "days": [ + { + "id": 8, + "day": 1, + "title": "5th PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "problems": [ + { + "id": "0148", + "available": 1, + "doctype": 1, + "name": "Candy and Class Flag", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 939, + "submissions": 1836, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 62.908496732026144, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0149", + "available": 1, + "doctype": 1, + "name": "Eye Test", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 963, + "submissions": 1673, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 67.18469814704125, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0150", + "available": 1, + "doctype": 4, + "name": "Twin Prime", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 976, + "submissions": 3343, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 52.76697577026623, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0151", + "available": 1, + "doctype": 4, + "name": "Grid", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 471, + "submissions": 1957, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.28002043944814, + "score": 0.27176220806794055, + "userScore": 0 + }, + { + "id": "0152", + "available": 1, + "doctype": 1, + "name": "Bowling", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 357, + "submissions": 1013, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.73149062191511, + "score": 0.3585434173669468, + "userScore": 0 + }, + { + "id": "0153", + "available": 1, + "doctype": 1, + "name": "Triangle and Circle", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 190, + "submissions": 1343, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 21.14668652271035, + "score": 0.6736842105263158, + "userScore": 0 + }, + { + "id": "0154", + "available": 1, + "doctype": 1, + "name": "Sum of Cards", + "problemTimeLimit": 5, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 392, + "submissions": 618, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 81.3915857605178, + "score": 0.32653061224489793, + "userScore": 0 + }, + { + "id": "0155", + "available": 1, + "doctype": 1, + "name": "Spider Jin", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 406, + "submissions": 1637, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.40806353084911, + "score": 0.31527093596059114, + "userScore": 0 + }, + { + "id": "0156", + "available": 1, + "doctype": 1, + "name": "Moats around the Castle", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 268, + "submissions": 926, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 38.01295896328294, + "score": 0.47761194029850745, + "userScore": 0 + }, + { + "id": "0157", + "available": 1, + "doctype": 1, + "name": "Russian Dolls", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 470, + "submissions": 1622, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 41.122071516646116, + "score": 0.2723404255319149, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2022", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2022, + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "days": [ + { + "id": 294, + "day": 1, + "title": "20th PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "problems": [ + { + "id": "0479", + "available": 1, + "doctype": 1, + "name": "20th Anniversary", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 769, + "submissions": 1556, + "recommendations": 6, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 60.02570694087404, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0480", + "available": 1, + "doctype": 1, + "name": "Temperature Measurement", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 580, + "submissions": 1903, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 35.102469784550706, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0481", + "available": 1, + "doctype": 1, + "name": "Losing is Winning", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 475, + "submissions": 1395, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 39.92831541218638, + "score": 0.2694736842105263, + "userScore": 0 + }, + { + "id": "0482", + "available": 1, + "doctype": 1, + "name": "Group", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 408, + "submissions": 1197, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 41.01921470342523, + "score": 0.3137254901960784, + "userScore": 0 + }, + { + "id": "0483", + "available": 1, + "doctype": 1, + "name": "Boiling Pasta", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 311, + "submissions": 1025, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 33.75609756097561, + "score": 0.4115755627009646, + "userScore": 0 + }, + { + "id": "0484", + "available": 1, + "doctype": 1, + "name": "Split Time", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 284, + "submissions": 711, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.60056258790436, + "score": 0.4507042253521127, + "userScore": 0 + }, + { + "id": "0485", + "available": 1, + "doctype": 1, + "name": "Tax Collection", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 209, + "submissions": 652, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.50306748466258, + "score": 0.6124401913875598, + "userScore": 0 + }, + { + "id": "0486", + "available": 1, + "doctype": 1, + "name": "One Way Maze Game", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 136, + "submissions": 572, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 27.622377622377623, + "score": 0.9411764705882353, + "userScore": 0 + }, + { + "id": "0487", + "available": 1, + "doctype": 1, + "name": "Forgot Your Password?", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 69, + "submissions": 291, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 29.553264604810998, + "score": 1.855072463768116, + "userScore": 0 + }, + { + "id": "0488", + "available": 1, + "doctype": 1, + "name": "Teleportation Network", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 73, + "submissions": 164, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.609756097560975, + "score": 1.7534246575342465, + "userScore": 0 + }, + { + "id": "0489", + "available": 1, + "doctype": 1, + "name": "Agrarian Development", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 38, + "submissions": 126, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 53.17460317460318, + "score": 3.3684210526315788, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2012", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2012, + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "days": [ + { + "id": 131, + "day": 1, + "title": "10th PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "problems": [ + { + "id": "0256", + "available": 1, + "doctype": 1, + "name": "Points for a Perfect Scorer", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1489, + "submissions": 2232, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 77.91218637992831, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0257", + "available": 1, + "doctype": 1, + "name": "Railway Ticket", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1517, + "submissions": 2870, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 63.170731707317074, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0258", + "available": 1, + "doctype": 1, + "name": "Kitchen Garden", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 546, + "submissions": 2472, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 27.346278317152105, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0259", + "available": 1, + "doctype": 1, + "name": "All Numbers Lead to 6174", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 726, + "submissions": 1819, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 53.271028037383175, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0260", + "available": 1, + "doctype": 1, + "name": "Salary for a Plumber", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 485, + "submissions": 2044, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 31.996086105675147, + "score": 0.2639175257731959, + "userScore": 0 + }, + { + "id": "0261", + "available": 1, + "doctype": 1, + "name": "Mayan Crucial Prediction", + "problemTimeLimit": 5, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 192, + "submissions": 729, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.17009602194788, + "score": 0.6666666666666666, + "userScore": 0 + }, + { + "id": "0262", + "available": 1, + "doctype": 1, + "name": "Making Sugoroku", + "problemTimeLimit": 3, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 189, + "submissions": 993, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 24.169184290030213, + "score": 0.6772486772486772, + "userScore": 0 + }, + { + "id": "0263", + "available": 1, + "doctype": 1, + "name": "Beat Panel", + "problemTimeLimit": 2, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 221, + "submissions": 688, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.16860465116279, + "score": 0.579185520361991, + "userScore": 0 + }, + { + "id": "0264", + "available": 1, + "doctype": 1, + "name": "Finite Field Calculator", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 148, + "submissions": 663, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 31.372549019607842, + "score": 0.8648648648648649, + "userScore": 0 + }, + { + "id": "0265", + "available": 1, + "doctype": 1, + "name": "Cats Going Straight", + "problemTimeLimit": 5, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 37, + "submissions": 582, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 17.697594501718214, + "score": 3.4594594594594597, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2006", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2006, + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "days": [ + { + "id": 6, + "day": 1, + "title": "4th PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "problems": [ + { + "id": "0123", + "available": 1, + "doctype": 1, + "name": "Speed Skating Badge Test", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 869, + "submissions": 1845, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 52.357723577235774, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0124", + "available": 1, + "doctype": 1, + "name": "League Match Score Sheet", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 698, + "submissions": 2545, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 33.1237721021611, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0125", + "available": 1, + "doctype": 1, + "name": "Day Count", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 605, + "submissions": 1483, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 48.61766689143628, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0126", + "available": 1, + "doctype": 1, + "name": "Puzzle", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 486, + "submissions": 1182, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.71573604060914, + "score": 0.26337448559670784, + "userScore": 0 + }, + { + "id": "0127", + "available": 1, + "doctype": 1, + "name": "Pocket Pager Input", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 590, + "submissions": 1823, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.204059243006036, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0128", + "available": 1, + "doctype": 1, + "name": "Abacus ", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 531, + "submissions": 1407, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 42.92821606254442, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0129", + "available": 1, + "doctype": 1, + "name": "Hide-and-Seek Supporting System", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 296, + "submissions": 867, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.63667820069204, + "score": 0.43243243243243246, + "userScore": 0 + }, + { + "id": "0130", + "available": 1, + "doctype": 1, + "name": "Train", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 739, + "submissions": 1366, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 69.98535871156662, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0131", + "available": 1, + "doctype": 1, + "name": "Doctor's Strange Particles", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 272, + "submissions": 848, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 40.56603773584906, + "score": 0.47058823529411764, + "userScore": 0 + }, + { + "id": "0132", + "available": 1, + "doctype": 1, + "name": "Jigsaw Puzzle", + "problemTimeLimit": 5, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 80, + "submissions": 1348, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 9.495548961424332, + "score": 1.6, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2025", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2025, + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "days": [ + { + "id": 336, + "day": 1, + "title": "23rd PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "problems": [ + { + "id": "4060", + "available": 1, + "doctype": 1, + "name": "Server Load Prediction", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 104, + "submissions": 129, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 91.47286821705427, + "score": 1.2307692307692308, + "userScore": 0 + }, + { + "id": "4061", + "available": 1, + "doctype": 1, + "name": "Fireworks Viewed from the Tower", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 73, + "submissions": 138, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 56.52173913043478, + "score": 1.7534246575342465, + "userScore": 0 + }, + { + "id": "4062", + "available": 1, + "doctype": 1, + "name": "Mountain Climbing Record Summary", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 54, + "submissions": 82, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 69.51219512195122, + "score": 2.3703703703703702, + "userScore": 0 + }, + { + "id": "4063", + "available": 1, + "doctype": 1, + "name": "Ultra-high-speed Communication", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 46, + "submissions": 56, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 83.92857142857143, + "score": 2.782608695652174, + "userScore": 0 + }, + { + "id": "4064", + "available": 1, + "doctype": 1, + "name": "Two Arrays", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 38, + "submissions": 101, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.62376237623762, + "score": 3.3684210526315788, + "userScore": 0 + }, + { + "id": "4065", + "available": 1, + "doctype": 1, + "name": "Wheat Supply", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 10, + "submissions": 35, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 34.285714285714285, + "score": 12.8, + "userScore": 0 + }, + { + "id": "4066", + "available": 1, + "doctype": 1, + "name": "Rental Car", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 10, + "submissions": 79, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 13.924050632911392, + "score": 12.8, + "userScore": 0 + }, + { + "id": "4067", + "available": 1, + "doctype": 1, + "name": "Light Puzzle", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 9, + "submissions": 52, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 19.23076923076923, + "score": 14.222222222222221, + "userScore": 0 + }, + { + "id": "4068", + "available": 1, + "doctype": 1, + "name": "Placement of VR Users", + "problemTimeLimit": 4, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 2, + "submissions": 22, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 9.090909090909092, + "score": 16, + "userScore": 0 + }, + { + "id": "4069", + "available": 1, + "doctype": 1, + "name": "Cross-differentiation Induction", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 2, + "submissions": 5, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 60, + "score": 16, + "userScore": 0 + }, + { + "id": "4070", + "available": 1, + "doctype": 1, + "name": "Number of Points", + "problemTimeLimit": 4, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 3, + "submissions": 17, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 29.41176470588235, + "score": 16, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2020", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2020, + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "days": [ + { + "id": 259, + "day": 1, + "title": "18th PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "problems": [ + { + "id": "0428", + "available": 1, + "doctype": 4, + "name": "Longitude and Latitude", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 706, + "submissions": 1410, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 55.673758865248224, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0429", + "available": 1, + "doctype": 4, + "name": "Shopping Street", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 595, + "submissions": 1273, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 52.78868813825609, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0430", + "available": 1, + "doctype": 4, + "name": "Courtesy Call", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 575, + "submissions": 1707, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.90275336848272, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0431", + "available": 1, + "doctype": 4, + "name": "Colorful Disk", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 619, + "submissions": 1494, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.66934404283802, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0432", + "available": 1, + "doctype": 4, + "name": "Rotating Photo", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 340, + "submissions": 888, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.48198198198198, + "score": 0.3764705882352941, + "userScore": 0 + }, + { + "id": "0433", + "available": 1, + "doctype": 4, + "name": "Tetra Hedron", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 190, + "submissions": 688, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.959302325581394, + "score": 0.6736842105263158, + "userScore": 0 + }, + { + "id": "0434", + "available": 1, + "doctype": 4, + "name": "Processing Machine", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 117, + "submissions": 698, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 20.773638968481375, + "score": 1.0940170940170941, + "userScore": 0 + }, + { + "id": "0435", + "available": 1, + "doctype": 4, + "name": "Highway Network", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 106, + "submissions": 272, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 45.220588235294116, + "score": 1.2075471698113207, + "userScore": 0 + }, + { + "id": "0436", + "available": 2, + "doctype": 4, + "name": "Warehouse Robot", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 56, + "submissions": 323, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 23.8390092879257, + "score": 2.2857142857142856, + "userScore": 0 + }, + { + "id": "0437", + "available": 1, + "doctype": 4, + "name": "Copy and Sum", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 60, + "submissions": 271, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 34.31734317343174, + "score": 2.1333333333333333, + "userScore": 0 + }, + { + "id": "0438", + "available": 1, + "doctype": 4, + "name": "Passport", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 21, + "submissions": 328, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 11.890243902439025, + "score": 6.095238095238095, + "userScore": 0 + }, + { + "id": "0439", + "available": 1, + "doctype": 4, + "name": "Coloured Mountain Hut", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 36, + "submissions": 155, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 41.935483870967744, + "score": 3.5555555555555554, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2024", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2024, + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "days": [ + { + "id": 319, + "day": 1, + "title": "22nd PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "problems": [ + { + "id": "4036", + "available": 1, + "doctype": 1, + "name": "Candies Received", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 261, + "submissions": 382, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 79.05759162303664, + "score": 0.4904214559386973, + "userScore": 0 + }, + { + "id": "4037", + "available": 1, + "doctype": 1, + "name": "Mikoshi Carrier", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 208, + "submissions": 588, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 40.816326530612244, + "score": 0.6153846153846154, + "userScore": 0 + }, + { + "id": "4038", + "available": 1, + "doctype": 1, + "name": "Lucky Number", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 189, + "submissions": 433, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 52.42494226327945, + "score": 0.6772486772486772, + "userScore": 0 + }, + { + "id": "4039", + "available": 1, + "doctype": 1, + "name": "Magic Pocket", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 118, + "submissions": 629, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25.119236883942765, + "score": 1.0847457627118644, + "userScore": 0 + }, + { + "id": "4040", + "available": 1, + "doctype": 1, + "name": "Data Center", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 108, + "submissions": 253, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.430830039525695, + "score": 1.1851851851851851, + "userScore": 0 + }, + { + "id": "4041", + "available": 1, + "doctype": 1, + "name": "Lake Survey", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 87, + "submissions": 187, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 54.54545454545455, + "score": 1.471264367816092, + "userScore": 0 + }, + { + "id": "4042", + "available": 1, + "doctype": 1, + "name": "Geoglyph", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 39, + "submissions": 166, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 27.710843373493976, + "score": 3.282051282051282, + "userScore": 0 + }, + { + "id": "4043", + "available": 1, + "doctype": 1, + "name": "Rubik's Cube", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 19, + "submissions": 96, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 62.5, + "score": 6.7368421052631575, + "userScore": 0 + }, + { + "id": "4044", + "available": 1, + "doctype": 1, + "name": "Wall Renovation", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 56, + "submissions": 159, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 42.138364779874216, + "score": 2.2857142857142856, + "userScore": 0 + }, + { + "id": "4045", + "available": 1, + "doctype": 1, + "name": "Space Battleship Izua", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 21, + "submissions": 112, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 19.642857142857142, + "score": 6.095238095238095, + "userScore": 0 + }, + { + "id": "4046", + "available": 1, + "doctype": 1, + "name": "Daily Mission", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 24, + "submissions": 66, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 46.96969696969697, + "score": 5.333333333333333, + "userScore": 0 + }, + { + "id": "4047", + "available": 1, + "doctype": 1, + "name": "Login Bonus", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 9, + "submissions": 23, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.47826086956522, + "score": 14.222222222222221, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2010", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2010, + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "days": [ + { + "id": 14, + "day": 1, + "title": "8th PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "problems": [ + { + "id": "0216", + "available": 1, + "doctype": 1, + "name": "Cutting Down Water Bills", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1104, + "submissions": 1963, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 68.16097809475293, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0217", + "available": 1, + "doctype": 1, + "name": "Walking in the Hospital", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 988, + "submissions": 2090, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 58.708133971291865, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0218", + "available": 1, + "doctype": 1, + "name": "Dividing Students", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1167, + "submissions": 2072, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 66.36100386100387, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0219", + "available": 1, + "doctype": 1, + "name": "A Popular Ice-cream Shop", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1200, + "submissions": 1872, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 73.87820512820512, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0220", + "available": 1, + "doctype": 1, + "name": "Binary Digit A Doctor Loved", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 603, + "submissions": 1500, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.53333333333333, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0221", + "available": 1, + "doctype": 1, + "name": "FizzBuzz", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 501, + "submissions": 3434, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 21.578334304018636, + "score": 0.2554890219560878, + "userScore": 0 + }, + { + "id": "0222", + "available": 1, + "doctype": 1, + "name": "Prime Quadruplet", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 649, + "submissions": 2654, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 35.455915599095704, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0223", + "available": 1, + "doctype": 1, + "name": "Stray Twins", + "problemTimeLimit": 5, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 401, + "submissions": 2581, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 26.501356063541262, + "score": 0.3192019950124688, + "userScore": 0 + }, + { + "id": "0224", + "available": 1, + "doctype": 1, + "name": "Bicycle Diet", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 172, + "submissions": 810, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 35.55555555555556, + "score": 0.7441860465116279, + "userScore": 0 + }, + { + "id": "0225", + "available": 1, + "doctype": 1, + "name": "Kobutanukitsuneko", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 332, + "submissions": 2091, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 21.568627450980394, + "score": 0.3855421686746988, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2017", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2017, + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "days": [ + { + "id": 201, + "day": 1, + "title": "15th PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "problems": [ + { + "id": "0357", + "available": 1, + "doctype": 4, + "name": "Handsel", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 1947, + "submissions": 3621, + "recommendations": 5, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 61.80613090306545, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0358", + "available": 1, + "doctype": 4, + "name": "Shopping", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 1758, + "submissions": 4167, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 49.24406047516199, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0359", + "available": 1, + "doctype": 4, + "name": "Day of Week", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 1137, + "submissions": 2000, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 67.2, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0360", + "available": 1, + "doctype": 4, + "name": "Reservation System", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 883, + "submissions": 2895, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.373056994818654, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0361", + "available": 1, + "doctype": 4, + "name": "Wire", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 608, + "submissions": 1265, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 56.91699604743083, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0362", + "available": 1, + "doctype": 4, + "name": "Trampoline", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 473, + "submissions": 1558, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 35.68677792041078, + "score": 0.27061310782241016, + "userScore": 0 + }, + { + "id": "0363", + "available": 1, + "doctype": 4, + "name": "Loading", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 175, + "submissions": 808, + "recommendations": 5, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 27.475247524752476, + "score": 0.7314285714285714, + "userScore": 0 + }, + { + "id": "0364", + "available": 1, + "doctype": 4, + "name": "Dungeon", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 195, + "submissions": 541, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.253234750462106, + "score": 0.6564102564102564, + "userScore": 0 + }, + { + "id": "0365", + "available": 1, + "doctype": 4, + "name": "Swapping Characters", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 242, + "submissions": 836, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.36363636363637, + "score": 0.5289256198347108, + "userScore": 0 + }, + { + "id": "0366", + "available": 1, + "doctype": 4, + "name": "Road Improvement", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 140, + "submissions": 464, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 42.025862068965516, + "score": 0.9142857142857143, + "userScore": 0 + }, + { + "id": "0367", + "available": 1, + "doctype": 4, + "name": "Charging System for Network", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 64, + "submissions": 647, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.35857805255023, + "score": 2, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2013", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2013, + "progress": 0, + "numberOfProblems": 9, + "numberOfSolved": 0, + "days": [ + { + "id": 142, + "day": 1, + "title": "11th PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 9, + "numberOfSolved": 0, + "problems": [ + { + "id": "0276", + "available": 1, + "doctype": 1, + "name": "Temperature Difference", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1519, + "submissions": 2214, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 80.75880758807588, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0277", + "available": 1, + "doctype": 1, + "name": "Ticket Sales", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1481, + "submissions": 2114, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 80.08514664143803, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0278", + "available": 1, + "doctype": 1, + "name": "Admission Fee", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 1115, + "submissions": 3034, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.111404087013845, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0279", + "available": 1, + "doctype": 1, + "name": "A Pair of Prizes", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 937, + "submissions": 2481, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.463522773075375, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0280", + "available": 1, + "doctype": 1, + "name": "The Outcome of Bonze", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 667, + "submissions": 1164, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 62.80068728522337, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0281", + "available": 1, + "doctype": 1, + "name": "Formation", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 678, + "submissions": 1263, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 61.1243072050673, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0282", + "available": 1, + "doctype": 1, + "name": "Programming Contest", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 337, + "submissions": 1637, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 31.459987782529016, + "score": 0.3798219584569733, + "userScore": 0 + }, + { + "id": "0283", + "available": 1, + "doctype": 1, + "name": "Study Session", + "problemTimeLimit": 3, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 146, + "submissions": 633, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.647709320695103, + "score": 0.8767123287671232, + "userScore": 0 + }, + { + "id": "0284", + "available": 1, + "doctype": 1, + "name": "Happy End Problem", + "problemTimeLimit": 3, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 55, + "submissions": 291, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 22.68041237113402, + "score": 2.327272727272727, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2004", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2004, + "progress": 0, + "numberOfProblems": 17, + "numberOfSolved": 0, + "days": [ + { + "id": 2, + "day": 1, + "title": "2nd PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 17, + "numberOfSolved": 0, + "problems": [ + { + "id": "0027", + "available": 1, + "doctype": 4, + "name": "What day is today?", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 2480, + "submissions": 5105, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 59.60822722820764, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0028", + "available": 1, + "doctype": 4, + "name": "Mode Value", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 2785, + "submissions": 5442, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 64.97611172363102, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0029", + "available": 1, + "doctype": 4, + "name": "English Sentence", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 2461, + "submissions": 6038, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 55.167273931765486, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0030", + "available": 1, + "doctype": 4, + "name": "Sum of Integers", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 2131, + "submissions": 5443, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 52.25059709718905, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0031", + "available": 1, + "doctype": 4, + "name": "Weight", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 2038, + "submissions": 5061, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.73760126457222, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0032", + "available": 1, + "doctype": 4, + "name": "Plastic Board", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 2028, + "submissions": 3554, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 64.99718626899268, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0033", + "available": 1, + "doctype": 1, + "name": "Ball", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 3021, + "submissions": 11197, + "recommendations": 10, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.18335268375458, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0034", + "available": 1, + "doctype": 1, + "name": "Railway Lines", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1559, + "submissions": 2627, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 66.04491815759421, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0035", + "available": 1, + "doctype": 1, + "name": "Is it Convex?", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1144, + "submissions": 2991, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.3420260782347, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0036", + "available": 1, + "doctype": 1, + "name": "A Figure on Surface", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1348, + "submissions": 4628, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.25756266205705, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0037", + "available": 1, + "doctype": 1, + "name": "Path on a Grid", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 688, + "submissions": 2082, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 41.54658981748319, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0038", + "available": 1, + "doctype": 1, + "name": "Poker Hand", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1319, + "submissions": 2765, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 56.85352622061483, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0039", + "available": 1, + "doctype": 1, + "name": "Roman Figure", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1285, + "submissions": 2184, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 68.95604395604396, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0040", + "available": 1, + "doctype": 1, + "name": "Affine Cipher", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 860, + "submissions": 2537, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.24004729996059, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0041", + "available": 3, + "doctype": 1, + "name": "Expression", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 642, + "submissions": 2116, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 46.36105860113422, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0042", + "available": 1, + "doctype": 1, + "name": "A Thief", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1259, + "submissions": 6017, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 31.3943825826824, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0043", + "available": 1, + "doctype": 1, + "name": "Puzzle", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 707, + "submissions": 1521, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 59.76331360946745, + "score": 0.25, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2009", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2009, + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "days": [ + { + "id": 12, + "day": 1, + "title": "7th PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "problems": [ + { + "id": "0195", + "available": 1, + "doctype": 1, + "name": "What is the Most Popular Shop in Tokaichi?", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 897, + "submissions": 1737, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 60.96718480138169, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0196", + "available": 1, + "doctype": 1, + "name": "Baseball Championship", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 599, + "submissions": 1536, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.4609375, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0197", + "available": 1, + "doctype": 1, + "name": "Greatest Common Divisor: Euclidean Algorithm", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 967, + "submissions": 2446, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.383483237939494, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0198", + "available": 1, + "doctype": 1, + "name": "Trouble in Shinagawa's Artifacts", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 283, + "submissions": 951, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.960042060988435, + "score": 0.45229681978798586, + "userScore": 0 + }, + { + "id": "0199", + "available": 1, + "doctype": 1, + "name": "Chairs Where Demanding People Sit", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 266, + "submissions": 1456, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 22.733516483516482, + "score": 0.48120300751879697, + "userScore": 0 + }, + { + "id": "0200", + "available": 1, + "doctype": 1, + "name": "Traveling Alone: One-way Ticket of Youth", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1081, + "submissions": 5525, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.805429864253394, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0201", + "available": 1, + "doctype": 1, + "name": "Wrought Gold Master", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 593, + "submissions": 1757, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 42.970973249857714, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0202", + "available": 1, + "doctype": 1, + "name": "At Boss's Expense", + "problemTimeLimit": 5, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 634, + "submissions": 2570, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 40.73929961089494, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0203", + "available": 1, + "doctype": 1, + "name": "A New Plan of Aizu Ski Resort", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 500, + "submissions": 2117, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.40434577231932, + "score": 0.256, + "userScore": 0 + }, + { + "id": "0204", + "available": 1, + "doctype": 1, + "name": "UFO Shooting Down Operation", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 110, + "submissions": 1745, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 10.773638968481375, + "score": 1.1636363636363636, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2021", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2021, + "progress": 0, + "numberOfProblems": 13, + "numberOfSolved": 0, + "days": [ + { + "id": 272, + "day": 1, + "title": "19th PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 13, + "numberOfSolved": 0, + "problems": [ + { + "id": "0453", + "available": 1, + "doctype": 4, + "name": "Mouse Movement Distance", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 846, + "submissions": 1693, + "recommendations": 5, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 56.29060838747785, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0454", + "available": 1, + "doctype": 4, + "name": "Mini Picture Matching Game", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 621, + "submissions": 1381, + "recommendations": 4, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.905141202027515, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0455", + "available": 1, + "doctype": 4, + "name": "Dial Lock", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 462, + "submissions": 1610, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.95652173913044, + "score": 0.27705627705627706, + "userScore": 0 + }, + { + "id": "0456", + "available": 1, + "doctype": 4, + "name": "Connecting ", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 320, + "submissions": 1118, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.55813953488372, + "score": 0.4, + "userScore": 0 + }, + { + "id": "0457", + "available": 1, + "doctype": 4, + "name": "Digital Clock", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 227, + "submissions": 665, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 42.556390977443606, + "score": 0.5638766519823789, + "userScore": 0 + }, + { + "id": "0458", + "available": 1, + "doctype": 4, + "name": "Mixed Spice I", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 212, + "submissions": 390, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 63.07692307692308, + "score": 0.6037735849056604, + "userScore": 0 + }, + { + "id": "0459", + "available": 1, + "doctype": 4, + "name": "Mixed Spice II", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 165, + "submissions": 799, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25.031289111389235, + "score": 0.7757575757575758, + "userScore": 0 + }, + { + "id": "0460", + "available": 1, + "doctype": 4, + "name": "Fundraising Street", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 77, + "submissions": 297, + "recommendations": 5, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 31.31313131313131, + "score": 1.6623376623376624, + "userScore": 0 + }, + { + "id": "0461", + "available": 1, + "doctype": 4, + "name": "Odd and Even Spirit", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 88, + "submissions": 423, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 24.822695035460992, + "score": 1.4545454545454546, + "userScore": 0 + }, + { + "id": "0462", + "available": 2, + "doctype": 4, + "name": "The Shortest Path on the Spider's Web", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 45, + "submissions": 149, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.241610738255034, + "score": 2.8444444444444446, + "userScore": 0 + }, + { + "id": "0463", + "available": 1, + "doctype": 4, + "name": "Fishermen Following the Rules", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 34, + "submissions": 154, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.51948051948052, + "score": 3.764705882352941, + "userScore": 0 + }, + { + "id": "0464", + "available": 1, + "doctype": 4, + "name": "Rotating Mass Game", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 34, + "submissions": 147, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 27.891156462585034, + "score": 3.764705882352941, + "userScore": 0 + }, + { + "id": "0465", + "available": 1, + "doctype": 4, + "name": "Commuting Route", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 23, + "submissions": 89, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 34.831460674157306, + "score": 5.565217391304348, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2023", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2023, + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "days": [ + { + "id": 311, + "day": 1, + "title": "21st PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 11, + "numberOfSolved": 0, + "problems": [ + { + "id": "4012", + "available": 1, + "doctype": 1, + "name": "Distribution of Candy", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 503, + "submissions": 1068, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 56.554307116104866, + "score": 0.2544731610337972, + "userScore": 0 + }, + { + "id": "4013", + "available": 1, + "doctype": 1, + "name": "Judge the Target", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 424, + "submissions": 1106, + "recommendations": 5, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.21338155515371, + "score": 0.3018867924528302, + "userScore": 0 + }, + { + "id": "4014", + "available": 1, + "doctype": 1, + "name": "Ancestor of Bacteria", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 408, + "submissions": 920, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.630434782608695, + "score": 0.3137254901960784, + "userScore": 0 + }, + { + "id": "4015", + "available": 1, + "doctype": 1, + "name": "Square", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 233, + "submissions": 1140, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 24.56140350877193, + "score": 0.5493562231759657, + "userScore": 0 + }, + { + "id": "4016", + "available": 1, + "doctype": 1, + "name": "Number Similar to 2023", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 225, + "submissions": 1272, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 22.955974842767297, + "score": 0.5688888888888889, + "userScore": 0 + }, + { + "id": "4017", + "available": 1, + "doctype": 1, + "name": "Dancing Maze", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 115, + "submissions": 550, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 24.727272727272727, + "score": 1.1130434782608696, + "userScore": 0 + }, + { + "id": "4018", + "available": 1, + "doctype": 1, + "name": "Sorting Balls", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 130, + "submissions": 450, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 33.111111111111114, + "score": 0.9846153846153847, + "userScore": 0 + }, + { + "id": "4019", + "available": 2, + "doctype": 1, + "name": "Collecting Balls", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 57, + "submissions": 210, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 33.333333333333336, + "score": 2.245614035087719, + "userScore": 0 + }, + { + "id": "4020", + "available": 1, + "doctype": 1, + "name": "Colored Pencils and Caps", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 47, + "submissions": 129, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.3875968992248, + "score": 2.723404255319149, + "userScore": 0 + }, + { + "id": "4021", + "available": 1, + "doctype": 1, + "name": "Framing", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 22, + "submissions": 136, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 18.38235294117647, + "score": 5.818181818181818, + "userScore": 0 + }, + { + "id": "4022", + "available": 1, + "doctype": 1, + "name": "Teleportation Network 2023", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 15, + "submissions": 102, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 21.568627450980394, + "score": 8.533333333333333, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2018", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2018, + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "days": [ + { + "id": 222, + "day": 1, + "title": "16th PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "problems": [ + { + "id": "0380", + "available": 1, + "doctype": 4, + "name": "Celsius and Fahrenheit", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 1608, + "submissions": 2945, + "recommendations": 5, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 64.31239388794567, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0381", + "available": 1, + "doctype": 4, + "name": "Red Dragonfly", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 1206, + "submissions": 1960, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 72.75510204081633, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0382", + "available": 1, + "doctype": 4, + "name": "Cake Party", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 913, + "submissions": 2150, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.651162790697676, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0383", + "available": 1, + "doctype": 4, + "name": "Heat Strokes", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 739, + "submissions": 2978, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.423102753525857, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0384", + "available": 1, + "doctype": 4, + "name": "Dudeney Number", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 451, + "submissions": 1775, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 34.309859154929576, + "score": 0.2838137472283814, + "userScore": 0 + }, + { + "id": "0385", + "available": 1, + "doctype": 4, + "name": "Bozo Sort", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 413, + "submissions": 2150, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 26.46511627906977, + "score": 0.3099273607748184, + "userScore": 0 + }, + { + "id": "0386", + "available": 1, + "doctype": 4, + "name": "Transporter", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 258, + "submissions": 948, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.075949367088604, + "score": 0.49612403100775193, + "userScore": 0 + }, + { + "id": "0387", + "available": 1, + "doctype": 4, + "name": "Taxi", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 210, + "submissions": 631, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.10618066561014, + "score": 0.6095238095238096, + "userScore": 0 + }, + { + "id": "0388", + "available": 1, + "doctype": 4, + "name": "Points on a Straight Line", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 162, + "submissions": 923, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 23.8353196099675, + "score": 0.7901234567901234, + "userScore": 0 + }, + { + "id": "0389", + "available": 1, + "doctype": 4, + "name": "Dungeon 2", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 79, + "submissions": 473, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.752642706131077, + "score": 1.620253164556962, + "userScore": 0 + }, + { + "id": "0390", + "available": 1, + "doctype": 4, + "name": "Disk", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 75, + "submissions": 284, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 33.098591549295776, + "score": 1.7066666666666668, + "userScore": 0 + }, + { + "id": "0391", + "available": 1, + "doctype": 4, + "name": "Gathering", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 50, + "submissions": 143, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 46.15384615384615, + "score": 2.56, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2019", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2019, + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "days": [ + { + "id": 246, + "day": 1, + "title": "17th PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 12, + "numberOfSolved": 0, + "problems": [ + { + "id": "0404", + "available": 1, + "doctype": 4, + "name": "Shiba Inu", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 999, + "submissions": 1470, + "recommendations": 6, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 77.21088435374149, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0405", + "available": 1, + "doctype": 4, + "name": "ASCII Characters", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 774, + "submissions": 1471, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 58.735554044867435, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0406", + "available": 1, + "doctype": 4, + "name": "Power of Two", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 961, + "submissions": 1835, + "recommendations": 9, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 62.77929155313352, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0407", + "available": 1, + "doctype": 4, + "name": "Meeting Place", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 720, + "submissions": 2025, + "recommendations": 3, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 39.55555555555556, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0408", + "available": 1, + "doctype": 4, + "name": "Cave for Cats", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 446, + "submissions": 1678, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.92967818831943, + "score": 0.28699551569506726, + "userScore": 0 + }, + { + "id": "0409", + "available": 1, + "doctype": 4, + "name": "Floor", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 371, + "submissions": 836, + "recommendations": 7, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50, + "score": 0.3450134770889488, + "userScore": 0 + }, + { + "id": "0410", + "available": 1, + "doctype": 4, + "name": "Akabeko 20", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 224, + "submissions": 782, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 33.887468030690535, + "score": 0.5714285714285714, + "userScore": 0 + }, + { + "id": "0411", + "available": 1, + "doctype": 4, + "name": "Arrows", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 128, + "submissions": 422, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 33.41232227488152, + "score": 1, + "userScore": 0 + }, + { + "id": "0412", + "available": 1, + "doctype": 4, + "name": "Castle in the Sky", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 68, + "submissions": 319, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.213166144200628, + "score": 1.8823529411764706, + "userScore": 0 + }, + { + "id": "0413", + "available": 1, + "doctype": 4, + "name": "Tournament Record", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 73, + "submissions": 267, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 29.588014981273407, + "score": 1.7534246575342465, + "userScore": 0 + }, + { + "id": "0414", + "available": 1, + "doctype": 4, + "name": "Prayer for Iwashiro", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 56, + "submissions": 178, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 46.06741573033708, + "score": 2.2857142857142856, + "userScore": 0 + }, + { + "id": "0415", + "available": 1, + "doctype": 4, + "name": "Dungeon 3", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 34, + "submissions": 98, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.95918367346939, + "score": 3.764705882352941, + "userScore": 0 + } + ] + } + ] + }, + { + "abbr": "PCKPrelim2014", + "largeCl": "PCK", + "middleCl": "Prelim", + "year": 2014, + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "days": [ + { + "id": 158, + "day": 1, + "title": "12th PC Koshien, Preliminary Round", + "progress": 0, + "numberOfProblems": 10, + "numberOfSolved": 0, + "problems": [ + { + "id": "0295", + "available": 1, + "doctype": 1, + "name": "The Number of Chairs", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1254, + "submissions": 1778, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 83.23959505061868, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0296", + "available": 1, + "doctype": 1, + "name": "A Fat Wallet", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1459, + "submissions": 2784, + "recommendations": 4, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 61.422413793103445, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0297", + "available": 1, + "doctype": 1, + "name": "The Last One is the Best", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1256, + "submissions": 2331, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 65.67996567996568, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0298", + "available": 1, + "doctype": 1, + "name": "Bus Timetable", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 592, + "submissions": 2981, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 24.55551828245555, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0299", + "available": 1, + "doctype": 1, + "name": "Railroad II", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 317, + "submissions": 1911, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 34.746206174777605, + "score": 0.4037854889589905, + "userScore": 0 + }, + { + "id": "0300", + "available": 1, + "doctype": 1, + "name": "Floppy Cube", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 296, + "submissions": 677, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 58.34564254062038, + "score": 0.43243243243243246, + "userScore": 0 + }, + { + "id": "0301", + "available": 1, + "doctype": 1, + "name": "Baton Relay Game", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 307, + "submissions": 1474, + "recommendations": 4, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.664857530529172, + "score": 0.4169381107491857, + "userScore": 0 + }, + { + "id": "0302", + "available": 1, + "doctype": 1, + "name": "Star Watching", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 171, + "submissions": 920, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.869565217391305, + "score": 0.7485380116959064, + "userScore": 0 + }, + { + "id": "0303", + "available": 1, + "doctype": 1, + "name": "Mighty Man", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 146, + "submissions": 457, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 38.949671772428886, + "score": 0.8767123287671232, + "userScore": 0 + }, + { + "id": "0304", + "available": 1, + "doctype": 1, + "name": "School Cafeteria", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 75, + "submissions": 392, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 23.724489795918366, + "score": 1.7066666666666668, + "userScore": 0 + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/lib/clients/fixtures/aizu_online_judge/contests.json b/src/lib/clients/fixtures/aizu_online_judge/contests.json deleted file mode 100644 index 5d9e67bcd..000000000 --- a/src/lib/clients/fixtures/aizu_online_judge/contests.json +++ /dev/null @@ -1,352 +0,0 @@ -[ - { - "id": "DPL", - "start_epoch_second": -1, - "duration_second": -1, - "title": "Discrete Optimization Problems", - "rate_change": "" - }, - { - "id": "PCKFinal2013", - "start_epoch_second": -1, - "duration_second": -1, - "title": "11th PC Koshien, Final", - "rate_change": "" - }, - { - "id": "PCKFinal2009", - "start_epoch_second": -1, - "duration_second": -1, - "title": "7th PC Koshien, Final", - "rate_change": "" - }, - { - "id": "PCKPrelim2007", - "start_epoch_second": -1, - "duration_second": -1, - "title": "5th PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "PCKPrelim2013", - "start_epoch_second": -1, - "duration_second": -1, - "title": "11th PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "PCKPrelim2012", - "start_epoch_second": -1, - "duration_second": -1, - "title": "10th PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "PCKFinal2005", - "start_epoch_second": -1, - "duration_second": -1, - "title": "3rd PC Koshien, Final", - "rate_change": "" - }, - { - "id": "GRL", - "start_epoch_second": -1, - "duration_second": -1, - "title": "Graph Algorithms", - "rate_change": "" - }, - { - "id": "PCKFinal2016", - "start_epoch_second": -1, - "duration_second": -1, - "title": "14th PC Koshien, Final", - "rate_change": "" - }, - { - "id": "ITP2", - "start_epoch_second": -1, - "duration_second": -1, - "title": "Introduction to Programming II", - "rate_change": "" - }, - { - "id": "PCKFinal2008", - "start_epoch_second": -1, - "duration_second": -1, - "title": "6th PC Koshien, Final", - "rate_change": "" - }, - { - "id": "PCKFinal2003", - "start_epoch_second": -1, - "duration_second": -1, - "title": "1st PC Koshien, Final", - "rate_change": "" - }, - { - "id": "PCKPrelim2017", - "start_epoch_second": -1, - "duration_second": -1, - "title": "15th PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "PCKFinal2017", - "start_epoch_second": -1, - "duration_second": -1, - "title": "15th PC Koshien, Final", - "rate_change": "" - }, - { - "id": "PCKPrelim2019", - "start_epoch_second": -1, - "duration_second": -1, - "title": "17th PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "ALDS1", - "start_epoch_second": -1, - "duration_second": -1, - "title": "Algorithms and Data Structures I", - "rate_change": "" - }, - { - "id": "PCKFinal2015", - "start_epoch_second": -1, - "duration_second": -1, - "title": "13th PC Koshien, Final", - "rate_change": "" - }, - { - "id": "PCKFinal2012", - "start_epoch_second": -1, - "duration_second": -1, - "title": "10th PC Koshien, Final", - "rate_change": "" - }, - { - "id": "PCKPrelim2005", - "start_epoch_second": -1, - "duration_second": -1, - "title": "3rd PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "PCKPrelim2004", - "start_epoch_second": -1, - "duration_second": -1, - "title": "2nd PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "PCKPrelim2008", - "start_epoch_second": -1, - "duration_second": -1, - "title": "6th PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "PCKPrelim2010", - "start_epoch_second": -1, - "duration_second": -1, - "title": "8th PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "PCKPrelim2006", - "start_epoch_second": -1, - "duration_second": -1, - "title": "4th PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "PCKFinal2020", - "start_epoch_second": -1, - "duration_second": -1, - "title": "18th PC Koshien, Final", - "rate_change": "" - }, - { - "id": "DSL", - "start_epoch_second": -1, - "duration_second": -1, - "title": "Data Sets and Queries", - "rate_change": "" - }, - { - "id": "ITP1", - "start_epoch_second": -1, - "duration_second": -1, - "title": "Introduction to Programming I", - "rate_change": "" - }, - { - "id": "PCKFinal2019", - "start_epoch_second": -1, - "duration_second": -1, - "title": "17th PC Koshien, Final", - "rate_change": "" - }, - { - "id": "PCKFinal2022", - "start_epoch_second": -1, - "duration_second": -1, - "title": "20th PC Koshien, Final", - "rate_change": "" - }, - { - "id": "PCKFinal2023", - "start_epoch_second": -1, - "duration_second": -1, - "title": "21st PC Koshien, Final", - "rate_change": "" - }, - { - "id": "PCKPrelim2015", - "start_epoch_second": -1, - "duration_second": -1, - "title": "13th PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "PCKFinal2014", - "start_epoch_second": -1, - "duration_second": -1, - "title": "12th PC Koshien, Final", - "rate_change": "" - }, - { - "id": "CGL", - "start_epoch_second": -1, - "duration_second": -1, - "title": "Computational Geometry", - "rate_change": "" - }, - { - "id": "PCKFinal2006", - "start_epoch_second": -1, - "duration_second": -1, - "title": "4th PC Koshien, Final", - "rate_change": "" - }, - { - "id": "PCKPrelim2014", - "start_epoch_second": -1, - "duration_second": -1, - "title": "12th PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "PCKPrelim2016", - "start_epoch_second": -1, - "duration_second": -1, - "title": "14th PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "PCKPrelim2023", - "start_epoch_second": -1, - "duration_second": -1, - "title": "21st PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "PCKPrelim2011", - "start_epoch_second": -1, - "duration_second": -1, - "title": "9th PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "INFO1", - "start_epoch_second": -1, - "duration_second": -1, - "title": "Information", - "rate_change": "" - }, - { - "id": "PCKFinal2011", - "start_epoch_second": -1, - "duration_second": -1, - "title": "9th PC Koshien, Final", - "rate_change": "" - }, - { - "id": "PCKFinal2010", - "start_epoch_second": -1, - "duration_second": -1, - "title": "8th PC Koshien, Final", - "rate_change": "" - }, - { - "id": "PCKPrelim2018", - "start_epoch_second": -1, - "duration_second": -1, - "title": "16th PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "PCKPrelim2009", - "start_epoch_second": -1, - "duration_second": -1, - "title": "7th PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "PCKFinal2007", - "start_epoch_second": -1, - "duration_second": -1, - "title": "5th PC Koshien, Final", - "rate_change": "" - }, - { - "id": "NTL", - "start_epoch_second": -1, - "duration_second": -1, - "title": "Number Theory", - "rate_change": "" - }, - { - "id": "PCKPrelim2022", - "start_epoch_second": -1, - "duration_second": -1, - "title": "20th PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "PCKPrelim2020", - "start_epoch_second": -1, - "duration_second": -1, - "title": "18th PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "PCKFinal2004", - "start_epoch_second": -1, - "duration_second": -1, - "title": "2nd PC Koshien, Final", - "rate_change": "" - }, - { - "id": "PCKPrelim2021", - "start_epoch_second": -1, - "duration_second": -1, - "title": "19th PC Koshien, Preliminary Round", - "rate_change": "" - }, - { - "id": "PCKFinal2018", - "start_epoch_second": -1, - "duration_second": -1, - "title": "16th PC Koshien, Final", - "rate_change": "" - }, - { - "id": "PCKFinal2021", - "start_epoch_second": -1, - "duration_second": -1, - "title": "19th PC Koshien, Final", - "rate_change": "" - } -] diff --git a/src/lib/clients/fixtures/aizu_online_judge/courses/contests.json b/src/lib/clients/fixtures/aizu_online_judge/courses/contests.json new file mode 100644 index 000000000..c02bc2c08 --- /dev/null +++ b/src/lib/clients/fixtures/aizu_online_judge/courses/contests.json @@ -0,0 +1,131 @@ +{ + "filter": null, + "courses": [ + { + "id": 2, + "serial": 1, + "shortName": "ITP1", + "name": "Introduction to Programming I", + "type": "lesson", + "userScore": 0, + "maxScore": 4400, + "progress": 0, + "image": "", + "numberOfTopics": null, + "topics": null, + "description": "Acquire fundamental elements of programming languages" + }, + { + "id": 1, + "serial": 2, + "shortName": "ALDS1", + "name": "Algorithms and Data Structures I", + "type": "lesson", + "userScore": 0, + "maxScore": 5800, + "progress": 0, + "image": "", + "numberOfTopics": null, + "topics": null, + "description": "Acquire fundamental elements of algorithms and data structures" + }, + { + "id": 8, + "serial": 3, + "shortName": "ITP2", + "name": "Introduction to Programming II", + "type": "lesson", + "userScore": 0, + "maxScore": 4400, + "progress": 0, + "image": "", + "numberOfTopics": null, + "topics": null, + "description": "Acquire fundamental libraries for programming" + }, + { + "id": 3, + "serial": 4, + "shortName": "DSL", + "name": "Data Sets and Queries", + "type": "library", + "userScore": 0, + "maxScore": 1800, + "progress": 0, + "image": "", + "numberOfTopics": null, + "topics": null, + "description": "Acquire techniques for data sets and queries" + }, + { + "id": 7, + "serial": 5, + "shortName": "DPL", + "name": "Discrete Optimization Problems", + "type": "library", + "userScore": 0, + "maxScore": 2900, + "progress": 0, + "image": "", + "numberOfTopics": null, + "topics": null, + "description": "Acquire techniques for descrete optimization problems" + }, + { + "id": 5, + "serial": 6, + "shortName": "GRL", + "name": "Graph Algorithms", + "type": "library", + "userScore": 0, + "maxScore": 1800, + "progress": 0, + "image": "", + "numberOfTopics": null, + "topics": null, + "description": "Acquire libraries for graph algorithms" + }, + { + "id": 4, + "serial": 7, + "shortName": "CGL", + "name": "Computational Geometry", + "type": "library", + "userScore": 0, + "maxScore": 2500, + "progress": 0, + "image": "", + "numberOfTopics": null, + "topics": null, + "description": "Acquire libraries for computational geometry" + }, + { + "id": 6, + "serial": 8, + "shortName": "NTL", + "name": "Number Theory", + "type": "library", + "userScore": 0, + "maxScore": 1100, + "progress": 0, + "image": "", + "numberOfTopics": null, + "topics": null, + "description": "Acquire algorithms for number theory" + }, + { + "id": 9, + "serial": 9, + "shortName": "INFO1", + "name": "Information", + "type": "lesson", + "userScore": 0, + "maxScore": 9400, + "progress": 0, + "image": "", + "numberOfTopics": null, + "topics": null, + "description": "Information (In preparation)" + } + ] +} \ No newline at end of file diff --git a/src/lib/clients/fixtures/aizu_online_judge/courses/tasks.json b/src/lib/clients/fixtures/aizu_online_judge/courses/tasks.json new file mode 100644 index 000000000..a59eae8d8 --- /dev/null +++ b/src/lib/clients/fixtures/aizu_online_judge/courses/tasks.json @@ -0,0 +1,1802 @@ +[ + { + "id": "1019", + "available": 1, + "doctype": 4, + "name": "Vampirish Night", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 738, + "submissions": 1876, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 54.37100213219616, + "score": 0.25, + "userScore": 0 + }, + { + "id": "1176", + "available": 1, + "doctype": 4, + "name": "Planning Rolling Blackouts", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 478, + "submissions": 819, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 74.84737484737485, + "score": 0.26778242677824265, + "userScore": 0 + }, + { + "id": "3069", + "available": 1, + "doctype": 1, + "name": "Bus", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 11, + "submissions": 38, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 39.473684210526315, + "score": 11.636363636363637, + "userScore": 0 + }, + { + "id": "2367", + "available": 1, + "doctype": 1, + "name": "Icy Composer", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 16, + "submissions": 107, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 45.794392523364486, + "score": 8, + "userScore": 0 + }, + { + "id": "2978", + "available": 1, + "doctype": 1, + "name": "Undo Swapping", + "problemTimeLimit": 4, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 131, + "submissions": 238, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 60.924369747899156, + "score": 0.9770992366412213, + "userScore": 0 + }, + { + "id": "3042", + "available": 1, + "doctype": 1, + "name": "Gridgedge", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 56, + "submissions": 90, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 71.11111111111111, + "score": 2.2857142857142856, + "userScore": 0 + }, + { + "id": "0627", + "available": 1, + "doctype": 1, + "name": "Train Fare", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 101, + "submissions": 845, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.57396449704142, + "score": 1.2673267326732673, + "userScore": 0 + }, + { + "id": "2328", + "available": 1, + "doctype": 2, + "name": "Mobile Network", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 75, + "submissions": 249, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 44.57831325301205, + "score": 1.7066666666666668, + "userScore": 0 + }, + { + "id": "1211", + "available": 1, + "doctype": 2, + "name": "Trapezoids", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 90, + "submissions": 173, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 61.27167630057804, + "score": 1.4222222222222223, + "userScore": 0 + }, + { + "id": "1530", + "available": 1, + "doctype": 1, + "name": "Lonely Adventurer", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 33, + "submissions": 132, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.78787878787879, + "score": 3.878787878787879, + "userScore": 0 + }, + { + "id": "ITP1_4_D", + "available": 1, + "doctype": 4, + "name": "Min, Max and Sum", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 100, + "solvedUser": 30737, + "submissions": 145057, + "recommendations": 82, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 29.113383014952742, + "score": 0.25, + "userScore": 0 + }, + { + "id": "3235", + "available": 3, + "doctype": 1, + "name": "Round Tour", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 57, + "submissions": 122, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50, + "score": 2.245614035087719, + "userScore": 0 + }, + { + "id": "1686", + "available": 3, + "doctype": 4, + "name": "Dog Tricks", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 11, + "submissions": 24, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 62.5, + "score": 11.636363636363637, + "userScore": 0 + }, + { + "id": "0220", + "available": 1, + "doctype": 1, + "name": "Binary Digit A Doctor Loved", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 603, + "submissions": 1500, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.53333333333333, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0446", + "available": 1, + "doctype": 4, + "name": "Room Number", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 63, + "submissions": 233, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 29.613733905579398, + "score": 2.0317460317460316, + "userScore": 0 + }, + { + "id": "0485", + "available": 1, + "doctype": 1, + "name": "Tax Collection", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 209, + "submissions": 652, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.50306748466258, + "score": 0.6124401913875598, + "userScore": 0 + }, + { + "id": "0635", + "available": 1, + "doctype": 1, + "name": "Snake JOI", + "problemTimeLimit": 8, + "problemMemoryLimit": 1048576, + "maxScore": 0, + "solvedUser": 115, + "submissions": 276, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 48.55072463768116, + "score": 1.1130434782608696, + "userScore": 0 + }, + { + "id": "1676", + "available": 3, + "doctype": 4, + "name": "Colorful Residential Area", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 38, + "submissions": 158, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 34.177215189873415, + "score": 3.3684210526315788, + "userScore": 0 + }, + { + "id": "1273", + "available": 1, + "doctype": 2, + "name": "The Best Name for Your Baby", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 19, + "submissions": 86, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 27.906976744186046, + "score": 6.7368421052631575, + "userScore": 0 + }, + { + "id": "0287", + "available": 1, + "doctype": 1, + "name": "Jinkoki", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 201, + "submissions": 370, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 64.5945945945946, + "score": 0.6368159203980099, + "userScore": 0 + }, + { + "id": "1127", + "available": 1, + "doctype": 2, + "name": "Building a Space Station", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1162, + "submissions": 2943, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 48.216106014271155, + "score": 0.25, + "userScore": 0 + }, + { + "id": "4021", + "available": 1, + "doctype": 1, + "name": "Framing", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 22, + "submissions": 136, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 18.38235294117647, + "score": 5.818181818181818, + "userScore": 0 + }, + { + "id": "0067", + "available": 1, + "doctype": 1, + "name": "The Number of Island", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1227, + "submissions": 3250, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.323076923076925, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0306", + "available": 1, + "doctype": 1, + "name": "Symmetric Ternary Number", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 219, + "submissions": 405, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 63.7037037037037, + "score": 0.5844748858447488, + "userScore": 0 + }, + { + "id": "1196", + "available": 1, + "doctype": 4, + "name": "Bridge Removal", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 453, + "submissions": 948, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 58.860759493670884, + "score": 0.282560706401766, + "userScore": 0 + }, + { + "id": "3011", + "available": 1, + "doctype": 1, + "name": "Select Sets", + "problemTimeLimit": 5, + "problemMemoryLimit": 1048576, + "maxScore": 0, + "solvedUser": 15, + "submissions": 32, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 59.375, + "score": 8.533333333333333, + "userScore": 0 + }, + { + "id": "0236", + "available": 1, + "doctype": 1, + "name": "Alien Messages", + "problemTimeLimit": 5, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 78, + "submissions": 1093, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 18.847209515096065, + "score": 1.641025641025641, + "userScore": 0 + }, + { + "id": "1247", + "available": 1, + "doctype": 2, + "name": "Monster Trap", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 23, + "submissions": 125, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 46.4, + "score": 5.565217391304348, + "userScore": 0 + }, + { + "id": "3428", + "available": 1, + "doctype": 1, + "name": "Fruits On Tree", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 46, + "submissions": 84, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 60.714285714285715, + "score": 2.782608695652174, + "userScore": 0 + }, + { + "id": "2559", + "available": 1, + "doctype": 2, + "name": "Minimum Spanning Tree", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 95, + "submissions": 477, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 37.735849056603776, + "score": 1.3473684210526315, + "userScore": 0 + }, + { + "id": "1667", + "available": 1, + "doctype": 4, + "name": "Efficient Problem Set", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 98, + "submissions": 502, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 27.290836653386453, + "score": 1.3061224489795917, + "userScore": 0 + }, + { + "id": "1190", + "available": 2, + "doctype": 4, + "name": "Anchored Balloon", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 258, + "submissions": 695, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 55.10791366906475, + "score": 0.49612403100775193, + "userScore": 0 + }, + { + "id": "3124", + "available": 3, + "doctype": 1, + "name": "Run, Twins", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 196, + "submissions": 229, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 87.33624454148472, + "score": 0.6530612244897959, + "userScore": 0 + }, + { + "id": "2560", + "available": 3, + "doctype": 2, + "name": "Point Distance", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 55, + "submissions": 311, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.79742765273312, + "score": 2.327272727272727, + "userScore": 0 + }, + { + "id": "2525", + "available": 1, + "doctype": 1, + "name": "Change", + "problemTimeLimit": 2, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 78, + "submissions": 170, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.76470588235294, + "score": 1.641025641025641, + "userScore": 0 + }, + { + "id": "2020", + "available": 1, + "doctype": 1, + "name": "Princess's Japanese", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 135, + "submissions": 438, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 33.56164383561644, + "score": 0.9481481481481482, + "userScore": 0 + }, + { + "id": "0346", + "available": 1, + "doctype": 1, + "name": "Cuboid Made with Bars", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 426, + "submissions": 831, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 59.80746089049338, + "score": 0.3004694835680751, + "userScore": 0 + }, + { + "id": "1641", + "available": 1, + "doctype": 4, + "name": "Contact Tracer", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 505, + "submissions": 916, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 66.5938864628821, + "score": 0.25346534653465347, + "userScore": 0 + }, + { + "id": "1658", + "available": 1, + "doctype": 4, + "name": "Training Schedule for ICPC", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 160, + "submissions": 406, + "recommendations": 5, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 42.364532019704434, + "score": 0.8, + "userScore": 0 + }, + { + "id": "3142", + "available": 1, + "doctype": 1, + "name": "Tree of Peony", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 64, + "submissions": 222, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 32.432432432432435, + "score": 2, + "userScore": 0 + }, + { + "id": "INFO1_11_B", + "available": 1, + "doctype": 4, + "name": "Line Input and Reverse Order Output", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 100, + "solvedUser": 488, + "submissions": 708, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 78.24858757062147, + "score": 0.26229508196721313, + "userScore": 0 + }, + { + "id": "3269", + "available": 1, + "doctype": 1, + "name": "LCM Tour", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 92, + "submissions": 168, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 58.333333333333336, + "score": 1.391304347826087, + "userScore": 0 + }, + { + "id": "2563", + "available": 1, + "doctype": 2, + "name": "The J-th Number", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 44, + "submissions": 304, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 22.69736842105263, + "score": 2.909090909090909, + "userScore": 0 + }, + { + "id": "0742", + "available": 1, + "doctype": 1, + "name": "Score", + "problemTimeLimit": 2, + "problemMemoryLimit": 1048576, + "maxScore": 0, + "solvedUser": 303, + "submissions": 721, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.20804438280167, + "score": 0.42244224422442245, + "userScore": 0 + }, + { + "id": "3059", + "available": 3, + "doctype": 1, + "name": "Shuffle 2", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 25, + "submissions": 99, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.303030303030305, + "score": 5.12, + "userScore": 0 + }, + { + "id": "2133", + "available": 2, + "doctype": 2, + "name": "Alice and Bob", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 5, + "submissions": 37, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 27.027027027027028, + "score": 16, + "userScore": 0 + }, + { + "id": "2567", + "available": 1, + "doctype": 2, + "name": "SIRO Challenge", + "problemTimeLimit": 8, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 141, + "submissions": 392, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 42.09183673469388, + "score": 0.9078014184397163, + "userScore": 0 + }, + { + "id": "2829", + "available": 1, + "doctype": 1, + "name": "Room Assignment", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 46, + "submissions": 108, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 53.7037037037037, + "score": 2.782608695652174, + "userScore": 0 + }, + { + "id": "2372", + "available": 1, + "doctype": 1, + "name": "IkaNumber", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 105, + "submissions": 274, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 50.72992700729927, + "score": 1.2190476190476192, + "userScore": 0 + }, + { + "id": "ALDS1_15_C", + "available": 1, + "doctype": 4, + "name": "Activity Selection Problem", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 100, + "solvedUser": 548, + "submissions": 2875, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.130434782608695, + "score": 0.25, + "userScore": 0 + }, + { + "id": "0786", + "available": 1, + "doctype": 1, + "name": "Dance", + "problemTimeLimit": 2, + "problemMemoryLimit": 1048576, + "maxScore": 0, + "solvedUser": 68, + "submissions": 150, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 53.333333333333336, + "score": 1.8823529411764706, + "userScore": 0 + }, + { + "id": "3207", + "available": 2, + "doctype": 1, + "name": "Kyopro is Useful for Asteroid Exploration", + "problemTimeLimit": 15, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 3, + "submissions": 16, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25, + "score": 16, + "userScore": 0 + }, + { + "id": "2954", + "available": 1, + "doctype": 1, + "name": "Skewering", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 79, + "submissions": 178, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.68539325842696, + "score": 1.620253164556962, + "userScore": 0 + }, + { + "id": "ALDS2_1_A", + "available": 1, + "doctype": 4, + "name": "Rotations", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 100, + "solvedUser": 29, + "submissions": 46, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 71.73913043478261, + "score": 4.413793103448276, + "userScore": 0 + }, + { + "id": "0462", + "available": 2, + "doctype": 4, + "name": "The Shortest Path on the Spider's Web", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 45, + "submissions": 149, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.241610738255034, + "score": 2.8444444444444446, + "userScore": 0 + }, + { + "id": "2196", + "available": 1, + "doctype": 1, + "name": "Chat noir", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 1, + "submissions": 16, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 6.25, + "score": 16, + "userScore": 0 + }, + { + "id": "2317", + "available": 1, + "doctype": 1, + "name": "Class Representative Witch", + "problemTimeLimit": 2, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 117, + "submissions": 390, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 39.23076923076923, + "score": 1.0940170940170941, + "userScore": 0 + }, + { + "id": "2488", + "available": 1, + "doctype": 2, + "name": "Tree Construction", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 48, + "submissions": 119, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 63.865546218487395, + "score": 2.6666666666666665, + "userScore": 0 + }, + { + "id": "2956", + "available": 1, + "doctype": 1, + "name": "Jam", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 57, + "submissions": 126, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 48.41269841269841, + "score": 2.245614035087719, + "userScore": 0 + }, + { + "id": "2753", + "available": 3, + "doctype": 1, + "name": "Lie with Mean Value", + "problemTimeLimit": 5, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 151, + "submissions": 327, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 49.235474006116206, + "score": 0.847682119205298, + "userScore": 0 + }, + { + "id": "3621", + "available": 1, + "doctype": 2, + "name": "Edit distance on table", + "problemTimeLimit": 3, + "problemMemoryLimit": 2097152, + "maxScore": 0, + "solvedUser": 5, + "submissions": 11, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 63.63636363636363, + "score": 16, + "userScore": 0 + }, + { + "id": "0484", + "available": 1, + "doctype": 1, + "name": "Split Time", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 284, + "submissions": 711, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 43.60056258790436, + "score": 0.4507042253521127, + "userScore": 0 + }, + { + "id": "2105", + "available": 1, + "doctype": 1, + "name": "Rhythm Machine", + "problemTimeLimit": 5, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 66, + "submissions": 373, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 20.37533512064343, + "score": 1.9393939393939394, + "userScore": 0 + }, + { + "id": "3322", + "available": 1, + "doctype": 1, + "name": "Re:Square", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 30, + "submissions": 53, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 56.60377358490566, + "score": 4.266666666666667, + "userScore": 0 + }, + { + "id": "2053", + "available": 1, + "doctype": 2, + "name": "Controlled Tournament", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 15, + "submissions": 80, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 21.25, + "score": 8.533333333333333, + "userScore": 0 + }, + { + "id": "0162", + "available": 1, + "doctype": 1, + "name": "Hamming Numbers", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 626, + "submissions": 1317, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 61.5793470007593, + "score": 0.25, + "userScore": 0 + }, + { + "id": "ALDS1_9_C", + "available": 1, + "doctype": 4, + "name": "Priority Queue", + "problemTimeLimit": 2, + "problemMemoryLimit": 131072, + "maxScore": 100, + "solvedUser": 5127, + "submissions": 26394, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 42.7710843373494, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2617", + "available": 1, + "doctype": 1, + "name": "Air Pollution", + "problemTimeLimit": 2, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 75, + "submissions": 133, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 61.65413533834587, + "score": 1.7066666666666668, + "userScore": 0 + }, + { + "id": "3526", + "available": 1, + "doctype": 1, + "name": "Finding Num", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 102, + "submissions": 167, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 80.23952095808383, + "score": 1.2549019607843137, + "userScore": 0 + }, + { + "id": "2693", + "available": 1, + "doctype": 2, + "name": "JAG-channel II", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 47, + "submissions": 165, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 40, + "score": 2.723404255319149, + "userScore": 0 + }, + { + "id": "2276", + "available": 2, + "doctype": 1, + "name": "Ball", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 37, + "submissions": 202, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 33.663366336633665, + "score": 3.4594594594594597, + "userScore": 0 + }, + { + "id": "CGL_3_B", + "available": 1, + "doctype": 4, + "name": "Is-Convex", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 100, + "solvedUser": 953, + "submissions": 2641, + "recommendations": 5, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 53.01022340022719, + "score": 0.25, + "userScore": 0 + }, + { + "id": "3062", + "available": 1, + "doctype": 1, + "name": "Product", + "problemTimeLimit": 4, + "problemMemoryLimit": 65536, + "maxScore": 0, + "solvedUser": 23, + "submissions": 163, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 19.01840490797546, + "score": 5.565217391304348, + "userScore": 0 + }, + { + "id": "2796", + "available": 1, + "doctype": 1, + "name": "Folding Paper", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 7, + "submissions": 19, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.8421052631579, + "score": 16, + "userScore": 0 + }, + { + "id": "3639", + "available": 1, + "doctype": 2, + "name": "Commutativity", + "problemTimeLimit": 2, + "problemMemoryLimit": 2097152, + "maxScore": 0, + "solvedUser": 4, + "submissions": 8, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 75, + "score": 16, + "userScore": 0 + }, + { + "id": "3520", + "available": 1, + "doctype": 1, + "name": "Maze-Break", + "problemTimeLimit": 4, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 8, + "submissions": 45, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.88888888888889, + "score": 16, + "userScore": 0 + }, + { + "id": "3335", + "available": 1, + "doctype": 1, + "name": "01 Swap", + "problemTimeLimit": 4, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 12, + "submissions": 31, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.61290322580645, + "score": 10.666666666666666, + "userScore": 0 + }, + { + "id": "2895", + "available": 1, + "doctype": 1, + "name": "Palindromic Subsequences", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 128, + "submissions": 343, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 45.77259475218659, + "score": 1, + "userScore": 0 + }, + { + "id": "1118", + "available": 1, + "doctype": 2, + "name": "Nets of Dice", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 55, + "submissions": 139, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 47.48201438848921, + "score": 2.327272727272727, + "userScore": 0 + }, + { + "id": "3006", + "available": 1, + "doctype": 1, + "name": "Chairs", + "problemTimeLimit": 2, + "problemMemoryLimit": 262142, + "maxScore": 0, + "solvedUser": 23, + "submissions": 97, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.927835051546392, + "score": 5.565217391304348, + "userScore": 0 + }, + { + "id": "0210", + "available": 1, + "doctype": 1, + "name": "The Squares", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 172, + "submissions": 826, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25.66585956416465, + "score": 0.7441860465116279, + "userScore": 0 + }, + { + "id": "DPL_5_L", + "available": 1, + "doctype": 4, + "name": "Balls and Boxes 12", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 100, + "solvedUser": 303, + "submissions": 546, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 67.58241758241758, + "score": 0.42244224422442245, + "userScore": 0 + }, + { + "id": "ITP1_4_A", + "available": 2, + "doctype": 4, + "name": "A / B Problem", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 100, + "solvedUser": 34262, + "submissions": 156824, + "recommendations": 70, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.799494975258888, + "score": 0.25, + "userScore": 0 + }, + { + "id": "2098", + "available": 1, + "doctype": 2, + "name": "Two-finger Programming", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 6, + "submissions": 13, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 61.53846153846154, + "score": 16, + "userScore": 0 + }, + { + "id": "2308", + "available": 1, + "doctype": 2, + "name": "White Bird", + "problemTimeLimit": 5, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 161, + "submissions": 1452, + "recommendations": 2, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 30.303030303030305, + "score": 0.7950310559006211, + "userScore": 0 + }, + { + "id": "ALDS1_15_D", + "available": 1, + "doctype": 4, + "name": "Huffman Coding", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 100, + "solvedUser": 406, + "submissions": 1531, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 48.26910516002613, + "score": 0.31527093596059114, + "userScore": 0 + }, + { + "id": "3074", + "available": 1, + "doctype": 1, + "name": "Gold Rush", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 3, + "submissions": 5, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 100, + "score": 16, + "userScore": 0 + }, + { + "id": "0570", + "available": 1, + "doctype": 1, + "name": "Zig-Zag Numbers", + "problemTimeLimit": 8, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 201, + "submissions": 663, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 45.55052790346908, + "score": 0.6368159203980099, + "userScore": 0 + }, + { + "id": "2865", + "available": 1, + "doctype": 2, + "name": "Farm Village", + "problemTimeLimit": 2, + "problemMemoryLimit": 524288, + "maxScore": 0, + "solvedUser": 17, + "submissions": 131, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 25.19083969465649, + "score": 7.529411764705882, + "userScore": 0 + }, + { + "id": "0639", + "available": 1, + "doctype": 4, + "name": "Soccer", + "problemTimeLimit": 3, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 22, + "submissions": 45, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 51.111111111111114, + "score": 5.818181818181818, + "userScore": 0 + }, + { + "id": "0260", + "available": 1, + "doctype": 1, + "name": "Salary for a Plumber", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 485, + "submissions": 2044, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 31.996086105675147, + "score": 0.2639175257731959, + "userScore": 0 + }, + { + "id": "2256", + "available": 2, + "doctype": 1, + "name": "Divide the Cake", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 119, + "submissions": 534, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.089887640449437, + "score": 1.0756302521008403, + "userScore": 0 + }, + { + "id": "2190", + "available": 1, + "doctype": 1, + "name": "Angel Stairs", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 106, + "submissions": 445, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 36.853932584269664, + "score": 1.2075471698113207, + "userScore": 0 + }, + { + "id": "3531", + "available": 1, + "doctype": 1, + "name": "Mirrored string", + "problemTimeLimit": 2, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 70, + "submissions": 131, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 61.06870229007634, + "score": 1.8285714285714285, + "userScore": 0 + }, + { + "id": "3600", + "available": 1, + "doctype": 2, + "name": "Sum of Product of Binomial Coefficients", + "problemTimeLimit": 2, + "problemMemoryLimit": 2097152, + "maxScore": 0, + "solvedUser": 7, + "submissions": 9, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 100, + "score": 16, + "userScore": 0 + }, + { + "id": "1357", + "available": 2, + "doctype": 2, + "name": "Squeeze the Cylinders", + "problemTimeLimit": 1, + "problemMemoryLimit": 262144, + "maxScore": 0, + "solvedUser": 343, + "submissions": 728, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 57.967032967032964, + "score": 0.37317784256559766, + "userScore": 0 + }, + { + "id": "0230", + "available": 1, + "doctype": 1, + "name": "Ninja Climbing", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 243, + "submissions": 1120, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 28.303571428571427, + "score": 0.5267489711934157, + "userScore": 0 + }, + { + "id": "NTL_1_D", + "available": 1, + "doctype": 4, + "name": "Euler's Phi Function", + "problemTimeLimit": 1, + "problemMemoryLimit": 131072, + "maxScore": 100, + "solvedUser": 1366, + "submissions": 3361, + "recommendations": 6, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 53.16869979172865, + "score": 0.25, + "userScore": 0 + }, + { + "id": "9913", + "available": 1, + "doctype": 1, + "name": "UF", + "problemTimeLimit": 8, + "problemMemoryLimit": 1048576, + "maxScore": 0, + "solvedUser": 1, + "submissions": 14, + "recommendations": 0, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 71.42857142857143, + "score": 16, + "userScore": 0 + }, + { + "id": "2025", + "available": 1, + "doctype": 2, + "name": "Eight Princes", + "problemTimeLimit": 8, + "problemMemoryLimit": 131072, + "maxScore": 0, + "solvedUser": 44, + "submissions": 99, + "recommendations": 1, + "isSolved": false, + "bookmark": false, + "recommend": false, + "successRate": 52.525252525252526, + "score": 2.909090909090909, + "userScore": 0 + } +] \ No newline at end of file diff --git a/src/lib/clients/fixtures/aizu_online_judge/tasks.json b/src/lib/clients/fixtures/aizu_online_judge/tasks.json deleted file mode 100644 index 3969039f9..000000000 --- a/src/lib/clients/fixtures/aizu_online_judge/tasks.json +++ /dev/null @@ -1,702 +0,0 @@ -[ - { - "id": "ITP1_4_B", - "contest_id": "ITP1", - "problem_index": "ITP1_4_B", - "task_id": "ITP1_4_B", - "title": "Circle" - }, - { - "id": "CGL_5_A", - "contest_id": "CGL", - "problem_index": "CGL_5_A", - "task_id": "CGL_5_A", - "title": "Closest Pair" - }, - { - "id": "INFO1_13_G", - "contest_id": "INFO1", - "problem_index": "INFO1_13_G", - "task_id": "INFO1_13_G", - "title": "Function Creating an Array from Arrays" - }, - { - "id": "4029", - "contest_id": "PCKFinal2023", - "problem_index": "4029", - "task_id": "4029", - "title": "Predicting Rankings" - }, - { - "id": "0065", - "contest_id": "PCKFinal2004", - "problem_index": "0065", - "task_id": "0065", - "title": "Trading" - }, - { - "id": "0053", - "contest_id": "PCKFinal2004", - "problem_index": "0053", - "task_id": "0053", - "title": "Sum of Prime Numbers" - }, - { - "id": "0139", - "contest_id": "PCKFinal2006", - "problem_index": "0139", - "task_id": "0139", - "title": "Snakes" - }, - { - "id": "0010", - "contest_id": "PCKFinal2003", - "problem_index": "0010", - "task_id": "0010", - "title": "Circumscribed Circle of a Triangle" - }, - { - "id": "0404", - "contest_id": "PCKPrelim2019", - "problem_index": "0404", - "task_id": "0404", - "title": "Shiba Inu" - }, - { - "id": "0218", - "contest_id": "PCKPrelim2010", - "problem_index": "0218", - "task_id": "0218", - "title": "Dividing Students" - }, - { - "id": "0153", - "contest_id": "PCKPrelim2007", - "problem_index": "0153", - "task_id": "0153", - "title": "Triangle and Circle" - }, - { - "id": "0475", - "contest_id": "PCKFinal2021", - "problem_index": "0475", - "task_id": "0475", - "title": "School Road" - }, - { - "id": "0320", - "contest_id": "PCKPrelim2015", - "problem_index": "0320", - "task_id": "0320", - "title": "Quality Management" - }, - { - "id": "0461", - "contest_id": "PCKPrelim2021", - "problem_index": "0461", - "task_id": "0461", - "title": "Odd and Even Spirit" - }, - { - "id": "ALDS1_1_A", - "contest_id": "ALDS1", - "problem_index": "ALDS1_1_A", - "task_id": "ALDS1_1_A", - "title": "Insertion Sort" - }, - { - "id": "0054", - "contest_id": "PCKFinal2004", - "problem_index": "0054", - "task_id": "0054", - "title": "Sum of Nth decimal places" - }, - { - "id": "ITP1_1_C", - "contest_id": "ITP1", - "problem_index": "ITP1_1_C", - "task_id": "ITP1_1_C", - "title": "Rectangle" - }, - { - "id": "ITP1_3_A", - "contest_id": "ITP1", - "problem_index": "ITP1_3_A", - "task_id": "ITP1_3_A", - "title": "Print Many Hello World" - }, - { - "id": "0359", - "contest_id": "PCKPrelim2017", - "problem_index": "0359", - "task_id": "0359", - "title": "Day of Week" - }, - { - "id": "DSL_2_B", - "contest_id": "DSL", - "problem_index": "DSL_2_B", - "task_id": "DSL_2_B", - "title": "Range Sum Query (RSQ)" - }, - { - "id": "0314", - "contest_id": "PCKFinal2014", - "problem_index": "0314", - "task_id": "0314", - "title": "The Kingdom of Akabeko" - }, - { - "id": "0204", - "contest_id": "PCKPrelim2009", - "problem_index": "0204", - "task_id": "0204", - "title": "UFO Shooting Down Operation" - }, - { - "id": "ALDS1_7_C", - "contest_id": "ALDS1", - "problem_index": "ALDS1_7_C", - "task_id": "ALDS1_7_C", - "title": "Tree Walk" - }, - { - "id": "ITP1_5_B", - "contest_id": "ITP1", - "problem_index": "ITP1_5_B", - "task_id": "ITP1_5_B", - "title": "Print a Frame" - }, - { - "id": "INFO1_13_D", - "contest_id": "INFO1", - "problem_index": "INFO1_13_D", - "task_id": "INFO1_13_D", - "title": "Array Argument and Procedure" - }, - { - "id": "DPL_5_H", - "contest_id": "DPL", - "problem_index": "DPL_5_H", - "task_id": "DPL_5_H", - "title": "Balls and Boxes 8" - }, - { - "id": "ALDS1_12_C", - "contest_id": "ALDS1", - "problem_index": "ALDS1_12_C", - "task_id": "ALDS1_12_C", - "title": "Single Source Shortest Path II" - }, - { - "id": "INFO1_07_A", - "contest_id": "INFO1", - "problem_index": "INFO1_07_A", - "task_id": "INFO1_07_A", - "title": "Branch 1" - }, - { - "id": "0177", - "contest_id": "PCKPrelim2008", - "problem_index": "0177", - "task_id": "0177", - "title": "Distance Between Two Cities" - }, - { - "id": "0122", - "contest_id": "PCKFinal2005", - "problem_index": "0122", - "task_id": "0122", - "title": "Summer of Pyonkichi" - }, - { - "id": "0007", - "contest_id": "PCKFinal2003", - "problem_index": "0007", - "task_id": "0007", - "title": "Debt Hell" - }, - { - "id": "0428", - "contest_id": "PCKPrelim2020", - "problem_index": "0428", - "task_id": "0428", - "title": "Longitude and Latitude" - }, - { - "id": "TRC_1_A", - "contest_id": "TRC", - "problem_index": "TRC_1_A", - "task_id": "TRC_1_A", - "title": "A" - }, - { - "id": "0423", - "contest_id": "PCKFinal2019", - "problem_index": "0423", - "task_id": "0423", - "title": "Gym with Many Rules" - }, - { - "id": "CGL_2_C", - "contest_id": "CGL", - "problem_index": "CGL_2_C", - "task_id": "CGL_2_C", - "title": "Cross Point" - }, - { - "id": "INFO1_05_E", - "contest_id": "INFO1", - "problem_index": "INFO1_05_E", - "task_id": "INFO1_05_E", - "title": "Evaluation 1" - }, - { - "id": "DPL_2_B", - "contest_id": "DPL", - "problem_index": "DPL_2_B", - "task_id": "DPL_2_B", - "title": "Chinese Postman Problem" - }, - { - "id": "0238", - "contest_id": "PCKPrelim2011", - "problem_index": "0238", - "task_id": "0238", - "title": "Time to Study" - }, - { - "id": "4023", - "contest_id": "PCKFinal2023", - "problem_index": "4023", - "task_id": "4023", - "title": "Waffle with Holes" - }, - { - "id": "ITP2_1_A", - "contest_id": "ITP2", - "problem_index": "ITP2_1_A", - "task_id": "ITP2_1_A", - "title": "Vector" - }, - { - "id": "0405", - "contest_id": "PCKPrelim2019", - "problem_index": "0405", - "task_id": "0405", - "title": "ASCII Characters" - }, - { - "id": "GRL_5_D", - "contest_id": "GRL", - "problem_index": "GRL_5_D", - "task_id": "GRL_5_D", - "title": "Range Query on a Tree" - }, - { - "id": "0425", - "contest_id": "PCKFinal2019", - "problem_index": "0425", - "task_id": "0425", - "title": "Chemical Substance Alpha" - }, - { - "id": "ALDS1_1_C", - "contest_id": "ALDS1", - "problem_index": "ALDS1_1_C", - "task_id": "ALDS1_1_C", - "title": "Prime Numbers" - }, - { - "id": "ALDS1_13_B", - "contest_id": "ALDS1", - "problem_index": "ALDS1_13_B", - "task_id": "ALDS1_13_B", - "title": "8 Puzzle" - }, - { - "id": "0247", - "contest_id": "PCKPrelim2011", - "problem_index": "0247", - "task_id": "0247", - "title": "Ice Maze" - }, - { - "id": "4033", - "contest_id": "PCKFinal2023", - "problem_index": "4033", - "task_id": "4033", - "title": "Skewered Dumplings" - }, - { - "id": "0079", - "contest_id": "PCKPrelim2005", - "problem_index": "0079", - "task_id": "0079", - "title": "Area of Polygon" - }, - { - "id": "0279", - "contest_id": "PCKPrelim2013", - "problem_index": "0279", - "task_id": "0279", - "title": "A Pair of Prizes" - }, - { - "id": "4018", - "contest_id": "PCKPrelim2023", - "problem_index": "4018", - "task_id": "4018", - "title": "Sorting Balls" - }, - { - "id": "GRL_5_E", - "contest_id": "GRL", - "problem_index": "GRL_5_E", - "task_id": "GRL_5_E", - "title": "Range Query on a Tree II" - }, - { - "id": "0161", - "contest_id": "PCKFinal2007", - "problem_index": "0161", - "task_id": "0161", - "title": "Sport Meet" - }, - { - "id": "0438", - "contest_id": "PCKPrelim2020", - "problem_index": "0438", - "task_id": "0438", - "title": "Passport" - }, - { - "id": "0223", - "contest_id": "PCKPrelim2010", - "problem_index": "0223", - "task_id": "0223", - "title": "Stray Twins" - }, - { - "id": "ITP2_3_D", - "contest_id": "ITP2", - "problem_index": "ITP2_3_D", - "task_id": "ITP2_3_D", - "title": "Lexicographical Comparison" - }, - { - "id": "0351", - "contest_id": "PCKFinal2016", - "problem_index": "0351", - "task_id": "0351", - "title": "Quiet Town" - }, - { - "id": "0385", - "contest_id": "PCKPrelim2018", - "problem_index": "0385", - "task_id": "0385", - "title": "Bozo Sort" - }, - { - "id": "0334", - "contest_id": "PCKFinal2015", - "problem_index": "0334", - "task_id": "0334", - "title": "Amidakuji" - }, - { - "id": "ALDS1_3_A", - "contest_id": "ALDS1", - "problem_index": "ALDS1_3_A", - "task_id": "ALDS1_3_A", - "title": "Stack" - }, - { - "id": "0001", - "contest_id": "PCKFinal2003", - "problem_index": "0001", - "task_id": "0001", - "title": "List of Top 3 Hills" - }, - { - "id": "ALDS1_13_C", - "contest_id": "ALDS1", - "problem_index": "ALDS1_13_C", - "task_id": "ALDS1_13_C", - "title": "15 Puzzle" - }, - { - "id": "INFO1_02_C", - "contest_id": "INFO1", - "problem_index": "INFO1_02_C", - "task_id": "INFO1_02_C", - "title": "Two Variables" - }, - { - "id": "CGL_7_G", - "contest_id": "CGL", - "problem_index": "CGL_7_G", - "task_id": "CGL_7_G", - "title": "Common Tangent" - }, - { - "id": "ALDS1_3_B", - "contest_id": "ALDS1", - "problem_index": "ALDS1_3_B", - "task_id": "ALDS1_3_B", - "title": "Queue" - }, - { - "id": "0263", - "contest_id": "PCKPrelim2012", - "problem_index": "0263", - "task_id": "0263", - "title": "Beat Panel" - }, - { - "id": "0402", - "contest_id": "PCKFinal2018", - "problem_index": "0402", - "task_id": "0402", - "title": "Kth XOR" - }, - { - "id": "INFO1_05_A", - "contest_id": "INFO1", - "problem_index": "INFO1_05_A", - "task_id": "INFO1_05_A", - "title": "Equivalence" - }, - { - "id": "0261", - "contest_id": "PCKPrelim2012", - "problem_index": "0261", - "task_id": "0261", - "title": "Mayan Crucial Prediction" - }, - { - "id": "ITP1_10_B", - "contest_id": "ITP1", - "problem_index": "ITP1_10_B", - "task_id": "ITP1_10_B", - "title": "Triangle" - }, - { - "id": "0427", - "contest_id": "PCKFinal2019", - "problem_index": "0427", - "task_id": "0427", - "title": "Resource of the Planet Yanaizu" - }, - { - "id": "ALDS1_6_C", - "contest_id": "ALDS1", - "problem_index": "ALDS1_6_C", - "task_id": "ALDS1_6_C", - "title": "Quick Sort" - }, - { - "id": "0236", - "contest_id": "PCKFinal2010", - "problem_index": "0236", - "task_id": "0236", - "title": "Alien Messages" - }, - { - "id": "0094", - "contest_id": "PCKFinal2005", - "problem_index": "0094", - "task_id": "0094", - "title": "Calculation of Area" - }, - { - "id": "INFO1_12_E", - "contest_id": "INFO1", - "problem_index": "INFO1_12_E", - "task_id": "INFO1_12_E", - "title": "3D Array" - }, - { - "id": "0206", - "contest_id": "PCKFinal2009", - "problem_index": "0206", - "task_id": "0206", - "title": "Next Trip" - }, - { - "id": "0230", - "contest_id": "PCKFinal2010", - "problem_index": "0230", - "task_id": "0230", - "title": "Ninja Climbing" - }, - { - "id": "0224", - "contest_id": "PCKPrelim2010", - "problem_index": "0224", - "task_id": "0224", - "title": "Bicycle Diet" - }, - { - "id": "0103", - "contest_id": "PCKFinal2005", - "problem_index": "0103", - "task_id": "0103", - "title": "Baseball Simulation" - }, - { - "id": "CGL_3_C", - "contest_id": "CGL", - "problem_index": "CGL_3_C", - "task_id": "CGL_3_C", - "title": "Polygon-Point Containment" - }, - { - "id": "ALDS1_12_A", - "contest_id": "ALDS1", - "problem_index": "ALDS1_12_A", - "task_id": "ALDS1_12_A", - "title": "Minimum Spanning Tree" - }, - { - "id": "DPL_5_J", - "contest_id": "DPL", - "problem_index": "DPL_5_J", - "task_id": "DPL_5_J", - "title": "Balls and Boxes 10" - }, - { - "id": "0278", - "contest_id": "PCKPrelim2013", - "problem_index": "0278", - "task_id": "0278", - "title": "Admission Fee" - }, - { - "id": "CGL_6_A", - "contest_id": "CGL", - "problem_index": "CGL_6_A", - "task_id": "CGL_6_A", - "title": "Segment Intersections: Manhattan Geometry" - }, - { - "id": "0120", - "contest_id": "PCKFinal2005", - "problem_index": "0120", - "task_id": "0120", - "title": "Patisserie" - }, - { - "id": "0393", - "contest_id": "PCKFinal2018", - "problem_index": "0393", - "task_id": "0393", - "title": "Design of a Mansion" - }, - { - "id": "4020", - "contest_id": "PCKPrelim2023", - "problem_index": "4020", - "task_id": "4020", - "title": "Colored Pencils and Caps" - }, - { - "id": "4019", - "contest_id": "PCKPrelim2023", - "problem_index": "4019", - "task_id": "4019", - "title": "Collecting Balls" - }, - { - "id": "0421", - "contest_id": "PCKFinal2019", - "problem_index": "0421", - "task_id": "0421", - "title": "Two Polygons" - }, - { - "id": "0377", - "contest_id": "PCKFinal2017", - "problem_index": "0377", - "task_id": "0377", - "title": "Party" - }, - { - "id": "0287", - "contest_id": "PCKFinal2013", - "problem_index": "0287", - "task_id": "0287", - "title": "Jinkoki" - }, - { - "id": "ALDS1_11_D", - "contest_id": "ALDS1", - "problem_index": "ALDS1_11_D", - "task_id": "ALDS1_11_D", - "title": "Connected Components" - }, - { - "id": "ITP1_2_A", - "contest_id": "ITP1", - "problem_index": "ITP1_2_A", - "task_id": "ITP1_2_A", - "title": "Small, Large, or Equal" - }, - { - "id": "ITP2_5_D", - "contest_id": "ITP2", - "problem_index": "ITP2_5_D", - "task_id": "ITP2_5_D", - "title": "Permutation Enumeration" - }, - { - "id": "0192", - "contest_id": "PCKFinal2008", - "problem_index": "0192", - "task_id": "0192", - "title": "Multistory Parking Lot" - }, - { - "id": "ALDS1_8_B", - "contest_id": "ALDS1", - "problem_index": "ALDS1_8_B", - "task_id": "ALDS1_8_B", - "title": "Binary Search Tree II" - }, - { - "id": "0068", - "contest_id": "PCKFinal2004", - "problem_index": "0068", - "task_id": "0068", - "title": "Enclose Pins with a Rubber Band" - }, - { - "id": "0102", - "contest_id": "PCKFinal2005", - "problem_index": "0102", - "task_id": "0102", - "title": "Matrix-like Computation" - }, - { - "id": "0173", - "contest_id": "PCKPrelim2008", - "problem_index": "0173", - "task_id": "0173", - "title": "Haunted House" - }, - { - "id": "0057", - "contest_id": "PCKFinal2004", - "problem_index": "0057", - "task_id": "0057", - "title": "The Number of Area" - }, - { - "id": "4026", - "contest_id": "PCKFinal2023", - "problem_index": "4026", - "task_id": "4026", - "title": "Roll Cake" - } -] diff --git a/src/lib/clients/fixtures/atcoder_problems/contests.json b/src/lib/clients/fixtures/atcoder_problems/contests.json index f856c1255..7a32c011f 100644 --- a/src/lib/clients/fixtures/atcoder_problems/contests.json +++ b/src/lib/clients/fixtures/atcoder_problems/contests.json @@ -1,702 +1,702 @@ [ { - "id": "past202209-open", - "start_epoch_second": 1662177600, + "id": "abc167", + "start_epoch_second": 1589112000, + "duration_second": 6000, + "title": "AtCoder Beginner Contest 167", + "rate_change": "~ 1999" + }, + { + "id": "jag2014autumn", + "start_epoch_second": 1410660000, "duration_second": 18000, - "title": "第12回 アルゴリズム実技検定 過去問", + "title": "JAG Practice Contest for ACM-ICPC Asia Regional 2014", "rate_change": "-" }, { - "id": "arc152", - "start_epoch_second": 1668945600, - "duration_second": 7200, - "title": "AtCoder Regular Contest 152", - "rate_change": " ~ 2799" + "id": "code-festival-2014-morning-hard", + "start_epoch_second": 1415491200, + "duration_second": 5400, + "title": "CODE FESTIVAL 2014 Hard", + "rate_change": "-" }, { - "id": "arc181", - "start_epoch_second": 1722772800, - "duration_second": 7200, - "title": "AtCoder Regular Contest 181", - "rate_change": " ~ 2799" + "id": "abc351", + "start_epoch_second": 1714219200, + "duration_second": 6000, + "title": "AtCoder Beginner Contest 351", + "rate_change": "~ 1999" }, { - "id": "agc041", - "start_epoch_second": 1577534400, - "duration_second": 9000, - "title": "AtCoder Grand Contest 041", - "rate_change": "All" + "id": "arc056", + "start_epoch_second": 1466856000, + "duration_second": 5400, + "title": "AtCoder Regular Contest 056", + "rate_change": "-" }, { - "id": "abc308", - "start_epoch_second": 1688212800, - "duration_second": 6000, - "title": "CodeQUEEN 2023 予選 (AtCoder Beginner Contest 308)", - "rate_change": " ~ 1999" + "id": "tenka1-2012-final", + "start_epoch_second": 1347685200, + "duration_second": 7200, + "title": "天下一プログラマーコンテスト2012 決勝", + "rate_change": "-" }, { - "id": "abc158", - "start_epoch_second": 1583582400, + "id": "abc395", + "start_epoch_second": 1740830400, "duration_second": 6000, - "title": "AtCoder Beginner Contest 158", - "rate_change": " ~ 1999" + "title": "AtCoder Beginner Contest 395", + "rate_change": "~ 1999" }, { - "id": "code-festival-2016-qualc", - "start_epoch_second": 1477224000, - "duration_second": 7200, - "title": "CODE FESTIVAL 2016 qual C", - "rate_change": "All" + "id": "agc075", + "start_epoch_second": 1766318400, + "duration_second": 10800, + "title": "AtCoder Grand Contest 075", + "rate_change": "2000 ~" }, { - "id": "abc023", - "start_epoch_second": 1431172800, - "duration_second": 7200, - "title": "AtCoder Beginner Contest 023", + "id": "rco-contest-2019-final-open", + "start_epoch_second": 1551502800, + "duration_second": 14400, + "title": "第3回 RCO日本橋ハーフマラソン 本戦 (オープン)", "rate_change": "-" }, { - "id": "agc061", - "start_epoch_second": 1676203200, - "duration_second": 10800, - "title": "AtCoder Grand Contest 061", - "rate_change": "1200 ~ " - }, - { - "id": "abc292", - "start_epoch_second": 1677931200, - "duration_second": 6000, - "title": "AtCoder Beginner Contest 292", - "rate_change": " ~ 1999" + "id": "adt_easy_20231102_2", + "start_epoch_second": 1698917400, + "duration_second": 3600, + "title": "AtCoder Daily Training EASY 2023/11/2 18:30start", + "rate_change": "-" }, { - "id": "dwango2016-finals", - "start_epoch_second": 1455346800, + "id": "nikkei2019-2-qual", + "start_epoch_second": 1573300800, "duration_second": 7200, - "title": "第2回 ドワンゴからの挑戦状 本選", - "rate_change": "-" + "title": "第二回全国統一プログラミング王決定戦予選", + "rate_change": "~ 2799" }, { - "id": "code-thanks-festival-2017-open", - "start_epoch_second": 1512183600, + "id": "agc067", + "start_epoch_second": 1723982400, "duration_second": 10800, - "title": "CODE THANKS FESTIVAL 2017(Parallel)", + "title": "AtCoder Grand Contest 067", + "rate_change": "2000 ~" + }, + { + "id": "arc036", + "start_epoch_second": 1428148800, + "duration_second": 5400, + "title": "AtCoder Regular Contest 036", "rate_change": "-" }, { - "id": "xmascon16noon", - "start_epoch_second": 1482555600, - "duration_second": 14400, - "title": "Xmas Contest 2016 昼の部", + "id": "ahc054", + "start_epoch_second": 1758276000, + "duration_second": 864000, + "title": "ALGO ARTIS プログラミングコンテスト2025 夏(AtCoder Heuristic Contest 054)", + "rate_change": "All" + }, + { + "id": "arc044", + "start_epoch_second": 1442059200, + "duration_second": 5400, + "title": "AtCoder Regular Contest 044", "rate_change": "-" }, { - "id": "snuke21", - "start_epoch_second": 1435986000, + "id": "arc001", + "start_epoch_second": 1334404800, "duration_second": 18000, - "title": "すぬけのお誕生日コンテスト", + "title": "AtCoder Regular Contest 001", "rate_change": "-" }, { - "id": "abl", - "start_epoch_second": 1601121600, + "id": "abc325", + "start_epoch_second": 1697889600, "duration_second": 6000, - "title": "ACL Beginner Contest", - "rate_change": " ~ 1999" + "title": "キーエンスプログラミングコンテスト2023秋(AtCoder Beginner Contest 325)", + "rate_change": "~ 1999" }, { - "id": "summerfes2018-div1", - "start_epoch_second": 1535175000, - "duration_second": 7200, - "title": "Summer Festival Contest 2018 (Division 1)", - "rate_change": "-" + "id": "ahc006", + "start_epoch_second": 1636873200, + "duration_second": 14400, + "title": "京セラプログラミングコンテスト(AtCoder Heuristic Contest 006)", + "rate_change": "All" }, { - "id": "keyence2020", - "start_epoch_second": 1579348800, - "duration_second": 7200, - "title": "キーエンス プログラミング コンテスト 2020", - "rate_change": " ~ 2799" + "id": "joi2014ho", + "start_epoch_second": 1391907600, + "duration_second": 14400, + "title": "第13回日本情報オリンピック 本選(過去問)", + "rate_change": "-" }, { - "id": "abc229", - "start_epoch_second": 1638014400, + "id": "joi2020yo1b", + "start_epoch_second": 1572152400, "duration_second": 6000, - "title": "NECプログラミングコンテスト2021(AtCoder Beginner Contest 229)", - "rate_change": " ~ 1999" + "title": "JOI 2019/2020 一次予選 (第2回) 過去問", + "rate_change": "-" }, { - "id": "arc015", - "start_epoch_second": 1380974400, - "duration_second": 5400, - "title": "AtCoder Regular Contest 015", + "id": "yahoo-procon2019-final", + "start_epoch_second": 1550897400, + "duration_second": 7200, + "title": "「みんなのプロコン 2019」決勝", "rate_change": "-" }, { - "id": "abc289", - "start_epoch_second": 1676116800, + "id": "jsc2025-final", + "start_epoch_second": 1756012200, + "duration_second": 10800, + "title": "第六回日本最強プログラマー学生選手権 -決勝-", + "rate_change": "-" + }, + { + "id": "abc074", + "start_epoch_second": 1505563200, "duration_second": 6000, - "title": "Sky株式会社プログラミングコンテスト2023(AtCoder Beginner Contest 289)", - "rate_change": " ~ 1999" + "title": "AtCoder Beginner Contest 074", + "rate_change": "~ 1199" }, { - "id": "abc236", - "start_epoch_second": 1642939200, + "id": "abc373", + "start_epoch_second": 1727524800, "duration_second": 6000, - "title": "AtCoder Beginner Contest 236", - "rate_change": " ~ 1999" + "title": "AtCoder Beginner Contest 373", + "rate_change": "~ 1999" }, { - "id": "arc017", - "start_epoch_second": 1391947200, - "duration_second": 5400, - "title": "AtCoder Regular Contest 017", + "id": "xmascontest2015noon", + "start_epoch_second": 1450933200, + "duration_second": 14400, + "title": "Xmas Contest 2015 昼の部", "rate_change": "-" }, { - "id": "adt_medium_20231025_2", - "start_epoch_second": 1698224400, - "duration_second": 3600, - "title": "AtCoder Daily Training MEDIUM 2023/10/25 18:00start", - "rate_change": "-" + "id": "agc050", + "start_epoch_second": 1608984000, + "duration_second": 12600, + "title": "AtCoder Grand Contest 050 (Good Bye rng_58 Day 1)", + "rate_change": "2000 ~" }, { - "id": "joiopen2012b", - "start_epoch_second": 1347872400, - "duration_second": 18000, - "title": "JOI Open Contest 2012 B", - "rate_change": "-" + "id": "arc106", + "start_epoch_second": 1603540800, + "duration_second": 6000, + "title": "AtCoder Regular Contest 106", + "rate_change": "~ 2799" }, { - "id": "code-thanks-festival-2018", - "start_epoch_second": 1543114800, - "duration_second": 10800, - "title": "CODE THANKS FESTIVAL 2018", + "id": "ijpc2015", + "start_epoch_second": 1445142600, + "duration_second": 18000, + "title": "IOIer Japan Programming Contest 2015", "rate_change": "-" }, { - "id": "abc252", - "start_epoch_second": 1653134400, + "id": "abc335", + "start_epoch_second": 1704542400, "duration_second": 6000, - "title": "AtCoder Beginner Contest 252", - "rate_change": " ~ 1999" + "title": "AtCoder Beginner Contest 335(Sponsored by Mynavi)", + "rate_change": "~ 1999" }, { - "id": "abc196", - "start_epoch_second": 1616241600, + "id": "abc306", + "start_epoch_second": 1687003200, "duration_second": 6000, - "title": "AtCoder Beginner Contest 196", - "rate_change": " ~ 1999" + "title": "トヨタ自動車プログラミングコンテスト2023#3(AtCoder Beginner Contest 306)", + "rate_change": "~ 1999" }, { - "id": "joi2008ho", - "start_epoch_second": 1199113200, - "duration_second": 0, - "title": "第7回日本情報オリンピック 本選(オンライン)", + "id": "arc009", + "start_epoch_second": 1350734400, + "duration_second": 5400, + "title": "AtCoder Regular Contest 009", "rate_change": "-" }, { - "id": "abc022", - "start_epoch_second": 1429963200, - "duration_second": 7200, - "title": "AtCoder Beginner Contest 022", + "id": "s8pc-4", + "start_epoch_second": 1491735600, + "duration_second": 12000, + "title": "square869120Contest #4", "rate_change": "-" }, { - "id": "ahc038", - "start_epoch_second": 1728036000, - "duration_second": 864000, - "title": "トヨタ自動車プログラミングコンテスト2024#10(AtCoder Heuristic Contest 038)", - "rate_change": "All" + "id": "abc135", + "start_epoch_second": 1564228800, + "duration_second": 6000, + "title": "AtCoder Beginner Contest 135", + "rate_change": "~ 1999" }, { - "id": "abc231", - "start_epoch_second": 1639224000, + "id": "arc079", + "start_epoch_second": 1501329600, "duration_second": 6000, - "title": "パナソニックプログラミングコンテスト2021(AtCoder Beginner Contest 231)", - "rate_change": " ~ 1999" + "title": "AtCoder Regular Contest 079", + "rate_change": "~ 2799" }, { - "id": "rcl-contest-2021", - "start_epoch_second": 1630126800, - "duration_second": 14400, - "title": "RECRUIT 日本橋ハーフマラソン 2021", + "id": "adt_easy_20231102_1", + "start_epoch_second": 1698910200, + "duration_second": 3600, + "title": "AtCoder Daily Training EASY 2023/11/2 16:30start", "rate_change": "-" }, { - "id": "judge-update-202004", - "start_epoch_second": 1586088000, - "duration_second": 3600, - "title": "Judge System Update Test Contest 202004", - "rate_change": "-" + "id": "arc141", + "start_epoch_second": 1653825600, + "duration_second": 7200, + "title": "AtCoder Regular Contest 141", + "rate_change": "~ 2799" }, { - "id": "nikkei2019-ex", - "start_epoch_second": 1550391720, - "duration_second": 1200, - "title": "全国統一プログラミング王決定戦 エキシビジョン", + "id": "adt_hard_20231018_1", + "start_epoch_second": 1697612400, + "duration_second": 3600, + "title": "AtCoder Daily Training HARD 2023/10/18 16:00start", "rate_change": "-" }, { - "id": "cf16-final", - "start_epoch_second": 1480131000, + "id": "toyota2023spring-final", + "start_epoch_second": 1679101800, "duration_second": 10800, - "title": "CODE FESTIVAL 2016 Final", - "rate_change": "All" + "title": "Toyota Programming Contest 2023 Spring Final", + "rate_change": "-" }, { - "id": "future-contest-2022-final-open", - "start_epoch_second": 1639791000, + "id": "future-contest-2019-final-open", + "start_epoch_second": 1543627800, "duration_second": 28800, - "title": "HACK TO THE FUTURE 2022 本選 オープンコンテスト", + "title": "HACK TO THE FUTURE 2019 本選オープン", "rate_change": "-" }, { - "id": "tkppc6-2", - "start_epoch_second": 1630209600, - "duration_second": 18000, - "title": "技術室奥プログラミングコンテスト#6 Day2", - "rate_change": "-" + "id": "abc441", + "start_epoch_second": 1768651200, + "duration_second": 6000, + "title": "AtCoder Beginner Contest 441 (Promotion of Engineer Guild Fes)", + "rate_change": "~ 1999" }, { - "id": "arc184", - "start_epoch_second": 1727006400, - "duration_second": 7200, - "title": "AtCoder Regular Contest 184", - "rate_change": "1200 ~ 2799" + "id": "cf17-exhibition-open", + "start_epoch_second": 1511606700, + "duration_second": 3600, + "title": "CODE FESTIVAL 2017 Exhibition (Parallel)", + "rate_change": "-" }, { - "id": "ahc029", - "start_epoch_second": 1703214000, - "duration_second": 378000, - "title": "RECRUIT 日本橋ハーフマラソン 2024冬(AtCoder Heuristic Contest 029)", + "id": "future-contest-2022-qual", + "start_epoch_second": 1635933600, + "duration_second": 864000, + "title": "HACK TO THE FUTURE 2022 予選", "rate_change": "All" }, { - "id": "arc113", - "start_epoch_second": 1613908800, - "duration_second": 7200, - "title": "AtCoder Regular Contest 113", - "rate_change": " ~ 2799" + "id": "ahc042", + "start_epoch_second": 1738490400, + "duration_second": 14400, + "title": "AtCoder Heuristic Contest 042", + "rate_change": "All" }, { - "id": "m-solutions2020", - "start_epoch_second": 1595678400, - "duration_second": 6000, - "title": "M-SOLUTIONS プロコンオープン 2020", - "rate_change": " ~ 1999" + "id": "future-contest-2021-qual", + "start_epoch_second": 1604725200, + "duration_second": 28800, + "title": "HACK TO THE FUTURE 2021 予選", + "rate_change": "-" }, { - "id": "arc039", - "start_epoch_second": 1431777600, - "duration_second": 5400, - "title": "AtCoder Regular Contest 039", + "id": "dwacon2018-final", + "start_epoch_second": 1517641200, + "duration_second": 7200, + "title": "第4回 ドワンゴからの挑戦状 本選", "rate_change": "-" }, { - "id": "arc146", - "start_epoch_second": 1660996800, - "duration_second": 7200, - "title": "AtCoder Regular Contest 146", - "rate_change": " ~ 2799" + "id": "fuka5", + "start_epoch_second": 1338008400, + "duration_second": 10800, + "title": "ふか杯 5th Contest", + "rate_change": "-" }, { - "id": "abc058", - "start_epoch_second": 1491652800, - "duration_second": 6000, - "title": "AtCoder Beginner Contest 058", - "rate_change": " ~ 1199" + "id": "arc182", + "start_epoch_second": 1723377600, + "duration_second": 7200, + "title": "AtCoder Regular Contest 182", + "rate_change": "~ 2799" }, { - "id": "joi2019yo", - "start_epoch_second": 1544328000, + "id": "agc057", + "start_epoch_second": 1651924800, "duration_second": 10800, - "title": "JOI2018/2019 予選ページ", - "rate_change": "-" + "title": "AtCoder Grand Contest 057", + "rate_change": "1200 ~" }, { - "id": "indeednow-qualb", - "start_epoch_second": 1426680000, - "duration_second": 7200, - "title": "Indeedなう(予選B)", - "rate_change": "-" + "id": "abc212", + "start_epoch_second": 1627732800, + "duration_second": 6000, + "title": "AtCoder Beginner Contest 212", + "rate_change": "~ 1999" }, { - "id": "future-contest-2022-final", - "start_epoch_second": 1639791000, - "duration_second": 28800, - "title": "HACK TO THE FUTURE 2022 本選", + "id": "adt_medium_20231024_1", + "start_epoch_second": 1698129000, + "duration_second": 3600, + "title": "AtCoder Daily Training MEDIUM 2023/10/24 15:30start", "rate_change": "-" }, { - "id": "code-festival-2018-qualb", - "start_epoch_second": 1539518400, - "duration_second": 7200, - "title": "CODE FESTIVAL 2018 qual B", - "rate_change": "-" + "id": "arc076", + "start_epoch_second": 1498305600, + "duration_second": 6000, + "title": "AtCoder Regular Contest 076", + "rate_change": "~ 2799" }, { - "id": "adt_hard_20231109_1", - "start_epoch_second": 1699515000, - "duration_second": 3600, - "title": "AtCoder Daily Training HARD 2023/11/9 16:30start", + "id": "arc008", + "start_epoch_second": 1348311600, + "duration_second": 5400, + "title": "AtCoder Regular Contest 008", "rate_change": "-" }, { - "id": "rcl-contest-2020-final-open", - "start_epoch_second": 1583557200, + "id": "rco-contest-2018-qual", + "start_epoch_second": 1518343200, "duration_second": 14400, - "title": "第4回 RECRUIT 日本橋ハーフマラソン 本戦(オープンコンテスト)", + "title": "第2回 RCO日本橋ハーフマラソン 予選", "rate_change": "-" }, { - "id": "abc085", - "start_epoch_second": 1515326400, + "id": "abc408", + "start_epoch_second": 1748692800, "duration_second": 6000, - "title": "AtCoder Beginner Contest 085", - "rate_change": " ~ 1199" + "title": "AtCoder Beginner Contest 408", + "rate_change": "~ 1999" }, { - "id": "joi2017ho", - "start_epoch_second": 1483196400, - "duration_second": 0, - "title": "第16回日本情報オリンピック 本選(オンライン)", + "id": "kupc2018", + "start_epoch_second": 1538280000, + "duration_second": 18000, + "title": "Kyoto University Programming Contest 2018", "rate_change": "-" }, { - "id": "adt_easy_20231031_1", - "start_epoch_second": 1698733800, - "duration_second": 3600, - "title": "AtCoder Daily Training EASY 2023/10/31 15:30start", - "rate_change": "-" + "id": "abc222", + "start_epoch_second": 1633780800, + "duration_second": 6000, + "title": "エクサウィザーズプログラミングコンテスト2021(AtCoder Beginner Contest 222)", + "rate_change": "~ 1999" }, { - "id": "arc071", - "start_epoch_second": 1491652800, + "id": "abc362", + "start_epoch_second": 1720872000, "duration_second": 6000, - "title": "AtCoder Regular Contest 071", - "rate_change": " ~ 2799" + "title": "トヨタ自動車プログラミングコンテスト2024#7(AtCoder Beginner Contest 362)", + "rate_change": "~ 1999" }, { - "id": "abc061", - "start_epoch_second": 1494676800, + "id": "abc334", + "start_epoch_second": 1703332800, "duration_second": 6000, - "title": "AtCoder Beginner Contest 061", - "rate_change": " ~ 1199" + "title": "ユニークビジョンプログラミングコンテスト2023 クリスマス (AtCoder Beginner Contest 334)", + "rate_change": "~ 1999" }, { - "id": "adt_medium_20231108_2", - "start_epoch_second": 1699434000, - "duration_second": 3600, - "title": "AtCoder Daily Training MEDIUM 2023/11/8 18:00start", - "rate_change": "-" + "id": "ahc030", + "start_epoch_second": 1707472800, + "duration_second": 864000, + "title": "THIRD プログラミングコンテスト2023(AtCoder Heuristic Contest 030)", + "rate_change": "All" }, { - "id": "past202112-open", - "start_epoch_second": 1639195200, - "duration_second": 18000, - "title": "第九回 アルゴリズム実技検定", - "rate_change": "-" + "id": "abc067", + "start_epoch_second": 1500120000, + "duration_second": 6000, + "title": "AtCoder Beginner Contest 067", + "rate_change": "~ 1199" }, { - "id": "adt_hard_20231019_1", - "start_epoch_second": 1697700600, + "id": "adt_all_20231102_1", + "start_epoch_second": 1698910200, "duration_second": 3600, - "title": "AtCoder Daily Training HARD 2023/10/19 16:30start", + "title": "AtCoder Daily Training ALL 2023/11/2 16:30start", "rate_change": "-" }, { - "id": "abc345", - "start_epoch_second": 1710590400, - "duration_second": 6000, - "title": "モノグサプログラミングコンテスト2024(AtCoder Beginner Contest 345)", - "rate_change": " ~ 1999" + "id": "arc203", + "start_epoch_second": 1754222400, + "duration_second": 7200, + "title": "AtCoder Regular Contest 203 (Div. 2)", + "rate_change": "1200 ~ 2399" }, { - "id": "abc182", - "start_epoch_second": 1604836800, + "id": "abc219", + "start_epoch_second": 1631966400, "duration_second": 6000, - "title": "AtCoder Beginner Contest 182", - "rate_change": " ~ 1999" + "title": "サイシードプログラミングコンテスト2021(AtCoder Beginner Contest 219)", + "rate_change": "~ 1999" }, { - "id": "adt_all_20231026_2", - "start_epoch_second": 1698312600, - "duration_second": 3600, - "title": "AtCoder Daily Training ALL 2023/10/26 18:30start", + "id": "code-festival-2014-morning-easy", + "start_epoch_second": 1415491200, + "duration_second": 5400, + "title": "CODE FESTIVAL 2014 Easy", "rate_change": "-" }, { - "id": "ahc013", - "start_epoch_second": 1660046400, - "duration_second": 604800, - "title": "RECRUIT 日本橋ハーフマラソン 2022夏(AtCoder Heuristic Contest 013)", - "rate_change": "All" + "id": "code-festival-2014-morning-middle", + "start_epoch_second": 1415491200, + "duration_second": 5400, + "title": "CODE FESTIVAL 2014 Middle", + "rate_change": "-" }, { - "id": "yahoo-procon2017-final-open", - "start_epoch_second": 1490419200, - "duration_second": 7200, - "title": "「みんなのプロコン」本選 オープンコンテスト", + "id": "joisc2010", + "start_epoch_second": 1269045000, + "duration_second": 0, + "title": "2010年 日本情報オリンピック春合宿OJ", "rate_change": "-" }, { - "id": "abc148", - "start_epoch_second": 1577016000, - "duration_second": 6000, - "title": "AtCoder Beginner Contest 148", - "rate_change": " ~ 1999" + "id": "typical90", + "start_epoch_second": 0, + "duration_second": 3153600000, + "title": "競プロ典型 90 問", + "rate_change": "-" }, { - "id": "abc357", - "start_epoch_second": 1717848000, - "duration_second": 6000, - "title": "サントリープログラミングコンテスト2024(AtCoder Beginner Contest 357)", - "rate_change": " ~ 1999" + "id": "arc110", + "start_epoch_second": 1607169600, + "duration_second": 7200, + "title": "鹿島建設プログラミングコンテスト2020 (AtCoder Regular Contest 110)", + "rate_change": "~ 2799" }, { - "id": "abc094", - "start_epoch_second": 1523707800, - "duration_second": 6000, - "title": "AtCoder Beginner Contest 094", - "rate_change": " ~ 1199" + "id": "code-thanks-festival-2014-a-open", + "start_epoch_second": 1417921200, + "duration_second": 10800, + "title": "code thanks festival 2014 A日程(オープンコンテスト)", + "rate_change": "-" }, { - "id": "joi2023ho", - "start_epoch_second": 1676174400, - "duration_second": 14400, - "title": "JOI 2022/2023 本選 過去問", + "id": "birthday0410", + "start_epoch_second": 1391313600, + "duration_second": 18000, + "title": "お誕生日コンテスト", "rate_change": "-" }, { - "id": "abc291", - "start_epoch_second": 1677412800, - "duration_second": 6000, - "title": "AtCoder Beginner Contest 291(Sponsored by TOYOTA SYSTEMS)", - "rate_change": " ~ 1999" + "id": "arc126", + "start_epoch_second": 1632056400, + "duration_second": 7200, + "title": "AtCoder Regular Contest 126", + "rate_change": "~ 2799" }, { - "id": "abc294", - "start_epoch_second": 1679227200, + "id": "abc254", + "start_epoch_second": 1654344000, "duration_second": 6000, - "title": "AtCoder Beginner Contest 294", - "rate_change": " ~ 1999" + "title": "AtCoder Beginner Contest 254", + "rate_change": "~ 1999" }, { - "id": "abc328", - "start_epoch_second": 1699704000, + "id": "abc457", + "start_epoch_second": 1778328000, "duration_second": 6000, - "title": "トヨタ自動車プログラミングコンテスト2023#7(AtCoder Beginner Contest 328)", - "rate_change": " ~ 1999" + "title": "Polaris.AI プログラミングコンテスト 2026(AtCoder Beginner Contest 457)", + "rate_change": "~ 1999" }, { - "id": "pakencamp-2020-day2", - "start_epoch_second": 1609992000, - "duration_second": 10800, - "title": "パ研合宿2020 第2日「パ研杯2020」", + "id": "bcu30-2019", + "start_epoch_second": 1562406300, + "duration_second": 1200, + "title": "プログラミングバトル 本戦 - BCU30", "rate_change": "-" }, { - "id": "yuha-c88", - "start_epoch_second": 1438488000, - "duration_second": 18000, - "title": "YUHA presents C88 謎解き×競技プログラミング 『ある勇者の物語』", + "id": "qupc2018", + "start_epoch_second": 1540009800, + "duration_second": 10800, + "title": "九州大学プログラミングコンテスト2018", "rate_change": "-" }, { - "id": "arc069", - "start_epoch_second": 1487419200, + "id": "abc093", + "start_epoch_second": 1523102400, "duration_second": 6000, - "title": "AtCoder Regular Contest 069", - "rate_change": " ~ 2799" + "title": "AtCoder Beginner Contest 093", + "rate_change": "~ 1199" }, { - "id": "kupc2017", - "start_epoch_second": 1506830400, - "duration_second": 18000, - "title": "Kyoto University Programming Contest 2017", - "rate_change": "-" - }, - { - "id": "k4pc", - "start_epoch_second": 1416024000, - "duration_second": 14400, - "title": "KyurideKagamizProgrammingContest(Remixed by ryunosuKe & Kensuke)", - "rate_change": "-" + "id": "abc315", + "start_epoch_second": 1692446400, + "duration_second": 6000, + "title": "キーエンスプログラミングコンテスト2023夏(AtCoder Beginner Contest 315)", + "rate_change": "~ 1999" }, { - "id": "abc126", - "start_epoch_second": 1558267200, - "duration_second": 6000, - "title": "AtCoder Beginner Contest 126", - "rate_change": " ~ 1999" + "id": "agc035", + "start_epoch_second": 1563107400, + "duration_second": 7800, + "title": "AtCoder Grand Contest 035", + "rate_change": "All" }, { - "id": "future-contest-2020-final-open", - "start_epoch_second": 1575682200, - "duration_second": 14400, - "title": "HACK TO THE FUTURE 2020 本選(オープン)", + "id": "ddcc2019-final", + "start_epoch_second": 1547860200, + "duration_second": 7200, + "title": "DISCO presents ディスカバリーチャンネル コードコンテスト2019 本戦", "rate_change": "-" }, { - "id": "diverta2019", - "start_epoch_second": 1557576900, - "duration_second": 7200, - "title": "diverta 2019 Programming Contest", - "rate_change": " ~ 2799" + "id": "abc118", + "start_epoch_second": 1550318400, + "duration_second": 6000, + "title": "AtCoder Beginner Contest 118", + "rate_change": "~ 1199" }, { - "id": "abc031", - "start_epoch_second": 1448107200, - "duration_second": 7200, - "title": "AtCoder Beginner Contest 031", - "rate_change": "-" + "id": "ahc036", + "start_epoch_second": 1724407200, + "duration_second": 864000, + "title": "RECRUIT 日本橋ハーフマラソン 2024夏(AtCoder Heuristic Contest 036)", + "rate_change": "All" }, { - "id": "aising2020", - "start_epoch_second": 1594468800, - "duration_second": 6000, - "title": "エイシング プログラミング コンテスト 2020", - "rate_change": " ~ 1999" + "id": "adt_medium_20231108_1", + "start_epoch_second": 1699426800, + "duration_second": 3600, + "title": "AtCoder Daily Training MEDIUM 2023/11/8 16:00start", + "rate_change": "-" }, { - "id": "ddcc2019-machine", - "start_epoch_second": 1547872200, - "duration_second": 1800, - "title": "DISCO presents ディスカバリーチャンネル コードコンテスト2019 装置実装部門 本戦", + "id": "toyota2023summer-final-open", + "start_epoch_second": 1693098900, + "duration_second": 12600, + "title": "TOYOTA Programming Contest 2023 Summer final(Open Contest)", "rate_change": "-" }, { - "id": "arc118", - "start_epoch_second": 1620565500, - "duration_second": 7200, - "title": "AtCoder Regular Contest 118", - "rate_change": " ~ 2799" + "id": "wtf22-day2", + "start_epoch_second": 1694232000, + "duration_second": 18000, + "title": "World Tour Finals 2022 Day2", + "rate_change": "2000 ~" }, { - "id": "abc268", - "start_epoch_second": 1662811200, + "id": "abc094", + "start_epoch_second": 1523707800, "duration_second": 6000, - "title": "ユニークビジョンプログラミングコンテスト2022 夏(AtCoder Beginner Contest 268)", - "rate_change": " ~ 1999" + "title": "AtCoder Beginner Contest 094", + "rate_change": "~ 1199" }, { - "id": "abc287", - "start_epoch_second": 1674907200, + "id": "abc438", + "start_epoch_second": 1766836800, "duration_second": 6000, - "title": "ユニークビジョンプログラミングコンテスト2023 新春 (AtCoder Beginner Contest 287)", - "rate_change": " ~ 1999" + "title": "AtCoder Beginner Contest 438", + "rate_change": "~ 1999" }, { - "id": "agc068", - "start_epoch_second": 1727611200, - "duration_second": 10800, - "title": "AtCoder Grand Contest 068", - "rate_change": "2000 ~ " + "id": "awc0002", + "start_epoch_second": 1770721200, + "duration_second": 5400, + "title": "AtCoder Weekday Contest 0002 Beta", + "rate_change": "-" }, { - "id": "agc024", - "start_epoch_second": 1526817600, - "duration_second": 7800, - "title": "AtCoder Grand Contest 024", + "id": "agc032", + "start_epoch_second": 1553346000, + "duration_second": 6600, + "title": "AtCoder Grand Contest 032", "rate_change": "All" }, { - "id": "tupc2022", - "start_epoch_second": 1677902400, - "duration_second": 14400, - "title": "東北大学プログラミングコンテスト 2022", + "id": "adt_easy_20231115_1", + "start_epoch_second": 1700031600, + "duration_second": 3600, + "title": "AtCoder Daily Training EASY 2023/11/15 16:00start", "rate_change": "-" }, { - "id": "abc218", - "start_epoch_second": 1631361600, - "duration_second": 6000, - "title": "AtCoder Beginner Contest 218", - "rate_change": " ~ 1999" + "id": "ahc019", + "start_epoch_second": 1679108400, + "duration_second": 1321200, + "title": "MC Digital プログラミングコンテスト2023(AtCoder Heuristic Contest 019)", + "rate_change": "All" }, { - "id": "abc104", - "start_epoch_second": 1533470400, - "duration_second": 6000, - "title": "AtCoder Beginner Contest 104", - "rate_change": " ~ 1199" + "id": "arc011", + "start_epoch_second": 1358596800, + "duration_second": 5400, + "title": "AtCoder Regular Contest 011", + "rate_change": "-" }, { - "id": "future-contest-2020-final", - "start_epoch_second": 1575682200, - "duration_second": 14400, - "title": "HACK TO THE FUTURE 2020 本選", + "id": "asprocon5", + "start_epoch_second": 1577667600, + "duration_second": 604800, + "title": "第5回 Asprova プログラミングコンテスト", "rate_change": "-" }, { - "id": "abc080", - "start_epoch_second": 1512302400, + "id": "abc345", + "start_epoch_second": 1710590400, "duration_second": 6000, - "title": "AtCoder Beginner Contest 080", - "rate_change": " ~ 1199" - }, - { - "id": "masters-qual", - "start_epoch_second": 1709438400, - "duration_second": 21600, - "title": "第一回マスターズ選手権-予選-", - "rate_change": "-" + "title": "モノグサプログラミングコンテスト2024(AtCoder Beginner Contest 345)", + "rate_change": "~ 1999" }, { - "id": "adt_medium_20231109_2", - "start_epoch_second": 1699522200, - "duration_second": 3600, - "title": "AtCoder Daily Training MEDIUM 2023/11/9 18:30start", + "id": "future-meets-you-contest-2018-open", + "start_epoch_second": 1538195400, + "duration_second": 10800, + "title": "Future Meets You Contest(Open)", "rate_change": "-" }, { - "id": "arc186", - "start_epoch_second": 1730030400, + "id": "jsc2021", + "start_epoch_second": 1618643400, "duration_second": 7200, - "title": "AtCoder Japan Open -予選-(AtCoder Regular Contest 186)", - "rate_change": "1200 ~ 2799" + "title": "第二回日本最強プログラマー学生選手権", + "rate_change": "~ 1999" }, { - "id": "abc035", - "start_epoch_second": 1458993600, - "duration_second": 7200, - "title": "AtCoder Beginner Contest 035", - "rate_change": "-" - }, - { - "id": "arc023", - "start_epoch_second": 1400328000, - "duration_second": 5400, - "title": "AtCoder Regular Contest 023", - "rate_change": "-" - }, - { - "id": "abc261", - "start_epoch_second": 1658577600, + "id": "abc057", + "start_epoch_second": 1490529600, "duration_second": 6000, - "title": "AtCoder Beginner Contest 261", - "rate_change": " ~ 1999" + "title": "AtCoder Beginner Contest 057", + "rate_change": "~ 1199" }, { - "id": "adt_all_20231019_2", - "start_epoch_second": 1697707800, - "duration_second": 3600, - "title": "AtCoder Daily Training ALL 2023/10/19 18:30start", + "id": "joisc2020", + "start_epoch_second": 1584662400, + "duration_second": 18000, + "title": "JOI 2019/2020 春合宿 過去問", "rate_change": "-" }, { - "id": "abc013", - "start_epoch_second": 1408190400, + "id": "abc008", + "start_epoch_second": 1399723200, "duration_second": 7200, - "title": "AtCoder Beginner Contest 013", + "title": "AtCoder Beginner Contest 008", "rate_change": "-" }, { - "id": "adt_hard_20231025_1", - "start_epoch_second": 1698217200, - "duration_second": 3600, - "title": "AtCoder Daily Training HARD 2023/10/25 16:00start", + "id": "abc453", + "start_epoch_second": 1775908800, + "duration_second": 6000, + "title": "AtCoder Beginner Contest 453", + "rate_change": "~ 1999" + }, + { + "id": "masters-qual", + "start_epoch_second": 1709438400, + "duration_second": 21600, + "title": "第一回マスターズ選手権-予選-", "rate_change": "-" } -] +] \ No newline at end of file diff --git a/src/lib/clients/fixtures/atcoder_problems/tasks.json b/src/lib/clients/fixtures/atcoder_problems/tasks.json index f8cdf0a51..20d9e37dc 100644 --- a/src/lib/clients/fixtures/atcoder_problems/tasks.json +++ b/src/lib/clients/fixtures/atcoder_problems/tasks.json @@ -1,605 +1,591 @@ [ { - "id": "abc296_a", - "contest_id": "abc296", - "problem_index": "A", - "name": "Alternately", - "title": "A. Alternately" - }, - { - "id": "tdpc_target", - "contest_id": "tdpc", - "problem_index": "K", - "name": "ターゲット", - "title": "K. ターゲット" - }, - { - "id": "abc122_b", - "contest_id": "abc122", + "id": "arc030_2", + "contest_id": "arc030", "problem_index": "B", - "name": "ATCoder", - "title": "B. ATCoder" + "name": "ツリーグラフ", + "title": "B. ツリーグラフ" }, { - "id": "abc133_d", - "contest_id": "abc133", - "problem_index": "D", - "name": "Rain Flows into Dams", - "title": "D. Rain Flows into Dams" - }, - { - "id": "arc131_d", - "contest_id": "arc131", - "problem_index": "D", - "name": "AtArcher", - "title": "D. AtArcher" + "id": "code_formula_2014_final_g", + "contest_id": "code-formula-2014-final", + "problem_index": "G", + "name": "ノイハの塔", + "title": "G. ノイハの塔" }, { - "id": "icpc2013summer_day3_g", - "contest_id": "jag2013summer-day3", - "problem_index": "G", - "name": "Unordered Operators", - "title": "G. Unordered Operators" + "id": "ttpc2015_m", + "contest_id": "ttpc2015", + "problem_index": "M", + "name": "コインと無向グラフ", + "title": "M. コインと無向グラフ" }, { - "id": "abc026_a", - "contest_id": "abc026", - "problem_index": "A", - "name": "掛け算の最大値", - "title": "A. 掛け算の最大値" + "id": "joisc2020_e", + "contest_id": "joisc2020", + "problem_index": "E", + "name": "ジョイッターで友だちをつくろう (Making Friends on Joitter is Fun)", + "title": "E. ジョイッターで友だちをつくろう (Making Friends on Joitter is Fun)" }, { - "id": "abc324_a", - "contest_id": "abc324", - "problem_index": "A", - "name": "Same", - "title": "A. Same" + "id": "tessoku_book_db", + "contest_id": "tessoku-book", + "problem_index": "B29", + "name": "Power Hard", + "title": "B29. Power Hard" }, { - "id": "ahc008_a", - "contest_id": "ahc008", - "problem_index": "A", - "name": "Territory", - "title": "A. Territory" + "id": "APG4b_ae", + "contest_id": "APG4b", + "problem_index": "AE", + "name": "4.00.第4章について", + "title": "AE. 4.00.第4章について" }, { - "id": "abc243_h", - "contest_id": "abc243", - "problem_index": "Ex", - "name": "Builder Takahashi (Enhanced version)", - "title": "Ex. Builder Takahashi (Enhanced version)" + "id": "ttpc2024_2_o", + "contest_id": "ttpc2024_2", + "problem_index": "O", + "name": "Marunomi for All Prefixes", + "title": "O. Marunomi for All Prefixes" }, { - "id": "arc021_1", - "contest_id": "arc021", + "id": "abc303_a", + "contest_id": "abc303", "problem_index": "A", - "name": "DEAD END", - "title": "A. DEAD END" + "name": "Similar String", + "title": "A. Similar String" }, { - "id": "xmascon17_h", - "contest_id": "xmascon17", + "id": "tkppc2015_h", + "contest_id": "tkppc", "problem_index": "H", - "name": "Ango", - "title": "H. Ango" + "name": "私、木になります (I become a tree)", + "title": "H. 私、木になります (I become a tree)" }, { - "id": "bitflyer2018_qual_e", - "contest_id": "bitflyer2018-qual", - "problem_index": "E", - "name": "祝日", - "title": "E. 祝日" + "id": "abc102_a", + "contest_id": "abc102", + "problem_index": "A", + "name": "Multiple of 2 and N", + "title": "A. Multiple of 2 and N" }, { - "id": "pakencamp_2021_day3_c", - "contest_id": "pakencamp-2021-day3", - "problem_index": "C", - "name": "Sum of Digit Sum", - "title": "C. Sum of Digit Sum" + "id": "abc114_b", + "contest_id": "abc114", + "problem_index": "B", + "name": "754", + "title": "B. 754" }, { - "id": "typical90_j", - "contest_id": "typical90", - "problem_index": "010", - "name": "Score Sum Queries(★2)", - "title": "010. Score Sum Queries(★2)" + "id": "abc098_a", + "contest_id": "abc098", + "problem_index": "A", + "name": "Add Sub Mul", + "title": "A. Add Sub Mul" }, { - "id": "arc089_a", - "contest_id": "abc086", - "problem_index": "C", - "name": "Traveling", - "title": "C. Traveling" + "id": "agc067_e", + "contest_id": "agc067", + "problem_index": "E", + "name": "Biconnected Graph", + "title": "E. Biconnected Graph" }, { - "id": "njpc2017_e", - "contest_id": "njpc2017", - "problem_index": "E", - "name": "限界集落", - "title": "E. 限界集落" + "id": "ddcc2020_qual_a", + "contest_id": "ddcc2020-qual", + "problem_index": "A", + "name": "DDCC Finals", + "title": "A. DDCC Finals" }, { - "id": "panasonic2020_e", - "contest_id": "panasonic2020", - "problem_index": "E", - "name": "Three Substrings", - "title": "E. Three Substrings" + "id": "abc392_a", + "contest_id": "abc392", + "problem_index": "A", + "name": "Shuffled Equation", + "title": "A. Shuffled Equation" }, { - "id": "yahoo_procon2019_qual_b", - "contest_id": "yahoo-procon2019-qual", - "problem_index": "B", - "name": "Path", - "title": "B. Path" + "id": "awtf2025heuristic_a", + "contest_id": "awtf2025heuristic", + "problem_index": "A", + "name": "Group Commands and Wall Planning", + "title": "A. Group Commands and Wall Planning" }, { - "id": "abc157_c", - "contest_id": "abc157", - "problem_index": "C", - "name": "Guess The Number", - "title": "C. Guess The Number" + "id": "pakencamp_2020_day1_n", + "contest_id": "pakencamp-2020-day1", + "problem_index": "N", + "name": "背の順", + "title": "N. 背の順" }, { - "id": "tenka1_2013_qualB_b", - "contest_id": "tenka1-2013-qualb", + "id": "abc307_b", + "contest_id": "abc307", "problem_index": "B", - "name": "天下一後入れ先出しデータ構造", - "title": "B. 天下一後入れ先出しデータ構造" + "name": "racecar", + "title": "B. racecar" }, { - "id": "future_contest_2018_qual_a", - "contest_id": "future-contest-2018-qual", - "problem_index": "A", - "name": "山型足し算", - "title": "A. 山型足し算" + "id": "pakencamp_2020_day2_e", + "contest_id": "pakencamp-2020-day2", + "problem_index": "E", + "name": "老朽化対策", + "title": "E. 老朽化対策" }, { - "id": "agc068_c", - "contest_id": "agc068", - "problem_index": "C", - "name": "Ball Redistribution", - "title": "C. Ball Redistribution" + "id": "joig2024_e", + "contest_id": "joig2024-open", + "problem_index": "E", + "name": "名前 (Name)", + "title": "E. 名前 (Name)" }, { - "id": "arc157_c", - "contest_id": "arc157", - "problem_index": "C", - "name": "YY Square", - "title": "C. YY Square" + "id": "abc392_b", + "contest_id": "abc392", + "problem_index": "B", + "name": "Who is Missing?", + "title": "B. Who is Missing?" }, { - "id": "agc022_d", - "contest_id": "agc022", + "id": "abc284_d", + "contest_id": "abc284", "problem_index": "D", - "name": "Shopping", - "title": "D. Shopping" + "name": "Happy New Year 2023 ", + "title": "D. Happy New Year 2023 " }, { - "id": "agc043_d", - "contest_id": "agc043", + "id": "ddcc2020_qual_d", + "contest_id": "ddcc2020-qual", "problem_index": "D", - "name": "Merge Triplets", - "title": "D. Merge Triplets" + "name": "Digit Sum Replace", + "title": "D. Digit Sum Replace" }, { - "id": "abc308_b", - "contest_id": "abc308", - "problem_index": "B", - "name": "Default Price", - "title": "B. Default Price" + "id": "abc226_d", + "contest_id": "abc226", + "problem_index": "D", + "name": "Teleportation", + "title": "D. Teleportation" }, { - "id": "math_and_algorithm_e", - "contest_id": "math-and-algorithm", - "problem_index": "005", - "name": "Modulo 100", - "title": "005. Modulo 100" + "id": "joi2026_yo1a_b", + "contest_id": "joi2026yo1a", + "problem_index": "B", + "name": "ノートパソコン (Laptop)", + "title": "B. ノートパソコン (Laptop)" }, { - "id": "abc351_d", - "contest_id": "abc351", - "problem_index": "D", - "name": "Grid and Magnet", - "title": "D. Grid and Magnet" + "id": "abc167_c", + "contest_id": "abc167", + "problem_index": "C", + "name": "Skill Up", + "title": "C. Skill Up" }, { - "id": "codefestival_2016_final_a", - "contest_id": "cf16-final", + "id": "code_festival_morning_easy_a", + "contest_id": "code-festival-2014-morning-easy", "problem_index": "A", - "name": "Where's Snuke?", - "title": "A. Where's Snuke?" - }, - { - "id": "joigsp2023_d", - "contest_id": "joigsp2023", - "problem_index": "D", - "name": "ベルトコンベア (Belt Conveyor)", - "title": "D. ベルトコンベア (Belt Conveyor)" + "name": "差の平均", + "title": "A. 差の平均" }, { - "id": "joi2020_yo2_a", - "contest_id": "joi2020yo2", - "problem_index": "A", - "name": "ポスター (Poster)", - "title": "A. ポスター (Poster)" + "id": "abc303_f", + "contest_id": "abc303", + "problem_index": "F", + "name": "Damage over Time", + "title": "F. Damage over Time" }, { - "id": "test001_a", - "contest_id": "language-test-ver1", - "problem_index": "A", - "name": "センター採点", - "title": "A. センター採点" + "id": "abc093_b", + "contest_id": "abc093", + "problem_index": "B", + "name": "Small and Large Integers", + "title": "B. Small and Large Integers" }, { - "id": "arc174_c", - "contest_id": "arc174", + "id": "joi2026_yo1a_c", + "contest_id": "joi2026yo1a", "problem_index": "C", - "name": "Catastrophic Roulette", - "title": "C. Catastrophic Roulette" + "name": "シャッフル 2 (Shuffle 2)", + "title": "C. シャッフル 2 (Shuffle 2)" }, { - "id": "icpc2012autumn_f", - "contest_id": "jag2012autumn", - "problem_index": "F", - "name": "Counting 1's", - "title": "F. Counting 1's" + "id": "abc339_g", + "contest_id": "abc339", + "problem_index": "G", + "name": "Smaller Sum", + "title": "G. Smaller Sum" }, { - "id": "abc242_f", - "contest_id": "abc242", - "problem_index": "F", - "name": "Black and White Rooks", - "title": "F. Black and White Rooks" + "id": "arc116_e", + "contest_id": "arc116", + "problem_index": "E", + "name": "Spread of Information", + "title": "E. Spread of Information" }, { - "id": "abc182_a", - "contest_id": "abc182", - "problem_index": "A", - "name": "twiblr", - "title": "A. twiblr" + "id": "agc014_f", + "contest_id": "agc014", + "problem_index": "F", + "name": "Strange Sorting", + "title": "F. Strange Sorting" }, { - "id": "icpc2013summer_day4_g", - "contest_id": "jag2013summer-day4", + "id": "past19_g", + "contest_id": "past19-open", "problem_index": "G", - "name": "Spotlight Movement", - "title": "G. Spotlight Movement" + "name": "結合律", + "title": "G. 結合律" }, { - "id": "abc012_3", - "contest_id": "abc012", - "problem_index": "C", - "name": "九九足し算", - "title": "C. 九九足し算" + "id": "tenka1_2014_qualB_e", + "contest_id": "tenka1-2014-qualb", + "problem_index": "E", + "name": "カラオケランキング", + "title": "E. カラオケランキング" }, { - "id": "abc345_f", - "contest_id": "abc345", - "problem_index": "F", - "name": "Many Lamps", - "title": "F. Many Lamps" + "id": "agc015_a", + "contest_id": "agc015", + "problem_index": "A", + "name": "A+...+B Problem", + "title": "A. A+...+B Problem" }, { - "id": "utpc2013_04", - "contest_id": "utpc2013", - "problem_index": "D", - "name": "壊れかけのヒープ", - "title": "D. 壊れかけのヒープ" + "id": "joi2026_semifinal_c", + "contest_id": "joi2026sf", + "problem_index": "C", + "name": "衣服 (Clothes)", + "title": "C. 衣服 (Clothes)" }, { - "id": "typical90_by", - "contest_id": "typical90", - "problem_index": "077", - "name": "Planes on a 2D Plane(★7)", - "title": "077. Planes on a 2D Plane(★7)" + "id": "utpc2012_06", + "contest_id": "utpc2012", + "problem_index": "F", + "name": "Uinny", + "title": "F. Uinny" }, { - "id": "arc009_3", - "contest_id": "arc009", - "problem_index": "C", - "name": "高橋君、24歳", - "title": "C. 高橋君、24歳" + "id": "abc278_h", + "contest_id": "abc278", + "problem_index": "Ex", + "name": "make 1", + "title": "Ex. make 1" }, { - "id": "utpc2021_j", - "contest_id": "utpc2021", + "id": "past202112_j", + "contest_id": "past202112-open", "problem_index": "J", - "name": "Do you like Interval Scheduling Problems?", - "title": "J. Do you like Interval Scheduling Problems?" + "name": "Rotate and Reverse", + "title": "J. Rotate and Reverse" }, { - "id": "ijpc2015_e", - "contest_id": "ijpc2015-2", - "problem_index": "B", - "name": "カードゲーム", - "title": "B. カードゲーム" + "id": "yahoo_procon2017_qual_e", + "contest_id": "yahoo-procon2017-qual", + "problem_index": "E", + "name": "遊園地", + "title": "E. 遊園地" }, { - "id": "joisc2020_c", - "contest_id": "joisc2020", - "problem_index": "C", - "name": "掃除 (Sweeping)", - "title": "C. 掃除 (Sweeping)" + "id": "codequeen2023_final_d", + "contest_id": "codequeen2023-final-open", + "problem_index": "D", + "name": "Moving Queen", + "title": "D. Moving Queen" }, { - "id": "abc080_b", - "contest_id": "abc080", - "problem_index": "B", - "name": "Harshad Number", - "title": "B. Harshad Number" + "id": "abc159_f", + "contest_id": "abc159", + "problem_index": "F", + "name": "Knapsack for All Segments", + "title": "F. Knapsack for All Segments" }, { - "id": "codefestival_2015_qualB_a", - "contest_id": "code-festival-2015-qualb", + "id": "abc023_a", + "contest_id": "abc023", "problem_index": "A", - "name": "Double String", - "title": "A. Double String" + "name": "加算王", + "title": "A. 加算王" + }, + { + "id": "ttpc2015_g", + "contest_id": "ttpc2015", + "problem_index": "G", + "name": "titech分離", + "title": "G. titech分離" }, { - "id": "abc289_c", - "contest_id": "abc289", + "id": "abc229_c", + "contest_id": "abc229", "problem_index": "C", - "name": "Coverage", - "title": "C. Coverage" + "name": "Cheese", + "title": "C. Cheese" }, { - "id": "joisc2011_banner", - "contest_id": "joisc2011", - "problem_index": "banner", - "name": "横断幕 (Banner)", - "title": "banner. 横断幕 (Banner)" + "id": "utpc2022_a", + "contest_id": "utpc2022", + "problem_index": "A", + "name": "Shuffle and GCD", + "title": "A. Shuffle and GCD" }, { - "id": "utpc2012_03", - "contest_id": "utpc2012", - "problem_index": "C", - "name": "森ですか?", - "title": "C. 森ですか?" + "id": "abc325_a", + "contest_id": "abc325", + "problem_index": "A", + "name": "Takahashi san", + "title": "A. Takahashi san" }, { - "id": "icpc2015autumn_e", - "contest_id": "jag2015autumn", - "problem_index": "E", - "name": "Shifting a Matrix", - "title": "E. Shifting a Matrix" + "id": "abc302_d", + "contest_id": "abc302", + "problem_index": "D", + "name": "Impartial Gift", + "title": "D. Impartial Gift" }, { - "id": "jag2017summer_day1_i", - "contest_id": "jag2017summer-day1", - "problem_index": "I", - "name": "ルーク", - "title": "I. ルーク" + "id": "pakencamp_2021_day2_p", + "contest_id": "pakencamp-2021-day2", + "problem_index": "P", + "name": "A^k=k", + "title": "P. A^k=k" }, { - "id": "abc248_c", - "contest_id": "abc248", + "id": "kupc2013_c", + "contest_id": "kupc2013", "problem_index": "C", - "name": "Dice Sum", - "title": "C. Dice Sum" + "name": "チョコレート", + "title": "C. チョコレート" }, { - "id": "iroha2019_day3_l", - "contest_id": "iroha2019-day3", - "problem_index": "L", - "name": "デクレッシェンド", - "title": "L. デクレッシェンド" + "id": "abc113_b", + "contest_id": "abc113", + "problem_index": "B", + "name": "Palace", + "title": "B. Palace" }, { - "id": "practice2_d", - "contest_id": "practice2", + "id": "arc039_d", + "contest_id": "arc039", "problem_index": "D", - "name": "Maxflow", - "title": "D. Maxflow" + "name": "旅行会社高橋君", + "title": "D. 旅行会社高橋君" }, { - "id": "arc134_d", - "contest_id": "arc134", - "problem_index": "D", - "name": "Concatenate Subsequences", - "title": "D. Concatenate Subsequences" + "id": "abc141_c", + "contest_id": "abc141", + "problem_index": "C", + "name": "Attack Survival", + "title": "C. Attack Survival" }, { - "id": "code_festival_2018_final_d", - "contest_id": "code-festival-2018-final-open", - "problem_index": "D", - "name": "Three Letters", - "title": "D. Three Letters" + "id": "rco_contest_2018_final_b", + "contest_id": "rco-contest-2018-final", + "problem_index": "B", + "name": "くるくる寿司", + "title": "B. くるくる寿司" }, { - "id": "abc134_e", - "contest_id": "abc134", - "problem_index": "E", - "name": "Sequence Decomposing", - "title": "E. Sequence Decomposing" + "id": "agc034_a", + "contest_id": "agc034", + "problem_index": "A", + "name": "Kenken Race", + "title": "A. Kenken Race" }, { - "id": "abc368_b", - "contest_id": "abc368", - "problem_index": "B", - "name": "Decrease 2 max elements", - "title": "B. Decrease 2 max elements" + "id": "abc214_g", + "contest_id": "abc214", + "problem_index": "G", + "name": "Three Permutations", + "title": "G. Three Permutations" }, { - "id": "tessoku_book_ey", - "contest_id": "tessoku-book", - "problem_index": "C01", - "name": "Tax Rate", - "title": "C01. Tax Rate" + "id": "tdpc_grid", + "contest_id": "tdpc", + "problem_index": "S", + "name": "マス目", + "title": "S. マス目" }, { - "id": "joi2014yo_d", - "contest_id": "joi2014yo", - "problem_index": "D", - "name": "部活のスケジュール表 (Schedule)", - "title": "D. 部活のスケジュール表 (Schedule)" + "id": "abc435_f", + "contest_id": "abc435", + "problem_index": "F", + "name": "Cat exercise", + "title": "F. Cat exercise" }, { - "id": "joi2023_yo1b_c", - "contest_id": "joi2023yo1b", - "problem_index": "C", - "name": "繰り返し文字列 (Repeating String)", - "title": "C. 繰り返し文字列 (Repeating String)" + "id": "abc357_a", + "contest_id": "abc357", + "problem_index": "A", + "name": "Sanitize Hands", + "title": "A. Sanitize Hands" }, { - "id": "icpc2015summer_day3_g", - "contest_id": "jag2015summer-day3", - "problem_index": "G", - "name": "Gowk's Errand for Master", - "title": "G. Gowk's Errand for Master" + "id": "agc058_b", + "contest_id": "agc058", + "problem_index": "B", + "name": "Adjacent Chmax", + "title": "B. Adjacent Chmax" }, { - "id": "yuha_c83_03", - "contest_id": "yuha-c83", + "id": "dwacon5th_prelims_c", + "contest_id": "dwacon5th-prelims", "problem_index": "C", - "name": "Dendrogram - 樹形図", - "title": "C. Dendrogram - 樹形図" + "name": "k-DMC", + "title": "C. k-DMC" }, { - "id": "icpc2014autumn_d", - "contest_id": "jag2014autumn", - "problem_index": "D", - "name": "Flowers", - "title": "D. Flowers" + "id": "pakencamp_2025_day1_a", + "contest_id": "pakencamp-2025-day1", + "problem_index": "A", + "name": "Kamigo", + "title": "A. Kamigo" }, { - "id": "icpc2012autumn_e", - "contest_id": "jag2012autumn", - "problem_index": "E", - "name": "Stack Maze", - "title": "E. Stack Maze" + "id": "abc126_b", + "contest_id": "abc126", + "problem_index": "B", + "name": "YYMM or MMYY", + "title": "B. YYMM or MMYY" }, { - "id": "abc029_c", - "contest_id": "abc029", - "problem_index": "C", - "name": "Brute-force Attack", - "title": "C. Brute-force Attack" + "id": "jsc2025_final_f", + "contest_id": "jsc2025-final", + "problem_index": "F", + "name": "Products of Low Elements", + "title": "F. Products of Low Elements" }, { - "id": "abc355_a", - "contest_id": "abc355", - "problem_index": "A", - "name": "Who Ate the Cake?", - "title": "A. Who Ate the Cake?" + "id": "highrate2025_b", + "contest_id": "highrate2025-parallel", + "problem_index": "B", + "name": "三乗根", + "title": "B. 三乗根" }, { - "id": "relay_e", - "contest_id": "cf16-relay-open", - "problem_index": "E", - "name": "Segment on Grid Paper", - "title": "E. Segment on Grid Paper" + "id": "ttpc2024_2_h", + "contest_id": "ttpc2024_2", + "problem_index": "H", + "name": "TTPC Never Ends", + "title": "H. TTPC Never Ends" }, { - "id": "abc069_b", - "contest_id": "abc069", - "problem_index": "B", - "name": "i18n", - "title": "B. i18n" + "id": "chokudai005_a", + "contest_id": "chokudai005", + "problem_index": "A", + "name": "カラフルパネル", + "title": "A. カラフルパネル" }, { - "id": "tessoku_book_ck", - "contest_id": "tessoku-book", - "problem_index": "B12", - "name": "Equation", - "title": "B12. Equation" + "id": "test001_f", + "contest_id": "language-test-ver1", + "problem_index": "F", + "name": "THE☆たこ焼き祭り2012", + "title": "F. THE☆たこ焼き祭り2012" }, { - "id": "abc084_a", - "contest_id": "abc084", - "problem_index": "A", - "name": "New Year", - "title": "A. New Year" + "id": "tkppc6_1_n", + "contest_id": "tkppc6-1", + "problem_index": "N", + "name": "Jump and Walk", + "title": "N. Jump and Walk" }, { - "id": "joi2006ho_e", - "contest_id": "joi2006ho", + "id": "s8pc_1_e", + "contest_id": "s8pc-1", "problem_index": "E", - "name": "JOI 2006 本選 問題5", - "title": "E. JOI 2006 本選 問題5" + "name": "散歩 (E869120 and Path Length)", + "title": "E. 散歩 (E869120 and Path Length)" }, { - "id": "abc096_b", - "contest_id": "abc096", - "problem_index": "B", - "name": "Maximum Sum", - "title": "B. Maximum Sum" + "id": "icpc2015autumn_c", + "contest_id": "jag2015autumn", + "problem_index": "C", + "name": "Delete Files", + "title": "C. Delete Files" }, { - "id": "abc079_b", - "contest_id": "abc079", - "problem_index": "B", - "name": "Lucas Number", - "title": "B. Lucas Number" + "id": "abc293_a", + "contest_id": "abc293", + "problem_index": "A", + "name": "Swap Odd and Even", + "title": "A. Swap Odd and Even" }, { - "id": "masters2024_final_c", - "contest_id": "masters2024-final-open", - "problem_index": "C", - "name": "Windy Drone Control (C)", - "title": "C. Windy Drone Control (C)" + "id": "arc089_b", + "contest_id": "abc086", + "problem_index": "D", + "name": "Checker", + "title": "D. Checker" }, { - "id": "abc343_b", - "contest_id": "abc343", - "problem_index": "B", - "name": "Adjacency Matrix", - "title": "B. Adjacency Matrix" + "id": "abc340_f", + "contest_id": "abc340", + "problem_index": "F", + "name": "S = 1", + "title": "F. S = 1" }, { - "id": "code_festival_2018_quala_b", - "contest_id": "code-festival-2018-quala", - "problem_index": "B", - "name": "みかん", - "title": "B. みかん" + "id": "abc409_c", + "contest_id": "abc409", + "problem_index": "C", + "name": "Equilateral Triangle", + "title": "C. Equilateral Triangle" }, { - "id": "abc235_d", - "contest_id": "abc235", + "id": "abc109_d", + "contest_id": "abc109", "problem_index": "D", - "name": "Multiply and Rotate", - "title": "D. Multiply and Rotate" + "name": "Make Them Even", + "title": "D. Make Them Even" + }, + { + "id": "abc279_g", + "contest_id": "abc279", + "problem_index": "G", + "name": "At Most 2 Colors", + "title": "G. At Most 2 Colors" }, { - "id": "codefestival_2016_qualC_b", - "contest_id": "code-festival-2016-qualc", + "id": "utpc2020_b", + "contest_id": "utpc2020", "problem_index": "B", - "name": "K Cakes", - "title": "B. K Cakes" + "name": "JANKEN Machine", + "title": "B. JANKEN Machine" }, { - "id": "math_and_algorithm_u", - "contest_id": "math-and-algorithm", - "problem_index": "021", - "name": "Combination Easy", - "title": "021. Combination Easy" + "id": "arc108_c", + "contest_id": "arc108", + "problem_index": "C", + "name": "Keep Graph Connected", + "title": "C. Keep Graph Connected" }, { - "id": "arc179_a", - "contest_id": "arc179", - "problem_index": "A", - "name": "Partition", - "title": "A. Partition" + "id": "k4pc_f", + "contest_id": "k4pc", + "problem_index": "F", + "name": "タイトル未定(Untitled)", + "title": "F. タイトル未定(Untitled)" }, { - "id": "npcapc_2024_n", - "contest_id": "npcapc_2024", - "problem_index": "N", - "name": "Product Matrix", - "title": "N. Product Matrix" + "id": "tdpc_ball", + "contest_id": "tdpc", + "problem_index": "J", + "name": "ボール", + "title": "J. ボール" }, { - "id": "arc098_d", - "contest_id": "arc098", - "problem_index": "F", - "name": "Donation", - "title": "F. Donation" + "id": "abc140_b", + "contest_id": "abc140", + "problem_index": "B", + "name": "Buffet", + "title": "B. Buffet" }, { - "id": "arc012_4", - "contest_id": "arc012", - "problem_index": "D", - "name": "Don't worry. Be Together", - "title": "D. Don't worry. Be Together" + "id": "abc376_f", + "contest_id": "abc376", + "problem_index": "F", + "name": "Hands on Ring (Hard) ", + "title": "F. Hands on Ring (Hard) " }, { "id": "abc315_f", @@ -609,94 +595,108 @@ "title": "F. Shortcuts" }, { - "id": "arc081_a", - "contest_id": "abc071", - "problem_index": "C", - "name": "Make a Rectangle", - "title": "C. Make a Rectangle" + "id": "iroha2019_day3_a", + "contest_id": "iroha2019-day3", + "problem_index": "A", + "name": "宇宙人", + "title": "A. 宇宙人" }, { - "id": "abc117_a", - "contest_id": "abc117", - "problem_index": "A", - "name": "Entrance Examination", - "title": "A. Entrance Examination" + "id": "abc187_e", + "contest_id": "abc187", + "problem_index": "E", + "name": "Through Path", + "title": "E. Through Path" }, { - "id": "agc012_c", - "contest_id": "agc012", - "problem_index": "C", - "name": "Tautonym Puzzle", - "title": "C. Tautonym Puzzle" + "id": "past202104_e", + "contest_id": "past202104-open", + "problem_index": "E", + "name": "Third from Front", + "title": "E. Third from Front" }, { - "id": "cpsco2019_s2_d", - "contest_id": "cpsco2019-s2", - "problem_index": "D", - "name": "Two Piles", - "title": "D. Two Piles" + "id": "icpc2015spring_b", + "contest_id": "jag2015spring", + "problem_index": "B", + "name": "Card Game Strategy", + "title": "B. Card Game Strategy" }, { - "id": "s8pc_2_c", - "contest_id": "s8pc-2", - "problem_index": "C", - "name": "何通りの分割方法がある?", - "title": "C. 何通りの分割方法がある?" + "id": "tdpc_contest", + "contest_id": "tdpc", + "problem_index": "A", + "name": "コンテスト", + "title": "A. コンテスト" }, { - "id": "abc365_f", - "contest_id": "abc365", - "problem_index": "F", - "name": "Takahashi on Grid", - "title": "F. Takahashi on Grid" + "id": "code_festival_2018_final_h", + "contest_id": "code-festival-2018-final-open", + "problem_index": "H", + "name": "Pothunter", + "title": "H. Pothunter" }, { - "id": "joisc2014_m", - "contest_id": "joisc2014", - "problem_index": "M", - "name": "ストラップ", - "title": "M. ストラップ" + "id": "tkppc6_2_c", + "contest_id": "tkppc6-2", + "problem_index": "C", + "name": "Strange Paper", + "title": "C. Strange Paper" }, { - "id": "abc335_c", - "contest_id": "abc335", + "id": "abc175_c", + "contest_id": "abc175", "problem_index": "C", - "name": "Loong Tracking", - "title": "C. Loong Tracking" + "name": "Walking Takahashi", + "title": "C. Walking Takahashi" }, { - "id": "past202303_b", - "contest_id": "past202303-open", - "problem_index": "B", - "name": "小数点第 D 位", - "title": "B. 小数点第 D 位" + "id": "abc403_f", + "contest_id": "abc403", + "problem_index": "F", + "name": "Shortest One Formula", + "title": "F. Shortest One Formula" }, { - "id": "abc173_d", - "contest_id": "abc173", - "problem_index": "D", - "name": "Chat in a Circle", - "title": "D. Chat in a Circle" + "id": "agc008_e", + "contest_id": "agc008", + "problem_index": "E", + "name": "Next or Nextnext", + "title": "E. Next or Nextnext" }, { - "id": "agc061_d", - "contest_id": "agc061", + "id": "abc270_d", + "contest_id": "abc270", "problem_index": "D", - "name": "Almost Multiplication Table", - "title": "D. Almost Multiplication Table" + "name": "Stones", + "title": "D. Stones" }, { - "id": "kupc2012_1", - "contest_id": "kupc2012", - "problem_index": "A", - "name": "アルデンテ", - "title": "A. アルデンテ" + "id": "joig2024_b", + "contest_id": "joig2024-open", + "problem_index": "B", + "name": "ダンス (Dance)", + "title": "B. ダンス (Dance)" }, { - "id": "joisp2024_j", - "contest_id": "joisp2024", - "problem_index": "J", - "name": "逃走経路 2 (Escape Route 2)", - "title": "J. 逃走経路 2 (Escape Route 2)" + "id": "APG4b_s", + "contest_id": "APG4b", + "problem_index": "S", + "name": "2.02.多重ループ", + "title": "S. 2.02.多重ループ" + }, + { + "id": "ttpc2015_l", + "contest_id": "ttpc2015", + "problem_index": "L", + "name": "グラフ色ぬり", + "title": "L. グラフ色ぬり" + }, + { + "id": "abc203_d", + "contest_id": "abc203", + "problem_index": "D", + "name": "Pond", + "title": "D. Pond" } -] +] \ No newline at end of file diff --git a/src/lib/clients/fixtures/record_requests.ts b/src/lib/clients/fixtures/record_requests.ts index d27ba7438..2ea50a42a 100644 --- a/src/lib/clients/fixtures/record_requests.ts +++ b/src/lib/clients/fixtures/record_requests.ts @@ -1,123 +1,106 @@ import path from 'path'; - -// See: -// https://github.com/nock/nock -import nock from 'nock'; import fs from 'fs'; -import type { TasksApiClient } from '$lib/clients/http_client'; - import { AtCoderProblemsApiClient } from '$lib/clients/atcoder/atcoder_problems'; -import { AojApiClient } from '$lib/clients/aizu_online_judge/clients'; +import { HttpRequestClient } from '$lib/clients/http_client'; + +import type { + AOJCourseAPI, + AOJTaskAPIs, + AOJChallengeContestAPI, +} from '$lib/clients/aizu_online_judge/types'; + +import { AOJ_API_BASE_URL } from '$lib/constants/urls'; // Run the main function if you add a contest site. // Usage: // pnpm dlx vite-node ./src/lib/clients/fixtures/record_requests.ts +// Saves raw API responses (no transformation) so nock can replay them in tests. async function main(): Promise { try { - startRecordRequests(); - - await Promise.all( - clients.map(async (client) => { - try { - await saveContests(client.source, client.name, 100); - await saveTasks(client.source, client.name, 100); - } catch (error) { - console.error(`Failed to save data for ${client.name}: `, error); - } - }), - ); + await saveAtCoder(); + + // AOJ courses API has separate endpoints for contests and tasks, so we save them separately. + await saveAojCourseContests(); + await saveAojCourseTasks(); + + for (const { contestType, round, dir } of challengeConfigs) { + await saveAojChallenge(contestType, round, dir); + } } catch (error) { console.error('Failed to record requests: ', error); throw error; - } finally { - stopRecordRequests(); } } -/** - * An array of client objects, each containing a name and an instance of an API client. - * - * @constant - * @type {Array<{ name: string, source: TasksApiClient }>} - * @property {string} name - The name of the client. - * @property {TasksApiClient} source - An instance of the API client. - */ -const clients = [ - { name: 'atcoder_problems', source: new AtCoderProblemsApiClient() }, - { name: 'aizu_online_judge', source: new AojApiClient() }, -]; +const atCoderClient = new AtCoderProblemsApiClient(); +const aojHttpClient = new HttpRequestClient(AOJ_API_BASE_URL); + +const challengeConfigs = [ + { contestType: 'PCK', round: 'PRELIM', dir: 'pck_prelim' }, + { contestType: 'PCK', round: 'FINAL', dir: 'pck_final' }, + { contestType: 'JAG', round: 'PRELIM', dir: 'jag_prelim' }, + { contestType: 'JAG', round: 'REGIONAL', dir: 'jag_regional' }, +] as const; export const TEST_DATA_BASE_DIR = path.join('src', 'lib', 'clients', 'fixtures'); -function ensureDirectoryExists(dirPath: string): void { - if (!fs.existsSync(dirPath)) { - fs.mkdirSync(dirPath, { recursive: true }); - } +// AtCoder Problems API returns data in ContestsForImport format directly (no transformation). +async function saveAtCoder(): Promise { + const contests = await atCoderClient.getContests(); + const tasks = await atCoderClient.getTasks(); + + await toJson( + path.join(TEST_DATA_BASE_DIR, 'atcoder_problems', 'contests.json'), + getRandomElementsFromArray(contests, 100), + ); + await toJson( + path.join(TEST_DATA_BASE_DIR, 'atcoder_problems', 'tasks.json'), + getRandomElementsFromArray(tasks, 100), + ); } -/** - * Saves a specified number of contests from a contest site to a JSON file. - * - * @param client - An instance of `TasksApiClient` used to fetch contests. - * @param contestSite - The name of the contest site. - * @param count - The number of contests to save. Defaults to 100. - * @returns A promise that resolves when the contests have been saved. - */ -async function saveContests( - client: TasksApiClient, - contestSite: string, - count: number = 100, -): Promise { - validateContestSiteApi(client, contestSite); - - const contests = await client.getContests(); - const selectedContests = getRandomElementsFromArray(contests, count); - - const filePath = path.join(TEST_DATA_BASE_DIR, contestSite, 'contests.json'); - await toJson(filePath, selectedContests); +async function saveAojCourseContests(): Promise { + const raw = await aojHttpClient.fetchApiWithConfig({ + endpoint: 'courses', + errorMessage: 'Failed to fetch AOJ courses', + }); + await toJson(path.join(TEST_DATA_BASE_DIR, 'aizu_online_judge', 'courses', 'contests.json'), raw); } -/** - * Saves a specified number of tasks from a contest site to a JSON file. - * - * @param client - An instance of `TasksApiClient` used to fetch tasks. - * @param contestSite - The identifier for the contest site. - * @param count - The number of tasks to save. Defaults to 100. - * - * @returns A promise that resolves when the tasks have been saved. - */ -async function saveTasks( - client: TasksApiClient, - contestSite: string, - count: number = 100, -): Promise { - validateContestSiteApi(client, contestSite); - - const tasks = await client.getTasks(); - const selectedTasks = getRandomElementsFromArray(tasks, count); +async function saveAojCourseTasks(): Promise { + const raw = await aojHttpClient.fetchApiWithConfig({ + endpoint: 'problems?size=10000', + errorMessage: 'Failed to fetch AOJ course tasks', + }); + const sampled = getRandomElementsFromArray(raw, 100); - const filePath = path.join(TEST_DATA_BASE_DIR, contestSite, 'tasks.json'); - await toJson(filePath, selectedTasks); + await toJson( + path.join(TEST_DATA_BASE_DIR, 'aizu_online_judge', 'courses', 'tasks.json'), + sampled, + ); } -function startRecordRequests(): void { - nock.recorder.rec({ - output_objects: true, - dont_print: true, +async function saveAojChallenge( + contestType: 'PCK' | 'JAG', + round: 'PRELIM' | 'FINAL' | 'REGIONAL', + dir: string, +): Promise { + const raw = await aojHttpClient.fetchApiWithConfig({ + endpoint: `challenges/cl/${contestType}/${round}`, + errorMessage: `Failed to fetch AOJ ${contestType} ${round}`, }); -} + const sampled = { ...raw, contests: getRandomElementsFromArray(raw.contests, 100) }; -function stopRecordRequests(): void { - nock.recorder.play(); + await toJson( + path.join(TEST_DATA_BASE_DIR, 'aizu_online_judge', 'challenges', dir, 'contests.json'), + sampled, + ); } -function validateContestSiteApi(client: TasksApiClient, contestSite: string): void { - if (!client) { - throw new Error('Client is required'); - } - if (!contestSite || contestSite.trim() === '') { - throw new Error('Contest site identifier is required'); +function ensureDirectoryExists(dirPath: string): void { + if (!fs.existsSync(dirPath)) { + fs.mkdirSync(dirPath, { recursive: true }); } } @@ -147,14 +130,7 @@ function getRandomElementsFromArray(array: T[], count: number): T[] { return results; } -async function toJson(filePath: string, data: T[]): Promise { - if (!filePath || filePath.trim() === '') { - throw new Error('File path is required'); - } - if (!Array.isArray(data)) { - throw new Error('Data must be an array'); - } - +async function toJson(filePath: string, data: T): Promise { ensureDirectoryExists(path.dirname(filePath)); await fs.promises.writeFile(filePath, JSON.stringify(data, null, 2), 'utf-8'); diff --git a/src/lib/clients/index.ts b/src/lib/clients/index.ts index bed92c3c8..d0facc76f 100644 --- a/src/lib/clients/index.ts +++ b/src/lib/clients/index.ts @@ -1,124 +1,122 @@ +import { HttpRequestClient } from '$lib/clients/http_client'; +import { ContestTaskCache } from '$lib/clients/cache_strategy'; +import { Cache } from '$lib/clients/cache'; + import { AtCoderProblemsApiClient } from '$lib/clients/atcoder/atcoder_problems'; -import { AojApiClient } from '$lib/clients/aizu_online_judge/clients'; - -import type { ContestForImport, ContestsForImport } from '$lib/types/contest'; -import type { TaskForImport, TasksForImport } from '$lib/types/task'; - -// Fetches and aggregates contest and problem information from various contest sites via their APIs. -// -// @remarks -// Supported Contest Sites (as of 2024-11): -// -// 1. AtCoder: AtCoder Problems API -// {@link https://github.com/kenkoooo/AtCoderProblems/blob/master/doc/api.md} -// -// 2. AIZU ONLINE JUDGE (AOJ) -// ・Courses -// ・Challenges -// ・PCK (All-Japan High School Programming Contest) -// ・JAG (ACM-ICPC Japan Alumni Group Contest) - -/** - * Creates and returns an object containing instances of various API clients. - * - * @returns An object with the following properties: - * - `atCoder`: An instance of `AtCoderProblemsApiClient`. - * - `aoj`: An instance of `AojApiClient`. - */ -function createClients() { +import { + AojCoursesApiClient, + AojChallengesApiClient, +} from '$lib/clients/aizu_online_judge/clients'; + +import type { ContestsForImport } from '$lib/types/contest'; +import type { TasksForImport } from '$lib/types/task'; +import type { ChallengeParams } from '$lib/clients/aizu_online_judge/types'; + +import { AOJ_API_BASE_URL } from '$lib/constants/urls'; + +// Supported contest data sources for task import. +export type ContestTaskImportSource = + | 'atcoder' + | 'aoj_courses' + | 'aoj_pck_prelim' + | 'aoj_pck_final' + | 'aoj_jag_prelim' + | 'aoj_jag_regional'; + +type ContestTaskImportSourceConfig = { + label: string; + contests: () => Promise; + tasks: () => Promise; +}; + +// AtCoder +const atCoderClient = new AtCoderProblemsApiClient(); + +// Aizu Online Judge (AOJ) +const aojHttpClient = new HttpRequestClient(AOJ_API_BASE_URL); +const aojCache = new ContestTaskCache(new Cache(), new Cache()); + +const aojCoursesClient = new AojCoursesApiClient(aojHttpClient, aojCache); +const aojChallengesClient = new AojChallengesApiClient(aojHttpClient, aojCache); + +const importSources: Record = { + atcoder: { + label: 'AtCoder', + contests: () => atCoderClient.getContests(), + tasks: () => atCoderClient.getTasks(), + }, + aoj_courses: { + label: 'AOJ - コース', + contests: () => aojCoursesClient.getContests(), + tasks: () => aojCoursesClient.getTasks(), + }, + aoj_pck_prelim: buildAojChallengeConfig( + { contestType: 'PCK', round: 'PRELIM' }, + 'AOJ - パソコン甲子園 予選', + ), + aoj_pck_final: buildAojChallengeConfig( + { contestType: 'PCK', round: 'FINAL' }, + 'AOJ - パソコン甲子園 本選', + ), + aoj_jag_prelim: buildAojChallengeConfig( + { contestType: 'JAG', round: 'PRELIM' }, + 'AOJ - JAG 模擬国内', + ), + aoj_jag_regional: buildAojChallengeConfig( + { contestType: 'JAG', round: 'REGIONAL' }, + 'AOJ - JAG 模擬地区', + ), +}; + +function buildAojChallengeConfig( + params: ChallengeParams, + label: string, +): ContestTaskImportSourceConfig { return { - atCoder: new AtCoderProblemsApiClient(), - aoj: new AojApiClient(), + label, + contests: () => aojChallengesClient.getContests(params), + tasks: () => aojChallengesClient.getTasks(params), }; } -const { atCoder: atCoderProblemsApiClient, aoj: aojApiClient } = createClients(); +export const fetchContests = async ( + source: ContestTaskImportSource, +): Promise => { + const start = performance.now(); + const result = await importSources[source].contests(); -/** - * Fetches and aggregates contest information from all supported platforms. - * @returns {Promise} A promise that resolves to an array of unique contests. - */ -export const getContests = (): Promise => { - const contests = mergeDataFromAPIs([ - { source: () => atCoderProblemsApiClient.getContests(), name: 'AtCoder contests' }, - { source: () => aojApiClient.getContests(), name: 'AOJ contests' }, - ]); + console.info('API metrics:', { + source, + type: 'contests', + itemCount: result.length, + apiTime: `${(performance.now() - start).toFixed(0)}ms`, + }); - return contests; + return result; }; -/** - * Fetches and aggregates task information from all supported platforms. - * @returns {Promise} A promise that resolves to an array of unique tasks. - */ -export const getTasks = (): Promise => { - const tasks = mergeDataFromAPIs([ - { source: () => atCoderProblemsApiClient.getTasks(), name: 'AtCoder tasks' }, - { source: () => aojApiClient.getTasks(), name: 'AOJ tasks' }, - ]); - - return tasks; +export const fetchTasks = async (source: ContestTaskImportSource): Promise => { + const start = performance.now(); + const result = await importSources[source].tasks(); + + console.info('API metrics:', { + source, + type: 'tasks', + itemCount: result.length, + apiTime: `${(performance.now() - start).toFixed(0)}ms`, + }); + + return result; }; -/** - * Merges data from multiple API sources, ensuring unique entries based on the `id` property. - * - * @template T - The type of the data objects, which must include an `id` property of type `string`. - * @param {Array<{ source: () => Promise; name: string }>} sources - An array of objects containing a `source` function that returns a promise resolving to an array of data objects, and a `name` string for identifying the source. - * @returns {Promise} A promise that resolves to an array of unique data objects. - * @throws Will throw an error if the data fetching process fails. - */ -async function mergeDataFromAPIs( - sources: Array<{ source: () => Promise; name: string }>, -): Promise { - const metrics = { - apiTime: 0, - totalTime: 0, - itemCount: 0, - errors: [] as Array<{ source: string; error: Error }>, - }; - const startTime = performance.now(); - - try { - const rawData = await Promise.all( - sources.map(({ source, name }) => - source().catch((error) => { - metrics.errors.push({ source: name, error }); - return []; - }), - ), - ); - - metrics.apiTime = performance.now() - startTime; - - const uniqueDataMap = new Map(); - rawData.flat().forEach((data) => { - uniqueDataMap.set(data.id, data); - }); - - metrics.totalTime = performance.now() - startTime; - metrics.itemCount = uniqueDataMap.size; - - console.info('API metrics:', { - ...metrics, - apiTime: `${metrics.apiTime.toFixed(0)}ms`, - totalTime: `${metrics.totalTime.toFixed(0)}ms`, - errorCount: metrics.errors.length, - }); - - if (metrics.errors.length >= 1) { - console.error('API errors:', metrics.errors); - } - - return Array.from(uniqueDataMap.values()); - } catch (error) { - const finalError = new Error('Failed to fetch data from API(s)', { cause: error }); - - console.error('Critical API error:', { - error: finalError, - metrics, - }); - - throw finalError; - } +export const getImportSourceLabel = (source: ContestTaskImportSource): string => + importSources[source].label; + +export const importSourceEntries = Object.entries(importSources) as [ + ContestTaskImportSource, + ContestTaskImportSourceConfig, +][]; + +export function isContestTaskImportSource(value: unknown): value is ContestTaskImportSource { + return typeof value === 'string' && Object.hasOwn(importSources, value); } diff --git a/src/lib/components/TaskForm.svelte b/src/lib/components/TaskForm.svelte index 8b31cae6f..7badafcb1 100644 --- a/src/lib/components/TaskForm.svelte +++ b/src/lib/components/TaskForm.svelte @@ -26,7 +26,7 @@ }); -
+ 問題一覧 diff --git a/src/lib/components/TaskListForEdit.svelte b/src/lib/components/TaskListForEdit.svelte deleted file mode 100644 index 8207a89a7..000000000 --- a/src/lib/components/TaskListForEdit.svelte +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - コンテストID - コンテスト名 - 問題名 - - - - {#each importContests as importContest (importContest.id)} - {#if importContest.tasks.length > 0} - - - - - - - - - - {#each importContest.tasks as importTask (importTask.id)} -
  • {importTask.title}
  • - {/each} -
    - - - - - - - -
    - {/if} - {/each} -
    -
    diff --git a/src/routes/(admin)/tasks/+page.server.ts b/src/routes/(admin)/tasks/+page.server.ts index 4590f9dad..7dad9922e 100644 --- a/src/routes/(admin)/tasks/+page.server.ts +++ b/src/routes/(admin)/tasks/+page.server.ts @@ -1,54 +1,96 @@ -import { redirect, type Actions } from '@sveltejs/kit'; +import { fail, type Actions } from '@sveltejs/kit'; import type { Contests, ContestForImport, ContestsForImport } from '$lib/types/contest'; -import { - type Task, - type Tasks, - type TaskForImport, - type TasksForImport, - TaskGrade, - getTaskGrade, -} from '$lib/types/task'; - -import * as apiClient from '$lib/clients'; +import { type Task, type Tasks, type TaskForImport, type TasksForImport } from '$lib/types/task'; + import * as taskService from '$lib/services/tasks'; import { validateAdminAccess } from '$features/auth/services/admin_access'; +import { fetchContests, fetchTasks, isContestTaskImportSource } from '$lib/clients'; + import { classifyContest } from '$lib/utils/contest'; import { sha256 } from '$lib/utils/hash'; +import { BAD_REQUEST, INTERNAL_SERVER_ERROR } from '$lib/constants/http-response-status-codes'; + export async function load({ locals, url }) { await validateAdminAccess(locals, url); +} - const { contestsForImport, tasksForImport } = await fetchContestsAndTasksFromAPI(); +export const actions: Actions = { + fetch: async ({ request, locals }) => { + await validateAdminAccess(locals); - const tasksFromDB = await taskService.getTasks(); - const registeredTaskMap = prepareTaskMap(tasksFromDB); + const formData = await request.formData(); + const source = formData.get('source'); - const unregisteredTasks = filterUnregisteredTasks( - contestsForImport, - tasksForImport, - registeredTaskMap, - ); - const contestsWithUnregisteredTasks: Contests = mergeContestsAndUnregisteredTasks( - contestsForImport, - unregisteredTasks, - ); + if (!isContestTaskImportSource(source)) { + return fail(BAD_REQUEST, { message: 'コンテストサイト・種別が不正です。' }); + } - return { - importContests: contestsWithUnregisteredTasks, - }; -} + try { + const [contestsForImport, tasksForImport, tasksFromDB] = await Promise.all([ + fetchContests(source), + fetchTasks(source), + taskService.getTasks(), + ]); + + const registeredTaskMap = prepareTaskMap(tasksFromDB); + const unregisteredTasks = filterUnregisteredTasks( + contestsForImport, + tasksForImport, + registeredTaskMap, + ); -async function fetchContestsAndTasksFromAPI(): Promise<{ - contestsForImport: ContestsForImport; - tasksForImport: TasksForImport; -}> { - const contestsForImport = await apiClient.getContests(); - const tasksForImport = await apiClient.getTasks(); + return { + importContests: mergeContestsAndUnregisteredTasks(contestsForImport, unregisteredTasks), + }; + } catch { + return fail(INTERNAL_SERVER_ERROR, { message: 'データ取得に失敗しました。' }); + } + }, - return { contestsForImport, tasksForImport }; -} + create: async ({ request, locals }) => { + await validateAdminAccess(locals); + + const formData = await request.formData(); + const source = formData.get('source'); + + if (!isContestTaskImportSource(source)) { + return fail(BAD_REQUEST, { message: 'コンテストサイト・種別が不正です。' }); + } + + const contest_id = formData.get('contest_id')?.toString(); + + if (!contest_id) { + return fail(BAD_REQUEST, { message: 'コンテストIDが指定されていません。' }); + } + + try { + const tasks = await fetchTasks(source); + const tasksByContestId = tasks.filter( + (task: TaskForImport) => task.contest_id === contest_id, + ); + + await Promise.all( + tasksByContestId.map(async (task: TaskForImport) => { + const id = (await sha256(contest_id + task.title)) as string; + await taskService.createTask( + id, + task.id, + task.contest_id, + task.problem_index, + task.title, + ); + }), + ); + } catch { + return { success: false }; + } + + return { success: true }; + }, +}; function prepareTaskMap(tasks: Tasks): Map { const taskMap = new Map(); @@ -60,8 +102,6 @@ function prepareTaskMap(tasks: Tasks): Map { return taskMap; } -// See: -// src/lib/utils/contest.ts function filterUnregisteredTasks( contestsForImport: ContestsForImport, tasksForImport: TasksForImport, @@ -90,107 +130,12 @@ function filterUnregisteredTasks( function mergeContestsAndUnregisteredTasks( contestsForImport: ContestsForImport, unregisteredTasks: Map, -) { - const contestsWithUnregisteredTasks: Contests = contestsForImport.map( - (contestForImport: ContestForImport) => { - return { - id: contestForImport.id, - title: contestForImport.title, - start_epoch_second: contestForImport.start_epoch_second, - duration_second: contestForImport.duration_second, - tasks: unregisteredTasks.get(contestForImport.id) ?? [], - }; - }, - ); - - return contestsWithUnregisteredTasks; +): Contests { + return contestsForImport.map((contestForImport: ContestForImport) => ({ + id: contestForImport.id, + title: contestForImport.title, + start_epoch_second: contestForImport.start_epoch_second, + duration_second: contestForImport.duration_second, + tasks: unregisteredTasks.get(contestForImport.id) ?? [], + })); } - -export const actions: Actions = { - create: async ({ request, locals }) => { - await validateAdminAccess(locals); - - try { - console.log('users->actions->generate'); - const formData = await request.formData(); - const contest_id = formData.get('contest_id')?.toString() as string; - - const tasks = await apiClient.getTasks(); - const tasksByContestId = tasks.filter( - (task: TaskForImport) => task.contest_id === contest_id, - ); - - tasksByContestId.map(async (task: TaskForImport) => { - const id = (await sha256(contest_id + task.title)) as string; - await taskService.createTask(id, task.id, task.contest_id, task.problem_index, task.title); - }); - } catch { - return { - success: false, - }; - } - - return { - success: true, - }; - }, - - update: async ({ request, locals }) => { - await validateAdminAccess(locals); - - try { - console.log('users->actions->generate'); - const formData = await request.formData(); - console.log(formData); - const task_id = formData.get('task_id')?.toString(); - - const task_grade_str: string | null = formData.get('task_grade')?.toString() || ''; - - //POSTされてこなかった場合は抜ける - if (task_grade_str === '') { - return { - success: true, - }; - } - - // Assuming getTaskGrade function is defined as mentioned before - const task_grade: TaskGrade | undefined = task_grade_str - ? getTaskGrade(task_grade_str) - : TaskGrade.PENDING; - - if (!task_id || task_grade === undefined) { - return { - success: false, - }; - } - - const updateResult = await taskService.updateTask(task_id, task_grade); - - if (updateResult === null) { - return { - success: false, - }; - } - - const contest_id = formData.get('contest_id')?.toString() as string; - - const tasks = await apiClient.getTasks(); - - const tasksByContestId = tasks.filter( - (task: TaskForImport) => task.contest_id === contest_id, - ); - - tasksByContestId.map(async (task: TaskForImport) => { - const id = (await sha256(contest_id + task.title)) as string; - console.log(id); - await taskService.createTask(id, task.id, task.contest_id, task.problem_index, task.title); - }); - } catch { - return { - success: false, - }; - } - - redirect(301, '/problems/'); - }, -}; diff --git a/src/routes/(admin)/tasks/+page.svelte b/src/routes/(admin)/tasks/+page.svelte index fab3cac1c..cff450da3 100644 --- a/src/routes/(admin)/tasks/+page.svelte +++ b/src/routes/(admin)/tasks/+page.svelte @@ -1,13 +1,94 @@
    - + +
    +
    +
    + + +
    diff --git a/src/routes/(admin)/tasks/_components/TaskTableForImport.svelte b/src/routes/(admin)/tasks/_components/TaskTableForImport.svelte new file mode 100644 index 000000000..e907fe8be --- /dev/null +++ b/src/routes/(admin)/tasks/_components/TaskTableForImport.svelte @@ -0,0 +1,67 @@ + + + + + コンテストID + コンテスト名 + 問題名 + + + + {#each importContests as importContest (importContest.id)} + + + + + + + + + + {#each importContest.tasks as importTask (importTask.id)} +
  • {importTask.title}
  • + {/each} +
    + + + + + + + +
    + {/each} +
    +
    From 9edfb2ef5315d4e48e25523a1dde846436b3fb7c Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 17 May 2026 08:50:27 +0000 Subject: [PATCH 02/23] fix(fixtures): add missing newline at end of fixture JSON files Co-Authored-By: Claude Sonnet 4.6 --- .../aizu_online_judge/challenges/jag_prelim/contests.json | 2 +- .../aizu_online_judge/challenges/jag_regional/contests.json | 2 +- .../aizu_online_judge/challenges/pck_final/contests.json | 2 +- .../aizu_online_judge/challenges/pck_prelim/contests.json | 2 +- .../clients/fixtures/aizu_online_judge/courses/contests.json | 2 +- src/lib/clients/fixtures/aizu_online_judge/courses/tasks.json | 2 +- src/lib/clients/fixtures/atcoder_problems/contests.json | 2 +- src/lib/clients/fixtures/atcoder_problems/tasks.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/lib/clients/fixtures/aizu_online_judge/challenges/jag_prelim/contests.json b/src/lib/clients/fixtures/aizu_online_judge/challenges/jag_prelim/contests.json index 0671e6437..716597be3 100644 --- a/src/lib/clients/fixtures/aizu_online_judge/challenges/jag_prelim/contests.json +++ b/src/lib/clients/fixtures/aizu_online_judge/challenges/jag_prelim/contests.json @@ -3176,4 +3176,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/src/lib/clients/fixtures/aizu_online_judge/challenges/jag_regional/contests.json b/src/lib/clients/fixtures/aizu_online_judge/challenges/jag_regional/contests.json index 8b6bac375..d5be48d82 100644 --- a/src/lib/clients/fixtures/aizu_online_judge/challenges/jag_regional/contests.json +++ b/src/lib/clients/fixtures/aizu_online_judge/challenges/jag_regional/contests.json @@ -3208,4 +3208,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/src/lib/clients/fixtures/aizu_online_judge/challenges/pck_final/contests.json b/src/lib/clients/fixtures/aizu_online_judge/challenges/pck_final/contests.json index 166361953..10724db38 100644 --- a/src/lib/clients/fixtures/aizu_online_judge/challenges/pck_final/contests.json +++ b/src/lib/clients/fixtures/aizu_online_judge/challenges/pck_final/contests.json @@ -6223,4 +6223,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/src/lib/clients/fixtures/aizu_online_judge/challenges/pck_prelim/contests.json b/src/lib/clients/fixtures/aizu_online_judge/challenges/pck_prelim/contests.json index 52a6eacfb..9065701da 100644 --- a/src/lib/clients/fixtures/aizu_online_judge/challenges/pck_prelim/contests.json +++ b/src/lib/clients/fixtures/aizu_online_judge/challenges/pck_prelim/contests.json @@ -4996,4 +4996,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/src/lib/clients/fixtures/aizu_online_judge/courses/contests.json b/src/lib/clients/fixtures/aizu_online_judge/courses/contests.json index c02bc2c08..1b33a4aa6 100644 --- a/src/lib/clients/fixtures/aizu_online_judge/courses/contests.json +++ b/src/lib/clients/fixtures/aizu_online_judge/courses/contests.json @@ -128,4 +128,4 @@ "description": "Information (In preparation)" } ] -} \ No newline at end of file +} diff --git a/src/lib/clients/fixtures/aizu_online_judge/courses/tasks.json b/src/lib/clients/fixtures/aizu_online_judge/courses/tasks.json index a59eae8d8..9e12f6d13 100644 --- a/src/lib/clients/fixtures/aizu_online_judge/courses/tasks.json +++ b/src/lib/clients/fixtures/aizu_online_judge/courses/tasks.json @@ -1799,4 +1799,4 @@ "score": 2.909090909090909, "userScore": 0 } -] \ No newline at end of file +] diff --git a/src/lib/clients/fixtures/atcoder_problems/contests.json b/src/lib/clients/fixtures/atcoder_problems/contests.json index 7a32c011f..de7e3b64b 100644 --- a/src/lib/clients/fixtures/atcoder_problems/contests.json +++ b/src/lib/clients/fixtures/atcoder_problems/contests.json @@ -699,4 +699,4 @@ "title": "第一回マスターズ選手権-予選-", "rate_change": "-" } -] \ No newline at end of file +] diff --git a/src/lib/clients/fixtures/atcoder_problems/tasks.json b/src/lib/clients/fixtures/atcoder_problems/tasks.json index 20d9e37dc..0d636b43a 100644 --- a/src/lib/clients/fixtures/atcoder_problems/tasks.json +++ b/src/lib/clients/fixtures/atcoder_problems/tasks.json @@ -699,4 +699,4 @@ "name": "Pond", "title": "D. Pond" } -] \ No newline at end of file +] From 1603f4df012015fea4b9bfe05811b56fb467242d Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 17 May 2026 12:05:13 +0000 Subject: [PATCH 03/23] feat(tasks): add filterContests util and route-scoped test coverage in vite config Co-Authored-By: Claude Sonnet 4.6 --- .../task-import-by-source/plan-3.md | 630 ++++++++++++++++++ .../tasks/_utils/filter_contests.test.ts | 77 +++ .../(admin)/tasks/_utils/filter_contests.ts | 20 + vite.config.ts | 1 + 4 files changed, 728 insertions(+) create mode 100644 docs/dev-notes/2026-05-17/task-import-by-source/plan-3.md create mode 100644 src/routes/(admin)/tasks/_utils/filter_contests.test.ts create mode 100644 src/routes/(admin)/tasks/_utils/filter_contests.ts diff --git a/docs/dev-notes/2026-05-17/task-import-by-source/plan-3.md b/docs/dev-notes/2026-05-17/task-import-by-source/plan-3.md new file mode 100644 index 000000000..08e73a611 --- /dev/null +++ b/docs/dev-notes/2026-05-17/task-import-by-source/plan-3.md @@ -0,0 +1,630 @@ +# 問題インポート画面 UI改善 実装計画 + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** `src/routes/(admin)/tasks/+page.svelte` の6つのUXバグをモック (`docs/ui-mock/2026-05-16/index.html`) に基づいて修正する。 + +**Architecture:** +`importContests` をローカル `$state` で保持し、`$effect` で `form.importContests` が存在するときだけ同期する。`create` アクション後は `form` が `{success:true}` に上書きされても `importContests` が消えない。`use:enhance` では `applyAction(result)` のみ呼び(`update()` は呼ばない)、`invalidateAll()` を防いでドロップダウンのリセットを回避する。Flowbite ``(onclick 非対応)は ``(numbered pages)に置き換える。 + +**Tech Stack:** SvelteKit 2, Svelte 5 (Runes), Flowbite Svelte 1.33.1, @lucide/svelte + +## 設計上の判断: Superforms を使わない理由 + +Superforms への移行を検討したが、このページには不適切と判断した。 + +- `fetch` フォームの入力フィールドは `source` 一つだけ。Zod スキーマ定義・`superValidate` の追加・`+page.server.ts` と `+page.svelte` 両方の変更が必要で、得られる機能(`$delayed`、`$message`)は手動の `isFetching`/`fetchError` 2変数で代替できる。 +- `importContests` はフォーム入力ではなくアクションの返却データであり、Superforms は管理しない。結局 `$state` + `onResult` コールバックが必要で、`$effect` アプローチと複雑さは変わらない。 +- `create` フォームは行ごとに hidden inputs のみ。バリデーションエラーのフィールド単位表示が不要なため Superforms の旨味がない。 + +Superforms は「フィールド単位のバリデーションエラー表示が必要なフォーム」向き。このページの要件を満たすコスト最小の実装は `$effect` + `applyAction` パターンである。 + +--- + +## 修正対象の問題一覧 + +| # | 問題 | 根本原因 | +| --- | ------------------------------------------ | ------------------------------------------------------------------------------------------ | +| 1 | ドロップダウンとコンテンツの間の余白不足 | フォーム section に `p-6` / `mb-10` がない | +| 2 | ローディング表示なし・ボタン非活性化なし | `isFetching` 状態と enhance コールバックが未実装 | +| 3 | ページネーションのクリックが反応しない | Flowbite `` の `onclick` が Svelte 5 で機能しない | +| 4 | ページネーションの形・配置がモックと異なる | 独自 prev/next コンポーネントが未作成 | +| 5 | 問題名で検索できない | フィルタがコンテストID・名前のみ(`tasks[].title` を未チェック) | +| 6 | インポート後に失敗表示 | `create` 後 `form={success:true}` になり `importContests` が消える | +| 7 | **AOJ インポートが DB に保存されない** | `create` が `fetchTasks` を再呼び出し → キャッシュミス時に AOJ API 失敗 → サイレント空振り | +| 8 | ドロップダウンが AtCoder に戻る | デフォルト `use:enhance` が `invalidateAll()` を呼び、Flowbite Select がリセット | + +--- + +## ファイル構成 + +| 変更種別 | ファイル | +| -------- | ----------------------------------------------------------------------- | +| 新規 | `src/routes/(admin)/tasks/_utils/filter_contests.ts` | +| 新規 | `src/routes/(admin)/tasks/_utils/filter_contests.test.ts` | +| 修正 | `src/routes/(admin)/tasks/+page.svelte` | +| 修正 | `src/routes/(admin)/tasks/_components/TaskTableForImport.svelte` | +| **修正** | **`src/routes/(admin)/tasks/+page.server.ts`**(create アクションのみ) | + +--- + +## Task 1: filterContests ユーティリティ関数の抽出とテスト(問題5対応) + +**Files:** + +- Create: `src/routes/(admin)/tasks/_utils/filter_contests.ts` +- Create: `src/routes/(admin)/tasks/_utils/filter_contests.test.ts` + +- [ ] **Step 1: テストを書く** + +```typescript +// src/routes/(admin)/tasks/_utils/filter_contests.test.ts +import { describe, test, expect } from 'vitest'; +import { filterContests } from './filter_contests'; +import type { Contests } from '$lib/types/contest'; + +const contests: Contests = [ + { + id: 'abc300', + title: 'AtCoder Beginner Contest 300', + tasks: [ + { id: 'abc300_a', contest_id: 'abc300', problem_index: 'A', title: 'N-choice question' }, + ], + start_epoch_second: 0, + duration_second: 0, + }, + { + id: 'abc301', + title: 'AtCoder Beginner Contest 301', + tasks: [{ id: 'abc301_a', contest_id: 'abc301', problem_index: 'A', title: 'Overall Winner' }], + start_epoch_second: 0, + duration_second: 0, + }, + { + id: 'abc302', + title: 'AtCoder Beginner Contest 302', + tasks: [], + start_epoch_second: 0, + duration_second: 0, + }, +]; + +describe('filterContests', () => { + describe('when query is empty', () => { + test('returns contests that have tasks', () => { + expect(filterContests(contests, '')).toHaveLength(2); + }); + + test('excludes contests with no tasks', () => { + const result = filterContests(contests, ''); + expect(result.every((contest) => contest.tasks.length > 0)).toBe(true); + }); + }); + + describe('when query matches', () => { + test('filters by contest id', () => { + const result = filterContests(contests, 'abc300'); + expect(result).toHaveLength(1); + expect(result[0].id).toBe('abc300'); + }); + + test('filters by contest title', () => { + const result = filterContests(contests, 'Beginner Contest 301'); + expect(result).toHaveLength(1); + expect(result[0].id).toBe('abc301'); + }); + + test('filters by task title', () => { + const result = filterContests(contests, 'Overall Winner'); + expect(result).toHaveLength(1); + expect(result[0].id).toBe('abc301'); + }); + + test('is case-insensitive', () => { + expect(filterContests(contests, 'OVERALL WINNER')).toHaveLength(1); + }); + }); + + describe('when query does not match', () => { + test('returns empty array', () => { + expect(filterContests(contests, 'zzz_no_match')).toHaveLength(0); + }); + + test('excludes contests with no tasks even if id matches', () => { + const result = filterContests(contests, 'abc302'); + expect(result).toHaveLength(0); + }); + }); +}); +``` + +- [ ] **Step 2: テスト失敗を確認** + +```bash +pnpm test:unit src/routes/\\(admin\\)/tasks/_utils/filter_contests.test.ts +``` + +Expected: FAIL (module not found) + +- [ ] **Step 3: フィルタ関数を実装** + +```typescript +// src/routes/(admin)/tasks/_utils/filter_contests.ts +import type { Contests } from '$lib/types/contest'; + +export function filterContests(contests: Contests, query: string): Contests { + const hasNoQuery = !query; + const lowerQuery = query.toLowerCase(); + + return contests.filter((contest) => { + if (contest.tasks.length === 0) { + return false; + } + if (hasNoQuery) { + return true; + } + return ( + contest.id.toLowerCase().includes(lowerQuery) || + contest.title.toLowerCase().includes(lowerQuery) || + contest.tasks.some((task) => task.title.toLowerCase().includes(lowerQuery)) + ); + }); +} +``` + +- [ ] **Step 4: テスト合格を確認** + +```bash +pnpm test:unit src/routes/\\(admin\\)/tasks/_utils/filter_contests.test.ts +``` + +Expected: PASS (6 tests) + +- [ ] **Step 5: コミット** + +```bash +git add src/routes/\(admin\)/tasks/_utils/ +git commit -m "feat: add filterContests utility with task title search support" +``` + +--- + +## Task 2: PaginationNav の動作確認(問題3・4対応) + +### 調査結果 + +Flowbite Svelte v1.33.1 に `PaginationNav` が存在することを確認済み(`node_modules/flowbite-svelte/dist/pagination/PaginationNav.svelte`)。 + +- Props: `currentPage: number`, `totalPages: number`, `onPageChange: (page: number) => void`, `visiblePages?: number`(default 5) +- numbered pages(1, 2, ..., n-1, n)を `PaginationButton` でレンダリング — onclick が正しく動作する +- 旧コードのバグ: `` の pages 配列に `onclick` を渡しても `Pagination` は対応していない(別コンポーネント) + +**カスタムコンポーネント(SimplePagination)の作成は不要。** Task 4 の `+page.svelte` で `PaginationNav` を直接使用する。 + +このタスクでの実装作業はなし(Task 4 に統合)。 + +--- + +## Task 3: TaskTableForImport にインポート成功コールバックを追加(問題6対応) + +`use:enhance` でインポート成功時に親コンポーネントへ通知する。 + +**Files:** + +- Modify: `src/routes/(admin)/tasks/_components/TaskTableForImport.svelte` + +- [ ] **Step 1: TaskTableForImport.svelte を修正** + +変更点: + +- `import { enhance } from '$app/forms'` と `import type { SubmitFunction } from '@sveltejs/kit'` を追加 +- Props に `onImportSuccess: (contestId: string) => void` を追加 +- 各インポートフォームに `use:enhance={makeImportHandler(importContest.id)}` を追加 + +```svelte + + + + + コンテストID + コンテスト名 + 問題名 + + + + {#each importContests as importContest (importContest.id)} + + + + + + + + + {#each importContest.tasks as importTask (importTask.id)} +
  • {importTask.title}
  • + {/each} +
    + +
    + + + + +
    +
    + {/each} +
    +
    +``` + +- [ ] **Step 2: 型チェック** + +```bash +pnpm check +``` + +Expected: No errors for TaskTableForImport (page.svelte は次 Task で修正するのでエラーがある場合は一時的に許容) + +--- + +## Task 4: +page.svelte のメイン改修(問題1・2・3・4・6対応) + +ローカル状態管理・ローディング・スペーシング・ページネーション配置を一括修正。 + +**Files:** + +- Modify: `src/routes/(admin)/tasks/+page.svelte` + +- [ ] **Step 1: +page.svelte を全面改修** + +`importContests` をローカル `$state` で保持し、`$effect` で `form.importContests` が存在するときだけ同期する。`create` 後は `form` が変わっても一覧を維持する。 + +```svelte + + +
    + + +
    +
    +
    +
    + + ` を追加する(Task 3 で追加した `use:enhance` と合わせて変更)。 + +```svelte + + + + + + +``` + +- [ ] **Step 2: +page.server.ts の create アクションを改修** + +`fetchTasks` の呼び出しを除去し、フォームから受け取ったタスクデータを直接使用する。 + +```typescript +create: async ({ request, locals }) => { + await validateAdminAccess(locals); + + const formData = await request.formData(); + const source = formData.get('source'); + + if (!isContestTaskImportSource(source)) { + return fail(BAD_REQUEST, { message: 'コンテストサイト・種別が不正です。' }); + } + + const contest_id = formData.get('contest_id'); + + if (typeof contest_id !== 'string' || !contest_id) { + return fail(BAD_REQUEST, { message: 'コンテストIDが指定されていません。' }); + } + + const tasksJson = formData.get('tasks'); + + if (typeof tasksJson !== 'string') { + return fail(BAD_REQUEST, { message: '問題データが不正です。' }); + } + + let tasks: TasksForImport; + + try { + tasks = JSON.parse(tasksJson) as TasksForImport; + } catch { + return fail(BAD_REQUEST, { message: '問題データの解析に失敗しました。' }); + } + + try { + await Promise.all( + tasks.map(async (task: TaskForImport) => { + const id = (await sha256(contest_id + task.title)) as string; + await taskService.createTask( + id, + task.id, + task.contest_id, + task.problem_index, + task.title, + ); + }), + ); + } catch { + return { success: false }; + } + + return { success: true }; +}, +``` + +不要になったインポートを削除: `fetchTasks` の参照がなければ `import { fetchContests, fetchTasks, isContestTaskImportSource }` から `fetchTasks` を除く。 + +- [ ] **Step 3: 型チェック** + +```bash +pnpm check +``` + +Expected: No errors + +- [ ] **Step 4: コミット** + +```bash +git add src/routes/\(admin\)/tasks/+page.server.ts src/routes/\(admin\)/tasks/_components/TaskTableForImport.svelte +git commit -m "fix: remove fetchTasks from create action to prevent silent AOJ import failures" +``` + +--- + +## ドロップダウンが AtCoder に戻る問題について + +**根本原因:** デフォルトの `use:enhance`(コールバックなし)が `invalidateAll()` を呼び出し、Flowbite Select の内部状態がリセットされる。 + +**修正:** Task 4 のカスタム `handleFetch` コールバックで `update()` を呼ばない設計にしたことで、`invalidateAll()` が発生しなくなるため、この問題も合わせて解決される。 + +--- + +## 検証 + +```bash +# 型チェック +pnpm check + +# ユニットテスト +pnpm test:unit + +# 開発サーバーで手動確認 +pnpm dev +``` + +手動確認チェックリスト: + +- [ ] ドロップダウンセクションに `p-6` のパディングが付き、下部に十分な余白がある +- [ ] 「問題を取得」クリック中: スピナーが表示され、ボタンが非活性になる +- [ ] コンテストID・コンテスト名・**問題名**で絞り込める +- [ ] ページネーションがナンバー形式(1, 2, ..., n-1, n)で表示され、各ページボタンが機能する +- [ ] ページネーションが検索欄の右と表の下の2ヵ所に表示される +- [ ] インポート成功後: 該当行が一覧から消え、他の行は維持される +- [ ] データ取得失敗時: 赤いエラーメッセージが表示される(表示崩れなし) +- [ ] **AOJ(PCK・JAG・コース)のインポートが確実に DB に保存される** +- [ ] **インポート後もドロップダウンが選択したコンテストサイトを維持する** diff --git a/src/routes/(admin)/tasks/_utils/filter_contests.test.ts b/src/routes/(admin)/tasks/_utils/filter_contests.test.ts new file mode 100644 index 000000000..398fa7c6f --- /dev/null +++ b/src/routes/(admin)/tasks/_utils/filter_contests.test.ts @@ -0,0 +1,77 @@ +import { describe, test, expect } from 'vitest'; +import { filterContests } from './filter_contests'; +import type { Contests } from '$lib/types/contest'; + +const contests: Contests = [ + { + id: 'abc300', + title: 'AtCoder Beginner Contest 300', + tasks: [ + { id: 'abc300_a', contest_id: 'abc300', problem_index: 'A', title: 'N-choice question' }, + ], + start_epoch_second: 0, + duration_second: 0, + }, + { + id: 'abc301', + title: 'AtCoder Beginner Contest 301', + tasks: [{ id: 'abc301_a', contest_id: 'abc301', problem_index: 'A', title: 'Overall Winner' }], + start_epoch_second: 0, + duration_second: 0, + }, + { + id: 'abc302', + title: 'AtCoder Beginner Contest 302', + tasks: [], + start_epoch_second: 0, + duration_second: 0, + }, +]; + +describe('filterContests', () => { + describe('when query is empty', () => { + test('returns contests that have tasks', () => { + expect(filterContests(contests, '')).toHaveLength(2); + }); + + test('excludes contests with no tasks', () => { + const result = filterContests(contests, ''); + expect(result.every((contest) => contest.tasks.length > 0)).toBe(true); + }); + }); + + describe('when query matches', () => { + test('filters by contest id', () => { + const result = filterContests(contests, 'abc300'); + expect(result).toHaveLength(1); + expect(result[0].id).toBe('abc300'); + }); + + test('filters by contest title', () => { + const result = filterContests(contests, 'Beginner Contest 301'); + expect(result).toHaveLength(1); + expect(result[0].id).toBe('abc301'); + }); + + test('filters by task title', () => { + const result = filterContests(contests, 'Overall Winner'); + expect(result).toHaveLength(1); + expect(result[0].id).toBe('abc301'); + }); + + test('is case-insensitive', () => { + expect(filterContests(contests, 'OVERALL WINNER')).toHaveLength(1); + }); + }); + + describe('when query does not match', () => { + test('returns empty array', () => { + expect(filterContests(contests, 'zzz_no_match')).toHaveLength(0); + }); + + test('excludes contests with no tasks even if id matches', () => { + const result = filterContests(contests, 'abc302'); + expect(result).toHaveLength(0); + }); + }); +}); diff --git a/src/routes/(admin)/tasks/_utils/filter_contests.ts b/src/routes/(admin)/tasks/_utils/filter_contests.ts new file mode 100644 index 000000000..a0a895331 --- /dev/null +++ b/src/routes/(admin)/tasks/_utils/filter_contests.ts @@ -0,0 +1,20 @@ +import type { Contests } from '$lib/types/contest'; + +export function filterContests(contests: Contests, query: string): Contests { + const hasNoQuery = !query; + const lowerQuery = query.toLowerCase(); + + return contests.filter((contest) => { + if (contest.tasks.length === 0) { + return false; + } + if (hasNoQuery) { + return true; + } + return ( + contest.id.toLowerCase().includes(lowerQuery) || + contest.title.toLowerCase().includes(lowerQuery) || + contest.tasks.some((task) => task.title.toLowerCase().includes(lowerQuery)) + ); + }); +} diff --git a/vite.config.ts b/vite.config.ts index c28b4e23b..65227f17c 100755 --- a/vite.config.ts +++ b/vite.config.ts @@ -12,6 +12,7 @@ export default defineConfig({ 'src/lib/**/*.test.ts', // shared utility tests 'src/test/**/*.test.ts', // existing tests (phase transition) 'src/features/**/*.test.ts', // feature co-location tests + 'src/routes/**/*.test.ts', // route-scoped utility tests ], exclude: [ '.pnpm-store/**', From 51371663922fba6b2e30fc41482cc6012bc2f223 Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 17 May 2026 12:07:34 +0000 Subject: [PATCH 04/23] fix: decouple importContests from form state, add loading state, use PaginationNav for numbered pagination --- src/routes/(admin)/tasks/+page.server.ts | 25 +++- src/routes/(admin)/tasks/+page.svelte | 138 +++++++++++------- .../_components/TaskTableForImport.svelte | 24 ++- 3 files changed, 121 insertions(+), 66 deletions(-) diff --git a/src/routes/(admin)/tasks/+page.server.ts b/src/routes/(admin)/tasks/+page.server.ts index 7dad9922e..34697ce50 100644 --- a/src/routes/(admin)/tasks/+page.server.ts +++ b/src/routes/(admin)/tasks/+page.server.ts @@ -6,7 +6,7 @@ import { type Task, type Tasks, type TaskForImport, type TasksForImport } from ' import * as taskService from '$lib/services/tasks'; import { validateAdminAccess } from '$features/auth/services/admin_access'; -import { fetchContests, fetchTasks, isContestTaskImportSource } from '$lib/clients'; +import { fetchContests, isContestTaskImportSource } from '$lib/clients'; import { classifyContest } from '$lib/utils/contest'; import { sha256 } from '$lib/utils/hash'; @@ -60,20 +60,29 @@ export const actions: Actions = { return fail(BAD_REQUEST, { message: 'コンテストサイト・種別が不正です。' }); } - const contest_id = formData.get('contest_id')?.toString(); + const contest_id = formData.get('contest_id'); - if (!contest_id) { + if (typeof contest_id !== 'string' || !contest_id) { return fail(BAD_REQUEST, { message: 'コンテストIDが指定されていません。' }); } + const tasksJson = formData.get('tasks'); + + if (typeof tasksJson !== 'string') { + return fail(BAD_REQUEST, { message: '問題データが不正です。' }); + } + + let tasks: TasksForImport; + try { - const tasks = await fetchTasks(source); - const tasksByContestId = tasks.filter( - (task: TaskForImport) => task.contest_id === contest_id, - ); + tasks = JSON.parse(tasksJson) as TasksForImport; + } catch { + return fail(BAD_REQUEST, { message: '問題データの解析に失敗しました。' }); + } + try { await Promise.all( - tasksByContestId.map(async (task: TaskForImport) => { + tasks.map(async (task: TaskForImport) => { const id = (await sha256(contest_id + task.title)) as string; await taskService.createTask( id, diff --git a/src/routes/(admin)/tasks/+page.svelte b/src/routes/(admin)/tasks/+page.svelte index cff450da3..c5eaa97b3 100644 --- a/src/routes/(admin)/tasks/+page.svelte +++ b/src/routes/(admin)/tasks/+page.svelte @@ -1,15 +1,17 @@
    -
    -
    -
    - - { + currentPage = 1; + }} + /> +
    +
    - +
    +
    + + {#if isFetching} +
    + +

    データを取得しています...

    - + {:else if fetchError !== null} +

    {fetchError}

    + {:else if importContests.length >= 1} + {#snippet paginationNav()} + { + currentPage = page; + }} + /> + {/snippet} - {#if importContests.length >= 1}
    - +
    + + {@render paginationNav()} +
    - + - {#if totalPages > 1} -
    - -
    - {/if} +
    + {@render paginationNav()} +
    - {:else if form !== null && form !== undefined && !('importContests' in (form ?? {}))} -

    - {(form as { message?: string })?.message ?? 'データ取得に失敗しました。'} -

    {/if}
    diff --git a/src/routes/(admin)/tasks/_components/TaskTableForImport.svelte b/src/routes/(admin)/tasks/_components/TaskTableForImport.svelte index e907fe8be..e330775ad 100644 --- a/src/routes/(admin)/tasks/_components/TaskTableForImport.svelte +++ b/src/routes/(admin)/tasks/_components/TaskTableForImport.svelte @@ -1,4 +1,7 @@ @@ -48,16 +60,16 @@ {/each} - {#each importContest.tasks as importTask (importTask.id)}
  • {importTask.title}
  • {/each}
    -
    - - + + + +
    From fe718a93769f267073808a961d000d37a6657aa8 Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 17 May 2026 12:11:37 +0000 Subject: [PATCH 05/23] refactor: rename filter_contests to contests --- src/routes/(admin)/tasks/+page.svelte | 2 +- .../_utils/{filter_contests.test.ts => contests.test.ts} | 6 +++--- .../tasks/_utils/{filter_contests.ts => contests.ts} | 0 3 files changed, 4 insertions(+), 4 deletions(-) rename src/routes/(admin)/tasks/_utils/{filter_contests.test.ts => contests.test.ts} (87%) rename src/routes/(admin)/tasks/_utils/{filter_contests.ts => contests.ts} (100%) diff --git a/src/routes/(admin)/tasks/+page.svelte b/src/routes/(admin)/tasks/+page.svelte index c5eaa97b3..7a8cd6de1 100644 --- a/src/routes/(admin)/tasks/+page.svelte +++ b/src/routes/(admin)/tasks/+page.svelte @@ -11,7 +11,7 @@ import SpinnerWrapper from '$lib/components/SpinnerWrapper.svelte'; import TaskTableForImport from './_components/TaskTableForImport.svelte'; import TaskSearchBox from './_components/TaskSearchBox.svelte'; - import { filterContests } from './_utils/filter_contests'; + import { filterContests } from './_utils/contests'; const PAGE_SIZE = 20; diff --git a/src/routes/(admin)/tasks/_utils/filter_contests.test.ts b/src/routes/(admin)/tasks/_utils/contests.test.ts similarity index 87% rename from src/routes/(admin)/tasks/_utils/filter_contests.test.ts rename to src/routes/(admin)/tasks/_utils/contests.test.ts index 398fa7c6f..ef83e7100 100644 --- a/src/routes/(admin)/tasks/_utils/filter_contests.test.ts +++ b/src/routes/(admin)/tasks/_utils/contests.test.ts @@ -1,5 +1,5 @@ import { describe, test, expect } from 'vitest'; -import { filterContests } from './filter_contests'; +import { filterContests } from './contests'; import type { Contests } from '$lib/types/contest'; const contests: Contests = [ @@ -7,7 +7,7 @@ const contests: Contests = [ id: 'abc300', title: 'AtCoder Beginner Contest 300', tasks: [ - { id: 'abc300_a', contest_id: 'abc300', problem_index: 'A', title: 'N-choice question' }, + { id: 'abc300_a', task_id: 'abc300_a', contest_id: 'abc300', problem_index: 'A', title: 'N-choice question' }, ], start_epoch_second: 0, duration_second: 0, @@ -15,7 +15,7 @@ const contests: Contests = [ { id: 'abc301', title: 'AtCoder Beginner Contest 301', - tasks: [{ id: 'abc301_a', contest_id: 'abc301', problem_index: 'A', title: 'Overall Winner' }], + tasks: [{ id: 'abc301_a', task_id: 'abc301_a', contest_id: 'abc301', problem_index: 'A', title: 'Overall Winner' }], start_epoch_second: 0, duration_second: 0, }, diff --git a/src/routes/(admin)/tasks/_utils/filter_contests.ts b/src/routes/(admin)/tasks/_utils/contests.ts similarity index 100% rename from src/routes/(admin)/tasks/_utils/filter_contests.ts rename to src/routes/(admin)/tasks/_utils/contests.ts From 0777406cb5f3a2f43a468ebb02ac7ece43b870cf Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 17 May 2026 12:12:08 +0000 Subject: [PATCH 06/23] style: format contests test fixture objects for readability Co-Authored-By: Claude Sonnet 4.6 --- .../(admin)/tasks/_utils/contests.test.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/routes/(admin)/tasks/_utils/contests.test.ts b/src/routes/(admin)/tasks/_utils/contests.test.ts index ef83e7100..ba497de31 100644 --- a/src/routes/(admin)/tasks/_utils/contests.test.ts +++ b/src/routes/(admin)/tasks/_utils/contests.test.ts @@ -7,7 +7,13 @@ const contests: Contests = [ id: 'abc300', title: 'AtCoder Beginner Contest 300', tasks: [ - { id: 'abc300_a', task_id: 'abc300_a', contest_id: 'abc300', problem_index: 'A', title: 'N-choice question' }, + { + id: 'abc300_a', + task_id: 'abc300_a', + contest_id: 'abc300', + problem_index: 'A', + title: 'N-choice question', + }, ], start_epoch_second: 0, duration_second: 0, @@ -15,7 +21,15 @@ const contests: Contests = [ { id: 'abc301', title: 'AtCoder Beginner Contest 301', - tasks: [{ id: 'abc301_a', task_id: 'abc301_a', contest_id: 'abc301', problem_index: 'A', title: 'Overall Winner' }], + tasks: [ + { + id: 'abc301_a', + task_id: 'abc301_a', + contest_id: 'abc301', + problem_index: 'A', + title: 'Overall Winner', + }, + ], start_epoch_second: 0, duration_second: 0, }, From e3e93fe957b7b56bee8d91bc713eab70b6018e0f Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 17 May 2026 12:17:12 +0000 Subject: [PATCH 07/23] fix: restore fetchTasks import for fetch action, align form layout with mock --- src/routes/(admin)/tasks/+page.server.ts | 2 +- src/routes/(admin)/tasks/+page.svelte | 36 +++++++++++++----------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/routes/(admin)/tasks/+page.server.ts b/src/routes/(admin)/tasks/+page.server.ts index 34697ce50..f6e4b6743 100644 --- a/src/routes/(admin)/tasks/+page.server.ts +++ b/src/routes/(admin)/tasks/+page.server.ts @@ -6,7 +6,7 @@ import { type Task, type Tasks, type TaskForImport, type TasksForImport } from ' import * as taskService from '$lib/services/tasks'; import { validateAdminAccess } from '$features/auth/services/admin_access'; -import { fetchContests, isContestTaskImportSource } from '$lib/clients'; +import { fetchContests, fetchTasks, isContestTaskImportSource } from '$lib/clients'; import { classifyContest } from '$lib/utils/contest'; import { sha256 } from '$lib/utils/hash'; diff --git a/src/routes/(admin)/tasks/+page.svelte b/src/routes/(admin)/tasks/+page.svelte index 7a8cd6de1..e99b8835e 100644 --- a/src/routes/(admin)/tasks/+page.svelte +++ b/src/routes/(admin)/tasks/+page.svelte @@ -70,24 +70,26 @@
    -
    -
    -
    -
    - - { + currentPage = 1; + }} + /> +
    +
    - -
    - + + {#if isFetching} From 2fba8f02a7b06deede6a041bde3b1b6c746dadee Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 17 May 2026 12:20:31 +0000 Subject: [PATCH 08/23] fix: widen search box to w-96 --- src/routes/(admin)/tasks/_components/TaskSearchBox.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/(admin)/tasks/_components/TaskSearchBox.svelte b/src/routes/(admin)/tasks/_components/TaskSearchBox.svelte index c76599a21..9b28db797 100644 --- a/src/routes/(admin)/tasks/_components/TaskSearchBox.svelte +++ b/src/routes/(admin)/tasks/_components/TaskSearchBox.svelte @@ -10,7 +10,7 @@ $props(); -
    +
    From e4a24c267819ce8d15dde35e219fff64e5cd5e35 Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 17 May 2026 12:31:48 +0000 Subject: [PATCH 09/23] fix: replace $effect+applyAction with direct result handling in handleFetch --- src/routes/(admin)/tasks/+page.svelte | 32 +++++++++++---------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/src/routes/(admin)/tasks/+page.svelte b/src/routes/(admin)/tasks/+page.svelte index e99b8835e..0b300ebd9 100644 --- a/src/routes/(admin)/tasks/+page.svelte +++ b/src/routes/(admin)/tasks/+page.svelte @@ -1,6 +1,6 @@
    -
    From 9bc1737fddf9f97314dedd34f4030f41f70b4d45 Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 17 May 2026 12:57:06 +0000 Subject: [PATCH 11/23] refactor: reorder script declarations by UI section --- src/routes/(admin)/tasks/+page.svelte | 62 ++++++++++++++------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/src/routes/(admin)/tasks/+page.svelte b/src/routes/(admin)/tasks/+page.svelte index 0b300ebd9..1619886dd 100644 --- a/src/routes/(admin)/tasks/+page.svelte +++ b/src/routes/(admin)/tasks/+page.svelte @@ -5,35 +5,24 @@ import { Select, Label, Button, PaginationNav } from 'flowbite-svelte'; import type { Contests } from '$lib/types/contest'; + import { importSourceEntries, type ContestTaskImportSource } from '$lib/clients'; import HeadingOne from '$lib/components/HeadingOne.svelte'; import SpinnerWrapper from '$lib/components/SpinnerWrapper.svelte'; import TaskTableForImport from './_components/TaskTableForImport.svelte'; import TaskSearchBox from './_components/TaskSearchBox.svelte'; - import { filterContests } from './_utils/contests'; - - const PAGE_SIZE = 20; - - let selectedSource = $state('atcoder'); - let searchQuery = $state(''); - let currentPage = $state(1); - let importContests = $state([]); - let isFetching = $state(false); - let fetchError = $state(null); - - const filteredContests = $derived(filterContests(importContests, searchQuery)); - - const pagedContests = $derived( - filteredContests.slice((currentPage - 1) * PAGE_SIZE, currentPage * PAGE_SIZE), - ); - const totalPages = $derived(Math.max(1, Math.ceil(filteredContests.length / PAGE_SIZE))); + import { filterContests } from './_utils/contests'; + // -- source dropdown -- const sourceOptions = importSourceEntries.map(([value, config]) => ({ value, name: config.label, })); + let selectedSource = $state('atcoder'); + let isFetching = $state(false); + let fetchError = $state(null); // update() is intentionally not called to skip invalidateAll(), // preventing Flowbite Select from resetting its displayed value. @@ -56,18 +45,33 @@ }; }; + // -- filtering -- + let importContests = $state([]); + let searchQuery = $state(''); + const filteredContests = $derived(filterContests(importContests, searchQuery)); + function handleImportSuccess(contestId: string) { importContests = importContests.filter((contest) => contest.id !== contestId); } + + // -- pagination -- + let currentPage = $state(1); + + const PAGE_SIZE = 20; + const pagedContests = $derived( + filteredContests.slice((currentPage - 1) * PAGE_SIZE, currentPage * PAGE_SIZE), + ); + const totalPages = $derived(Math.max(1, Math.ceil(filteredContests.length / PAGE_SIZE)));
    -
    +
    +
    +
    +
    +
    + +
    + +
    From f30675f59f7e37923542d0f259bac34fe645eca3 Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 17 May 2026 13:06:02 +0000 Subject: [PATCH 14/23] fix: use Flowbite Input left snippet for search icon --- .../(admin)/tasks/_components/TaskSearchBox.svelte | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/routes/(admin)/tasks/_components/TaskSearchBox.svelte b/src/routes/(admin)/tasks/_components/TaskSearchBox.svelte index 1fae64172..e16c4416d 100644 --- a/src/routes/(admin)/tasks/_components/TaskSearchBox.svelte +++ b/src/routes/(admin)/tasks/_components/TaskSearchBox.svelte @@ -12,10 +12,9 @@
    -
    -
    + + {#snippet left()} -
    - -
    + {/snippet} +
    From f9e1f05012202f571d63fcfd0f9e5d807b72e02c Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 17 May 2026 13:06:46 +0000 Subject: [PATCH 15/23] fix: add pl-9 to prevent text overlapping search icon --- src/routes/(admin)/tasks/_components/TaskSearchBox.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/(admin)/tasks/_components/TaskSearchBox.svelte b/src/routes/(admin)/tasks/_components/TaskSearchBox.svelte index e16c4416d..78e816375 100644 --- a/src/routes/(admin)/tasks/_components/TaskSearchBox.svelte +++ b/src/routes/(admin)/tasks/_components/TaskSearchBox.svelte @@ -12,7 +12,7 @@
    - + {#snippet left()} {/snippet} From 964daeb7b5b173c91aeb97467da8127d24945b51 Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 17 May 2026 13:12:03 +0000 Subject: [PATCH 16/23] fix: move fetchError block after content to preserve correct render order Co-Authored-By: Claude Sonnet 4.6 --- src/routes/(admin)/tasks/+page.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/(admin)/tasks/+page.svelte b/src/routes/(admin)/tasks/+page.svelte index 040c251a0..f75ddeeaa 100644 --- a/src/routes/(admin)/tasks/+page.svelte +++ b/src/routes/(admin)/tasks/+page.svelte @@ -96,8 +96,6 @@
    - {:else if fetchError !== null} -

    {fetchError}

    {:else if importContests.length >= 1}
    @@ -115,6 +113,8 @@ {@render paginationNav()}
    + {:else if fetchError !== null} +

    {fetchError}

    {/if}
    From 2c978b1b067b532a3e6c259a38031547bafb8ffb Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 17 May 2026 13:15:08 +0000 Subject: [PATCH 17/23] fix: reset currentPage to 1 when filteredContests changes --- src/routes/(admin)/tasks/+page.svelte | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/routes/(admin)/tasks/+page.svelte b/src/routes/(admin)/tasks/+page.svelte index f75ddeeaa..6185b1327 100644 --- a/src/routes/(admin)/tasks/+page.svelte +++ b/src/routes/(admin)/tasks/+page.svelte @@ -56,9 +56,15 @@ } // -- pagination -- + const PAGE_SIZE = 20; let currentPage = $state(1); - const PAGE_SIZE = 20; + // Reset to page 1 whenever the filtered set changes (new search or new data). + $effect(() => { + filteredContests; + currentPage = 1; + }); + const pagedContests = $derived( filteredContests.slice((currentPage - 1) * PAGE_SIZE, currentPage * PAGE_SIZE), ); From 38f02264f729d8a6a6879516aeb5802d132b1de7 Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 17 May 2026 13:15:56 +0000 Subject: [PATCH 18/23] docs: add Note prefix to filteredContests effect comment Co-Authored-By: Claude Sonnet 4.6 --- src/routes/(admin)/tasks/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/(admin)/tasks/+page.svelte b/src/routes/(admin)/tasks/+page.svelte index 6185b1327..063e6efed 100644 --- a/src/routes/(admin)/tasks/+page.svelte +++ b/src/routes/(admin)/tasks/+page.svelte @@ -59,7 +59,7 @@ const PAGE_SIZE = 20; let currentPage = $state(1); - // Reset to page 1 whenever the filtered set changes (new search or new data). + // Note: Reset to page 1 whenever the filtered set changes (new search or new data). $effect(() => { filteredContests; currentPage = 1; From 40c0869bb9c4af11277741b19959312b562d6179 Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 17 May 2026 13:16:42 +0000 Subject: [PATCH 19/23] fix: remove redundant currentPage reset from fetch success handler Co-Authored-By: Claude Sonnet 4.6 --- src/routes/(admin)/tasks/+page.svelte | 1 - 1 file changed, 1 deletion(-) diff --git a/src/routes/(admin)/tasks/+page.svelte b/src/routes/(admin)/tasks/+page.svelte index 063e6efed..3409a54bf 100644 --- a/src/routes/(admin)/tasks/+page.svelte +++ b/src/routes/(admin)/tasks/+page.svelte @@ -35,7 +35,6 @@ if (result.type === 'success' && result.data?.importContests) { importContests = result.data.importContests as Contests; - currentPage = 1; searchQuery = ''; } else if (result.type === 'failure') { fetchError = (result.data as { message?: string })?.message ?? 'データ取得に失敗しました。'; From 9bec079ba8b17bb95c56e034419388f8cb34a03f Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 17 May 2026 13:37:10 +0000 Subject: [PATCH 20/23] docs: clean up dev-notes and ui-mock after task-import-by-source implementation Co-Authored-By: Claude Sonnet 4.6 --- .../task-import-by-source/plan-2nd.md | 95 -- .../task-import-by-source/plan-3.md | 653 --------- .../2026-05-17/task-import-by-source/plan.md | 386 +----- docs/ui-mock/2026-05-16/index.html | 1166 ----------------- 4 files changed, 43 insertions(+), 2257 deletions(-) delete mode 100644 docs/dev-notes/2026-05-17/task-import-by-source/plan-2nd.md delete mode 100644 docs/dev-notes/2026-05-17/task-import-by-source/plan-3.md delete mode 100644 docs/ui-mock/2026-05-16/index.html diff --git a/docs/dev-notes/2026-05-17/task-import-by-source/plan-2nd.md b/docs/dev-notes/2026-05-17/task-import-by-source/plan-2nd.md deleted file mode 100644 index a685e910b..000000000 --- a/docs/dev-notes/2026-05-17/task-import-by-source/plan-2nd.md +++ /dev/null @@ -1,95 +0,0 @@ -# AOJ fixture を raw API 形式に修正 - -## 概要 - -`record_requests.ts` が変換済みデータ(`ContestsForImport`)を fixture に保存していたため、 -nock で raw API 形式を期待する `clients.test.ts` が 11/15 失敗している。 -`record_requests.ts` を raw API レスポンスを直接保存する形に書き換え、 -nock → client 変換 → アサート の流れを正しく成立させる。 - -## Task 1: `record_requests.ts` を rewrite - -**ファイル**: `src/lib/clients/fixtures/record_requests.ts` - -### 削除 - -- `clients` 配列(`TasksApiClient` ベースの設計) -- `saveContests`, `saveTasks`, `validateContestSiteApi`, `bindChallenge` -- `startRecordRequests`, `stopRecordRequests`(nock recorder 不要) - -### 変更後の保存ロジック - -`HttpRequestClient.fetchApiWithConfig()` で raw API を直接取得して保存する。 - -``` -AOJ courses: - GET /courses → AOJCourseAPI (そのまま) → aizu_online_judge/courses/contests.json - GET /problems?size=10000 → AOJTaskAPIs (100 件サンプル) → aizu_online_judge/courses/tasks.json - -AOJ challenges (4 種): - GET /challenges/cl/PCK/PRELIM → AOJChallengeContestAPI → challenges/pck_prelim/contests.json - GET /challenges/cl/PCK/FINAL → AOJChallengeContestAPI → challenges/pck_final/contests.json - GET /challenges/cl/JAG/PRELIM → AOJChallengeContestAPI → challenges/jag_prelim/contests.json - GET /challenges/cl/JAG/REGIONAL → AOJChallengeContestAPI → challenges/jag_regional/contests.json - ※ tasks.json は生成しない(tasks は contests レスポンスに埋め込み済み) - ※ contests 配列を 100 件サンプル、largeCl ラッパーは保持: - { ...raw, contests: getRandomElementsFromArray(raw.contests, 100) } -``` - -AtCoder は `AtCoderProblemsApiClient` をそのまま使用 -(raw API = `ContestsForImport` 形式であり変換なし)。 - -`getRandomElementsFromArray`, `toJson`, `ensureDirectoryExists` は残す。 - -### 追加インポート - -```typescript -import type { - AOJCourseAPI, - AOJTaskAPIs, - AOJChallengeContestAPI, -} from '$lib/clients/aizu_online_judge/types'; -``` - -## Task 2: `AojChallengesApiClient` にコメントを追加 - -**ファイル**: `src/lib/clients/aizu_online_judge/clients.ts` - -challenges が1エンドポイントで contests と tasks 両方を返す(`days[].problems` 埋め込み)ことは -非自明なので、クラス定義の直前にコメントを追加する。→ **実装済み** - -## Task 3: `clients.test.ts` の未使用パスを削除 - -**ファイル**: `src/lib/clients/aizu_online_judge/clients.test.ts` - -`FIXTURE_PATHS` の challenge 各エントリから未参照の `tasks` キーを削除する。 - -```typescript -// 変更前 -pckPrelim: { contests: '...', tasks: '...' } - -// 変更後 -pckPrelim: { contests: '...' } -``` - -対象: `pckPrelim`, `pckFinal`, `jagPrelim`, `jagRegional` - -## Task 3: fixture 再生成 - -```bash -pnpm dlx vite-node ./src/lib/clients/fixtures/record_requests.ts -``` - -生成される raw fixture: - -- `courses/contests.json` → `{ filter: string, courses: Course[] }` -- `courses/tasks.json` → `AOJTaskAPI[]` -- `challenges/*/contests.json` → `{ largeCl, contests: ChallengeContest[] }` - -## Task 4: テスト検証 - -```bash -pnpm test:unit -``` - -全テストがグリーンになることを確認。 diff --git a/docs/dev-notes/2026-05-17/task-import-by-source/plan-3.md b/docs/dev-notes/2026-05-17/task-import-by-source/plan-3.md deleted file mode 100644 index 2bf6f8753..000000000 --- a/docs/dev-notes/2026-05-17/task-import-by-source/plan-3.md +++ /dev/null @@ -1,653 +0,0 @@ -# 問題インポート画面 UI改善 実装計画 - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** `src/routes/(admin)/tasks/+page.svelte` の6つのUXバグをモック (`docs/ui-mock/2026-05-16/index.html`) に基づいて修正する。 - -**Architecture:** -`importContests` をローカル `$state` で保持し、`$effect` で `form.importContests` が存在するときだけ同期する。`create` アクション後は `form` が `{success:true}` に上書きされても `importContests` が消えない。`use:enhance` では `applyAction(result)` のみ呼び(`update()` は呼ばない)、`invalidateAll()` を防いでドロップダウンのリセットを回避する。Flowbite ``(onclick 非対応)は ``(numbered pages)に置き換える。 - -**Tech Stack:** SvelteKit 2, Svelte 5 (Runes), Flowbite Svelte 1.33.1, @lucide/svelte - -## 設計上の判断: Superforms を使わない理由 - -Superforms への移行を検討したが、このページには不適切と判断した。 - -- `fetch` フォームの入力フィールドは `source` 一つだけ。Zod スキーマ定義・`superValidate` の追加・`+page.server.ts` と `+page.svelte` 両方の変更が必要で、得られる機能(`$delayed`、`$message`)は手動の `isFetching`/`fetchError` 2変数で代替できる。 -- `importContests` はフォーム入力ではなくアクションの返却データであり、Superforms は管理しない。結局 `$state` + `onResult` コールバックが必要で、`$effect` アプローチと複雑さは変わらない。 -- `create` フォームは行ごとに hidden inputs のみ。バリデーションエラーのフィールド単位表示が不要なため Superforms の旨味がない。 - -Superforms は「フィールド単位のバリデーションエラー表示が必要なフォーム」向き。このページの要件を満たすコスト最小の実装は `$effect` + `applyAction` パターンである。 - ---- - -## 修正対象の問題一覧 - -| # | 問題 | 根本原因 | -| --- | ------------------------------------------ | ------------------------------------------------------------------------------------------ | -| 1 | ドロップダウンとコンテンツの間の余白不足 | フォーム section に `p-6` / `mb-10` がない | -| 2 | ローディング表示なし・ボタン非活性化なし | `isFetching` 状態と enhance コールバックが未実装 | -| 3 | ページネーションのクリックが反応しない | Flowbite `` の `onclick` が Svelte 5 で機能しない | -| 4 | ページネーションの形・配置がモックと異なる | 独自 prev/next コンポーネントが未作成 | -| 5 | 問題名で検索できない | フィルタがコンテストID・名前のみ(`tasks[].title` を未チェック) | -| 6 | インポート後に失敗表示 | `create` 後 `form={success:true}` になり `importContests` が消える | -| 7 | **AOJ インポートが DB に保存されない** | `create` が `fetchTasks` を再呼び出し → キャッシュミス時に AOJ API 失敗 → サイレント空振り | -| 8 | ドロップダウンが AtCoder に戻る | デフォルト `use:enhance` が `invalidateAll()` を呼び、Flowbite Select がリセット | - ---- - -## ファイル構成 - -| 変更種別 | ファイル | -| -------- | ----------------------------------------------------------------------- | -| 新規 | `src/routes/(admin)/tasks/_utils/filter_contests.ts` | -| 新規 | `src/routes/(admin)/tasks/_utils/filter_contests.test.ts` | -| 修正 | `src/routes/(admin)/tasks/+page.svelte` | -| 修正 | `src/routes/(admin)/tasks/_components/TaskTableForImport.svelte` | -| **修正** | **`src/routes/(admin)/tasks/+page.server.ts`**(create アクションのみ) | - ---- - -## Task 1: filterContests ユーティリティ関数の抽出とテスト(問題5対応) - -**Files:** - -- Create: `src/routes/(admin)/tasks/_utils/filter_contests.ts` -- Create: `src/routes/(admin)/tasks/_utils/filter_contests.test.ts` - -- [ ] **Step 1: テストを書く** - -```typescript -// src/routes/(admin)/tasks/_utils/filter_contests.test.ts -import { describe, test, expect } from 'vitest'; -import { filterContests } from './filter_contests'; -import type { Contests } from '$lib/types/contest'; - -const contests: Contests = [ - { - id: 'abc300', - title: 'AtCoder Beginner Contest 300', - tasks: [ - { id: 'abc300_a', contest_id: 'abc300', problem_index: 'A', title: 'N-choice question' }, - ], - start_epoch_second: 0, - duration_second: 0, - }, - { - id: 'abc301', - title: 'AtCoder Beginner Contest 301', - tasks: [{ id: 'abc301_a', contest_id: 'abc301', problem_index: 'A', title: 'Overall Winner' }], - start_epoch_second: 0, - duration_second: 0, - }, - { - id: 'abc302', - title: 'AtCoder Beginner Contest 302', - tasks: [], - start_epoch_second: 0, - duration_second: 0, - }, -]; - -describe('filterContests', () => { - describe('when query is empty', () => { - test('returns contests that have tasks', () => { - expect(filterContests(contests, '')).toHaveLength(2); - }); - - test('excludes contests with no tasks', () => { - const result = filterContests(contests, ''); - expect(result.every((contest) => contest.tasks.length > 0)).toBe(true); - }); - }); - - describe('when query matches', () => { - test('filters by contest id', () => { - const result = filterContests(contests, 'abc300'); - expect(result).toHaveLength(1); - expect(result[0].id).toBe('abc300'); - }); - - test('filters by contest title', () => { - const result = filterContests(contests, 'Beginner Contest 301'); - expect(result).toHaveLength(1); - expect(result[0].id).toBe('abc301'); - }); - - test('filters by task title', () => { - const result = filterContests(contests, 'Overall Winner'); - expect(result).toHaveLength(1); - expect(result[0].id).toBe('abc301'); - }); - - test('is case-insensitive', () => { - expect(filterContests(contests, 'OVERALL WINNER')).toHaveLength(1); - }); - }); - - describe('when query does not match', () => { - test('returns empty array', () => { - expect(filterContests(contests, 'zzz_no_match')).toHaveLength(0); - }); - - test('excludes contests with no tasks even if id matches', () => { - const result = filterContests(contests, 'abc302'); - expect(result).toHaveLength(0); - }); - }); -}); -``` - -- [ ] **Step 2: テスト失敗を確認** - -```bash -pnpm test:unit src/routes/\\(admin\\)/tasks/_utils/filter_contests.test.ts -``` - -Expected: FAIL (module not found) - -- [ ] **Step 3: フィルタ関数を実装** - -```typescript -// src/routes/(admin)/tasks/_utils/filter_contests.ts -import type { Contests } from '$lib/types/contest'; - -export function filterContests(contests: Contests, query: string): Contests { - const hasNoQuery = !query; - const lowerQuery = query.toLowerCase(); - - return contests.filter((contest) => { - if (contest.tasks.length === 0) { - return false; - } - if (hasNoQuery) { - return true; - } - return ( - contest.id.toLowerCase().includes(lowerQuery) || - contest.title.toLowerCase().includes(lowerQuery) || - contest.tasks.some((task) => task.title.toLowerCase().includes(lowerQuery)) - ); - }); -} -``` - -- [ ] **Step 4: テスト合格を確認** - -```bash -pnpm test:unit src/routes/\\(admin\\)/tasks/_utils/filter_contests.test.ts -``` - -Expected: PASS (6 tests) - -- [ ] **Step 5: コミット** - -```bash -git add src/routes/\(admin\)/tasks/_utils/ -git commit -m "feat: add filterContests utility with task title search support" -``` - ---- - -## Task 2: PaginationNav の動作確認(問題3・4対応) - -### 調査結果 - -Flowbite Svelte v1.33.1 に `PaginationNav` が存在することを確認済み(`node_modules/flowbite-svelte/dist/pagination/PaginationNav.svelte`)。 - -- Props: `currentPage: number`, `totalPages: number`, `onPageChange: (page: number) => void`, `visiblePages?: number`(default 5) -- numbered pages(1, 2, ..., n-1, n)を `PaginationButton` でレンダリング — onclick が正しく動作する -- 旧コードのバグ: `` の pages 配列に `onclick` を渡しても `Pagination` は対応していない(別コンポーネント) - -**カスタムコンポーネント(SimplePagination)の作成は不要。** Task 4 の `+page.svelte` で `PaginationNav` を直接使用する。 - -このタスクでの実装作業はなし(Task 4 に統合)。 - ---- - -## Task 3: TaskTableForImport にインポート成功コールバックを追加(問題6対応) - -`use:enhance` でインポート成功時に親コンポーネントへ通知する。 - -**Files:** - -- Modify: `src/routes/(admin)/tasks/_components/TaskTableForImport.svelte` - -- [ ] **Step 1: TaskTableForImport.svelte を修正** - -変更点: - -- `import { enhance } from '$app/forms'` と `import type { SubmitFunction } from '@sveltejs/kit'` を追加 -- Props に `onImportSuccess: (contestId: string) => void` を追加 -- 各インポートフォームに `use:enhance={makeImportHandler(importContest.id)}` を追加 - -```svelte - - -
    - - コンテストID - コンテスト名 - 問題名 - - - - {#each importContests as importContest (importContest.id)} - - - - - - - - - {#each importContest.tasks as importTask (importTask.id)} -
  • {importTask.title}
  • - {/each} -
    - - - - - - - -
    - {/each} -
    -
    -``` - -- [ ] **Step 2: 型チェック** - -```bash -pnpm check -``` - -Expected: No errors for TaskTableForImport (page.svelte は次 Task で修正するのでエラーがある場合は一時的に許容) - ---- - -## Task 4: +page.svelte のメイン改修(問題1・2・3・4・6対応) - -ローカル状態管理・ローディング・スペーシング・ページネーション配置を一括修正。 - -**Files:** - -- Modify: `src/routes/(admin)/tasks/+page.svelte` - -- [ ] **Step 1: +page.svelte を全面改修** - -`importContests` をローカル `$state` で保持し、`$effect` で `form.importContests` が存在するときだけ同期する。`create` 後は `form` が変わっても一覧を維持する。 - -```svelte - - -
    - - -
    -
    -
    -
    - - ` を追加する(Task 3 で追加した `use:enhance` と合わせて変更)。 - -```svelte - - - - - - -``` - -- [ ] **Step 2: +page.server.ts の create アクションを改修** - -`fetchTasks` の呼び出しを除去し、フォームから受け取ったタスクデータを直接使用する。 - -```typescript -create: async ({ request, locals }) => { - await validateAdminAccess(locals); - - const formData = await request.formData(); - const source = formData.get('source'); - - if (!isContestTaskImportSource(source)) { - return fail(BAD_REQUEST, { message: 'コンテストサイト・種別が不正です。' }); - } - - const contest_id = formData.get('contest_id'); - - if (typeof contest_id !== 'string' || !contest_id) { - return fail(BAD_REQUEST, { message: 'コンテストIDが指定されていません。' }); - } - - const tasksJson = formData.get('tasks'); - - if (typeof tasksJson !== 'string') { - return fail(BAD_REQUEST, { message: '問題データが不正です。' }); - } - - let tasks: TasksForImport; - - try { - tasks = JSON.parse(tasksJson) as TasksForImport; - } catch { - return fail(BAD_REQUEST, { message: '問題データの解析に失敗しました。' }); - } - - try { - await Promise.all( - tasks.map(async (task: TaskForImport) => { - const id = (await sha256(contest_id + task.title)) as string; - await taskService.createTask( - id, - task.id, - task.contest_id, - task.problem_index, - task.title, - ); - }), - ); - } catch { - return { success: false }; - } - - return { success: true }; -}, -``` - -不要になったインポートを削除: `fetchTasks` の参照がなければ `import { fetchContests, fetchTasks, isContestTaskImportSource }` から `fetchTasks` を除く。 - -- [ ] **Step 3: 型チェック** - -```bash -pnpm check -``` - -Expected: No errors - -- [ ] **Step 4: コミット** - -```bash -git add src/routes/\(admin\)/tasks/+page.server.ts src/routes/\(admin\)/tasks/_components/TaskTableForImport.svelte -git commit -m "fix: remove fetchTasks from create action to prevent silent AOJ import failures" -``` - ---- - -## 実装後の学び - -### `use:enhance` コールバックで直接 `$state` に代入する - -`applyAction(result)` → `form` prop → `$effect` の2段階同期は、Svelte 5 で同じ構造のオブジェクトが連続して返ると `$effect` が再発火しないことがある。`use:enhance` コールバック内で `result.data` を直接 `$state` に代入するほうが確実でシンプル。 - -```typescript -// Bad: $effect が2回目以降に再発火しない場合がある -return async ({ result }) => { - await applyAction(result); -}; -$effect(() => { - if (form?.importContests) importContests = form.importContests; -}); - -// Good: コールバックで直接代入 -return async ({ result }) => { - if (result.type === 'success') importContests = result.data.importContests as Contests; -}; -``` - ---- - -## ドロップダウンが AtCoder に戻る問題について - -**根本原因:** デフォルトの `use:enhance`(コールバックなし)が `invalidateAll()` を呼び出し、Flowbite Select の内部状態がリセットされる。 - -**修正:** Task 4 のカスタム `handleFetch` コールバックで `update()` を呼ばない設計にしたことで、`invalidateAll()` が発生しなくなるため、この問題も合わせて解決される。 - ---- - -## 検証 - -```bash -# 型チェック -pnpm check - -# ユニットテスト -pnpm test:unit - -# 開発サーバーで手動確認 -pnpm dev -``` - -手動確認チェックリスト: - -- [ ] ドロップダウンセクションに `p-6` のパディングが付き、下部に十分な余白がある -- [ ] 「問題を取得」クリック中: スピナーが表示され、ボタンが非活性になる -- [ ] コンテストID・コンテスト名・**問題名**で絞り込める -- [ ] ページネーションがナンバー形式(1, 2, ..., n-1, n)で表示され、各ページボタンが機能する -- [ ] ページネーションが検索欄の右と表の下の2ヵ所に表示される -- [ ] インポート成功後: 該当行が一覧から消え、他の行は維持される -- [ ] データ取得失敗時: 赤いエラーメッセージが表示される(表示崩れなし) -- [ ] **AOJ(PCK・JAG・コース)のインポートが確実に DB に保存される** -- [ ] **インポート後もドロップダウンが選択したコンテストサイトを維持する** diff --git a/docs/dev-notes/2026-05-17/task-import-by-source/plan.md b/docs/dev-notes/2026-05-17/task-import-by-source/plan.md index fa7e82133..261755958 100644 --- a/docs/dev-notes/2026-05-17/task-import-by-source/plan.md +++ b/docs/dev-notes/2026-05-17/task-import-by-source/plan.md @@ -22,395 +22,95 @@ ### 1. データ取得トリガー: form action (`?/fetch`) + `use:enhance` -`load()` はページ初期表示時に API を叩かない(`{ importContests: null }` を返す)。 -ユーザーがソースを選択して「データ取得」ボタンを押すと `?/fetch` action に POST され、選択されたソースのみ API を叩く。 +`load()` はページ初期表示時に API を叩かない。ユーザーがソースを選択して「データ取得」ボタンを押すと `?/fetch` action に POST され、選択されたソースのみ API を叩く。 - URL が変わらない → ブックマーク・ブラウザバックが不要な管理者画面に適切 - 既存の `?/create` / `?/update` と同じ SvelteKit form action パターンで一貫性を保つ -- `use:enhance` でページ全体リロードなし(問題表示部分のみ更新) ### 2. clients/index.ts: dispatcher パターン -`ContestTaskImportSource` を flat な string union type として定義し、`importSources` オブジェクトに `label` / `contests` / `tasks` の3属性を集約する。`fetchContests` / `fetchTasks` / `getImportSourceLabel` / `importSourceEntries` を export する。 +`ContestTaskImportSource` を flat な string union type として定義し、`importSources` オブジェクトに `label` / `contests` / `tasks` の 3 属性を集約する。 -```typescript -export type ContestTaskImportSource = - | 'atcoder' - | 'aoj_courses' - | 'aoj_pck_prelim' - | 'aoj_pck_final' - | 'aoj_jag_prelim' - | 'aoj_jag_regional'; -``` +**個別関数案(却下):** +`fetchAojPckPrelimContests()` 等の個別関数は理解しやすいが、`+page.server.ts` 側に source-specific な if/switch が生まれる。 -**個別関数案との比較:** +**Dispatcher 採用の理由:** -- 個別関数(`fetchAojPckPrelimContests()` 等)は理解しやすいが、`+page.server.ts` 側に source-specific な if/switch が生まれる -- Dispatcher は呼び出し側がシンプルになり、新ソース追加は `importSources` への1エントリ追加だけで完結する -- `ContestTaskImportSource` が flat string union のため、フォームデータのシリアライズ・バリデーションが容易(`isContestTaskImportSource()` 型ガードで境界検証) -- 対応ソースが増えるほど dispatcher の優位性が増す(次 PR: ICPC 追加が予定されている) +- 呼び出し側がシンプルになり、新ソース追加は `importSources` への 1 エントリ追加だけで完結する +- flat string union のため、フォームデータのバリデーションが容易(`isContestTaskImportSource()` 型ガードで境界検証) +- `Record` により新ソース追加時のキー漏れをコンパイルエラーで検出 +- 対応ソースが増えるほど優位性が増す(次 PR: ICPC 追加が予定されている) ### 3. AojApiClient の廃止・god class 解体 -旧 `AojApiClient`(`this.apiClients` ハードコーディング)は削除。`clients/index.ts` の dispatcher が同等の責務を担う。`AojTasksApiClientBase` も削除し、shared logic は standalone 関数として `aizu_online_judge/contest_task_fetcher.ts` に切り出す。 +旧 `AojApiClient` は削除。`clients/index.ts` の dispatcher が同等の責務を担う。`AojTasksApiClientBase` も削除し、shared logic は standalone 関数として `contest_task_fetcher.ts` に切り出す。 -- **継承廃止の理由**: `getCachedOrFetchContests` / `getCachedOrFetchTasks` は `httpClient` と `cache` を引数に受け取れば独立して動作する。継承より合成(composition)のほうが依存関係が明示的。 -- `AojCoursesApiClient` / `AojChallengesApiClient` は `(httpClient, cache)` を constructor で受け取るスタンドアロンクラスとして存続。 +**継承廃止の理由:** `getCachedOrFetchContests` / `getCachedOrFetchTasks` は `httpClient` と `cache` を引数に受け取れば独立して動作する。継承より合成(composition)のほうが依存関係が明示的。 + +**`contest_task_fetcher.ts` を `aizu_online_judge/` 外に配置した理由:** シグネチャに AOJ 固有の型を持たせない設計にすることで、将来 AtCoder クライアントがキャッシュを導入する際にも再利用可能にする。 + +**`fetchAllData` のエラー握りつぶしを廃止した理由:** 旧実装は try/catch + `return []` でエラーを黙殺していた。ユーザーが明示的にソースを選んだ場合、空配列が返っても原因がわからないため、エラーを上位に伝播させる方針に変更。 ### 4. 検索・ページネーション: 分離コンポーネント + 親での状態管理 **ラッパー案(却下):** -ラッパーコンポーネントは `Contests` 型を知る必要があり汎用性が低い。TaskImportTable を包む専用ラッパーは indirection を増やすだけで再利用性を生まない。 +ラッパーコンポーネントは `Contests` 型を知る必要があり汎用性が低い。TaskTableForImport を包む専用ラッパーは indirection を増やすだけで再利用性を生まない。 -**TaskImportTable 直接実装案(却下):** -TaskImportTable が状態を持つと、将来他ページに描画ロジックを切り出す際に状態管理の責務が混在する。 +**TaskTableForImport 直接実装案(却下):** +TaskTableForImport が状態を持つと、将来他ページに描画ロジックを切り出す際に状態管理の責務が混在する。 **採用: コンポーネント分離 + 親管理** +`TaskSearchBox` / Flowbite `Pagination` を独立配置し、`TaskTableForImport` は描画専念。`+page.svelte` が `$state` / `$derived` で状態とフィルタ計算を保持する。 -- `TaskSearchBox.svelte` — 検索入力(`bind:value` で `searchQuery` を親と共有) -- Flowbite `Pagination` — ページネーション(`+page.svelte` で直接使用) -- `TaskImportTable` — 描画専念。フィルタ済み・ページ済み `Contests` を props で受け取るだけ -- `+page.svelte` — `$state` で `searchQuery` / `currentPage` を持ち、`$derived` でフィルタ・スライスを計算 - -この構造により TaskImportTable は純粋な描画コンポーネントとして保たれ、`TaskSearchBox` は将来の再利用の余地を持つ。 - ---- - -## ファイル変更一覧 - -``` -src/lib/clients/ -├── index.ts # 変更: ContestTaskImportSource + dispatcher 関数 -├── contest_task_fetcher.ts # 新規: getCachedOrFetchContests/Tasks standalone 関数(汎用) -├── aizu_online_judge/ -│ ├── clients.ts # 変更: 継承廃止・god class 削除 -│ ├── clients.test.ts # 変更: 新クラス構造に合わせて更新 -│ ├── types.ts # 変更なし -│ └── utils.ts # 変更なし -└── fixtures/ - └── aizu_online_judge/ - ├── courses/ # 新規(既存の混在データから分割) - │ ├── contests.json - │ └── tasks.json - └── challenges/ # 新規 - ├── pck_prelim/ - │ ├── contests.json - │ └── tasks.json - ├── pck_final/ - │ ├── contests.json - │ └── tasks.json - ├── jag_prelim/ - │ ├── contests.json - │ └── tasks.json - └── jag_regional/ - ├── contests.json - └── tasks.json - -src/routes/(admin)/tasks/ -├── +page.server.ts # 変更: load 空返却・fetch action 追加・create/update 修正 -├── +page.svelte # 変更: Source 選択 UI・状態管理追加 -└── _components/ - ├── TaskImportTable.svelte # 移動 + 変更: lib/components/ から移動・リネーム・source prop 追加 - └── TaskSearchBox.svelte # 新規: 検索入力コンポーネント - -src/lib/components/ -└── TaskListForEdit.svelte # 削除(_components/ へ移動) -``` - ---- - -## 実装フェーズ - -### Phase 1: フィクスチャ整理とテスト先行(TDD: Red) - -**狙い:** 新クラス構造に対するテストを先に書く。この時点では実装が変わっていないので一部テストは失敗する(Red)。Phase 2 の実装でパスさせる。 - -**タスク:** - -1. 既存 `fixtures/aizu_online_judge/contests.json` / `tasks.json` を分析し、種別ごとに振り分け - - courses: `shortName` 形式のコンテスト ID(ITP1, ALDS1 等) - - pck_prelim / pck_final / jag_prelim / jag_regional: challenge 系 - -2. 各種別のディレクトリと JSON ファイルを作成(最低 2〜3 件のサンプルデータ) - -3. `AojCoursesApiClient` のテストを `courses/` フィクスチャで新規作成 - - Nock で `/courses` エンドポイントをモック - - `getContests()` / `getTasks()` の構造検証 - - 備考: 現テストは `client.getContests = async () => mock` でメソッドを差し替えており、`getCachedOrFetchContests` / `getCachedOrFetchTasks` はゼロカバレッジ。Nock ベースに変えることで HTTP fetch → transformer → キャッシュのパスが初めてカバーされる。専用単体テストは不要(`getContests()` 経由で間接カバー十分) - -4. `AojChallengesApiClient` のテストを各種別フィクスチャで新規作成(PCK PRELIM / PCK FINAL / JAG PRELIM / JAG REGIONAL 各1テスト) - -5. 既存の `fixtures/aizu_online_judge/contests.json` / `tasks.json`(混在ファイル)と旧テストを削除 - -**検証:** 新テストが Red(失敗)であることを確認。既存テストは削除済みのため競合なし。 - ---- - -### Phase 2: AOJ クライアントリファクタリング(TDD: Green) - -**狙い:** Phase 1 で書いたテストをパスさせる形で継承廃止・god class 削除を実装する。 +### 5. `?/update` の `tasks/[task_id]/+page.server.ts` への移設 -**タスク:** +元の実装は `?/update` 内で未登録タスクの登録という副作用を持っていた。しかし `?/create` でコンテストインポート時に全タスクが登録済みのため、`update` 時点で未登録タスクは存在しない。論理的に到達不能なケースを処理しようとしており無意味なため、副作用を削除して `taskService.updateTask()` のみに絞り、移設する。 -1. `src/lib/clients/contest_task_fetcher.ts` を新規作成(`aizu_online_judge/` 外に配置) - - `getCachedOrFetchContests(httpClient, cache, config)` standalone 関数 - - `getCachedOrFetchTasks(httpClient, cache, config)` standalone 関数 - - シグネチャに AOJ 固有の型なし(`HttpRequestClient` / `ContestTaskCache` / `ContestsForImport` / `TasksForImport` はすべて `clients/` レベルの汎用型) - - ログラベルの "AOJ" 固定文字列を削除し `label` パラメータに統合(例: `label: 'AOJ course'`) - - 将来 AtCoder クライアントがキャッシュを導入する際にも再利用可能 +### 6. `TaskListForEdit.svelte` を `_components/` へ移動 -2. `AojCoursesApiClient` を `AojTasksApiClientBase` から切り離す - - `constructor(private httpClient, private cache)` に変更 - - `getCachedOrFetch*` を standalone 関数呼び出しに変更 - - 継承: なし +`src/lib/` は reusable なコードの置き場。使用箇所が `/tasks` ルートのみのコンポーネントを置くのは不適切。`workbooks/order/_components/` と同じパターンに統一。 -3. `AojChallengesApiClient` も同様に切り離す +### 7. フィクスチャを raw API レスポンス形式で保持する方針 -4. `AojTasksApiClientBase` クラスを削除 +旧 `record_requests.ts` は変換済みデータ(`ContestsForImport`)をフィクスチャに保存していた。これは nock でモックすると「raw API レスポンスを返す nock → クライアントが変換 → アサート」という正しいテストフローが成立せず、変換ロジックがゼロカバレッジになっていた。 -5. `AojApiClient` (god class) を削除 +**方針:** フィクスチャには raw API レスポンスをそのまま保存し、変換処理はクライアント実装の中でテストする。courses と challenges で `contests.json` のスキーマが異なる(courses: `{ filter, courses[] }`、challenges: `{ largeCl, contests[] }`)ため、種別ごとにディレクトリを分割して管理する。 -**検証:** `pnpm test:unit` で Phase 1 のテストがすべてパス(Green) +**AOJ challenges の特殊性:** challenges エンドポイント(`/challenges/cl/{type}/{round}`)はコンテストと問題の両方を1レスポンスで返す(`days[].problems` に埋め込み)。`tasks.json` は不要で、`contests.json` 1ファイルから両方を取り出す。この設計はクライアントコードのコメントに記載済み。 ---- - -### Phase 3: clients/index.ts の再設計 - -**狙い:** Dispatcher 関数の提供。`+page.server.ts` 側がルーティングロジックを持たない構造へ。 - -**タスク:** - -1. `ContestTaskImportSource` 型を定義・export - -2. `isContestTaskImportSource(value: unknown): value is ImportSource` 型ガードを実装 - - 境界検証(フォームデータの `source` フィールド検証に使用) - -3. `importSources` オブジェクトを定義し `fetchContests` / `fetchTasks` / `getImportSourceLabel` を実装 - - ```typescript - type ContestTaskImportSourceConfig = { - label: string; - contests: () => Promise; - tasks: () => Promise; - }; - - // AOJ Challenges の contests/tasks で params が重複しないようにヘルパーを用意 - function buildAojChallengeConfig( - params: ChallengeParams, - label: string, - ): ContestTaskImportSourceConfig { - return { - label, - contests: () => aojChallengesClient.getContests(params), - tasks: () => aojChallengesClient.getTasks(params), - }; - } - - const importSources: Record = { - atcoder: { - label: 'AtCoder', - contests: () => atCoderClient.getContests(), - tasks: () => atCoderClient.getTasks(), - }, - aoj_courses: { - label: 'AOJ - コース', - contests: () => aojCoursesClient.getContests(), - tasks: () => aojCoursesClient.getTasks(), - }, - aoj_pck_prelim: buildAojChallengeConfig( - { contestType: 'PCK', round: 'PRELIM' }, - 'AOJ - パソコン甲子園 予選', - ), - aoj_pck_final: buildAojChallengeConfig( - { contestType: 'PCK', round: 'FINAL' }, - 'AOJ - パソコン甲子園 本選', - ), - aoj_jag_prelim: buildAojChallengeConfig( - { contestType: 'JAG', round: 'PRELIM' }, - 'AOJ - JAG 模擬国内', - ), - aoj_jag_regional: buildAojChallengeConfig( - { contestType: 'JAG', round: 'REGIONAL' }, - 'AOJ - JAG 模擬地区', - ), - }; - - export const fetchContests = (source: ContestTaskImportSource) => - importSources[source].contests(); - export const fetchTasks = (source: ContestTaskImportSource) => importSources[source].tasks(); - export const getImportSourceLabel = (source: ContestTaskImportSource) => - importSources[source].label; - export const importSourceEntries = Object.entries(importSources) as [ - ContestTaskImportSource, - ContestTaskImportSourceConfig, - ][]; - ``` - - - `label` / `contestType` / `round` の3属性が `importSources` の1箇所に集約。UI ラベルテーブルは不要になる - - `Record` により新ソース追加時のキー漏れをコンパイルエラーで検出 - - `importSourceEntries` を ` - - - - - - - - -
    -
    -
    -
    - - - - -
    - - - - - - From 52f17f839bf6ab0e144b254095c559af233af781 Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Sun, 17 May 2026 13:38:08 +0000 Subject: [PATCH 21/23] docs: remove completed task-import-by-source plan Co-Authored-By: Claude Sonnet 4.6 --- .../2026-05-17/task-import-by-source/plan.md | 121 ------------------ 1 file changed, 121 deletions(-) delete mode 100644 docs/dev-notes/2026-05-17/task-import-by-source/plan.md diff --git a/docs/dev-notes/2026-05-17/task-import-by-source/plan.md b/docs/dev-notes/2026-05-17/task-import-by-source/plan.md deleted file mode 100644 index 261755958..000000000 --- a/docs/dev-notes/2026-05-17/task-import-by-source/plan.md +++ /dev/null @@ -1,121 +0,0 @@ -# タスクインポートページ: ソース別取得リファクタリング - -## 背景・課題・目的 - -### 課題 - -1. **拡張困難**: 対応コンテストサイト・種別の追加に複数クラスの変更が必要。 -2. **API アクセス過多**: `/tasks` ページ初期ロード時に AtCoder + AOJ 全種別(5種類)を並列取得。管理者が特定ソースしか必要としない場合も全ソースの API を叩く。 -3. **AojApiClient の god class**: `this.apiClients` がコンストラクタ内にハードコーディングされており、新しい AOJ コンテスト種別の追加が `AojApiClient` 内部変更を伴う。 -4. **継承が深い**: `AojTasksApiClientBase` → `AojCoursesApiClient` / `AojChallengesApiClient` の継承構造が shared logic の追跡を難しくしている。 - -### 目的 - -- **アクセス削減**: ボタン押下時に選択されたソースのみ取得する -- **拡張容易化**: 新ソースを `ContestTaskImportSource` 型と `importSources` に 1 エントリ追加するだけで対応できる構造へ -- **設計改善**: 継承廃止・関数ベースへの整理(AOJ 特有の部分と汎用部分の分離) -- 関連 PR: #3524(事前に関連ファイルを機能単位で集約)の続き。次 PR: AOJ ICPC 系統の追加 - ---- - -## 設計決定と根拠 - -### 1. データ取得トリガー: form action (`?/fetch`) + `use:enhance` - -`load()` はページ初期表示時に API を叩かない。ユーザーがソースを選択して「データ取得」ボタンを押すと `?/fetch` action に POST され、選択されたソースのみ API を叩く。 - -- URL が変わらない → ブックマーク・ブラウザバックが不要な管理者画面に適切 -- 既存の `?/create` / `?/update` と同じ SvelteKit form action パターンで一貫性を保つ - -### 2. clients/index.ts: dispatcher パターン - -`ContestTaskImportSource` を flat な string union type として定義し、`importSources` オブジェクトに `label` / `contests` / `tasks` の 3 属性を集約する。 - -**個別関数案(却下):** -`fetchAojPckPrelimContests()` 等の個別関数は理解しやすいが、`+page.server.ts` 側に source-specific な if/switch が生まれる。 - -**Dispatcher 採用の理由:** - -- 呼び出し側がシンプルになり、新ソース追加は `importSources` への 1 エントリ追加だけで完結する -- flat string union のため、フォームデータのバリデーションが容易(`isContestTaskImportSource()` 型ガードで境界検証) -- `Record` により新ソース追加時のキー漏れをコンパイルエラーで検出 -- 対応ソースが増えるほど優位性が増す(次 PR: ICPC 追加が予定されている) - -### 3. AojApiClient の廃止・god class 解体 - -旧 `AojApiClient` は削除。`clients/index.ts` の dispatcher が同等の責務を担う。`AojTasksApiClientBase` も削除し、shared logic は standalone 関数として `contest_task_fetcher.ts` に切り出す。 - -**継承廃止の理由:** `getCachedOrFetchContests` / `getCachedOrFetchTasks` は `httpClient` と `cache` を引数に受け取れば独立して動作する。継承より合成(composition)のほうが依存関係が明示的。 - -**`contest_task_fetcher.ts` を `aizu_online_judge/` 外に配置した理由:** シグネチャに AOJ 固有の型を持たせない設計にすることで、将来 AtCoder クライアントがキャッシュを導入する際にも再利用可能にする。 - -**`fetchAllData` のエラー握りつぶしを廃止した理由:** 旧実装は try/catch + `return []` でエラーを黙殺していた。ユーザーが明示的にソースを選んだ場合、空配列が返っても原因がわからないため、エラーを上位に伝播させる方針に変更。 - -### 4. 検索・ページネーション: 分離コンポーネント + 親での状態管理 - -**ラッパー案(却下):** -ラッパーコンポーネントは `Contests` 型を知る必要があり汎用性が低い。TaskTableForImport を包む専用ラッパーは indirection を増やすだけで再利用性を生まない。 - -**TaskTableForImport 直接実装案(却下):** -TaskTableForImport が状態を持つと、将来他ページに描画ロジックを切り出す際に状態管理の責務が混在する。 - -**採用: コンポーネント分離 + 親管理** -`TaskSearchBox` / Flowbite `Pagination` を独立配置し、`TaskTableForImport` は描画専念。`+page.svelte` が `$state` / `$derived` で状態とフィルタ計算を保持する。 - -### 5. `?/update` の `tasks/[task_id]/+page.server.ts` への移設 - -元の実装は `?/update` 内で未登録タスクの登録という副作用を持っていた。しかし `?/create` でコンテストインポート時に全タスクが登録済みのため、`update` 時点で未登録タスクは存在しない。論理的に到達不能なケースを処理しようとしており無意味なため、副作用を削除して `taskService.updateTask()` のみに絞り、移設する。 - -### 6. `TaskListForEdit.svelte` を `_components/` へ移動 - -`src/lib/` は reusable なコードの置き場。使用箇所が `/tasks` ルートのみのコンポーネントを置くのは不適切。`workbooks/order/_components/` と同じパターンに統一。 - -### 7. フィクスチャを raw API レスポンス形式で保持する方針 - -旧 `record_requests.ts` は変換済みデータ(`ContestsForImport`)をフィクスチャに保存していた。これは nock でモックすると「raw API レスポンスを返す nock → クライアントが変換 → アサート」という正しいテストフローが成立せず、変換ロジックがゼロカバレッジになっていた。 - -**方針:** フィクスチャには raw API レスポンスをそのまま保存し、変換処理はクライアント実装の中でテストする。courses と challenges で `contests.json` のスキーマが異なる(courses: `{ filter, courses[] }`、challenges: `{ largeCl, contests[] }`)ため、種別ごとにディレクトリを分割して管理する。 - -**AOJ challenges の特殊性:** challenges エンドポイント(`/challenges/cl/{type}/{round}`)はコンテストと問題の両方を1レスポンスで返す(`days[].problems` に埋め込み)。`tasks.json` は不要で、`contests.json` 1ファイルから両方を取り出す。この設計はクライアントコードのコメントに記載済み。 - -### 8. `create` アクションで `fetchTasks` を呼ばない理由(AOJ サイレント失敗の修正) - -旧実装の `create` アクションはインポートボタン押下時に `fetchTasks(source)` を再度呼び出していた。`getCachedOrFetch` のキャッシュが切れた場合(開発サーバー再起動など)、AOJ API への再リクエストが失敗すると catch で `[]` を返し、**何も保存せず `{ success: true }` を返す**(サイレント失敗)。AtCoder は複数回呼んでも安定しているため、AOJ 限定の不具合として気づきにくかった。 - -**修正方針:** `fetch` アクション実行時に取得済みのタスクデータをフォームの hidden input に JSON で乗せ、`create` アクションはフォームから受け取ったデータをそのまま使う。再 API コールを排除することでキャッシュミスの影響を受けない。 - -### 9. Flowbite `Pagination` から `PaginationNav` への変更 - -Flowbite Svelte v1.33.1 の `` コンポーネントは `pages` 配列に `onclick` を渡しても Svelte 5 で機能しない。`` は `onPageChange: (page: number) => void` を受け取り、numbered pages を正しく描画する。 - -### 10. `use:enhance` コールバックで `update()` も `applyAction()` も呼ばない理由 - -`update()` はもちろん、`applyAction()` も内部で `invalidateAll()` を呼び出す。これにより Flowbite Select の内部状態がリセットされ、ドロップダウンが AtCoder に戻る。どちらも呼ばずに `result.data` を直接 `$state` に代入することで `invalidateAll()` を完全に回避する。 - -### 11. `importContests` をローカル `$state` で保持する理由 - -`create` アクション成功後、SvelteKit は `form` prop を `{ success: true }` で上書きする。`importContests` を `form.importContests` から直接参照していると一覧が消える。ローカル `$state` として保持し、`form.importContests` が存在するときだけ同期することで、`create` 後も一覧を維持できる。 - -### 12. Superforms を採用しない理由 - -`fetch` フォームの入力は `source` 1フィールドのみ。Zod スキーマ・`superValidate`・両ファイルの変更コストに対して、得られる機能(`$delayed`・`$message`)は手動の `isFetching` / `fetchError` 2変数で代替できる。`importContests` はフォーム入力ではなくアクションの返却データであり Superforms が管理しない。Superforms は「フィールド単位のバリデーションエラー表示が必要なフォーム」向き。 - -### 13. E2E テストを追加しない理由 - -`?/fetch` はサーバーサイドで外部 API を呼ぶため Playwright の `page.route()` でインターセプトできず、自動化コストが高い。admin 限定ページかつ手動確認で十分と判断。 - ---- - -## 教訓 - -### `$effect` を介した `form` → ローカル state 同期は信頼できない - -`applyAction(result)` → `form` prop 更新 → `$effect` で `importContests` に代入する 2 段階同期は、Svelte 5 で同じ構造のオブジェクトが連続して返ると `$effect` が再発火しないことがある。`use:enhance` コールバック内で `result.data` を直接 `$state` に代入するほうが確実でシンプル。 - ---- - -## 残タスク(このPR対象外) - -- `filterUnregisteredTasks()` を `_utils/` に切り出してテストを追加(`classifyContest()` 依存のロジックあり、テスト価値あり) -- AOJ ICPC 系統のコンテスト追加(次 PR) -- ソートの実装(検索・ページネーション安定後の別 PR) From 0e1ec4e7ef7026810dd930cc99b50fe9148decce Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Mon, 18 May 2026 14:15:57 +0000 Subject: [PATCH 22/23] fix: trim whitespace from API titles and fix error handling in import flow - Add trim() to contest/task titles from AtCoder and AOJ API clients - Return fail() with proper HTTP status in import and update actions - Log caught errors instead of silently swallowing them - Surface import failure to user via error message in TaskTableForImport Co-Authored-By: Claude Sonnet 4.6 --- .../task-import-by-source/review.md | 133 ++++++++++++++++++ .../clients/aizu_online_judge/utils.test.ts | 10 ++ src/lib/clients/aizu_online_judge/utils.ts | 4 +- .../clients/atcoder/atcoder_problems.test.ts | 14 ++ src/lib/clients/atcoder/atcoder_problems.ts | 4 +- src/routes/(admin)/tasks/+page.server.ts | 8 +- src/routes/(admin)/tasks/+page.svelte | 11 ++ .../(admin)/tasks/[task_id]/+page.server.ts | 4 +- .../_components/TaskTableForImport.svelte | 5 +- 9 files changed, 183 insertions(+), 10 deletions(-) create mode 100644 docs/dev-notes/2026-05-17/task-import-by-source/review.md diff --git a/docs/dev-notes/2026-05-17/task-import-by-source/review.md b/docs/dev-notes/2026-05-17/task-import-by-source/review.md new file mode 100644 index 000000000..9284b0666 --- /dev/null +++ b/docs/dev-notes/2026-05-17/task-import-by-source/review.md @@ -0,0 +1,133 @@ +# PR #3525 CodeRabbit レビュー結果(staging vs #3525) + +CodeRabbit CLI v0.4.4 にて2回実行。26ファイル、約21,444行追加・2,752行削除。 + +--- + +## ~~セキュリティ(SHA256 衝突)~~ → 対応不要 + +**`src/routes/(admin)/tasks/+page.server.ts:86`** + +`sha256(contest_id + task.title)` の単純連結による境界曖昧化は、AtCoder/AOJ のコンテスト ID が固定形式(`ABC001`, `PCK2023PRELIM` など)であり task title と文字種・構造が異なるため、実際の衝突シナリオが存在しない。理論的指摘だが、このドメインでは実害なし。 + +--- + +## エラーハンドリング不整合(potential_issue、3箇所) + +### `updateTask` null 時に `fail()` 未使用 +**`src/routes/(admin)/tasks/[task_id]/+page.server.ts:72-76`** + +```ts +// 現在 +return { success: false }; +// 修正案 +return fail(INTERNAL_SERVER_ERROR, { success: false }); +``` + +### import アクションの catch も `fail()` 未使用 +**`src/routes/(admin)/tasks/+page.server.ts:96-98`** + +fetch アクションは `fail()` を使っているが、import アクションは plain object を返している。DB エラー時にユーザーへのフィードバックがなく、無反応になる。 + +修正は2セット必要: + +1. **`+page.server.ts`(create action)**: `return { success: false }` → `return fail(INTERNAL_SERVER_ERROR, { success: false })` +2. **`TaskTableForImport.svelte`(`makeImportHandler`)**: `result.type === 'failure'` 時のエラー表示を追加(現状は成功時の分岐しかなく、失敗が無反応になる) + +### エラー詳細が破棄されている +**`src/routes/(admin)/tasks/+page.server.ts:48-50`**(両回で一致検出) + +```ts +// 現在 +} catch { +// 修正案 +} catch (error) { + console.error('Failed to fetch contests/tasks:', error); +``` + +--- + +## 冗長な記述(nitpick) + +### ~~型定義の重複~~ → 対応不要 + +**`src/lib/clients/contest_task_fetcher.ts:6-22`** + +各型は対応する関数の引数として1箇所ずつしか使われない。contests と tasks はドメイン上の別概念であり、形が似ているのは偶然の一致。共通基底型に統合すると型パラメータが増えて読みにくくなる上、将来の分岐にも対応しにくくなる。YAGNI。 + +### ~~`currentPage` リセットの重複~~ → 対応不要 + +**`src/routes/(admin)/tasks/+page.svelte:88-90`** + +CodeRabbit の「重複」という判定は誤り。`filteredContests` は `importContests` と `searchQuery` にのみ依存しており(line 51)、`selectedSource` には依存していない。そのため `$effect` はドロップダウン変更時に発火しない。 + +- `onchange`: ソース種別ドロップダウン変更時(フェッチ前)にリセット +- `$effect`: フェッチ完了(`importContests` 変更)または検索入力(`searchQuery` 変更)時にリセット + +トリガーが異なるため、両方必要。 + +### `console.debug` が本番に残る +**`src/lib/clients/contest_task_fetcher.ts:37, 56`**(2回目のみ検出) + +環境変数ガードまたは共通ロガー経由に変更を検討。 + +--- + +## データ品質(potential_issue) + +JSONフィクスチャ内の末尾空白・制御文字・タイポ。importパイプライン側で `trim()` するのが本命。 + +| ファイル | 行 | 内容 | +|---|---|---| +| `fixtures/aizu_online_judge/challenges/pck_final/contests.json` | 2079, 2295, 4353 | 末尾スペース in `name` | +| `fixtures/aizu_online_judge/challenges/jag_regional/contests.json` | 1620 | 末尾タブ `\t` in `name` | +| `fixtures/aizu_online_judge/challenges/pck_prelim/contests.json` | 1935, 3924 | 末尾スペース in `name` | +| `fixtures/atcoder_problems/tasks.json` | 153-154 | 末尾スペース in `name`/`title` | +| `fixtures/aizu_online_judge/courses/contests.json` | 72 | typo: "descrete" → "discrete" | +| `fixtures/atcoder_problems/contests.json` | 全体 | 並び順が非決定的(2回目のみ) | + +--- + +## 対応優先度 + +| 優先度 | 項目 | +|---|---| +| 推奨 | `fail()` 不整合 3箇所、エラーログ欠落 | +| 推奨 | importパイプラインで `trim()` によるクリーニング(下記参照) | +| 任意 | 型定義重複、`currentPage` 重複リセット、`console.debug` ガード | +| 対応不要 | JSONフィクスチャの末尾空白・typo(実APIの再現として保持) | + +--- + +## trim() 対応方針(データ品質) + +APIレスポンスの `name`/`title` フィールドに末尾空白・タブが混入している。DBに入る前にクリーニングする。 + +### 変更箇所 + +**`src/lib/clients/aizu_online_judge/utils.ts`** + +```ts +// mapToContest +title: title.trim(), + +// mapToTask +title: problem.name.trim(), +``` + +**`src/lib/clients/atcoder/atcoder_problems.ts`** + +transformer がなく生データを返しているので `.map()` を追加: + +```ts +// getContests +return contests.map((contest) => ({ ...contest, title: contest.title.trim() })); + +// getTasks +return tasks.map((task) => ({ ...task, title: task.title.trim() })); +``` + +### テスト方針 + +- フィクスチャは汚いデータのまま保持(実APIの再現) +- `utils.test.ts` と `atcoder_problems.test.ts` に末尾空白を含む入力 → trimされた出力をassertするケースを各1件追加 diff --git a/src/lib/clients/aizu_online_judge/utils.test.ts b/src/lib/clients/aizu_online_judge/utils.test.ts index b2f203fd9..1d818a411 100644 --- a/src/lib/clients/aizu_online_judge/utils.test.ts +++ b/src/lib/clients/aizu_online_judge/utils.test.ts @@ -46,6 +46,11 @@ describe('buildEndpoint', () => { describe('mapToContest', () => { describe('successful cases', () => { + test('trims trailing whitespace from title', () => { + expect(mapToContest('PCK2024', 'PCK 2024 Preliminary ').title).toBe('PCK 2024 Preliminary'); + expect(mapToContest('JAG2023', 'JAG Regional 2023\t').title).toBe('JAG Regional 2023'); + }); + test('maps contestId and title to ContestForImport shape', () => { const result = mapToContest('PCK2024', 'PCK 2024 Preliminary'); @@ -116,6 +121,11 @@ describe('mapToTask', () => { const result = mapToTask(baseTask, 'ITP1'); expect(result.title).toBe('Hello, World!'); }); + + test('trims trailing whitespace from problem name', () => { + const taskWithWhitespace: AOJTaskAPI = { ...baseTask, name: 'Hello, World! ' }; + expect(mapToTask(taskWithWhitespace, 'ITP1').title).toBe('Hello, World!'); + }); }); }); diff --git a/src/lib/clients/aizu_online_judge/utils.ts b/src/lib/clients/aizu_online_judge/utils.ts index 15230a4d6..149464eb4 100644 --- a/src/lib/clients/aizu_online_judge/utils.ts +++ b/src/lib/clients/aizu_online_judge/utils.ts @@ -46,7 +46,7 @@ export function mapToContest(contestId: string, title: string): ContestForImport id: contestId, start_epoch_second: PENDING, // Data not available duration_second: PENDING, // Same as above - title: title, + title: title.trim(), rate_change: '', // Same as above }; } @@ -64,7 +64,7 @@ export function mapToTask(problem: AOJTaskAPI, contestId: string) { contest_id: contestId, problem_index: problem.id, // Using task.id as a substitute since there's no equivalent to problem_index. Similar approach is used in AtCoder Problems API for old JOI problems. task_id: problem.id, // Same as above - title: problem.name, + title: problem.name.trim(), }; } diff --git a/src/lib/clients/atcoder/atcoder_problems.test.ts b/src/lib/clients/atcoder/atcoder_problems.test.ts index 334d59f70..49997ef0a 100644 --- a/src/lib/clients/atcoder/atcoder_problems.test.ts +++ b/src/lib/clients/atcoder/atcoder_problems.test.ts @@ -83,6 +83,13 @@ describe('AtCoder Problems API client', () => { expect(contest.title.length).toBeGreaterThan(0); }); }); + + test('trims trailing whitespace from contest titles', async () => { + const dirtyContest = { id: 'abc001', title: 'AtCoder Beginner Contest 001 ', start_epoch_second: 0, duration_second: 0, rate_change: '-' }; + nock(API_BASE).get(`${API_PATH}contests.json`).reply(200, [dirtyContest]); + const contests = await client.getContests(); + expect(contests[0].title).toBe('AtCoder Beginner Contest 001'); + }); }); describe('getTasks', () => { @@ -122,5 +129,12 @@ describe('AtCoder Problems API client', () => { expect(task.title.length).toBeGreaterThan(0); }); }); + + test('trims trailing whitespace from task titles', async () => { + const dirtyTask = { id: 'abc001_a', contest_id: 'abc001', problem_index: 'A', title: 'Product ' }; + nock(API_BASE).get(`${API_PATH}problems.json`).reply(200, [dirtyTask]); + const tasks = await client.getTasks(); + expect(tasks[0].title).toBe('Product'); + }); }); }); diff --git a/src/lib/clients/atcoder/atcoder_problems.ts b/src/lib/clients/atcoder/atcoder_problems.ts index fd36427b8..b05b17a59 100644 --- a/src/lib/clients/atcoder/atcoder_problems.ts +++ b/src/lib/clients/atcoder/atcoder_problems.ts @@ -29,7 +29,7 @@ export class AtCoderProblemsApiClient { console.log(`Found AtCoder: ${contests.length} contests.`); - return contests; + return contests.map((contest) => ({ ...contest, title: contest.title.trim() })); } catch (error) { console.error(`Failed to fetch from AtCoder contests`, error); return []; @@ -51,7 +51,7 @@ export class AtCoderProblemsApiClient { console.log(`Found AtCoder: ${tasks.length} tasks.`); - return tasks; + return tasks.map((task) => ({ ...task, title: task.title.trim() })); } catch (error) { console.error(`Failed to fetch from AtCoder tasks`, error); return []; diff --git a/src/routes/(admin)/tasks/+page.server.ts b/src/routes/(admin)/tasks/+page.server.ts index f6e4b6743..7f1196929 100644 --- a/src/routes/(admin)/tasks/+page.server.ts +++ b/src/routes/(admin)/tasks/+page.server.ts @@ -45,7 +45,8 @@ export const actions: Actions = { return { importContests: mergeContestsAndUnregisteredTasks(contestsForImport, unregisteredTasks), }; - } catch { + } catch (error) { + console.error('Failed to fetch contests/tasks:', error); return fail(INTERNAL_SERVER_ERROR, { message: 'データ取得に失敗しました。' }); } }, @@ -93,8 +94,9 @@ export const actions: Actions = { ); }), ); - } catch { - return { success: false }; + } catch (error) { + console.error('Failed to create tasks:', error); + return fail(INTERNAL_SERVER_ERROR, { success: false }); } return { success: true }; diff --git a/src/routes/(admin)/tasks/+page.svelte b/src/routes/(admin)/tasks/+page.svelte index 3409a54bf..e2ae0722a 100644 --- a/src/routes/(admin)/tasks/+page.svelte +++ b/src/routes/(admin)/tasks/+page.svelte @@ -23,6 +23,7 @@ let selectedSource = $state('atcoder'); let isFetching = $state(false); let fetchError = $state(null); + let importError = $state(null); // Note: result.data is applied directly to avoid calling update() / applyAction(), // both of which trigger invalidateAll() and reset Flowbite Select's displayed value. @@ -51,9 +52,14 @@ const filteredContests = $derived(filterContests(importContests, searchQuery)); function handleImportSuccess(contestId: string) { + importError = null; importContests = importContests.filter((contest) => contest.id !== contestId); } + function handleImportError(message: string) { + importError = message; + } + // -- pagination -- const PAGE_SIZE = 20; let currentPage = $state(1); @@ -112,8 +118,13 @@ importContests={pagedContests} source={selectedSource} onImportSuccess={handleImportSuccess} + onImportError={handleImportError} /> + {#if importError !== null} +

    {importError}

    + {/if} +
    {@render paginationNav()}
    diff --git a/src/routes/(admin)/tasks/[task_id]/+page.server.ts b/src/routes/(admin)/tasks/[task_id]/+page.server.ts index 76c2fcb14..8a498a0ab 100644 --- a/src/routes/(admin)/tasks/[task_id]/+page.server.ts +++ b/src/routes/(admin)/tasks/[task_id]/+page.server.ts @@ -10,7 +10,7 @@ import * as taskTagsService from '$lib/services/task_tags'; import { validateAdminAccess } from '$features/auth/services/admin_access'; -import { BAD_REQUEST } from '$lib/constants/http-response-status-codes'; +import { BAD_REQUEST, INTERNAL_SERVER_ERROR } from '$lib/constants/http-response-status-codes'; export async function load({ locals, params, url }) { await validateAdminAccess(locals, url); @@ -72,7 +72,7 @@ export const actions: Actions = { const updateResult = await taskService.updateTask(taskId, task_grade); if (updateResult === null) { - return { success: false }; + return fail(INTERNAL_SERVER_ERROR, { success: false }); } return { success: true }; diff --git a/src/routes/(admin)/tasks/_components/TaskTableForImport.svelte b/src/routes/(admin)/tasks/_components/TaskTableForImport.svelte index e330775ad..9df142602 100644 --- a/src/routes/(admin)/tasks/_components/TaskTableForImport.svelte +++ b/src/routes/(admin)/tasks/_components/TaskTableForImport.svelte @@ -22,15 +22,18 @@ importContests: Contests; source: ContestTaskImportSource; onImportSuccess: (contestId: string) => void; + onImportError: (message: string) => void; } - let { importContests, source, onImportSuccess }: Props = $props(); + let { importContests, source, onImportSuccess, onImportError }: Props = $props(); function makeImportHandler(contestId: string): SubmitFunction { return () => async ({ result }) => { if (result.type === 'success' && (result.data as { success?: boolean })?.success) { onImportSuccess(contestId); + } else if (result.type === 'failure') { + onImportError('インポートに失敗しました。'); } }; } From 06b7f09c394a1079db0c53aeb03e94a81d9124e5 Mon Sep 17 00:00:00 2001 From: "k.hiro1818" Date: Mon, 18 May 2026 14:16:21 +0000 Subject: [PATCH 23/23] docs: remove completed review notes and reformat test objects - Delete task-import-by-source review.md (findings addressed in prior commit) - Expand inline object literals in atcoder_problems.test.ts for readability Co-Authored-By: Claude Sonnet 4.6 --- .../task-import-by-source/review.md | 133 ------------------ .../clients/atcoder/atcoder_problems.test.ts | 15 +- 2 files changed, 13 insertions(+), 135 deletions(-) delete mode 100644 docs/dev-notes/2026-05-17/task-import-by-source/review.md diff --git a/docs/dev-notes/2026-05-17/task-import-by-source/review.md b/docs/dev-notes/2026-05-17/task-import-by-source/review.md deleted file mode 100644 index 9284b0666..000000000 --- a/docs/dev-notes/2026-05-17/task-import-by-source/review.md +++ /dev/null @@ -1,133 +0,0 @@ -# PR #3525 CodeRabbit レビュー結果(staging vs #3525) - -CodeRabbit CLI v0.4.4 にて2回実行。26ファイル、約21,444行追加・2,752行削除。 - ---- - -## ~~セキュリティ(SHA256 衝突)~~ → 対応不要 - -**`src/routes/(admin)/tasks/+page.server.ts:86`** - -`sha256(contest_id + task.title)` の単純連結による境界曖昧化は、AtCoder/AOJ のコンテスト ID が固定形式(`ABC001`, `PCK2023PRELIM` など)であり task title と文字種・構造が異なるため、実際の衝突シナリオが存在しない。理論的指摘だが、このドメインでは実害なし。 - ---- - -## エラーハンドリング不整合(potential_issue、3箇所) - -### `updateTask` null 時に `fail()` 未使用 -**`src/routes/(admin)/tasks/[task_id]/+page.server.ts:72-76`** - -```ts -// 現在 -return { success: false }; -// 修正案 -return fail(INTERNAL_SERVER_ERROR, { success: false }); -``` - -### import アクションの catch も `fail()` 未使用 -**`src/routes/(admin)/tasks/+page.server.ts:96-98`** - -fetch アクションは `fail()` を使っているが、import アクションは plain object を返している。DB エラー時にユーザーへのフィードバックがなく、無反応になる。 - -修正は2セット必要: - -1. **`+page.server.ts`(create action)**: `return { success: false }` → `return fail(INTERNAL_SERVER_ERROR, { success: false })` -2. **`TaskTableForImport.svelte`(`makeImportHandler`)**: `result.type === 'failure'` 時のエラー表示を追加(現状は成功時の分岐しかなく、失敗が無反応になる) - -### エラー詳細が破棄されている -**`src/routes/(admin)/tasks/+page.server.ts:48-50`**(両回で一致検出) - -```ts -// 現在 -} catch { -// 修正案 -} catch (error) { - console.error('Failed to fetch contests/tasks:', error); -``` - ---- - -## 冗長な記述(nitpick) - -### ~~型定義の重複~~ → 対応不要 - -**`src/lib/clients/contest_task_fetcher.ts:6-22`** - -各型は対応する関数の引数として1箇所ずつしか使われない。contests と tasks はドメイン上の別概念であり、形が似ているのは偶然の一致。共通基底型に統合すると型パラメータが増えて読みにくくなる上、将来の分岐にも対応しにくくなる。YAGNI。 - -### ~~`currentPage` リセットの重複~~ → 対応不要 - -**`src/routes/(admin)/tasks/+page.svelte:88-90`** - -CodeRabbit の「重複」という判定は誤り。`filteredContests` は `importContests` と `searchQuery` にのみ依存しており(line 51)、`selectedSource` には依存していない。そのため `$effect` はドロップダウン変更時に発火しない。 - -- `onchange`: ソース種別ドロップダウン変更時(フェッチ前)にリセット -- `$effect`: フェッチ完了(`importContests` 変更)または検索入力(`searchQuery` 変更)時にリセット - -トリガーが異なるため、両方必要。 - -### `console.debug` が本番に残る -**`src/lib/clients/contest_task_fetcher.ts:37, 56`**(2回目のみ検出) - -環境変数ガードまたは共通ロガー経由に変更を検討。 - ---- - -## データ品質(potential_issue) - -JSONフィクスチャ内の末尾空白・制御文字・タイポ。importパイプライン側で `trim()` するのが本命。 - -| ファイル | 行 | 内容 | -|---|---|---| -| `fixtures/aizu_online_judge/challenges/pck_final/contests.json` | 2079, 2295, 4353 | 末尾スペース in `name` | -| `fixtures/aizu_online_judge/challenges/jag_regional/contests.json` | 1620 | 末尾タブ `\t` in `name` | -| `fixtures/aizu_online_judge/challenges/pck_prelim/contests.json` | 1935, 3924 | 末尾スペース in `name` | -| `fixtures/atcoder_problems/tasks.json` | 153-154 | 末尾スペース in `name`/`title` | -| `fixtures/aizu_online_judge/courses/contests.json` | 72 | typo: "descrete" → "discrete" | -| `fixtures/atcoder_problems/contests.json` | 全体 | 並び順が非決定的(2回目のみ) | - ---- - -## 対応優先度 - -| 優先度 | 項目 | -|---|---| -| 推奨 | `fail()` 不整合 3箇所、エラーログ欠落 | -| 推奨 | importパイプラインで `trim()` によるクリーニング(下記参照) | -| 任意 | 型定義重複、`currentPage` 重複リセット、`console.debug` ガード | -| 対応不要 | JSONフィクスチャの末尾空白・typo(実APIの再現として保持) | - ---- - -## trim() 対応方針(データ品質) - -APIレスポンスの `name`/`title` フィールドに末尾空白・タブが混入している。DBに入る前にクリーニングする。 - -### 変更箇所 - -**`src/lib/clients/aizu_online_judge/utils.ts`** - -```ts -// mapToContest -title: title.trim(), - -// mapToTask -title: problem.name.trim(), -``` - -**`src/lib/clients/atcoder/atcoder_problems.ts`** - -transformer がなく生データを返しているので `.map()` を追加: - -```ts -// getContests -return contests.map((contest) => ({ ...contest, title: contest.title.trim() })); - -// getTasks -return tasks.map((task) => ({ ...task, title: task.title.trim() })); -``` - -### テスト方針 - -- フィクスチャは汚いデータのまま保持(実APIの再現) -- `utils.test.ts` と `atcoder_problems.test.ts` に末尾空白を含む入力 → trimされた出力をassertするケースを各1件追加 diff --git a/src/lib/clients/atcoder/atcoder_problems.test.ts b/src/lib/clients/atcoder/atcoder_problems.test.ts index 49997ef0a..8652495a7 100644 --- a/src/lib/clients/atcoder/atcoder_problems.test.ts +++ b/src/lib/clients/atcoder/atcoder_problems.test.ts @@ -85,7 +85,13 @@ describe('AtCoder Problems API client', () => { }); test('trims trailing whitespace from contest titles', async () => { - const dirtyContest = { id: 'abc001', title: 'AtCoder Beginner Contest 001 ', start_epoch_second: 0, duration_second: 0, rate_change: '-' }; + const dirtyContest = { + id: 'abc001', + title: 'AtCoder Beginner Contest 001 ', + start_epoch_second: 0, + duration_second: 0, + rate_change: '-', + }; nock(API_BASE).get(`${API_PATH}contests.json`).reply(200, [dirtyContest]); const contests = await client.getContests(); expect(contests[0].title).toBe('AtCoder Beginner Contest 001'); @@ -131,7 +137,12 @@ describe('AtCoder Problems API client', () => { }); test('trims trailing whitespace from task titles', async () => { - const dirtyTask = { id: 'abc001_a', contest_id: 'abc001', problem_index: 'A', title: 'Product ' }; + const dirtyTask = { + id: 'abc001_a', + contest_id: 'abc001', + problem_index: 'A', + title: 'Product ', + }; nock(API_BASE).get(`${API_PATH}problems.json`).reply(200, [dirtyTask]); const tasks = await client.getTasks(); expect(tasks[0].title).toBe('Product');