# C 연습실 · 문제 제작 안내

## 나중에 Codex에 요청하기

PDF와 이 파일, `problems/problem-template.json`, `problems/problem.schema.json`을 함께 제공하고 다음처럼 요청하세요.

> 첨부 PDF를 바탕으로 C 연습실 v1 형식의 문제 JSON을 만들어 줘. 첨부한 작성 안내와 JSON Schema를 지켜 줘. 각 문제의 ID는 c-로 시작하는 고유한 값으로 만들고, 문제 설명·입출력·조건·예제·초기 코드·채점 테스트를 넣어 줘. 배점 합계는 100점으로 해 줘. 참고 정답 C 코드는 문제 JSON과 별도 파일로 만들어 모든 테스트의 출력을 검증해 줘. PDF가 불명확하면 추측으로 채우지 말고 확인할 부분을 알려 줘.

## 파일 구조

- `index.html`: 실행 화면. 이 파일을 Chrome 또는 Edge에서 열면 됩니다.
- `app.js`: 화면·문제 관리·브라우저 저장·채점 실행 연결.
- `core.js`: 문제 검증과 출력 비교. 채점 엔진과 분리되어 있습니다.
- `vendor/runtime.js`: 함께 제공하는 PicoC 실행 도구. 인터넷 연결 불필요.
- `problems/c-001.json` 등: 기본 예제 문제의 원본.
- `problems/examples.js`: 기본 JSON에서 생성한 목록. HTML 직접 열기에서 파일 읽기 제약을 피하기 위한 사본입니다.
- `problems/problem-template.json`: 유효한 단일 문제 양식. 설명과 테스트를 새 문제에 맞게 바꿉니다.
- `problems/problem.schema.json`: 필드·타입·크기 검증 규칙. 단일 객체와 문제 배열을 모두 지원합니다.

새 JSON은 화면의 **문제 파일 관리 → 문제 JSON 불러오기**로 추가합니다. 웹사이트 코드를 수정할 필요가 없습니다. 불러온 내용은 해당 브라우저에만 저장됩니다. 기본 배포 문제를 변경하려면 개별 JSON을 수정한 후 프로젝트 루트의 `rebuild-problems.py`를 실행해 `examples.js`를 갱신하세요. 파일을 폴더에 넣기만 해서는 자동으로 목록에 나타나지 않습니다.

## 필드 규칙

| 항목 | 의미 |
|---|---|
| schemaVersion | 현재 1 |
| id | `c-001`, `c-loops-001`처럼 c- 접두사의 영문 소문자·숫자·하이픈. 중복 금지 |
| title / difficulty / tags | 문제 제목 / 난이도 문자열 / 주제 문자열 배열 |
| description / input / output | 문제 설명 / 입력 형식 / 출력 형식. HTML이나 Markdown이 아닌 일반 텍스트 |
| constraints | 조건 문자열 배열 |
| examples | input, output, 선택 항목 explanation을 갖는 배열 |
| starterCode | 풀이를 포함하지 않는 C 시작 코드 |
| timeLimitMs | 테스트별 실행 제한 100~5000 ms. 실행 도구 초기화 시간은 제외 |
| comparison | `tokens` 또는 `exact` |
| tests | input, output, points를 갖는 배열. 1~100개, 배점 합계 100 |
| source | 선택 항목. document, pages, note는 문자열 |

한 파일에는 문제 객체 하나 또는 문제 객체 배열을 넣습니다. 주석·후행 쉼표·코드 블록 표시가 없는 UTF-8 JSON으로 저장합니다. 줄바꿈은 문자열 안에서 `\n`, 큰따옴표는 `\"`로 표현합니다. 허용되지 않은 필드는 오류가 됩니다. 입력과 기대 출력의 길이는 각각 65,536자 이하입니다. 문제 파일은 5 MB 이하입니다.

### 비교와 점수

