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

回答編集履歴

12

修正

2017/05/09 22:12

投稿

退会済みユーザー
answer CHANGED
@@ -127,7 +127,7 @@
127
127
  O:30
128
128
  ```
129
129
 
130
- 考えてみました。
130
+ データベースは分かりませんが考えてみました。
131
131
  入れる日が少ない人から順に2つずつ日を選べるようにしました。
132
132
  1日しか入れない人は1日だけ表示されます。
133
133
  #補足

11

修正

2017/05/09 22:12

投稿

退会済みユーザー
answer CHANGED
@@ -52,7 +52,7 @@
52
52
  list << tmp_list
53
53
  end
54
54
 
55
- # 各人の入れる頻度を数えて入れる日が少ない順に並べる
55
+ # 各人の入れる回数を数えて入れる日が少ない順に並べる
56
56
  check_list = list.flatten
57
57
  name.map!{|e| [check_list.count(e), e]}.shuffle! # ここを変更(shuffle or sort)
58
58
 

10

修正

2017/05/09 22:09

投稿

退会済みユーザー
answer CHANGED
@@ -134,4 +134,4 @@
134
134
  私のコードだとsampleのLのようにシフトが割り当てられない場合があります。
135
135
 
136
136
  2017/05/10追記
137
- shuffleをつけてみました。
137
+ shuffleをつけてみました。この変更で場合によってLにもシフトが割り当てられるようになりました。

9

修正

2017/05/09 22:07

投稿

退会済みユーザー
answer CHANGED
@@ -54,7 +54,7 @@
54
54
 
55
55
  # 各人の入れる頻度を数えて入れる日が少ない順に並べる
56
56
  check_list = list.flatten
57
- name.map!{|e| [check_list.count(e), e]}.shuffle! # ここを変更
57
+ name.map!{|e| [check_list.count(e), e]}.shuffle! # ここを変更(shuffle or sort)
58
58
 
59
59
  # シフトの情報作成
60
60
  sift = []

8

修正

2017/05/09 22:02

投稿

退会済みユーザー
answer CHANGED
@@ -54,7 +54,7 @@
54
54
 
55
55
  # 各人の入れる頻度を数えて入れる日が少ない順に並べる
56
56
  check_list = list.flatten
57
- name.map!{|e| [check_list.count(e), e]}.sort!
57
+ name.map!{|e| [check_list.count(e), e]}.shuffle! # ここを変更
58
58
 
59
59
  # シフトの情報作成
60
60
  sift = []
@@ -131,4 +131,7 @@
131
131
  入れる日が少ない人から順に2つずつ日を選べるようにしました。
132
132
  1日しか入れない人は1日だけ表示されます。
133
133
  #補足
134
- 私のコードだとsampleのLのようにシフトが割り当てられない場合があります。
134
+ 私のコードだとsampleのLのようにシフトが割り当てられない場合があります。
135
+
136
+ 2017/05/10追記
137
+ shuffleをつけてみました。

7

修正

2017/05/09 22:00

投稿

退会済みユーザー
answer CHANGED
@@ -127,8 +127,8 @@
127
127
  O:30
128
128
  ```
129
129
 
130
- 私にとっては難しい問題だったので間違えて
130
+ えてした
131
131
  入れる日が少ない人から順に2つずつ日を選べるようにしました。
132
132
  1日しか入れない人は1日だけ表示されます。
133
133
  #補足
134
- sampleのLのようにシフトが割り当てられない場合があります。
134
+ 私のコードだとsampleのLのようにシフトが割り当てられない場合があります。

6

修正

2017/05/09 21:53

投稿

退会済みユーザー
answer CHANGED
@@ -127,6 +127,8 @@
127
127
  O:30
