YOKOHAMAの8文字1列に並べるとき、次のような並べ方は何通りあるか

detail.chiebukuro.yahoo.co.jp

def perm(head, rest):

    if len(rest) == 0:
        return [head]

    else:
        res = []

        # set(集合)型で重複を削除、ソート
        data = sorted(set(rest))

        for i in data:

            # 配列の複製
            restx = rest[:]

            # 指定データ削除
            restx.remove(i)

            headx = head + [i]
            res += perm(headx, restx)

        return res

pattern = perm([], [[i for i in 'YOKOHAMA']])

# 1. すべての並び方

print(len(pattern))

# 2. OとAが必ず偶数番目にある並べ方
"""
c2 = 0

for i in pattern:
    for j in i[1::2]:
        if j != 'O' and j != 'A':
            break
    else:
        c2 += 1

print(c2)
"""

data = [i for i in pattern if not set(i[1::2]) - set(['A', 'O'])]
print(len(data))

# 3. 2つのOが隣り合わない並べ方

data = [i for i in pattern if 'OO' not in ''.join(i)]
print(len(data))

# 4. Y、K、H、M、がこの順にある並べ方

data = [i for i in pattern if i.index('Y') < i.index('K') < i.index('H') < i.index('M')]
print(len(data))