dlwocks31   1년 전

https://testcase.ac/

틀린 코드를 제출하면, 해당 문제의 제네레이터를 사용해 정답과 다른 출력이 나오는 테스트케이스를 찾아줍니다. 예를 들어서, 설탕 배달 문제는 https://testcase.ac/problems/2839 에서 반례를 찾아볼 수 있습니다.

정답 코드와 제네레이터 코드가 등록이 되어 있는 문제에 대해서는 로그인 없이도 누구나 틀린 코드를 제출해 반례를 찾아볼 수 있습니다. 또한, 로그인 된 사용자라면 누구나 정답 코드와 제네레이터 코드를 기여할 수 있습니다.

크롬 확장 프로그램을 설치하면 정답 코드와 제네레이터가 등록이 되어 있는 문제를 쉽게 확인할 수 있습니다.

지금까지는 주로 제가 질문 게시판의 질문에 대해 반례를 찾기 위해 혼자서 사용해왔는데, 여러분들의 피드백을 받고 싶어 공개합니다. 아직 초기 프로젝트라 부족한 점이 많습니다. 틀린 코드에 대해 반례를 찾고 있거나, 가지고 있는 제네레이터와 정답 코드가 있다면 한번 사용해보시고 언제든지 피드백 / 의견 / 질문 주세요!

factories   1년 전

우아!

이거 정말로 유용하겠는데요??

일일히 반례 찾을 필요가 없는 프로그램!

정말 감사합니다~!

factories   1년 전

앗 잠시만요

11000번 강의실 배정 문제

코드 입력시

2
1 5
8 17

다음과 같은 반례를 줍니다.

그런데 문제는 이것 뿐만 아니라 모든 반례가 정답출력이 1이라는 것입니다.

혹시 이게 맞는 건지 아니면 그저 제가 잘못 이해한건지 모르겠습니다.

dlwocks31   1년 전

@factories 님 안녕하세요! 우선 관심 가져주셔서 감사합니다. testcase.ac에서는 제출한 코드가 틀린 반례만 보여주고 있습니다. 때문에 제출하신 코드가 정답출력이 1인 케이스에서 많이 틀린다면, 보여지는 반례가 모두 정답출력이 1로 나올 수 있습니다. 특히 사용자의 편의를 위해 크기가 작은 반례부터 보여주고 있는데, 11000번 문제의 특성상 반례의 크기가 작을수록 정답출력이 1일 확률이 더 커질 것 같습니다.


이 말인즉슨 제출하는 코드마다 다른 반례를 보여주게 됩니다. 예를 들어서, 아래와 같이 정답이 5 이상일때만 오답을 내는 코드가 있다면 그런 경우가 반례로 출력됩니다. 한번 https://testcase.ac/problems/11000 에서 제출하셔서 확인해 보세요 :)

factories   1년 전

아...!

죄송합니다!

제가 testcase.ac가 잘못된 줄 알았네요!

답변 감사합니다!

factories   1년 전

@dlwocks31

저는 테스트로 1005번 ACM Craft 문제를 넣어 보고 있었습니다.

제네레이터 코드와

정답 코드 모두 

동일하며

python3로 작성한 코드 입니다.

(심지어 정답코드가 안되서 GPT에게 물어봐 수정된 코드입니다)

저는 테스트케이스를 추가하던 도중에,

다른 계정으로 정답 코드를 올려보니


오류

{"success": false, "reason": "RTE", "returncode": 1, "stdout": "", "stderr": "Traceback (most recent call last):\n File \"/tmp/generator/Main.py\", line 6, in <module>\n t = int(input())\nValueError: invalid literal for int() with base 10: ''\n", "time": 0.016352176666259766, "input": ""}

런타임 에러 : ValueError가 나옵니다.

백준에서는 정답 처리된 코드인데 왜 여기서는 안될까요?

참고로 테스트 케이스는 1005번 문제 예제 입력 1 입니다.

dlwocks31   1년 전

@factories 님, 제네레이터 코드란 아무런 입력도 받지 않고, 문제의 올바른 테스트케이스를 랜덤하게 출력하는 프로그램을 의미합니다. factories님이 제네레이터 란에 제출해주신 코드는 정답 코드 같습니다. 테스트케이스를 생성해주는 제네레이터 코드가 있어야 반례를 찾을 수 있습니다.

