teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

10

ユーザ追加処理コード追加

2020/01/08 07:12

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -59,4 +59,56 @@
59
59
  if user[3] == member[0]
60
60
  return True
61
61
  return False
62
+ ```
63
+
64
+ ユーザ追加処理
65
+
66
+ ```python
67
+ import random
68
+
69
+ # ユーザーの情報の読み込み
70
+ users = [
71
+ (1,0,1,0),
72
+ (2,0,0,0),
73
+ (3,0,1,0),
74
+ (4,0,0,0),
75
+ (5,1,0,0),
76
+ (6,1,0,0),
77
+ (7,0,0,0),
78
+ (8,1,0,0),
79
+ (9,0,0,0),
80
+ (10,0,1,0),
81
+ (11,0,0,12),
82
+ (12,0,0,13),
83
+ (13,0,0,0),
84
+ (14,0,0,0),
85
+ (15,0,1,0),
86
+ (16,0,0,3),
87
+ (17,0,0,0),
88
+ (18,0,0,0),
89
+ (19,0,0,9),
90
+ ]
91
+ no20 = (20, 0, 1, 0)
92
+ users.append(no20)
93
+
94
+ # ユーザーをシャッフルにし、3クラスに分ける
95
+ random.shuffle(users)
96
+ c1 = len(users) * 1 // 3
97
+ c2 = len(users) * 2 // 3
98
+ classes = class1, class2, class3 = users[:c1], users[c1:c2], users[c2:]
99
+
100
+ # クラス毎に、制約条件1が1人以下かつ、制約条件2が2人以下ならOK
101
+ if all(sum(u[1] for u in c) <= 1 and sum(u[2] for u in c) <= 2 for c in classes):
102
+ print('OK')
103
+ # 組み合わせNGのメンバーがクラスにいなければOK
104
+ if all(all(u[3] != m[0] for m in c) for c in classes for u in c if u[3]):
105
+ print('組み合わせもOK')
106
+ else:
107
+ print('組み合わせはNG')
108
+ else:
109
+ print('NG')
110
+
111
+ print(class1)
112
+ print(class2)
113
+ print(class3)
62
114
  ```

9

コメントで質問された処理の展開を追記

2020/01/08 07:12

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -46,4 +46,17 @@
46
46
  print(class1)
47
47
  print(class2)
48
48
  print(class3)
49
+ ```
50
+
51
+ コメントで質問された処理を展開:
52
+
53
+ ```python
54
+ def conflict(classes):
55
+ for class_ in classes:
56
+ for user in class_:
57
+ if user[3] != 0:
58
+ for member in class_:
59
+ if user[3] == member[0]
60
+ return True
61
+ return False
49
62
  ```

8

コメント修正

2020/01/07 07:47

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -26,7 +26,7 @@
26
26
  (19,0,0,9),
27
27
  ]
28
28
 
29
- # ユーザーをシャッフルにし、3に分ける
29
+ # ユーザーをシャッフルにし、3クラスに分ける
30
30
  random.shuffle(users)
31
31
  c1 = len(users) * 1 // 3
32
32
  c2 = len(users) * 2 // 3

7

ユーザ情報をタプルに変更

2020/01/07 04:27

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -5,25 +5,25 @@
5
5
 
6
6
  # ユーザーの情報の読み込み
7
7
  users = [
8
- [1,0,1,0],
8
+ (1,0,1,0),
9
- [2,0,0,0],
9
+ (2,0,0,0),
10
- [3,0,1,0],
10
+ (3,0,1,0),
11
- [4,0,0,0],
11
+ (4,0,0,0),
12
- [5,1,0,0],
12
+ (5,1,0,0),
13
- [6,1,0,0],
13
+ (6,1,0,0),
14
- [7,0,0,0],
14
+ (7,0,0,0),
15
- [8,1,0,0],
15
+ (8,1,0,0),
16
- [9,0,0,0],
16
+ (9,0,0,0),
17
- [10,0,1,0],
17
+ (10,0,1,0),
18
- [11,0,0,12],
18
+ (11,0,0,12),
19
- [12,0,0,13],
19
+ (12,0,0,13),
20
- [13,0,0,0],
20
+ (13,0,0,0),
21
- [14,0,0,0],
21
+ (14,0,0,0),
22
- [15,0,1,0],
22
+ (15,0,1,0),
23
- [16,0,0,3],
23
+ (16,0,0,3),
24
- [17,0,0,0],
24
+ (17,0,0,0),
25
- [18,0,0,0],
25
+ (18,0,0,0),
26
- [19,0,0,9],
26
+ (19,0,0,9),
27
27
  ]
28
28
 
29
29
  # ユーザーをシャッフルにし、3組に分ける

6

c1,c2計算方法変更

2020/01/07 04:26

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -28,8 +28,8 @@
28
28
 
29
29
  # ユーザーをシャッフルにし、3組に分ける
30
30
  random.shuffle(users)
31
- c1 = len(users) // 3
31
+ c1 = len(users) * 1 // 3
32
- c2 = c1 * 2
32
+ c2 = len(users) * 2 // 3
33
33
  classes = class1, class2, class3 = users[:c1], users[c1:c2], users[c2:]
