[openlecture] PC^2 external validator

  • Being
    Being

    PC^2는 자체 validator class를 내장하고 있습니다. 그런데 이 클래스가 매우 빈약하고 골치아픕니다. 이 클래스로 인한 문제는 지난 알고스팟 1주년 기념 모의고사에서의 대량 리저지 사태가 대표적입니다. 이 리저지에는 두 가지 요인이 있었는데,

    • 저지의 답안이 500kb를 넘는데, 사용자의 답안으로부터 출력을 얻어낼 때에 500kb를 넘겨 강제로 500kb에서 잘림
    • trailing space (맨 뒤에 뒤따라오는 공백들)를 무시하지 않아 맨 뒤에 공백을 저지의 답안과 다르게 출력한 경우 WA로 처리되는 현상 이 두 가지입니다. 후자의 경우 제가 2007년 베트남 다낭 사이트 리져널에 갔을 때....(남자는 웁니다) A를 fastest? 2nd fastest?로 냈는데 WA가 나와서 대회 시간 내내 고민하다가 297분만에 맨 뒤에 공백을 지우니 Yes가 된 경험에도 연결되어 있네요. (당시 그쪽 환경은 완전히 automated judge여서, 리저지따위 할 생각이 없었죠..) 그래서 지난 알고스팟 모의고사 때는 (두 번째 요인 관련해서) 답안을 모두 손으로...까진 아니고 저의 경우는 생성된 결과 파일을 vim으로 띄워 %s/ $//g하고 fc를 사용하여 일일이 비교했었는데, 다행히도 PC^2는 external validator를 지원합니다. 이 external validator는 생각보다 간단합니다.
    • PC^2에서 external validator를 설정하면, execution 이후에 validator를 실행합니다.
    • 이 validator에는 input file, output file, answer file, result file path, validator 총 다섯 개의 변수가 전달될 수 있습니다. 이 변수들은 PC^2의 문제 설정에서 Validator Command Line에 지정될 수 있습니다.
    • 각각의 변수가 의미하는 바는 다음과 같습니다.
    • input file {:infile} 은 말 그대로 입력 파일입니다. 
    • output file {:outfile} 은 실행하여 만들어낸 사용자의 답안입니다.
    • answer file {:ansfile} 은 저지의 답안입니다.
    • result file path {:resfile} 는 PC^2가 임의로 지정하는 경로로써, 이 경로에 표준 형식에 맞는 XML을 출력하면 됩니다(새로운 파일을 생성하면 됩니다).
    • validator {:validator} 는 PC^2의 problem 설정에서, validator program으로 지정하는 파일입니다. 이 파일은 서버에 보관되고 있다가 저지가 답안을 채점할 때마다 복사됩니다. 이 성질 때문에 파일은 여러 가지로 유용하게 사용할 수 있습니다. 
    • 먼저, 이 파일을 (이를테면) validator.exe라는 파일로 둠으로써 저지가 미리 이러한 파일들을 시스템에 설치하지 않고도 채점할 때 자동으로 서버에서 내려받아 실행하게 할 수 있습니다.
    • 이 파일을 어떤 다른 validator에 인자로 전달할 수 있습니다. 예를 들어서 validator로 지정된 파일이 루비 스크립트 파일이라면, ruby {:validator} ... 와 같이 실행시킬 수 있습니다. 위에서와 마찬가지로 이 파일은 매번 복사됩니다.
    • 이 파일을 무시해도 됩니다. 그런데 이 파일이 없으면 귀찮은 문제가 발생하므로, 아무 파일이나 설정하면 됩니다. (단, 설정한 파일의 길이가 0이면 또 칭얼대니 1바이트 이상인 파일로 설정) 이렇게 설정한 경우, 모든 저지들의 특정한 절대경로에 validator들을 준비하거나 저지들이 각자 PATH 변수를 등록하게 해서 실행해야 할 것입니다.
    • result file에 저장되어야 하는 xml의 형식은 다음과 같습니다. (xsd가 있긴 한데 그런 거 필요 없을 정도로 간단합니다)
      ~~~ xml

    <?xml version="1.0"?>
    <result outcome="###" security="@@@">%%%</result>

    <ol><li>###에는 PC^2에 지정된 result message를 그대로 써 주시면 됩니다. (default message에는 "Yes", "No - Wrong Answer" 등이 있겠죠).
    </li><li>@@@에는 이 파일의 이름 - {:resfile} - 을 그대로 써 주시면 됩니다. 보안을 위해 만든 부분이라고 하네요. (e.g. 784XRSAM.txt)</li><li>%%%에는 메세지를 써 주실 수 있는데, 큰 의미는 없습니다.</li>
    첨부된 파일은 이번 알고스팟 모의고사에서 (아마도) 사용될 validator입니다. JM님이 알고스팟 저지를 완성하시면 용도폐기되겠습니다만.. ruby로 코드되어 있습니다(만 이딴걸 루비 코드냐고 할 정도로 루비답지 못합니다...ㅠㅠ). 커맨드라인 옵션 때문에 gem을 하나 사용합니다. gem install -r OptionParser 명령으로 설치해 주시면 됩니다. 현재 작업 디렉토리와 관계없이 잘 작동해서, PC^2에서 설정할 때에는 ruby c:\validator\main.rb와 같이 설정해 주시면 됩니다. 여러 개의 파일로 구성된 까닭에, {:validator} 변수를 적절히 사용하기는 어렵습니다. 아래는 option list page입니다.
    [spoiler="더 보기..."]OPTIONS
        --validator,-v
            Specifies validator class name (default: Validator)
        --input,-i
            Specifies input data file
        --output,-o
            Specifies contestant's output file
        --answer,-a
            Specifies judge's answer file
        --result,-r
            Specifies path to generate xml-formatted file
        --left-strip,-L
            Set to strip any leading whitespaces
        --right-strip,-R
            Set to strip any trailing whitespaces
        --ignore-empty-lines,-E
            Set to ignore all empty lines
        --remove-whitespace,-A
            Set to remove all whitespaces
        --ignore-case,-C
            Set to ignore cases
        --help,-h
            Prints this page
    [/spoiler]
    예를 들어,
    [spoiler="더 보기..."]ruby main.rb -i input.txt -o output.txt -a output.ans -r result.xml
    [/spoiler]
    와 같이 하면 아무런 옵션 없이 line-by-line 비교를 수행합니다 (공백까지 철저히). 만약에 trailing space를 무시하고 싶다면 -R 옵션을 주시면 됩니다. 그렇게 PC^2에서 설정할 때에는 
    [spoiler="더 보기..."]ruby c:\validator\main.rb -i {:infile} -o {:outfile} -a {:ansfile} -r {:resfile} -R
    [/spoiler]
    위와 같이 설정하면 됩니다.
    -v 옵션은 validator class를 지정하는 옵션인데, 압축을 풀어 보시면 알겠지만 ./extras/ 에 FloatingPointValidator.rb 파일이 있습니다. 이 파일에는 실수 오차를 고려하는 FloatingPointValidator 클래스가 구현되어 있습니다. 그래서, -v FloatingPointValidator 옵션을 주면 이 클래스를 사용하여 비교를 수행합니다. 이외에 추가하고 싶으신 클래스가 있으시다면 이 파일을 참조해서 구현하신 후, ./extras/ 디렉토리에 넣어 주시면 main.rb가 스캔하여 모든 파일을 불러옵니다. ./tests/ 디렉토리에는 unit test가 있습니다.
    사족: -v 옵션에서 지정한 파일만 require 하게 구현했으면 훨씬 깔끔했을텐데 아쉽네요. 더 손대기는 귀찮고..
    <div>[이 글은 과거 홈페이지에서 이전된 글입니다. <a href="http://algospot.andromeda-express.com/zbxe/openlecture/51625">원문보기</a>]</div>

    15년 전
3개의 댓글이 있습니다.
  • JongMan
    JongMan

    오오오 멋지다 빙밸리데이터 오래오래 쓸수 있게 저지는 일단 뒤로 [...]


    15년 전 link
  • 고글
    고글
    • 저지의 답안이 500kb를 넘는데, 사용자의 답안으로부터 출력을 얻어낼 때에 500kb를 넘겨 강제로 500kb에서 잘림 <= 8.7버전에선 요부분에 대해 세팅하는게 있었는데 9.0에선 없네요.메일보내면 고쳐줄려나...;;;

    15년 전 link
  • Being
    Being

    FloatingPointValidator에서 to_f 정규식 매칭에서 단어 전체를 매칭하도록 수정했습니다.


    15년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.