文字を2行に並べる順列の問題をPythonで解いてみた。

 ネットで見つけた文字を2行に並べる順列の問題Pythonで解いてみました。(^_^;

 下のような枠がある。小文字a,a,b,cを第1行の枠に入れ、大文字A,A,B,Cを第2行の枠に入れて並べる。
    第 第 第 第
    1 2 3 4
    行 行 行 行
第1行| | | | |
第2行| | | | |

1.並べ方は何通り?
2.同じアルファベット(例 aとA)からなる列が存在しない並べ方は全部で何通り?
3.同じアルファベットからなる列がちょうど1つある並べ方は全部で何通り?

 いつものように、すべての場合をループで回して、条件に合うものをカウントしました。(^_^;
 ちなみに、LookUp()関数は、リストla中の要素xに対応するリストlb中の要素yを返します。返値はリストで、la中にxが2個以上あれば、リストですべて返します。ExcelのxLookUp(検索値, 検索範囲, 戻り配列)関数を参照して下さい。

● perm2row.py

# coding: UTF-8
# perm2row.py

import itertools
from time import time

# リストla中の要素xに対応するリストlb中の要素をリストですべて返す
# ExcelのxLookUp()関数を参照
def LookUp(x,la,lb):
    return [lb[i] for i in range(len(la)) if la[i]==x]

def toStr(li,sp=',',fm='%s'):
    return fm%sp.join(li)

def printRows(cnt,r1,r2):
    print('[%d]'%(cnt))
    print(toStr(r1))
    print(toStr(r2))

def main():
    tm = time() # Timer Start
    L = 'aabc'
    U = L.upper()   #'AABC'
    cnt1 = cnt2 = cnt3 = 0
    for p in set(itertools.permutations(L)):        #第1行 同じものを含む順列
        for q in set(itertools.permutations(U)):    #第2行   〃
            cnt1+=1
##            printRows(cnt1,p,q)
##            print(LookUp('a',p,q))
            aA = LookUp('a',p,q).count('A')     #aとAからなる列の個数
            bB = LookUp('b',p,q).count('B')     #bとBからなる列の個数
            cC = LookUp('c',p,q).count('C')     #cとCからなる列の個数
            if aA+bB+cC==0:
                cnt2+=1
##                printRows(cnt2,p,q)
            if aA+bB+cC==1:
                cnt3+=1
##                printRows(cnt3,p,q)

    print('(1) %d'%cnt1)
    print('(2) %d'%cnt2)
    print('(3) %d'%cnt3)
    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

(1) 144
(2) 24
(3) 48
Runtime : 0.000 [sec]

※参考URL
第210回「総合的研究 数学I+A -20- 第8章 順列と組合せ」|令和元年(から)のプログラミング
XLOOKUP 関数 - Office サポート