🦬
Emacs + Ruby での AtCoder 環境が良すぎる
Emacs と xmpfilter の組み合わせが最高
v = "hello" # => "hello"
v = v.chars.collect { |e| e.ord.to_s(2) } # => ["1101000", "1100101", "1101100", "1101100", "1101111"]
v = v.join # => "11010001100101110110011011001101111"
v = v.count("1") # => 21
るびきち氏の開発した xmpfilter (rcodetools) は、各行の評価結果をコメントに入れてくれる。このおかげで書きながら実行するような進め方ができる。
入力はソースコードに書く
if $0 == "-"
require "stringio"
$stdin = StringIO.new(<<~EOS)
hello
EOS
end
S = gets.strip # => "hello"
p S.length # => 5
$0 == "-"
のとき、すなわち xmpfilter で実行したときだけ $stdin を置き換えるようにすれば、gets は StringIO のバッファの内容を読む。もちろん、そのまま提出すればよく、ジャッジシステム側では標準入力から読み込まれる。
問題が標準入力からの受け取りになっているからといって、コマンドラインで実行する必要もないし、入力例をソースコードに含めたまま提出できるので、この柔軟性も最高である。
__END__
の下に置く方法もある
入力例を S = gets.strip # => "hello"
p S.length # => 5
__END__
hello
上のコードを xmpfilter に通すと gets に __END__
の下のテキストが入ってくる。$stdin = DATA
や DATA.gets
などと書く必要はない。これもそのまま提出できる。
テストを書きたい場合
if ENV["ATCODER"] != "1"
require "rspec/autorun"
RSpec.configure do |config|
config.expect_with :test_unit
end
RSpec.describe do
it "works" do
assert { 1 + 2 == 3 }
end
end
end
これも $0 == "-"
の条件下に入れてしまえばいいのだけど「コピペ用ライブラリファイル単体は xmpfilter で実行するとは限らないけど、AtCoder 側では実行されたくない」という、ようするに、ちょっとややこしい状況があったりする。
この場合、AtCoder の実行環境では環境変数 ATCODER
が "1"
で定義されているので、ENV["ATCODER"] != "1"
の条件下に入れておけば提出先で実行される心配がない。
したがって、競プロで TDD したっていい。提出するコードに思う存分テストを書けばいい。
関連
こちらではセットアップや一瞬で提出する手順を紹介している。
Discussion