이 문서는 README.md의 한국어 번역본입니다.
GolfScript 전용 숏코딩 저지입니다. 제출한 솔루션은 정확한 UTF-8 바이트 수 기준으로 순위가 매겨지며, 바이트 수가 적을수록 유리합니다.
- Next.js (App Router, TypeScript)
- Tailwind CSS - Gemini 스타일의 심해 다크 UI와 오로라 네온 포인트
- Supabase (PostgreSQL) - 데이터 저장 + Row Level Security
- Piston 공개 API - GolfScript 코드 실행
app/ # 라우트, 페이지, API 핸들러, 메타데이터, OG 이미지
components/ # 공용 UI 컴포넌트
lib/ # 도메인 로직, 연동, 유틸리티
scripts/ # 시드/검증/빌드 보조 스크립트
sql/ # Supabase 스키마와 시드 SQL
-
의존성 설치
npm install
-
Supabase 설정
환경 변수 템플릿을 복사한 뒤 프로젝트 값으로 채웁니다.
cp .env.example .env.local
변수 위치 설명 NEXT_PUBLIC_SUPABASE_URL클라이언트 + 서버 프로젝트 URL NEXT_PUBLIC_SUPABASE_ANON_KEY클라이언트 익명 공개 키 SUPABASE_SERVICE_ROLE_KEY서버 전용 숨겨진 테스트케이스를 읽기 위해 RLS를 우회합니다. 절대 노출하지 마세요. PISTON_API_URL서버 기본값은 https://emkc.org/api/v2/execute입니다. -
스키마 생성
Supabase SQL Editor에서
sql/schema.sql을 실행합니다. 이 스크립트는 4개 테이블,leaderboard뷰, RLS 정책, 그리고 샘플 + 숨겨진 테스트케이스가 포함된 3개 문제 시드를 생성합니다. -
실행
npm run dev
test_cases에는 SELECT RLS 정책이 없습니다. 따라서 anon 클라이언트는 절대 해당 데이터를 읽을 수 없습니다.- 제출 API는 서버 측에서만
lib/supabaseAdmin.ts의 service role 클라이언트를 사용해, 숨겨진 케이스를 포함한 모든 테스트케이스를 조회합니다. - API 응답에는 각 케이스에 대해
{ index, hidden, verdict }만 노출되며, 숨겨진 stdin/stdout은 브라우저로 전송되지 않습니다.
- 원본 코드의 정확한 UTF-8 바이트 수를 계산합니다.
- 사용자를 찾거나 생성하고, 문제 유효성을 확인합니다.
- 모든 테스트케이스를 서버 전용으로 가져옵니다.
- 각 케이스를 Piston에서 병렬 실행합니다.
- 출력 결과를 trim한 뒤 비교하여
AC/WA를 결정하고, 신호/종료 코드에 따라TLE/RE/CE로 매핑합니다. - 최종 verdict를 집계해
submissions에 저장하고 결과를 반환합니다.