Problem:
Hit and Blow

Let's play Hit and Blow game. A imagines four numbers and B guesses the numbers. After B picks out four numbers, A answers:

The number of numbers which have the same place with numbers A imagined (Hit)

The number of numbers included (but different place) in the numbers A imagined (Blow)

For example, if A imagined numbers:

9 1 8 2

and B chose:

4 1 5 9

A should say 1 Hit and 1 Blow.

Write a program which reads four numbers A imagined and four numbers B chose and prints the number of Hit and Blow respectively. You may assume that the four numbers are all different and within from 0 to 9.

Input

The input consists of multiple datasets. Each dataset set consists of:

a1 a2 a3 a4
b1 b2 b3 b4

, where ai (0 ≤ ai ≤ 9) is i-th number A imagined and bi (0 ≤ bi ≤ 9) is i-th number B chose.

The input ends with EOF. The number of datasets is less than or equal to 50.

Output

For each dataset, print the number of Hit and Blow in a line. These two numbers should be separated by a space.

Sample Input

9 1 8 2
4 1 5 9
4 6 8 2
4 6 3 2

Output for the Sample Input

1 1
3 0

Solution in C# (judge verdict: Accepted)

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

static class HitAndBlow
{
    static void Main()
    {
        var input = new StreamReader( Console.OpenStandardInput() ).ReadToEnd()
            .Where( x => '0' <= x && x <= '9' )
            .GroupSpan( 3 )
            .Select( x => x.GroupSpan( 2 ) )
            .Select( x => x.Select( y => y.ToArray() ) )
            .Select( x => x.ToArray() );
        var q =
            from x in input
            let nohit = Enumerable.Range( 0, 4 )
                .Where( y => x[0][y] != x[1][y] )
                .Select( y => new { a = x[0][y], b = x[1][y] } )
                .ToArray()

            let h = 4 - nohit.Length
            let b = nohit.Select( y => y.b )
                .Count( y => nohit.Select( z => z.a ).Contains( y ) )
            select h + " " + b;
        q.ToList().ForEach( Console.WriteLine );
    }

    static IEnumerable<IEnumerable<TSource>>
    GroupSpan<TSource>
    (this IEnumerable<TSource> source, int span)
    {
        return source
            .Select( (v, i) => new { v, k = i >> span } )
            .GroupBy( x => x.k, x => x.v )
            .Select( x => x as IEnumerable<TSource> );
    }
}