128
128
  ```
129
129
 
130
- 私にとっては難しい問題だったので恐らく間違えていると思います。
130
+ 私にとっては難しい問題だったので間違えています。
131
131
  入れる日が少ない人から順に2つずつ日を選べるようにしました。
132
- 1日しか入れない人は1日だけ表示されます。
132
+ 1日しか入れない人は1日だけ表示されます。
133
+ #補足
134
+ sampleのLのようにシフトが割り当てられない場合があります。

5

修正

2017/05/09 21:52

投稿

退会済みユーザー
answer CHANGED
@@ -6,13 +6,40 @@
6
6
  hash = {}
7
7
 
8
8
  # シフトのサンプルを作成
9
+
9
10
  siken = []
11
+
12
+ =begin
10
13
  15.times do |n|
11
14
  t = data.sample(rand(1..30)).sort
12
15
  hash[:"#{name[n]}"] = t
13
16
  siken << t
14
17
  end
18
+ =end
15
19
 
20
+ sample = [
21
+ ['A', []],
22
+ ['B', [1]],
23
+ ['C', [1, 2, 13]],
24
+ ['D', [3, 2, 6]],
25
+ ['E', [2, 14, 23, 24, 29, 5]],
26
+ ['F', [4, 8, 7]],
27
+ ['G', [23, 27]],
28
+ ['H', [4]],
29
+ ['I', [15, 12, 11]],
30
+ ['J', [3, 6, 9, 12, 13]],
31
+ ['K', [7, 8]],
32
+ ['L', [4, 8, 3]],
33
+ ['M', [12, 15, 19]],
34
+ ['N', [21, 22]],
35
+ ['O', [30]]
36
+ ]
37
+
38
+ sample.each do |key, value|
39
+ hash[key.to_sym] = value
40
+ siken << value
41
+ end
42
+
16
43
  # シフトのサンプルから一日ごとに一か月の間に各人が入れる日の配列作成
17
44
  list = []
18
45
  30.times do |x|
@@ -53,11 +80,8 @@
53
80
  name_list = []
54
81
  check.each do |d|
55
82
  key = list[d - 1].sample
56
- begin
83
+ next if key.nil?
57
- sift[name.index(key)][1].push(d)
84
+ sift[name.index(key)][1].push(d)
58
- rescue TypeError
59
- # Do Nothing
60
- end
61
85
  end
62
86
  end
63
87
 
@@ -86,21 +110,21 @@
86
110
  ```
87
111
  実行結果例
88
112
  ```
89
- A:20,29
113
+ A:
90
- B:17,18
91
- C:11,28
92
- D:14,27
93
- E:8
114
+ B:1
94
- F:2,19
115
+ C:2,13
95
- G:5,6
116
+ D:3,6
117
+ E:5,14,24,29
118
+ F:
119
+ G:23,27
120
+ H:4
96
- H:4,15
121
+ I:11,15
97
- I:22,23,30
98
- J:3,13
122
+ J:9
99
- K:16,21
123
+ K:7,8
100
- L:1,10
124
+ L:
101
- M:12,25
125
+ M:12,19
102
- N:7,24
126
+ N:21,22
103
- O:9,26
127
+ O:30
104
128
  ```
105
129
 
106
130
  私にとっては難しい問題だったので恐らく間違えていると思います。

4

修正

2017/05/09 21:44

投稿

退会済みユーザー
answer CHANGED
@@ -33,34 +33,31 @@
33
33
  sift = []
34
34
  name.each do |c|
35
35
  test = hash[c[1].to_sym]
36
+ tmp = []
36
- if test.size == 1
37
+ test.each do |e|
37
- day = test.first
38
- if data.include?(day)
38
+ if data.include?(e)
39
- sift << [c[1], [day]]
39
+ tmp << e
40
40
  end
41
- data -= test
42
- else
43
- tmp = []
44
- test.each do |e|
45
- if data.include?(e)
46
- tmp << e
47
- end
48
- end
49
- day = tmp.sample(2)
50
- sift << [c[1], day]
51
- data -= day
52
41
  end
42
+ day = tmp.sample(2)
43
+ sift << [c[1], day]
44
+ data -= day
53
45
  end
54
46
 
55
47
  # 残った日の割り当て
56
48
  sift.sort!
57
49
  name.map!{|e| e[1]}.sort!
58
50
  check = (1..30).to_a - sift.map{|e| e[1]}.flatten
51
+
59
52
  unless check.size.zero?
60
53
  name_list = []
61
54
  check.each do |d|
62
55
  key = list[d - 1].sample
56
+ begin
63
- sift[name.index(key)][1].push(d)
57
+ sift[name.index(key)][1].push(d)
58
+ rescue TypeError
59
+ # Do Nothing
60
+ end
64
61
  end
65
62
  end
66
63
 

3

修正

2017/05/09 21:19

投稿

退会済みユーザー
answer CHANGED
@@ -6,8 +6,11 @@
6
6
  hash = {}
7
7
 
8
8
  # シフトのサンプルを作成
9
+ siken = []
9
10
  15.times do |n|
