ネットで見つけた文字を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 サポート