- `tokens`: 앞뒤 및 연속 공백·탭·줄바꿈 차이를 무시합니다. 숫자는 문자열로 비교하므로 `1`, `1.0`은 다릅니다. 부동소수점 오차 허용은 제공하지 않습니다.
- `exact`: CRLF/CR을 LF로 바꾼 뒤 정확히 비교합니다. 끝 줄바꿈·공백도 일치해야 합니다.
- 각 테스트를 통과하면 해당 points를 얻습니다. 오류·시간 초과·출력 초과는 0점입니다.
- 최고 점수는 현재 테스트·비교 방식·시간 제한에 해당하는 제출에서만 계산합니다.
- 최근 제출은 전체 100개까지 보관합니다. 코드·문제·기록은 브라우저 저장 공간에 저장하며, 기록 내보내기/복원으로 이동합니다.

## PDF 문제 변환 품질 규칙

1. 원문 조건·단위·범위·줄바꿈 요구를 보존하고 출처 문서와 페이지를 적습니다.
2. PDF에 없는 조건은 원문처럼 단정하지 말고 사용자에게 확인합니다. 새로 만든 연습 문제라면 source.note에 구분합니다.
3. 예제만 복사하지 말고 최솟값·최댓값·0·음수·동일값·단일 입력 등 해당 문제에 의미 있는 경계 사례를 만듭니다.
4. 테스트 기대 출력은 별도 정답 코드로 검증합니다. 테스트별 배점 합계가 100인지 확인합니다.
5. `int main()`과 표준 입출력을 쓰고 시작 코드는 정답을 포함하지 않습니다.
6. 브라우저의 실제 PicoC 엔진에서도 정답 코드를 실행해 통과하는지 확인합니다. GCC만 통과했다고 호환성을 주장하지 않습니다.
7. 정답 코드는 `solutions/` 같은 배포 폴더 밖에 둡니다. 문제 JSON에 solution 필드를 넣지 않습니다.

## 실행 환경의 범위

이 버전은 브라우저 안의 PicoC 인터프리터를 사용합니다. 기초 입출력·연산·조건문·반복문·배열 연습을 위한 구조이며 완전한 ISO C/GCC 호환 컴파일러가 아닙니다. 고급 문법, 표준 라이브러리, 자료형 크기와 실행 속도는 GCC와 다를 수 있습니다. 메모리 제한 점수 판정은 제공하지 않습니다. 부동소수점·복잡한 라이브러리·고급 자료구조 문제는 실제 엔진에서 확인 후 넣으세요.

각 테스트를 별도의 Web Worker에서 실행하고 시간이 넘으면 Worker를 종료합니다. 합계 출력은 테스트당 64 KB로 제한합니다. 초기화 대기는 최대 15초입니다. 중지한 제출은 점수로 저장하지 않습니다.

정적 HTML에는 채점 입력과 정답이 모두 포함되며 사용자가 점수와 저장 데이터를 바꿀 수 있습니다. 개인 연습용입니다. 계정별 성적 관리나 비공개 시험에는 서버 채점이 필요합니다.

## 서버 채점으로 확장할 때

`app.js`의 execute/run 연결을 서버 API 호출로 대체할 수 있습니다. 실제 시험에서는 코드만 서버로 전송하고 서버가 비공개 테스트와 점수를 관리해야 합니다. 문제 JSON의 공개 정보와 tests를 나눠 브라우저에는 tests를 보내지 않습니다. 단순히 실행만 서버로 옮기고 점수 계산을 브라우저에 남겨두면 시험용 채점이 되지 않습니다. 서버는 별도 격리 실행 공간, 네트워크 차단, 시간·메모리·출력 제한을 적용해야 합니다.

## 라이선스

실행 도구: picoc-web 1.1.0 / PicoC. 출처: https://github.com/MouhamedBourouba/picoc-web 및 https://github.com/jpoirier/picoc . 원문 라이선스는 `vendor/LICENSE-picoc.txt`에 보존했습니다.
