Dataset versionado del simulador: 100 posiciones, 249 resultados válidos dentro del modelo y 151 espacios vacíos o rechazados (400 evaluados). Procede de una caché física determinista versionada; no es un estudio de éxito en mesa real.
Metodología
El artefacto publicado se genera desde la caché versionada del solver. El perfil del motor, la huella de código, los recuentos y el SHA-256 quedan registrados para verificar la descarga de forma independiente. Un resultado pertenece al simulador; no expresa una probabilidad de éxito en una mesa real.
Datos versionados del simulador
- Contrato del motor
3ball-carom-match-v2 / physics 2.0.0 / solver 4.2.0- SHA-256 del dataset
256a8ec7e7e9a66d907bd43f5fdd6b87628dc067fd9621f2d2ebd2472c3e43ed- resultados válidos
- 249
- resultados vacíos o rechazados
- 151
- Estado de revisión
machine-assisted-reviewed
Diccionario de campos
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.
Verificar las descargas públicas
La verificación comprueba integridad y recuentos. No reproduce el motor, valida independientemente un tiro ni demuestra precisión en mesa real. El entorno completo de generación no se distribuye públicamente.
Guarda lo siguiente como verify_3ball.py y ejecútalo con Python 3. Solo usa la biblioteca estándar y descarga JSON público de 3ball.app; no requiere cuenta ni copia del proyecto.
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'])Alcance y límites
Es un dataset determinista del simulador, no un estudio de éxito en mesa real. La caché publicada usa el perfil V2 congelado. Physics V3 aún espera medición independiente. Margen y robustez son diagnósticos del modelo, no probabilidades reales.
Licencia y privacidad
La descarga solo contiene coordenadas calculadas y salidas del solver; no incluye fotos, cuentas, texto libre ni datos personales. Licencia CC BY 4.0.
Posiciones de muestra
| Posición | Modo | Bolas | Tiros del solver | Mejor margen |
|---|---|---|---|---|
3cushion::white::r2.130,0.710|w0.710,0.528|y0.710,0.710 | tres bandas | 3 | 3 | 1.15 |
freecarom::white::r2.130,0.710|w0.710,0.528|y0.710,0.710 | carambola libre | 3 | 1 | 1.32 |
3cushion::yellow::r2.130,0.710|w0.710,0.528|y0.710,0.710 | tres bandas | 3 | 1 | 0.94 |
freecarom::yellow::r2.130,0.710|w0.710,0.528|y0.710,0.710 | carambola libre | 3 | 1 | 1.36 |
3cushion::white::r2.550,0.500|w0.300,0.300|y2.500,1.100 | tres bandas | 3 | 4 | 0.28 |
freecarom::white::r2.550,0.500|w0.300,0.300|y2.500,1.100 | carambola libre | 3 | 4 | 0.50 |
3cushion::yellow::r2.550,0.500|w0.300,0.300|y2.500,1.100 | tres bandas | 3 | 2 | 0.97 |
freecarom::yellow::r2.550,0.500|w0.300,0.300|y2.500,1.100 | carambola libre | 3 | 4 | 2.13 |
3cushion::white::r0.550,0.300|w1.420,0.710|y1.950,1.100 | tres bandas | 3 | 1 | 1.47 |
freecarom::white::r0.550,0.300|w1.420,0.710|y1.950,1.100 | carambola libre | 3 | 2 | 1.50 |
3cushion::yellow::r0.550,0.300|w1.420,0.710|y1.950,1.100 | tres bandas | 3 | 1 | 0.24 |
freecarom::yellow::r0.550,0.300|w1.420,0.710|y1.950,1.100 | carambola libre | 3 | 2 | 0.92 |
Descargar el conjunto completo
El conjunto de datos completo y legible por máquina es gratuito con atribución.
Cómo usarlo
Coloca una posición usando las coordenadas de ejemplo y la identidad de la bola jugadora. El resultado V2 congelado puede diferir de la repetición V3 actual; anota la versión al comparar.
Abrir el entrenador
Coloca una posición usando las coordenadas de ejemplo y la identidad de la bola jugadora. El resultado V2 congelado puede diferir de la repetición V3 actual; anota la versión al comparar.
Abrir el entrenador →