10
- hash[:"#{name[n]}"] = data.sample(rand(1..30)).sort
11
+ t = data.sample(rand(1..30)).sort
12
+ hash[:"#{name[n]}"] = t
13
+ siken << t
11
14
  end
12
15
 
13
16
  # シフトのサンプルから一日ごとに一か月の間に各人が入れる日の配列作成
@@ -49,32 +52,58 @@
49
52
  end
50
53
  end
51
54
 
55
+ # 残った日の割り当て
56
+ sift.sort!
57
+ name.map!{|e| e[1]}.sort!
58
+ check = (1..30).to_a - sift.map{|e| e[1]}.flatten
59
+ unless check.size.zero?
60
+ name_list = []
61
+ check.each do |d|
62
+ key = list[d - 1].sample
63
+ sift[name.index(key)][1].push(d)
64
+ end
65
+ end
66
+
52
67
  # 出力
53
- sift.sort!
68
+ a = []
54
69
  sift.each do |n, v|
70
+ a << v
55
- puts "#{n}:#{v.join(',')}"
71
+ puts "#{n}:#{v.sort.join(',')}"
56
72
  end
57
73
 
74
+ # 確認用
75
+ puts '-' * 20
76
+ a.each_with_index do |e, i|
77
+ flags = false
78
+ e.each do |ee|
79
+ unless siken[i].include?(ee)
80
+ flags = true
81
+ end
82
+ end
83
+ p flags
84
+ end
58
85
 
59
-
86
+ a.flatten!
87
+ p a.size
88
+ p a.uniq.size
60
89
  ```
61
90
  実行結果例
62
91
  ```
92
+ A:20,29
93
+ B:17,18
94
+ C:11,28
95
+ D:14,27
96
+ E:8
97
+ F:2,19
98
+ G:5,6
99
+ H:4,15
100
+ I:22,23,30
101
+ J:3,13
102
+ K:16,21
103
+ L:1,10
63
- A:12,23
104
+ M:12,25
64
- B:15,9
65
- C:22,1
66
- D:3,18
67
- E:2,8
68
- F:11,4
69
- G:25,16
70
- H:26,10
71
- I:17,24
105
+ N:7,24
72
- J:14,6
73
- K:30
74
- L:19,20
106
+ O:9,26
75
- M:27,28
76
- N:29,21
77
- O:7,5
78
107
  ```
79
108
 
80
109
  私にとっては難しい問題だったので恐らく間違えていると思います。

2

修正

2017/05/09 20:56

投稿

退会済みユーザー
answer CHANGED
@@ -10,7 +10,7 @@
10
10
  hash[:"#{name[n]}"] = data.sample(rand(1..30)).sort
11
11
  end
12
12
 
13
- # シフトのサンプルから一日ごとに一か月の間に各人が入れる日の配列作成
13
+ # シフトのサンプルから一日ごとに一か月の間に各人が入れる日の配列作成
14
14
  list = []
15
15
  30.times do |x|
16
16
  tmp_list = []
@@ -26,12 +26,15 @@
26
26
  check_list = list.flatten
27
27
  name.map!{|e| [check_list.count(e), e]}.sort!
28
28
 
29
- # シフトの情報作成
29
+ # シフトの情報作成
30
30
  sift = []
31
31
  name.each do |c|
32
32
  test = hash[c[1].to_sym]
33
33
  if test.size == 1
34
+ day = test.first
35
+ if data.include?(day)
34
- sift << [c[1], [test.first]]
36
+ sift << [c[1], [day]]
37
+ end
35
38
  data -= test
36
39
  else
37
40
  tmp = []
@@ -51,6 +54,9 @@
51
54
  sift.each do |n, v|
52
55
  puts "#{n}:#{v.join(',')}"
53
56
  end
57
+
58
+
59
+
54
60
  ```
55
61
  実行結果例
56
62
  ```

1

修正

2017/05/09 20:01

投稿

退会済みユーザー
answer CHANGED
@@ -10,7 +10,7 @@
10
10
  hash[:"#{name[n]}"] = data.sample(rand(1..30)).sort
11
11
  end
12
12
 
13
- # シフトのサンプルから一日ごとに一か月の間に各人が入れる日の配列作成
13
+ # シフトのサンプルから一日ごとに一か月の間に各人が入れる日の配列作成
14
14
  list = []
15
15
  30.times do |x|
16
16
  tmp_list = []