Skip to content

Commit

Permalink
Merge pull request #1420 from hotate29/fix-1413
Browse files Browse the repository at this point in the history
コンテスト開始前の提出を点数計算の処理から除外する
  • Loading branch information
kenkoooo authored Oct 15, 2023
2 parents 4bd8ed9 + af63c88 commit d697d5f
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 15 deletions.
11 changes: 11 additions & 0 deletions atcoder-problems-backend/sql-client/src/problem_info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,16 @@ impl ProblemInfoUpdater for PgPool {
Ok(())
}

/// 各問題の点数を計算して更新する。
///
/// ある問題への提出のうち、 __コンテスト開始後の提出__ における最も大きい得点がその問題の点数となる。
///
/// コンテスト開始前、writerなどが仮の点数が付けられている問題をACすることがあり、
/// 仮の点数がコンテストでの正式な点数より大きかった場合には、仮の点数がAtCoder Problemsでの正式な点数とされてしまう。
/// これを防ぐために、コンテスト開始前の提出は点数計算で考慮しないようにしている。
///
/// 「コンテスト開始前にwriterがACしているが、コンテスト開始以降に一人もACできていない」場合は点数が
/// 計算されないという問題があるが、現時点ではその問題は発生していないため対応は保留されている。
async fn update_problem_points(&self) -> Result<()> {
sqlx::query(
r"
Expand All @@ -35,6 +45,7 @@ impl ProblemInfoUpdater for PgPool {
FROM submissions
INNER JOIN contests ON contests.id = submissions.contest_id
WHERE contests.start_epoch_second >= $1
AND submissions.epoch_second >= contests.start_epoch_second
AND contests.rate_change != '-'
GROUP BY submissions.problem_id
ON CONFLICT (problem_id) DO UPDATE
Expand Down
39 changes: 24 additions & 15 deletions atcoder-problems-backend/sql-client/tests/test_problem_info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ async fn test_update_problem_points() {
let pool = utils::initialize_and_connect_to_test_sql().await;
pool.insert_contests(&[Contest {
id: contest_id.to_string(),
start_epoch_second: 1468670400,
start_epoch_second: 1687608000, // 2023/06/24 21:00:00 JST
rate_change: "All".to_string(),

duration_second: 0,
Expand All @@ -98,33 +98,42 @@ async fn test_update_problem_points() {

assert!(get_points(&pool).await.is_empty());

// コンテスト開始前の提出
pool.update_submissions(&[Submission {
id: 0,
point: 0.0,
point: 625.0, // コンテスト開始前にwriterが設定することがある仮の得点
problem_id: problem_id.to_string(),
contest_id: contest_id.to_string(),
epoch_second: 1687208168, // 2023/06/20 05:56:08 JST
..Default::default()
}])
.await
.unwrap();
pool.update_problem_points().await.unwrap();
assert_eq!(
get_points(&pool).await,
vec![("problem".to_string(), Some(0.0))]
);

pool.update_submissions(&[Submission {
id: 1,
point: 100.0,
problem_id: problem_id.to_string(),
contest_id: contest_id.to_string(),
..Default::default()
}])
// コンテスト開始後の提出
pool.update_submissions(&[
Submission {
id: 1,
point: 100.0,
problem_id: problem_id.to_string(),
contest_id: contest_id.to_string(),
epoch_second: 1687608000, // 2023/07/08 21:00:00 JST
..Default::default()
},
Submission {
id: 2,
point: 550.0, // こっちが正式な得点
problem_id: problem_id.to_string(),
contest_id: contest_id.to_string(),
epoch_second: 1687608000, // 2023/07/08 21:00:00 JST
..Default::default()
},
])
.await
.unwrap();
pool.update_problem_points().await.unwrap();
assert_eq!(
get_points(&pool).await,
vec![("problem".to_string(), Some(100.0))]
vec![("problem".to_string(), Some(550.0))]
);
}

0 comments on commit d697d5f

Please sign in to comment.