#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> v;
class SAT2 {
 private:
  vector<vector<int> > v;
  vector<vector<int> > rev;
  int SIZE;

 public:
  void resize(int n) {
    SIZE = n + 2;
    v.assign(SIZE * 2, vector<int>());
    rev = v;
  }

 private:
  int get_id(int id, bool xor_id) { return id + (SIZE) * (int)(xor_id); }

 public:
  void add_edge(int a, bool xor_a, int b, bool xor_b) {
    v[get_id(a, xor_a)].push_back(get_id(b, xor_b));
    rev[get_id(b, xor_b)].push_back(get_id(a, xor_a));
  }

 private:
  vector<bool> used;
  vector<pair<int, int> > vis;
  inline void dfs(int b, int &ord) {
    used[b] = true;
    for (int i = 0; i < v[b].size(); i++) {
      if (used[v[b][i]] == false) {
        dfs(v[b][i], ord);
      }
    }
    vis.push_back(make_pair(ord, b));
    ord++;
  }
  vector<int> belong;
  inline void rdfs(int b, int &ord) {
    used[b] = false;
    belong[b] = ord;
    for (int i = 0; i < rev[b].size(); i++) {
      if (used[rev[b][i]]) {
        rdfs(rev[b][i], ord);
      }
    }
  }

 public:
  bool can() {
    int n = v.size();
    int ord = 0;
    used.assign(n, false);
    vis.clear();
    for (int i = 0; i < n; i++) {
      if (used[i] == false) {
        dfs(i, ord);
      }
    }
    sort(vis.begin(), vis.end(), greater<pair<int, int> >());
    belong.resize(vis.size());
    for (int i = 0; i < n; i++) {
      if (used[vis[i].second]) {
        ord++;
        rdfs(vis[i].second, ord);
      }
    }
    for (int i = 0; i < SIZE; i++) {
      if (belong[i] == belong[i + SIZE]) {
        return false;
      }
    }
    return true;
  }
};
bool ng[52][2];
bool ok(int mid) {
  memset(ng, false, sizeof(ng));
  SAT2 sa;
  sa.resize(n * 2);
  bool upd = true;
  while (upd) {
    upd = false;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        if (i == j) continue;
        for (int k = 0; k < 2; k++) {
          if (ng[i][k]) continue;
          int tim = v[i];
          if (k == 1) {
            tim = 24 - tim;
          }
          set<int> no;
          for (int kk = 0; kk < 2; kk++) {
            int tim2 = v[j];
            if (kk == 1) {
              tim2 = 24 - tim2;
            }
            int sa = tim - tim2;
            sa = abs(sa);
            sa = min(sa, 24 - sa);
            if (sa < mid) {
              no.insert(kk);
            }
            if (ng[j][kk]) {
              no.insert(kk);
            }
          }
          if (no.size() == 2) {
            ng[i][k] = true;
            upd = true;
          }
        }
      }
    }
  }
  for (int i = 0; i < n; i++) {
    if (ng[i][0] == true && ng[i][1] == true) {
      return false;
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (i == j) continue;
      for (int k = 0; k < 2; k++) {
        int tim = v[i];
        if (k == 1) {
          tim = 24 - tim;
        }
        set<int> no;
        for (int kk = 0; kk < 2; kk++) {
          int tim2 = v[j];
          if (kk == 1) {
            tim2 = 24 - tim2;
          }
          int sa = tim - tim2;
          sa = abs(sa);
          sa = min(sa, 24 - sa);
          if (sa < mid) {
            no.insert(kk);
          }
          if (ng[j][kk]) {
            no.insert(kk);
          }
        }
        if (no.size() == 2) {
          sa.add_edge(i, k, i, k ^ true);
        }
        if (no.size() == 1) {
          sa.add_edge(i, k, j, (*no.begin()) ^ true);
        }
      }
    }
  }
  if (sa.can()) {
    return true;
  }
  return false;
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    int d;
    scanf("%d", &d);
    v.push_back(d);
  }
  int mint = 0;
  int maxt = INT_MAX;
  while (mint + 1 < maxt) {
    int mid = (mint + maxt) >> 1;
    if (ok(mid)) {
      mint = mid;
    } else {
      maxt = mid;
    }
  }
  if (ok(maxt)) {
    cout << maxt << endl;
  } else {
    cout << mint << endl;
  }
  return 0;
}
