差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン次のリビジョン両方とも次のリビジョン | ||
programming_algorithm:contest_history:atcoder [2019/04/15] – [PythonでAtCoder] ikatakos | programming_algorithm:contest_history:atcoder [2019/06/10] – [Python3ライブラリ・テクニック] ikatakos | ||
---|---|---|---|
行 66: | 行 66: | ||
* 整数だろうとリストだろうと '' | * 整数だろうとリストだろうと '' | ||
* 最近、機械学習とかで流行りなので、本業の分野によっては知識を相互に活かせる | * 最近、機械学習とかで流行りなので、本業の分野によっては知識を相互に活かせる | ||
+ | * [[https:// | ||
* AtCoderでは、PyPyという、Pythonコードを高速に実行する言語を使うことができる | * AtCoderでは、PyPyという、Pythonコードを高速に実行する言語を使うことができる | ||
* ごく稀に使えるライブラリが異なることがあるが、基本的に同じコードで動き、書き換えの必要は無い | * ごく稀に使えるライブラリが異なることがあるが、基本的に同じコードで動き、書き換えの必要は無い | ||
* これにより、スクリプト言語では計算量が厳しい問題でも通せたりする | * これにより、スクリプト言語では計算量が厳しい問題でも通せたりする | ||
- | * [[https:// | ||
* デメリット | * デメリット | ||
* 遅い | * 遅い | ||
- | * [[https:// | ||
- | * でも競プロで使うのは限られてるし、最近の高機能言語はこれぐらい普通かも | ||
- | * 標準ライブラリの多くはC言語で実装されていて同じ処理を直に書くより高速なので、使うことが必須になる場面も | ||
* 難しい問題はPythonで挑戦している人が少ないので、参考に出来るコードが無いことが多い | * 難しい問題はPythonで挑戦している人が少ないので、参考に出来るコードが無いことが多い | ||
+ | * %%C++%%以外のほとんどの言語に同じ事が言える | ||
* 他の競技プログラミングサイトでは、AtCoderほどPythonでも通せることに配慮されてない、かも | * 他の競技プログラミングサイトでは、AtCoderほどPythonでも通せることに配慮されてない、かも | ||
- | ====Python3ライブラリ・テクニック==== | + | ====Python3ライブラリ・テクニック・読み物==== |
* [[http:// | * [[http:// | ||
* [[https:// | * [[https:// | ||
+ | * [[https:// | ||
行 88: | 行 87: | ||
++++ Dokuwiki記事用テンプレート自動生成Pythonスクリプト(コンテスト名・問題名・リンクを埋める)| | ++++ Dokuwiki記事用テンプレート自動生成Pythonスクリプト(コンテスト名・問題名・リンクを埋める)| | ||
+ | |||
+ | 開催中のコンテストなど、ログインが必要なコンテストでも取得するべくセッションを利用するように変更。(参考: | ||
+ | |||
+ | |||
<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 | + | CONTEST |
+ | |||
+ | USERNAME = '' | ||
+ | PASSWORD = '' | ||
+ | |||
+ | url_root = ' | ||
+ | default_cookie_path = os.path.dirname(__file__) + '/ | ||
def dokuwiki_link(url, | def dokuwiki_link(url, | ||
return ' | return ' | ||
+ | |||
+ | |||
+ | def save_cookie(session: | ||
+ | cookie_path = cookie_path or default_cookie_path | ||
+ | os.makedirs(os.path.dirname(cookie_path), | ||
+ | session.cookies.save() | ||
+ | os.chmod(cookie_path, | ||
+ | |||
+ | |||
+ | def load_cookie_to(session: | ||
+ | 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 + '/ | ||
+ | |||
+ | # ユーザー名がログインページに含まれるかで、ログイン状態を判定 | ||
+ | # もしユーザー名が一般的で非ログイン時でも当てはまってしまう場合はもう少し工夫が必要 | ||
+ | r = session.get(login_url) | ||
+ | if USERNAME in r.text: | ||
+ | # print(' | ||
+ | return True | ||
+ | |||
+ | # csrf_token取得 | ||
+ | s = bs4.BeautifulSoup(r.text, | ||
+ | csrf_token = s.find(attrs={' | ||
+ | |||
+ | post_data = { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | r = session.post(login_url, | ||
+ | if ' | ||
+ | print(' | ||
+ | print(r.text) | ||
+ | return False | ||
+ | |||
+ | save_cookie(session) | ||
+ | return True | ||
def main(): | def main(): | ||
- | | + | |
- | | + | |
+ | load_cookie_to(session) | ||
+ | |||
+ | if try_login(session): | ||
+ | pass | ||
+ | else: | ||
+ | return | ||
- | r = requests.get(tasks_url) | + | |
+ | | ||
bs = bs4.BeautifulSoup(r.text, | bs = bs4.BeautifulSoup(r.text, | ||
行 122: | 行 185: | ||
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, | bs = bs4.BeautifulSoup(r.text, | ||
title = bs.find(' | title = bs.find(' | ||
行 130: | 行 193: | ||
dokuwiki_buf.append(' | dokuwiki_buf.append(' | ||
dokuwiki_buf.append(' | dokuwiki_buf.append(' | ||
- | dokuwiki_buf.append('< | + | dokuwiki_buf.append('< |
+ | # print('' | ||
pyperclip.copy('' | pyperclip.copy('' | ||
行 137: | 行 201: | ||
if __name__ == ' | if __name__ == ' | ||
main() | main() | ||
+ | |||
</ | </ | ||