34
34
 
35
35
  # クラス毎に、制約条件1が1人以下かつ、制約条件2が2人以下ならOK

5

コメント修正

2020/01/07 04:21

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -26,17 +26,18 @@
26
26
  [19,0,0,9],
27
27
  ]
28
28
 
29
- # ユーザーの中から1組に入れ7人をランダムに選ぶ
29
+ # ユーザーをシャッフルにし3組に分け
30
30
  random.shuffle(users)
31
31
  c1 = len(users) // 3
32
32
  c2 = c1 * 2
33
33
  classes = class1, class2, class3 = users[:c1], users[c1:c2], users[c2:]
34
34
 
35
- # 各組入っている人の内訳が、制約条件1が1人以下かつ、制約条件2が2人以下のとき、
35
+ # クラス毎に、制約条件1が1人以下かつ、制約条件2が2人以下ならOK
36
36
  if all(sum(u[1] for u in c) <= 1 and sum(u[2] for u in c) <= 2 for c in classes):
37
37
  print('OK')
38
+ # 組み合わせNGのメンバーがクラスにいなければOK
38
- if all(all(a[3] != b[0] for b in c) for c in classes for a in c if a[3]):
39
+ if all(all(u[3] != m[0] for m in c) for c in classes for u in c if u[3]):
39
- print('組み合わせOK')
40
+ print('組み合わせOK')
40
41
  else:
41
42
  print('組み合わせはNG')
42
43
  else:

4

ユーザ情報の先頭要素を1からの出席番号に変更、最後の要素も出席番号

2020/01/07 04:16

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -5,25 +5,25 @@
5
5
 
6
6
  # ユーザーの情報の読み込み
7
7
  users = [
8
- [0,0,1,0],
8
+ [1,0,1,0],
9
- [1,0,0,0],
9
+ [2,0,0,0],
10
- [2,0,1,0],
10
+ [3,0,1,0],
11
- [3,0,0,0],
11
+ [4,0,0,0],
12
- [4,1,0,0],
13
12
  [5,1,0,0],
14
- [6,0,0,0],
13
+ [6,1,0,0],
15
- [7,1,0,0],
14
+ [7,0,0,0],
16
- [8,0,0,0],
15
+ [8,1,0,0],
17
- [9,0,1,0],
16
+ [9,0,0,0],
18
- [10,0,0,0],
17
+ [10,0,1,0],
19
18
  [11,0,0,12],
20
19
  [12,0,0,13],
21
20
  [13,0,0,0],
22
- [14,0,1,0],
21
+ [14,0,0,0],
22
+ [15,0,1,0],
23
- [15,0,0,3],
23
+ [16,0,0,3],
24
- [16,0,0,0],
25
24
  [17,0,0,0],
26
- [18,0,0,9],
25
+ [18,0,0,0],
26
+ [19,0,0,9],
27
27
  ]
28
28
 
29
29
  # ユーザーの中から、1組に入れる7人をランダムに選ぶ

3

組み合わせ対応

2020/01/07 04:08

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -1,5 +1,4 @@
1
1
  こんな書き方はいかが?
2
- 組み合わせNGが抜けてたのでのちほど修正します。
3
2
 
4
3
  ```python
5
4
  import random
@@ -17,8 +16,8 @@
17
16
  [8,0,0,0],
18
17
  [9,0,1,0],
19
18
  [10,0,0,0],
20
- [11,0,0,11],
19
+ [11,0,0,12],
21
- [12,0,0,11],
20
+ [12,0,0,13],
22
21
  [13,0,0,0],
23
22
  [14,0,1,0],
24
23
  [15,0,0,3],
@@ -36,6 +35,10 @@
36
35
  # 各組に入っている人の内訳が、制約条件1が1人以下かつ、制約条件2が2人以下のとき、
37
36
  if all(sum(u[1] for u in c) <= 1 and sum(u[2] for u in c) <= 2 for c in classes):
38
37
  print('OK')
38
+ if all(all(a[3] != b[0] for b in c) for c in classes for a in c if a[3]):
39
+ print('組み合わせはOK')
40
+ else:
41
+ print('組み合わせはNG')
39
42
  else:
40
43
  print('NG')
41
44
 

2

修正中

2020/01/07 03:40

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -1,4 +1,5 @@
1
1
  こんな書き方はいかが?
2
+ 組み合わせNGが抜けてたのでのちほど修正します。
2
3
 
3
4
  ```python
4
5
  import random

1

バグ修正

2020/01/07 03:30

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -33,7 +33,7 @@
33
33
  classes = class1, class2, class3 = users[:c1], users[c1:c2], users[c2:]
34
34
 
35
35
  # 各組に入っている人の内訳が、制約条件1が1人以下かつ、制約条件2が2人以下のとき、
36
- if all(sum(u[1] for u in c) <= 1 or sum(u[2] for u in c) <= 2 for c in classes):
36
+ if all(sum(u[1] for u in c) <= 1 and sum(u[2] for u in c) <= 2 for c in classes):
37
37
  print('OK')
38
38
  else:
39
39
  print('NG')