#include <bits/stdc++.h>
using namespace std;

#define rep(i,n) for(long long i = 0; i < (long long)(n); i++)
#define repi(i,a,b) for(long long i = (long long)(a); i < (long long)(b); i++)
#define pb push_back
#define all(x) (x).begin(), (x).end()
using ll = long long; using vll = vector<ll>; 

// 2-SATソルバ
class SAT {
public:
    int n;
    // v in [0, n)      x_v = T
    // v in [n, 2n)     x_v = F
    vector<vector<int>> g, g_rev;
    vector<bool> ret;
    SAT (int n_) : n(n_), g(n*2), g_rev(n*2) { }
    inline int node(int t) {
        return (t > 0 ? t-1 : n+(-t)-1);
    }

    // and (sign(t1) x_|t1| or sign(t2) t2)を論理式に加える。
    // ただし、sign(t)はt>0で何もなし、t<0でnot
    //
    // 1 <= |t1| <= n
    // 1 <= |t2| <= n
    void addClause(int t1, int t2) {
        assert(1 <= abs(t1) && abs(t1) <= n);
        assert(1 <= abs(t2) && abs(t2) <= n);
        g[node(-t1)].pb(node(t2));
        g[node(-t2)].pb(node(t1));
        g_rev[node(t1)].pb(node(-t2));
        g_rev[node(t2)].pb(node(-t1));
    }

    // 従属可能で1を出力
    bool isSAT(void) {
        // SCC
        vector<int> color(g.size(), -1); // color[i] == color[j]ならばiとjは同じ連結成分
        {
            vector<int> id;
            vector<bool> visited(g.size());
            rep(i, g.size()) {
                function<void(int)> dfs1 = [&](int v) {
                    if (visited[v]) return;
                    visited[v] = true;
                    for (auto x : g[v]) dfs1(x);
                    id.pb(v);
                };
                dfs1(i);
            }
            fill(all(visited), false);
            for (int i = id.size() - 1; i >= 0; i--) {
                function<void(int)> dfs2 = [&](int v) {
                    if (visited[v]) return;
                    visited[v] = true;
                    for (auto x : g_rev[v]) dfs2(x);
                    color[v] = i;
                };
                dfs2(id[i]);
            }
        }

        ret.resize(0);
        rep(v, n) if (color[v] == color[v+n]) return 0;
        ret.resize(n);
        rep(i, n) ret[i] = color[i] > color[i+n];
        return 1;
    }

    // 解ありの場合、x_i = ret[i]がSATを与える。
    // 解なしの場合、ret.size() == 0である
    vector<bool> getAnswer(void) { return ret; }
    void print_answer(void) {
        if (ret.size()) {
            cout << "SAT : "; rep(i, n) cout << ret[i] << " "; cout << endl;
        } else {
            cout << "UNSAT" << endl;
        }
    }
};

// 2-SATソルバ
//
// 使い方
// SAT sat(n);
// x_1, ... x_nの変数が確保される。
// addClouseなどは1-index!! 理由は、not Aを-Aとして表現するから！
//
// sat.addClause(i, j) 
//      x_iもしくはx_jが成立する
//      x_iは負だと、「x_iが成立しない」という意味になる
//
// sat.isSAT
//      1ならSAT, 0ならUNSAT
//      SATなら副作用でsolver.ret[i]にx_{i+1}の割当結果が得られる
//      1がtrueで0がfalseである
ll diff(ll a, ll b) { ll d = abs(a-b); return min(d, 24-d); }
int main(void) {
    ll n; cin >> n; n++;
    vll a; a.pb(0); rep(i, n-1) { ll tmp; cin >> tmp; a.pb(tmp); }

    ll ans = -1;
    rep(d, 30) {
        SAT sat(n);
        rep(i, n) repi(j, i+1, n) {
            if (diff(a[i], a[j]) < d)       sat.addClause(-(i+1),-(j+1));
            if (diff(a[i], 24-a[j]) < d)    sat.addClause(-(i+1),+(j+1));
            if (diff(24-a[i], a[j]) < d)    sat.addClause(+(i+1),-(j+1));
            if (diff(24-a[i], 24-a[j]) < d) sat.addClause(+(i+1), +(j+1));
        }
        bool ret = sat.isSAT();
        if (!ret) {
            cout << ans << endl;
            return 0;
        }
        ans = d;
    }
    return 0;
}



Measured memory_bytes: 384