Problem:
Score : 500 points

Problem Statement

In CODE FESTIVAL XXXX, there are N+1 participants from all over the world, including Takahashi.

Takahashi checked and found that the time gap (defined below) between the local times in his city and the i-th person's city was D_i hours.
The time gap between two cities is defined as follows. For two cities A and B, if the local time in city B is d o'clock at the moment when the local time in city A is 0 o'clock, then the time gap between these two cities is defined to be min(d,24-d) hours.
Here, we are using 24-hour notation.
That is, the local time in the i-th person's city is either d o'clock or 24-d o'clock at the moment when the local time in Takahashi's city is 0 o'clock, for example.

Then, for each pair of two people chosen from the N+1 people, he wrote out the time gap between their cities. Let the smallest time gap among them be s hours.

Find the maximum possible value of s.

Constraints

1 \leq N \leq 50

0 \leq D_i \leq 12

All input values are integers.

Input

Input is given from Standard Input in the following format:

N
D_1 D_2 ... D_N

Output

Print the maximum possible value of s.

Sample Input 1

3
7 12 8

Sample Output 1

4

For example, consider the situation where it is 7, 12 and 16 o'clock in each person's city at the moment when it is 0 o'clock in Takahashi's city. In this case, the time gap between the second and third persons' cities is 4 hours.

Sample Input 2

2
11 11

Sample Output 2

2

Sample Input 3

1
0

Sample Output 3

0

Note that Takahashi himself is also a participant.

Solution in Go (1.6) (judge verdict: Runtime Error)

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func getScanner(fp *os.File) *bufio.Scanner {
	scanner := bufio.NewScanner(fp)
	scanner.Split(bufio.ScanWords)
	scanner.Buffer(make([]byte, 500001), 500000)
	return scanner
}

func getNextString(scanner *bufio.Scanner) string {
	scanner.Scan()
	return scanner.Text()
}

func getNextInt(scanner *bufio.Scanner) int {
	i, _ := strconv.Atoi(getNextString(scanner))
	return i
}

func getNextInt64(scanner *bufio.Scanner) int64 {
	i, _ := strconv.ParseInt(getNextString(scanner), 10, 64)
	return i
}

func main() {
	fp := os.Stdin
	if len(os.Args) > 1 {
		fp, _ = os.Open(os.Args[1])
	}

	scanner := getScanner(fp)
	writer := bufio.NewWriter(os.Stdout)

	n := getNextInt(scanner)
	sum := make([]int, 24)
	sum[0] = 2
	for i := 0; i < n; i++ {
		d := getNextInt(scanner)
		sum[d]++
		sum[24-d]++
	}

	fmt.Fprintln(writer, solve(sum))

	writer.Flush()
}

func solve(sum []int) int {
	index := make([]int, 0)
	for i := 0; i <= 12; i++ {
		if sum[i] > 2 {
			return 0
		}
		if sum[i] == 1 {
			index = append(index, i)
		}
	}

	l := len(index)
	max := 0
	for i := 0; i < 1<<uint(l); i++ {
		for ii := 0; ii < l; ii++ {
			sum[index[ii]] = 1 & (i >> uint(ii))
			sum[24-index[ii]] = 1 - sum[index[ii]]
		}
		min := 23
		zeros := 0
		for ii := 1; ii <= 24; ii++ {
			if ii < 24 && sum[ii] == 0 {
				zeros++
				continue
			}
			if min > zeros {
				min = zeros + 1
			}
			zeros = 0
		}
		if max < min {
			max = min
		}
	}

	return max
}