#include <iomanip>
#include <iostream>
#include <cmath>
#include <vector>
#include <string>

using Bool = bool;
using Int = long long int;
using Real = long double;
using Char = char;
using String = std::string;
template <class T>
using Vector = std::vector<T>;
template <class T>
using Matrix = Vector<Vector<T>>;

struct Fout {
    Int precision;
    Fout(Int precision) : precision(precision) {}
};
std::ostream& operator<<(std::ostream& os, const Fout& fio) {
    os << std::fixed << std::setprecision(fio.precision);
    return os;
}

// p勝する確率
Vector<Real> prob;

void init() {
    prob.resize(9);
    prob[0] = std::pow(0.75L, 8);
    for (Int i = 1; i <= 8; ++i) {
        prob[i] = prob[i - 1] * Real(9 - i) / Real(i * 3);
    }
}

// 入力から得点表を生成
// 先頭が自チーム、埋まってない箇所は-1 ~ -4が振られる
Matrix<Int> parse() {
    String s;
    std::cin >> s;

    Vector<Vector<Int>> score(4, Vector<Int>(4, 0));

    {
        Int me = 0, cnt = -1;

        for (Int i = 0; i < 4; ++i) {
            std::cin >> s;
            if (s.front() == '*') me = i;

            for (Int j = i + 1; j < 4; ++j) {
                Char x = s[j * 5 + 6];
                score[i][j] = (x == '_' ? cnt-- : x - '0');
                x = s[j * 5 + 8];
                score[j][i] = (x == '_' ? cnt-- : x - '0');
            }
        }

        // 自チームを先頭へ移動
        std::swap(score[0], score[me]);
        for (auto& v : score) std::swap(v[0], v[me]);
    }

    return score;
}

void solve() {
    auto score = parse();
    Real ans = 0;

    // 空欄の点数を全列挙
    for (Int b = 0; b < 6561; ++b) {
        // デコード
        Vector<Int> pts(4);
        {
            Int c = b;
            for (Int i = 0; i < 4; ++i) {
                pts[i] = c % 9;
                c /= 9;
            }
        }

        Real pr = 1;
        for (auto p : pts) pr *= prob[p];

        // 空欄を埋める
        auto nscore = score;
        for (auto& v : nscore) {
            for (auto& x : v) {
                if (x < 0) x = pts[-x - 1];
            }
        }

        Vector<Vector<Int>> result(4);

        for (Int q = 0; q < 3; ++q) {
            // 現時点で自チームと同率のチームを列挙
            Vector<Bool> cons(4);
            for (Int i = 0; i < 4; ++i) {
                cons[i] = (result[i] == result[0]);
            }

            // 同率チーム間のポイント、得失点差、得点
            Matrix<Int> tmpres(4, Vector<Int>(3, 0));
            for (Int i = 0; i < 4; ++i) {
                if (!cons[i]) continue;
                for (Int j = 0; j < 4; ++j) {
                    if (i == j || !cons[j]) continue;

                    Int me = nscore[i][j], op = nscore[j][i];
                    tmpres[i][0] += (me > op ? 3 : me == op);
                    tmpres[i][1] += me - op;
                    tmpres[i][2] += me;
                }
            }

            // テーブルを拡張
            for (Int i = 0; i < 4; ++i) {
                if (cons[i])
                    std::move(tmpres[i].begin(), tmpres[i].end(),
                              std::back_inserter(result[i]));
            }
        }

        Int u = 0, m = 0;  // 自チームと比べて上、同率のチーム数
        for (Int i = 0; i < 4; ++i) {
            if (result[i] > result[0]) {
                ++u;
            } else if (result[i] == result[0]) {
                ++m;
            }
        }

        if (u >= 2) {  // 枠が埋まっている
            pr = 0;
        } else if (u + m >= 3) {  // 残り2-u枠をmチームで取り合う
            pr *= Real(2 - u) / Real(m);
        }
        ans += pr;
    }

    std::cout << Fout(7) << ans << std::endl;
}

int main() {
    init();
    Int n;
    std::cin >> n;
    for (Int i = 0; i < n; ++i) solve();
    return 0;
}



Measured memory_bytes: 3184