제네레이터의 예시로 1000번, A+B 문제의 제네레이터는 https://testcase.ac/codes/21 이렇게 작성할 수 있습니다.

아직 웹페이지 내에서 제네레이터란 무엇인지와 같은 개념에 대한 설명이 부족하고, 제네레이터 자체에 대한 검증도 시스템화되어 있지 않아 기여자에 전적으로 의존하고 있어서 오해할 여지가 있을 것 같은데, 이런 부가적인 내용도 차차 추가해보도록 하겠습니다.

dlwocks31   1년 전

@knen 님 기여해주신 코드 잘 확인했습니다 감사합니다 👍 앞으로도 많은 관심 부탁드려요!!

kimgihong38   1년 전

재밌는 작업물이네요!

개발하시느라 고생 많으셨습니다.

factories   1년 전

@dlwocks31

네 이번엔 제대로 된 제네레이터 코드를 완성했습니다.

다만

ACM Craft 문제 특성 상

그래프는 1과 1이 연결 되어 있으면 안되니

제네레이터 코드에서 while 문을 사용해 중복이 안 나오도록

뽑았습니다.

그러나 문제는

검증 시 제네레이터 시간초과 가 뜨더라고요

시간이 2초 이상이면 제네리이터도 강제 종료 되는 것 같은데

제네레이터 시간제한을 10초로 늘려주셨으면 합니다.

dlwocks31   1년 전

@factories 님, 작성해주신 코드는 가능한 고유한 쌍의 수보다 k가 클 경우 새로운 쌍을 찾을 수 없어 무한 루프에 빠지게 됩니다. 예를 들어, n이 2일 때 가능한 고유한 쌍은 단 하나뿐인데, k가 2 이상이면 새로운 쌍을 더 이상 찾을 수 없어 무한 루프에 빠지게 됩니다.

이렇게 무한루프에 빠질 수 있는 가능성을 방지하기 위해, 그리고 다른 코드들의 빠른 실행을 위해, 제네레이터의 시간제한은 일괄적으로 2초로 설정되어 있습니다.

dlwocks31   1년 전

@knen 님, 체커 코드는 "스페셜 저지" 태그가 달려 있는 문제에 대해 반례를 찾기 위해 필요한 코드입니다. 스페셜 저지가 필요한 문제는 한 테스트케이스에 여러 가지 정답이 가능하기 때문에, 정답 출력과의 단순 텍스트 비교로는 정답 여부를 알 수 없습니다. 이때 제출한 코드가 출력한 답이 정답인지 판정해주는 코드가 체커(checker)입니다.

예를 들어서 스페셜 저지가 있는 A/B (1008번) 문제의 체커 코드는 이렇게 구현할 수 있습니다: https://testcase.ac/codes/226

체커 코드를 C++과 testlib.h으로 작성하는 것에 대한 대한 더 자세한 정보는 https://codeforces.com/blog/entry/18431 를 참고해보시길 추천드립니다. 현재 testcase.ac에 제출하는 체커는 C++과 testlib.h을 사용하는 것을 강력히 추천드립니다.

dlwocks31   1년 전

@knen 넵 그렇습니다. 스페셜 저지 태그가 있는 문제에 대해서만 기여 창에서 체커 제출이 가능하도록 설정되어 있습니다.

factories   1년 전

@dlwocks31

말씀해 주신대로 k의 범위를 n 이하로 설정하니 통과되네요.

감사합니다.

dgddgd   1년 전

안녕하세요. 혹시 정답 코드를 남들에게 공개하지 않는 옵션이 있을까요?

기능 정말 재미있습니다 자주 쓸 듯 해요~

dlwocks31   1년 전

@dgddgd 님 안녕하세요, 해당 옵션은 아직 없지만 개발 예정 기능 중 높은 우선순위에 있습니다.

관련해서 질문이 하나 있는데, 혹시 dgddgd님이 필요로 하는 옵션이 둘 중에 어느 쪽에 더 가까울까요?

