Saltar al contenido

Conjunto de Datos del Solver de Tres Bandas — Datos Abiertos

100 posiciones; 249 resultados válidos en el modelo y 151 espacios vacíos o rechazados, con manifiesto versionado y JSON gratuito.

Autor: Setviva Engineering 576 palabras 3 min de lectura

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.

100
posiciones
249
resultados válidos
151
resultados vacíos o rechazados
400
espacios de resultado evaluados
50
tres bandas
50
carambola libre

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

Descargar manifiesto

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ónModoBolasTiros del solverMejor margen
3cushion::white::r2.130,0.710|w0.710,0.528|y0.710,0.710tres bandas331.15
freecarom::white::r2.130,0.710|w0.710,0.528|y0.710,0.710carambola libre311.32
3cushion::yellow::r2.130,0.710|w0.710,0.528|y0.710,0.710tres bandas310.94
freecarom::yellow::r2.130,0.710|w0.710,0.528|y0.710,0.710carambola libre311.36
3cushion::white::r2.550,0.500|w0.300,0.300|y2.500,1.100tres bandas340.28
freecarom::white::r2.550,0.500|w0.300,0.300|y2.500,1.100carambola libre340.50
3cushion::yellow::r2.550,0.500|w0.300,0.300|y2.500,1.100tres bandas320.97
freecarom::yellow::r2.550,0.500|w0.300,0.300|y2.500,1.100carambola libre342.13
3cushion::white::r0.550,0.300|w1.420,0.710|y1.950,1.100tres bandas311.47
freecarom::white::r0.550,0.300|w1.420,0.710|y1.950,1.100carambola libre321.50
3cushion::yellow::r0.550,0.300|w1.420,0.710|y1.950,1.100tres bandas310.24
freecarom::yellow::r0.550,0.300|w1.420,0.710|y1.950,1.100carambola libre320.92

Descargar el conjunto completo

El conjunto de datos completo y legible por máquina es gratuito con atribución.

Descargar JSON

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 →