[[AtCoder]]

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
次のリビジョン両方とも次のリビジョン
programming_algorithm:contest_history:atcoder [2019/04/15] – [PythonでAtCoder] ikatakosprogramming_algorithm:contest_history:atcoder [2019/06/13] ikatakos
行 16: 行 16:
     * コンテスト終了後に復習しやすい     * コンテスト終了後に復習しやすい
       * 他の人の解答が見られる       * 他の人の解答が見られる
-      * 多くの問題に対して、出題者または運営による解説PDFがアップロードされる +      * 定例的なコンテストに対して、出題者または運営による解説PDFがアップロードされる 
-      * YouTubeで解説生放送が開かれる+      * 定例的なコンテストに対して、YouTubeで解説生放送が開かれる
  
 =====ステキ周辺サービス(公式とは限らない)===== =====ステキ周辺サービス(公式とは限らない)=====
行 61: 行 61:
  
   * メリット   * メリット
-    * 学びやすい 
     * 環境構築しやすい     * 環境構築しやすい
     * 記述量が少ない     * 記述量が少ない
-    * 整数だろうとリストだろうと ''print()'' で出力できるので簡易デバッグしやすい 
     * 最近、機械学習とかで流行りなので、本業の分野によっては知識を相互に活かせる     * 最近、機械学習とかで流行りなので、本業の分野によっては知識を相互に活かせる
     * [[https://www.jetbrains.com/pycharm/|PyCharm]]という高機能IDEが無料で使える     * [[https://www.jetbrains.com/pycharm/|PyCharm]]という高機能IDEが無料で使える
-    * AtCoderでは、PyPyという、Pythonコードを高速に実行する言語を使うことができる +    * AtCoderでは、PyPyという、Pythonコードを高速に実行する実行時コンパイル言語を使うことができる 
-      * ごく稀に使えるライブラリがることがあるが、基本的に同じコードで動き、書き換えの必要は無い+      * NumPyなど一部のライブラリが使えが、基本的に同じコードで動き、書き換えの必要は無い
       * これにより、スクリプト言語では計算量が厳しい問題でも通せたりする       * これにより、スクリプト言語では計算量が厳しい問題でも通せたりする
   * デメリット   * デメリット
     * 遅い     * 遅い
 +      * 高速化のために、あまりアルゴリズムの本筋とは関係ない言語固有の高速化知識が必要になることがある
     * 難しい問題はPythonで挑戦している人が少ないので、参考に出来るコードが無いことが多い     * 難しい問題はPythonで挑戦している人が少ないので、参考に出来るコードが無いことが多い
-      * %%C++%%以外のほとんどの言語に同じ事が言える+      * %%C++%%、Java以外のほとんどの言語に同じ事が言えるかも
     * 他の競技プログラミングサイトでは、AtCoderほどPythonでも通せることに配慮されてない、かも     * 他の競技プログラミングサイトでは、AtCoderほどPythonでも通せることに配慮されてない、かも
 +      * AtCoderでは、特にABCなどでは、遅い言語にも配慮されている感じがする(※個人の感想)
 +      * だからといって別に全ての言語で通せる保証が無いことはきちんと明言されているので、通らなくても文句は言わない
 +    * Pythonの強みである豊富な第三者モジュールがあまり使えないので、自前で実装する必要があることがある
  
 +競技プログラミングを「競技」として勝ちにこだわるのであれば、最初から %%C++%% やるか、少なくともPythonと平行で %%C++%% などを書けた方がいいだろなあという気はする。
  
-====Python3ライブラリ・テクニック====+Python他の高機能言語も、計算量が問題にならない問題に対しては簡単に素早く書けるというメリットはあるとは思う。 
 +従って理想を言うなら言語の選択肢は多い方がいいが、その判断が競技中に適切に出来るかというと……まぁ難しいので、基本は高速な言語を優先した方がいい。 
 + 
 +そうでは無くて、言語の習得がてらとか、元からPythonやってたとかで、敷居低く楽しみながら参加するのであれば、「Pythonでも十分戦えるよ」ということは言えると思う。 
 + 
 + 
 +====Python3ライブラリ・テクニック・読み物====
  
   * [[http://tjkendev.github.io/procon-library/|yaketake08's 実装メモ]](yaketake08氏)   * [[http://tjkendev.github.io/procon-library/|yaketake08's 実装メモ]](yaketake08氏)
   * [[https://htkb-procon.hateblo.jp/entry/2019/01/07/211213|AtCoder青になるまで使ったPythonパフォーマンス小ネタ]](htkb氏)   * [[https://htkb-procon.hateblo.jp/entry/2019/01/07/211213|AtCoder青になるまで使ったPythonパフォーマンス小ネタ]](htkb氏)
 +  * [[https://nagiss.hateblo.jp/entry/2019/03/12/012944|Python で AtCoder を遊ぶときに知ってると便利かもしれないこと - 菜]](nagiss氏)
 +  * [[https://qiita.com/Kentaro_okumura/items/a6917572756a2e3c0da9|PythonでAtCoder青になるまで -Pythonで競プロやるときに気をつけること- - Qiita]](okumura氏)
  
  
行 86: 行 97:
  
 ++++ Dokuwiki記事用テンプレート自動生成Pythonスクリプト(コンテスト名・問題名・リンクを埋める)| ++++ Dokuwiki記事用テンプレート自動生成Pythonスクリプト(コンテスト名・問題名・リンクを埋める)|
 +
 +開催中のコンテストなど、ログインが必要なコンテストでも取得するべくセッションを利用するように変更。(参考: [[https://github.com/kyuridenamida/atcoder-tools|GitHub - kyuridenamida/atcoder-tools: Convenient modules & tools for AtCoder users, written in Python 3.5]])
 +
 +
  
 <sxh python> <sxh python>
 import os import os
 +from typing import Optional
 +from http.cookiejar import LWPCookieJar
 +import pyperclip
 import requests import requests
 import bs4 import bs4
-import pyperclip 
  
-contest = 'abc001'+CONTEST = 'abc124' 
 + 
 +USERNAME = '' 
 +PASSWORD = '' 
 + 
 +url_root = 'https://atcoder.jp' 
 +default_cookie_path = os.path.dirname(__file__) + '/session.txt'
  
  
 def dokuwiki_link(url, title): def dokuwiki_link(url, title):
     return '[[' + url + '|' + title + ']]'     return '[[' + url + '|' + title + ']]'
 +
 +
 +def save_cookie(session: requests.Session, cookie_path: Optional[str] = None):
 +    cookie_path = cookie_path or default_cookie_path
 +    os.makedirs(os.path.dirname(cookie_path), exist_ok=True)
 +    session.cookies.save()
 +    os.chmod(cookie_path, 0o600)
 +
 +
 +def load_cookie_to(session: requests.Session, cookie_path: Optional[str] = None):
 +    cookie_path = cookie_path or default_cookie_path
 +    session.cookies = LWPCookieJar(cookie_path)
 +    if os.path.exists(cookie_path):
 +        session.cookies.load()
 +        return True
 +    return False
 +
 +
 +def try_login(session):
 +    login_url = url_root + '/login'
 +
 +    # ユーザー名がログインページに含まれるかで、ログイン状態を判定
 +    # もしユーザー名が一般的で非ログイン時でも当てはまってしまう場合はもう少し工夫が必要
 +    r = session.get(login_url)
 +    if USERNAME in r.text:
 +        # print('Already logged in.')
 +        return True
 +
 +    # csrf_token取得
 +    s = bs4.BeautifulSoup(r.text, 'lxml')
 +    csrf_token = s.find(attrs={'name': 'csrf_token'}).get('value')
 +
 +    post_data = {
 +        "csrf_token": csrf_token,
 +        "username": USERNAME,
 +        "password": PASSWORD,
 +    }
 +    r = session.post(login_url, data=post_data)
 +    if 'tokens mismatch.' in r.text:
 +        print('Login error.')
 +        print(r.text)
 +        return False
 +
 +    save_cookie(session)
 +    return True
  
  
 def main(): def main():
-    url_root = 'https://beta.atcoder.jp' +    # セッション開始 
-    tasks_url url_root + '/contests/{contest}/tasks'.format(contest=contest)+    session requests.Session() 
 +    load_cookie_to(session) 
 + 
 +    if try_login(session): 
 +        pass 
 +    else: 
 +        return
  
-    r = requests.get(tasks_url)+    tasks_url = url_root + f'/contests/{CONTEST}/tasks' 
 +    r = session.get(tasks_url)
     bs = bs4.BeautifulSoup(r.text, 'lxml')     bs = bs4.BeautifulSoup(r.text, 'lxml')
  
行 120: 行 195:
     for problem_url in problem_urls:     for problem_url in problem_urls:
         problem_url = url_root + problem_url         problem_url = url_root + problem_url
-        r = requests.get(problem_url)+        r = session.get(problem_url)
         bs = bs4.BeautifulSoup(r.text, 'lxml')         bs = bs4.BeautifulSoup(r.text, 'lxml')
         title = bs.find('title').text         title = bs.find('title').text
行 128: 行 203:
         dokuwiki_buf.append('==== 例 ====\n\n\n')         dokuwiki_buf.append('==== 例 ====\n\n\n')
         dokuwiki_buf.append('==== 解法 ====\n\n\n')         dokuwiki_buf.append('==== 解法 ====\n\n\n')
-        dokuwiki_buf.append('<sxh python>\n\n\n</ sxh>\n\n\n')+        dokuwiki_buf.append('<sxh python>\n\n\n< /sxh>\n\n\n')
  
 +    # print(''.join(dokuwiki_buf))
     pyperclip.copy(''.join(dokuwiki_buf))     pyperclip.copy(''.join(dokuwiki_buf))
  
行 135: 行 211:
 if __name__ == '__main__': if __name__ == '__main__':
     main()     main()
 +
 </sxh> </sxh>
  
programming_algorithm/contest_history/atcoder.txt · 最終更新: 2019/11/06 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0