- 1. 코드의 내용 자체는 나만 볼 수 있지만, 문제에 들어갔을 때 "정답 코드" 목록에서는 모두가 선택할 수 있고, 모두가 해당 정답을 이용해 반례를 찾을 수 있다
- 2. 코드의 내용 자체를 나만 볼 수 있을 뿐만 아니라, 문제에 들어갔을 때 "정답 코드" 목록에서도 나에게만 보이고, 나만 해당 정답을 이용해 반례를 찾을 수 있다

factories   1년 전

@dlwocks31

궁금한 점이 있습니다.

혹시 시간 초과나 메모리 초과 등은 어떻게 하나요?

지금 testcase.ac에서 당신의 코드는 TLE(시간초과) 입니다!

라고 출력이 안되네요....

메모리 초과 역시 마찬가지 일 듯 합니다...

또한 번외 문제도 추가 가능한가요? (가능한 걸로 보겠습니다)

수정 부탁드려요!

dgddgd   1년 전

다 같이 쓸 수 있게 만들어진 플랫폼이니 1번이 나을 듯 합니다~ 2번으로 하면 로컬에서 실행하는 TC generator랑 다를게 아무것도 없을 거 같아요!

코드 공개를 바라지 않는 이유는 계속해서 이슈가 되고 있는 무지성 Ctrl CV를 방지하고 싶어서 입니다. 블랙박스 느낌으로 코드만 공개하지 않고, 헤딩 코드를 이용해 반례를 찾는 것은 누구에게나 가능하게 하는 것이 낫지 않을까 생각합니다.

아마 많은 사람들이 비슷한 생각을 가지고 있을 것이라고 생각을 하긴 하는데, 그래도 일단은 저의 개인적인 의견입니다! 가장 좋은 건 두 옵션을 개개인이 설정할 수 있도록 하는 기능을 추가하는 것일텐데, (private, public repo 랑 비슷하게요) 아무래도 개발 인력이 한정되어 있을테니 힘들겠죠? ㅎㅎ

sk14cj   1년 전

validator도 있으면 좋지 않을까요.

sk14cj   1년 전

아이디어는 진짜 좋은거 같아요 종종 반례 만드려고 코드포스 폴리곤에서 스트레스 테스트 돌리시는 분들을 봤는데, 이젠 여기서 하면 되겠어요

dlwocks31   1년 전

@factories 님, 제보 감사합니다. 원래는 시간 초과나 메모리 초과 같은 경우는 그에 맞는 오류가 떠야 하는데, 채점 서버 설정 오류로 InternalServerError라고 노출되고 있는 점 확인했습니다. 해당 부분 수정했고, 지금은 아래와 같이 시간 초과가 되는 코드를 제출하면 정상적으로 "시간 초과(TLE)" 같은 표시를 볼 수 있습니다!

dlwocks31   1년 전

@factories 번외 문제 추가를 따로 막아놓지는 않았습니다. 다만 대부분의 번외 문제는 반례를 찾는 의미가 크게 없을 것 같네요..

@dgddgd 아하 이해했습니다! 지금 개발 계획은 백준과 비슷하게 코드별로 공개 / 비공개를 설정할 수 있도록 하는 것입니다. 빠른 시일 내로 개발 소식 전해드릴 수 있도록 해보겠습니다ㅎㅎ

@sk14cj 오.. 로컬에서 돌리는 분들은 많이 봤어도 코포 폴리곤까지 가서 돌리는줄은 몰랐네요.. ㅎㅎ validator는 당장은 반례를 찾는 데 필수가 아니라서 빠졌는데 개발 계획에는 있습니다. 아주 장기적으로는 폴리곤과 비슷한 수준의 플랫폼을 만드는 것을 목표로 생각하고 있습니다ㅎㅎ 좋은 의견 감사합니다!!

factories   1년 전

@knen

저도요..ㅋㅋㅋ

dlwocks31   1년 전

@dgddgd 님, 코드 비공개 기능 구현해 보았습니다. 예시로 https://testcase.ac/problems/1002 번 문제 아래처럼 비공개로 설정해 보았는데 한번 시간되실때 테스트해보고 피드백 주시면 감사합니다 👍

