Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

paizaスキルチェック問題をローカルで自動テストできる環境のすゝめ(vim, python3使い向け)

$
0
0

【追記1. 02-24-2018(Sat)】
修正:parse.pyのform関数

TL;DR

以下基本の3ステップでスキルチェック問題への迅速な解答手段を提案する
1. make dl url=https://paiza.jp/path/to/problem # download problem
2. vim solve.py # type code here ...
3. make test # run all test cases

動機

  • いちいち入力例をコピーしてinputに投げ込むのが面倒だった.
  • paiza.ioのようなweb上でのコード作成とIO機能が搭載されたonlineツールの使い勝手が如何せん悪かった.
  • vim中毒ゆえの決断ry

方針

  • 解答までの時間を可能な限り短縮できる方法を実装すること.
  • スキルチェック問題で提示されている全ての入出力例をテストできること.

TODO

  • cookie情報を自動で取得しcookie.txtを作成する => chromeのcookie.txt exportを利用している.
  • 自動テスト環境
    • problem.html(スキルチェック問題)をcurl(cookie利用)する.
    • problem.htmlをparseし,問題タイトル及び入出力例を取得する.
    • 取得した情報からsolve.py, test/sample-N.{in,out}を作成する.
    • 自動テスト用のtest.shを作成.
  • make testの出力結果の色付け.
  • ユーザ定義のテストケースの追加.

環境構築

テスト環境

├── .system/
│   ├── cookie.txt
│   ├── parse.py
│   └── test.sh
├── Makefile
├── solve.py
└── test/
    ├── sample-0.ans
    ├── sample-0.in
    ├── sample-0.out
    ├── sample-1.ans
    ├── sample-1.in
    ├── sample-1.out
    ├── ...

parse用のモジュール

pip3 install beautifulsoup4 lxml

主要コード

Makefile

.PHONY: test
test:
    sh .system/test.sh

diff:
    diff --side-by-sidetest/sample-$(N).ans test/sample-$(N).out

dl:
    curl -b ./.system/cookie.txt -o ./problem.html $(url)-srm-f ./solve.py ./test/*
    python3 .system/parse.py
    rm-f ./problem.html

test.sh

#!/bin/shecho"\n-- * -- TEST -- * --\n"for f in test/*.in
do
    cat$f | python3 solve.py 1>${f%.in}.ans 2>/dev/null
    if diff -q${f%.in}.ans ${f%.in}.out >/dev/null;then
        echo"${f%.in}: Success"else
        echo"${f%.in}: Failure"fi
done
echo"\n-- * -- TEST -- * --\n"

parse.py

frombs4importBeautifulSoupdefsave(filename,body):withopen(filename,'w')asf:f.write(body)defform(text):# return ''.join(list(text.strings)[3:]).strip('\n') + '\n'th=list(text.strings)[3:]rn=map(lambdas:s.replace('\n','').strip(),th)fn=filter(lambdas:s!='',rn)return'\n'.join(fn)+'\n'defget_soup(filename,parser):withopen(filename,'r')asf:soup=BeautifulSoup(f,parser)returnsoupdefparse(soup):# Problem Titleprob_title=soup.h1.span.text# Test Casesbox1=soup.find_all("dl",class_="txt2")inputs=[bforbinbox1if"入力例"inb.text]outputs=[bforbinbox1if"出力例"inb.text]# solve.pysave('solve.py',"# "+prob_title+"\n")# test/*.{in,out}path2t='test/sample-{}.{}'forn,[i,o]inenumerate(zip(inputs,outputs)):save(path2t.format(n,'in'),form(i))save(path2t.format(n,'out'),form(o))returnsoupreadfile='problem.html'prob_soup=parse(get_soup(readfile,'lxml'))

使い方(例)

  1. chromeのcookie.txt exportでcookie情報を取得し,.system/cookie.txtに上書きする.
  2. vimを起動し,ビルドコマンドからmake dl url=https://paiza.jp/path/to/problemを実行する.
  3. make dl後にsolve.pyを開いてコードを記述し,make testでACを確認する.
  4. solve.pyの内容をpaizaスキルチェックの解答欄にコピー&ペーストしてコードを提出する.

所感

動機の煩わしい問題を解決できたため,一応満足している.
その他の痒いところに手が届かない問題を少しずつ解決していこうと思った.

まとめ

タイトルではvim, python3使い向けと銘打っていますが,その他の方にとってもpaizaスキルチェック問題を通したプログラミング学習の一助になれば幸いです.アドバイスやツッコミ,別なアプローチなど御座いましたらフィードバックよろしくお願いします.


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>