# 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 # # また提出いただくインストールスクリプトは公開される場合があります # そのためインストールスクリプトを提出される場合はそのインストールスクリプトについて必ず `CC0-1.0` でライセンスしてください # このライセンスに同意いただけない場合はインストールスクリプトを使用することができないため、インストールを拒否させていただきます # 具体的なライセンスの明記方法はこのサンプルインストールスクリプトの1行目と同様にSPDX-License-Identifierを記述してください # ※このサンプルスクリプト自体もCC0-1.0でライセンスしていますので自由に使ってください # キー: language # 型: 文字列 # 要否: 必須 # 説明: プログラミング言語の名前 # プログラミング言語としての名前を記述してください # ここで指定された文字列はプログラミング言語として認識されるため、正確に記述してください # ここで指定される文字列は具体的には提出結果画面において、提出検索時の言語として使われます # そのため過去に提出可能だった言語やコンパイラ/インタプリタなどの実装が違うだけの言語、また将来での言語間で同じプログラミング言語を検索するために使われます # 例: 'C' # 'C++' # 'Java' # 'Python' language = 'Julia' # キー: display # 型: 文字列 # 要否: 必須 # 説明: この言語として表示される文字列 # このインストールスクリプトでインストールされる言語に関する表示される文字列を記述してください # ここで指定された文字列は提出画面における言語選択で表示される文字列となります # そのためプログラミング言語名や言語のバージョン、コンパイラ/インタプリタ名など、ユーザが提出言語を選ぶときに必要となる情報を記述してください # ただしコンパイルコマンドや実行コマンド、インストールされるライブラリなどは別途ルールページなどで見ることができますので提出画面における言語選択として妥当な文字列を記述してください # 具体的には現状の提出画面における表示を参考にしてください # 例: 'C++23 (GCC 15.1)' # 'C++23 (Clang 18.1.8)' # 'Java24 (OpenJDK 24.0.1)' # 'Python3 (CPython 3.13.3)' display = 'Julia (Julia 1.11.6)' # キー: license # 型: 配列 # 配列内の各要素はテーブルで、1要素が1つのライセンス # テーブルに記述するキー/値は以下の通り # キー: 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' # # キー: name # 型: 文字列 # 要否: 必須 # 説明: ライセンス名 # https://spdx.org/licenses/ にある Identifier で記述してください # ライセンスを記述するうえで例外規定を含む場合は後述の `exception` に分けて記述してください # つまりこの項目では `WITH` を使った書き方はしないでください # 上記リストにないライセンスの場合は問い合わせをしてください # 例: 'GPL-3.0-and-later' # 'Apache-2.0' # 'GPL-2.0-only' # # キー: exception # 型: 文字列 # 要否: 任意 # 説明: ライセンスの例外規定名 # ライセンスにおける例外規定を https://spdx.org/licenses/exceptions-index.html にある Identifier で記述してください # この項目は任意項目となっていますがライセンスに例外規定がある場合は必須です # 任意となっているのは例外規定がない場合に書く内容がないためであり、例外規定を書かなくていいという意味ではありません # 上記リストにないライセンスの場合は問い合わせをしてください # 例: 'GCC-exception-3.1' # 'LLVM-exception' # 'Classpath-exception-2.0' # 要否: 必須 # 説明: コンパイラ/インタプリタのライセンス # コンパイラ、インタプリタの実装のライセンスを記述してください # デュアルライセンスなど、ライセンスが複数ある場合はすべて記述してください license = [ { name = 'MIT', url = 'https://github.com/JuliaLang/julia/tree/master?tab=MIT-1-ov-file' }, ] # キー: library # 型: テーブル # テーブル内の各キー/値はライブラリ1つを表し、キーにはライブラリ名を、値はテーブル型でライブラリの詳細を記述 # ライブラリの詳細として記述できるキー/値は以下の通り # キー: license # 型: テーブルの配列 # ここに記述する型/値は上記 `license` と同様なのでそちらを参照 # 要否: 必須 # 説明: ライブラリのライセンス # # キー: indirect # 型: ブール値 # 要否: 任意 # 説明: 間接的にインストールされるライブラリかどうか # 他ライブラリから依存されてインストールされるライブラリである場合にこのキーの値に `true` を指定してください # このキー/値が設定されなかった場合のデフォルト値は `false` で、直接的にインストールするライブラリであることを表します # このキーが存在する理由は、直接インストールされるライブラリが依存しているライブラリのライセンスを明示するためにあります # つまり使用したいライブラリが依存しているライブラリもライセンス的に使用できることを明示するために存在し、これが `true` にされたライブラリはインストールされたライブラリ一覧としては表示されません # # キー: version # 型: 文字列 # 要否: 任意 # 説明: ライブラリのバージョン番号 # # `indirect` のとおり、間接的に使用されるライブラリのライセンスもできるだけ記述してください # バージョンに関してはコンパイラ/インタプリタと違い任意であるが、ユーザが確認できなくなるためどうしてもわからない場合などを除き記述すること # 要否: 任意 # 説明: 追加でインストールされるライブラリ一覧 # ここに記述されたものは言語一覧などの表示に使用されるものでありインストールなどには影響しません # そのためインストールスクリプトで記述されるものと一致するようにしてください # 例: boost = { license = [ { name = 'Boost Software License', url = 'https://www.boost.org/LICENSE_1_0.txt' } ], version = '1.86.0' } library.Combinatorics = { license = [ { name = 'MIT', url = 'https://github.com/JuliaMath/Combinatorics.jl/blob/master/LICENSE.md' }, ], version = 'v1.0.3' } library.DataStructures = { license = [ { name = 'MIT', url = 'https://github.com/JuliaCollections/DataStructures.jl/blob/master/License.md' }, ], version = 'v0.18.22' } library.DelimitedFiles = { license = [ { name = 'MIT', url = 'https://github.com/JuliaData/DelimitedFiles.jl/blob/main/LICENSE' }, ], version = 'v1.9.1' } library.Distributions = { license = [ { name = 'MIT', url = 'https://github.com/JuliaStats/Distributions.jl/blob/master/LICENSE.md' }, ], version = 'v0.25.120' } library.InvertedIndices = { license = [ { name = 'MIT', url = 'https://github.com/JuliaData/InvertedIndices.jl/blob/main/LICENSE.md' }, ], version = 'v1.3.1' } library.IterTools = { license = [ { name = 'MIT', url = 'https://github.com/JuliaCollections/IterTools.jl/blob/master/LICENSE.md' }, ], version = 'v1.10.0' } library.OffsetArrays = { license = [ { name = 'MIT', url = 'https://github.com/JuliaArrays/OffsetArrays.jl/blob/master/LICENSE.md' }, ], version = 'v1.17.0' } library.PrecompileTools = { license = [ { name = 'MIT', url = 'https://github.com/JuliaLang/PrecompileTools.jl/blob/main/LICENSE' }, ], version = 'v1.2.1' } library.Primes = { license = [ { name = 'MIT', url = 'https://github.com/JuliaMath/Primes.jl/blob/master/LICENSE.md' }, ], version = 'v0.5.7' } library.StaticArrays = { license = [ { name = 'MIT', url = 'https://github.com/JuliaArrays/StaticArrays.jl/blob/master/LICENSE.md' }, { name = 'BSL-1.0', url = 'https://github.com/JuliaArrays/StaticArrays.jl/blob/master/LICENSE.md' }, ], version = 'v1.9.14' } # キー: filename # 型: 文字列 # 要否: 必須 # 説明: 配置するファイル名 # 提出されたソースコードがこの名前でカレントディレクトリに作成されます # 基本的には Main + 拡張子 で統一してください # ただしファイル名に意味がある場合やプロジェクトファイルを用いる場合は適切にファイルパスを指定してください # 例: 'Main.c' # 'Main.cpp' # 'src/main.rs' filename = 'Main.jl' # キー: install # 型: 文字列 # 要否: 必須 # 説明: インストールスクリプト # このスクリプトでは言語環境のイメージを作成するために使用されます # そのためコンパイラ/インタプリタやライブラリのインストールだけでなく、プロジェクトの生成やプリコンパイルといった、提出によらずにすべてで行うべき工程はこのインストールスクリプトで行ってください # ネットワークアクセスができるのはこのタイミングだけです # 後述のコンパイルスクリプト、および実行コマンドではネットワークアクセスができないため、必要なファイルがインターネットにある場合はこのスクリプトでダウンロードを行っておいてください # # ここで記述されたスクリプトはbashに渡されて実行されます # シェル変数などは通常通り使用可能ですが、コンパイルスクリプト、実行コマンドには引き継がれないので注意してください # コンパイルスクリプトにおいては同様にbashで実行されるため、同じ内容を記述してください # 実行コマンドはシェルを介さず直接起動されるため、環境変数の修正が必要な場合は後述のenvironmentを使用してください # # またイメージを最小化するために、インストール作業には必要だが最終成果物として不要なものは /tmp においてください # インストールスクリプトが終了したあとで /tmp 以下のものは削除されます install = ''' sudo apt install -y curl # See: https://github.com/JuliaLang/juliaup curl -fsSL https://install.julialang.org | sh -s -- --yes --default-channel 1.11.6 # Install Packages export PATH=$PATH:/home/runner/.juliaup/bin julia -e "using Pkg; Pkg.update(); for (name, version) in map(p -> String.(split(p, '@')), ARGS) Pkg.add(name=name, version=version); end" Combinatorics@1.0.3 DataStructures@0.18.22 DelimitedFiles@1.9.1 Distributions@0.25.120 InvertedIndices@1.3.1 IterTools@1.10.0 OffsetArrays@1.17.0 PrecompileTools@1.2.1 Primes@0.5.7 StaticArrays@1.9.14 julia -e "using Combinatorics, DataStructures, DelimitedFiles, Distributions, InvertedIndices, IterTools, OffsetArrays, PrecompileTools, Primes, StaticArrays" juliaup config backgroundselfupdateinterval 0 juliaup config startupselfupdateinterval 0 juliaup config versionsdbupdateinterval 0 ''' # キー: compile # 型: 文字列 # 要否: 任意 # 説明: コンパイルスクリプト # コンパイルを行う言語の場合はコンパイルコマンドを記入してください # # ここで記述されたスクリプトはbashに渡されて実行されます # シェル変数などは通常通り使用可能ですが、実行コマンドには引き継がれないので注意してください # 実行コマンドはシェルを介さず直接起動されるため、環境変数の修正が必要な場合は後述のenvironmentを使用してください # # コンパイルを行わない言語の場合は記述不要です # ただしコンパイルを行う必要のない言語の場合でも、構文チェックなどをコンパイル代わりに行わせることが可能です # 成功時に後述の object で指定するファイルが生成されるようにコマンドを記述してください compile = ''' export PATH=$PATH:/home/runner/.juliaup/bin julia -e "Meta.parse(\"begin \" * read(\"Main.jl\",String) * \" end\")" && touch ok && julia Main.jl ONLINE_JUDGE 2> /dev/null ''' # キー: object # 型: 文字列 # 要否: 任意 # 説明: コンパイル成否を判断するためのファイルパス # コンパイルが成功したかどうかの判定に行うファイルを/judgeからの相対パスで記入してください # コンパイルの成否はこのファイルの存在で判定を行います # コンパイラの出力内容や、コンパイラの終了コードでは判定を行いませんので注意してください # またこの仕様を用いて、インタプリタ言語で構文チェックなどを行うことが可能です # 例えばコンパイルコマンドとして構文チェックを行い、その成否に応じてここで指定するファイルを生成する/しないを行えば、インタプリタ言語でもコンパイルエラーで実行を中断させることが可能です # 例: 'a.out' # 'publish/Main' # 'target/release/main' object = 'ok' # キー: environment # 型: テーブル # テーブル内の各キー/値は環境変数1つを表し、キーには環境変数名を、値は文字列型で環境変数の内容を記述 # 要否: 任意 # 説明: 実行時の環境変数 # 実行はシェルを介さず直接実行されるためシェルと同じ方法では環境変数を設定できません # そのため環境変数を修正する場合はenvironmentテーブル内にキー/値を記述してください # # デフォルトでは以下の環境変数が設定されています # environment.PATH = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' # environment.HOME = '/home/runner' # environment.LANG = 'C.UTF-8' # environment.ATCODER = '1' # # ここで指定する環境変数は実行時のみ影響するものです # インストールスクリプト、コンパイルスクリプトには影響しません # それぞれで環境変数を変更する場合はそれぞれのスクリプト内で直接変更するようにしてください # # また以下の文字列は実行直前にジャッジシステムによって置換されます: # {memory:b} 問題のメモリ制限の数値(単位: バイト) # {memory:kb} 問題のメモリ制限の数値(単位: KiB) # {memory:mb} 問題のメモリ制限の数値(単位: MiB) # インタプリタ言語など、環境変数によって実行環境の設定を行う場合に使用できます # environment.HOGE = "fuga" # environment.FOO = "bar" # environment.max-memory = "{memory:mb}M" environment.PATH = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/runner/.juliaup/bin" # キー: execution # 型: 配列 # 配列内の各要素は文字列で、実行コマンドとして渡される各引数 # 要否: 必須 # 説明: 実行コマンド # 実行を行うときのコマンドを配列で指定してください # 実行はオーバーヘッドを取り除くためにシェルなどを使わずに直接起動させます # そのためシェルの構文などは一切使えません # ただし以下の文字列は実行直前にジャッジシステムによって置換されます: # {memory:b} 問題のメモリ制限の数値(単位: バイト) # {memory:kb} 問題のメモリ制限の数値(単位: KiB) # {memory:mb} 問題のメモリ制限の数値(単位: MiB) # インタプリタ言語など、実行環境の設定を行う場合に使用できます # 例: [ './a.out' ] # [ './target/release/main' ] # [ 'java', '-Xss{memory:mb}M', 'Main' ] execution = [ 'julia', '--threads=auto', '--startup-file=no', '--history-file=no', 'Main.jl', ]