# SPDX-License-Identifier: CC0-1.0 # 言語インストールスクリプト # # 言語をインストールするためのスクリプトをTOML形式で記述していただきます # 各キー/値ごとにコメントで # キー: キー名 # 型: そのキーに対する値の型 # 要否: そのキーが必須であるか任意であるか # 説明: そのキーの説明 # 例: そのキーの値として指定するものの例 # が記述してあるので、 必須 の項目については必ず記述してください # 直後にそのキー/値の例が記述してあるので参考にしてください # # 実行環境は以下の通りとなっています # # OS: Ubuntu 24.04.1 # カレントディレクトリ: /judge # 環境変数: HOME=/home/runner # LANG=C.UTF-8 # PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # ATCODER=1 # キー: language # 型: 文字列 # 要否: 必須 # 説明: プログラミング言語の名前 # 例: 'C' # 'C++' # 'Java' # 'Python3' language = "Python" # キー: display # 型: 文字列 # 要否: 必須 # 説明: この言語として表示される文字列 # このインストールスクリプトでインストールされる言語に関する表示される文字列を記述してください # ここで指定された文字列は提出画面における言語選択で表示される文字列となります # そのためプログラミング言語名や言語のバージョン、コンパイラ/インタプリタ名など、ユーザが提出言語を選ぶときに必要となる情報を記述してください # ただしコンパイルコマンドや実行コマンド、インストールされるライブラリなどは別途ルールページなどで見ることができますので提出画面における言語選択として妥当な文字列を記述してください # 具体的には現状の提出画面における表示を参考にしてください # 例: 'C++23 (GCC 15.1)' # 'C++23 (Clang 18.1.8)' # 'Java24 (OpenJDK 24.0.1)' # 'Python3 (CPython 3.13.3)' display = "Python (PyPy 3.11-v7.3.20)" # キー: license # 型: 配列 # 配列内の各要素はテーブルで、1要素が1つのライセンス # テーブルに記述するキー/値は以下の通り # キー: name # 型: 文字列 # 要否: 必須 # 説明: ライセンス名 # 例: 'GPLv3+ with GCC Runtime Library Exception' # 'Apache License v2.0 with LLVM Exceptions' # 'GNU General Public License, version 2, with the Classpath Exception' # # キー: url # 型: 文字列 # 要否: 必須 # 説明: ライセンスが確認できるURL # 例: 'https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=COPYING3;hb=refs/heads/master' # 'https://github.com/llvm/llvm-project/blob/main/clang/LICENSE.TXT' # 'https://openjdk.org/legal/gplv2+ce.html' # 要否: 必須 # 説明: コンパイラ/インタプリタのライセンス # コンパイラ、インタプリタの実装のライセンスを記述してください # デュアルライセンスなど、ライセンスが複数ある場合はすべて記述してください license = [ { name = "MIT", url = "https://github.com/pypy/pypy/blob/main/LICENSE" }, ] # キー: library # 型: テーブル # テーブル内の各キー/値はライブラリ1つを表し、キーにはライブラリ名を、値はテーブル型でライブラリの詳細を記述 # ライブラリの詳細として記述できるキー/値は以下の通り # キー: license # 型: テーブルの配列 # ここに記述する型/値は上記licenseと同様なのでそちらを参照 # 要否: 必須 # 説明: ライブラリのライセンス # # キー: version # 型: 文字列 # 要否: 任意 # 説明: ライブラリのバージョン番号 # 基本的にコンパイラ/インタプリタで指定するものと同じものをライブラリでも記述すること # バージョンに関してはコンパイラ/インタプリタと違い任意であるが、ユーザが確認できなくなるためどうしてもわからない場合などを除き記述すること # 要否: 任意 # 説明: 追加でインストールされるライブラリ一覧 # ここに記述されたものは言語一覧などの表示に使用されるものでありインストールなどには影響しません # そのためインストールスクリプトで記述されるものと一致するようにしてください # 例: boost = { license = [ { name = 'Boost Software License', url = 'https://www.boost.org/LICENSE_1_0.txt' } ], version = '1.86.0' } library.numpy = { license = [ { name = "BSD-3-Clause", url = "https://github.com/numpy/numpy/blob/main/LICENSE.txt" }, ], version = "v2.3.2" } library.scipy = { license = [ { name = "BSD-3-Clause", url = "https://github.com/scipy/scipy/blob/main/LICENSE.txt" }, ], version = "v1.15.3" } library.networkx = { license = [ { name = "BSD-3-Clause", url = "https://github.com/networkx/networkx/blob/main/LICENSE.txt" }, ], version = "v3.5" } library.sympy = { license = [ { name = "BSD-3-Clause", url = "https://github.com/sympy/sympy/blob/master/LICENSE" }, ], version = "v1.14.0" } library.sortedcontainers = { license = [ { name = "Apache-2.0", url = "https://github.com/grantjenks/python-sortedcontainers/blob/master/LICENSE" }, ], version = "v2.4.0" } library.more-itertools = { license = [ { name = "MIT", url = "https://github.com/more-itertools/more-itertools/blob/master/LICENSE" }, ], version = "v10.7.0" } library.shapely = { license = [ { name = "BSD-3-Clause", url = "https://github.com/shapely/shapely/blob/main/LICENSE.txt" }, ], version = "v2.1.1" } library.bitarray = { license = [ { name = "PSF-2.0", url = "https://github.com/ilanschnell/bitarray/blob/master/LICENSE" }, ], version = "v3.6.0" } library.PuLP = { license = [ { name = "MIT", url = "https://github.com/coin-or/pulp/blob/master/LICENSE" }, ], version = "v3.2.2" } library.mpmath = { license = [ { name = "BSD-3-Clause", url = "https://github.com/mpmath/mpmath/blob/master/LICENSE" }, ], version = "v1.3.0" } library.pandas = { license = [ { name = "BSD-3-Clause", url = "https://github.com/pandas-dev/pandas/blob/main/LICENSE" }, ], version = "v2.3.1" } library.z3-solver = { license = [ { name = "MIT", url = "https://github.com/Z3Prover/z3/blob/master/LICENSE.txt" }, ], version = "v4.15.1.0" } library.scikit-learn = { license = [ { name = "BSD-3-Clause", url = "https://github.com/scikit-learn/scikit-learn/blob/main/COPYING" }, ], version = "v1.7.1" } library.ac-library-python = { license = [ { name = "CC0-1.0", url = "https://github.com/not522/ac-library-python/blob/master/LICENSE" }, ] } library.cppyy = { license = [ { name = "BSD-3-Clause-LBNL", url = "https://github.com/wlav/cppyy/blob/master/LICENSE.txt" }, ], version = "v3.5.0" } library.acl-cpp-python = { license = [ { name = "CC0-1.0", url = "https://github.com/tatyam-prime/acl-cpp-python/blob/main/LICENSE" }, ], version = "v0.6.2" } # キー: filename # 型: 文字列 # 要否: 必須 # 説明: 配置するファイル名 # 提出されたソースコードがこの名前でカレントディレクトリに作成されます # 基本的には Main + 拡張子 で統一してください # ただしファイル名に意味がある場合やプロジェクトファイルを用いる場合は適切にファイルパスを指定してください # 例: 'Main.c' # 'Main.cpp' # 'src/main.rs' filename = "Main.py" # キー: install # 型: 文字列 # 要否: 必須 # 説明: インストールスクリプト # このスクリプトでは言語環境のイメージを作成するために使用されます # そのためコンパイラ/インタプリタやライブラリのインストールだけでなく、プロジェクトの生成やプリコンパイルといった、提出によらずにすべてで行うべき工程はこのインストールスクリプトで行ってください # ネットワークアクセスができるのはこのタイミングだけです # 後述のコンパイルスクリプト、および実行コマンドではネットワークアクセスができないため、必要なファイルがインターネットにある場合はこのスクリプトでダウンロードを行っておいてください # # ここで記述されたスクリプトはbashに渡されて実行されます # シェル変数などは通常通り使用可能ですが、コンパイルスクリプト、実行コマンドには引き継がれないので注意してください # コンパイルスクリプトにおいては同様にbashで実行されるため、同じ内容を記述してください # 実行コマンドはシェルを介さず直接起動されるため、環境変数の修正が必要な場合は後述のenvironmentを使用してください # # またイメージを最小化するために、インストール作業には必要だが最終成果物として不要なものは /tmp においてください # インストールスクリプトが終了したあとで /tmp 以下のものは削除されます install = ''' cd /tmp sudo apt-get update # インストール時の依存関係 sudo apt-get install -y git wget bzip2 # ライブラリの依存関係 sudo DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential gfortran libopenblas-dev liblapack-dev pkg-config libgeos-dev meson # ビルド済みバイナリをインストール wget https://downloads.python.org/pypy/pypy3.11-v7.3.20-linux64.tar.bz2 tar jxvf pypy3.11-v7.3.20-linux64.tar.bz2 cd pypy3.11-v7.3.20-linux64 # pipを有効化 ./bin/pypy3 -m ensurepip ./bin/pip3 install --upgrade pip # ライブラリをインストール ./bin/pip3 install --break-system-packages \ numpy==2.3.2 \ scipy==1.15.3 \ networkx==3.5 \ sympy==1.14.0 \ sortedcontainers==2.4.0 \ more-itertools==10.7.0 \ shapely==2.1.1 \ bitarray==3.6.0 \ PuLP==3.2.2 \ mpmath==1.3.0 \ pandas==2.3.1 \ z3-solver==4.15.1.0 \ scikit-learn==1.7.1 \ cppyy==3.5.0 \ acl-cpp-python==0.6.2 \ git+https://github.com/not522/ac-library-python@27fdbb71cd0d566bdeb12746db59c9d908c6b5d5 # パスが通る所へ移動 sudo cp -r ./bin/* /usr/local/bin sudo cp -r ./include/* /usr/local/include sudo cp -r ./lib/* /usr/local/lib ''' # キー: compile # 型: 文字列 # 要否: 任意 # 説明: コンパイルスクリプト # コンパイルを行う言語の場合はコンパイルコマンドを記入してください # # ここで記述されたスクリプトはbashに渡されて実行されます # シェル変数などは通常通り使用可能ですが、実行コマンドには引き継がれないので注意してください # 実行コマンドはシェルを介さず直接起動されるため、環境変数の修正が必要な場合は後述のenvironmentを使用してください # # コンパイルを行わない言語の場合は記述不要です # ただしコンパイルを行う必要のない言語の場合でも、構文チェックなどをコンパイル代わりに行わせることが可能です # 成功時に後述の object で指定するファイルが生成されるようにコマンドを記述してください compile = ''' pypy3 -m py_compile Main.py pypy3 Main.py ONLINE_JUDGE 2> /dev/null ''' # キー: object # 型: 文字列 # 要否: 任意 # 説明: コンパイル成否を判断するためのファイルパス # コンパイルが成功したかどうかの判定に行うファイルを/judgeからの相対パスで記入してください # コンパイルの成否はこのファイルの存在で判定を行います # コンパイラの出力内容や、コンパイラの終了コードでは判定を行いませんので注意してください # またこの仕様を用いて、インタプリタ言語で構文チェックなどを行うことが可能です # 例えばコンパイルコマンドとして構文チェックを行い、その成否に応じてここで指定するファイルを生成する/しないを行えば、インタプリタ言語でもコンパイルエラーで実行を中断させることが可能です # 例: 'a.out' # 'publish/Main' # 'target/release/main' object = "./__pycache__/Main.pypy311.pyc" # キー: execution # 型: 配列 # 配列内の各要素は文字列で、実行コマンドとして渡される各引数 # 要否: 任意 # 説明: 実行コマンド # 実行を行うときのコマンドを配列で指定してください # 実行はオーバーヘッドを取り除くためにシェルなどを使わずに直接起動させます # そのためシェルの構文などは一切使えません # ただし以下の文字列は実行直前にジャッジシステムによって置換されます: # {memory:b} 問題のメモリ制限の数値(単位: バイト) # {memory:kb} 問題のメモリ制限の数値(単位: KiB) # {memory:mb} 問題のメモリ制限の数値(単位: MiB) # インタプリタ言語など、実行環境の設定を行う場合に使用できます # 例: [ './a.out' ] # [ './target/release/main' ] # [ 'java', '-Xss{memory:mb}M', 'Main' ] execution = ["pypy3", "-X", "int_max_str_digits=0", "Main.py"]