はじめに
この記事では、プロデルで競技プログラミングに挑む方へ向けた補足情報をまとめました。
2023年にAtCoderでのコンテストでプロデルが参加言語として選択できるようになりました。
数年前にも東京大学のコンピューター系サークル主催のコードゴルフ大会にてプロデルで参戦できるようになるなど、競技プログラミングの分野でプロデルが密かに(?)話題です。
プロデルのプログラムの書き方
競技プログラミング大会の参加者向けのプロデル入門記事は、@Mopepe51 さんが簡潔に読みやすくまとめられています。基本文法や標準入力の扱いは、これらの記事で概ね理解できるかと思います。
詳細な文法は、プロデルのマニュアルをご参照ください。
なお2023年12月現在のプロデルでは、記事中に書かれているエラー等を含め、基本的な文法のコンパイル時のバグは概ね改善されています。
また、AtCoderの基本問題をプロデルで解いたプログラム例をテスト用コンテストに投稿しています。エラー等でお困りの際は、上記記事と併せて、こちらに投稿しているプログラムをご参照ください。
バグと思われる症状を見つけた際は、公式掲示板で受け付けておりますので、フィードバックのご協力をお願いいたします。
AtCoder上のプロデル
AtCoder上のプロデルは、Mono版プロデルが採用されています。Mono版では、LinuxやmacOSに対応するためWindows依存ライブラリが省かれていますが、文法や言語仕様には違いはありません。
またAtCoderでは、投稿・テストする際にコンパイル機能を使ってソースコードをコンパイルしてから実行されます。コンパイルすると中間コード(IL)で書き出されるため、C#に近い処理速度で実行されます。
ローカル環境でプロデルのテスト環境を構築する場合は、rdrc.exeを使ってコンパイルすることで、競技環境と同じ条件でテストできます。
$ mono rdrc.exe test.rdr
$ mono test.exe
# Windowsではmono は不要
コンパイル機能でコンパイルされた中間コードでは、プロデルの言語的特徴や利便性を優先しているため、オーバーヘッドが発生するケースがあります。できるだけオーバーヘッドを回避するにはいくつかの注意点があります。
(下記は、実装に関する話になりますので、処理速度にシビアな問題以外では気にする必要はありません)
1.変数の型明示
プロデルでは、変数宣言や型指定を必須としていません。また異なるデータ型への代入や値渡しの際には、自動的に値の型変換が行われます。
変数は、データ型を明示して宣言すると、意図しない型変換が減り、高速に動作します。
値型には、整数(int), 長変数(long), 浮動小数(float), 倍浮動小数(double)などがあり、値の範囲や有効桁数、桁あふれの挙動などは、共通言語基盤(CLI)に準拠しています。
【x:整数】=1
データ型が明示されていない変数では、型推論が行われます。型推論によって型を意識しなくてもある程度早く実行できますが、型が推論できない場合や意図しない型推論結果によって、代入時に値の型変換が自動的に行われ、オーバヘッドが発生することがあります。そのため、データ型を明示して変数や引数のデータ型を揃えることで、オーバベッドを減らすことができます。
2.手順呼び出し
手順(関数)呼び出しでは、コンパイル時に呼び出す手順が決定できない場合に、実行時に引数の型で手順の決定します。1.と関連しますが型注釈で変数の型を明示することで、ほとんどの場合、実行時決定を回避することができます。
なお、プロデルは、ソースコードから直接CLIに準拠する中間コードを生成します。シンプルな設計のため、積極的な最適化は行われません。また、C#言語等には変換されないため、もしC#の仕様上の特性を想定した最適化方法があったとしても、プロデルではパフォーマンス改善を期待できません。
プロデルでコードゴルフの打ち方
プロデルでコードゴルフ大会で採用された実績もあります。
日本語のタイピング数に関しては、ASCII文字を主体としたプログラミング言語よりも多くなりがちですが、ソースコードのバイト数という視点では、意外にも短く書ける可能性があります。
日本語プログラミング言語を含む日本語プログラミングは、一般的に可読性の観点からは冗長な表現になることが多く、文字数が多くなりがちです。プロデルも基本的には日本語としての読みやすさに重点をおいています。
しかし一方でプロデルでは、動詞の送り仮名を省略できるなど、読みやすさを無視して、短くコードを書くこともできます。
例えば、「開く」手順を使うプログラムでは、送り仮名を省略して次のように書けます。
「data.csv」を開
条件文や手順定義も同様に次のように送り仮名を省略できます。
処理
処理手順
A=1
20回繰り返
A>=10なら
Aを報告
もし終
Aを増
繰り返し終
終
このような短いコードは実際にコードゴルフされた競技者によって編み出されたテクニックです。
プロデルでは、本言語の様々な楽しみ方を模索する観点から、競プロの目的でこのような極端なプログラムもOKにしています。プロデルの言語仕様の特徴を活用して短くコードを書くことを楽しむこともできるかと思います。
まとめ
AtCoderや大学などのプログラミング競技でプロデルを選択できる機会が増えたことで、より多くの方にもうひとつの日本語プログラミング言語であるプロデルを体感してもらえる機会が増えました。@Mopepe51 さんのご尽力をはじめ、このような機会を与えて頂きました関係者様には感謝いたします。
メジャーな言語に比べれば、完成度や体制に関しては十分ではなく、設計なども含めて発展途上ですが、今後も改善を図っていこうと考えています。
またユーザのフィードバックも不可欠です。黙って待っているだけでは改善されませんので、お気づきの際は、有益なフィードバックにご協力頂けましたら幸いです。