Emacs에서 AtCoder 샘플 케이스를 일괄 테스트

10564 단어 AtCoderEmacs
아무래도, 퇴직 아드카레를 쓰려고 엔트리만 해 도망친 사람입니다.

필요한 것


  • Emacs
  • 좋아하는 언어 환경 (내 경우에는 Rust)
  • emacs-quickrun

  • emacs-quickrun의 표준 입력



    위의 emacs-quickrun에서 ソースファイル名(含拡張子).qrinput로 파일을 정의하면 해당 파일의 내용이 런타임에 표준 입력으로 전달됩니다. 그러나, 이 사양에서는 표준 입력을 1개까지만 준비할 수 있습니다.
    그래서 AtCoder가 준비하는 2~3개의 테스트 케이스를 일괄적으로 테스트하는 방법을 생각했습니다.

    테스트 스크립트



    자세한 구현은 너무 자명하기 때문에 설명하지 않습니다.
    현재 디렉토리에서 input-*.txtoutput-*.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.txt
    5 2
    

    output-1.txt
    1 7
    

    input-2.txt
    1 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")))))))
    
    [先程のスクリプト] [実行コマンド...] 같은 느낌이군요. 테스트 케이스의 수에 관계없이 컴파일은 한 번입니다.

    결과



    좋은 웹페이지 즐겨찾기