버전이 기록된 시뮬레이터 데이터: 포지션 100개, 모델 안에서 유효한 결과 249개, 빈 값 또는 거부 결과 151개(총 400개 평가). 버전이 지정된 결정론적 물리 캐시의 출력이며 실제 테이블 성공률 연구가 아닙니다.
방법론
공개 데이터는 버전이 지정된 솔버 캐시에서 생성됩니다. 다운로드를 독립적으로 검증할 수 있도록 엔진 프로필, 소스 지문, 개수와 SHA-256을 기록합니다. 각 결과는 시뮬레이터 결과이며 실제 테이블 성공 확률을 뜻하지 않습니다.
버전이 기록된 시뮬레이터 데이터
- 엔진 계약
3ball-carom-match-v2 / physics 2.0.0 / solver 4.2.0- 데이터셋 SHA-256
256a8ec7e7e9a66d907bd43f5fdd6b87628dc067fd9621f2d2ebd2472c3e43ed- 유효한 솔버 결과
- 249
- 비어 있거나 거부된 결과 슬롯
- 151
- 검토 상태
machine-assisted-reviewed
필드 사전
position: cueIdx, mode, firstIdx, balls, shots · ball: color, p.x, p.y · shots[]: shot {angle, power, sideSpin, topSpin}, label, length, margin, pct, tol, perturbPct, cushions.
공개 다운로드 검증
파일 무결성과 개수를 확인합니다. 물리 엔진 재생성, 샷의 독립 검증 또는 실제 테이블 정확성의 증명은 아닙니다. 전체 생성 환경은 공개 배포하지 않습니다.
아래를 verify_3ball.py로 저장하고 Python 3으로 실행하세요. 표준 라이브러리만 사용해 3ball.app의 공개 JSON을 받으며 계정이나 프로젝트 사본이 필요 없습니다.
import hashlib, json, urllib.request
BASE = 'https://3ball.app/'
ALLOWED = {'data/solutions_cache.json', 'data/solutions_cache_v3.json'}
def download(path):
with urllib.request.urlopen(BASE + path, timeout=30) as response:
return response.read(2_000_001)
manifest = json.loads(download('data/research-manifest.json'))
for key in ('source', 'portfolioBeta'):
record = manifest if key == 'source' else manifest[key]
source = record['source']
assert source['path'] in ALLOWED, 'Unexpected dataset path'
raw = download(source['path'])
assert len(raw) == source['bytes'], 'File size mismatch'
assert hashlib.sha256(raw).hexdigest() == source['sha256'], 'Hash mismatch'
data = json.loads(raw)
positions = list(data['positions'].values())
assert len(positions) == record['counts']['positions'], 'Position count mismatch'
if key == 'source':
shots = [s for p in positions for s in p['shots']]
assert sum(s is not None for s in shots) == record['counts']['validShots']
assert sum(s is None for s in shots) == record['counts']['rejectedSlots']
else:
continuations = list(data['continuations'].values())
assert len(continuations) == record['counts']['continuations']
solutions = [s for p in positions + continuations for s in p['solutions']]
assert sum(s is not None for s in solutions) == record['counts']['solutions']
print(source['path'], 'OK', record['counts'])범위와 한계
이 자료는 결정론적 시뮬레이터 데이터이며 실제 테이블 성공률 연구가 아닙니다. 공개 캐시는 고정된 V2 프로필을 사용합니다. Physics V3는 독립적인 실측을 기다리고 있습니다. 마진과 강건성은 모델 진단값이며 현실 확률이 아닙니다.
라이선스와 개인정보
다운로드에는 계산된 테이블 좌표와 솔버 출력만 있으며 사진, 계정 식별자, 자유 입력문 또는 개인정보는 없습니다. CC BY 4.0 라이선스입니다.
샘플 포지션
| 포지션 | 모드 | 공 | 솔버 샷 | 최적 마진 |
|---|---|---|---|---|
3cushion::white::r2.130,0.710|w0.710,0.528|y0.710,0.710 | 3쿠션 | 3 | 3 | 1.15 |
freecarom::white::r2.130,0.710|w0.710,0.528|y0.710,0.710 | 자유구 | 3 | 1 | 1.32 |
3cushion::yellow::r2.130,0.710|w0.710,0.528|y0.710,0.710 | 3쿠션 | 3 | 1 | 0.94 |
freecarom::yellow::r2.130,0.710|w0.710,0.528|y0.710,0.710 | 자유구 | 3 | 1 | 1.36 |
3cushion::white::r2.550,0.500|w0.300,0.300|y2.500,1.100 | 3쿠션 | 3 | 4 | 0.28 |
freecarom::white::r2.550,0.500|w0.300,0.300|y2.500,1.100 | 자유구 | 3 | 4 | 0.50 |
3cushion::yellow::r2.550,0.500|w0.300,0.300|y2.500,1.100 | 3쿠션 | 3 | 2 | 0.97 |
freecarom::yellow::r2.550,0.500|w0.300,0.300|y2.500,1.100 | 자유구 | 3 | 4 | 2.13 |
3cushion::white::r0.550,0.300|w1.420,0.710|y1.950,1.100 | 3쿠션 | 3 | 1 | 1.47 |
freecarom::white::r0.550,0.300|w1.420,0.710|y1.950,1.100 | 자유구 | 3 | 2 | 1.50 |
3cushion::yellow::r0.550,0.300|w1.420,0.710|y1.950,1.100 | 3쿠션 | 3 | 1 | 0.24 |
freecarom::yellow::r0.550,0.300|w1.420,0.710|y1.950,1.100 | 자유구 | 3 | 2 | 0.92 |
전체 데이터셋 다운로드
완전한 기계 판독 데이터셋은 출처 표기와 함께 무료로 사용할 수 있습니다.
사용 방법
예시 좌표와 수구 식별 정보로 훈련 도구에 배치하세요. 고정 V2 결과는 현재 V3 재생과 다를 수 있으므로 비교할 때 엔진 버전을 기록하세요.