Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support LeetCode #21

Open
fukatani opened this issue Sep 20, 2019 · 10 comments · May be fixed by #114
Open

Support LeetCode #21

fukatani opened this issue Sep 20, 2019 · 10 comments · May be fixed by #114

Comments

@fukatani
Copy link
Contributor

PyConで聞いてみると、需要はあるらしいです。

@kmyk
Copy link
Member

kmyk commented Sep 20, 2019

需要ありそうだしあった方がよいのは分かるけれど、実装コストもメンテコストもかなり大きそうです。誰かやる気のある人からプルリクが飛んでくるのを待ちたい。

@fukatani
Copy link
Contributor Author

一個くらいはサービス足したいなと思ってるので、時間ができたらやるかもしれません。

@fukatani fukatani self-assigned this Oct 19, 2019
@fukatani
Copy link
Contributor Author

なるほど、難しさがわかってきました。
標準入出力じゃないから、言語の数だけ入手力の枠組みの実装が必要になっちゃうわけですね。
しかも公式がRun Codeを用意してるからojでやる嬉しさが他のサービスより少ないですね。

@fukatani fukatani removed their assignment Oct 19, 2019
@fukatani
Copy link
Contributor Author

githubでparserを発見できたけど、保守されてない風情があるし、Pythonしか対応してない風情があります。
https://github.com/fabriziodemaria/LeetCode_Parser_Tool/blob/master/LC-Parser/problem.py

@fukatani
Copy link
Contributor Author

https://github.com/skygragon/leetcode-cli
この子が一番できる子っぽい。

@fukatani
Copy link
Contributor Author

fukatani commented Oct 19, 2019

https://github.com/skygragon/leetcode-cli/blob/5a27061148d521f1e688c47ea9e7d5e3f345691c/lib/plugins/leetcode.js#L177

公式のRun CodeにPostして、結果を受け取ってるのかな?
たしかに、これをやるべきっぽい感じはありますね。
すでに便利なツールがあるのに、再発明する意味あるのかっていう点も問われなきゃいけませんが、
インターフェイスが統一されれば、IDEやVS Codeプラグインなどojを使うデベロッパーとしては他のサービスと同じように開発できるので嬉しさはあります。

ユーザーもojのUIだけ覚えればで色々なサービスで使えるというのはメリットです。
ただ、問題のダウンロードはできなくて、testとsubmitだけできる形ですね。
ってことはUIの一貫性は完全には保てないのかな、、

@kmyk この方針でどうでしょう?

@fukatani fukatani self-assigned this Oct 19, 2019
@kmyk
Copy link
Member

kmyk commented Oct 20, 2019

@fukatani よいと思います。

ただし leetcode-cli を呼び出すという形での実装も一応は検討してみてください。依存を増やしたくないので避けたいですが。
ちなみに公式の Run Code を叩く形での実装は HackerRank で同じことをしています。

@fukatani fukatani removed their assignment Nov 2, 2019
@kmyk kmyk transferred this issue from online-judge-tools/oj May 2, 2020
@kmyk kmyk mentioned this issue May 2, 2020
@kmyk kmyk changed the title Support Leet Code Support LeetCode May 21, 2020
@usk83
Copy link

usk83 commented Oct 14, 2020

@kjnh10 はじめまして
こちら興味があって手を動かしてみています

基本方針としては、

  • idpasswordでログイン
    • 外部サービスを使ったログインは online-judge-tools/oj 側で提供しているという認識
  • サンプルのテストケース取得
    • すべての問題で一貫性があるか確信はないが、問題文中から特定の要素、表現で特定して抽出する
  • 解答の提出
  • とりあえずコンテスト対応の未定はなし

といった感じで考えています。
いかがでしょうか?

また数点質問があります。

  • 上記でテストの実行について議論がありますが、online-judge-tools/api-client の機能でテストの実行ができるようになっていますでしょうか?(該当する機能を確認できず)
  • 提出するコードについて、 support Topcoder #22 で言及されているように言語によっては1ファイル内の内容として不完全なことがあるのですが、手元のファイルには提出するコードのみ記載される想定でいいでしょうか?
    • 例えば完全なソースコードとしてはpackage名の宣言やimport文が必要であるが、LeetCodeで提出するコードには含まれない、などのケースを想定しています

お手すきの際にご確認いただければ幸いです!

@kmyk
Copy link
Member

kmyk commented Oct 14, 2020

@usk83 はじめまして。

基本方針はよさそうです。

  • idとpasswordでログイン
    • 外部サービスを使ったログインは online-judge-tools/oj 側で提供しているという認識

