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.
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
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
| Position | Mode | Billes | Coups du solver | Meilleure marge |
|---|---|---|---|---|
3cushion::white::r2.130,0.710|w0.710,0.528|y0.710,0.710 | trois-bandes | 3 | 3 | 1.15 |
freecarom::white::r2.130,0.710|w0.710,0.528|y0.710,0.710 | partie libre | 3 | 1 | 1.32 |
3cushion::yellow::r2.130,0.710|w0.710,0.528|y0.710,0.710 | trois-bandes | 3 | 1 | 0.94 |
freecarom::yellow::r2.130,0.710|w0.710,0.528|y0.710,0.710 | partie libre | 3 | 1 | 1.36 |
3cushion::white::r2.550,0.500|w0.300,0.300|y2.500,1.100 | trois-bandes | 3 | 4 | 0.28 |
freecarom::white::r2.550,0.500|w0.300,0.300|y2.500,1.100 | partie libre | 3 | 4 | 0.50 |
3cushion::yellow::r2.550,0.500|w0.300,0.300|y2.500,1.100 | trois-bandes | 3 | 2 | 0.97 |
freecarom::yellow::r2.550,0.500|w0.300,0.300|y2.500,1.100 | partie libre | 3 | 4 | 2.13 |
3cushion::white::r0.550,0.300|w1.420,0.710|y1.950,1.100 | trois-bandes | 3 | 1 | 1.47 |
freecarom::white::r0.550,0.300|w1.420,0.710|y1.950,1.100 | partie libre | 3 | 2 | 1.50 |
3cushion::yellow::r0.550,0.300|w1.420,0.710|y1.950,1.100 | trois-bandes | 3 | 1 | 0.24 |
freecarom::yellow::r0.550,0.300|w1.420,0.710|y1.950,1.100 | partie libre | 3 | 2 | 0.92 |
Télécharger le jeu complet
Le jeu de données complet et lisible par machine est libre d'usage avec attribution.
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 →