Aller au contenu

Jeu de Données Solver Trois-Bandes — Données Ouvertes

100 positions ; 249 résultats valides dans le modèle et 151 emplacements vides/rejetés, avec manifeste et JSON gratuit.

Auteur: Setviva Engineering 594 mots 3 min de lecture

Jeu de données versionné du simulateur : 100 positions, 249 résultats valides dans le modèle et 151 emplacements vides ou rejetés (400 évalués). Issu d’un cache physique déterministe versionné, et non d’une étude de réussite sur table réelle.

100
positions
249
résultats valides
151
emplacements vides ou rejetés
400
emplacements de résultat évalués
50
trois-bandes
50
partie libre

Méthodologie

L'artefact publié est produit depuis le cache versionné du solveur. Profil moteur, empreinte source, décomptes et SHA-256 sont consignés pour vérifier le téléchargement indépendamment. Un résultat reste une sortie du simulateur, pas une probabilité de réussite sur table réelle.

Données versionnées du simulateur

Contrat moteur
3ball-carom-match-v2 / physics 2.0.0 / solver 4.2.0
SHA-256 du jeu
256a8ec7e7e9a66d907bd43f5fdd6b87628dc067fd9621f2d2ebd2472c3e43ed
résultats valides
249
emplacements vides ou rejetés
151
Statut de révision
machine-assisted-reviewed

Télécharger le manifeste

Dictionnaire des champs

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.

Vérifier les téléchargements publics

La vérification contrôle intégrité et décomptes. Elle ne reproduit pas le moteur, ne valide pas indépendamment un coup et ne prouve pas la précision sur table réelle. L’environnement complet de génération n’est pas distribué publiquement.

Enregistrez ce texte sous verify_3ball.py et lancez-le avec Python 3. Il utilise uniquement la bibliothèque standard et des JSON publics de 3ball.app ; ni compte ni copie du projet ne sont nécessaires.

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'])

Portée et limites

Il s’agit d’un jeu déterministe du simulateur, pas d’une étude de réussite sur table réelle. Le cache utilise le profil V2 figé. Physics V3 attend encore une mesure indépendante. Marge et robustesse sont des diagnostics du modèle, non des probabilités réelles.

Licence et confidentialité

Le téléchargement ne contient que des coordonnées calculées et des sorties du solveur, sans photo, identifiant de compte, texte libre ni donnée personnelle. Licence CC BY 4.0.

Positions d'exemple

PositionModeBillesCoups du solverMeilleure marge
3cushion::white::r2.130,0.710|w0.710,0.528|y0.710,0.710trois-bandes331.15
freecarom::white::r2.130,0.710|w0.710,0.528|y0.710,0.710partie libre311.32
3cushion::yellow::r2.130,0.710|w0.710,0.528|y0.710,0.710trois-bandes310.94
freecarom::yellow::r2.130,0.710|w0.710,0.528|y0.710,0.710partie libre311.36
3cushion::white::r2.550,0.500|w0.300,0.300|y2.500,1.100trois-bandes340.28
freecarom::white::r2.550,0.500|w0.300,0.300|y2.500,1.100partie libre340.50
3cushion::yellow::r2.550,0.500|w0.300,0.300|y2.500,1.100trois-bandes320.97
freecarom::yellow::r2.550,0.500|w0.300,0.300|y2.500,1.100partie libre342.13
3cushion::white::r0.550,0.300|w1.420,0.710|y1.950,1.100trois-bandes311.47
freecarom::white::r0.550,0.300|w1.420,0.710|y1.950,1.100partie libre321.50
3cushion::yellow::r0.550,0.300|w1.420,0.710|y1.950,1.100trois-bandes310.24
freecarom::yellow::r0.550,0.300|w1.420,0.710|y1.950,1.100partie libre320.92

Télécharger le jeu complet

Le jeu de données complet et lisible par machine est libre d'usage avec attribution.

Télécharger le JSON

Comment l'utiliser

Placez une position dans l’outil à partir des coordonnées d’exemple et de l’identité de la bille joueuse. Le résultat V2 figé peut différer de la répétition V3 actuelle ; notez la version du moteur lors de la comparaison.

Ouvrir l'entraîneur

Placez une position dans l’outil à partir des coordonnées d’exemple et de l’identité de la bille joueuse. Le résultat V2 figé peut différer de la répétition V3 actuelle ; notez la version du moteur lors de la comparaison.

Ouvrir l'entraîneur →