できるとうれしいですが、しんどそうなら実装はなしでもかまいません。ログインまわりは面倒が多い (セキュリティのために複雑になりがちかつ頻繁に仕様が変更される) ためです。また、外部サービスを使わないログインについても online-judge-tools/oj 側の機能で対応可能です。


  • 上記でテストの実行について議論がありますが、online-judge-tools/api-client の機能でテストの実行ができるようになっていますでしょうか?(該当する機能を確認できず)

いいえ、online-judge-tools/api-client にテストの実行のための機能はありません。
online-judge-tools/api-client はオンラインジャッジのサーバとの通信をする機能のみを持ち、通信して得られた結果をどう活用するかについては関知しません。テストの実行機能は online-judge-tools/oj 側で提供されていますが、こちらも「実行可能なプログラム」を前提としており「LeetCode 形式の関数」だけでは動きません。

  • 提出するコードについて、 support Topcoder #22 で言及されているように言語によっては1ファイル内の内容として不完全なことがあるのですが、手元のファイルには提出するコードのみ記載される想定でいいでしょうか?

はい。提出機能については、指定されたファイルの中身がそのまま修正なしで提出されるようにしてください。
online-judge-tools/api-client の役割は通信のみであり、ソースコードの中身を変更することはしません。


質問にもあるように、LeetCode のような「関数のみを提出しろ」という形式は (AtCoder のような「main 関数を含む完全なプログラムを提出しろ」という形式とは違って) 手元でのテストの実行が困難だという問題があります。
テストを実行するには、何らかの方法で main 関数に相当する部分を補うしかありません。
また、この「ある言語の関数にその言語の main 関数部分を補う」機能を実装するためには (LeetCode の本体のテスト実行機能を借りる方針を除けば) それぞれの言語ごとに個別の対応をするしかありません。

main 関数部分をどう補うかについては @usk83 さんに任せます。基本的に online-judge-tools/api-client の外側の別ツールとして実装すべき機能であるためです。
選択肢はおそらく以下のみっつでしょう。

  • 「LeetCode のテスト機能を借りる」方針は楽であり、サーバとの通信機能になるので online-judge-tools/api-client に追加することもできますが、実装する価値はあまりないように思います。専用の skygragon/leetcode-cli がすでに存在しており、ユーザにとっておそらくこれの方が使いやすいためです。
  • 「LeetCode 形式のソースコードを受けとっていい感じにコンパイルしてくれるツールを書く」方針もあります。主要言語のみの対応であれば実装はかなり楽であり、また oj の利点 (テストケース生成機能など) を活かせるのでユーザにとっての価値もあります。労力対効果が最も優れているように思います。
  • 「main 関数のコードを自動生成する」こともできます。AtCoder など向けにこれをするツール online-judge-tools/template-generator がすでに存在しており、これを拡張することもできます。実装はたいへんであり、労力に見合うかは分かりませんが、最終的には最も使いやすいものになるでしょう。
    この方針だと「提出前に main 関数の部分を削除する」ような機能も必要になりますが、たいていの言語では「環境変数などを見て LeetCode 上かどうか判定して挙動を変える」「関数の部分だけ別ファイルにしておいて読み込む」などでなんとかなると思っています。

@usk83
Copy link

usk83 commented Oct 15, 2020

@kmyk ご返信ありがとうございます!

ログインまわりは面倒が多い (セキュリティのために複雑になりがちかつ頻繁に仕様が変更される)

たしかにそうですね。
軽く見てみて面倒がありそうであればスキップします。

online-judge-tools/api-client はオンラインジャッジのサーバとの通信をする機能のみを持ち、通信して得られた結果をどう活用するかについては関知しません。

online-judge-tools/api-client の役割は通信のみであり、ソースコードの中身を変更することはしません。

こちらの設計方針改めて確認しました。そのとおりですね。


テストの実行について

3つの選択肢を確認しました。
当初は1つ目の選択肢がいいかなと思っていましたが、本当に使うことを考えると個人的にテストのたびに通信されるのも嬉しくない(時間もかかる)なと思うので、 online-judge-tools/api-client とは別で後に検討しようと思います。
skygragon/leetcode-cli について存在は確認していましたが、同じインターフェースから複数のサイトに対応できることと online-judge-tools の関連ツール群と連携できることがいいなと思っています


小さく始めて早いうちにPRあげるように意識して進めてみます。
まずはサンプルテストケースの取得と解答の提出ができるところを目指します。

@usk83 usk83 linked a pull request Oct 16, 2020 that will close this issue
@koba-e964 koba-e964 linked a pull request Aug 14, 2022 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants