Emacs에서 AtCoder 샘플 케이스를 일괄 테스트
필요한 것
emacs-quickrun의 표준 입력
위의 emacs-quickrun에서 ソースファイル名(含拡張子).qrinput
로 파일을 정의하면 해당 파일의 내용이 런타임에 표준 입력으로 전달됩니다. 그러나, 이 사양에서는 표준 입력을 1개까지만 준비할 수 있습니다.
그래서 AtCoder가 준비하는 2~3개의 테스트 케이스를 일괄적으로 테스트하는 방법을 생각했습니다.
테스트 스크립트
자세한 구현은 너무 자명하기 때문에 설명하지 않습니다.
현재 디렉토리에서 input-*.txt
및 output-*.txt
를 찾아 각각 테스트를 실행합니다.
#!/usr/bin/env bash
set -u
IFS=$'\n\t'
# run-tests.sh --- Run AtCoder test cases
# author: Seong Yong-ju <[email protected]>
red="$(tput setaf 1)"
green="$(tput setaf 2)"
yellow="$(tput setaf 3)"
bold="$(tput bold)"
reset="$(tput sgr0)"
cmd="$@"
buffile="$(mktemp)"
errfile="$(mktemp)"
shopt -s nullglob
for infile in input-*.txt; do
outfile="output-${infile:6}"
if [[ ! -f $outfile ]]; then
continue
fi
echo -n "${infile} - "
eval "${cmd[@]}" <"$infile" 1>"$buffile" 2>"$errfile"
if [[ "$?" != 0 ]]; then
cat <<EOM
${bold}${red}err${reset}
error output:
$(cat "$errfile")
EOM
break
fi
if diff -q "$buffile" "$outfile" >/dev/null; then
echo "${bold}${green}ok${reset}"
else
cat <<EOM
${bold}${yellow}ng${reset}
expected:
$(cat "$outfile")
actual:
$(cat "$buffile")
EOM
fi
done
rm -f "$buffile" "$errfile"
진짜는 TLE의 체크도 하고 싶었습니다만, 뭐 좋다.
테스트 케이스 준비
이런 식으로.
input-1.txt5 2
output-1.txt1 7
input-2.txt1 10 0
그런데 이것을 자동화하기 위해 Python에서 도구를 작성했습니다.
htps : // 기주 b. 코 m / 세이 40kr / 아 t 코로 rsc 등
$ atcoder-scraper https://atcoder.jp/contests/abc090/tasks/arc091_b
이런 느낌입니다. 그건 그렇고,이 완벽한 상위 호환 도구가 존재하는 것을 만든 후에 알았습니다.
htps : // 기주 b. 코 m / 오이 데 나미다 / 아 t 코데 r와 ls
Spacemacs의 quickrun 레이어
지금 말할 수는 없지만 이전에는 Spacemacs의 quickrun 용 레이어를 만들었습니다.ソースコードのファイル名(含拡張子).qrinput*
형식의 파일이 복수 있는 경우에 helm 로 선택할 수 있도록 하는 것입니다.
htps : // 기주 b. 코 m / 탓 40kr / s 파세마 cs - 쿠 쿠 룬
.dir-locals.el 설정
소스 코드가 있는 프로젝트의 조상 디렉토리 어딘가에 .dir-locals.el
를 준비하고 quickrun 실행 명령을 다시 씁니다.
프로젝트의 경로를 식별하기 위해 eval
를 사용합니다. 적절하게 변경하십시오.
그건 그렇고, 1.15.1
는 AtCoder의 Rust 버전입니다. rustc --emit=mir
가 없기 때문에 같은 버젼으로 Linter를 움직일 수 없다....
;;; .dir-locals.el --- -*- lexical-binding: t; -*-
;; Copyright (C) 2018 Seong Yong-ju
;; Author: Seong Yong-ju <[email protected]>
((rust-mode . ((racer-rust-src-path . "~/.rustup/toolchains/1.15.1-x86_64-apple-darwin/lib/rustlib/src/rust/src")
(eval . (setq quickrun-option-cmd-alist
(list
'(:command . "rustup")
(cons :exec
(list
"%c run --install 1.15.1 rustc %o -o %e %s"
(concat (projectile-project-root) "utils/run-tests.sh env RUST_BACKTRACE=1 %e %a")))
'(:compile-only . "%c run --install 1.15.1 rustc %o -o %e %s")
'(:remove . ("%e"))
'(:description . "Compile rust and execute via rustup")))))))
[先程のスクリプト] [実行コマンド...]
같은 느낌이군요. 테스트 케이스의 수에 관계없이 컴파일은 한 번입니다.
결과
Reference
이 문제에 관하여(Emacs에서 AtCoder 샘플 케이스를 일괄 테스트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sei40kr/items/03bf454622258811ee03
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
자세한 구현은 너무 자명하기 때문에 설명하지 않습니다.
현재 디렉토리에서
input-*.txt
및 output-*.txt
를 찾아 각각 테스트를 실행합니다.#!/usr/bin/env bash
set -u
IFS=$'\n\t'
# run-tests.sh --- Run AtCoder test cases
# author: Seong Yong-ju <[email protected]>
red="$(tput setaf 1)"
green="$(tput setaf 2)"
yellow="$(tput setaf 3)"
bold="$(tput bold)"
reset="$(tput sgr0)"
cmd="$@"
buffile="$(mktemp)"
errfile="$(mktemp)"
shopt -s nullglob
for infile in input-*.txt; do
outfile="output-${infile:6}"
if [[ ! -f $outfile ]]; then
continue
fi
echo -n "${infile} - "
eval "${cmd[@]}" <"$infile" 1>"$buffile" 2>"$errfile"
if [[ "$?" != 0 ]]; then
cat <<EOM
${bold}${red}err${reset}
error output:
$(cat "$errfile")
EOM
break
fi
if diff -q "$buffile" "$outfile" >/dev/null; then
echo "${bold}${green}ok${reset}"
else
cat <<EOM
${bold}${yellow}ng${reset}
expected:
$(cat "$outfile")
actual:
$(cat "$buffile")
EOM
fi
done
rm -f "$buffile" "$errfile"
진짜는 TLE의 체크도 하고 싶었습니다만, 뭐 좋다.
테스트 케이스 준비
이런 식으로.
input-1.txt5 2
output-1.txt1 7
input-2.txt1 10 0
그런데 이것을 자동화하기 위해 Python에서 도구를 작성했습니다.
htps : // 기주 b. 코 m / 세이 40kr / 아 t 코로 rsc 등
$ atcoder-scraper https://atcoder.jp/contests/abc090/tasks/arc091_b
이런 느낌입니다. 그건 그렇고,이 완벽한 상위 호환 도구가 존재하는 것을 만든 후에 알았습니다.
htps : // 기주 b. 코 m / 오이 데 나미다 / 아 t 코데 r와 ls
Spacemacs의 quickrun 레이어
지금 말할 수는 없지만 이전에는 Spacemacs의 quickrun 용 레이어를 만들었습니다.ソースコードのファイル名(含拡張子).qrinput*
형식의 파일이 복수 있는 경우에 helm 로 선택할 수 있도록 하는 것입니다.
htps : // 기주 b. 코 m / 탓 40kr / s 파세마 cs - 쿠 쿠 룬
.dir-locals.el 설정
소스 코드가 있는 프로젝트의 조상 디렉토리 어딘가에 .dir-locals.el
를 준비하고 quickrun 실행 명령을 다시 씁니다.
프로젝트의 경로를 식별하기 위해 eval
를 사용합니다. 적절하게 변경하십시오.
그건 그렇고, 1.15.1
는 AtCoder의 Rust 버전입니다. rustc --emit=mir
가 없기 때문에 같은 버젼으로 Linter를 움직일 수 없다....
;;; .dir-locals.el --- -*- lexical-binding: t; -*-
;; Copyright (C) 2018 Seong Yong-ju
;; Author: Seong Yong-ju <[email protected]>
((rust-mode . ((racer-rust-src-path . "~/.rustup/toolchains/1.15.1-x86_64-apple-darwin/lib/rustlib/src/rust/src")
(eval . (setq quickrun-option-cmd-alist
(list
'(:command . "rustup")
(cons :exec
(list
"%c run --install 1.15.1 rustc %o -o %e %s"
(concat (projectile-project-root) "utils/run-tests.sh env RUST_BACKTRACE=1 %e %a")))
'(:compile-only . "%c run --install 1.15.1 rustc %o -o %e %s")
'(:remove . ("%e"))
'(:description . "Compile rust and execute via rustup")))))))
[先程のスクリプト] [実行コマンド...]
같은 느낌이군요. 테스트 케이스의 수에 관계없이 컴파일은 한 번입니다.
결과
Reference
이 문제에 관하여(Emacs에서 AtCoder 샘플 케이스를 일괄 테스트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sei40kr/items/03bf454622258811ee03
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
5 2
1 7
1 10 0
$ atcoder-scraper https://atcoder.jp/contests/abc090/tasks/arc091_b
지금 말할 수는 없지만 이전에는 Spacemacs의 quickrun 용 레이어를 만들었습니다.
ソースコードのファイル名(含拡張子).qrinput*
형식의 파일이 복수 있는 경우에 helm 로 선택할 수 있도록 하는 것입니다.htps : // 기주 b. 코 m / 탓 40kr / s 파세마 cs - 쿠 쿠 룬
.dir-locals.el 설정
소스 코드가 있는 프로젝트의 조상 디렉토리 어딘가에 .dir-locals.el
를 준비하고 quickrun 실행 명령을 다시 씁니다.
프로젝트의 경로를 식별하기 위해 eval
를 사용합니다. 적절하게 변경하십시오.
그건 그렇고, 1.15.1
는 AtCoder의 Rust 버전입니다. rustc --emit=mir
가 없기 때문에 같은 버젼으로 Linter를 움직일 수 없다....
;;; .dir-locals.el --- -*- lexical-binding: t; -*-
;; Copyright (C) 2018 Seong Yong-ju
;; Author: Seong Yong-ju <[email protected]>
((rust-mode . ((racer-rust-src-path . "~/.rustup/toolchains/1.15.1-x86_64-apple-darwin/lib/rustlib/src/rust/src")
(eval . (setq quickrun-option-cmd-alist
(list
'(:command . "rustup")
(cons :exec
(list
"%c run --install 1.15.1 rustc %o -o %e %s"
(concat (projectile-project-root) "utils/run-tests.sh env RUST_BACKTRACE=1 %e %a")))
'(:compile-only . "%c run --install 1.15.1 rustc %o -o %e %s")
'(:remove . ("%e"))
'(:description . "Compile rust and execute via rustup")))))))
[先程のスクリプト] [実行コマンド...]
같은 느낌이군요. 테스트 케이스의 수에 관계없이 컴파일은 한 번입니다.
결과
Reference
이 문제에 관하여(Emacs에서 AtCoder 샘플 케이스를 일괄 테스트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sei40kr/items/03bf454622258811ee03
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
;;; .dir-locals.el --- -*- lexical-binding: t; -*-
;; Copyright (C) 2018 Seong Yong-ju
;; Author: Seong Yong-ju <[email protected]>
((rust-mode . ((racer-rust-src-path . "~/.rustup/toolchains/1.15.1-x86_64-apple-darwin/lib/rustlib/src/rust/src")
(eval . (setq quickrun-option-cmd-alist
(list
'(:command . "rustup")
(cons :exec
(list
"%c run --install 1.15.1 rustc %o -o %e %s"
(concat (projectile-project-root) "utils/run-tests.sh env RUST_BACKTRACE=1 %e %a")))
'(:compile-only . "%c run --install 1.15.1 rustc %o -o %e %s")
'(:remove . ("%e"))
'(:description . "Compile rust and execute via rustup")))))))
Reference
이 문제에 관하여(Emacs에서 AtCoder 샘플 케이스를 일괄 테스트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sei40kr/items/03bf454622258811ee03텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)