[[AtCoder]]

差分

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

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
次のリビジョン両方とも次のリビジョン
programming_algorithm:contest_history:atcoder [2019/04/15] – [PythonでAtCoder] ikatakosprogramming_algorithm:contest_history:atcoder [2019/04/15] ikatakos
行 66: 行 66:
     * 整数だろうとリストだろうと ''print()'' で出力できるので簡易デバッグしやすい     * 整数だろうとリストだろうと ''print()'' で出力できるので簡易デバッグしやすい
     * 最近、機械学習とかで流行りなので、本業の分野によっては知識を相互に活かせる     * 最近、機械学習とかで流行りなので、本業の分野によっては知識を相互に活かせる
 +    * [[https://www.jetbrains.com/pycharm/|PyCharm]]という高機能IDEが無料で使える
     * AtCoderでは、PyPyという、Pythonコードを高速に実行する言語を使うことができる     * AtCoderでは、PyPyという、Pythonコードを高速に実行する言語を使うことができる
       * ごく稀に使えるライブラリが異なることがあるが、基本的に同じコードで動き、書き換えの必要は無い       * ごく稀に使えるライブラリが異なることがあるが、基本的に同じコードで動き、書き換えの必要は無い
       * これにより、スクリプト言語では計算量が厳しい問題でも通せたりする       * これにより、スクリプト言語では計算量が厳しい問題でも通せたりする
-    * [[https://www.jetbrains.com/pycharm/|PyCharm]]という高機能IDEが無料で使える 
   * デメリット   * デメリット
     * 遅い     * 遅い
-    * [[https://docs.python.org/ja/3/library/index.html|標準ライブラリ]]が一杯あって、覚えたら武器になる反面、覚えるのが大変 
-      * でも競プロで使うのは限られてるし、最近の高機能言語はこれぐらい普通かも 
-      * 標準ライブラリの多くはC言語で実装されていて同じ処理を直に書くより高速なので、使うことが必須になる場面も 
     * 難しい問題はPythonで挑戦している人が少ないので、参考に出来るコードが無いことが多い     * 難しい問題はPythonで挑戦している人が少ないので、参考に出来るコードが無いことが多い
 +      * %%C++%%以外のほとんどの言語に同じ事が言える
     * 他の競技プログラミングサイトでは、AtCoderほどPythonでも通せることに配慮されてない、かも     * 他の競技プログラミングサイトでは、AtCoderほどPythonでも通せることに配慮されてない、かも
  
行 88: 行 86:
  
 ++++ 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')
  
行 122: 行 184:
     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
行 130: 行 192:
         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))
  
行 137: 行 200:
 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