C♯の勉強

C♯4.0 で TopCoder の過去問を解きます。

TopCoder SRM606: EllysNumberGuessing

それぞれの guess, answer について guess + answer、 guess - answer のどちらかが必ず答えになる。よってこの2要素となる候補の集合積を取ることで、答えの候補が導出できる。
また、答えは必ず 1 以上 1,000,000,000 以下でないといけないのでその条件で絞り込む必要がある。

LINQ を使うと綺麗にかける貴重な Div1Easy。

public class EllysNumberGuessing {
    public int getNumber(int[] guesses, int[] answers) {
        var candidates = guesses.Zip(answers, (g, a) => new[] { g + a, g - a });
        var satisfied = candidates
            .Aggregate((set1, set2) => set1.Intersect(set2).ToArray())
            .Where(v => 1 <= v && v <= 1000000000)
            .ToArray();
        if (satisfied.Count() >= 2) return -1;
        if (satisfied.Count() == 0) return -2;
        return satisfied.Single();
    }
}