preview

factories   1년 전

@dlwocks31

이 기능은 어려운 문제일수록 더 성능이 향상될 것 같습니다!

얼른 다른 문제에도 추가되면 좋겠네요!

dlwocks31   1년 전

@factories 네 지금 누구나 기여 창에서 자신의 코드에 대한 공개 여부 설정할 수 있으니 한번 확인해 보세요~ ㅎㅎ

preview

dgddgd   1년 전

@dlwocks31 님 기능 추가한 거 정말 좋은 것 같습니다!

저는 보통 generator는 open하고 ACcode는 닫은 채로 쓸듯 하긴 합니다 ㅋㅋ


잘 모르는 프론트 지식 가지고 열심히 끙끙거려봤는데 안 뚫리네요 ㅋㅋ

백엔드에서 유저 검증한 뒤에 보내주는 방식이겠죠? 잘 짜신 듯 합니다!

dlwocks31   1년 전

@dgddgd 아 물론 백엔드에서 보내줄때부터 비공개는 빼고 보내줍니다ㅋㅋㅋㅋㅋㅋㅋ 알아봐주시니 뿌듯하네요 👍

sk14cj   1년 전

아이디어 하나 드리자면, 경계값 테스트 데이터도 스스로 만들어지게끔 하면 좋을거 같습니다.

dlwocks31   1년 전

@sk14cj 오 이건 생각을 안해봤는데 좋은 것 같네요..! GPT로 제네레이터를 만드는 건 좀 시도해보고 있는데 잘 안되는 경우도 있더라고요. 경계값 테스트는 GPT가 조금 더 쉽게 만들 수 있을거같다는 생각이 드네요. 좋은 의견 감사합니다ㅎㅎ

sk14cj   1년 전

코드포스 폴리곤에서 백준으로 문제 옮기려고 추출할 때, 테스트 데이터 중 밸리데이터의 경계값에 해당하는 테스트 데이터가 없을 경우 경고 메시지가 출력되는걸로 기억하고 있습니다. 이를 토대로 생각해보면 구현이 불가능하지는 않을거 같네요.

dgddgd   1년 전

안녕하세요! 직접 TC를 입력하는 경우에 크기가 큰 TC 같은 경우는 파일로 올리는 것도 고려해볼만 할 거 같습니다. 

방금 6.4mb가 안 올라가더라고요... 

dlwocks31   1년 전

@sk14cj 아 벨리데이터 기반으로 경고 메세지를 출력하는 것이었군요..! 그건 몰랐는데 밸리데이터 추가하면서 한번 확인해 보겠습니다 감사합니다. 혹시 그러면 그 경고 메세지가 백준에서만 뜨고 폴리곤에서는 뜨지 않았던 걸까요..??

sk14cj   1년 전

오히려 반대입니다. BOJ stack에서는 테스트 데이터가 밸리데이터를 통과하는지만 체크하고, 테스트 데이터 경계값에 대한 경고메시지는 폴리곤에서 package 기능을 이용할 때 출력됩니다.

dlwocks31   1년 전

@dgddgd 네 맞아요.. 지금 프로젝트가 큰 테스트케이스를 전혀 고려하지 않은 구조로 되어 있어서, 그정도 크기의 테스트케이스 추가할려고 하면 아마 실패할겁니다. 


테케 올릴 때 파일 업로드를 허용하거나, 제네레이터를 한번 돌린 결과를 테스트케이스로 추가할 수 있게 하거나 이런 구조적인 수정을 조만간 해볼려고 합니다. 추가되면 또 업데이트 드려보겠습니다

dlwocks31   1년 전

@sk14cj 아하 확인 감사합니다..! 어떤 식으로 구현되어있는지 한번 확인해 봐야겠군요

sk14cj   1년 전

제가 아직 서비스를 이용하지는 않았지만, 가능하다면 실행 환경을 최대한 백준과 유사하게 하는게 좋을듯 싶습니다. 같은 코드를 실행해도 polygon과 BOJ stack의 실행속도 차이가 생각보다 크더라고요.

sk14cj   1년 전

