Problem:
Score : 200 points

Problem Statement

We have a bingo card with a 3\times3 grid. The square at the i-th row from the top and the j-th column from the left contains the number A_{i, j}.

The MC will choose N numbers, b_1, b_2, \cdots, b_N. If our bingo sheet contains some of those numbers, we will mark them on our sheet.

Determine whether we will have a bingo when the N numbers are chosen, that is, the sheet will contain three marked numbers in a row, column, or diagonal.

Constraints

All values in input are integers.

1 \leq A_{i, j} \leq 100

A_{i_1, j_1} \neq A_{i_2, j_2} ((i_1, j_1) \neq (i_2, j_2))

1 \leq N \leq 10

1 \leq b_i \leq 100

b_i \neq b_j (i \neq j)

Input

Input is given from Standard Input in the following format:

A_{1, 1} A_{1, 2} A_{1, 3}
A_{2, 1} A_{2, 2} A_{2, 3}
A_{3, 1} A_{3, 2} A_{3, 3}
N
b_1
\vdots
b_N

Output

If we will have a bingo, print Yes; otherwise, print No.

Sample Input 1

84 97 66
79 89 11
61 59 7
7
89
7
87
79
24
84
30

Sample Output 1

Yes

We will mark A_{1, 1}, A_{2, 1}, A_{2, 2}, A_{3, 3}, and complete the diagonal from the top-left to the bottom-right.

Sample Input 2

41 7 46
26 89 2
78 92 8
5
6
45
16
57
17

Sample Output 2

No

We will mark nothing.

Sample Input 3

60 88 34
92 41 43
65 73 48
10
60
43
88
11
48
73
65
41
92
34

Sample Output 3

Yes

We will mark all the squares.

Solution in Rust (1.15.1) (judge verdict: Accepted)

// This code is generated by [cargo-atcoder](https://github.com/tanakh/cargo-atcoder)
// Original source code:
/*
use std::vec::Vec;
use std::collections::HashMap;
fn main() {
    let mut coord_map = HashMap::new();
    let first_line: Vec<u32> = read_as_vec().into_iter().map(|s| s.parse::<u32>().unwrap()).collect();
    coord_map.insert(first_line[0], 0);
    coord_map.insert(first_line[1], 1);
    coord_map.insert(first_line[2], 2);
    let second_line: Vec<u32> = read_as_vec().into_iter().map(|s| s.parse::<u32>().unwrap()).collect();
    coord_map.insert(second_line[0], 3);
    coord_map.insert(second_line[1], 4);
    coord_map.insert(second_line[2], 5);
    let third_line: Vec<u32> = read_as_vec().into_iter().map(|s| s.parse::<u32>().unwrap()).collect();
    coord_map.insert(third_line[0], 6);
    coord_map.insert(third_line[1], 7);
    coord_map.insert(third_line[2], 8);
    let cnt = read().parse::<u32>().unwrap();
    let mut indexes: Vec<bool> = Vec::new();
    for _ in 0..9 {
        indexes.push(false);
    }
    for _ in 0..cnt {
        let num = read().parse::<u32>().unwrap();
        let index = if let Some(index) = coord_map.get(&num) {
            index
        } else {
            continue;
        };
        indexes[*index as usize] = true;
    }

    // yoko
    if indexes[0] && indexes[1] && indexes[2] {
        println!("Yes");
        return;
    }
    if indexes[3] && indexes[4] && indexes[5] {
        println!("Yes");
        return;
    }
    if indexes[6] && indexes[7] && indexes[8] {
        println!("Yes");
        return;
    }
    // Tate
    if indexes[0] && indexes[3] && indexes[6] {
        println!("Yes");
        return;
    }
    if indexes[1] && indexes[4] && indexes[7] {
        println!("Yes");
        return;
    }
    if indexes[2] && indexes[5] && indexes[8] {
        println!("Yes");
        return;
    }
    // 0 1 2
    // 3 4 5
    // 6 7 8
    // Naname
    if indexes[0] && indexes[4] && indexes[8] {
        println!("Yes");
        return;
    }
    if indexes[2] && indexes[4] && indexes[6] {
        println!("Yes");
        return;
    }
    println!("No");
}
fn read() -> String {
    let mut line = String::new();
    std::io::stdin().read_line(&mut line).unwrap();
    line.trim().to_string()
}
fn read_as_vec() -> std::vec::Vec<String> {
    read().split(' ').map(|s| s.to_string()).collect()
}
*/

fn main() {
    let exe = "/tmp/bin0B7E4229";
    std::io::Write::write_all(&mut std::fs::File::create(exe).unwrap(), &decode(BIN)).unwrap();
    std::fs::set_permissions(exe, std::os::unix::fs::PermissionsExt::from_mode(0o755)).unwrap();
    std::process::exit(std::process::Command::new(exe).status().unwrap().code().unwrap())
}

fn decode(v: &str) -> Vec<u8> {
    let mut ret = vec![];
    let mut buf = 0;
    let mut tbl = vec![64; 256];
    for i in 0..64 { tbl[TBL[i] as usize] = i as u8; }
    for (i, c) in v.bytes().filter_map(|c| { let c = tbl[c as usize]; if c < 64 { Some(c) } else { None } }).enumerate() {
        match i % 4 {
            0 => buf = c << 2,
            1 => { ret.push(buf | c >> 4); buf = c << 4; }
            2 => { ret.push(buf | c >> 2); buf = c << 6; }
            3 => ret.push(buf | c),
            _ => unreachable!(),
        }
    }
    ret
}

const TBL: &'static [u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
const BIN: &'static str = "<base64-encoded ELF executable removed>";