73767


1年前の問題ですけど、確かめてみたい。  
(参考)小学生のみなさんへ、場合の数「2020年度京都大学理系学部数学第5問」にチャレンジしてみて下さい。  
<https://qiita.com/mrrclb48z/items/a97086d25b3d0bee7125>  
①[1234]×[1234]×[1234]×[1234]/直積（デカルト積，Cartesian Product）の使い方を教えて下さい。  
②全部の組み合わせの作り方を教えて下さい。24×24×24×24＝331766通りです。  
4×3×2×1＝24  
よろしくお願いします。  
OK  
1234  
2341  
3412  
4123

[code]

    # 以下は、めちゃくちゃです。すいません。
    import datetime
    import numpy as np
    import itertools
    myList4=[1, 2, 3, 4]
    myList=myList4 + myList4 + myList4 + myList4
    print(myList)
    #
    n4=4
    
    print("開始時刻",datetime.datetime.now())
    m=0
    for v in itertools.permutations(myList):
        result = [v[idx:idx + n4] for idx in range(0, len(v), n4)]
        if (sorted(result[0])!=myList4) :continue
        if (sorted(result[1])!=myList4) :continue
        if (sorted(result[2])!=myList4) :continue
        if (sorted(result[3])!=myList4) :continue
        if (sorted([result[0][0], result[1][0], result[2][0], result[3][0]]) != myList4) :continue
        if (sorted([result[0][1], result[1][1], result[2][1], result[3][1]]) != myList4) :continue
        if (sorted([result[0][2], result[1][2], result[2][2], result[3][2]]) != myList4) :continue
        if (sorted([result[0][3], result[1][3], result[2][3], result[3][3]]) != myList4) :continue
        m = m + 1
        # print('m ###',m,"###",result)
    print('終了m ###',m)
    print("終了時刻",datetime.datetime.now())
    
[/code]


CC BY-SA 4.0
2021-02-02T10:22:10.927
73763
2021-02-03T10:17:25.147
2021-02-03T01:04:54.970
3060
17199
question
python アルゴリズム numpy
python のitertools.permutationsの使い方を教えて下さい。全部の組み合わせの作り方を教えて下さい。


> 「2020年度京都大学理系学部数学第5問」にチャレンジしてみて下さい。
[code]

    import itertools
    import time
    
    start = time.perf_counter()
    lst=[1, 2, 3, 4]
    result = []
    for v0 in itertools.permutations(lst):
        for v1 in itertools.permutations(lst):
            if any(v0[n] == v1[n] for n in range(len(lst))):
                continue
            for v2 in itertools.permutations(lst):
                if any(v0[n] == v2[n] or v1[n] == v2[n] for n in range(len(lst))):
                    continue
                for v3 in itertools.permutations(lst):
                    if any(v0[n] == v3[n] or v1[n] == v3[n] or v2[n] == v3[n] for n in range(len(lst))):
                        continue
                    result.append([v0]+[v1]+[v2]+[v3])
    
    print(*result, sep='\n')
    print(len(result))  # 576
    end = time.perf_counter()
    print("所要時間", (end - start)*1000, "ms")  # 100 -> 1000 に 修正
    
[/code]

> ②全部の組み合わせの作り方を教えて下さい。24×24×24×24＝331766通りです。

24×24×24×24 は 331776通りですね。

[code]

    import itertools
    
    lst=[1, 2, 3, 4]
    result = []
    for v0 in itertools.permutations(lst):
        for v1 in itertools.permutations(lst):
            for v2 in itertools.permutations(lst):
                for v3 in itertools.permutations(lst):
                    result.append([v0]+[v1]+[v2]+[v3])
    
    print(len(result))  # 331776
    
[/code]


CC BY-SA 4.0
2021-02-02T14:57:19.500
73767
2021-02-03T07:31:24.983
2021-02-03T07:31:24.983
41756
41756
73763
answer

[code]

    import itertools
    my_list=[1, 2, 3, 4]
    m=0
    for v0 in itertools.permutations(my_list):
        for v1 in itertools.permutations(my_list):
            for v2 in itertools.permutations(my_list):
                for v3 in itertools.permutations(my_list):
                    my_result=[v0]+[v1]+[v2]+[v3]
                    if (sorted([my_result[0][0], my_result[1][0], my_result[2][0], my_result[3][0]]) != my_list): continue
                    if (sorted([my_result[0][1], my_result[1][1], my_result[2][1], my_result[3][1]]) != my_list): continue
                    if (sorted([my_result[0][2], my_result[1][2], my_result[2][2], my_result[3][2]]) != my_list): continue
                    if (sorted([my_result[0][3], my_result[1][3], my_result[2][3], my_result[3][3]]) != my_list): continue
                    m = m + 1
    print(m)  # 576
    
[/code]


CC BY-SA 4.0
2021-02-03T10:17:25.147
73774
2021-02-03T10:17:25.147
17199
73763
answer