2022年版、AtCoder に登録したら解くべき精選過去問 10 問の内1 問を Prolog で解いてみた!
プロローグ
引用「@drken さんの記事 AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~ にて紹介されている過去問精選 10 問を、論理型プログラミング言語 Prolog で解いてみました。」
出典URL
AtCoder に登録したら解くべき精選過去問 10 問を Prolog で解いてみた - Qiita
という記事を見たので、自分も解いてみました。
注意点
解くべき精選過去問 10 問ですが、今回はその内の1 問を解きました!
引用「2019 年 2 月現在、Prolog は AtCoder の使用可能言語に含まれていません。
ファイル一つにまとまったインタプリタも見つからなかったので、提出によるテストはしておらず、サンプルケースをこちら側で試すだけとなっています。」
とありましたが、2022年 12月現在、Prolog(SWIPL)はAtCoderの使用言語に含まれています。
引用「動作確認には Try It Online の Prolog (SWI) を使用しています。」
僕も、SWIPLを使ってます。
ただし、Macアプリの
『SWI-Prolog.app』
を、使いました。
後は、AtCoderさんのコードテストも使いました…
※注意
以下から、
SWI-Prologのことを、SWIPLとする!
出典URL
AtCoder に登録したら解くべき精選過去問 10 問を Prolog で解いてみた - Qiita
0.PracticeA - Welcome to AtCoder
問題は、こちらから。
A - Welcome to AtCoder
引用「他の言語版でも言われている通り、大抵はじめにつまずくのは入出力です。」
これは、同意。
引用「Prolog はクエリを投げるとそれに対して返答があるというイメージがありますが、ググったり、ドキュメントを読んだりすると、read/1 や write/1 といった標準入出力用の述語も存在することがわかります。(Prolog の述語は引数の数によって異なる実装にできるので、述語名/引数の数 という書き方をするのが良いようです。)」
これには、同意しかねます…
readln.pl -- Read line as list of tokens
Prolog(SWIPL)には、readln/1
といった便利な標準入力用の述語?が存在します。
今回は、これを使いました。
僕が、書いたコードが以下です。
(ファイル名は、マークダウンの関係でこれにしました。)
main :-
readln(A),readln(B),readln(C),nth0(0,B,B1),nth0(1,B,B2),Y is B1 + B2,Z is A+Y,nth0(0,C,S),write(Z),tab(1),writeln(S).
これを、AtCoderさんのコードテストに貼り付けると動きます!
※注意
一行目に、
「main :-」
が無いとエラーになり、動かないので注意!
(AtCoderさん、どうにかなりませんか?笑
実際に、ACしたリンクは以下です。
提出 #37630222 - practice contest
エピローグ
引用「次回の AtCoder の言語アップデートで Prolog が追加される可能性が浮上してきています。もし Prolog が追加されれば色々な問題が Prolog で解かれるようになり、計算量やベストプラクティスなどの考察も栄えていくことでしょう。楽しみですね。」
2022年 12月現在、Prolog(SWIPL)はAtCoderの使用言語に含まれています!
これから、Prologコミュニティが盛り上がってくれると嬉しいのですが…