Problem:
家庭菜園に野菜を植えることにしました。n 粒の種があったので1日に1粒ずつ、n 日かけて n 粒の種をまきました。どの種からも芽が出て、すくすくと育っています。収穫の時期が待ち遠しいものです。

ある日、いつものように苗に水やりをしていると、おかしなことに気づきました。n 本の野菜の苗があるはずなのに、1本多いのです。雑草が生えてきてしまいました。直ちに引っこ抜きたいのですが、困ったことにどの苗もよく似ていて、野菜と雑草の見分けがつきません。

手がかりになるのは、野菜の成長速度です。この野菜は、種をまいてからずっと、1日に決まった長さだけ伸び続けるのです。しかし、この「決まった長さ」というのが何センチメートルなのかはわかりません。また、最初の種を何日前にまいたのかも忘れてしまいました。苗は一列に並んでいますが、唯一覚えているのは、種をまくとき毎日一粒ずつ右から順にまいていったことだけです。

n＋１本の苗の長さを入力し、雑草の長さを出力するプログラムを作成して下さい。

入力

入力は複数のデータセットからなる。入力の終わりはゼロ１つ行で示される。入力は以下の形式で与えられる。

n
h1 h2 h3 ... hn+1

１行目の n (4 ≤ n ≤ 100) は野菜の苗の数を表す整数である。２行目は１つの空白で区切られた n+1 個の整数を含み、 hi (1 ≤ hi ≤ 109)は左からi番目の苗の長さを示す。

h1 h2 ... hn+1 が等差数列になっているような入力は与えられない。

データセットの数は 500 を超えない。

出力

各データセットごとに雑草の長さを出力する 。

入力例

5
1 2 3 6 4 5
6
1 3 6 9 12 15 18
4
5 7 9 11 12
0

出力例

6
1
12

Solution in C# (judge verdict: Accepted)

using System.Collections.Generic;
using System.Linq;
using System;

public class hello
{
    public static void Main()
    {
        while (true)
        {
            var n = int.Parse(Console.ReadLine().Trim()) + 1;
            if (n == 1) break;
            string[] line = Console.ReadLine().Trim().Split(' ');
            var a = Array.ConvertAll(line, int.Parse).ToList();
            var c = getList(a, n);
            var ans = check(a, c, n);
            Console.WriteLine(ans);
        }
    }
    public static List<int> getList(List<int> a, int n)
    {
        var ans = new List<int>();
        var hs = new HashSet<int>();
        for (int i = 1; i < n; i++)
            if (hs.Add(a[i] - a[i - 1])) { ans.Add(i); ans.Add(i - 1); }
        return ans.Distinct().ToList();
    }
    public static int check(List<int> a, List<int> c, int n)
    {
        foreach (var x in c)
        {
            var t = a[x];
            a.RemoveAt(x);
            var hs = new HashSet<int>();
            for (int i = 0; i < n - 2; i++)
            {
                hs.Add(a[i + 1] - a[i]);
                if (hs.Count() == 2) continue;
            }
            if (hs.Count() == 1) return t;
            a.Insert(x, t);
        }
        return -1;
    }
}