回答編集履歴

3

訂正

2020/02/17 15:31

投稿

otn
otn

スコア85949

test CHANGED
@@ -16,34 +16,14 @@
16
16
 
17
17
  #追記
18
18
 
19
- データの配列ごとの順序を守るとすると、ちょっとRubyらしくなコードですが、とりあえずこれで出来ます
19
+ データの配列ごとの順序を守るとすると、最後の`sample`をやめればいのか
20
20
 
21
21
  ```Ruby
22
22
 
23
23
  N=3
24
24
 
25
-
26
-
27
- result = []
28
-
29
- n=N
30
-
31
- [array5,array4,array3,array2,array1].each do |ary|
25
+ [array5,array4,array3,array2,array1].map(&:shuffle).inject(&:+).take(N)
32
-
33
- if ary.size >= n
34
-
35
- result.append(*(ary.sample(n)))
36
-
37
- break
38
-
39
- else
40
-
41
- result.append(*(ary.shuffle))
42
-
43
- n -= ary.size
44
-
45
- end
46
-
47
- end
48
26
 
49
27
  ```
28
+
29
+ この場合は、`array5`の`shuffle`も無駄ではなくなります。

2

追記

2020/02/17 15:31

投稿

otn
otn

スコア85949

test CHANGED
@@ -11,3 +11,39 @@
11
11
  `array5`の`shuffle`はそもそも無駄。`array4`以降は使われないかもしれないけど`shuffle`するという無駄。
12
12
 
13
13
  単に連結して`take(3)`だと、`array5`で足りない個数を`array4`の先頭から使ってしまうので、`array4`以降は`shuffle`が必要です。
14
+
15
+
16
+
17
+ #追記
18
+
19
+ データの配列ごとの順序を守るとすると、ちょっとRubyらしくないコードですが、とりあえずこれで出来ます。
20
+
21
+ ```Ruby
22
+
23
+ N=3
24
+
25
+
26
+
27
+ result = []
28
+
29
+ n=N
30
+
31
+ [array5,array4,array3,array2,array1].each do |ary|
32
+
33
+ if ary.size >= n
34
+
35
+ result.append(*(ary.sample(n)))
36
+
37
+ break
38
+
39
+ else
40
+
41
+ result.append(*(ary.shuffle))
42
+
43
+ n -= ary.size
44
+
45
+ end
46
+
47
+ end
48
+
49
+ ```

1

補足

2020/02/17 15:22

投稿

otn
otn

スコア85949

test CHANGED
@@ -9,3 +9,5 @@
9
9
  ```
10
10
 
11
11
  `array5`の`shuffle`はそもそも無駄。`array4`以降は使われないかもしれないけど`shuffle`するという無駄。
12
+
13
+ 単に連結して`take(3)`だと、`array5`で足りない個数を`array4`の先頭から使ってしまうので、`array4`以降は`shuffle`が必要です。