pypy도 추가해주셔야 될거 같습니다. 제가 만든 문제들을 기여하고 있는데, 횃불이 키우기에서 정답코드가 python3으로 실행하니 TLE 판정을 받습니다.(애초에 python 유저는 pypy로 제출하라고 권하던 문제였기도 하고요.) 메세지에서 time : 1.008을 보니 백준의 언어별 추가시간이 반영이 안된거 같기도 한데 확인해보시는건 어떨까요.

dgddgd   1년 전

C 추가도 건의드립니다...!

dlwocks31   1년 전

@sk14cj 안녕하세요, 제보 감사드립니다! 우선 언어별 추가시간은 반영이 안된게 맞아서 방금 추가해놓았고, 지금 32378번 돌려봤을 때 잘 돌아가는 것 확인했습니다.
지금은 추가 시간 적용이 반례 찾기 창에만 되어있고, 아직 기여 창에서 검증하는 단계에는 안되어있습니다. 그리고 추가 시간 없음 / 특정 언어 시간 제한이 있는 문제 같은 경우도 (ex. #11279) 아직 정상 적용이 되어있지 않으니 참고 부탁드립니다.

pypy / C 추가도 진행해 보겠습니다! @dgddgd

dlwocks31   1년 전

@sk14cj @dgddgd PyPy3 / C99도 추가되었습니다. 제가 테스트했을 땐 잘 되었는데 한번 쓰시면서 확인해주시면 감사합니다  🙏

언어가 점점 많아지니 백준이랑 비슷하게 언어 순서 설정도 언젠가 조만간 해봐야겠군요..

factories   1년 전

@dlwocks31

지금 태그 지원하는게

스페셜 저지 뿐이더라고요

꽤 자주 나오는 서브태스크 , 점수 , 전체 채점

등 부분 점수가 나오는 문제 또는

자주는 아니여도 나오는

투 스텝, 인터랙티브

정도는 추가 부탁드립니다.

제가 인터랙티브도 도전 하고 있어서...

dlwocks31   1년 전

@factories 의견 감사합니다! 그런 특수한 문제 유형도 차차 추가될 수 있도록 해보겠습니다

factories   1년 전

@dlwocks31

14503번 제네레이터 수정 부탁드립니다.

문제의 조건 중 하나가, 로봇 청소기가 있는 곳은 비워둔다고 했는데

로봇 청소기가 있는 곳이 하나 같이 벽이 있네요...

dlwocks31   1년 전

@factories 안녕하세요, 제보해 주셔서 감사합니다. 지금 어떤 상황에서 그렇게 잘못되게 나오는지 모르겠어서 그런데 혹시 구체적인 반례 알려주실 수 있으실까요? https://testcase.ac/codes/92 정답 코드에서 52줄에 assert 추가해서도 테스트해봤는데 문제를 못 찾았네요

factories   1년 전

앗 제가 이상하게 이해 했네요

죄송합니다...ㅠㅠㅠㅠㅠ

erick12   1년 전

연속합이 지금껏 없었단 사실..

legna728   10달 전

@dlwocks31

19532번 제너레이터 수정 부탁드립니다

문제의 답인 x,y가 정수인 경우만 입력이 되는 문제인데 문제의 답이 정수가 아닌 값도 생성되는 것 같습니다

dlwocks31   10달 전

@legna728

해당 문제 업데이트되었습니다. https://testcase.ac/problems/19532

오류 제보 감사합니다.

legna728   10달 전

@dlwocks31

14425번 제너레이터 수정 부탁드립니다

M개 줄에 걸쳐 검사해야 하는 문자열이 중복되는 경우가 없는 것 같습니다

dlwocks31   10달 전

@legna728

제너레이터가 추가되었습니다. https://testcase.ac/problems/14425

필요한 제너레이터가 없는 경우에는 누구나 로그인 후 추가할 수 있으니 많은 사용 부탁드립니다. 감사합니다.

dongheon0916   9달 전

Kotlin 언어도 추가 건의 드립니다

dlwocks31   9달 전

@dongheon0916

의견 감사합니다. Kotlin 언어가 추가되었으니 한번 사용해 보세요. 더불어 Go / Rust도 추가되었습니다.

댓글을 작성하려면 로그인해야 합니다.