# My Ruby tools for AtCoder author : QWYNG(大澤広朗) institution : SmartHR LT会 May, 2024 theme : rabbit # AtCoderにRubyで参加する * AtCoder: 競技プログラミングのコンテストを開催しているサービス * https://atcoder.jp * Rubyで参加する際に利用している自作ツールの自慢をします * Rubyを使ったアルゴリズムの解説はしません # AtCoderに参加するときの流れ 1. サンプル入出力からテストを生成する 2. 問題を解く 3. デバックする 4. テストを通す 5. 提出 * 1と3で自作ツールを使っています # サンプル入出力からテストを生成する * green_day * https://github.com/QWYNG/green_day * 自作のスクレイピングツール * 問題の入出力からテストを自動生成してくれます * コンテスト開催中等クッキーが必要な場合にも対応しています # green_dayのデモ(1) ![abc150a](./abc150a.png){:width='1280' height='720'} # green_dayのデモ(2) ```shell $ bundle exec green_day new abc150 ``` ```shell abc150 ├── A.rb ├── B.rb ├── C.rb ├── D.rb ├── E.rb ├── F.rb └── spec ├── A_spec.rb ├── B_spec.rb ├── C_spec.rb ├── D_spec.rb ├── E_spec.rb └── F_spec.rb ``` # green_dayのデモ(3) ```ruby RSpec.describe 'abc150/A.rb' do it 'test with "2 900\n"' do io = IO.popen('ruby abc150/A.rb', 'w+') io.puts("2 900\n") io.close_write expect(io.readlines.join).to eq("Yes\n") end it 'test with "1 501\n"' do io = IO.popen('ruby abc150/A.rb', 'w+') io.puts("1 501\n") io.close_write expect(io.readlines.join).to eq("No\n") end it 'test with "4 2000\n"' do io = IO.popen('ruby abc150/A.rb', 'w+') io.puts("4 2000\n") io.close_write expect(io.readlines.join).to eq("Yes\n") end end ``` # デバックする(1) テストで入出力をキャプチャしているのでREPLが動かない ```shell > rspec abc150/spec/A_spec.rb FFF Failures: 1) abc150/A.rb test with "2 900\n" Failure/Error: expect(io.readlines.join).to eq("Yes\n") ~~~~~~~~ snip ~~~~~~~~ (compared using ==) Diff: @@ -1,9 +1,18 @@ + +From: abc150/A.rb @ line 3 : + + 1: k, x = gets.split.map(&:to_i) + 2: check_complition = '予測変換もいい感じになってほしいなぁ' + => 3: binding.irb + 4: puts k * 500 >= x ? 'Yes' : 'No' +Switch to inspect mode. + Yes ``` # デバックする(2) * リモートプロセスのIRBを別のプロセスから操作することができるGemを作りました * https://github.com/QWYNG/irb-remote # irb-remoteのデモ(1) ![irb-remote](./img.png){:width='1280' height='720'} # irb-remoteの先行研究 * dRubyを使ってオブジェクトをプロセス間でやりとりしています * dRubyでREPLを行う発想は先人の方を参考にしたものです * https://github.com/Mon-Ouie/pry-remote * https://github.com/iguchi1124/irb_remote * 今回はRelineを使いたかったので自作しました # まとめ * 皆さんもぜひ使ってみてください