Skip to content

Commit dd5570d

Browse files
Always allow codegen again (#309)
* Update README to say 3.9 is the minimal officially supported version + allow codegen in ABC again * Always Allow Codegen Again * Fix tests * Fix tests * Set UA explicitly * Improve tests using real network * Fix style
1 parent fe2f271 commit dd5570d

File tree

13 files changed

+605
-405
lines changed

13 files changed

+605
-405
lines changed

README.md

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,17 @@
22
[![codecov](https://codecov.io/gh/kyuridenamida/atcoder-tools/branch/master/graph/badge.svg)](https://codecov.io/gh/kyuridenamida/atcoder-tools)
33
[![PyPI](https://img.shields.io/pypi/v/atcoder-tools.svg)](https://pypi.python.org/pypi/atcoder-tools)
44

5-
【重要】2.13.0以前のバージョンを利用するとルール違反になってしまうケースに関する注意喚起 (2024/6/7)
5+
【重要】バージョン2.15.0以降ではABCを含むコンテストの開催期間中においてもコード自動生成が許可されるようになりました (2025/11/9)
66
====
77

8-
2024/6/7にAtCoderがatcoder-toolsを含むコード自動生成ツールを特定のコンテストで禁止するルール変更を行いました。詳しくは『[生成AIの台頭に伴うABCにおけるルール変更について](https://atcoder.jp/posts/1246)』を御覧ください。
8+
以前、AtCoderではatcoder-toolsを含むコード自動生成ツールを特定のコンテストで禁止するルール変更を行っていましたが、2025/10/03に発表された最新のルールでは生成AIを用いないコード生成は明示的に許容されるようになりました。
9+
詳しくは『[生成AIの技術向上に伴うABC,ARC,AGCにおけるルール変更について](https://atcoder.jp/posts/1567)』を御覧ください。
910

10-
atcoder-toolsの入力解析を伴うコード自動生成機能をAtCoder Beginer Contestのコンテスト開催期間中に利用してコード生成を行うことはUnrated, Ratedでの参加を問わず禁止となります。
11-
12-
これに伴い、バージョン2.14.0にて、**開催中の**ABCコンテストにおいては入力解析部分の実行をスキップするような仕様変更を行いました。
13-
14-
挙動としましては、コンテストの種類がABCでありかつ開催中に限り、
15-
```
16-
Format prediction is skipped because it's not allowed by AtCoder rules
17-
```
18-
という警告と共に入力解析分をスキップするようになっています。入力部分のコードは生成されませんが、コード生成失敗時に生成されるテンプレートは生成され、MOD値やYES/NO等の定数抽出は行われます。また、問題文に存在するテストケースも生成されます。
19-
20-
**2.13.0以前のatcoder-tools にはコンテストの種類を検知して生成をスキップする機能はありませんので、2.14.0にアップデートして頂くか、各自の責任において利用を避けて頂くようお願い申し上げます。**
21-
22-
ライセンスにもありますように、利用しているバージョンに関わらずこのツールを利用したことで生じるあらゆる損害に対し、atcoder-tools管理者は何の責任も負う必要がないことを明記しておきます。
11+
これに伴い、バージョン2.15.0にて、**開催中の**ABCコンテストにおいても入力解析部分の実行を再びスキップしないようになりました。
2312

2413
AtCoder Tools
2514
====
26-
Python 3.6 以降で動作する [AtCoder](https://atcoder.jp/) からサンプル入力をダウンロードしたりする際に便利なツールです。
15+
Python 3.9 以降で動作する [AtCoder](https://atcoder.jp/) からサンプル入力をダウンロードしたりする際に便利なツールです。
2716

2817
このツールには次のような機能があります。
2918
- AtCoderへのログイン,入出力例データなどの抽出

atcodertools/client/atcoder.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ def download_all_contests(self) -> List[Contest]:
143143
r'"/contests/([A-Za-z0-9\'~+\-_]+)"')
144144
contest_list = url_re.findall(text)
145145
contest_list = set(contest_list)
146-
contest_list.remove("archive")
146+
contest_list.discard("archive")
147147
contest_list = sorted(list(contest_list))
148148

149149
if previous_list == contest_list:

atcodertools/constprediction/constants_prediction.py

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,6 @@ def __init__(self, cands):
3636
self.cands = cands
3737

3838

39-
class FailingToKnowFormatAnalysisAllowedByRuleError(Exception):
40-
def __init__(self, reason):
41-
self.reason = reason
42-
43-
4439
MOD_ANCHORS = ["余り", "あまり", "mod", "割っ", "modulo"]
4540
DECIMAL_ANCHORS = ["誤差", " error "]
4641
LIMIT_ANCHORS = ["時間制限", "Time Limit"]
@@ -211,26 +206,6 @@ def normalize(sentence):
211206
raise MultipleModCandidatesError(limit_cands)
212207

213208

214-
def predict_is_format_analysis_allowed_by_rule(html: str) -> bool:
215-
soup = BeautifulSoup(html, "html.parser")
216-
url_meta_tag = soup.find("meta", property="og:url")
217-
if url_meta_tag is None:
218-
raise FailingToKnowFormatAnalysisAllowedByRuleError(
219-
"No meta tag detected, which is important as a clue to know if the input analysis is allowed.")
220-
221-
# ABC is the target of "No LLM rules" by AtCoder (See https://info.atcoder.jp/entry/llm-abc-rules-ja or https://info.atcoder.jp/entry/llm-abc-rules-en)
222-
is_target_contest_of_no_llm_rule = "/contests/abc" in url_meta_tag["content"]
223-
224-
# If there is no virtual standings link, assume it's ongoing.
225-
is_ongoing_contest = len([tag for tag in soup.find_all(
226-
"a") if "/standings/virtual" in tag.get("href", "")]) == 0
227-
228-
if is_target_contest_of_no_llm_rule and is_ongoing_contest:
229-
return False
230-
231-
return True
232-
233-
234209
def predict_constants(html: str) -> ProblemConstantSet:
235210
try:
236211
yes_str, no_str = predict_yes_no(html)
@@ -258,19 +233,10 @@ def predict_constants(html: str) -> ProblemConstantSet:
258233
"two or more candidates {} are detected as limit".format(e.cands))
259234
timeout = None
260235

261-
try:
262-
is_format_analysis_allowed_by_rule = predict_is_format_analysis_allowed_by_rule(
263-
html)
264-
except FailingToKnowFormatAnalysisAllowedByRuleError as e:
265-
logger.warning(
266-
"Failed to know whether format analysis is allowed by the contest rules -- ", e.reason)
267-
is_format_analysis_allowed_by_rule = None
268-
269236
return ProblemConstantSet(
270237
mod=mod,
271238
yes_str=yes_str,
272239
no_str=no_str,
273240
judge_method=judge,
274241
timeout=timeout,
275-
is_format_analysis_allowed_by_rule=is_format_analysis_allowed_by_rule,
276242
)

atcodertools/constprediction/models/problem_constant_set.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,9 @@ def __init__(self,
99
no_str: str = None,
1010
judge_method: Judge = None,
1111
timeout: float = None,
12-
is_format_analysis_allowed_by_rule: bool = None,
1312
):
1413
self.mod = mod
1514
self.yes_str = yes_str
1615
self.no_str = no_str
1716
self.judge_method = judge_method
1817
self.timeout = timeout
19-
self.is_format_analysis_allowed_by_rule = is_format_analysis_allowed_by_rule

atcodertools/fmtprediction/predict_format.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,7 @@ def __init__(self, cands):
1616
self.cands = cands
1717

1818

19-
class PredictionNotAllowedError(Exception):
20-
pass
21-
22-
23-
def predict_format(content: ProblemContent, is_format_analysis_allowed_by_rule: bool) -> FormatPredictionResult:
24-
if not is_format_analysis_allowed_by_rule:
25-
raise PredictionNotAllowedError
26-
19+
def predict_format(content: ProblemContent) -> FormatPredictionResult:
2720
input_format = content.get_input_format()
2821
samples = content.get_samples()
2922

atcodertools/tools/codegen.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from atcodertools.config.config import Config
2020
from atcodertools.constprediction.constants_prediction import predict_constants
2121
from atcodertools.fmtprediction.models.format_prediction_result import FormatPredictionResult
22-
from atcodertools.fmtprediction.predict_format import MultiplePredictionResultsError, NoPredictionResultError, PredictionNotAllowedError, predict_format
22+
from atcodertools.fmtprediction.predict_format import MultiplePredictionResultsError, NoPredictionResultError, predict_format
2323
from atcodertools.tools import get_default_config_path
2424
from atcodertools.tools.envgen import USER_CONFIG_PATH, get_config, output_splitter
2525
from atcodertools.tools.utils import with_color
@@ -92,18 +92,15 @@ def emit_info(text):
9292
constants = predict_constants(content.original_html)
9393

9494
try:
95-
prediction_result = predict_format(
96-
content, constants.is_format_analysis_allowed_by_rule or False)
95+
prediction_result = predict_format(content)
9796
emit_info(
9897
with_color("Format prediction succeeded", Fore.LIGHTGREEN_EX))
99-
except (NoPredictionResultError, MultiplePredictionResultsError, PredictionNotAllowedError) as e:
98+
except (NoPredictionResultError, MultiplePredictionResultsError) as e:
10099
prediction_result = FormatPredictionResult.empty_result()
101100
if isinstance(e, NoPredictionResultError):
102101
msg = "No prediction -- Failed to understand the input format"
103102
elif isinstance(e, MultiplePredictionResultsError):
104103
msg = "Too many prediction -- Failed to understand the input format"
105-
elif isinstance(e, PredictionNotAllowedError):
106-
msg = "Format prediction is skipped because it's not allowed by AtCoder rules (At least not allowed in ongoing ABC contests) -- See https://info.atcoder.jp/entry/llm-abc-rules-en"
107104
emit_warning(with_color(msg, Fore.LIGHTRED_EX))
108105

109106
code_generator = config.code_style_config.code_generator

atcodertools/tools/envgen.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
create_code
2424
from atcodertools.fmtprediction.models.format_prediction_result import FormatPredictionResult
2525
from atcodertools.fmtprediction.predict_format import NoPredictionResultError, \
26-
MultiplePredictionResultsError, PredictionNotAllowedError, predict_format
26+
MultiplePredictionResultsError, predict_format
2727
from atcodertools.tools import get_default_config_path
2828
from atcodertools.tools.models.metadata import Metadata
2929
from atcodertools.tools.utils import with_color
@@ -119,18 +119,15 @@ def emit_info(text):
119119
constants = predict_constants(content.original_html)
120120

121121
try:
122-
prediction_result = predict_format(
123-
content, constants.is_format_analysis_allowed_by_rule or False)
122+
prediction_result = predict_format(content)
124123
emit_info(
125124
with_color("Format prediction succeeded", Fore.LIGHTGREEN_EX))
126-
except (NoPredictionResultError, MultiplePredictionResultsError, PredictionNotAllowedError) as e:
125+
except (NoPredictionResultError, MultiplePredictionResultsError) as e:
127126
prediction_result = FormatPredictionResult.empty_result()
128127
if isinstance(e, NoPredictionResultError):
129128
msg = "No prediction -- Failed to understand the input format"
130129
elif isinstance(e, MultiplePredictionResultsError):
131130
msg = "Too many prediction -- Failed to understand the input format"
132-
elif isinstance(e, PredictionNotAllowedError):
133-
msg = "Format prediction is skipped because it's not allowed by AtCoder rules (At least not allowed in ongoing ABC contests) -- See https://info.atcoder.jp/entry/llm-abc-rules-en"
134131
emit_warning(with_color(msg, Fore.LIGHTRED_EX))
135132

136133
code_generator = config.code_style_config.code_generator

0 commit comments

Comments
 (0)