Emacs로 AtCoder 환경 조정
개시하다
나는 Emacs+Ruby에서 퀴즈 프로 선수를 할 때 기본적으로 필요하지 않다고 생각하지만, 동시에 비망록을 소개한다.
지령마다 뜻이 많기 때문에 의식적으로 간결하게 써서 조개껍질로 흐르게 하면 된다.
이후 Rust로 문제를 풀고 싶어 Rust용 환경도 무료로 제공할 수 있다.
루비용
atcoder-cli를 가져오기, 테스트, 제출하려면
pip3 install online-judge-tools
yarn global add atcoder-cli
acc check-oj
acc login
acc session
acc config default-test-dirname-format test
acc config default-task-choice all
acc config default-template ruby
cd ~/Library/Preferences/atcoder-cli-nodejs
mkdir ruby
cd ruby
emacsclient template.json
emacsclient main.rb
mkdir -p ~/src/procon/ruby
cd ~/src/procon/ruby
acc new math-and-algorithm
cd math-and-algorithm/001
echo "p gets.to_i + 5" > main.rb
oj t -c "ruby main.rb"
acc s main.rb -- -w 0 -y
template.json{
"task":{
"program": ["main.rb"],
"submit": "main.rb"
}
}
main.rb$stdin = DATA
n = gets.to_i
p gets.split.take(n).collect(&:to_i)
__END__
3
10 20 30
acc config default-test-dirname-format test
중요oj t -c "ruby main.rb"
움직일 수 없거나, 빠져든다거나oj t -c "ruby main.rb" -d tests
라면 나중에 움직일 줄 알았는데 어쨌든 빠졌어test
만들면 -d tests
필요없어acc s -- -w 0 -y
걸지 않아cargo-compete
는 수수께끼다그래서 template.json의submit의 지정은 무의미하다
Rust용
cargo compoet의 가져오기, 테스트, 제출 절차
mkdir -p ~/src/procon/rust
cd ~/src/procon/rust
cargo install cargo-compete
cargo compete init atcoder
cargo compete login atcoder
rustup install 1.42.0
cargo compete new math-and-algorithm
cd math-and-algorithm/bin
cargo compete open --bin 001
cat <<'EOF' > 001.rs
use proconio::input;
fn main() {
input! { n: isize, }
println!("{}", n + 5);
}
EOF
cargo compete test 001
cargo compete submit --no-test --no-watch 001
math-and-algorithm
이 더 좋다cargo compete open
에서 브라우저가 104개의 탭을 열 수 있음을 주의하십시오--bin 001
면 질문 001cargo compete submit
로 하면 표가 엉망진창이 됩니다--no-watch
Emacs 설정
CLI는 무엇이든 할 수 있지만 이런 명령은 반나절 만에 잊어버리기 때문에 아래처럼 메뉴를 꺼내 한 글자를 입력하면 실행할 수 있다.
이렇게 하면 매직 활용
transient.el
이 딱 좋아요.간단한 사용법
(transient-define-prefix my-procon-launcher ()
[
("a" "説明1" (lambda () (interactive) (message "A")))
("b" "説明2" (lambda () (interactive) (message "B")))
]
)
a
를 눌러 "A"를 표시합니다.b
를 눌러 B를 표시합니다.my-procon.el
(require 'transient)
(require 'f)
(defun my-procon-eshell-send (command)
"eshellを現在のディレクトリに移動して指定のコマンドを実行"
(interactive)
(let ((dir default-directory))
(eshell)
(goto-char (point-max))
(eshell-bol)
(unless (eobp)
(kill-line))
(insert (format "pushd '%s'" dir))
(eshell-send-input)
(insert command)
(eshell-send-input)))
(transient-define-prefix my-procon-launcher ()
"競プロ用ランチャー"
["Ruby"
("i" "問題情報入力"
(lambda ()
(interactive)
(beginning-of-buffer)
(insert (shell-command-to-string (format "ruby -e \"
require 'pathname'
require 'json'
file = Pathname('../contest.acc.json')
info = JSON.parse(file.read, symbolize_names: true)[:tasks].find { |e| e[:label].casecmp?(ARGV[0]) }
puts '# [' + info[:label] + '] ' + info[:title]
puts '# ' + info[:url]
\" %s" (f-filename (f-dirname (buffer-file-name))))))))
("o" "問題URLをブラウザで開く"
(lambda ()
(interactive)
(beginning-of-buffer)
(shell-command (format "ruby -e \"
require 'pathname'
require 'json'
file = Pathname('../contest.acc.json')
info = JSON.parse(file.read, symbolize_names: true)[:tasks].find { |e| e[:label].casecmp?(ARGV[0]) }
system 'open ' + info[:url]
\" %s" (f-filename (f-dirname (buffer-file-name)))))))
("1" "単体実行"
(lambda ()
(interactive)
(set (make-local-variable 'compile-command) "ruby main.rb")
(call-interactively 'compile)))
("t" "テスト"
(lambda ()
(interactive)
(set (make-local-variable 'compile-command) "oj t -c 'ruby main.rb'")
(call-interactively 'compile)))
("s" "提出"
(lambda ()
(interactive)
(my-procon-eshell-send "acc s main.rb -- -w 0 -y")))
("l" "問題一覧の確認"
(lambda ()
(interactive)
(my-procon-eshell-send "acc tasks")))
("c" "コンテスト名の確認"
(lambda ()
(interactive)
(my-procon-eshell-send "acc contest")))
("n" "次の問題を取得"
(lambda ()
(interactive)
(my-procon-eshell-send "acc add -c next")))
("e" "テンプレート編集"
(lambda ()
(interactive)
(find-file "~/Library/Preferences/atcoder-cli-nodejs/ruby/main.rb")))
("z" "設定"
(lambda ()
(interactive)
(dired "~/Library/Preferences/atcoder-cli-nodejs")))
]
["Rust"
("rt" "テスト (cargo compete test)"
(lambda ()
(interactive)
(set (make-local-variable 'compile-command) (format "cargo compete t %s" (f-base (buffer-file-name))))
(call-interactively 'compile)))
("rs" "提出 (cargo compete submit)"
(lambda ()
(interactive)
(my-procon-eshell-send (format "cargo compete s --no-test --no-watch %s" (f-base (buffer-file-name))))))
]
)
;; (my-procon-launcher)
;; (global-set-key (kbd "C-j p") 'my-procon-launcher)
끝맺다
자신의 상황은 대부분 아래의 순서에 따라 진행한다.
i
→문제 정보 입력o
→ 브라우저에서 질문 URL 열기1
→단일 실행t
→테스트s
→제출n
→다음 질문 받기인용하다
Reference
이 문제에 관하여(Emacs로 AtCoder 환경 조정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/megeton/articles/72d8bf71da39cb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)