本文へスキップ

スリークッション・ソルバーデータセット — オープンなキャロム配置データ

100配置、モデル内有効結果249件、空/却下151件。バージョン管理マニフェストと無料JSON付き。

著者: Setviva Engineering 1349 語 7 分で読了

バージョン付きシミュレーターデータ:100配置、モデル内で有効な249結果、空または却下された151枠(評価総数400)。バージョン管理された決定論的物理キャッシュの出力で、実台成功率の研究ではありません。

100
配置
249
有効なソルバー結果
151
空または却下された結果枠
400
評価した結果枠
50
スリークッション
50
フリーゲーム

方法論

公開データはバージョン管理されたソルバーキャッシュから生成されます。独立検証のため、エンジンプロファイル、ソース指紋、件数、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スリークッション331.15
freecarom::white::r2.130,0.710|w0.710,0.528|y0.710,0.710フリーゲーム311.32
3cushion::yellow::r2.130,0.710|w0.710,0.528|y0.710,0.710スリークッション310.94
freecarom::yellow::r2.130,0.710|w0.710,0.528|y0.710,0.710フリーゲーム311.36
3cushion::white::r2.550,0.500|w0.300,0.300|y2.500,1.100スリークッション340.28
freecarom::white::r2.550,0.500|w0.300,0.300|y2.500,1.100フリーゲーム340.50
3cushion::yellow::r2.550,0.500|w0.300,0.300|y2.500,1.100スリークッション320.97
freecarom::yellow::r2.550,0.500|w0.300,0.300|y2.500,1.100フリーゲーム342.13
3cushion::white::r0.550,0.300|w1.420,0.710|y1.950,1.100スリークッション311.47
freecarom::white::r0.550,0.300|w1.420,0.710|y1.950,1.100フリーゲーム321.50
3cushion::yellow::r0.550,0.300|w1.420,0.710|y1.950,1.100スリークッション310.24
freecarom::yellow::r0.550,0.300|w1.420,0.710|y1.950,1.100フリーゲーム320.92

全データセットをダウンロード

完全な機械可読データセットは、帰属表示のもと無料で利用・再利用できます。

JSONをダウンロード

使い方

例の座標と手球の識別情報を使い、練習ツールに配置してください。固定されたV2結果は現在のV3再生と異なる場合があります。比較時はエンジン版を記録してください。

トレーナーを開く

例の座標と手球の識別情報を使い、練習ツールに配置してください。固定されたV2結果は現在のV3再生と異なる場合があります。比較時はエンジン版を記録してください。

トレーナーを開く →