Androidのロックのパターンが何通りあるか計算するプログラムを書いてみました(9つの点のうち少なくとも4つを選び棒線でつないでいくやつです)。プログラムは動作するのですがネットで調べた値と一致しません。プログラムは見にくく、効率化できるところもあると思います。わかる方、どこか間違いを指摘していただけませんでしょうか?あと、効率化できるとことがあれば教えてください。読みにくいプログラムで申し訳ありませんがお願いします。
python3
1import itertools 2#左上から右に、左の真ん中から右に、左下から右に1→9とする。 3cnt = [0] * 9 #n番目の値はnコの点を通るパターン 4 5def preis_pos(int_n1, int_n2, usd_list, int1, int2, int3): 6 if not int3 in usd_list: 7 if int_n1 == int1 and int_n2 == int2: 8 return False #だめであればFalseを返す 9 if int_n1 == int2 and int_n2 == int1: 10 return False 11 12def is_pos(str): 13 for n in range(1, len(str)-1): 14 int_n1 = int(str[n]) 15 int_n2 = int(str[n + 1]) 16 usd_list = [] 17 for o in range(n-1): 18 usd_list.append(int(str[o])) 19 20 preis_pos(int_n1, int_n2, usd_list, 1, 3, 2) #その道が通れるか確認する 21 preis_pos(int_n1, int_n2, usd_list, 1, 7, 4) #1から7に行くには4がすでに 22 preis_pos(int_n1, int_n2, usd_list, 1, 9, 5) #使われている必要がある 23 preis_pos(int_n1, int_n2, usd_list, 3, 7, 5) 24 preis_pos(int_n1, int_n2, usd_list, 3, 9, 6) 25 preis_pos(int_n1, int_n2, usd_list, 7, 9, 8) 26 preis_pos(int_n1, int_n2, usd_list, 2, 8, 5) 27 preis_pos(int_n1, int_n2, usd_list, 4, 6, 5) 28 29 return True 30 31 32def sorter(int1): 33 str_a = str(int1) 34 list_a, list_ret = [], [] 35 36 for i in range(len(str_a)): 37 list_a.append(str_a[i]) 38 d = list(itertools.permutations(list_a)) 39 for j in d: 40 list_ret.append(''.join(map(str, j))) 41 42 return list_ret 43 44 45def counter(stw, point, cntper): #stwで始まりpointのうち2-7コを通るものcntperは対称性から考える 46 47 for j in range(2,8): 48 dp = list() 49 d = list(itertools.combinations(str(point), j)) 50 for k in d: 51 dp.append(''.join(k)) 52 for l in dp: 53 list_cnt = sorter(l) 54 for m in list_cnt: 55 n = str(stw) + m 56 if is_pos(n): 57 cnt[j + 1] += cntper 58 return 59 60 61counter(12, 3456789, 8) 62counter(16, 2345789, 8) 63counter(15, 2346789, 4) 64counter(21, 3456789, 8) 65counter(25, 1346789, 4) 66counter(51, 2346789, 4) 67counter(52, 1346789, 4) 68counter(27, 1345689, 8) 69 70print(cnt)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/07 14:04